On this page
On this page
Gateway
Configuration — per-agent entries and multi-agent routing
Per-agent overrides under agents.entries and the multiAgent bindings that decide which agent answers a message.
agents.entries (per-agent overrides)
Use agents.entries.*.tts to give an agent its own TTS provider, voice, model,
style, or auto-TTS mode. The agent block deep-merges over global
tts, so shared credentials can stay in one place while individual
agents override only the voice or provider fields they need. The active agent's
override applies to automatic spoken replies, /tts audio, /tts status, and
the tts agent tool. See Text-to-speech
for provider examples and precedence.
- The
agents.entriesobject key is the stable agent id. cwd: optional working directory for reply runs, separate fromworkspace. Overridesagents.defaults.cwd; see Working directory for precedence and sandbox restrictions.defaultis retired. Exactly one configured agent resolves implicitly; multi-agent operations require a binding, surfaceagentIdtarget, scoped session/store owner, or explicit--agent/request field.model: string form sets a strict per-agent primary with no model fallback; object form{ primary }is also strict unless you addfallbacks. Use{ primary, fallbacks: [...] }to opt that agent into fallback, or{ primary, fallbacks: [] }to make strict behavior explicit. Cron jobs that only overrideprimarystill inherit default fallbacks unless you setfallbacks: [].utilityModel: optional per-agent string, alias, or{ primary, fallbacks }override for short internal tasks such as generated session and thread titles. An omitted setting inheritsagents.defaults.utilityModel. A fallback-only object inherits the default primary; an explicit primary withoutfallbacks, orfallbacks: [], clears inherited utility fallbacks. Utility fallback lists are independent ofmodel.fallbacksand use the same retry, alias resolution, and model-selection policy as configured model fallbacks. With no explicit or inherited utility primary, automatic utility selection applies; if no automatic route is available, the first utility fallback starts the chain. Dashboard titles retry once with the effective regular session model after the utility chain is exhausted. An empty string skips the alternate utility route for this agent without disabling dashboard title generation.params: agent-wide stream params merged over shared and agent-specific per-model params. Use this for overrides likecacheRetention,temperature, ormaxTokensthat should apply across the agent's models.tts: optional per-agent text-to-speech overrides. The block deep-merges overtts, so keep shared provider credentials and fallback policy inttsand set only persona-specific values such as provider, voice, model, style, or auto mode here.skills: optional per-agent skill allowlist. If omitted, the agent inheritsagents.defaults.skillswhen set; an explicit list replaces defaults instead of merging, and[]means no skills.thinkingDefault: optional per-agent default thinking level (off | minimal | low | medium | high | xhigh | adaptive | max | ultra). Takes precedence over agent-specific and shared modelparams.thinkingsettings andagents.defaults.thinkingDefaultwhen no per-message or session override is set. The selected provider/model profile controls which values are valid; for Google Gemini,adaptivekeeps provider-owned dynamic thinking (thinkingLevelomitted on Gemini 3/3.1,thinkingBudget: -1on Gemini 2.5). See thinking resolution order.reasoningDefault: optional per-agent default reasoning visibility (on | off | stream). Overridesagents.defaults.reasoningDefaultfor this agent when no per-message or session reasoning override is set.fastModeDefault: optional per-agent default for fast mode ("auto" | true | false). Overridesagents.defaults.fastModeDefaultfor this agent when no per-message or session fast-mode override is set.verboseDefault: optional per-agent default verbose level ("off" | "on" | "full"). Overridesagents.defaults.verboseDefaultfor this agent when no per-message or session verbose override is set.models: optional per-agent model settings keyed by fullprovider/modelids. Usemodels["provider/model"].paramsfor model-specific request settings andmodels["provider/model"].agentRuntimefor runtime exceptions.models["provider/model"].codeModeacceptstrueorfalseand takes precedence over the agent'stools.codeModeactivation, the shared model override, and the global default. Omit it to inherit; it does not affect Codex native Code Mode.nativeRuntimeConsent: optional list of harness IDs, such as["muse"], remembered during setup. Applies only to this agent; it has no global or defaults inheritance. An administrator selecting a remembered harness or creating a chat with it automatically uses Full access with the optional sandbox disabled. This promotion uses the same permission-change lifecycle as explicit settings changes and refuses changes during an active run. Non-admin clients cannot use remembered consent to raise a chat's permissions; their existing restrictions still apply. Mandatory sandbox and workspace boundaries still reject the runtime. Each turn checks the current list, current session identity, Full access, sandbox off, and absence of tool allowlists, disabled tools, or swarm collection. The current live configuration is checked again immediately before native dispatch, so removing consent also blocks queued or prepared work that relied on it. Remove an ID in Settings under Remembered native runtime permissions to revoke it for every chat relying on remembered consent. Explicit Continue for this chat consent remains unchanged. The field is additive and requires no migration.runtime: optional per-agent runtime descriptor. Usetype: "acp"withruntime.acpdefaults (agent,backend,mode,cwd) when the agent should default to ACP harness sessions.identity.avatar: workspace-relative path,http(s)URL, ordata:URI.- Local workspace-relative
identity.avatarimage files are limited to 2 MB.http(s)URLs anddata:URIs are not checked against the local file-size limit. identityderives defaults:ackReactionfromemoji,mentionPatternsfromname/emoji.subagents.allowAgents: allowlist of configured agent ids for explicitsessions_spawn.agentIdtargets (["*"]= any configured target; default: same agent only). Include the requester id when self-targetedagentIdcalls should be allowed. Stale entries whose agent config was deleted are rejected bysessions_spawnand omitted fromagents_list; runopenclaw doctor --fixto clean them up, or add a minimalagents.entries.*entry if that target should remain spawnable while inheriting defaults.tools.agentToAgent.send: optional outgoing target agent IDs or*patterns forsessions_send. Omit to keep global policy and visibility checks;[]denies ordinary cross-agent sends. Matches permit send-only access under narrow visibility without granting history, search, list, status, or session controls. Global agent-to-agent policy and sandbox clamps still apply; same-agent and requester-owned child rules are unchanged. See send-only configuration.- Sandbox inheritance guard: if the requester session is sandboxed,
sessions_spawnrejects targets that would run unsandboxed. subagents.requireAgentId: when true, blocksessions_spawncalls that omitagentId(forces explicit profile selection; default: false).subagents.maxConcurrent: max concurrent child-agent runs per immediate spawning/controller session. Default:8; independent sessions have independent budgets. Codex-native subagents use Codex's separate scheduler and limits.subagents.maxChildrenPerAgent: separate admission limit on active children a single agent session can spawn. Default:5.subagents.maxSpawnDepth: max nesting depth for sub-agent spawning (1-5). Default:5; set1to make direct children leaves.subagents.archiveAfterMinutes: age before completed subagent state is archived. Default:60.
Multi-agent routing
Run multiple isolated agents inside one Gateway. See Multi-Agent.
Binding match fields
type(optional):routefor normal routing (missing type defaults to route),acpfor persistent ACP conversation bindings.match.channel(required)match.accountId(optional;*= any account; omitted = default account)match.peer(optional;{ kind: direct|group|channel, id })match.guildId/match.teamId(optional; channel-specific)session(optional; route bindings only):{ dmScope, groupScope }overrides session routing for matched peersacp(optional; only fortype: "acp"):{ mode, label, cwd, backend }
Fixed match order:
match.peermatch.guildIdmatch.teamIdmatch.accountId(exact, no peer/guild/team)match.accountId: "*"(channel-wide)- Sole-agent fallback (only when exactly one agent is configured; explicit multi-agent fleets without a matching binding reject the request)
Within each tier, the first matching bindings entry wins.
For type: "acp" entries, OpenClaw resolves by exact conversation identity (match.channel + account + match.peer.id) and does not use the route binding tier order above.
Per-agent access profiles
Full access (no sandbox)
Read-only tools + workspace
No filesystem access (messaging only)
See Multi-Agent Sandbox & Tools for precedence details.