Denkeeper supports running multiple named agents within a single instance. Each agent has its own persona, skills, LLM model, and permission tier.

Persona system

Each agent’s identity is defined by persona files in its persona_dir:

FilePurposeWho updates it
SOUL.mdCore identity — personality, values, communication styleAgent (supervised requires approval; autonomous writes directly)
USER.mdWhat the agent knows about its userAgent (user can edit directly)
MEMORY.mdWorking memory — updated automatically each sessionAgent

These files are injected into the system prompt at the start of every conversation.

Adapter bindings

Each agent declares which adapters it listens on:

[[agents]]
name = "default"
adapters = ["telegram"]           # all Telegram messages

[[agents]]
name = "work-assistant"
adapters = ["telegram:987654321"] # only this specific chat

The Dispatcher routes incoming messages to the correct agent based on these bindings. If no specific binding matches, messages go to the "default" agent.

Per-agent configuration

Each agent can override the global LLM model and permission tier:

[[agents]]
name = "home-automation"
persona_dir = "~/.denkeeper/agents/home-automation"
adapters = ["discord"]
llm_model = "meta-llama/llama-3-70b"
session_tier = "restricted"

Self-modification rules

Agents can modify their own persona files within their permission tier:

  • MEMORY.md — freely writable (working memory)
  • USER.md — writable in supervised and autonomous tiers
  • SOUL.md — writable in supervised (requires approval) and autonomous tiers