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.

For routing that is not a fixed 1:1 agent–adapter pair — one conversation shared across Telegram and Discord, or switching a chat between agents at runtime — see Channels.

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