The python library for research and development in NLP, multimodal LLMs, Agents, ML, Knowledge Graphs, and more.
About the project
npcpy is a Python library for building applications with multimodal language models, agent-based AI, and knowledge graphs. Researchers and developers use it with local or cloud model providers to create agents, multi-agent teams, and AI workflows.
Write a new .jinx file from inputs (name, description, inputs spec as JSON list of strings, python body). Agents use this mid-task to crystallize a repeated block of code into a reusable jinx. The jinx is written to the team's jinxes/lib dir by default and registered with the running team so it is immediately callable…
Skill for searching and evolving the SQLite-backed Knowledge Graph. Use this when you need structured fact/concept/link search across one or more teams, NPCs, or directory scopes. The Knowledge Graph (KG) is stored in the application's database (not YAML). It is scoped by (teamname, npcname, directorypath). Facts and…
Skill for population-based Knowledge Graph evolution via Sememolution. Use this when the user wants creative cross-domain synthesis, speculative reasoning, or when a single KG search might be too narrow. Sememolution maintains a population of KG "individuals". Each individual has its own graph (different facts…
Skill for working with local .knowledge.yaml files via KnowledgeStore. Use this when you need to recall, search, or manage directory-local memories and knowledge links stored in plain YAML alongside the user's project files. KnowledgeStore is directory-scoped. Each directory that contains a .knowledge.yaml file…
Execute a jinx by name (already loaded on the team) or by filesystem path (e.g. a freshly createdjinx that isn't yet registered), passing input values as a JSON object. Returns the jinx's output field or the full context dict. Use this to run a jinx you just wrote without exiting the session.
Render the provided prompt template with Jinja context and send it to the active NPC's LLM. The rendered text becomes the user prompt; the LLM response is placed in context['output'].
At most 3 mods per repository are shown here, and a mod shipped inside a plugin is left to that plugin's page — the rest are on their repository pages: