Skip to content

Configuration: agents and runtime ​

This page lists every setting in agentx.json for the machine (node), model providers, agents, conversation sessions, warm processes and plugins. For the other sections and how to edit the file, see the Configuration reference.

In the tables, "required" means the setting has no default and must be set. "—" means it is unset unless you set it. Paths with <id> stand for a name you choose, such as an agent id.

node ​

The machine this daemon runs on.

KeyTypeDefaultWhat it does
node.idstringrequiredStable id of this machine. Used to label workflow runs and as this node's name on the mesh.
node.namestringrequiredReadable name of this machine, shown in logs and mesh listings.
node.bindstring"127.0.0.1:18800"Address and port the daemon API listens on.
node.defaultAgentstring—Agent used by voice and API calls that do not name one.

providers ​

API credentials for agents that call a model directly (the sdk and orchestrator engines). Keyed by provider name, for example providers.claude.

Key (under providers.<name>)TypeDefaultWhat it does
apiKeystring—API key for this provider. Use an ${ENV_VAR} reference rather than the key itself. An sdk agent without a key fails with No API key for provider.
defaultModelstring—Accepted by the validator but not read by the current runtime. Set model on the agent instead.
baseUrlstring—Accepted by the validator but not read by the current runtime.
thinkingboolean—Turns thinking-mode output on or off for orchestrator agents on backends that support it. Ignored elsewhere.
json
"providers": {
  "claude": { "apiKey": "${ANTHROPIC_API_KEY}" }
}

agents ​

One entry per agent, keyed by agent id (agents.<id>).

Key (under agents.<id>)TypeDefaultWhat it does
namestringrequiredDisplay name of the agent.
workspacestringrequiredFolder the agent works in.
tier"claude-code" | "codex-cli" | "opencode" | "sdk" | "orchestrator""claude-code"Engine that runs the agent: a provider CLI, a direct API call (sdk), or AgentX's own tool loop (orchestrator).
providerstring—Provider name in providers for sdk (default claude) and orchestrator (default claude-code) agents.
modelstring—Model id passed to the engine. Unset uses the engine's default.
systemPromptstring—Extra instructions added to every run of this agent.
mentionslist of string[]Names that route a message to this agent, such as @helper.
intentslist of string[]Intents this agent may handle, such as issue.opened. Empty allows any intent.
maxDelegationDepthnumber (0–50)5Refuses a hand-off to this agent when that many other agents already worked on the same item in a chain. 0 turns the check off.
mcpmap of object—MCP tool servers for this agent, by name. Written to the workspace's .mcp.json when the daemon starts; your own edits to that file are kept. See the table below.
codegraphbooleanfalseAdds the CodeGraph code index to the agent's workspace (tool server, permissions and instructions) and indexes the workspace in the background. For coding agents.
contextStrategy"layered" | "planner"—Overrides session.contextStrategy for this agent.
contextReferencesbooleanfalseAdds a checked list of references from the workspace's references/ registry to the agent's context.
richMessagesbooleantrueLets the agent send buttons, polls and media on chat channels, and also quick replies in the phone app, including replies relayed by mesh delegation or /send. false sends plain text only: no buttons, polls, media or quick replies, and on the phone no pictures inside answers (they show as links) and no files (their names show as text). Speech is not affected.
maxConcurrentnumber1How many runs of this agent can happen at the same time.
maxExecutionMinutesnumber (1–240)20Time limit for one run; the process is stopped when it passes.
preSpawnTimeoutSecnumber (10–3600)300Time a run may spend getting ready before its agent process starts. Each preparation step also has a short limit of its own (5 to 30 seconds); a step that runs past it is skipped and the run goes on without it. When the whole time passes anyway, the run is stopped, its slot is freed, its record is marked timeout with the step it was stuck on, and the message is tried once more from the start; if that stalls too, the sender is told in plain words to send it again. Applies to every run, whatever started it. See Time limits and cancel.
drainTimeoutSecondsnumber (0–86400)—How long a daemon stop waits for this agent's running tasks, when that is longer than shutdown.drainTimeoutSeconds. For agents whose tasks take long, such as renders. See change how long it waits.
permissionModestring"default"Permission mode for the agent's CLI. bypassPermissions lets it act without asking.
billing"subscription" | "api""subscription"For claude-code agents: use the shared sign-in (subscription) or bill ANTHROPIC_API_KEY (api). An api agent with no key fails its run.
toolUseRequiredlist of string[]Tool names, such as Write, of which at least one must be used in a run; otherwise the run fails with tool_required_not_called.
gitlabAutoReplyboolean—For this agent, overrides the GitLab or GitHub channel's autoReplyLegacy: true posts the agent's final answer as a comment, false does not.
persistentProcessbooleanfalseKeeps a warm process per conversation for claude-code, codex-cli and opencode agents so replies start faster.
queueMode"collect" | "followup" | "drop""collect"What happens to messages that arrive while the agent is busy: batch them into one turn, run each as its own turn afterwards, or discard them. A held message that waited more than a minute starts with a one-line note giving the time it arrived and the time it runs, so the agent checks again anything that may have changed meanwhile. A busy agent on another node is not an error either: the thread gets no ❌ and no failure comment, and the reply comes when the message runs.
access"private" | "public""private"public lets outside apps message the agent through the public API with a scoped token.
adminboolean—Lets the agent pause, resume and request deletion of schedules created by others. Approval stays with the operator.
subscriptionslist of object[]Events this agent follows, and whether it reads them itself (pull), gets a short list when it starts fresh (digest) or is started by them (wake). Each entry has kinds, agents, nodes, match, delivery and maxPerHour. See Let agents follow events.
heartbeat.enabledbooleanfalseRuns a periodic check-in inside the agent's ongoing session.
heartbeat.intervalMinutesnumber30Minutes between check-ins.
heartbeat.promptstring"Check inbox, pending tasks, and system health. Report anything that needs attention."What the agent is asked at each check-in.
heartbeat.channelstring"heartbeat"Channel name the check-in runs under.
integrationslist of object[]Services this agent has credentials for. See the table below.
voiceobject—How the agent sounds. See the table below.
presenceobject—How the agent's on-screen cursor looks. See the table below.
json
"agents": {
  "helper": {
    "name": "Helper",
    "workspace": "./workspaces/helper",
    "tier": "claude-code",
    "mentions": ["@helper"],
    "maxConcurrent": 2,
    "heartbeat": { "enabled": true, "intervalMinutes": 60 }
  }
}

MCP servers ​

Each entry under agents.<id>.mcp.<name> is either a local command or an HTTP server.

KeyTypeDefaultWhat it does
type"stdio" | "http""stdio"Kind of server. Leave it out for a local command.
commandstringrequired for stdioProgram to start.
argslist of string[]Arguments for command.
envmap of string—Environment variables for command.
urlstringrequired for httpAddress of the HTTP server.
headersmap of string—HTTP headers sent to the server.

Integrations ​

Each item in agents.<id>.integrations declares one service. Secrets never go in agentx.json: credentials name an environment variable (uppercase, such as HELPER_CRM_TOKEN) or the system keyring.

KeyTypeDefaultWhat it does
kindstringrequiredService, such as telegram-bot, gitlab-user, gmail, hubspot or custom. agentx doctor warns on unknown kinds.
labelstringrequiredReadable name, unique per agent and kind.
credentialsobject{}Where the secret lives. Only the keys below are accepted.
credentials.tokenEnvstring—Environment variable holding the main token.
credentials.privateAppTokenEnvstring—Environment variable for a private app token.
credentials.apiKeyEnvstring—Environment variable for an API key.
credentials.refreshTokenEnvstring—Environment variable for an OAuth refresh token.
credentials.clientIdEnvstring—Environment variable for an OAuth client id.
credentials.clientSecretEnvstring—Environment variable for an OAuth client secret.
credentials.auth"keyring"—The credential is in the system keyring instead of an environment variable.
credentials.sessionDirstring—Folder holding a login session, for services such as WhatsApp.
metadatamap of string, number or boolean{}Non-secret details (username, host, account id), shown in the dashboard and to skills.
enabledbooleantrueTurns the integration off without removing it.

