구성 참조
~/.openclaw/openclaw.json에서 사용할 수 있는 모든 필드별 레퍼런스입니다. 작업 중심 개요는 Configuration을 참고하세요.
구성 형식은 JSON5입니다. 주석과 trailing comma를 사용할 수 있으며, 모든 필드는 선택 사항입니다. 생략하면 OpenClaw가 안전한 기본값을 사용합니다.
채널
각 채널은 해당 구성 섹션이 존재하면 자동으로 시작됩니다(enabled: false가 아닌 한).
DM 및 그룹 접근
모든 채널은 DM 정책과 그룹 정책을 지원합니다.| DM policy | 동작 |
|---|---|
pairing (default) | 알 수 없는 발신자는 일회성 pairing code를 받고, 소유자가 승인해야 함 |
allowlist | allowFrom(또는 paired allow store)에 있는 발신자만 허용 |
open | 모든 수신 DM 허용(allowFrom: ["*"] 필요) |
disabled | 모든 수신 DM 무시 |
| Group policy | 동작 |
|---|---|
allowlist (default) | 구성된 allowlist와 일치하는 그룹만 허용 |
open | 그룹 allowlist를 우회함(mention gating은 계속 적용됨) |
disabled | 모든 그룹/룸 메시지를 차단 |
channels.defaults.groupPolicy는 provider의 groupPolicy가 설정되지 않았을 때 사용할 기본값을 설정합니다.
Pairing code는 1시간 후 만료됩니다. 대기 중인 DM pairing 요청은 채널당 3개로 제한됩니다.
provider 블록이 아예 없으면(channels.<provider>가 없음), 런타임 그룹 정책은 시작 시 경고와 함께 allowlist(fail-closed)로 fallback됩니다.채널별 모델 override
특정 채널 ID를 특정 모델에 고정하려면channels.modelByChannel을 사용하세요. 값은 provider/model 또는 구성된 모델 alias를 받을 수 있습니다. 이 채널 매핑은 세션에 이미 모델 override가 없는 경우에만 적용됩니다(예: /model로 설정된 경우 제외).
채널 기본값과 heartbeat
provider 전반에 걸쳐 공유되는 그룹 정책과 heartbeat 동작에는channels.defaults를 사용하세요.
channels.defaults.groupPolicy: provider 수준groupPolicy가 설정되지 않았을 때의 fallback 그룹 정책channels.defaults.heartbeat.showOk: heartbeat 출력에 정상 채널 상태를 포함channels.defaults.heartbeat.showAlerts: heartbeat 출력에 성능 저하/오류 상태를 포함channels.defaults.heartbeat.useIndicator: 간결한 indicator 스타일 heartbeat 출력을 렌더링
다중 계정 WhatsApp
다중 계정 WhatsApp
- 발신 명령은
default계정이 있으면 기본적으로 그 계정을 사용하고, 없으면 구성된 첫 번째 계정 id(정렬 기준)를 사용합니다. - 선택 사항인
channels.whatsapp.defaultAccount는 구성된 계정 id와 일치할 때 이 fallback 기본 계정 선택을 override합니다. - 레거시 단일 계정 Baileys auth dir은
openclaw doctor가whatsapp/default로 마이그레이션합니다. - 계정별 override:
channels.whatsapp.accounts.<id>.sendReadReceipts,channels.whatsapp.accounts.<id>.dmPolicy,channels.whatsapp.accounts.<id>.allowFrom
Telegram
- Bot token:
channels.telegram.botToken또는channels.telegram.tokenFile, 기본 계정에 대해서는TELEGRAM_BOT_TOKEN이 fallback입니다. - 선택 사항인
channels.telegram.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다. - 다중 계정 설정(계정 id 2개 이상)에서는 fallback 라우팅을 피하려면 명시적 기본값(
channels.telegram.defaultAccount또는channels.telegram.accounts.default)을 설정하세요. 이것이 없거나 잘못되면openclaw doctor가 경고합니다. configWrites: false는 Telegram이 시작한 config 쓰기(supergroup ID migration,/config set|unset)를 차단합니다.type: "acp"인 최상위bindings[]항목은 forum topic에 대한 지속적 ACP binding을 구성합니다(match.peer.id에는 정규chatId:topic:topicId사용). 필드 의미는 ACP Agents에서 공유됩니다.- Telegram stream preview는
sendMessage+editMessageText를 사용합니다(직접 채팅과 그룹 채팅 모두에서 동작). - 재시도 정책: Retry policy 참고
Discord
- Token:
channels.discord.token, 기본 계정에 대해서는DISCORD_BOT_TOKEN이 fallback입니다. - 선택 사항인
channels.discord.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다. - 전달 대상에는
user:<id>(DM) 또는channel:<id>(guild channel)를 사용하세요. 숫자 ID만 단독으로 쓰는 것은 거부됩니다. - Guild slug는 소문자에 공백을
-로 바꾼 형태이며, 채널 키는 slug 처리된 이름(#없음)을 사용합니다. 가능하면 guild ID를 선호하세요. - 봇이 작성한 메시지는 기본적으로 무시됩니다.
allowBots: true는 이를 허용하며,allowBots: "mentions"는 봇을 mention한 bot 메시지만 허용합니다(자기 자신의 메시지는 계속 필터링됨). channels.discord.guilds.<id>.ignoreOtherMentions(및 채널 override)는 봇을 mention하지 않고 다른 사용자나 role만 mention한 메시지를 버립니다(@everyone/@here 제외).maxLinesPerMessage(기본 17)는 2000자 이하라도 세로로 긴 메시지를 분할합니다.channels.discord.threadBindings는 Discord thread-bound 라우팅을 제어합니다.enabled: thread-bound session 기능(/focus,/unfocus,/agents,/session idle,/session max-age, bound delivery/routing)에 대한 Discord overrideidleHours: 비활성 auto-unfocus 시간(시간 단위)에 대한 Discord override(0이면 비활성화)maxAgeHours: 하드 최대 수명 시간(시간 단위)에 대한 Discord override(0이면 비활성화)spawnSubagentSessions:sessions_spawn({ thread: true })의 자동 thread 생성/binding에 대한 opt-in 스위치
type: "acp"인 최상위bindings[]항목은 채널과 thread에 대한 지속적 ACP binding을 구성합니다(match.peer.id에는 channel/thread id 사용). 필드 의미는 ACP Agents에서 공유됩니다.channels.discord.ui.components.accentColor는 Discord components v2 container의 accent color를 설정합니다.channels.discord.voice는 Discord voice channel 대화와 선택적 auto-join + TTS override를 활성화합니다.channels.discord.voice.daveEncryption과channels.discord.voice.decryptionFailureTolerance는@discordjs/voiceDAVE 옵션에 그대로 전달됩니다(기본값은 각각true,24).- OpenClaw는 반복적인 decrypt 실패 후 voice session에서 나갔다가 다시 들어오는 방식으로 voice receive recovery도 시도합니다.
channels.discord.streaming은 정규 stream mode 키입니다. 레거시streamMode와 booleanstreaming값은 자동 마이그레이션됩니다.channels.discord.autoPresence는 런타임 가용성을 봇 presence에 매핑하며(healthy => online, degraded => idle, exhausted => dnd), 선택적 status text override를 허용합니다.channels.discord.dangerouslyAllowNameMatching은 변경 가능한 name/tag 매칭을 다시 활성화합니다(break-glass 호환 모드).
off(없음), own(봇의 메시지, 기본값), all(모든 메시지), allowlist(모든 메시지에서 guilds.<id>.users 사용).
Google Chat
- Service account JSON: inline(
serviceAccount) 또는 file 기반(serviceAccountFile) - Service account SecretRef도 지원됩니다(
serviceAccountRef). - Env fallback:
GOOGLE_CHAT_SERVICE_ACCOUNT또는GOOGLE_CHAT_SERVICE_ACCOUNT_FILE - 전달 대상에는
spaces/<spaceId>또는users/<userId>를 사용하세요. channels.googlechat.dangerouslyAllowNameMatching은 변경 가능한 email principal 매칭을 다시 활성화합니다(break-glass 호환 모드).
Slack
- Socket mode는
botToken과appToken이 모두 필요합니다(기본 계정 env fallback은SLACK_BOT_TOKEN+SLACK_APP_TOKEN). - HTTP mode는
botToken과signingSecret(루트 또는 계정별)이 필요합니다. configWrites: false는 Slack이 시작한 config 쓰기를 차단합니다.- 선택 사항인
channels.slack.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다. channels.slack.streaming은 정규 stream mode 키입니다. 레거시streamMode와 booleanstreaming값은 자동 마이그레이션됩니다.- 전달 대상에는
user:<id>(DM) 또는channel:<id>를 사용하세요.
off, own(기본값), all, allowlist(reactionAllowlist 사용)
Thread session isolation: thread.historyScope는 thread별(기본값) 또는 채널 전체 공유입니다. thread.inheritParent는 부모 채널 transcript를 새 thread에 복사합니다.
typingReaction은 응답이 실행 중인 동안 수신 Slack 메시지에 임시 reaction을 추가하고 완료 시 제거합니다."hourglass_flowing_sand"같은 Slack emoji shortcode를 사용하세요.
| Action group | 기본값 | 참고 |
|---|---|---|
| reactions | enabled | 반응 + 반응 목록 |
| messages | enabled | 읽기/전송/수정/삭제 |
| pins | enabled | 고정/해제/목록 |
| memberInfo | enabled | 멤버 정보 |
| emojiList | enabled | 사용자 정의 emoji 목록 |
Mattermost
Mattermost는 plugin으로 제공됩니다:openclaw plugins install @openclaw/mattermost.
oncall(@-mention 시 응답, 기본값), onmessage(모든 메시지), onchar(트리거 prefix로 시작하는 메시지).
Mattermost native command가 활성화되면:
commands.callbackPath는 전체 URL이 아니라 경로여야 합니다(예:/api/channels/mattermost/command).commands.callbackUrl은 OpenClaw gateway endpoint로 해석되어야 하며 Mattermost 서버에서 접근 가능해야 합니다.- private/tailnet/internal callback host의 경우 Mattermost에서
ServiceSettings.AllowedUntrustedInternalConnections에 callback host/domain을 포함해야 할 수 있습니다. 전체 URL이 아니라 host/domain 값을 사용하세요. channels.mattermost.configWrites: Mattermost가 시작한 config 쓰기를 허용하거나 거부channels.mattermost.requireMention: 채널에서 응답하기 전에@mention을 요구- 선택 사항인
channels.mattermost.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다.
Signal
off, own(기본값), all, allowlist(reactionAllowlist 사용)
channels.signal.account: 채널 시작을 특정 Signal 계정 identity에 고정channels.signal.configWrites: Signal이 시작한 config 쓰기를 허용하거나 거부- 선택 사항인
channels.signal.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다.
BlueBubbles
BlueBubbles는 권장 iMessage 경로입니다(plugin 기반,channels.bluebubbles 아래에서 구성).
- 여기서 다루는 핵심 키 경로:
channels.bluebubbles,channels.bluebubbles.dmPolicy - 선택 사항인
channels.bluebubbles.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다. - 전체 BlueBubbles 채널 구성은 BlueBubbles에 문서화되어 있습니다.
iMessage
OpenClaw는imsg rpc를 실행합니다(stdio 위의 JSON-RPC). daemon이나 port는 필요하지 않습니다.
-
선택 사항인
channels.imessage.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다. - Messages DB에 대한 Full Disk Access가 필요합니다.
-
가능하면
chat_id:<id>대상을 선호하세요. 채팅 목록은imsg chats --limit 20으로 확인하세요. -
cliPath는 SSH wrapper를 가리킬 수 있으며, SCP attachment fetching을 위해remoteHost(host또는user@host)를 설정하세요. -
attachmentRoots와remoteAttachmentRoots는 수신 attachment 경로를 제한합니다(기본값:/Users/*/Library/Messages/Attachments). -
SCP는 strict host-key checking을 사용하므로 relay host key가 이미
~/.ssh/known_hosts에 있어야 합니다. -
channels.imessage.configWrites: iMessage가 시작한 config 쓰기를 허용하거나 거부
iMessage SSH wrapper 예시
iMessage SSH wrapper 예시
Microsoft Teams
Microsoft Teams는 extension 기반이며channels.msteams 아래에서 구성합니다.
- 여기서 다루는 핵심 키 경로:
channels.msteams,channels.msteams.configWrites - 전체 Teams 구성(credentials, webhook, DM/group policy, 팀별/채널별 override)은 Microsoft Teams에 문서화되어 있습니다.
IRC
IRC는 extension 기반이며channels.irc 아래에서 구성합니다.
- 여기서 다루는 핵심 키 경로:
channels.irc,channels.irc.dmPolicy,channels.irc.configWrites,channels.irc.nickserv.* - 선택 사항인
channels.irc.defaultAccount는 구성된 계정 id와 일치할 때 기본 계정 선택을 override합니다. - 전체 IRC 채널 구성(host/port/TLS/channels/allowlist/mention gating)은 IRC에 문서화되어 있습니다.
다중 계정(모든 채널)
채널별로 여러 계정을 실행합니다(각 계정은 자체accountId를 가짐).
accountId를 생략하면default가 사용됩니다(CLI + routing).- Env token은 기본 계정에만 적용됩니다.
- 기본 채널 설정은 계정별로 override되지 않는 한 모든 계정에 적용됩니다.
bindings[].match.accountId를 사용해 각 계정을 서로 다른 agent로 라우팅하세요.- 단일 계정 최상위 채널 구성 상태에서
openclaw channels add(또는 채널 onboarding)로 non-default 계정을 추가하면, OpenClaw는 먼저 계정 범위의 최상위 단일 계정 값을channels.<channel>.accounts.default로 옮겨 원래 계정이 계속 동작하도록 합니다. - 기존의 채널 전용 binding(
accountId없음)은 계속 기본 계정과 매칭되며, 계정 범위 binding은 선택 사항으로 유지됩니다. openclaw doctor --fix도 명명된 계정은 있는데default가 없는 경우, 계정 범위의 최상위 단일 계정 값을accounts.default로 옮겨 혼합 구조를 복구합니다.
기타 extension 채널
많은 extension 채널은channels.<id> 형태로 구성되며, 전용 채널 페이지에 문서화되어 있습니다(예: Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat, Twitch).
전체 채널 색인은 Channels를 참고하세요.
그룹 채팅 mention gating
그룹 메시지는 기본적으로 mention 필요입니다(metadata mention 또는 regex pattern). WhatsApp, Telegram, Discord, Google Chat, iMessage 그룹 채팅에 적용됩니다. Mention 유형:- Metadata mention: 네이티브 플랫폼 @-mention. WhatsApp self-chat mode에서는 무시됩니다.
- 텍스트 패턴:
agents.list[].groupChat.mentionPatterns의 regex pattern. 항상 검사됩니다. - Mention gating은 감지가 가능한 경우에만 적용됩니다(네이티브 mention 또는 최소 하나의 pattern).
messages.groupChat.historyLimit는 전역 기본값을 설정합니다. 채널은 channels.<channel>.historyLimit(또는 계정별)로 override할 수 있습니다. 비활성화하려면 0으로 설정하세요.
DM history limit
telegram, whatsapp, discord, slack, signal, imessage, msteams
Self-chat mode
자기 번호를allowFrom에 포함하면 self-chat mode가 활성화됩니다(네이티브 @-mention은 무시하고 텍스트 패턴에만 응답).
명령(채팅 명령 처리)
명령 세부사항
명령 세부사항
Agent 기본값
agents.defaults.workspace
기본값: ~/.openclaw/workspace
agents.defaults.repoRoot
system prompt의 Runtime 줄에 표시할 선택적 repository root입니다. 설정하지 않으면 OpenClaw가 workspace에서 위로 탐색하며 자동 감지합니다.
agents.defaults.skipBootstrap
workspace bootstrap 파일(AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md)의 자동 생성을 비활성화합니다.
agents.defaults.bootstrapMaxChars
잘라내기 전 workspace bootstrap 파일당 최대 문자 수. 기본값: 20000
agents.defaults.bootstrapTotalMaxChars
모든 workspace bootstrap 파일에서 주입되는 총 문자 수의 최대값. 기본값: 150000
agents.defaults.bootstrapPromptTruncationWarning
bootstrap context가 잘릴 때 agent에게 보이는 경고 텍스트를 제어합니다.
기본값: "once"
"off": 시스템 프롬프트에 경고 텍스트를 주입하지 않음"once": 고유한 잘림 시그니처당 한 번만 경고 주입(권장)"always": 잘림이 있을 때마다 매 실행 시 경고 주입
agents.defaults.imageMaxDimensionPx
provider 호출 전에 transcript/tool image block에서 가장 긴 이미지 변의 최대 픽셀 크기.
기본값: 1200
값이 낮을수록 보통 vision-token 사용량과 screenshot가 많은 실행의 request payload 크기가 줄어듭니다.
값이 높을수록 더 많은 시각적 디테일을 유지합니다.
agents.defaults.userTimezone
system prompt context용 timezone입니다(메시지 timestamp용이 아님). 설정하지 않으면 host timezone을 사용합니다.
agents.defaults.timeFormat
system prompt의 시간 형식. 기본값: auto(OS 환경설정)
agents.defaults.model
model: 문자열("provider/model") 또는 객체({ primary, fallbacks })를 받을 수 있습니다.- 문자열 형식은 primary model만 설정합니다.
- 객체 형식은 primary와 순서가 있는 failover model을 함께 설정합니다.
imageModel: 문자열("provider/model") 또는 객체({ primary, fallbacks })를 받을 수 있습니다.image도구 경로의 vision-model 구성으로 사용됩니다.- 선택된/기본 모델이 image 입력을 받을 수 없을 때 fallback 라우팅에도 사용됩니다.
pdfModel: 문자열("provider/model") 또는 객체({ primary, fallbacks })를 받을 수 있습니다.pdf도구의 모델 라우팅에 사용됩니다.- 생략하면 PDF 도구는
imageModel, 그다음 provider의 best-effort 기본값으로 fallback됩니다.
pdfMaxBytesMb: 호출 시maxBytesMb를 넘기지 않았을 때pdf도구의 기본 PDF 크기 제한pdfMaxPages:pdf도구의 extraction fallback mode에서 고려할 기본 최대 페이지 수model.primary: 형식은provider/model(예:anthropic/claude-opus-4-6)입니다. provider를 생략하면 OpenClaw는anthropic으로 가정합니다(권장되지 않음).models:/model에 사용할 구성된 모델 catalog 및 allowlist입니다. 각 항목에는alias(shortcut)와params(provider별, 예:temperature,maxTokens,cacheRetention,context1m)를 포함할 수 있습니다.params병합 우선순위(config):agents.defaults.models["provider/model"].params가 기반이며, 그 다음agents.list[].params(일치하는 agent id)가 키별로 override합니다.- 이 필드를 변경하는 config writer(예:
/models set,/models set-image, fallback add/remove command)는 가능한 경우 정규 객체 형식으로 저장하고 기존 fallback 목록을 유지합니다. maxConcurrent: 세션 전반에서 병렬 agent 실행 최대 수(각 세션은 여전히 직렬화됨). 기본값: 1
agents.defaults.models에 해당 모델이 있을 때만 적용):
| Alias | Model |
|---|---|
opus | anthropic/claude-opus-4-6 |
sonnet | anthropic/claude-sonnet-4-6 |
gpt | openai/gpt-5.4 |
gpt-mini | openai/gpt-5-mini |
gemini | google/gemini-3.1-pro-preview |
gemini-flash | google/gemini-3-flash-preview |
gemini-flash-lite | google/gemini-3.1-flash-lite-preview |
--thinking off를 설정하거나 agents.defaults.models["zai/<model>"].params.thinking을 직접 정의하지 않는 한 thinking mode를 자동 활성화합니다.
Z.AI 모델은 tool call streaming을 위해 기본적으로 tool_stream을 활성화합니다. 비활성화하려면 agents.defaults.models["zai/<model>"].params.tool_stream을 false로 설정하세요.
Anthropic Claude 4.6 모델은 명시적 thinking level이 없으면 기본적으로 adaptive thinking을 사용합니다.
agents.defaults.cliBackends
text-only fallback 실행용 선택적 CLI backend입니다(tool call 없음). API provider가 실패할 때 백업으로 유용합니다.
- CLI backend는 text-first이며, 도구는 항상 비활성화됩니다.
sessionArg가 설정되어 있으면 session을 지원합니다.imageArg가 파일 경로를 받을 수 있으면 image pass-through도 지원됩니다.
agents.defaults.heartbeat
주기적인 heartbeat 실행입니다.
every: duration string(ms/s/m/h). 기본값:30msuppressToolErrorWarnings: true이면 heartbeat 실행 중 tool error warning payload를 억제합니다.directPolicy: direct/DM 전달 정책.allow(기본값)은 direct-target 전달을 허용합니다.block은 direct-target 전달을 억제하고reason=dm-blocked를 내보냅니다.lightContext: true이면 heartbeat 실행이 경량 bootstrap context를 사용하며 workspace bootstrap 파일 중HEARTBEAT.md만 유지합니다.- agent별:
agents.list[].heartbeat를 설정하세요. 어떤 agent든heartbeat를 정의하면 그 agent들만 heartbeat를 실행합니다. - Heartbeat는 전체 agent turn을 실행하므로 간격이 짧을수록 토큰을 더 많이 소모합니다.
agents.defaults.compaction
mode:default또는safeguard(긴 history를 위한 chunked summarization). Compaction 참고identifierPolicy:strict(기본값),off,custom.strict는 compaction summarization 시 내장된 opaque identifier 보존 가이드를 앞에 붙입니다.identifierInstructions:identifierPolicy=custom일 때 사용할 선택적 사용자 정의 identifier 보존 텍스트postCompactionSections: compaction 후 다시 주입할 AGENTS.md의 선택적 H2/H3 section 이름. 기본값은["Session Startup", "Red Lines"]이며, 비활성화하려면[]로 설정하세요. 설정하지 않았거나 이 기본 쌍으로 명시적으로 설정한 경우, 레거시 fallback으로 오래된Every Session/Safetyheading도 허용됩니다.model: compaction summarization 전용 선택적provider/model-idoverride입니다. 메인 세션은 한 모델을 유지하면서 compaction summary는 다른 모델에서 실행하고 싶을 때 사용하세요. 설정하지 않으면 compaction은 세션의 primary model을 사용합니다.memoryFlush: auto-compaction 전에 durable memory를 저장하는 무음 agentic turn입니다. workspace가 read-only면 건너뜁니다.
agents.defaults.contextPruning
LLM에 보내기 전에 메모리 내 context에서 오래된 tool result를 제거합니다. 디스크에 저장된 session history는 수정하지 않습니다.
cache-ttl mode 동작
cache-ttl mode 동작
mode: "cache-ttl"은 pruning pass를 활성화합니다.ttl은 pruning이 다시 실행될 수 있는 빈도를 제어합니다(마지막 cache touch 이후).- Pruning은 먼저 큰 tool result를 soft-trim하고, 필요하면 더 오래된 tool result를 hard-clear합니다.
...를 넣습니다.Hard-clear는 전체 tool result를 placeholder로 바꿉니다.참고:- Image block은 절대 trim/clear되지 않습니다.
- Ratio는 문자 수 기반(대략적)이지 정확한 token 수가 아닙니다.
keepLastAssistants보다 assistant 메시지가 적으면 pruning을 건너뜁니다.
Block streaming
- Telegram이 아닌 채널에서는 block reply를 활성화하려면 명시적으로
*.blockStreaming: true를 설정해야 합니다. - 채널 override:
channels.<channel>.blockStreamingCoalesce(및 계정별 변형). Signal/Slack/Discord/Google Chat의 기본minChars는1500입니다. humanDelay: block reply 사이의 무작위 대기.natural= 800–2500ms. agent별 override:agents.list[].humanDelay
Typing indicator
- 기본값: direct chat/mention은
instant, mention되지 않은 그룹 채팅은message - session별 override:
session.typingMode,session.typingIntervalSeconds
agents.defaults.sandbox
내장 agent를 위한 선택적 Docker sandboxing입니다. 전체 가이드는 Sandboxing을 참고하세요.
Sandbox 세부사항
Sandbox 세부사항
Workspace access:
none:~/.openclaw/sandboxes아래의 scope별 sandbox workspacero: sandbox workspace는/workspace, agent workspace는/agent에 read-only mountrw: agent workspace를/workspace에 read/write mount
session: 세션별 container + workspaceagent: agent별 container + workspace(기본값)shared: container와 workspace를 공유함(세션 간 격리 없음)
setupCommand**는 container 생성 후 한 번 실행됩니다(sh -lc 사용). network egress, writable root, root user가 필요합니다.Container는 기본적으로 network: "none"입니다. agent가 외부 접근이 필요하면 "bridge"(또는 custom bridge network)로 설정하세요.
"host"는 차단됩니다. "container:<id>"는 기본적으로 차단되며,
명시적으로 sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true를 설정한 경우에만 허용됩니다(break-glass).수신 attachment는 활성 workspace의 media/inbound/*에 staging됩니다.**docker.binds**는 추가 host 디렉터리를 mount합니다. 전역 및 agent별 bind는 병합됩니다.Sandboxed browser(sandbox.browser.enabled): container 안의 Chromium + CDP입니다. noVNC URL이 system prompt에 주입됩니다. openclaw.json에서 browser.enabled가 없어도 됩니다.
noVNC observer access는 기본적으로 VNC auth를 사용하며, OpenClaw는 공유 URL에 비밀번호를 노출하는 대신 짧은 수명의 token URL을 발급합니다.allowHostControl: false(기본값)는 sandboxed session이 host browser를 대상으로 삼는 것을 차단합니다.network기본값은openclaw-sandbox-browser(전용 bridge network)입니다. 전역 bridge 연결이 명시적으로 필요한 경우에만bridge로 설정하세요.cdpSourceRange는 선택적으로 CIDR 범위(예:172.21.0.1/32)로 container 경계에서 CDP ingress를 제한합니다.sandbox.browser.binds는 추가 host 디렉터리를 sandbox browser container에만 mount합니다. 설정되면([]포함) browser container에 대해docker.binds를 대체합니다.- 실행 기본값은
scripts/sandbox-browser-entrypoint.sh에 정의되어 있으며 container host에 맞게 조정되어 있습니다.--remote-debugging-address=127.0.0.1--remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>--user-data-dir=${HOME}/.chrome--no-first-run--no-default-browser-check--disable-3d-apis--disable-gpu--disable-software-rasterizer--disable-dev-shm-usage--disable-background-networking--disable-features=TranslateUI--disable-breakpad--disable-crash-reporter--renderer-process-limit=2--no-zygote--metrics-recording-only--disable-extensions(기본 활성화)--disable-3d-apis,--disable-software-rasterizer,--disable-gpu는 기본적으로 활성화되며, WebGL/3D 사용에 필요하면OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0으로 비활성화할 수 있습니다.OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0은 workflow가 extension에 의존할 때 extension을 다시 활성화합니다.--renderer-process-limit=2는OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>으로 변경할 수 있습니다.0이면 Chromium의 기본 process limit을 사용합니다.noSandbox가 활성화되면--no-sandbox와--disable-setuid-sandbox가 추가됩니다.- 기본값은 container image의 baseline이며, container 기본값을 바꾸려면 사용자 정의 browser image와 custom entrypoint를 사용하세요.
agents.list (agent별 override)
id: 안정적인 agent id(필수)default: 여러 개가 설정되면 첫 번째가 우선합니다(경고 기록). 하나도 설정되지 않으면 목록의 첫 항목이 기본값입니다.model: 문자열 형식은primary만 override하고, 객체 형식{ primary, fallbacks }는 둘 다 override합니다([]는 전역 fallback 비활성화).primary만 override하는 cron job은fallbacks: []를 설정하지 않는 한 여전히 기본 fallback을 상속합니다.params:agents.defaults.models에서 선택된 모델 항목 위에 병합되는 agent별 stream params입니다. 전체 모델 catalog를 복제하지 않고cacheRetention,temperature,maxTokens같은 agent별 override에 사용하세요.runtime: 선택적 agent별 runtime descriptor입니다. agent가 기본적으로 ACP harness session을 사용해야 할 때type: "acp"와runtime.acp기본값(agent,backend,mode,cwd)을 사용하세요.identity.avatar: workspace-relative path,http(s)URL, 또는data:URIidentity는 기본값을 파생합니다.ackReaction은emoji에서,mentionPatterns는name/emoji에서 파생됩니다.subagents.allowAgents:sessions_spawn용 agent id allowlist(["*"]= 아무 agent나, 기본값: 같은 agent만)- Sandbox inheritance guard: 요청한 session이 sandboxed 상태면
sessions_spawn는 unsandboxed로 실행될 target을 거부합니다.
다중 agent 라우팅
하나의 Gateway 안에서 여러 개의 격리된 agent를 실행합니다. Multi-Agent를 참고하세요.Binding match 필드
type(선택 사항): 일반 라우팅용route(type이 없으면 route로 간주), 지속적 ACP 대화 binding용acpmatch.channel(필수)match.accountId(선택 사항,*= 모든 계정, 생략 = 기본 계정)match.peer(선택 사항,{ kind: direct|group|channel, id })match.guildId/match.teamId(선택 사항, 채널별)acp(선택 사항,type: "acp"에만 사용):{ mode, label, cwd, backend }
match.peermatch.guildIdmatch.teamIdmatch.accountId(정확히 일치, peer/guild/team 없음)match.accountId: "*"(채널 전역)- 기본 agent
bindings 항목이 우선합니다.
type: "acp" 항목의 경우 OpenClaw는 정확한 대화 identity(match.channel + account + match.peer.id)로 해석하며, 위의 route binding 단계 순서는 사용하지 않습니다.
Agent별 access profile
전체 접근(샌드박스 없음)
전체 접근(샌드박스 없음)
읽기 전용 도구 + workspace
읽기 전용 도구 + workspace
파일시스템 접근 없음(메시징 전용)
파일시스템 접근 없음(메시징 전용)
Session
Session 필드 세부사항
Session 필드 세부사항
dmScope: DM을 어떻게 그룹화할지main: 모든 DM이 main session을 공유per-peer: 채널 전체에서 발신자 id 기준으로 격리per-channel-peer: 채널 + 발신자별로 격리(다중 사용자 inbox에 권장)per-account-channel-peer: 계정 + 채널 + 발신자별로 격리(다중 계정에 권장)
identityLinks: 채널 간 session 공유를 위해 정규 id를 provider-prefix가 붙은 peer에 매핑reset: 기본 reset 정책.daily는 로컬 시간 기준atHour에 reset하고,idle은idleMinutes후 reset합니다. 둘 다 설정되면 먼저 만료되는 쪽이 우선합니다.resetByType: 유형별 override(direct,group,thread). 레거시dm은direct의 alias로 허용됩니다.parentForkMaxTokens: forked thread session 생성 시 허용되는 부모 sessiontotalTokens최대값(기본값100000)- 부모의
totalTokens가 이 값을 초과하면 OpenClaw는 부모 transcript history를 상속하는 대신 새 thread session을 시작합니다. - 이 guard를 비활성화하고 항상 부모 fork를 허용하려면
0으로 설정하세요.
- 부모의
mainKey: 레거시 필드. 런타임은 이제 main direct-chat bucket에 항상"main"을 사용합니다.sendPolicy:channel,chatType(direct|group|channel, 레거시dmalias 포함),keyPrefix,rawKeyPrefix로 매칭합니다. 첫 번째 deny가 우선합니다.maintenance: session store 정리 + retention 제어mode:warn은 경고만 출력하고,enforce는 실제 정리를 적용합니다.pruneAfter: 오래된 항목의 age cutoff(기본값30d)maxEntries:sessions.json의 최대 항목 수(기본값500)rotateBytes:sessions.json이 이 크기를 넘으면 rotate(기본값10mb)resetArchiveRetention:*.reset.<timestamp>transcript archive의 보관 기간. 기본값은pruneAfter이며, 비활성화하려면false로 설정하세요.maxDiskBytes: session 디렉터리의 선택적 디스크 예산.warn모드에서는 경고를 기록하고,enforce모드에서는 가장 오래된 artifact/session부터 제거합니다.highWaterBytes: 예산 정리 후 목표 크기(선택 사항). 기본값은maxDiskBytes의80%
threadBindings: thread-bound session 기능의 전역 기본값enabled: master 기본 스위치(provider가 override 가능, Discord는channels.discord.threadBindings.enabled사용)idleHours: 비활성 auto-unfocus 시간(시간 단위,0이면 비활성화, provider가 override 가능)maxAgeHours: 하드 최대 수명 시간(시간 단위,0이면 비활성화, provider가 override 가능)
Messages
Response prefix
채널/계정별 override:channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix
해결 순서(가장 구체적인 것이 우선): 계정 → 채널 → 전역. ""는 비활성화하고 cascade를 중단합니다. "auto"는 [{identity.name}]에서 파생됩니다.
Template 변수:
| Variable | 설명 | Example |
|---|---|---|
{model} | 짧은 모델 이름 | claude-opus-4-6 |
{modelFull} | 전체 모델 식별자 | anthropic/claude-opus-4-6 |
{provider} | Provider 이름 | anthropic |
{thinkingLevel} | 현재 thinking level | high, low, off |
{identity.name} | Agent identity 이름 | ("auto"와 동일) |
{think}는 {thinkingLevel}의 alias입니다.
Ack reaction
- 기본값은 활성 agent의
identity.emoji, 없으면"👀"입니다. 비활성화하려면""로 설정하세요. - 채널별 override:
channels.<channel>.ackReaction,channels.<channel>.accounts.<id>.ackReaction - 해결 순서: 계정 → 채널 →
messages.ackReaction→ identity fallback - Scope:
group-mentions(기본값),group-all,direct,all removeAckAfterReply: 응답 후 ack 제거(Slack/Discord/Telegram/Google Chat만)
Inbound debounce
같은 발신자의 빠른 text-only 메시지를 하나의 agent turn으로 묶습니다. Media/attachment는 즉시 flush됩니다. 제어 명령은 debouncing을 우회합니다.TTS (text-to-speech)
auto는 auto-TTS를 제어합니다./tts off|always|inbound|tagged는 세션별 override입니다.summaryModel은 auto-summary에 대해agents.defaults.model.primary를 override합니다.modelOverrides는 기본적으로 활성화되어 있으며,modelOverrides.allowProvider의 기본값은false(opt-in)입니다.- API key fallback:
ELEVENLABS_API_KEY/XI_API_KEY,OPENAI_API_KEY openai.baseUrl은 OpenAI TTS endpoint를 override합니다. 해결 순서는 config, 그다음OPENAI_TTS_BASE_URL, 그다음https://api.openai.com/v1입니다.openai.baseUrl이 OpenAI가 아닌 endpoint를 가리키면 OpenClaw는 이를 OpenAI-compatible TTS server로 간주하고 model/voice validation을 완화합니다.
Talk
Talk mode(macOS/iOS/Android)의 기본값입니다.- Voice ID fallback:
ELEVENLABS_VOICE_ID또는SAG_VOICE_ID apiKey와providers.*.apiKey는 평문 문자열 또는 SecretRef 객체를 받을 수 있습니다.- Talk API key가 구성되지 않았을 때만
ELEVENLABS_API_KEYfallback이 적용됩니다. voiceAliases를 사용하면 Talk directive에서 친숙한 이름을 사용할 수 있습니다.silenceTimeoutMs는 사용자가 조용해진 뒤 transcript를 보내기까지 Talk mode가 기다리는 시간을 제어합니다. 설정하지 않으면 플랫폼 기본 pause window를 유지합니다(macOS와 Android는 700 ms, iOS는 900 ms).
도구
Tool profile
tools.profile은 tools.allow/tools.deny 이전에 기본 allowlist를 설정합니다.
Local onboarding은 설정되지 않은 새 local config에 기본적으로 tools.profile: "coding"을 넣습니다(기존의 명시적 profile은 유지).
| Profile | 포함 내용 |
|---|---|
minimal | session_status만 |
coding | group:fs, group:runtime, group:sessions, group:memory, image |
messaging | group:messaging, sessions_list, sessions_history, sessions_send, session_status |
full | 제한 없음(설정하지 않은 경우와 동일) |
Tool group
| Group | 도구 |
|---|---|
group:runtime | exec, process (bash는 exec의 alias로 허용됨) |
group:fs | read, write, edit, apply_patch |
group:sessions | sessions_list, sessions_history, sessions_send, sessions_spawn, session_status |
group:memory | memory_search, memory_get |
group:web | web_search, web_fetch |
group:ui | browser, canvas |
group:automation | cron, gateway |
group:messaging | message |
group:nodes | nodes |
group:openclaw | 모든 내장 도구(provider plugin 제외) |
tools.allow / tools.deny
전역 tool allow/deny 정책입니다(deny가 우선). 대소문자를 구분하지 않으며 * wildcard를 지원합니다. Docker sandbox가 꺼져 있어도 적용됩니다.
tools.byProvider
특정 provider나 model에 대해 도구를 추가로 제한합니다. 순서: base profile → provider profile → allow/deny
tools.elevated
elevated(host) exec 접근을 제어합니다.
- Agent별 override(
agents.list[].tools.elevated)는 추가로 제한만 할 수 있습니다. /elevated on|off|ask|full은 상태를 세션별로 저장하고, inline directive는 단일 메시지에만 적용됩니다.- Elevated
exec는 host에서 실행되며 sandboxing을 우회합니다.
tools.exec
tools.loopDetection
Tool-loop 안전 검사는 기본적으로 비활성화되어 있습니다. 감지를 활성화하려면 enabled: true를 설정하세요.
설정은 전역 tools.loopDetection에 정의하고, agent별 agents.list[].tools.loopDetection에서 override할 수 있습니다.
historySize: loop 분석용으로 유지할 최대 tool-call historywarningThreshold: 경고를 띄우는 반복 no-progress pattern 임계값criticalThreshold: 치명적 loop를 차단하는 더 높은 반복 임계값globalCircuitBreakerThreshold: 모든 no-progress 실행에 대한 하드 중단 임계값detectors.genericRepeat: 같은 도구/같은 인수 호출 반복 시 경고detectors.knownPollNoProgress: 알려진 poll 도구(process.poll,command_status등)의 no-progress를 경고/차단detectors.pingPong: 번갈아 나타나는 no-progress pair pattern을 경고/차단warningThreshold >= criticalThreshold또는criticalThreshold >= globalCircuitBreakerThreshold이면 validation이 실패합니다.
tools.web
tools.media
수신 media 이해(image/audio/video)를 구성합니다.
Media model entry 필드
Media model entry 필드
Provider entry (
type: "provider" 또는 생략):provider: API provider id(openai,anthropic,google/gemini,groq등)model: model id overrideprofile/preferredProfile:auth-profiles.jsonprofile 선택
type: "cli"):command: 실행할 executableargs: 템플릿화된 인수({{MediaPath}},{{Prompt}},{{MaxChars}}등 지원)
capabilities: 선택적 목록(image,audio,video). 기본값:openai/anthropic/minimax→ image,google→ image+audio+video,groq→ audioprompt,maxChars,maxBytes,timeoutSeconds,language: entry별 override- 실패하면 다음 entry로 fallback
auth-profiles.json → env vars → models.providers.*.apiKeytools.agentToAgent
tools.sessions
세션 도구(sessions_list, sessions_history, sessions_send)가 어떤 세션을 대상으로 할 수 있는지 제어합니다.
기본값: tree(현재 session + 그 세션이 spawn한 session, 예: subagent)
self: 현재 session key만tree: 현재 session + 현재 session이 spawn한 session(subagent)agent: 현재 agent id에 속한 모든 session(같은 agent id 아래에서 per-sender session을 돌리면 다른 사용자도 포함될 수 있음)all: 모든 session. 단, agent 간 대상 지정에는 여전히tools.agentToAgent가 필요합니다.- Sandbox clamp: 현재 session이 sandboxed 상태이고
agents.defaults.sandbox.sessionToolsVisibility="spawned"이면,tools.sessions.visibility="all"이어도 visibility는 강제로tree가 됩니다.
tools.sessions_spawn
sessions_spawn의 inline attachment 지원을 제어합니다.
- Attachment는
runtime: "subagent"에서만 지원됩니다. ACP runtime은 이를 거부합니다. - 파일은
.manifest.json과 함께 child workspace의.openclaw/attachments/<uuid>/에 materialize됩니다. - Attachment 내용은 transcript persistence에서 자동으로 redaction됩니다.
- Base64 입력은 엄격한 alphabet/padding 검사와 decode 전 size guard로 검증됩니다.
- 파일 권한은 디렉터리
0700, 파일0600입니다. - 정리는
cleanup정책을 따릅니다.delete는 항상 attachment를 제거하고,keep은retainOnSessionKeep: true일 때만 유지합니다.
tools.subagents
model: spawn된 sub-agent의 기본 모델. 생략하면 sub-agent는 호출자의 모델을 상속합니다.runTimeoutSeconds: tool call에서runTimeoutSeconds를 생략했을 때sessions_spawn의 기본 timeout(초).0은 timeout 없음.- Subagent별 도구 정책:
tools.subagents.tools.allow/tools.subagents.tools.deny
Custom provider와 base URL
OpenClaw는 pi-coding-agent model catalog를 사용합니다. config의models.providers 또는 ~/.openclaw/agents/<agentId>/agent/models.json을 통해 custom provider를 추가하세요.
- Custom auth가 필요하면
authHeader: true+headers를 사용하세요. - Agent config root는
OPENCLAW_AGENT_DIR(또는PI_CODING_AGENT_DIR)로 override할 수 있습니다. - 일치하는 provider ID에 대한 병합 우선순위:
- agent
models.json의 비어 있지 않은baseUrl값이 우선 - agent의 비어 있지 않은
apiKey값은 현재 config/auth-profile context에서 해당 provider가 SecretRef로 관리되지 않을 때만 우선 - SecretRef로 관리되는 provider
apiKey값은 해석된 secret을 저장하는 대신 source marker(envref는ENV_VAR_NAME,file/execref는secretref-managed)에서 새로 고칩니다. - agent의
apiKey/baseUrl이 비어 있거나 없으면 config의models.providers로 fallback - 일치하는 모델의
contextWindow/maxTokens는 명시적 config와 암묵적 catalog 값 중 더 높은 값을 사용 - config가
models.json을 완전히 다시 쓰게 하려면models.mode: "replace"를 사용하세요.
- agent
Provider 필드 세부사항
models.mode: provider catalog 동작(merge또는replace)models.providers: provider id를 키로 하는 custom provider mapmodels.providers.*.api: request adapter(openai-completions,openai-responses,anthropic-messages,google-generative-ai등)models.providers.*.apiKey: provider credential(SecretRef/env 치환 권장)models.providers.*.auth: auth 전략(api-key,token,oauth,aws-sdk)models.providers.*.injectNumCtxForOpenAICompat: Ollama +openai-completions에 대해 request에options.num_ctx를 주입(기본값:true)models.providers.*.authHeader: 필요할 때 credential을Authorizationheader로 강제 전달models.providers.*.baseUrl: 상위 API base URLmodels.providers.*.headers: proxy/tenant 라우팅용 추가 정적 headermodels.providers.*.models: 명시적 provider model catalog 항목models.providers.*.models.*.compat.supportsDeveloperRole: 선택적 호환성 힌트.api: "openai-completions"에서 비어 있지 않은 non-nativebaseUrl(api.openai.com이 아닌 host)을 쓰면, OpenClaw는 런타임에 이를 강제로false로 설정합니다.baseUrl이 비어 있거나 생략되면 기본 OpenAI 동작을 유지합니다.models.bedrockDiscovery: Bedrock auto-discovery 설정의 루트models.bedrockDiscovery.enabled: discovery polling on/offmodels.bedrockDiscovery.region: discovery용 AWS regionmodels.bedrockDiscovery.providerFilter: 대상 discovery용 선택적 provider-id filtermodels.bedrockDiscovery.refreshInterval: discovery refresh polling 간격models.bedrockDiscovery.defaultContextWindow: 발견된 model의 fallback context windowmodels.bedrockDiscovery.defaultMaxTokens: 발견된 model의 fallback max output token
Provider 예시
Cerebras (GLM 4.6 / 4.7)
Cerebras (GLM 4.6 / 4.7)
cerebras/zai-glm-4.7을, Z.AI direct에는 zai/glm-4.7을 사용하세요.OpenCode Zen
OpenCode Zen
OPENCODE_API_KEY(또는 OPENCODE_ZEN_API_KEY)를 설정하세요. shortcut: openclaw onboard --auth-choice opencode-zenZ.AI (GLM-4.7)
Z.AI (GLM-4.7)
ZAI_API_KEY를 설정하세요. z.ai/*와 z-ai/*는 허용되는 alias입니다. shortcut: openclaw onboard --auth-choice zai-api-key- 일반 endpoint:
https://api.z.ai/api/paas/v4 - 코딩 endpoint(기본값):
https://api.z.ai/api/coding/paas/v4 - 일반 endpoint를 쓰려면 base URL override가 있는 custom provider를 정의하세요.
Moonshot AI (Kimi)
Moonshot AI (Kimi)
baseUrl: "https://api.moonshot.cn/v1" 또는 openclaw onboard --auth-choice moonshot-api-key-cnKimi Coding
Kimi Coding
openclaw onboard --auth-choice kimi-code-api-keySynthetic (Anthropic-compatible)
Synthetic (Anthropic-compatible)
/v1를 포함하지 않아야 합니다(Anthropic client가 이를 추가함). shortcut: openclaw onboard --auth-choice synthetic-api-keyMiniMax M2.5 (direct)
MiniMax M2.5 (direct)
MINIMAX_API_KEY를 설정하세요. shortcut: openclaw onboard --auth-choice minimax-api로컬 모델 (LM Studio)
로컬 모델 (LM Studio)
Local Models를 참고하세요. 요약하면, 제대로 된 하드웨어에서는 LM Studio Responses API를 통해 MiniMax M2.5를 실행하고, fallback을 위해 hosted model은 merge 상태로 유지하세요.
스킬
allowBundled: 번들된 스킬만 대상으로 하는 선택적 allowlist입니다(managed/workspace skill은 영향 없음).entries.<skillKey>.enabled: false는 번들되었거나 설치된 스킬이라도 비활성화합니다.entries.<skillKey>.apiKey: primary env var를 선언하는 스킬을 위한 편의 필드입니다(평문 문자열 또는 SecretRef 객체).
Plugin
~/.openclaw/extensions,<workspace>/.openclaw/extensions,plugins.load.paths에서 로드됩니다.- Config 변경에는 gateway 재시작이 필요합니다.
allow: 선택적 allowlist(목록에 있는 plugin만 로드).deny가 우선합니다.plugins.entries.<id>.apiKey: plugin 수준 API key 편의 필드(plugin이 지원하는 경우)plugins.entries.<id>.env: plugin 범위 env var mapplugins.entries.<id>.hooks.allowPromptInjection:false이면 core가before_prompt_build를 차단하고, legacybefore_agent_start의 prompt 변경 필드를 무시합니다. 단, legacymodelOverride와providerOverride는 유지합니다.plugins.entries.<id>.config: plugin이 정의한 config 객체(plugin schema로 검증됨)plugins.slots.memory: 활성 memory plugin id를 선택하거나, memory plugin을 비활성화하려면"none"plugins.slots.contextEngine: 활성 context engine plugin id를 선택합니다. 다른 engine을 설치하고 선택하지 않으면 기본값은"legacy"입니다.plugins.installs:openclaw plugins update가 사용하는 CLI 관리 설치 메타데이터source,spec,sourcePath,installPath,version,resolvedName,resolvedVersion,resolvedSpec,integrity,shasum,resolvedAt,installedAt를 포함합니다.plugins.installs.*는 관리되는 상태로 취급하고, 수동 편집보다 CLI 명령을 선호하세요.
Browser
evaluateEnabled: false는act:evaluate와wait --fn을 비활성화합니다.ssrfPolicy.dangerouslyAllowPrivateNetwork는 설정하지 않았을 때 기본적으로true입니다(trusted-network model).- 엄격한 public-only browser navigation이 필요하면
ssrfPolicy.dangerouslyAllowPrivateNetwork: false로 설정하세요. ssrfPolicy.allowPrivateNetwork도 레거시 alias로 계속 지원됩니다.- strict mode에서는 명시적 예외를 위해
ssrfPolicy.hostnameAllowlist와ssrfPolicy.allowedHostnames를 사용하세요. - Remote profile은 attach-only입니다(start/stop/reset 비활성).
- Auto-detect 순서: 기본 browser가 Chromium 기반이면 그 browser → Chrome → Brave → Edge → Chromium → Chrome Canary
- Control service: loopback 전용(port는
gateway.port에서 파생, 기본값18791) extraArgs는 local Chromium 시작 시 추가 launch flag를 붙입니다(예:--disable-gpu, window 크기 조정, debug flag 등).relayBindHost는 Chrome extension relay가 어디에서 listen할지 변경합니다. loopback 전용 접근이라면 설정하지 마세요. relay가 namespace 경계를 넘어야 하는 경우(예: WSL2)이고 host network가 이미 신뢰되는 경우에만0.0.0.0같은 명시적 non-loopback bind address를 설정하세요.
UI
seamColor: native app UI chrome(Talk Mode bubble tint 등)의 accent colorassistant: Control UI identity override. 활성 agent identity로 fallback됩니다.
Gateway
Gateway 필드 세부사항
Gateway 필드 세부사항
mode:local(gateway 실행) 또는remote(remote gateway에 연결). Gateway는local이 아니면 시작을 거부합니다.port: WS + HTTP를 위한 단일 multiplexed port. 우선순위:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789bind:auto,loopback(기본값),lan(0.0.0.0),tailnet(Tailscale IP만),custom- 레거시 bind alias:
gateway.bind에는 host alias(0.0.0.0,127.0.0.1,localhost,::,::1)가 아니라 bind mode 값(auto,loopback,lan,tailnet,custom)을 사용하세요. - Docker 참고: 기본
loopbackbind는 container 내부의127.0.0.1에서 listen합니다. Docker bridge networking(-p 18789:18789)에서는 트래픽이eth0로 들어오므로 gateway에 도달할 수 없습니다.--network host를 사용하거나, 모든 인터페이스에서 listen하도록bind: "lan"(또는bind: "custom"+customBindHost: "0.0.0.0")을 설정하세요. - Auth: 기본적으로 필요합니다. loopback이 아닌 bind에는 공유 token/password가 필요합니다. onboarding wizard는 기본적으로 token을 생성합니다.
gateway.auth.token과gateway.auth.password가 모두 구성되어 있으면(SecretRef 포함),gateway.auth.mode를token또는password로 명시적으로 설정하세요. 둘 다 구성되어 있고 mode가 설정되지 않으면 startup과 service install/repair 흐름이 실패합니다.gateway.auth.mode: "none": 명시적 no-auth mode입니다. 신뢰할 수 있는 local loopback 환경에서만 사용하세요. onboarding prompt에서는 의도적으로 제공되지 않습니다.gateway.auth.mode: "trusted-proxy": identity-aware reverse proxy에 auth를 위임하고gateway.trustedProxies의 identity header를 신뢰합니다(Trusted Proxy Auth 참고).gateway.auth.allowTailscale:true이면 Tailscale Serve identity header가 Control UI/WebSocket auth를 만족할 수 있습니다(tailscale whois로 검증). HTTP API endpoint는 여전히 token/password auth가 필요합니다. 이 token 없는 흐름은 gateway host가 신뢰된다고 가정합니다.tailscale.mode = "serve"이면 기본값은true입니다.gateway.auth.rateLimit: 선택적 failed-auth limiter입니다. client IP별, auth scope별(shared-secret와 device-token은 독립 추적)로 적용됩니다. 차단된 시도에는429+Retry-After가 반환됩니다.gateway.auth.rateLimit.exemptLoopback의 기본값은true입니다. 테스트 환경이나 엄격한 proxy 배포처럼 localhost 트래픽도 rate-limit하고 싶다면false로 설정하세요.
- Browser-origin WS auth 시도는 loopback exemption을 비활성화한 상태로 항상 throttling됩니다(browser 기반 localhost brute force에 대한 defense-in-depth).
tailscale.mode:serve(tailnet 전용, loopback bind) 또는funnel(공개, auth 필요)controlUi.allowedOrigins: Gateway WebSocket 연결을 위한 명시적 browser-origin allowlist입니다. browser client가 non-loopback origin에서 들어오는 경우 필요합니다.controlUi.dangerouslyAllowHostHeaderOriginFallback: Host-header origin 정책에 의도적으로 의존하는 배포를 위해 Host-header origin fallback을 활성화하는 위험한 mode입니다.remote.transport:ssh(기본값) 또는direct(ws/wss).direct의 경우remote.url은ws://또는wss://여야 합니다.OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: 신뢰되는 private-network IP에 대해 평문ws://를 허용하는 client 측 break-glass override입니다. 기본값은 여전히 loopback 전용 평문 허용입니다.gateway.remote.token/.password는 remote-client credential 필드입니다. 이것만으로 gateway auth를 구성하지는 않습니다.- Local gateway call path는
gateway.auth.*가 설정되지 않았을 때gateway.remote.*를 fallback으로 사용할 수 있습니다. trustedProxies: TLS를 종료하는 reverse proxy의 IP입니다. 자신이 제어하는 proxy만 나열하세요.allowRealIpFallback:true이면X-Forwarded-For가 없을 때X-Real-IP를 허용합니다. fail-closed 동작을 위해 기본값은false입니다.gateway.tools.deny: HTTPPOST /tools/invoke에 대해 추가로 차단할 tool 이름(기본 deny 목록 확장)gateway.tools.allow: 기본 HTTP deny 목록에서 tool 이름 제거
OpenAI-compatible endpoint
- Chat Completions: 기본적으로 비활성화되어 있습니다.
gateway.http.endpoints.chatCompletions.enabled: true로 활성화하세요. - Responses API:
gateway.http.endpoints.responses.enabled - Responses URL-input hardening:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlist
- 선택적 응답 hardening header:
gateway.http.securityHeaders.strictTransportSecurity(사용자가 제어하는 HTTPS origin에만 설정, Trusted Proxy Auth 참고)
다중 인스턴스 격리
서로 다른 port와 state dir로 한 host에서 여러 gateway를 실행합니다.--dev(~/.openclaw-dev + port 19001 사용), --profile <name>(~/.openclaw-<name> 사용)
Multiple Gateways를 참고하세요.
Hook
Authorization: Bearer <token> 또는 x-openclaw-token: <token>
Endpoint:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }- request payload의
sessionKey는hooks.allowRequestSessionKey=true일 때만 허용됩니다(기본값:false).
- request payload의
POST /hooks/<name>→hooks.mappings를 통해 해석됨
Mapping 세부사항
Mapping 세부사항
match.path는/hooks뒤의 하위 경로와 매칭됩니다(예:/hooks/gmail→gmail).match.source는 generic path를 위한 payload field와 매칭됩니다.{{messages[0].subject}}같은 template는 payload에서 읽습니다.transform은 hook action을 반환하는 JS/TS module을 가리킬 수 있습니다.transform.module은 상대 경로여야 하며hooks.transformsDir안에 머물러야 합니다(절대 경로와 traversal은 거부됨).
agentId는 특정 agent로 라우팅하며, 알 수 없는 ID는 기본값으로 fallback됩니다.allowedAgentIds: 명시적 라우팅을 제한합니다(*또는 생략 = 모두 허용,[]= 모두 거부).defaultSessionKey: 명시적sessionKey가 없는 hook agent 실행에 대한 선택적 고정 session keyallowRequestSessionKey:/hooks/agent호출자가sessionKey를 설정하도록 허용(기본값:false)allowedSessionKeyPrefixes: 명시적sessionKey값(request + mapping)에 대한 선택적 prefix allowlist, 예:["hook:"]deliver: true는 최종 응답을 채널로 전송하며,channel의 기본값은last입니다.model은 이 hook 실행의 LLM을 override합니다(모델 catalog가 설정되어 있으면 허용된 모델이어야 함).
Gmail 통합
- 구성되면 Gateway는 부팅 시
gog gmail watch serve를 자동 시작합니다. 비활성화하려면OPENCLAW_SKIP_GMAIL_WATCHER=1을 설정하세요. - Gateway와 별도로
gog gmail watch serve를 함께 실행하지 마세요.
Canvas host
- Agent가 수정 가능한 HTML/CSS/JS와 A2UI를 Gateway port 아래 HTTP로 제공합니다.
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- Local-only:
gateway.bind: "loopback"(기본값)을 유지하세요. - Non-loopback bind: canvas route는 다른 Gateway HTTP surface와 동일하게 Gateway auth(token/password/trusted-proxy)가 필요합니다.
- Node WebView는 일반적으로 auth header를 보내지 않습니다. node가 pairing되고 연결되면 Gateway는 canvas/A2UI 접근을 위한 node 범위 capability URL을 광고합니다.
- Capability URL은 활성 node WS session에 바인딩되며 빠르게 만료됩니다. IP 기반 fallback은 사용되지 않습니다.
- 제공되는 HTML에 live-reload client를 주입합니다.
- 비어 있으면 시작용
index.html을 자동 생성합니다. - A2UI도
/__openclaw__/a2ui/에서 제공합니다. - 변경 사항에는 gateway 재시작이 필요합니다.
- 디렉터리가 크거나
EMFILE오류가 발생하면 live reload를 비활성화하세요.
Discovery
mDNS (Bonjour)
minimal(기본값): TXT record에서cliPath+sshPort를 생략full:cliPath+sshPort포함- Hostname 기본값은
openclaw입니다.OPENCLAW_MDNS_HOSTNAME으로 override하세요.
Wide-area (DNS-SD)
~/.openclaw/dns/ 아래에 unicast DNS-SD zone을 씁니다. 네트워크 간 discovery를 위해 DNS server(CoreDNS 권장) + Tailscale split DNS와 함께 사용하세요.
설정: openclaw dns setup --apply
Environment
env (inline env var)
- Inline env var는 process env에 해당 키가 없을 때만 적용됩니다.
.env파일: CWD.env+~/.openclaw/.env(둘 다 기존 var를 override하지 않음)shellEnv: login shell profile에서 누락된 예상 키를 가져옵니다.- 전체 우선순위는 Environment를 참고하세요.
Env var 치환
모든 config 문자열에서${VAR_NAME}으로 env var를 참조할 수 있습니다.
- 일치하는 것은 대문자 이름만입니다:
[A-Z_][A-Z0-9_]* - var가 없거나 비어 있으면 config load 시 오류가 발생합니다.
- 리터럴
${VAR}가 필요하면$${VAR}로 escape하세요. $include와 함께 사용할 수 있습니다.
Secret
Secret ref는 additive입니다. 평문 값도 계속 동작합니다.SecretRef
다음 객체 형태 중 하나를 사용하세요.
provider패턴:^[a-z][a-z0-9_-]{0,63}$source: "env"id 패턴:^[A-Z][A-Z0-9_]{0,127}$source: "file"id: 절대 JSON pointer(예:"/providers/openai/apiKey")source: "exec"id 패턴:^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
지원되는 credential surface
- 정규 매트릭스: SecretRef Credential Surface
secrets apply는 지원되는openclaw.jsoncredential path를 대상으로 합니다.auth-profiles.jsonref도 런타임 해석과 audit 범위에 포함됩니다.
Secret provider 구성
fileprovider는mode: "json"과mode: "singleValue"를 지원합니다(singleValuemode에서는id가"value"여야 함).execprovider는 절대command경로가 필요하며 stdin/stdout의 protocol payload를 사용합니다.- 기본적으로 symlink command path는 거부됩니다. symlink path를 허용하면서 해석된 target path를 검증하려면
allowSymlinkCommand: true를 설정하세요. trustedDirs가 구성된 경우 trusted-dir 검사는 해석된 target path에 적용됩니다.execchild environment는 기본적으로 최소 구성입니다. 필요한 변수는passEnv로 명시적으로 전달하세요.- Secret ref는 activation 시 메모리 내 snapshot으로 해석되며, 이후 request path는 그 snapshot만 읽습니다.
- Active-surface filtering은 activation 중에 적용됩니다. 활성 surface의 해석되지 않은 ref는 startup/reload를 실패시키고, 비활성 surface는 diagnostic과 함께 건너뜁니다.
Auth 저장소
- Agent별 profile은
<agentDir>/auth-profiles.json에 저장됩니다. auth-profiles.json은 값 수준 ref(api_key용keyRef,token용tokenRef)를 지원합니다.- 정적 런타임 credential은 메모리 내 해석 snapshot에서 오며, 레거시 정적
auth.json항목은 발견되면 제거됩니다. - 레거시 OAuth는
~/.openclaw/credentials/oauth.json에서 import합니다. - OAuth 참고
- Secret 런타임 동작과
audit/configure/apply도구: Secrets Management
Logging
- 기본 log file:
/tmp/openclaw/openclaw-YYYY-MM-DD.log - 안정적인 path를 원하면
logging.file을 설정하세요. consoleLevel은--verbose일 때debug로 올라갑니다.
CLI
cli.banner.taglineMode는 banner tagline 스타일을 제어합니다."random"(기본값): 순환하는 재미있는/계절성 tagline"default": 고정된 중립 tagline(All your chats, one OpenClaw.)"off": tagline 텍스트 없음(banner title/version은 계속 표시)
- 전체 banner를 숨기려면(tagline만이 아니라) env
OPENCLAW_HIDE_BANNER=1을 설정하세요.
Wizard
CLI wizard(onboard, configure, doctor)가 쓰는 메타데이터:
Identity
messages.ackReaction은identity.emoji에서 파생(없으면 👀)mentionPatterns는identity.name/identity.emoji에서 파생avatar는 다음을 받을 수 있습니다: workspace-relative path,http(s)URL,data:URI
Bridge (legacy, 제거됨)
현재 빌드에는 TCP bridge가 더 이상 포함되지 않습니다. Node는 Gateway WebSocket을 통해 연결됩니다.bridge.* 키는 더 이상 config schema의 일부가 아니며(제거 전까지 validation 실패), openclaw doctor --fix가 알 수 없는 키를 제거할 수 있습니다.
레거시 bridge config(역사적 참고)
레거시 bridge config(역사적 참고)
Cron
sessionRetention: 완료된 격리 cron 실행 세션을sessions.json에서 제거하기 전까지 유지하는 시간입니다. 보관된 삭제 cron transcript 정리도 함께 제어합니다. 기본값:24h; 비활성화하려면falserunLog.maxBytes: pruning 전 실행 log file(cron/runs/<jobId>.jsonl)당 최대 크기. 기본값:2_000_000bytesrunLog.keepLines: run-log pruning이 트리거될 때 유지할 최신 줄 수. 기본값:2000webhookToken: cron webhook POST 전달(delivery.mode = "webhook")에 사용할 bearer token입니다. 생략하면 auth header를 보내지 않습니다.webhook: 저장된 job 중 여전히notify: true인 항목에만 사용하는 deprecated legacy fallback webhook URL(http/https)
Media model template 변수
tools.media.models[].args에서 확장되는 template placeholder:
| Variable | 설명 |
|---|---|
{{Body}} | 전체 수신 메시지 본문 |
{{RawBody}} | 원시 본문(history/sender wrapper 없음) |
{{BodyStripped}} | 그룹 mention을 제거한 본문 |
{{From}} | 발신자 식별자 |
{{To}} | 수신 대상 식별자 |
{{MessageSid}} | 채널 메시지 id |
{{SessionId}} | 현재 session UUID |
{{IsNewSession}} | 새 session이 생성되면 "true" |
{{MediaUrl}} | 수신 media pseudo-URL |
{{MediaPath}} | 로컬 media path |
{{MediaType}} | Media type(image/audio/document/…) |
{{Transcript}} | Audio transcript |
{{Prompt}} | CLI entry에 대해 해석된 media prompt |
{{MaxChars}} | CLI entry에 대해 해석된 최대 출력 문자 수 |
{{ChatType}} | "direct" 또는 "group" |
{{GroupSubject}} | 그룹 제목(best effort) |
{{GroupMembers}} | 그룹 멤버 미리보기(best effort) |
{{SenderName}} | 발신자 표시 이름(best effort) |
{{SenderE164}} | 발신자 전화번호(best effort) |
{{Provider}} | Provider 힌트(whatsapp, telegram, discord 등) |
Config include ($include)
config를 여러 파일로 분할합니다.
- 단일 파일: 포함하는 객체를 대체합니다.
- 파일 배열: 순서대로 deep-merge됩니다(뒤에 오는 값이 앞 값을 override).
- 형제 키: include 뒤에 병합되며(include된 값을 override)
- 중첩 include: 최대 10단계까지
- 경로: 포함하는 파일 기준으로 해석되지만, 최상위 config 디렉터리(
openclaw.json의dirname) 안에 머물러야 합니다. 절대 경로나../형태도 최종적으로 그 경계 안에 해석되면 허용됩니다. - 오류: 누락된 파일, parse 오류, 순환 include에 대해 명확한 메시지를 제공합니다.
관련 문서: Configuration · Configuration Examples · Doctor