How do I create an agent?
Agents are specialized roles that Claude takes on when you chat with them. You create them by chatting with Daemion — no YAML to write by hand.
Create an agent by chatting
Tell Daemion what kind of specialist you want. It handles the scaffold, model choice, and system prompt.
You: Create an agent called researcher that specializes in finding technical information
Daemion: I’ll create a researcher agent — specialized in deep technical lookups, source comparison, and synthesizing information clearly. Should I give it web search access and set the model to sonnet, or do you want opus for heavier research tasks?
Daemion scaffolds the agent folder in ~/.daemion/agents/researcher/, registers it as an extension in SQLite, and makes it available immediately — no restart required.
What gets created on disk
Every agent lives in ~/.daemion/agents/<name>/ with this structure:
~/.daemion/agents/researcher/ agents/ researcher.md # system prompt (with YAML frontmatter) daemion.yaml # model, permissions, memory, suggestions soul.md # personality layer (see below) .claude-plugin/ plugin.json # plugin manifest
The daemion.yaml for the researcher agent looks like this:
identity: icon: magnifying-glass color: “#6366F1”
model: sonnet # haiku | sonnet | opus
memory: engram: true groups: [auto] # ‘auto’ resolves to the agent name
projects: [all]
permissions: autonomous: [Read, Grep, Glob, Bash, Write, WebFetch, WebSearch] requires_approval: []
escalation:
- when: “can’t resolve” to: user
suggestions:
- “What’s the latest on [topic]?”
- “Compare [X] vs [Y] — pros, cons, recommendation”
- “Research [technology/company/trend] and summarize”
Agents are Claude operating in a role
Every agent — no matter how specialized — runs on Claude. The literal first line of every agent’s system prompt is:
“You are Claude, operating as a Daemion agent”
This is intentional, per Anthropic licensing. Agents are not separate AIs. They are Claude with a focused context: a system prompt, a soul, and a permission set.
What’s a soul?
Each agent has two personality layers:
~/.daemion/soul.md— the base soul, shared across all agents. It captures who your user is: name, communication style, preferences, working patterns. Daemion writes this during your first conversation.soul.mdin the agent folder — the agent’s own personality. This is what makes researcher feel different from a general-purpose chat. It is injected into every conversation with that agent.
The researcher agent’s soul.md might look like this:
Soul — Researcher
You are Claude, operating as Researcher — the one who goes deep. When something needs investigation, synthesis, or comparison, that’s you.
You are curious and rigorous. You check multiple sources, note confidence levels, and distinguish between what you know and what you’re inferring. You cite your sources.
You value depth over speed. A shallow answer delivered quickly is less valuable than a thorough one. But you also know when “good enough” is good enough.
Ask Daemion to update an agent’s soul at any time: “Make researcher more concise and direct.”
Verify: send a message to the new agent
After creation, send a message through the gateway to confirm the agent responds:
Start a thread with the researcher agent (use its extension ID)
curl -X POST http://localhost:3001/chat
-H “Authorization: Bearer $DAEMION_TOKEN”
-H “Content-Type: application/json”
-d ’{“agent_id”: “ext_09def789”, “content”: “What is Deno 2?”}’
Or just tap the agent in the Daemion app and send it a message. If it responds, it’s working.
API alternative: POST /extensions
If you are building tooling or automating agent creation, use the API directly:
Create an agent extension. Scaffolds the disk folder in ~/.daemion/agents/<name>/ and registers the extension in SQLite.
| Parameter | Type | Description |
|---|---|---|
type REQUIRED | string | Must be "agent". |
name REQUIRED | string | Agent name. kebab-case only (a-z, 0-9, hyphens). |
description | string | Short description shown in the app. |
definition.model | string | Model shortname: haiku, sonnet, or opus. Defaults to sonnet. |
definition.system_prompt | string | Initial system prompt. Stored on disk, not in the database. |
source | string | Origin label. Use "user" for manually created agents. |
enabled | boolean | Whether the agent is active immediately. Defaults to true. |
curl -X POST http://localhost:3001/extensions
-H “Authorization: Bearer $DAEMION_TOKEN”
-H “Content-Type: application/json”
-d ’{
“type”: “agent”,
“name”: “researcher”,
“description”: “Finds and synthesizes technical information”,
“definition”: {
“model”: “sonnet”,
“system_prompt”: “You are Claude, operating as Researcher — the one who goes deep.”
},
“source”: “user”,
“enabled”: true
}’
A successful response returns the new extension record:
{ “id”: “ext_09def789”, “type”: “agent”, “name”: “researcher”, “description”: “Finds and synthesizes technical information”, “enabled”: true, “created_at”: “2026-03-31T12:00:00.000Z” }
After creating via API, call POST /reseed to sync built-in extensions from disk if needed — though agent extensions created via the API are registered immediately and do not require a reseed.
Common questions
model in daemion.yaml to haiku, sonnet, or opus. Haiku is fast and cheap; opus is slower and more capable. You can also ask Daemion: "Switch researcher to opus."~/.daemion/soul.md) describes your preferences. Each agent's own soul.md describes its role and voice. Together they are injected into every conversation.permissions.autonomous list in daemion.yaml. Tools listed there run without asking. Tools in requires_approval ask first. Supported tools include: Read, Write, Bash, Grep, Glob, WebFetch, WebSearch.~/.daemion/agents/researcher/ directly. Or PATCH /extensions/:id/disk-config with updated systemPrompt, soulPrompt, or model fields.What can go wrong
400 {"error": "name must be kebab-case (a-z, 0-9, hyphens)"} — Agent names must be lowercase with hyphens only. My Agent and researcher_v2 are invalid. Use my-agent and researcher-v2.
400 {"error": "extension already exists"} — An extension with that name is already registered. Use GET /extensions?type=agent to list existing agents.
404 on chat — The agent ID in the chat request doesn’t match any registered agent. Confirm the ID from GET /extensions?type=agent.
Agent created but not visible in app — The app syncs extensions over WebSocket. If the agent doesn’t appear, pull to refresh or reconnect. The extension is in SQLite — it won’t be lost.
What’s next?
- Agent extension reference — full
daemion.yamlfield reference - How do I create a job? — autonomous background work that can invoke agents
- Chat API — send turns to an agent programmatically