Voice ​

agents.<id>.voice overrides the global voice settings for one agent (desktop assistant).

KeyTypeDefaultWhat it does
voice.provider"system" | "elevenlabs"—Speech engine for this agent. Unset uses the global voice.provider.
voice.systemstring | map of string—macOS voice name, system for the OS default, or one voice per language such as { "en": "Samantha" }. Unset picks a free voice.
voice.fallbacksstring[]—Voices to try in order when voice.system is not installed. Unset picks the best installed voice of the same language and gender.
voice.elevenlabsVoiceIdstring—ElevenLabs voice id.
voice.gender"female" | "male" | "neutral"—Guides which voice is picked when none is set.
voice.stylestring—A few words on manner, such as "warm, calm".
voice.introstring—One-line self-introduction used on first contact.
voice.narrate"off" | "on" | "all"—Speaks short updates while the agent works: on for all but scheduled jobs, all includes them.

Presence ​

agents.<id>.presence sets the agent's own cursor, drawn by the Mac helper.

KeyTypeDefaultWhat it does
presence.colorstring (#RRGGBB)from the agent idCursor colour.
presence.initialstring (up to 2 letters)from the nameLetters on the cursor.
presence.labelstringthe agent's nameName shown under the cursor.
presence.allowActionsboolean—Lets the agent click and type for you. Without it, "act" falls back to "teach".

session ​

When a conversation's memory is rotated or treated as stale.

KeyTypeDefaultWhat it does
session.staleMinutesnumber (1–1440)720Minutes of silence after which a conversation starts fresh.
session.maxTurnsPerSessionnumber (2–200)40Turns after which the conversation is rotated to a new session.
session.tierTwoThresholdTokensnumber (50000–200000)180000Context size, in tokens, at which the conversation is rotated.
session.contextStrategy"layered" | "planner""layered"How context is built: all layers every turn, or a small model picks what to retrieve first.
session.maxClaudeCodeDispatchesPerHournumber (1–10000)80Soft hourly cap on new claude-code runs across the machine. Warm sessions still go through.
session.maxClaudeCodeDispatchesPer5hnumber (1–50000)180The same cap over five hours.
session.continuityStateTurnsnumber (0–5)0Extra earlier requests shown to the session-continuity decision. 0 keeps the default two messages.

processPool ​

How long warm claude-code processes (persistentProcess) are kept. Codex and OpenCode use fixed limits.

KeyTypeDefaultWhat it does
processPool.maxIdleSecondsnumber (5–86400)30Seconds after its last turn when a process may be stopped to make room.
processPool.maxAgeSecondsnumber (60–86400)2700Seconds of idleness after which a process is always stopped.
processPool.sweepIntervalSecondsnumber (1–300)5How often the pool is checked.

plugins ​

KeyTypeDefaultWhat it does
pluginslist of string[]Installed npm package names loaded as plugins when the daemon starts.

Check it worked ​

  1. Terminal: in the folder with agentx.json, run agentx config check. It prints ✓ Config valid.
  2. Terminal: run agentx config get agents.helper.maxConcurrent, using your own agent id. It prints the value you set.
  3. Terminal: run agentx agent list. The agent appears with its engine and model.

If something is wrong ​

  • config check names a field: the value has the wrong type or is out of range. Compare it with the table above.
  • An sdk agent fails with No API key for provider: set providers.<name>.apiKey, or check that the environment variable it points to is in .env.
  • A model or engine change is ignored: restart the daemon fully with agentx daemon stop, then agentx daemon start --detach.

Released under the MIT License.