Skip to main content

Agent definition JSON

The format of a file in initial-data/agent-definitions/. One file per agent.

Example (trimmed)

agent-definitions/research-lead.json
{
"id": "00000002-0000-0000-0000-000000000025",
"namespace": { "value": "local" },
"name": "research-lead",
"description": "Research orchestrator. Breaks a question into sub-topics…",
"systemPrompt": "You are a research lead. …",
"welcomeMessage": "Hi! I'm a research lead. Give me a research question…",
"llmConfigName": "agent-default",
"maxIterations": 10,
"status": "ACTIVE",
"memoryConfig": {
"kind": "auto_compact",
"compactAtRatio": 0.8,
"summaryPlacement": "USER_MESSAGE",
"toolResultEviction": { "afterTurns": 2, "aboveTokens": 800 }
},
"responseReviewers": [],
"tools": [
{
"id": "00000003-0000-0000-0000-000000000250",
"agentDefinitionId": "00000002-0000-0000-0000-000000000025",
"name": "list_agents",
"description": "Lists all available agents in the current namespace.",
"enabled": true
}
],
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-01T00:00:00Z"
}

Fields

FieldTypeDescription
idUUIDStable identifier. Use a fresh UUID for a new agent.
namespaceobjectTenant scope, e.g. { "value": "local" }. Identity is name + namespace.
namestringUnique agent name; referenced by run_agent("<name>", …).
descriptionstringShort summary shown in lists and to orchestrators.
systemPromptstringThe agent's role and instructions. Supports template vars like {{ current_date }}.
welcomeMessagestring?Optional greeting shown when a session starts.
llmConfigNamestringWhich LLM config to use (e.g. agent-default).
maxIterationsintMax tool-loop rounds per turn.
statusenumDRAFT, ACTIVE (usable) or DEPRECATED.
memoryConfigobjectWorking-memory strategy (see below).
toolSearchobject?Optional: { "enabled": true, "groups": ["web", …] } — gives the agent the tool_search tool so it can activate deferred tools from the listed groups on demand.
responseReviewersarrayOptional reviewer agents that check answers (e.g. answer-relevance-checker). Empty for none.
toolsarrayThe tools this agent may call (see below).
createdAt / updatedAttimestampBookkeeping.

memoryConfig

Controls how the conversation is kept within the model's context window.

FieldDescription
kindOne of none, windowed (sliding window), summarizing_window, auto_compact (summarize when full), full (keep everything).
compactAtRatioFor auto_compact: compact when the window reaches this fraction of the budget (e.g. 0.8).
summaryPlacementWhere the summary goes — USER_MESSAGE (auto-compact default) or SYSTEM_PROMPT (summarizing-window default).
toolResultEvictionDrop bulky tool results: afterTurns (age) and aboveTokens (size).

When memoryConfig is omitted the runtime uses the summarizing_window default — not auto_compact.

tools[]

Each entry grants the agent one tool.

FieldDescription
idUUID for this tool binding.
agentDefinitionIdThe owning agent's id.
nameTool name, e.g. web_search, run_agent, file_read.
descriptionShown to the model; can override the default description.
enabledtrue to make the tool callable.
overridesOptional per-agent config map for the tool, e.g. { "baseDir": "/tmp" }. Which keys a tool accepts is shown in the Admin UI tool catalog.
deferredtrue keeps the tool out of the prompt until the agent's tool_search activates it — for large tool sets like MCP bundles. Default false.
needsApprovaltrue requires a human to approve every call before it runs (the turn waits for approval). Default false.
Editing in the UI

You don't have to hand-edit JSON — the Admin UI → Agents section creates, edits, copies and configures all of this. The JSON is the seed format and what you check into git.