Configuration — agents
기준일: 2026-07-26
공식 기준: Configuration — agents
Configuration — agents 문서는 OpenClaw 공식 문서(gateway/config-agents)를 한국어로 정리한 가이드입니다. Agent defaults, multi-agent routing, session, messages, and talk config 명령·설정 키·코드 예시는 공식 문서를 그대로 보존하며, 해석과 절차 안내는 한국어로 제공합니다. 최종 동작은 설치된 CLI 버전과 공식 원문을 확인하세요.
핵심 요약
Agent defaults, multi-agent routing, session, messages, and talk config
한국어 가이드 범위: gateway/config-agents 경로의 설정·명령·제약·예시를 학습용으로 재구성합니다.
문서 구성
공식 문서의 주요 섹션은 다음과 같습니다.
- Agent defaults
- agents.defaults.workspace
- agents.defaults.repoRoot
- agents.defaults.skills
- agents.defaults.skipBootstrap
- agents.defaults.skipOptionalBootstrapFiles
- agents.defaults.contextInjection
- agents.defaults.bootstrapMaxChars
- agents.defaults.bootstrapTotalMaxChars
- Per-agent bootstrap profile overrides
- agents.defaults.bootstrapPromptTruncationWarning
- Context budget ownership map
- agents.defaults.imageMaxDimensionPx
- agents.defaults.imageQuality
- agents.defaults.userTimezone
- agents.defaults.timeFormat
- agents.defaults.model
- Runtime policy
- CLI backend selection
- agents.defaults.promptOverlays
- agents.defaults.heartbeat
- agents.defaults.compaction
- agents.defaults.contextPruning
- Block streaming
- Typing indicators
- agents.defaults.sandbox
- agents.entries (per-agent overrides)
- Multi-agent routing
- Binding match fields
- Per-agent access profiles
상세 내용
본문
Agent-scoped configuration keys under agents.*, multiAgent.*, session.*, messages.*, and talk.*. For channels, tools, gateway runtime, and other top-level keys, see Configuration reference.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
Agent defaults
이 섹션의 세부 항목은 공식 문서 Agent defaults를 참고하세요.
agents.defaults.workspace
기본값: OPENCLAW_WORKSPACE_DIR when set, otherwise ~/.openclaw/workspace (or ~/.openclaw/workspace- when OPENCLAW_PROFILE is set to a non-default profile).
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}
agents.defaults.repoRoot
Optional repository root shown in the system prompt's Runtime line. If unset, OpenClaw auto-detects by walking upward from the workspace.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}
agents.defaults.skills
Optional default skill allowlist for agents that do not set agents.entries.*.skills.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
- Omit
agents.defaults.skillsfor unrestricted skills by default. - Omit
agents.entries.*.skillsto inherit the defaults. - Set
agents.entries.*.skills: []for no skills. - A non-empty
agents.entries.*.skillslist is the final set for that agent; it
{
agents: {
defaults: { skills: ["github", "weather"] },
list: [
{ id: "writer" }, // inherits github, weather
{ id: "docs", skills: ["docs-search"] }, // replaces defaults
{ id: "locked-down", skills: [] }, // no skills
],
},
}
agents.defaults.skipBootstrap
Disables automatic creation of workspace bootstrap files (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, BOOTSTRAP.md).
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { skipBootstrap: true } },
}
agents.defaults.skipOptionalBootstrapFiles
Skips creation of selected optional workspace files while still writing required bootstrap files (AGENTS.md, TOOLS.md, BOOTSTRAP.md). Valid values: SOUL.md, USER.md, and IDENTITY.md (HEARTBEAT.md is accepted but a no-op since heartbeat context moved to cron monitor scratch).
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: {
defaults: {
skipOptionalBootstrapFiles: ["SOUL.md", "USER.md"],
},
},
}
agents.defaults.contextInjection
Controls when workspace bootstrap files are injected into the system prompt. 기본값: "always".
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
"continuation-skip": safe continuation turns (after a completed assistant response) skip workspace bootstrap re-injection, reducing prompt size. Heartbeat runs and post-compaction retries still rebuild context."never": disable workspace bootstrap and context-file injection on every turn. Use this only for agents that fully own their prompt lifecycle (custom context engines, native runtimes that build their own context, or specialized bootstrap-free workflows). Heartbeat and compaction-recovery turns also skip injection.
{
agents: { defaults: { contextInjection: "continuation-skip" } },
}
agents.defaults.bootstrapMaxChars
Max characters per workspace bootstrap file before truncation. 기본값: 20000.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { bootstrapMaxChars: 20000 } },
}
agents.defaults.bootstrapTotalMaxChars
Max total characters injected across all workspace bootstrap files. 기본값: 60000.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { bootstrapTotalMaxChars: 60000 } },
}
Per-agent bootstrap profile overrides
Use per-agent bootstrap profile overrides when one agent needs different prompt injection behavior from the shared defaults. Omitted fields inherit from agents.defaults.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: {
defaults: {
contextInjection: "continuation-skip",
bootstrapMaxChars: 20000,
bootstrapTotalMaxChars: 60000,
},
list: [
{
id: "strict-worker",
contextInjection: "always",
bootstrapMaxChars: 50000,
bootstrapTotalMaxChars: 300000,
},
],
},
}
agents.defaults.bootstrapPromptTruncationWarning
Controls the agent-visible system-prompt notice when bootstrap context is truncated. 기본값: "always".
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
"off": never inject truncation notice text into the system prompt."once": inject a concise notice once per unique truncation signature."always": inject a concise notice on every run when truncation exists (recommended).
{
agents: { defaults: { bootstrapPromptTruncationWarning: "always" } }, // off | once | always
}
Context budget ownership map
OpenClaw has multiple high-volume prompt/context budgets, and they are intentionally split by subsystem instead of all flowing through one generic knob.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
agents.entries.*.skillsLimits.maxSkillsPromptCharsagents.entries.*.contextInjectionagents.entries.*.bootstrapMaxCharsagents.entries.*.bootstrapTotalMaxCharsagents.entries.*.contextLimits.*memoryGetMaxChars: defaultmemory_getexcerpt cap before truncation- When
memory_getomitslines, OpenClaw uses a built-in 120-line window and - Live tool results use a model-context auto cap:
16000chars below 100K postCompactionMaxChars: AGENTS.md excerpt cap used during post-compaction
| Budget | Covers |
|---|---|
agents.defaults.bootstrapMaxChars / bootstrapTotalMaxChars |
Normal workspace bootstrap injection |
agents.defaults.startupContext.* |
One-shot reset/startup model-run prelude, including recent daily memory/*.md files. Bare chat /new and /reset are acknowledged without invoking the model |
skills.limits.* |
The compact skills list injected into the system prompt |
agents.defaults.contextLimits.* |
Bounded runtime excerpts and injected runtime-owned blocks |
memory.qmd.limits.* |
Indexed memory-search snippet and injection sizing |
{
agents: {
defaults: {
startupContext: {
enabled: true,
applyOn: ["new", "reset"],
dailyMemoryDays: 2,
maxFileBytes: 16384,
maxFileChars: 1200,
maxTotalChars: 2800,
},
},
},
}
{
agents: {
defaults: {
contextLimits: {
memoryGetMaxChars: 12000,
postCompactionMaxChars: 1800,
},
},
},
}
{
agents: {
defaults: {
contextLimits: { memoryGetMaxChars: 12000 },
},
list: [
{
id: "tiny-local",
contextLimits: {
memoryGetMaxChars: 6000,
},
},
],
},
}
{
skills: { limits: { maxSkillsPromptChars: 18000 } },
}
agents.defaults.imageMaxDimensionPx
Max pixel size for the longest image side in transcript/tool image blocks before provider calls. 기본값: 1200.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { imageMaxDimensionPx: 1200 } },
}
agents.defaults.imageQuality
Image-tool compression/detail preference for images loaded from file paths, URLs, and media references. 기본값: auto.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
auto: adapt to model limits and image count.efficient: prefer smaller images for lower token and byte usage.balanced: use the standard middle-ground ladder.high: preserve more detail for screenshots, diagrams, and document images.
{
agents: { defaults: { imageQuality: "auto" } },
}
agents.defaults.userTimezone
Timezone for system prompt context (not message timestamps). Falls back to host timezone.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { userTimezone: "America/Chicago" } },
}
agents.defaults.timeFormat
Time format in system prompt. 기본값: auto (OS preference).
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: { defaults: { timeFormat: "auto" } }, // auto | 12 | 24
}
agents.defaults.model
주요 항목:
model: accepts either a string ("provider/model") or an object ({ primary, fallbacks }).- String form sets only the primary model.
- Object form sets primary plus ordered failover models.
utilityModel: optionalprovider/modelref or alias for short internal tasks. It currently powers generated Control UI session titles, Telegram DM topic titles, Discord auto-thread titles, and progress-draft narration. When unset, OpenClaw derives the primary provider's declared small-model default when one exists (OpenAI →gpt-5.6-luna, Anthropic →claude-haiku-4-5); title tasks otherwise use the agent's primary model, and narration stays off. If a distinct utility model cannot prepare or complete a generated title, OpenClaw retries that title once with the primary model. For dashboard titles, automatic utility derivation and the regular fallback use the effective session provider and auth profile; an explicit utility model keeps its configured provider/auth. SetutilityModel: ""to skip the alternate utility route; dashboard title generation still proceeds directly to the regular session model.agents.entries.*.utilityModeloverrides the default, and an operation-specific model override wins over both. Utility tasks make separate model calls and send task-specific content to the selected model provider. Dashboard title generation sends at most the first 1,000 characters of the first non-command message; narration sends the inbound request plus compact redacted tool summaries. Choose a provider that matches your cost and data-handling requirements.imageModel: accepts either a string ("provider/model") or an object ({ primary, fallbacks }).- Used by the
imagetool path as its vision-model config when the active model cannot accept images. Native-vision models receive loaded image bytes directly instead. - Also used as fallback routing when the selected/default model cannot accept image input.
- Prefer explicit
provider/modelrefs. Bare IDs are accepted for compatibility; if a bare ID uniquely matches a configured image-capable entry inmodels.providers.*.models, OpenClaw qualifies it to that provider. Ambiguous configured matches require an explicit provider prefix. mediaModels.image: accepts either a string ("provider/model") or an object ({ primary, fallbacks }).- Used by the shared image-generation capability and any future tool/plugin surface that generates images.
- Typical values:
google/gemini-3.1-flash-imagefor native Gemini image generation,fal/fal-ai/flux/devfor fal,openai/gpt-image-2for OpenAI Images, oropenai/gpt-image-1.5for transparent-background OpenAI PNG/WebP output. - If you select a provider/model directly, configure matching provider auth too (for example
GEMINI_API_KEYorGOOGLE_API_KEYforgoogle/*,OPENAI_API_KEYor OpenAI Codex OAuth foropenai/gpt-image-2/openai/gpt-image-1.5,FAL_KEYforfal/*). - If omitted,
image_generatecan still infer an auth-backed provider default. It tries the current default provider first, then the remaining registered image-generation providers in provider-id order. mediaModels.music: accepts either a string ("provider/model") or an object ({ primary, fallbacks }).- Used by the shared music-generation capability and the built-in
music_generatetool. - Typical values:
google/lyria-3-clip-preview,google/lyria-3-pro-preview, orminimax/music-2.6. - If omitted,
music_generatecan still infer an auth-backed provider default. It tries the current default provider first, then the remaining registered music-generation providers in provider-id order. - If you select a provider/model directly, configure the matching provider auth/API key too.
mediaModels.video: accepts either a string ("provider/model") or an object ({ primary, fallbacks }).- Used by the shared video-generation capability and the built-in
video_generatetool. - Typical values:
qwen/wan2.6-t2v,qwen/wan2.6-i2v,qwen/wan2.6-r2v,qwen/wan2.6-r2v-flash, orqwen/wan2.7-r2v. - If omitted,
video_generatecan still infer an auth-backed provider default. It tries the current default provider first, then the remaining registered video-generation providers in provider-id order. - If you select a provider/model directly, configure the matching provider auth/API key too.
- The official Qwen video-generation plugin supports up to 1 output video, 1 input image, 4 input videos, 10 seconds duration, and provider-level
size,aspectRatio,resolution,audio, andwatermarkoptions. pdfModel: accepts either a string ("provider/model") or an object ({ primary, fallbacks }).
{
agents: {
defaults: {
models: {
"anthropic/claude-opus-4": { alias: "opus" },
"minimax/MiniMax-M2.7": { alias: "minimax" },
},
model: {
primary: "anthropic/claude-opus-4",
fallbacks: ["minimax/MiniMax-M2.7"],
},
utilityModel: "openai/gpt-5.4-mini",
imageModel: {
primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free",
fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"],
},
mediaModels: {
image: {
primary: "openai/gpt-image-2",
fallbacks: ["google/gemini-3.1-flash-image"],
},
video: {
primary: "qwen/wan2.6-t2v",
fallbacks: ["qwen/wan2.6-i2v"],
},
},
pdfModel: {
primary: "anthropic/claude-opus-4",
fallbacks: ["openai/gpt-5.4-mini"],
},
params: { cacheRetention: "long" }, // global default provider params
pdfMaxMb: 10,
pdfMaxPages: 20,
thinkingDefault: "low",
verboseDefault: "off",
toolProgressDetail: "explain",
reasoningDefault: "off",
elevatedDefault: "on",
timeoutSeconds: 600,
mediaMaxMb: 5,
contextTokens: 200000,
maxConcurrent: 4,
},
},
}
Runtime policy
Your configured aliases always win over defaults.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
id:"auto","openclaw", a registered plugin harness id, or a supported CLI backend alias. The bundled Codex plugin registerscodex; the bundled Anthropic plugin provides theclaude-cliCLI backend.id: "auto"lets registered plugin harnesses claim effective routes that declare or otherwise satisfy their support contract, and uses OpenClaw when no harness matches. An explicit plugin runtime such asid: "codex"requires that harness and a compatible effective route; it fails closed if either is unavailable or if execution fails.id: "pi"is accepted only as a deprecated alias foropenclawto preserve shipped configs from v2026.5.22 and earlier. New config should useopenclaw.- Runtime precedence is exact model policy first (
agents.entries.*.models["provider/model"],agents.defaults.models["provider/model"], ormodels.providers.<provider>.models[]), thenagents.entries.*/agents.defaults.models["provider/*"], then provider-wide policy atmodels.providers.<provider>.agentRuntime. - Whole-agent runtime keys are legacy.
agents.defaults.agentRuntime,agents.entries.*.agentRuntime, session runtime pins, andOPENCLAW_AGENT_RUNTIMEare ignored by runtime selection. Runopenclaw doctor --fixto remove stale values. - Eligible exact official HTTPS OpenAI Responses/ChatGPT routes with no authored request override may use the Codex harness implicitly. Provider/model
agentRuntime.id: "codex"makes Codex a fail-closed requirement but does not make an incompatible route compatible. - For Claude CLI deployments, prefer
model: "anthropic/claude-opus-5"plus model-scopedagentRuntime.id: "claude-cli". Legacyclaude-cli/<model>refs still work for compatibility, but new config should keep provider/model selection canonical and put the execution backend in provider/model runtime policy. - This only controls text agent-turn execution. Media generation, vision, PDF, music, video, and TTS still use their provider/model settings.
| Alias | Model |
|---|---|
opus |
anthropic/claude-opus-5 |
sonnet |
anthropic/claude-sonnet-5 |
gpt |
openai/gpt-5.4 |
gpt-mini |
openai/gpt-5.4-mini |
gpt-nano |
openai/gpt-5.4-nano |
gemini |
google/gemini-3.1-pro-preview |
gemini-flash |
google/gemini-3-flash-preview |
gemini-flash-lite |
google/gemini-3.1-flash-lite |
{
models: {
providers: {
openai: {
agentRuntime: { id: "codex" },
},
},
},
agents: {
defaults: {
model: "openai/gpt-5.6-sol",
models: {
"anthropic/claude-opus-5": {
agentRuntime: { id: "claude-cli" },
},
"vllm/*": {
agentRuntime: { id: "openclaw" },
},
},
},
},
}
CLI backend selection
CLI adapter mechanics are registered by plugins, not configured under agent defaults. Select a registered CLI backend with model-scoped agentRuntime.id, as shown above. See CLI backends for operations and building CLI backend plugins for command, session, image, and parser registration.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
agents.defaults.promptOverlays
Provider-independent prompt overlays applied by model family on OpenClaw-assembled prompt surfaces. GPT-5-family model ids receive the shared behavior contract across OpenClaw/provider routes; personality controls only the friendly interaction-style layer. Native Codex app-server routes keep Codex-owned base/model instructions instead of this OpenClaw GPT-5 overlay, and OpenClaw disables Codex's built-in personality for native threads.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
"friendly"(default) and"on"enable the friendly interaction-style layer."off"disables only the friendly layer; the tagged GPT-5 behavior contract remains enabled.- Legacy
plugins.entries.openai.config.personalityis still read when this shared setting is unset.
{
agents: {
defaults: {
promptOverlays: {
gpt5: {
personality: "friendly", // friendly | on | off
},
},
},
},
}
agents.defaults.heartbeat
주요 항목:
every: duration string (ms/s/m/h). 기본값:30m(API-key auth) or1h(OAuth auth). Set to0mto disable.- Cadence is written into a system-owned cron monitor row. Run
openclaw doctor --fixto materialize a missing or stale row. If cron is disabled, scheduled heartbeats do not run and the gateway logs a startup warning. includeSystemPromptSection: when false, omits the Heartbeat section from the system prompt. 기본값:true.suppressToolErrorWarnings: when true, suppresses tool error warning payloads during heartbeat runs.timeoutSeconds: maximum time in seconds allowed for a heartbeat agent turn before it is aborted. Leave unset to useagents.defaults.timeoutSecondswhen set, otherwise the heartbeat cadence capped at 600 seconds.directPolicy: direct/DM delivery policy.allow(default) permits direct-target delivery.blocksuppresses direct-target delivery and emitsreason=dm-blocked.lightContext: when true, heartbeat runs use lightweight bootstrap context and skip workspace bootstrap files. Monitor scratch is injected by the heartbeat runner either way.isolatedSession: when true, each heartbeat runs in a fresh session with no prior conversation history. Same isolation pattern as cronsessionTarget: "isolated". Reduces per-heartbeat token cost from ~100K to ~2-5K tokens.skipWhenBusy: when true, heartbeat runs defer on that agent's extra busy lanes: its own session-keyed subagent or nested command work. Cron lanes always defer heartbeats, even without this flag.- Per-agent: set
agents.entries.*.heartbeat. When any agent definesheartbeat, only those agents run heartbeats. - Heartbeats run full agent turns — shorter intervals burn more tokens.
{
agents: {
defaults: {
heartbeat: {
every: "30m", // 0m disables
model: "openai/gpt-5.4-mini",
includeReasoning: false,
includeSystemPromptSection: true, // default: true; false omits the Heartbeat section from the system prompt
lightContext: false, // default: false; true skips workspace bootstrap files for heartbeat runs
isolatedSession: false, // default: false; true runs each heartbeat in a fresh session (no conversation history)
skipWhenBusy: false, // default: false; true also waits for this agent's subagent/nested lanes
session: "main",
to: "+15555550123",
directPolicy: "allow", // allow (default) | block
target: "none", // default: none | options: last | whatsapp | telegram | discord | ...
prompt: "Follow the heartbeat monitor scratch context...",
ackMaxChars: 300,
suppressToolErrorWarnings: false,
timeoutSeconds: 45,
},
},
},
}
agents.defaults.compaction
Custom compaction instructions are code-owned. Implement a compaction provider plugin with summarize() for custom summary construction, and use before_prompt_build when post-compaction context must be injected into later model prompts. Doctor strips the retired instruction fields and points to these seams.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
mode:defaultorsafeguard(chunked summarization for long histories). See Compaction.provider: id of a registered compaction provider plugin. When set, the provider'ssummarize()is called instead of built-in LLM summarization. Falls back to built-in on failure. Setting a provider forcesmode: "safeguard". See Compaction.thinkingLevel: optional thinking level used only for embedded OpenClaw compaction summaries (off,minimal,low,medium,high,xhigh,adaptive,max, orultra). It overrides the session's current thinking level and is clamped to the selected compaction model/runtime. Leave unset to inherit the session level. Native Codex app-server compaction ignores this setting because the native compact request has no per-operation thinking override; OpenClaw logs a warning when configured.timeoutSeconds: maximum seconds allowed for a single compaction operation before OpenClaw aborts it. 기본값:180.keepRecentTokens: agent cut-point budget for keeping the most recent transcript tail verbatim. Manual/compacthonors this when explicitly set; otherwise manual compaction is a hard checkpoint.recentTurnsPreserve: number of most recent user/assistant turns kept verbatim outside safeguard summarization. 기본값:3.identifierPolicy:strict(default) oroff.strictprepends built-in opaque identifier retention guidance during compaction summarization.qualityGuard: retry-on-malformed-output checks for safeguard summaries. Enabled by default in safeguard mode; setenabled: falseto skip the audit.midTurnPrecheck: optional tool-loop pressure check. Whenenabled: true, OpenClaw checks context pressure after tool results are appended and before the next model call. If the context no longer fits, it aborts the current attempt before submitting the prompt and reuses the existing precheck recovery path to truncate tool results or compact and retry. Works with bothdefaultandsafeguardcompaction modes. 기본값: disabled.postIndexSync: post-compaction session-memory reindex mode. 기본값:"async". Use"await"for strongest freshness,"async"for lower compaction latency, or"off"only when session-memory sync is handled elsewhere.postCompactionSections: optional AGENTS.md H2/H3 section names to re-inject after compaction. Leave unset or use[]to disable.model: optionalprovider/model-idor bare alias fromagents.defaults.modelsfor compaction summarization only. Bare aliases resolve before dispatch; configured literal model IDs retain precedence on collisions. Use this when the main session should keep one model but compaction summaries should run on another; when unset, compaction uses the session's primary model.truncateAfterCompaction: rotates the active session transcript after compaction so future turns load only the summary and unsummarized tail, while the previous full transcript remains archived. Prevents unbounded active transcript growth in long-running sessions. 기본값:false.maxActiveTranscriptBytes: optional byte threshold (numberor strings like"20mb") that triggers normal local compaction before a run when transcript history grows past the threshold. RequirestruncateAfterCompactionso successful compaction can rotate to a smaller successor transcript. Disabled when unset or0.notifyUser: whentrue, sends brief context-maintenance notices to the user: when compaction starts and completes (예를 들어, "Compacting context..." and "Compaction complete"), and when a pre-compaction memory flush is exhausted so the reply continues in a degraded state (예를 들어, "Memory maintenance temporarily failed; continuing your reply."). Disabled by default to keep these notices silent.memoryFlush: silent agentic turn before auto-compaction to store durable memories. Setmodelto an exact provider/model such asollama/qwen3:8bwhen this housekeeping turn should stay on a local model; the override does not inherit the active session fallback chain.forceFlushTranscriptBytesforces the flush when transcript size reaches the threshold even if token counters are stale. Skipped when workspace is read-only.
{
agents: {
defaults: {
compaction: {
mode: "safeguard", // default | safeguard
provider: "my-provider", // id of a registered compaction provider plugin (optional)
thinkingLevel: "low", // optional compaction-only thinking override
timeoutSeconds: 180,
keepRecentTokens: 50000,
recentTurnsPreserve: 3,
identifierPolicy: "strict", // strict | off
qualityGuard: { enabled: true, maxRetries: 1 },
midTurnPrecheck: { enabled: false }, // optional tool-loop pressure check
postIndexSync: "async", // off | async | await
postCompactionSections: ["Session Startup", "Red Lines"],
model: "openrouter/anthropic/claude-sonnet-4-6", // optional compaction-only model override
truncateAfterCompaction: true, // rotate to a smaller successor JSONL after compaction
maxActiveTranscriptBytes: "20mb", // optional preflight local compaction trigger
notifyUser: true, // notices when compaction starts/completes and on memory-flush degradation (default: false)
memoryFlush: {
enabled: true,
model: "ollama/qwen3:8b", // optional memory-flush-only model override
softThresholdTokens: 6000,
forceFlushTranscriptBytes: "2mb",
},
},
},
},
}
agents.defaults.contextPruning
Prunes old tool results from in-memory context before sending to the LLM. Does not modify session history on disk. Disabled by default; set mode: "cache-ttl" to enable.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
mode: "cache-ttl"enables pruning passes.- Pruning soft-trims oversized tool results first, then hard-clears older tool results if needed.
- Image blocks are never trimmed/cleared.
- Ratios are character-based (approximate), not exact token counts.
- The most recent assistant messages are preserved.
{
agents: {
defaults: {
contextPruning: {
mode: "cache-ttl", // off (default) | cache-ttl
},
},
},
}
Block streaming
See Streaming for behavior + chunking details.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
- Non-Telegram channels require explicit
*.streaming.block.enabled: trueto enable block replies. QQ Bot is the exception: it has nostreaming.blockkeys and streams block replies unlesschannels.qqbot.streaming.modeis"off". - Channel overrides:
channels.<channel>.streaming.block.coalesce(and per-account variants). Discord, Google Chat, Mattermost, MS Teams, Signal, and Slack defaultminChars: 1500/idleMs: 1000. blockStreamingChunk.breakPreference: preferred chunk boundary ("paragraph" | "newline" | "sentence").humanDelay: randomized pause between block replies. 기본값:off.natural= 800-2500ms.customusesminMs/maxMs(falls back to the natural range for any unset bound). Per-agent override:agents.entries.*.humanDelay.
{
agents: {
defaults: {
blockStreamingDefault: "off", // on | off
blockStreamingBreak: "text_end", // text_end | message_end
blockStreamingChunk: { minChars: 800, maxChars: 1200, breakPreference: "paragraph" },
blockStreamingCoalesce: { idleMs: 1000 },
humanDelay: { mode: "natural" }, // off (default) | natural | custom (use minMs/maxMs)
},
},
}
Typing indicators
See Typing Indicators.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
- Defaults:
instantfor direct chats/mentions,messagefor unmentioned group chats. typingIntervalSecondsdefault:6.- Per-agent override:
agents.entries.*.typingMode.
{
agents: {
defaults: {
typingMode: "instant", // never | instant | thinking | message
typingIntervalSeconds: 6,
},
},
}
agents.defaults.sandbox
Optional sandboxing for the embedded agent. See Sandboxing for the full guide.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
docker: local Docker runtime (default)ssh: generic SSH-backed remote runtimeopenshell: OpenShell runtimetarget: SSH target inuser@host[:port]formcommand: SSH client command (default:ssh)workspaceRoot: absolute remote root used for per-scope workspaces (default:/tmp/openclaw-sandboxes)identityFile/certificateFile/knownHostsFile: existing local files passed to OpenSSHidentityData/certificateData/knownHostsData: inline contents or SecretRefs that OpenClaw materializes into temp files at runtimestrictHostKeyChecking/updateHostKeys: OpenSSH host-key policy knobs (both defaulttrue)identityDatawins overidentityFilecertificateDatawins overcertificateFileknownHostsDatawins overknownHostsFile- SecretRef-backed
*Datavalues are resolved from the active secrets runtime snapshot before the sandbox session starts - seeds the remote workspace once after create or recreate
- then keeps the remote SSH workspace canonical
- routes
exec, file tools, and media paths over SSH - does not sync remote changes back to the host automatically
- does not support sandbox browser containers
none: per-scope sandbox workspace under~/.openclaw/sandboxes(default)ro: sandbox workspace at/workspace, agent workspace mounted read-only at/agentrw: agent workspace mounted read/write at/workspacesession: per-session container + workspaceagent: one container + workspace per agent (default)shared: shared container and workspace (no cross-session isolation)mirror: seed remote from local before exec, sync back after exec; local workspace stays canonical
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // off (default) | non-main | all
backend: "docker", // docker (default) | ssh | openshell
scope: "agent", // session | agent (default) | shared
workspaceAccess: "none", // none (default) | ro | rw
workspaceRoot: "~/.openclaw/sandboxes",
docker: {
image: "openclaw-sandbox:bookworm-slim",
containerPrefix: "openclaw-sbx-",
workdir: "/workspace",
readOnlyRoot: true,
tmpfs: ["/tmp", "/var/tmp", "/run"],
network: "none",
user: "1000:1000",
capDrop: ["ALL"],
env: { LANG: "C.UTF-8" },
setupCommand: "apt-get update && apt-get install -y git curl jq",
pidsLimit: 256,
memory: "1g",
memorySwap: "2g",
cpus: 1,
gpus: "all",
ulimits: {
nofile: { soft: 1024, hard: 2048 },
nproc: 256,
},
seccompProfile: "/path/to/seccomp.json",
apparmorProfile: "openclaw-sandbox",
dns: ["1.1.1.1", "8.8.8.8"],
extraHosts: ["internal.service:10.0.0.5"],
binds: ["/home/user/source:/source:rw"],
},
ssh: {
target: "user@gateway-host:22",
command: "ssh",
workspaceRoot: "/tmp/openclaw-sandboxes",
strictHostKeyChecking: true,
updateHostKeys: true,
identityFile: "~/.ssh/id_ed25519",
certificateFile: "~/.ssh/id_ed25519-cert.pub",
knownHostsFile: "~/.ssh/known_hosts",
// SecretRefs / inline contents also supported:
// identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" },
// certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" },
// knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" },
},
browser: {
enabled: false,
image: "openclaw-sandbox-browser:bookworm-slim",
network: "openclaw-sandbox-browser",
cdpPort: 9222,
cdpSourceRange: "172.21.0.1/32",
vncPort: 5900,
noVncPort: 6080,
headless: false,
enableNoVnc: true,
allowHostControl: false,
autoStart: true,
autoStartTimeoutMs: 12000,
},
prune: {
idleHours: 24,
maxAgeDays: 7,
},
},
},
},
tools: {
sandbox: {
tools: {
allow: [
"exec",
"process",
"read",
"write",
"edit",
"apply_patch",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
},
},
},
}
{
plugins: {
entries: {
openshell: {
enabled: true,
config: {
mode: "mirror", // mirror (default) | remote
command: "openshell",
from: "openclaw",
remoteWorkspaceDir: "/sandbox",
remoteAgentWorkspaceDir: "/agent",
gateway: "lab", // optional
gatewayEndpoint: "https://lab.example", // optional
policy: "strict", // optional OpenShell policy id
providers: ["openai"], // optional
autoProviders: true,
timeoutSeconds: 120,
},
},
},
},
}
scripts/sandbox-setup.sh # main sandbox image
scripts/sandbox-browser-setup.sh # optional browser image
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.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
id: stable agent id (required).default: when multiple are set, first wins (warning logged). If none set, first list entry is default.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 override for short internal tasks such as generated session and thread titles. Falls back toagents.defaults.utilityModel, then the effective session provider's declared small-model default. Dashboard titles retry once with the effective regular session model. An empty string skips the alternate utility route for this agent without disabling dashboard title generation.params: per-agent stream params merged over the selected model entry inagents.defaults.models. Use this for agent-specific overrides likecacheRetention,temperature, ormaxTokenswithout duplicating the whole model catalog.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). Overridesagents.defaults.thinkingDefaultfor this agent when 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).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). Applies when no per-message or session fast-mode override is set.models: optional per-agent model catalog/runtime overrides keyed by fullprovider/modelids. Usemodels["provider/model"].agentRuntimefor per-agent runtime exceptions.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.- 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 across subagent execution. 기본값:8.subagents.maxChildrenPerAgent: max active children a single agent session can spawn. 기본값:5.subagents.maxSpawnDepth: max nesting depth for sub-agent spawning (1-5). 기본값:1(no nesting).subagents.archiveAfterMinutes: age before completed subagent state is archived. 기본값:60.
{
agents: {
list: [
{
id: "main",
default: true,
name: "Main Agent",
workspace: "~/.openclaw/workspace",
agentDir: "~/.openclaw/agents/main/agent",
model: "anthropic/claude-opus-4", // or { primary, fallbacks }
utilityModel: "openai/gpt-5.4-mini",
thinkingDefault: "high", // per-agent thinking level override
reasoningDefault: "on", // per-agent reasoning visibility override
fastModeDefault: false, // per-agent fast mode override
params: { cacheRetention: "none" }, // overrides matching defaults.models params by key
tts: {
providers: {
elevenlabs: { speakerVoiceId: "EXAVITQu4vr4xnSDxMaL" },
},
},
skills: ["docs-search"], // replaces agents.defaults.skills when set
identity: {
name: "Samantha",
theme: "helpful sloth",
emoji: "🦥",
avatar: "avatars/samantha.png",
},
groupChat: { mentionPatterns: ["@openclaw"] },
sandbox: { mode: "off" },
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent", // persistent | oneshot
cwd: "/workspace/openclaw",
},
},
subagents: { allowAgents: ["*"] },
tools: {
profile: "coding",
allow: ["browser"],
deny: ["canvas"],
elevated: { enabled: true },
},
},
],
},
}
Multi-agent routing
Run multiple isolated agents inside one Gateway. See Multi-Agent.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: {
list: [
{ id: "home", default: true, workspace: "~/.openclaw/workspace-home" },
{ id: "work", workspace: "~/.openclaw/workspace-work" },
],
},
bindings: [
{ agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
{ agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
],
}
Binding match fields
match.peer2.match.guildId3.match.teamId4.match.accountId(exact, no peer/guild/team) 5.match.accountId: "*"(channel-wide) 6. Default agent
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
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)acp(optional; only fortype: "acp"):{ mode, label, cwd, backend }
Per-agent access profiles
See Multi-Agent Sandbox & Tools for precedence details.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
{
agents: {
list: [
{
id: "personal",
workspace: "~/.openclaw/workspace-personal",
sandbox: { mode: "off" },
},
],
},
}
{
agents: {
list: [
{
id: "family",
workspace: "~/.openclaw/workspace-family",
sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
tools: {
allow: [
"read",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
},
},
],
},
}
{
agents: {
list: [
{
id: "public",
workspace: "~/.openclaw/workspace-public",
sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
tools: {
allow: [
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
"whatsapp",
"telegram",
"slack",
"discord",
"gateway",
],
deny: [
"read",
"write",
"edit",
"apply_patch",
"exec",
"process",
"browser",
"canvas",
"nodes",
"cron",
"gateway",
"image",
],
},
},
],
},
}
Session
Membership and visibility changes are written into the session transcript as system notes. These controls coordinate operators sharing one agent; they are not a security boundary between tenants. Use separate Gateways or agents when work requires isolation.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
scope: base session grouping strategy for group-chat contexts.per-sender(default): each sender gets an isolated session within a channel context.global: all participants in a channel context share a single session (use only when shared context is intended).dmScope: how DMs are grouped.main: all DMs share the main session.per-peer: isolate by sender id across channels.per-channel-peer: isolate per channel + sender (recommended for multi-user inboxes).per-account-channel-peer: isolate per account + channel + sender (recommended for multi-account).identityLinks: map canonical ids to provider-prefixed peers for cross-channel session sharing. Dock commands such as/dock_discorduse the same map to switch the active session's reply route to another linked channel peer; see Channel docking.reset: primary reset policy.nonedisables automatic reset and is the default; compaction bounds active context instead.dailyresets atatHourlocal time;idleresets afteridleMinutes. When both configured, whichever expires first wins./newand/resetremain available in every mode. Daily reset freshness uses the session row'ssessionStartedAt; idle reset freshness useslastInteractionAt. Background/system-event writes such as heartbeat, cron wakeups, exec notifications, and gateway bookkeeping can updateupdatedAt, but they do not keep daily/idle sessions fresh.resetByType: per-type overrides (direct,group,thread). Doctor migrates legacydmentries todirect; the schema rejectsdm.resetByChannel: per-channel reset overrides keyed by provider/channel id. When the session's channel has a matching entry, it wins outright overresetByType/resetfor that session. Use only when one channel needs reset behavior different from the type-level policy.mainKey: legacy field. Runtime always uses"main"for the main direct-chat bucket.sendPolicy: match bychannel,chatType(direct|group|channel, with legacydmalias),keyPrefix, orrawKeyPrefix. First deny wins.maintenance: session-store cleanup + retention controls.mode:enforceapplies cleanup and is the default;warnemits warnings only.pruneAfter: age cutoff for stale entries (default30d).maxEntries: maximum number of SQLite session entries (default500). Runtime writes batch cleanup with a small high-water buffer for production-sized caps;openclaw sessions cleanup --enforceapplies the cap immediately.- Short-lived gateway model-run probe sessions use fixed
24hretention, but cleanup is pressure-gated: it only removes stale strict model-run probe rows when session-entry maintenance/cap pressure is reached. Only strict explicit probe keys matchingagent:*:explicit:model-run-<uuid>are eligible; normal direct, group, thread, cron, hook, heartbeat, ACP, and sub-agent sessions do not inherit this 24h retention. When model-run cleanup runs, it runs before the broaderpruneAfterstale-entry cleanup andmaxEntriescap. - Legacy
rotateBytesis rejected by the current schema;openclaw doctor --fixremoves it from older configs. resetArchiveRetention: age-based retention for reset/deleted transcript archives. By default, archives remain until disk-budget eviction; set a duration to opt into wall-clock deletion, orfalseto disable it explicitly.maxDiskBytes: optional sessions-directory disk budget. Inwarnmode it logs warnings; inenforcemode it removes oldest artifacts/sessions first.highWaterBytes: optional target after budget cleanup. Defaults to80%ofmaxDiskBytes.threadBindings: global defaults for thread-bound session features.enabled: master switch for supported channel thread bindings
{
session: {
scope: "per-sender",
dmScope: "main", // main | per-peer | per-channel-peer | per-account-channel-peer
identityLinks: {
alice: ["telegram:123456789", "discord:987654321012345678"],
},
reset: {
mode: "daily", // daily | idle
atHour: 4,
idleMinutes: 60,
},
resetByType: {
thread: { mode: "daily", atHour: 4 },
direct: { mode: "idle", idleMinutes: 240 },
group: { mode: "idle", idleMinutes: 120 },
},
resetByChannel: {
discord: { mode: "idle", idleMinutes: 30 },
},
resetTriggers: ["/new", "/reset"],
store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
maintenance: {
mode: "enforce", // enforce (default) | warn
pruneAfter: "30d",
maxEntries: 500,
resetArchiveRetention: "30d", // duration or false
maxDiskBytes: "500mb", // optional hard budget
highWaterBytes: "400mb", // optional cleanup target
},
threadBindings: {
enabled: true,
idleHours: 24, // default inactivity auto-unfocus in hours (`0` disables)
maxAgeHours: 0, // default hard max age in hours (`0` disables)
},
sharing: {
readOnly: true,
suggest: true,
drafts: true,
},
mainKey: "main", // legacy (runtime always uses "main")
sendPolicy: {
rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
default: "allow",
},
},
}
Messages
{
messages: {
responsePrefix: "🦞", // or "auto"
ackReaction: "👀",
ackReactionScope: "group-mentions", // group-mentions | group-all | direct | all | off | none
queue: {
mode: "steer", // steer (default) | followup | collect | interrupt
debounceMs: 500,
cap: 20,
drop: "summarize", // old | new | summarize (default)
byChannel: {
whatsapp: "followup",
telegram: "followup",
},
},
inbound: {
debounceMs: 2000, // 0 disables
byChannel: {
whatsapp: 5000,
slack: 1500,
},
},
},
}
Response prefix
Per-channel/account overrides: channels..responsePrefix, channels..accounts..responsePrefix.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
| Variable | Description | Example |
|---|---|---|
{model} |
Short model name | claude-opus-4 |
{modelFull} |
Full model identifier | anthropic/claude-opus-4 |
{provider} |
Provider name | anthropic |
{thinkingLevel} |
Current thinking level | high, low, off |
{identity.name} |
Agent identity name | (same as "auto") |
Ack reaction
On Discord, unset keeps status reactions enabled when ack reactions are active. On Slack, Signal, Telegram, and WhatsApp, set it explicitly to true to enable lifecycle status reactions. Slack uses its native assistant thread status and rotating loading messages for progress by default, while keeping the configured ack reaction static.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
- Defaults to active agent's
identity.emoji, otherwise"👀". Set""to disable. - Per-channel overrides:
channels.<channel>.ackReaction,channels.<channel>.accounts.<id>.ackReaction. - Resolution order: account → channel →
messages.ackReaction→ identity fallback. - Scope:
group-mentions(default),group-all,direct,all, oroff/none(disables ack reactions entirely). messages.statusReactions.enabled: enables lifecycle status reactions on Slack, Discord, Signal, Telegram, and WhatsApp.
Queue
주요 항목:
mode: queue strategy for inbound messages that arrive while a session run is active. 기본값:"steer".steer: inject the new prompt into the active run.followup: run the new prompt after the active run finishes.collect: batch compatible messages and run them together later.interrupt: abort the active run before starting the newest prompt.debounceMs: delay before dispatching a queued/steered message. 기본값:500.cap: maximum queued messages before the drop policy applies. 기본값:20.drop: strategy when the cap is exceeded."summarize"(default) drops oldest entries but keeps compact summaries;"old"drops oldest without summaries;"new"rejects the newest item.byChannel: per-channelmodeoverrides keyed by provider id.debounceMsByChannel: per-channeldebounceMsoverrides keyed by provider id.
Inbound debounce
Batches rapid text-only messages from the same sender into a single agent turn. Media/attachments flush immediately. Control commands bypass debouncing. Default debounceMs: 2000.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
Other message keys
주요 항목:
channels.whatsapp.responsePrefix: outbound WhatsApp reply prefix. Doctor moves the retired inboundmessagePrefixvalue here only when this canonical value is unset.messages.visibleReplies: controls visible source replies across direct, group, and channel conversations ("message_tool"requiresmessage(action=send)for visible output;"automatic"posts normal replies as before).messages.usageTemplate/messages.responseUsage: custom/usagefooter template and default per-reply usage mode (off | tokens | full, plus legacyonalias fortokens).messages.groupChat.mentionPatterns/historyLimit: group-message mention triggers and history window sizing.messages.suppressToolErrors: whentrue, suppresses⚠️tool-error warnings shown to the user (the agent still sees errors in context and can retry). 기본값:false.
TTS (text-to-speech)
The global preferences path is machine state (default ~/.openclaw/settings/tts.json; override with OPENCLAW_TTS_PREFS). Advanced multi-agent setups can set agents.entries..tts.prefsPath for distinct per-agent preference stores.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
autocontrols the default auto-TTS mode:off,always,inbound, ortagged./tts on|offcan override local prefs, and/tts statusshows the effective state.summaryModeloverridesagents.defaults.model.primaryfor auto-summary.modelOverridesis enabled by default (enabled !== false);modelOverrides.allowProvideris opt-in.- API keys fall back to
ELEVENLABS_API_KEY/XI_API_KEYandOPENAI_API_KEY. - Bundled speech providers are plugin-owned. If
plugins.allowis set, include each TTS provider plugin you want to use, for examplemicrosoftfor Edge TTS. The legacyedgeprovider id is accepted as an alias formicrosoft. providers.openai.baseUrloverrides the OpenAI TTS endpoint. Resolution order is config, thenOPENAI_TTS_BASE_URL, thenhttps://api.openai.com/v1.- When
providers.openai.baseUrlpoints to a non-OpenAI endpoint, OpenClaw treats it as an OpenAI-compatible TTS server and relaxes model/voice validation.
{
tts: {
auto: "off", // off (default) | always | inbound | tagged
mode: "final", // final | all
provider: "elevenlabs",
summaryModel: "openai/gpt-5.4-mini",
modelOverrides: { enabled: true },
maxTextLength: 4000,
timeoutMs: 30000,
providers: {
elevenlabs: {
apiKey: "example-elevenlabs-api-key",
baseUrl: "https://api.elevenlabs.io",
speakerVoiceId: "voice_id",
modelId: "eleven_multilingual_v2",
seed: 42,
applyTextNormalization: "auto",
languageCode: "en",
voiceSettings: {
stability: 0.5,
similarityBoost: 0.75,
style: 0.0,
useSpeakerBoost: true,
speed: 1.0,
},
},
microsoft: {
speakerVoice: "en-US-MichelleNeural",
lang: "en-US",
outputFormat: "audio-24khz-48kbitrate-mono-mp3",
},
openai: {
apiKey: "example-openai-api-key",
baseUrl: "https://api.openai.com/v1",
model: "gpt-4o-mini-tts",
speakerVoice: "coral",
},
},
},
}
Talk
Defaults for Talk mode (macOS/iOS/Android and the browser Control UI).
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문과
--help를 확인하세요.
주요 항목:
talk.providermust match a key intalk.providerswhen multiple Talk providers are configured.- Legacy flat Talk keys (
talk.voiceId,talk.voiceAliases,talk.modelId,talk.outputFormat,talk.apiKey) are compatibility-only. Runopenclaw doctor --fixto rewrite persisted config intotalk.providers.<provider>. - Voice IDs fall back to
ELEVENLABS_VOICE_IDorSAG_VOICE_ID(macOS Talk client behavior). providers.*.apiKeyaccepts plaintext strings or SecretRef objects.ELEVENLABS_API_KEYfallback applies only when no Talk API key is configured.providers.*.voiceAliaseslets Talk directives use friendly names.providers.mlx.modelIdselects the Hugging Face repo used by the macOS local MLX helper. If omitted, macOS usesmlx-community/Soprano-80M-bf16.- macOS MLX playback runs through the bundled
openclaw-mlx-ttshelper when present, or an executable onPATH;OPENCLAW_MLX_TTS_BINoverrides the helper path for development. consultThinkingLevelcontrols the thinking level for the full OpenClaw agent run behind Control UI Talk realtimeopenclaw_agent_consultcalls. Leave unset to preserve normal session/model behavior.consultFastModesets a one-shot fast-mode override for Control UI Talk realtime consults without changing the session's normal fast-mode setting.speechLocalesets the BCP 47 locale id used by Android, iOS, and macOS Talk speech recognition. Android also uses its language component to guide realtime input transcription. Leave unset to use the device default.silenceTimeoutMscontrols how long Talk mode waits after user silence before it sends the transcript. Unset keeps the platform default pause window (700 ms on macOS and Android, 900 ms on iOS).realtime.instructionsappends provider-facing system instructions to OpenClaw's built-in realtime prompt, so voice style can be configured without losing defaultopenclaw_agent_consultguidance.realtime.vadThresholdsets the provider voice-activity threshold from0(most sensitive) to1(least sensitive). Unset keeps the provider default.realtime.silenceDurationMssets the positive whole-number silence window before the provider commits a realtime user turn. Unset keeps the provider default.realtime.prefixPaddingMssets the non-negative whole-number amount of audio retained before detected speech begins. Unset keeps the provider default.realtime.reasoningEffortsets the provider-specific reasoning level for realtime sessions. Unset keeps the provider default.realtime.consultRouting:"provider-direct"(default) preserves direct provider replies when the realtime provider produces a final user transcript withoutopenclaw_agent_consult."force-agent-consult"routes the finalized request through OpenClaw instead.
{
talk: {
provider: "elevenlabs",
providers: {
elevenlabs: {
speakerVoiceId: "elevenlabs_voice_id",
voiceAliases: {
Clawd: "EXAVITQu4vr4xnSDxMaL",
Roger: "CwhRBWXzGAHq8TQ4Fs17",
},
modelId: "eleven_multilingual_v2",
outputFormat: "mp3_44100_128",
apiKey: "elevenlabs_api_key",
},
mlx: {
modelId: "mlx-community/Soprano-80M-bf16",
},
system: {},
},
consultThinkingLevel: "low",
consultFastMode: true,
speechLocale: "ru-RU",
silenceTimeoutMs: 1500,
interruptOnSpeech: true,
realtime: {
provider: "openai",
providers: {
openai: {
model: "gpt-realtime-2.1",
speakerVoice: "cedar",
},
},
instructions: "Speak warmly and keep answers brief.",
mode: "realtime", // realtime | stt-tts | transcription
transport: "webrtc", // webrtc | provider-websocket | gateway-relay | managed-room
vadThreshold: 0.5,
silenceDurationMs: 500,
prefixPaddingMs: 300,
reasoningEffort: "medium",
brain: "agent-consult", // agent-consult | direct-tools | none
},
},
}
실습 체크리스트
- 공식 문서와 로컬 버전을 대조합니다:
https://docs.openclaw.ai/gateway/config-agents - 관련 CLI는
openclaw --help및 하위 명령--help로 옵션을 확인합니다. - 설정 변경 시
openclaw config/openclaw doctor로 유효성을 검사합니다. - Gateway·채널·플러그인 변경 후에는 필요 시 Gateway를 재시작합니다.
자주 쓰는 명령·설정 예시
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}
{
agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}
{
agents: {
defaults: { skills: ["github", "weather"] },
list: [
{ id: "writer" }, // inherits github, weather
{ id: "docs", skills: ["docs-search"] }, // replaces defaults
{ id: "locked-down", skills: [] }, // no skills
],
},
}
{
agents: { defaults: { skipBootstrap: true } },
}
{
agents: {
defaults: {
skipOptionalBootstrapFiles: ["SOUL.md", "USER.md"],
},
},
}
{
agents: { defaults: { contextInjection: "continuation-skip" } },
}
관련 링크
이 가이드는 공식 문서를 한국어 학습용으로 재구성한 것입니다. 옵션 기본값·플래그 이름은 설치 버전에 따라 달라질 수 있습니다.