chore(i18n): refresh ko translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-08 06:01:04 +00:00
parent 4cc4b995ed
commit 9e34a524b0
13 changed files with 2229 additions and 1844 deletions

View File

@ -4,27 +4,27 @@ read_when:
summary: Slack 설정 및 런타임 동작(Socket Mode + HTTP Request URL)
title: Slack
x-i18n:
generated_at: "2026-04-07T05:56:20Z"
generated_at: "2026-04-08T05:56:46Z"
model: gpt-5.4
provider: openai
source_hash: 2b8fd2cc6c638ee82069f0af2c2b6f6f49c87da709b941433a0343724a9907ea
source_hash: cad132131ddce688517def7c14703ad314441c67aacc4cc2a2a721e1d1c01942
source_path: channels/slack.md
workflow: 15
---
# Slack
상태: Slack 앱 통합을 통한 DM + 채널용 프로덕션 준비 완료. 기본 모드는 Socket Mode이며, HTTP Request URL도 지원됩니다.
상태: Slack 앱 통합을 통한 DM 및 채널에서 프로덕션 사용 가능. 기본 모드는 Socket Mode이며, HTTP Request URL도 지원됩니다.
<CardGroup cols={3}>
<Card title="페어링" icon="link" href="/ko/channels/pairing">
Slack DM은 기본적으로 페어링 모드니다.
Slack DM은 기본적으로 페어링 모드를 사용합니다.
</Card>
<Card title="슬래시 명령어" icon="terminal" href="/ko/tools/slash-commands">
기본 명령 동작 및 명령 카탈로그.
네이티브 명령 동작 및 명령 카탈로그.
</Card>
<Card title="채널 문제 해결" icon="wrench" href="/ko/channels/troubleshooting">
채널 전반 진단 및 복구 플레이북.
채널 전반 진단 및 복구 플레이북.
</Card>
</CardGroup>
@ -38,8 +38,8 @@ x-i18n:
- **from a manifest**를 선택하고 앱용 워크스페이스를 선택합니다
- 아래의 [예시 매니페스트](#manifest-and-scope-checklist)를 붙여넣고 계속 진행하여 생성합니다
- `connections:write`가 포함된 **App-Level Token**(`xapp-...`)을 생성합니다
- 앱을 설치하고 표시 **Bot Token**(`xoxb-...`)을 복사합니다
- `connections:write` 권한이 있는 **App-Level Token**(`xapp-...`)을 생성합니다
- 앱을 설치하고 표시되는 **Bot Token**(`xoxb-...`)을 복사합니다
</Step>
<Step title="OpenClaw 구성">
@ -66,7 +66,7 @@ SLACK_BOT_TOKEN=xoxb-...
</Step>
<Step title="게이트웨이 시작">
<Step title="gateway 시작">
```bash
openclaw gateway
@ -85,7 +85,7 @@ openclaw gateway
- **from a manifest**를 선택하고 앱용 워크스페이스를 선택합니다
- [예시 매니페스트](#manifest-and-scope-checklist)를 붙여넣고 생성 전에 URL을 업데이트합니다
- 요청 검증용 **Signing Secret**을 저장합니다
- 앱을 설치하고 표시 **Bot Token**(`xoxb-...`)을 복사합니다
- 앱을 설치하고 표시되는 **Bot Token**(`xoxb-...`)을 복사합니다
</Step>
@ -106,14 +106,14 @@ openclaw gateway
```
<Note>
멀티 계정 HTTP에는 고유한 webhook 경로를 사용하세요
멀티 계정 HTTP에는 고유한 웹훅 경로를 사용하세요
등록이 충돌하지 않도록 각 계정에 서로 다른 `webhookPath`(기본값 `/slack/events`)를 지정하세요.
각 계정에 서로 다른 `webhookPath`(기본값 `/slack/events`)를 지정하여 등록이 충돌하지 않도록 하세요.
</Note>
</Step>
<Step title="게이트웨이 시작">
<Step title="gateway 시작">
```bash
openclaw gateway
@ -293,11 +293,11 @@ openclaw gateway
<Accordion title="선택적 작성자 스코프(쓰기 작업)">
발신 메시지가 기본 Slack 앱 ID 대신 활성 에이전트 ID(사용자 지정 사용자 이름 및 아이콘)를 사용하도록 하려면 `chat:write.customize` 봇 스코프를 추가하세요.
이모지 아이콘을 사용하는 경우 Slack은 `:emoji_name:`을 기대합니다.
이모지 아이콘을 사용하는 경우 Slack은 `:emoji_name:` 문을 기대합니다.
</Accordion>
<Accordion title="선택적 사용자 토큰 스코프(읽기 작업)">
`channels.slack.userToken`을 구성하는 경우 일반적인 읽기 스코프는 다음과 같습니다:
<Accordion title="선택적 user-token 스코프(읽기 작업)">
`channels.slack.userToken`을 구성하는 경우, 일반적인 읽기 스코프는 다음과 같습니다:
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
@ -315,8 +315,8 @@ openclaw gateway
- Socket Mode에는 `botToken` + `appToken`이 필요합니다.
- HTTP 모드에는 `botToken` + `signingSecret`이 필요합니다.
- `botToken`, `appToken`, `signingSecret`, `userToken`은 일반 텍스트
문자열 또는 SecretRef 객체를 허용합니다.
- 구성 토큰 환경 변수 대체값보다 우선합니다.
문자열 또는 SecretRef 객체를 받을 수 있습니다.
- 구성 토큰 환경 변수 대체값보다 우선합니다.
- `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` 환경 변수 대체값은 기본 계정에만 적용됩니다.
- `userToken`(`xoxp-...`)은 구성 전용이며(환경 변수 대체값 없음), 기본값은 읽기 전용 동작(`userTokenReadOnly: true`)입니다.
@ -326,22 +326,22 @@ openclaw gateway
필드(`botToken`, `appToken`, `signingSecret`, `userToken`)를 추적합니다.
- 상태는 `available`, `configured_unavailable`, `missing`입니다.
- `configured_unavailable`은 계정이 SecretRef
또는 다른 비인라인 시크릿 소스를 통해 구성되었지만, 현재 명령/런타임 경로에서
실제 값을 확인할 수 없었다는 뜻입니다.
또는 다른 비인라인 비밀 소스를 통해 구성되었지만, 현재 명령/런타임 경로에서
실제 값을 확인할 수 없었음을 의미합니다.
- HTTP 모드에서는 `signingSecretStatus`가 포함되며, Socket Mode에서는
필요한 쌍이 `botTokenStatus` + `appTokenStatus`입니다.
<Tip>
작업/디렉터리 읽기에서는 구성된 경우 사용자 토큰이 우선될 수 있습니다. 쓰기에서는 봇 토큰이 계속 우선이며, 사용자 토큰 쓰기는 `userTokenReadOnly: false`이고 봇 토큰을 사용할 수 없는 경우에만 허용됩니다.
작업/디렉터리 읽기에서는 구성된 경우 user token이 우선될 수 있습니다. 쓰기에서는 bot token이 계속 우선이며, user-token 쓰기는 `userTokenReadOnly: false`이고 bot token을 사용할 수 없을 때만 허용됩니다.
</Tip>
## 작업 및 게이트
Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
현재 Slack 도구에서 사용 가능한 작업 그룹:
현재 Slack 도구에서 사용할 수 있는 작업 그룹:
| 그룹 | 기본값 |
| 그룹 | 기본값 |
| ---------- | ------- |
| messages | 활성화됨 |
| reactions | 활성화됨 |
@ -359,7 +359,7 @@ Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
- `pairing` (기본값)
- `allowlist`
- `open` (`channels.slack.allowFrom`에 `"*"`가 포함되어야 함, 레거시: `channels.slack.dm.allowFrom`)
- `open` (`channels.slack.allowFrom`에 `"*"`가 포함되어야 함; 레거시: `channels.slack.dm.allowFrom`)
- `disabled`
DM 플래그:
@ -373,15 +373,15 @@ Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
멀티 계정 우선순위:
- `channels.slack.accounts.default.allowFrom``default` 계정에만 적용됩니다.
- 이름 있는 계정은 자체 `allowFrom`이 설정되지 않은 경우 `channels.slack.allowFrom`을 상속합니다.
- 이름 있는 계정은 `channels.slack.accounts.default.allowFrom`을 상속하지 않습니다.
- 이름 있는 계정은 자체 `allowFrom`이 설정되지 않은 경우 `channels.slack.allowFrom`을 상속합니다.
- 이름 있는 계정은 `channels.slack.accounts.default.allowFrom`을 상속하지 않습니다.
DM에서의 페어링은 `openclaw pairing approve slack <code>`를 사용합니다.
DM의 페어링에는 `openclaw pairing approve slack <code>`를 사용합니다.
</Tab>
<Tab title="채널 정책">
`channels.slack.groupPolicy`는 채널 처리 방식을 제어합니다:
`channels.slack.groupPolicy`는 채널 처리 제어합니다:
- `open`
- `allowlist`
@ -389,13 +389,13 @@ Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
채널 허용 목록은 `channels.slack.channels` 아래에 있으며 안정적인 채널 ID를 사용해야 합니다.
런타임 참고: `channels.slack`이 완전히 없으면(환경 변수 전용 설정), 런타임은 `groupPolicy="allowlist"`로 대체고 경고를 기록합니다(`channels.defaults.groupPolicy`가 설정되어 있어도 마찬가지).
런타임 참고: `channels.slack`이 완전히 없으면(환경 변수 전용 설정), 런타임은 `groupPolicy="allowlist"`로 대체고 경고를 기록합니다(`channels.defaults.groupPolicy`가 설정되어 있어도 마찬가지).
이름/ID 확인:
- 채널 허용 목록 항목과 DM 허용 목록 항목은 토큰 액세스가 허용되면 시작 시 확인됩니다
- 확인되지 않은 채널 이름 항목은 구성된 그대로 유지되지만 기본적으로 라우팅에서 무시됩니다
- 인바운드 인증 및 채널 라우팅은 기본적으로 ID 우선이며, 직접 사용자 이름/슬러그 일치`channels.slack.dangerouslyAllowNameMatching: true`가 필요합니다
- 확인되지 않은 채널 이름 항목은 구성된 상태로 유지되지만 기본적으로 라우팅에서 무시됩니다
- 인바운드 인증 및 채널 라우팅은 기본적으로 ID 우선이며, 직접 사용자 이름/슬러그 매칭에`channels.slack.dangerouslyAllowNameMatching: true`가 필요합니다
</Tab>
@ -404,11 +404,11 @@ Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
멘션 소스:
- 명시적 앱 멘션(`<_@botId>`이 아니라 `<@botId>`)
- 멘션 정규식 패턴(`agents.list[].groupChat.mentionPatterns`, 대체값 `messages.groupChat.mentionPatterns`)
- 봇에게 답글을 단 스레드의 암시적 동작(`thread.requireExplicitMention`이 `true`이면 비활성화)
- 명시적 앱 멘션 (`<@botId>`)
- 멘션 정규식 패턴 (`agents.list[].groupChat.mentionPatterns`, 대체값 `messages.groupChat.mentionPatterns`)
- 암묵적인 bot 답글 스레드 동작 (`thread.requireExplicitMention`이 `true`이면 비활성화)
채널별 제어(`channels.slack.channels.<id>`; 이름은 시작 시 확인 또는 `dangerouslyAllowNameMatching`을 통해서만 사용):
채널별 제어(`channels.slack.channels.<id>`; 이름은 시작 시 확인 또는 `dangerouslyAllowNameMatching`을 통해서만 가능):
- `requireMention`
- `users` (허용 목록)
@ -417,25 +417,25 @@ Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
- `systemPrompt`
- `tools`, `toolsBySender`
- `toolsBySender` 키 형식: `id:`, `e164:`, `username:`, `name:`, 또는 `"*"` 와일드카드
(레거시 접두사 없는 키 여전히 `id:`에만 매핑됨)
(레거시 접두사 없는 키 여전히 `id:`에만 매핑됨)
</Tab>
</Tabs>
## 스레딩, 세션 답글 태그
## 스레딩, 세션, 답글 태그
- DM은 `direct`로, 채널은 `channel`로, MPIM은 `group`으로 라우팅됩니다.
- 기본 `session.dmScope=main`에서는 Slack DM이 에이전트 기본 세션으로 합쳐집니다.
- 기본 `session.dmScope=main`에서는 Slack DM이 에이전트 메인 세션으로 통합됩니다.
- 채널 세션: `agent:<agentId>:slack:channel:<channelId>`.
- 스레드 답글은 해당는 경우 스레드 세션 접미사(`:thread:<threadTs>`)를 만들 수 있습니다.
- `channels.slack.thread.historyScope` 기본값은 `thread`이며 `thread.inheritParent` 기본값은 `false`입니다.
- `channels.slack.thread.initialHistoryLimit`는 새 스레드 세션이 시작될 때 가져오는 기존 스레드 메시지 수를 제어합니다(기본값 `20`, 비활성화하려면 `0`으로 설정).
- `channels.slack.thread.requireExplicitMention`(기본값 `false`): `true`이면 암시적 스레드 멘션을 억제하므로 봇이 이미 스레드에 참여했더라도 스레드 내부의 명시적 `@bot` 멘션에만 응답합니다. 이 설정이 없으면 봇이 참여한 스레드의 답글은 `requireMention` 게이트를 우회합니다.
- 스레드 답글은 해당는 경우 스레드 세션 접미사(`:thread:<threadTs>`)를 만들 수 있습니다.
- `channels.slack.thread.historyScope` 기본값은 `thread`이며, `thread.inheritParent` 기본값은 `false`입니다.
- `channels.slack.thread.initialHistoryLimit`은 새 스레드 세션이 시작될 때 가져올 기존 스레드 메시지 수를 제어합니다(기본값 `20`; 비활성화하려면 `0` 설정).
- `channels.slack.thread.requireExplicitMention`(기본값 `false`): `true`이면 암묵적인 스레드 멘션을 억제하므로, bot이 이미 스레드에 참여했더라도 스레드 안의 명시적 `@bot` 멘션에만 응답합니다. 이 설정이 없으면 bot이 참여한 스레드의 답글은 `requireMention` 게이트를 우회합니다.
답글 스레딩 제어:
- `channels.slack.replyToMode`: `off|first|all|batched` (기본값 `off`)
- `channels.slack.replyToModeByChatType`: `direct|group|channel` 설정
- `channels.slack.replyToModeByChatType`: `direct|group|channel`
- direct 채팅용 레거시 대체값: `channels.slack.dm.replyToMode`
수동 답글 태그가 지원됩니다:
@ -443,47 +443,51 @@ Slack 작업은 `channels.slack.actions.*`로 제어됩니다.
- `[[reply_to_current]]`
- `[[reply_to:<id>]]`
참고: `replyToMode="off"`는 명시적 `[[reply_to_*]]` 태그를 포함 Slack의 **모든** 답글 스레딩을 비활성화합니다. 이는 `"off"` 모드에서도 명시적 태그가 계속 존중되는 Telegram과 다릅니다. 이 차이는 플랫폼의 스레딩 모델을 반영합니다. Slack 스레드는 메시지를 채널에서 숨기지만, Telegram 답글은 기본 채팅 흐름에서 계속 보입니다.
참고: `replyToMode="off"`는 명시적 `[[reply_to_*]]` 태그를 포함 Slack의 **모든** 답글 스레딩을 비활성화합니다. 이는 `"off"` 모드에서도 명시적 태그가 계속 적용되는 Telegram과 다릅니다. 이 차이는 플랫폼별 스레딩 모델을 반영합니다. Slack 스레드는 메시지를 채널에서 숨기지만, Telegram 답글은 메인 채팅 흐름에서 계속 표시됩니다.
## 확인 반응
`ackReaction`은 OpenClaw가 인바운드 메시지를 처리하는 동안 확인 이모지를 보냅니다.
`ackReaction`은 OpenClaw가 인바운드 메시지를 처리하는 동안 확인 이모지를 보냅니다.
확인 순서:
- `channels.slack.accounts.<accountId>.ackReaction`
- `channels.slack.ackReaction`
- `messages.ackReaction`
- 에이전트 ID 이모지 대체값(`agents.list[].identity.emoji`, 없으면 `"👀"`)
- 에이전트 ID 이모지 대체값 (`agents.list[].identity.emoji`, 없으면 `"👀"`)
참고:
- Slack은 쇼트코드(예: `"eyes"`)를 기대합니다.
- Slack 계정별 또는 전역으로 반응을 비활성화하려면 `""`를 사용하세요.
- Slack은 shortcode를 기대합니다(예: `"eyes"`).
- Slack 계정 또는 전역에서 반응을 비활성화하려면 `""`를 사용하세요.
## 텍스트 스트리밍
`channels.slack.streaming`라이브 미리보기 동작을 제어합니다:
`channels.slack.streaming`실시간 미리보기 동작을 제어합니다:
- `off`: 라이브 미리보기 스트리밍을 비활성화합니다.
- `partial` (기본값): 미리보기 텍스트를 최신 부분 출력으로 교체합니다.
- `block`: 청크 단위 미리보기 업데이트를 추가합니다.
- `progress`: 생성 중에는 진행 상태 텍스트를 표시하고, 완료 후 최종 텍스트를 보냅니다.
- `off`: 실시간 미리보기 스트리밍 비활성화.
- `partial` (기본값): 미리보기 텍스트를 최신 부분 출력으로 교체.
- `block`: 청크 단위 미리보기 업데이트를 추가.
- `progress`: 생성 중에는 진행 상태 텍스트를 표시하고, 이후 최종 텍스트를 전송.
`channels.slack.nativeStreaming`은 `streaming``partial`일 때 Slack 기본 텍스트 스트리밍을 제어합니다(기본값: `true`).
`channels.slack.streaming.nativeTransport`는 `channels.slack.streaming.mode``partial`일 때 Slack 네이티브 텍스트 스트리밍을 제어합니다(기본값: `true`).
- 기본 텍스트 스트리밍이 표시되려면 답글 스레드를 사용할 수 있어야 합니다. 스레드 선택은 계속 `replyToMode`를 따릅니다. 스레드가 없으면 일반 초안 미리보기가 사용됩니다.
- 미디어 및 비텍스트 페이로드는 일반 전송으로 대체됩니다.
- 스트리밍이 답글 중간에 실패하면 OpenClaw는 남은 페이로드를 일반 전송으로 대체합니다.
- 네이티브 텍스트 스트리밍과 Slack assistant 스레드 상태를 표시하려면 답글 스레드를 사용할 수 있어야 합니다. 스레드 선택은 여전히 `replyToMode`를 따릅니다.
- 채널 및 그룹 채팅 루트는 네이티브 스트리밍을 사용할 수 없을 때 일반 초안 미리보기를 계속 사용할 수 있습니다.
- 최상위 Slack DM은 기본적으로 스레드 밖이므로 스레드 스타일 미리보기가 표시되지 않습니다. 그곳에서 표시 가능한 진행 상태가 필요하면 스레드 답글 또는 `typingReaction`을 사용하세요.
- 미디어 및 비텍스트 페이로드는 일반 전달로 대체됩니다.
- 스트리밍이 답글 중간에 실패하면 OpenClaw는 남은 페이로드를 일반 전달로 대체합니다.
Slack 기본 텍스트 스트리밍 대신 초안 미리보기를 사용하려면:
Slack 네이티브 텍스트 스트리밍 대신 초안 미리보기 사용:
```json5
{
channels: {
slack: {
streaming: "partial",
nativeStreaming: false,
streaming: {
mode: "partial",
nativeTransport: false,
},
},
},
}
@ -491,12 +495,13 @@ Slack 기본 텍스트 스트리밍 대신 초안 미리보기를 사용하려
레거시 키:
- `channels.slack.streamMode` (`replace | status_final | append`)는 `channels.slack.streaming`으로 자동 마이그레이션됩니다.
- 불리언 `channels.slack.streaming``channels.slack.nativeStreaming`으로 자동 마이그레이션됩니다.
- `channels.slack.streamMode` (`replace | status_final | append`)는 자동으로 `channels.slack.streaming.mode`로 마이그레이션됩니다.
- 불리언 `channels.slack.streaming`은 자동으로 `channels.slack.streaming.mode``channels.slack.streaming.nativeTransport`로 마이그레이션됩니다.
- 레거시 `channels.slack.nativeStreaming`은 자동으로 `channels.slack.streaming.nativeTransport`로 마이그레이션됩니다.
## 입력 중 반응 대체 동작
`typingReaction`은 OpenClaw가 답글을 처리하는 동안 인바운드 Slack 메시지에 임시 반응을 추가한 뒤, 실행이 끝나면 제거합니다. 이는 기본 `"is typing..."` 상태 표시기를 사용하는 스레드 답글 외부에서 특히 유용합니다.
`typingReaction`은 OpenClaw가 답글을 처리하는 동안 인바운드 Slack 메시지에 임시 반응을 추가하고, 실행이 끝나면 제거합니다. 이는 기본 `"is typing..."` 상태 표시기를 사용하는 스레드 답글 에서 특히 유용합니다.
확인 순서:
@ -505,50 +510,50 @@ Slack 기본 텍스트 스트리밍 대신 초안 미리보기를 사용하려
참고:
- Slack은 쇼트코드(예: `"hourglass_flowing_sand"`)를 기대합니다.
- 이 반응은 최선의 노력으로 처리되며, 답글 또는 실패 경로가 완료되면 자동으로 정리하려고 시도합니다.
- Slack은 shortcode를 기대합니다(예: `"hourglass_flowing_sand"`).
- 이 반응은 최선형(best-effort)이며, 답글 또는 실패 경로가 완료된 후 자동으로 정리되도록 시도합니다.
## 미디어, 청크 분할 및 전
## 미디어, 청크 분할 및 전
<AccordionGroup>
<Accordion title="인바운드 첨부 파일">
Slack 파일 첨부 Slack이 호스팅하는 비공개 URL에서 다운로드되며(토큰 인증 요청 흐름), 가져오기가 성공하고 크기 제한을 만족하면 미디어 저장소에 기록됩니다.
Slack 파일 첨부 파일은 Slack이 호스팅하는 비공개 URL에서 다운로드되며(토큰 인증 요청 흐름), 가져오기에 성공하고 크기 제한을 충족하면 미디어 저장소에 기록됩니다.
런타임 인바운드 크기 제한`channels.slack.mediaMaxMb`로 재정의하지 않으면 기본적으로 `20MB`니다.
런타임 인바운드 크기 제한의 기본값은 `20MB`이며, `channels.slack.mediaMaxMb`로 재정의할 수 있습니다.
</Accordion>
<Accordion title="아웃바운드 텍스트 및 파일">
- 텍스트 청크는 `channels.slack.textChunkLimit`(기본값 4000)을 사용합니다
- 텍스트 청크는 `channels.slack.textChunkLimit`을 사용합니다(기본값 4000)
- `channels.slack.chunkMode="newline"`은 문단 우선 분할을 활성화합니다
- 파일 전송은 Slack 업로드 API를 사용하며 스레드 답글(`thread_ts`)을 포함할 수 있습니다
- 아웃바운드 미디어 한도는 구성된 경우 `channels.slack.mediaMaxMb`를 따르며, 그렇지 않으면 채널 전송은 미디어 파이프라인의 MIME 종류 기본값을 사용합니다
- 아웃바운드 미디어 제한은 구성된 경우 `channels.slack.mediaMaxMb`를 따르며, 그렇지 않으면 채널 전송은 미디어 파이프라인의 MIME 종류 기본값을 사용합니다
</Accordion>
<Accordion title="전 대상">
<Accordion title="전 대상">
권장되는 명시적 대상:
- DM `user:<id>`
- 채널 `channel:<id>`
- DM의 경우 `user:<id>`
- 채널의 경우 `channel:<id>`
사용자 대상으로 보낼 때 Slack DM은 Slack 대화 API를 통해 열립니다.
사용자 대상으로 전송할 때 Slack DM은 Slack 대화 API를 통해 열립니다.
</Accordion>
</AccordionGroup>
## 명령 및 슬래시 동작
- Slack에서는 기본 명령 자동 모드가 **꺼짐**입니다(`commands.native: "auto"`는 Slack 기본 명령을 활성화하지 않음).
- `channels.slack.commands.native: true`(또는 전역 `commands.native: true`)로 기본 Slack 명령 핸들러를 활성화하세요.
- 기본 명령이 활성화되면 Slack에 일치하는 슬래시 명령(`/<command>` 이름)을 등록하세요. 단, 예외가 하나 있습니다:
- Slack에서는 네이티브 명령 자동 모드가 **비활성화**되어 있습니다(`commands.native: "auto"`는 Slack 네이티브 명령을 활성화하지 않음).
- `channels.slack.commands.native: true`(또는 전역 `commands.native: true`)로 네이티브 Slack 명령 핸들러를 활성화하세요.
- 네이티브 명령이 활성화되면 Slack에 일치하는 슬래시 명령(`/<command>` 이름)을 등록합니다. 단, 예외가 하나 있습니다:
- 상태 명령에는 `/agentstatus`를 등록하세요(Slack은 `/status`를 예약함)
- 기본 명령이 활성화되지 않은 경우 `channels.slack.slashCommand`를 통해 구성된 단일 슬래시 명령을 실행할 수 있습니다.
- 기본 인자 메뉴는 이제 렌더링 전략을 자동으로 조정합니다:
- 네이티브 명령이 활성화되지 않은 경우 `channels.slack.slashCommand`를 통해 단일 구성된 슬래시 명령을 실행할 수 있습니다.
- 네이티브 인수 메뉴는 이제 렌더링 전략을 동적으로 조정합니다:
- 최대 5개 옵션: 버튼 블록
- 6-100개 옵션: 정적 선택 메뉴
- 100개 초과 옵션: 인터랙티비티 옵션 핸들러를 사용할 수 있을 때 비동기 옵션 필터링이 포함된 외부 선택
- 인코딩된 옵션 값이 Slack 한도를 초과하면 흐름은 버튼으로 대체됩니다
- 긴 옵션 페이로드의 경우 슬래시 명령 인자 메뉴는 선택한 값을 디스패치하기 전에 확인 대화상자를 사용합니다.
- 100개 초과 옵션: interactivity 옵션 핸들러를 사용할 수 있으면 비동기 옵션 필터링이 가능한 외부 선택
- 인코딩된 옵션 값이 Slack 제한을 초과하면 흐름은 버튼으로 대체됩니다
- 긴 옵션 페이로드의 경우, 슬래시 명령 인수 메뉴는 선택한 값을 디스패치하기 전에 확인 대화상자를 사용합니다.
기본 슬래시 명령 설정:
@ -563,11 +568,11 @@ Slack 기본 텍스트 스트리밍 대신 초안 미리보기를 사용하려
그리고 여전히 대상 대화 세션(`CommandTargetSessionKey`)에 대해 명령 실행을 라우팅합니다.
## 인터랙티브 답글
## 대화형 답글
Slack은 에이전트가 작성한 인터랙티브 답글 컨트롤을 렌더링할 수 있지만, 이 기능은 기본적으로 비활성화되어 있습니다.
Slack은 에이전트가 작성한 대화형 답글 컨트롤을 렌더링할 수 있지만, 이 기능은 기본적으로 비활성화되어 있습니다.
전역으로 활성화하려면:
전역으로 활성화:
```json5
{
@ -581,7 +586,7 @@ Slack은 에이전트가 작성한 인터랙티브 답글 컨트롤을 렌더링
}
```
또는 하나의 Slack 계정에만 활성화하려면:
또는 하나의 Slack 계정에만 활성화:
```json5
{
@ -599,43 +604,43 @@ Slack은 에이전트가 작성한 인터랙티브 답글 컨트롤을 렌더링
}
```
활성화되면 에이전트는 Slack 전용 답글 지시문을 출력할 수 있습니다:
활성화되면 에이전트는 Slack 전용 답글 지시자를 출력할 수 있습니다:
- `[[slack_buttons: Approve:approve, Reject:reject]]`
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
이 지시문은 Slack Block Kit으로 컴파일되며 기존 Slack 상호작용 이벤트 경로를 통해 클릭 또는 선택을 다시 라우팅합니다.
이 지시자는 Slack Block Kit로 컴파일되며 클릭 또는 선택을 기존 Slack 상호작용 이벤트 경로를 통해 다시 라우팅합니다.
참고:
- 이것은 Slack 전용 UI입니다. 다른 채널은 Slack Block Kit 지시문을 자체 버튼 시스템으로 변환하지 않습니다.
- 인터랙티브 콜백 값은 OpenClaw가 생성한 불투명 토큰이며, 에이전트가 작성한 원시 값이 아닙니다.
- 생성된 인터랙티브 블록이 Slack Block Kit 제한을 초과하면 OpenClaw는 잘못된 blocks 페이로드를 보내는 대신 원래 텍스트 답글로 대체합니다.
- 이것은 Slack 전용 UI입니다. 다른 채널은 Slack Block Kit 지시자를 자체 버튼 시스템으로 변환하지 않습니다.
- 대화형 콜백 값은 에이전트가 작성한 원시 값이 아니라 OpenClaw가 생성한 불투명 토큰입니다.
- 생성된 대화형 블록이 Slack Block Kit 제한을 초과하면 OpenClaw는 잘못된 블록 페이로드를 전송하는 대신 원래 텍스트 답글로 대체합니다.
## Slack의 실행 승인
## Slack의 exec 승인
Slack은 Web UI나 터미널로 대체되는 대신, 인터랙티브 버튼과 상호작용을 사용하는 기본 승인 클라이언트로 동작할 수 있습니다.
Slack은 Web UI 또는 터미널로 대체되는 대신, 대화형 버튼과 상호작용을 갖춘 네이티브 승인 클라이언트로 동작할 수 있습니다.
- 실행 승인은 기본 DM/채널 라우팅에 `channels.slack.execApprovals.*`를 사용합니다.
- 플러그인 승인 요청이 이미 Slack에 도착했고 승인 ID 종류가 `plugin:`인 경우 동일한 Slack 기본 버튼 표면을 통해 계속 확인될 수 있습니다.
- 승인자 권한 부여는 계속 강제됩니다. 승인자로 식별된 사용자만 Slack을 통해 요청을 승인하거나 거부할 수 있습니다.
- exec 승인은 네이티브 DM/채널 라우팅에 `channels.slack.execApprovals.*`를 사용합니다.
- 승인 요청이 이미 Slack에 도착했고 승인 ID 종류가 `plugin:`인 경우, plugin 승인은 동일한 Slack 네이티브 버튼 표면을 통해 계속 해결될 수 있습니다.
- 승인자 권한 부여는 계속 적용됩니다. 승인자로 식별된 사용자만 Slack을 통해 요청을 승인하거나 거부할 수 있습니다.
이 기능은 다른 채널과 동일한 공유 승인 버튼 표면을 사용합니다. Slack 앱 설정에서 `interactivity`가 활성화되면 승인 프롬프트는 대화에 직접 Block Kit 버튼으로 렌더링됩니다.
이 버튼이 있으면 기본 승인 UX가 되며, OpenClaw는
이 버튼이 있으면 그것이 기본 승인 UX이며, OpenClaw는
도구 결과에서 채팅 승인을 사용할 수 없거나 수동 승인이 유일한 경로라고 표시하는 경우에만 수동 `/approve` 명령을 포함해야 합니다.
구성 경로:
- `channels.slack.execApprovals.enabled`
- `channels.slack.execApprovals.approvers` (선택 사항, 가능하면 `commands.ownerAllowFrom`으로 대체)
- `channels.slack.execApprovals.approvers` (선택 사항; 가능한 경우 `commands.ownerAllowFrom`으로 대체)
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, 기본값: `dm`)
- `agentFilter`, `sessionFilter`
Slack은 `enabled`가 설정되지 않았거나 `"auto"`이고 최소 하나의
승인자가 확인되면 기본 실행 승인을 자동으로 활성화합니다. Slack을 기본 승인 클라이언트로 명시적으로 비활성화하려면 `enabled: false` 설정하세요.
승인자가 확인될 때 기본 승인을 강제로 켜려면 `enabled: true` 설정하세요.
승인자가 확인되면 네이티브 exec 승인을 자동 활성화합니다. Slack을 네이티브 승인 클라이언트로 명시적으로 비활성화하려면 `enabled: false` 설정하세요.
승인자가 확인될 때 네이티브 승인을 강제로 켜려면 `enabled: true` 설정하세요.
명시적인 Slack 실행 승인 구성 없이 기본 동작:
명시적인 Slack exec 승인 구성이 없는 기본 동작:
```json5
{
@ -645,8 +650,8 @@ Slack은 `enabled`가 설정되지 않았거나 `"auto"`이고 최소 하나의
}
```
승인자를 재정의하거나 필터를 추가하거나
origin-chat 전송을 사용하려는 경우에만 명시적인 Slack 기본 구성이 필요합니다:
승인자를 재정의하거나, 필터를 추가하거나,
origin-chat 전달을 선택하려는 경우에만 명시적인 Slack 네이티브 구성이 필요합니다:
```json5
{
@ -662,22 +667,23 @@ origin-chat 전송을 사용하려는 경우에만 명시적인 Slack 기본 구
}
```
공유 `approvals.exec` 전달은 별개입니다. 실행 승인 프롬프트를 다른 채팅이나 명시적인 대역 외 대상으로도
라우팅해야 할 때만 사용하세요. 공유 `approvals.plugin` 전달도 별개이며, Slack 기본 버튼은 해당 요청이 이미
Slack에 도착한 경우 플러그인 승인을 계속 확인할 수 있습니다.
공유 `approvals.exec` 전달은 별개입니다. exec 승인 프롬프트를 다른 채팅이나 명시적인 대역 외 대상에도
라우팅해야 할 때만 사용하세요. 공유 `approvals.plugin` 전달도 별개입니다.
Slack 네이티브 버튼은 해당 요청이 이미 Slack에 도착한 경우
plugin 승인을 계속 해결할 수 있습니다.
동일 채팅의 `/approve` 이미 명령을 지원하는 Slack 채널 및 DM에서 작동합니다. 전체 승인 전달 모델은 [실행 승인](/ko/tools/exec-approvals)을 참조하세요.
동일 채팅의 `/approve` 이미 명령을 지원하는 Slack 채널 및 DM에서 작동합니다. 전체 승인 전달 모델은 [Exec approvals](/ko/tools/exec-approvals)를 참조하세요.
## 이벤트 및 운영 동작
- 메시지 수정/삭제/스레드 브로드캐스트는 시스템 이벤트로 매핑됩니다.
- 반응 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
- 멤버 참가/이탈, 채널 생성/이름 변경, 핀 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
- 멤버 참여/나감, 채널 생성/이름 변경, 핀 추가/제거 이벤트는 시스템 이벤트로 매핑됩니다.
- `channel_id_changed``configWrites`가 활성화된 경우 채널 구성 키를 마이그레이션할 수 있습니다.
- 채널 주제/목적 메타데이터는 신뢰할 수 없는 컨텍스트로 취급되며 라우팅 컨텍스트에 주입될 수 있습니다.
- 스레드 시작 메시지와 초기 스레드 기록 컨텍스트 시드는 해당하는 경우 구성된 발신자 허용 목록으로 필터링됩니다.
- 블록 작업 및 모달 상호작용은 풍부한 페이로드 필드가 있는 구조화된 `Slack interaction: ...` 시스템 이벤트를 생성합니다:
- 블록 작업: 선택된 값, 레이블, 피커 값, `workflow_*` 메타데이터
- 채널 topic/purpose 메타데이터는 신뢰할 수 없는 컨텍스트로 처리되며 라우팅 컨텍스트에 주입될 수 있습니다.
- 스레드 시작자 및 초기 스레드 기록 컨텍스트 시딩은 해당되는 경우 구성된 발신자 허용 목록에 따라 필터링됩니다.
- 블록 작업 및 모달 상호작용은 풍부한 페이로드 필드가 포함된 구조화된 `Slack interaction: ...` 시스템 이벤트를 출력합니다:
- 블록 작업: 선택된 값, 레이블, picker 값, `workflow_*` 메타데이터
- 라우팅된 채널 메타데이터 및 폼 입력이 포함된 모달 `view_submission``view_closed` 이벤트
## 구성 참조 포인터
@ -686,23 +692,23 @@ Slack에 도착한 경우 플러그인 승인을 계속 확인할 수 있습니
- [구성 참조 - Slack](/ko/gateway/configuration-reference#slack)
신호가 높은 Slack 필드:
- 모드/인증: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
핵심 Slack 필드:
- mode/auth: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
- DM 액세스: `dm.enabled`, `dmPolicy`, `allowFrom` (레거시: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
- 호환성 토글: `dangerouslyAllowNameMatching` (비상용, 필요하지 않으면 꺼두세요)
- 호환성 토글: `dangerouslyAllowNameMatching` (긴급 우회용; 필요하지 않으면 끄기)
- 채널 액세스: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
- 스레딩/기록: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
- 전송: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `nativeStreaming`
- 전달: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`
- 운영/기능: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
## 문제 해결
<AccordionGroup>
<Accordion title="채널에 답글이 없음">
순서대로 확인하세요:
다음을 순서대로 확인하세요:
- `groupPolicy`
- 채널 허용 목록(`channels.slack.channels`)
- 채널 허용 목록 (`channels.slack.channels`)
- `requireMention`
- 채널별 `users` 허용 목록
@ -717,10 +723,10 @@ openclaw doctor
</Accordion>
<Accordion title="DM 메시지가 무시됨">
확인할 항목:
다음을 확인하세요:
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy`(또는 레거시 `channels.slack.dm.policy`)
- `channels.slack.dmPolicy` (또는 레거시 `channels.slack.dm.policy`)
- 페어링 승인 / 허용 목록 항목
```bash
@ -729,37 +735,37 @@ openclaw pairing list slack
</Accordion>
<Accordion title="Socket Mode가 연결되지 않음">
Slack 앱 설정에서 봇 + 앱 토큰 및 Socket Mode 활성화를 확인하세요.
<Accordion title="Socket mode가 연결되지 않음">
Slack 앱 설정에서 bot + app token 및 Socket Mode 활성화를 확인하세요.
`openclaw channels status --probe --json``botTokenStatus` 또는
`appTokenStatus: "configured_unavailable"` 표시되면 Slack 계정은
구성되어 있지만 현재 런타임이 SecretRef 기반
값을 확인할 수 없었다는 뜻입니다.
`appTokenStatus: "configured_unavailable"` 표시되면 Slack 계정은
구성되어 있지만 현재 런타임이 SecretRef 기반 값을
확인할 수 없었다는 뜻입니다.
</Accordion>
<Accordion title="HTTP 모드에서 이벤트를 받지 못함">
<Accordion title="HTTP mode가 이벤트를 수신하지 않음">
다음을 확인하세요:
- signing secret
- webhook 경로
- Slack Request URL(Events + Interactivity + Slash Commands)
- HTTP 계정별 고유 `webhookPath`
- webhook path
- Slack Request URL (Events + Interactivity + Slash Commands)
- HTTP 계정별 고유 `webhookPath`
계정 스냅샷에 `signingSecretStatus: "configured_unavailable"`
나타나면 HTTP 계정은 구성되어 있지만 현재 런타임이
계정 스냅샷에 `signingSecretStatus: "configured_unavailable"`
표시되면 HTTP 계정은 구성되어 있지만 현재 런타임이
SecretRef 기반 signing secret을 확인할 수 없었다는 뜻입니다.
</Accordion>
<Accordion title="기본/슬래시 명령이 실행되지 않음">
의도한 구성이 다음 중 무엇인지 확인하세요:
<Accordion title="네이티브/슬래시 명령이 실행되지 않음">
의도한 방식이 다음 중 무엇인지 확인하세요:
- Slack에 일치하는 슬래시 명령이 등록된 기본 명령 모드(`channels.slack.commands.native: true`)
- 또는 단일 슬래시 명령 모드(`channels.slack.slashCommand.enabled: true`)
- Slack에 일치하는 슬래시 명령이 등록된 네이티브 명령 모드 (`channels.slack.commands.native: true`)
- 또는 단일 슬래시 명령 모드 (`channels.slack.slashCommand.enabled: true`)
또한 `commands.useAccessGroups` 채널/사용자 허용 목록도 확인하세요.
또한 `commands.useAccessGroups` 채널/사용자 허용 목록도 확인하세요.
</Accordion>
</AccordionGroup>

View File

@ -1,128 +1,130 @@
---
read_when:
- 메모리가 어떻게 작동하는지 이해하고 싶습니다
- 어떤 메모리 파일을 작성해야 하는지 알고 싶습니다
summary: OpenClaw가 세션 전반에 걸쳐 항목을 기억하는 방법
- 메모리가 어떻게 작동하는지 이해하고 싶을 때
- 어떤 메모리 파일을 작성해야 하는지 알고 싶을 때
summary: OpenClaw가 세션 전반에 걸쳐 정보를 기억하는 방식
title: 메모리 개요
x-i18n:
generated_at: "2026-04-06T03:06:41Z"
generated_at: "2026-04-08T05:55:50Z"
model: gpt-5.4
provider: openai
source_hash: d19d4fa9c4b3232b7a97f7a382311d2a375b562040de15e9fe4a0b1990b825e7
source_hash: 3bb8552341b0b651609edaaae826a22fdc535d240aed4fad4af4b069454004af
source_path: concepts/memory.md
workflow: 15
---
# 메모리 개요
OpenClaw는 에이전트의
워크스페이스에 **일반 Markdown 파일**을 작성하여 항목을 기억합니다. 모델은 디스크에 저장된 것만
"기억"합니다 -- 숨겨진 상태는 없습니다.
OpenClaw는 에이전트의 작업 공간에 **일반 Markdown 파일**을 작성하여 정보를 기억합니다. 모델은 디스크에 저장된 내용만 "기억"하며, 숨겨진 상태는 없습니다.
## 작동 방식
에이전트에는 메모리 관련 파일이 세 개 있습니다:
에이전트에는 메모리와 관련된 파일이 세 가지 있습니다:
- **`MEMORY.md`** -- 장기 메모리. 지속되는 사실, 선호도, 그리고
결정 사항입니다. 모든 DM 세션 시작 시 로드됩니다.
- **`memory/YYYY-MM-DD.md`** -- 일일 노트. 누적되는 컨텍스트와 관찰 내용입니다.
오늘과 어제의 노트가 자동으로 로드됩니다.
- **`DREAMS.md`** (실험적, 선택 사항) -- 사람이 검토할 수 있는 Dream Diary 및 dreaming 스윕
요약입니다.
- **`MEMORY.md`** -- 장기 메모리. 오래 유지되는 사실, 선호, 결정 사항입니다. 모든 DM 세션 시작 시 로드됩니다.
- **`memory/YYYY-MM-DD.md`** -- 일일 노트. 진행 중인 컨텍스트와 관찰 내용을 담습니다. 오늘과 어제의 노트는 자동으로 로드됩니다.
- **`DREAMS.md`** (실험적, 선택 사항) -- 사람이 검토할 수 있도록 만든 Dream Diary 및 dreaming sweep 요약입니다.
이 파일들은 에이전트 워크스페이스(기본값 `~/.openclaw/workspace`)에 있습니다.
이 파일들은 에이전트 작업 공간(기본값: `~/.openclaw/workspace`)에 있습니다.
<Tip>
에이전트가 무언가를 기억하길 원한다면 이렇게 요청하면 됩니다: "Remember that I
prefer TypeScript." 그러면 적절한 파일에 기록합니다.
에이전트가 무언가를 기억하길 원한다면 그냥 이렇게 요청하면 됩니다: "내가 TypeScript를 선호한다고 기억해." 그러면 적절한 파일에 기록합니다.
</Tip>
## 메모리 도구
에이전트에는 메모리를 다루기 위한 두 가지 도구가 있습니다:
- **`memory_search`** -- 원래 표현과 문구가 달라도
시맨틱 검색을 사용해 관련 노트를 찾습니다.
- **`memory_get`** -- 특정 메모리 파일이나 줄 범위를 읽습니다.
- **`memory_search`** -- 원문과 표현이 달라도 시맨틱 검색을 사용해 관련 노트를 찾습니다.
- **`memory_get`** -- 특정 메모리 파일 또는 줄 범위를 읽습니다.
두 도구 모두 활성 메모리 plugin이 제공합니다(기본값: `memory-core`).
두 도구 모두 활성 메모리 plugin(기본값: `memory-core`)에서 제공합니다.
## Memory Wiki companion plugin
지속 메모리가 단순한 원시 노트보다 관리되는 지식 베이스처럼 동작하길 원한다면, 번들된 `memory-wiki` plugin을 사용하세요.
`memory-wiki`는 지속 지식을 다음 요소를 갖춘 위키 볼트로 컴파일합니다:
- 결정론적 페이지 구조
- 구조화된 주장과 근거
- 모순 및 최신성 추적
- 생성된 대시보드
- 에이전트/런타임 소비자를 위한 컴파일된 다이제스트
- `wiki_search`, `wiki_get`, `wiki_apply`, `wiki_lint` 같은 위키 네이티브 도구
이 plugin은 활성 메모리 plugin을 대체하지 않습니다. 활성 메모리 plugin은 여전히 회상, 승격, dreaming을 담당합니다. `memory-wiki`는 그 옆에 출처 정보가 풍부한 지식 계층을 추가합니다.
자세한 내용은 [Memory Wiki](/ko/plugins/memory-wiki)를 참조하세요.
## 메모리 검색
임베딩 provider가 구성되어 있으면 `memory_search`는 **하이브리드
검색**을 사용합니다 -- 벡터 유사도(의미적 의미)와 키워드 일치
(ID 및 코드 심볼 같은 정확한 용어)를 결합합니다. 지원되는 provider의 API 키만 있으면
즉시 사용할 수 있습니다.
임베딩 provider가 구성되어 있으면 `memory_search`는 **하이브리드 검색**을 사용합니다. 즉, 벡터 유사도(의미적 의미)와 키워드 매칭(ID 및 코드 심볼 같은 정확한 용어)을 결합합니다. 지원되는 provider 중 하나의 API 키만 있으면 별도 설정 없이 바로 동작합니다.
<Info>
OpenClaw는 사용 가능한 API 키를 바탕으로 임베딩 provider를 자동 감지합니다. OpenAI, Gemini, Voyage 또는 Mistral 키가
구성되어 있으면 메모리 검색이 자동으로 활성화됩니다.
OpenClaw는 사용 가능한 API 키를 바탕으로 임베딩 provider를 자동 감지합니다. OpenAI, Gemini, Voyage 또는 Mistral 키가 구성되어 있으면 메모리 검색이 자동으로 활성화됩니다.
</Info>
검색 동작 방식, 조정 옵션, provider 설정에 대한 자세한 내용은
[메모리 검색](/ko/concepts/memory-search)을 참조하세요.
검색 작동 방식, 튜닝 옵션, provider 설정에 대한 자세한 내용은 [Memory Search](/ko/concepts/memory-search)를 참조하세요.
## 메모리 백엔드
<CardGroup cols={3}>
<Card title="Builtin (기본값)" icon="database" href="/ko/concepts/memory-builtin">
SQLite 기반입니다. 키워드 검색, 벡터 유사도, 하이브리드 검색을 즉시 사용할 수 있습니다.
추가 종속성이 없습니다.
<Card title="내장형 (기본값)" icon="database" href="/ko/concepts/memory-builtin">
SQLite 기반입니다. 키워드 검색, 벡터 유사도, 하이브리드 검색을 별도 설정 없이 사용할 수 있습니다. 추가 의존성이 필요하지 않습니다.
</Card>
<Card title="QMD" icon="search" href="/ko/concepts/memory-qmd">
리랭킹, 쿼리 확장, 워크스페이스 외부 디렉터리 인덱싱 기능을 제공하는 로컬 우선 사이드카입니다.
재순위 지정, 쿼리 확장, 작업 공간 외부 디렉터리 인덱싱 기능을 갖춘 로컬 우선 사이드카입니다.
</Card>
<Card title="Honcho" icon="brain" href="/ko/concepts/memory-honcho">
사용자 모델링, 시맨틱 검색, 멀티 에이전트 인식을 갖춘 AI 네이티브 크로스 세션 메모리입니다.
Plugin 설치가 필요합니다.
사용자 모델링, 시맨틱 검색, 멀티 에이전트 인식을 지원하는 AI 네이티브 교차 세션 메모리입니다. plugin 설치가 필요합니다.
</Card>
</CardGroup>
## 지식 위키 계층
<CardGroup cols={1}>
<Card title="Memory Wiki" icon="book" href="/ko/plugins/memory-wiki">
주장, 대시보드, bridge mode, Obsidian 친화적 워크플로를 갖춘 출처 정보가 풍부한 위키 볼트로 지속 메모리를 컴파일합니다.
</Card>
</CardGroup>
## 자동 메모리 플러시
[compaction](/ko/concepts/compaction)이 대화를 요약하기 전에 OpenClaw는
에이전트에게 중요한 컨텍스트를 메모리 파일에 저장하라고 상기시키는
조용한 턴을 실행합니다. 이것은 기본적으로 켜져 있으므로 아무것도 구성할 필요가 없습니다.
[compaction](/ko/concepts/compaction)이 대화를 요약하기 전에 OpenClaw는 에이전트에게 중요한 컨텍스트를 메모리 파일에 저장하라고 상기시키는 무음 턴을 실행합니다. 이것은 기본적으로 활성화되어 있으므로 별도로 설정할 필요가 없습니다.
<Tip>
메모리 플러시는 compaction 중 컨텍스트 손실을 방지합니다. 대화에 중요한 사실이 있지만 아직 파일에
기록되지 않았다면, 요약이 일어나기 전에 자동으로 저장됩니다.
메모리 플러시는 compaction 중 컨텍스트 손실을 방지합니다. 대화에 중요한 사실이 있지만 아직 파일에 기록되지 않았다면, 요약이 이루어지기 전에 자동으로 저장됩니다.
</Tip>
## dreaming (실험적)
## Dreaming (실험적)
dreaming은 메모리를 위한 선택적 백그라운드 통합 패스입니다. 단기 신호를 수집하고,
후보 항목의 점수를 매기며, 자격을 갖춘 항목만 장기 메모리(`MEMORY.md`)로 승격합니다.
Dreaming은 메모리를 위한 선택적 백그라운드 통합 패스입니다. 단기 신호를 수집하고, 후보를 점수화하며, 기준을 충족한 항목만 장기 메모리(`MEMORY.md`)로 승격합니다.
장기 메모리의 신호 품질을 높게 유지하도록 설계되었습니다:
장기 메모리의 신호 대 잡음비를 높게 유지하도록 설계되었습니다:
- **옵트인**: 기본적으로 비활성화되어 있습니다.
- **예약 실행**: 활성화되면 `memory-core`가 전체 dreaming 스윕을 위한
반복 cron 작업 하나를 자동으로 관리합니다.
- **임곗값 적용**: 승격은 점수, 회상 빈도, 쿼리
다양성 게이트를 통과해야 합니다.
- **검토 가능**: 단계 요약과 다이어리 항목이 `DREAMS.md`에 기록되어
사람이 검토할 수 있습니다.
- **예약 실행**: 활성화되면 `memory-core`가 전체 dreaming sweep을 위한 반복 cron 작업 하나를 자동으로 관리합니다.
- **임곗값 기반**: 승격은 점수, 회상 빈도, 쿼리 다양성 게이트를 통과해야 합니다.
- **검토 가능**: 단계별 요약과 다이어리 항목이 사람이 검토할 수 있도록 `DREAMS.md`에 기록됩니다.
단계 동작, 점수화 신호, Dream Diary 세부 사항은
[Dreaming (experimental)](/concepts/dreaming)을 참조하세요.
단계 동작, 점수화 신호, Dream Diary 세부 정보는 [Dreaming (experimental)](/ko/concepts/dreaming)을 참조하세요.
## CLI
```bash
openclaw memory status # 인덱스 상태와 provider 확인
openclaw memory search "query" # 명령줄에서 검색
openclaw memory index --force # 인덱스 재구축
openclaw memory index --force # 인덱스 다시 빌드
```
## 추가 읽을거리
- [Builtin Memory Engine](/ko/concepts/memory-builtin) -- 기본 SQLite 백엔드
- [QMD Memory Engine](/ko/concepts/memory-qmd) -- 고급 로컬 우선 사이드카
- [Honcho Memory](/ko/concepts/memory-honcho) -- AI 네이티브 크로스 세션 메모리
- [Memory Search](/ko/concepts/memory-search) -- 검색 파이프라인, provider, 그리고
조정
- [Dreaming (experimental)](/concepts/dreaming) -- 단기 회상에서 장기 메모리로의
백그라운드 승격
- [Memory configuration reference](/ko/reference/memory-config) -- 모든 구성 설정
- [Honcho Memory](/ko/concepts/memory-honcho) -- AI 네이티브 교차 세션 메모리
- [Memory Wiki](/ko/plugins/memory-wiki) -- 컴파일된 지식 볼트 및 위키 네이티브 도구
- [Memory Search](/ko/concepts/memory-search) -- 검색 파이프라인, provider, 튜닝
- [Dreaming (experimental)](/ko/concepts/dreaming) -- 단기 회상에서 장기 메모리로의 백그라운드 승격
- [Memory configuration reference](/ko/reference/memory-config) -- 모든 구성 옵션
- [Compaction](/ko/concepts/compaction) -- compaction이 메모리와 상호작용하는 방식

View File

@ -1,14 +1,14 @@
---
read_when:
- provider별 모델 설정 참고 자료가 필요합니다
- 모델 provider용 예시 구성 또는 CLI 온보딩 명령이 필요합니다
summary: 예시 구성과 CLI 흐름이 포함된 모델 provider 개요
- provider별 모델 설정 참가 필요합니다
- 모델 provider용 예시 config 또는 CLI 온보딩 명령이 필요합니다
summary: 예시 config와 CLI 흐름이 포함된 모델 provider 개요
title: 모델 provider
x-i18n:
generated_at: "2026-04-08T02:15:37Z"
generated_at: "2026-04-08T05:57:21Z"
model: gpt-5.4
provider: openai
source_hash: 26b36a2bc19a28a7ef39aa8e81a0050fea1d452ac4969122e5cdf8755e690258
source_hash: 558ac9e34b67fcc3dd6791a01bebc17e1c34152fa6c5611593d681e8cfa532d9
source_path: concepts/model-providers.md
workflow: 15
---
@ -16,24 +16,25 @@ x-i18n:
# 모델 provider
이 페이지는 **LLM/모델 provider**를 다룹니다(WhatsApp/Telegram 같은 채팅 채널은 아님).
모델 선택 규칙은 [/concepts/models](/ko/concepts/models)을 참하세요.
모델 선택 규칙은 [/concepts/models](/ko/concepts/models)을 참하세요.
## 빠른 규칙
- 모델 ref는 `provider/model`을 사용합니다(예: `opencode/claude-opus-4-6`).
- `agents.defaults.models`를 설정하면 허용 목록이 됩니다.
- `agents.defaults.models`를 설정하면 allowlist가 됩니다.
- CLI 도우미: `openclaw onboard`, `openclaw models list`, `openclaw models set <provider/model>`.
- 대체 런타임 규칙, 쿨다운 프로브, 세션 오버라이드 지속성은 [/concepts/model-failover](/ko/concepts/model-failover)에 문서화되어 있습니다.
- 폴백 런타임 규칙, 쿨다운 프로브, 세션 override 지속성은
[/concepts/model-failover](/ko/concepts/model-failover)에 설명되어 있습니다.
- `models.providers.*.models[].contextWindow`는 네이티브 모델 메타데이터입니다.
`models.providers.*.models[].contextTokens`는 유효 런타임 상한입니다.
- Provider plugin은 `registerProvider({ catalog })`를 통해 모델 카탈로그를 주입할 수 있습니다.
- Provider plugin은 `registerProvider({ catalog })`를 통해 모델 catalog를 주입할 수 있습니다.
OpenClaw는 그 출력을 `models.providers`에 병합한 뒤
`models.json`을 기록합니다.
- Provider 매니페스트`providerAuthEnvVars`를 선언할 수 있으므로 일반적인 env 기반
인증 프로브가 plugin 런타임을 로드할 필요가 없습니다. 남아 있는 core env-var
맵은 이제 non-plugin/core provider와 Anthropic API-key-first 온보딩 같은 일부
일반 우선순위 사례에만 사용됩니다.
- Provider plugin은 다음을 통해 provider 런타임 동작도 소유할 수 있습니다.
- Provider manifest`providerAuthEnvVars`를 선언할 수 있으므로 일반적인 env 기반
인증 프로브가 plugin 런타임을 로드할 필요가 없습니다. 남아 있는 코어 env-var
맵은 이제 non-plugin/core provider와 Anthropic API-key-first 온보딩 같은
부 일반 우선순위 사례에만 사용됩니다.
- Provider plugin은 다음을 통해 provider 런타임 동작도 직접 소유할 수 있습니다.
`normalizeModelId`, `normalizeTransport`, `normalizeConfig`,
`applyNativeStreamingUsageCompat`, `resolveConfigApiKey`,
`resolveSyntheticAuth`, `shouldDeferSyntheticProfileAuth`,
@ -51,114 +52,198 @@ x-i18n:
`resolveDefaultThinkingLevel`, `applyConfigDefaults`, `isModernModelRef`,
`prepareRuntimeAuth`, `resolveUsageAuth`, `fetchUsageSnapshot`, 그리고
`onModelSelected`.
- 참고: provider 런타임 `capabilities`는 공유 러너 메타데이터입니다(provider
계열, transcript/tooling 특이사항, transport/cache 힌트). 이것은 plugin이
무엇을 등록하는지 설명하는 [public capability model](/ko/plugins/architecture#public-capability-model)과는
다릅니다(텍스트 추론, 음성 등).
- 참고: provider 런타임 `capabilities`는 공유 runner 메타데이터입니다(provider
계열, transcript/tooling 특이사항, transport/cache 힌트). 이것은
plugin이 무엇을 등록하는지 설명하는 [공개 capability 모델](/ko/plugins/architecture#public-capability-model)
과는 다릅니다(텍스트 추론, 음성 등).
## plugin 소유 provider 동작
## Plugin 소유 provider 동작
Provider plugin은 이제 대부분의 provider별 로직을 소유할 수 있으며, OpenClaw는
Provider plugin은 이제 대부분의 provider별 로직을 소유할 수 있, OpenClaw는
일반 추론 루프를 유지합니다.
일반적인 분리는 다음과 같습니다.
- `auth[].run` / `auth[].runNonInteractive`: provider는 `openclaw onboard`, `openclaw models auth`, 헤드리스 설정용 온보딩/로그인 흐름을 소유
- `wizard.setup` / `wizard.modelPicker`: provider는 인증 선택 레이블, 레거시 별칭, 온보딩 허용 목록 힌트, 온보딩/모델 picker의 설정 항목을 소유
- `catalog`: provider가 `models.providers`에 나타남
- `normalizeModelId`: provider가 조회 또는 표준화 전에 레거시/preview 모델 id를 정규화
- `normalizeTransport`: provider가 일반 모델 조립 전에 transport 계열 `api` / `baseUrl`을 정규화하며, OpenClaw는 먼저 일치한 provider를 확인한 뒤 실제로 transport를 변경하는 plugin이 나올 때까지 다른 hook 지원 provider plugin을 확인
- `normalizeConfig`: provider가 런타임에서 사용하기 전에 `models.providers.<id>` 구성을 정규화하며, OpenClaw는 먼저 일치한 provider를 확인한 뒤 실제로 구성을 변경하는 plugin이 나올 때까지 다른 hook 지원 provider plugin을 확인합니다. 어떤 provider hook도 구성을 재작성하지 않으면 번들된 Google 계열 도우미가 계속 지원되는 Google provider 항목을 정규화합니다.
- `applyNativeStreamingUsageCompat`: provider가 config provider용 엔드포인트 기반 네이티브 streaming-usage 호환 재작성을 적용
- `resolveConfigApiKey`: provider가 전체 런타임 인증 로딩을 강제하지 않고 config provider용 env-marker 인증을 해석. `amazon-bedrock`도 여기서 내장 AWS env-marker 해석기를 가지며, Bedrock 런타임 인증은 AWS SDK 기본 체인을 사용함
- `resolveSyntheticAuth`: provider가 평문 시크릿을 저장하지 않고 local/self-hosted 또는 기타 config 기반 인증 가용성을 노출할 수 있음
- `shouldDeferSyntheticProfileAuth`: provider가 저장된 synthetic 프로필 플레이스홀더를 env/config 기반 인증보다 낮은 우선순위로 표시할 수 있음
- `resolveDynamicModel`: provider가 아직 로컬 정적 카탈로그에 없는 모델 id를 허용
- `prepareDynamicModel`: provider가 동적 해석을 다시 시도하기 전에 메타데이터 새로 고침이 필요함
- `normalizeResolvedModel`: provider가 transport 또는 base URL 재작성이 필요함
- `contributeResolvedModelCompat`: provider가 다른 호환 transport를 통해 들어온 경우에도 해당 벤더 모델용 compat 플래그를 제공
- `capabilities`: provider가 transcript/tooling/provider-family 특이사항을 게시
- `normalizeToolSchemas`: provider가 내장 러너가 보기 전에 tool schema를 정리
- `inspectToolSchemas`: provider가 정규화 후 transport별 schema 경고를 노출
- `resolveReasoningOutputMode`: provider가 네이티브 또는 태그 기반 reasoning-output 계약을 선택
- `prepareExtraParams`: provider가 모델별 요청 파라미터를 기본화 또는 정규화
- `createStreamFn`: provider가 일반 스트림 경로를 완전한 커스텀 transport로 대체
- `wrapStreamFn`: provider가 요청 헤더/본문/모델 compat 래퍼를 적용
- `resolveTransportTurnState`: provider가 턴별 네이티브 transport 헤더 또는 메타데이터를 제공
- `resolveWebSocketSessionPolicy`: provider가 네이티브 WebSocket 세션 헤더 또는 세션 쿨다운 정책을 제공
- `createEmbeddingProvider`: provider plugin에 속해야 하는 경우 provider가 메모리 임베딩 동작을 소유하며 core 임베딩 스위치보드는 소유하지 않음
- `formatApiKey`: provider가 저장된 인증 프로필을 transport가 기대하는 런타임 `apiKey` 문자열로 포맷
- `refreshOAuth`: 공유 `pi-ai` 갱신기로 충분하지 않을 때 provider가 OAuth 갱신을 소유
- `buildAuthDoctorHint`: OAuth 갱신 실패 시 provider가 복구 안내를 추가
- `matchesContextOverflowError`: 일반 휴리스틱이 놓치는 provider별 context-window 초과 오류를 provider가 인식
- `classifyFailoverReason`: provider가 provider별 원시 transport/API 오류를 속도 제한 또는 과부하 같은 failover 이유로 매핑
- `auth[].run` / `auth[].runNonInteractive`: provider가 `openclaw onboard`, `openclaw models auth`, 헤드리스 설정을 위한 온보딩/로그인
흐름을 소유
- `wizard.setup` / `wizard.modelPicker`: provider가 인증 선택 라벨,
레거시 alias, 온보딩 allowlist 힌트, 온보딩/모델 picker의 설정 항목을 소유
- `catalog`: provider가 `models.providers`에 표시됨
- `normalizeModelId`: provider가 조회 또는 canonicalization 전에
레거시/preview 모델 id를 정규화
- `normalizeTransport`: provider가 일반 모델 조립 전에 transport 계열 `api` / `baseUrl`
정규화합니다. OpenClaw는 먼저 일치하는 provider를 확인한 다음,
transport를 실제로 변경할 때까지 다른 hook 가능 provider plugin도 확인합니다.
- `normalizeConfig`: provider가 런타임 사용 전에 `models.providers.<id>` config를
정규화합니다. OpenClaw는 먼저 일치하는 provider를 확인한 다음,
config를 실제로 변경할 때까지 다른 hook 가능 provider plugin도 확인합니다. 어떤
provider hook도 config를 다시 쓰지 않으면, 번들된 Google 계열 도우미가 계속해서
지원되는 Google provider 항목을 정규화합니다.
- `applyNativeStreamingUsageCompat`: provider가 config provider에 대해
엔드포인트 기반 네이티브 스트리밍 사용량 호환성 재작성을 적용
- `resolveConfigApiKey`: provider가 config provider에 대해 전체 런타임 인증을 강제로 로드하지 않고
env-marker 인증을 해결합니다.
`amazon-bedrock`도 Bedrock 런타임 인증이
AWS SDK 기본 체인을 사용하더라도, 여기에서 내장 AWS env-marker resolver를 가집니다.
- `resolveSyntheticAuth`: provider가 평문 비밀을 저장하지 않고도
로컬/셀프호스트 또는 기타 config 기반 인증 가용성을 노출할 수 있음
- `shouldDeferSyntheticProfileAuth`: provider가 저장된 synthetic profile
placeholder를 env/config 기반 인증보다 낮은 우선순위로 표시할 수 있음
- `resolveDynamicModel`: provider가 로컬 정적 catalog에 아직 없는 모델 id를
허용
- `prepareDynamicModel`: provider가 동적 해결을 다시 시도하기 전에
메타데이터 새로고침이 필요
- `normalizeResolvedModel`: provider가 transport 또는 base URL 재작성이 필요
- `contributeResolvedModelCompat`: provider가 다른 호환 transport를 통해 들어온 경우에도
해당 vendor 모델에 대한 compat 플래그를 제공
- `capabilities`: provider가 transcript/tooling/provider 계열 특이사항을 게시
- `normalizeToolSchemas`: provider가 내장 runner가 보기 전에
tool schema를 정리
- `inspectToolSchemas`: provider가 정규화 후 transport별 schema 경고를 표시
- `resolveReasoningOutputMode`: provider가 네이티브 대 태그 기반
reasoning-output 계약을 선택
- `prepareExtraParams`: provider가 모델별 요청 param의 기본값을 적용하거나 정규화
- `createStreamFn`: provider가 일반 stream 경로를 완전히
커스텀 transport로 대체
- `wrapStreamFn`: provider가 요청 헤더/본문/모델 compat wrapper를 적용
- `resolveTransportTurnState`: provider가 턴별 네이티브 transport
헤더 또는 메타데이터를 제공
- `resolveWebSocketSessionPolicy`: provider가 네이티브 WebSocket 세션
헤더 또는 세션 쿨다운 정책을 제공
- `createEmbeddingProvider`: provider가 코어 embedding switchboard 대신
provider plugin에 속하는 메모리 embedding 동작을 소유
- `formatApiKey`: provider가 저장된 인증 profile을 transport가 기대하는
런타임 `apiKey` 문자열로 포맷
- `refreshOAuth`: 공유 `pi-ai`
refresher로 충분하지 않을 때 provider가 OAuth 새로고침을 소유
- `buildAuthDoctorHint`: OAuth 새로고침이 실패할 때 provider가
복구 안내를 추가
- `matchesContextOverflowError`: provider가 일반 heuristic이 놓치는
provider별 컨텍스트 창 초과 오류를 인식
- `classifyFailoverReason`: provider가 provider별 원시 transport/API
오류를 rate limit 또는 overload 같은 failover reason으로 매핑
- `isCacheTtlEligible`: provider가 어떤 업스트림 모델 id가 prompt-cache TTL을 지원하는지 결정
- `buildMissingAuthMessage`: provider가 일반 인증 저장소 오류를 provider별 복구 힌트로 대체
- `suppressBuiltInModel`: provider가 오래된 업스트림 행을 숨기고 직접 해석 실패 시 벤더 소유 오류를 반환할 수 있음
- `augmentModelCatalog`: provider가 발견 및 구성 병합 후 synthetic/final 카탈로그 행을 추가
- `buildMissingAuthMessage`: provider가 일반 인증 저장소 오류를
provider별 복구 힌트로 대체
- `suppressBuiltInModel`: provider가 오래된 업스트림 행을 숨기고
직접 해결 실패에 대해 vendor 소유 오류를 반환할 수 있음
- `augmentModelCatalog`: provider가 발견 및 config 병합 후
synthetic/final catalog 행을 추가
- `isBinaryThinking`: provider가 이진 on/off thinking UX를 소유
- `supportsXHighThinking`: provider가 선택한 모델에 `xhigh`를 사용하도록 설정
- `supportsXHighThinking`: provider가 선택한 모델에 `xhigh`를 사용하도록 설정
- `resolveDefaultThinkingLevel`: provider가 모델 계열의 기본 `/think` 정책을 소유
- `applyConfigDefaults`: provider가 인증 모드, env 또는 모델 계열을 기준으로 구성 구체화 중 provider별 전역 기본값을 적용
- `isModernModelRef`: provider가 live/smoke 선호 모델 매칭을 소유
- `prepareRuntimeAuth`: provider가 구성된 자격 증명을 짧은 수명의 런타임 토큰으로 변환
- `resolveUsageAuth`: provider가 `/usage` 및 관련 상태/보고 표면용 사용량/할당량 자격 증명을 해석
- `fetchUsageSnapshot`: provider가 사용량 엔드포인트 조회/파싱을 소유하고 core는 여전히 요약 셸과 포맷을 소유
- `onModelSelected`: provider가 텔레메트리 또는 provider 소유 세션 기록 유지 같은 선택 후 부작용을 실행
- `applyConfigDefaults`: provider가 인증 모드, env 또는 모델 계열에 따라
config materialization 중 provider별 전역 기본값을 적용
- `isModernModelRef`: provider가 라이브/스모크 선호 모델 매칭을 소유
- `prepareRuntimeAuth`: provider가 구성된 자격 증명을 짧은 수명의
런타임 토큰으로 변환
- `resolveUsageAuth`: provider가 `/usage`
및 관련 상태/리포팅 화면을 위한 사용량/할당량 자격 증명을 해결
- `fetchUsageSnapshot`: provider가 사용량 엔드포인트 fetch/parsing을 소유하고
코어는 여전히 요약 셸과 포맷팅을 소유
- `onModelSelected`: provider가 텔레메트리 또는 provider 소유 세션 bookkeeping 같은
선택 후 부수 효과를 실행
현재 번들된 예시는 다음과 같습니다.
현재 번들 예시:
- `anthropic`: Claude 4.6 전방 호환 fallback, 인증 복구 힌트, 사용량 엔드포인트 조회, cache-TTL/provider-family 메타데이터, 인증 인식 전역 구성 기본값
- `amazon-bedrock`: Bedrock 전용 throttle/not-ready 오류에 대한 provider 소유 context-overflow 매칭 및 failover 이유 분류, 그리고 Anthropic 트래픽의 Claude 전용 replay-policy 가드를 위한 공유 `anthropic-by-model` 재생 계열 포함
- `anthropic-vertex`: Anthropic-message 트래픽에 대한 Claude 전용 replay-policy 가드
- `openrouter`: 패스스루 모델 id, 요청 래퍼, provider capability 힌트, 프록시 Gemini 트래픽의 Gemini thought-signature 정리, `openrouter-thinking` 스트림 계열을 통한 프록시 reasoning 주입, 라우팅 메타데이터 전달, cache-TTL 정책
- `github-copilot`: 온보딩/디바이스 로그인, 전방 호환 모델 fallback, Claude-thinking transcript 힌트, 런타임 토큰 교환, 사용량 엔드포인트 조회
- `openai`: GPT-5.4 전방 호환 fallback, 직접 OpenAI transport 정규화, Codex 인식 missing-auth 힌트, Spark 숨김, synthetic OpenAI/Codex 카탈로그 행, thinking/live-model 정책, usage-token 별칭 정규화(`input` / `output``prompt` / `completion` 계열), 네이티브 OpenAI/Codex 래퍼를 위한 공유 `openai-responses-defaults` 스트림 계열, provider-family 메타데이터, `gpt-image-1`용 번들 이미지 생성 provider 등록, `sora-2`용 번들 비디오 생성 provider 등록
- `google``google-gemini-cli`: Gemini 3.1 전방 호환 fallback, 네이티브 Gemini 재생 검증, 부트스트랩 재생 정리, 태그 기반 reasoning-output 모드, 최신 모델 매칭, Gemini image-preview 모델용 번들 이미지 생성 provider 등록, Veo 모델용 번들 비디오 생성 provider 등록; Gemini CLI OAuth는 또한 사용량 표면용 인증 프로필 토큰 포맷, usage-token 파싱, 할당량 엔드포인트 조회를 소유
- `moonshot`: 공유 transport, plugin 소유 thinking 페이로드 정규화
- `kilocode`: 공유 transport, plugin 소유 요청 헤더, reasoning 페이로드 정규화, 프록시-Gemini thought-signature 정리, cache-TTL 정책
- `zai`: GLM-5 전방 호환 fallback, `tool_stream` 기본값, cache-TTL 정책, binary-thinking/live-model 정책, 사용량 인증 + 할당량 조회; 알 수 없는 `glm-5*` id는 번들된 `glm-4.7` 템플릿에서 synthetic 생성
- `xai`: 네이티브 Responses transport 정규화, Grok fast 변형용 `/fast` 별칭 재작성, 기본 `tool_stream`, xAI 전용 tool-schema / reasoning-payload 정리, `grok-imagine-video`용 번들 비디오 생성 provider 등록
- `anthropic`: Claude 4.6 forward-compat 폴백, 인증 복구 힌트, 사용량
엔드포인트 fetch, cache-TTL/provider 계열 메타데이터, 인증 인식 전역
config 기본값
- `amazon-bedrock`: Bedrock별 throttle/not-ready 오류에 대한 provider 소유
컨텍스트 초과 매칭 및 failover
reason 분류, 그리고 Anthropic 트래픽에서 Claude 전용 replay-policy
가드를 위한 공유 `anthropic-by-model` 재생 계열
- `anthropic-vertex`: Anthropic-message
트래픽에서 Claude 전용 replay-policy 가드
- `openrouter`: pass-through 모델 id, 요청 wrapper, provider capability
힌트, 프록시 Gemini 트래픽에서 Gemini thought-signature 정리,
`openrouter-thinking` stream 계열을 통한 프록시 reasoning 주입,
라우팅 메타데이터 전달, cache-TTL 정책
- `github-copilot`: 온보딩/디바이스 로그인, forward-compat 모델 폴백,
Claude-thinking transcript 힌트, 런타임 토큰 교환, 사용량 엔드포인트
fetch
- `openai`: GPT-5.4 forward-compat 폴백, 직접 OpenAI transport
정규화, Codex 인식 missing-auth 힌트, Spark 숨김, synthetic
OpenAI/Codex catalog 행, thinking/live-model 정책, usage-token alias
정규화(`input` / `output``prompt` / `completion` 계열), 네이티브 OpenAI/Codex
wrapper를 위한 공유 `openai-responses-defaults` stream 계열,
provider 계열 메타데이터, `gpt-image-1`용 번들 이미지 생성 provider
등록, `sora-2`용 번들 비디오 생성 provider
등록
- `google``google-gemini-cli`: Gemini 3.1 forward-compat 폴백,
네이티브 Gemini replay 검증, bootstrap replay 정리, 태그 기반
reasoning-output 모드, modern-model 매칭, Gemini image-preview 모델용
번들 이미지 생성 provider 등록, Veo 모델용 번들
비디오 생성 provider 등록; Gemini CLI OAuth는 또한
사용량 화면용 인증 profile 토큰 포맷팅, usage-token parsing, 할당량 엔드포인트
fetch를 소유
- `moonshot`: 공유 transport, plugin 소유 thinking payload 정규화
- `kilocode`: 공유 transport, plugin 소유 요청 헤더, reasoning payload
정규화, 프록시 Gemini thought-signature 정리, cache-TTL
정책
- `zai`: GLM-5 forward-compat 폴백, `tool_stream` 기본값, cache-TTL
정책, binary-thinking/live-model 정책, 사용량 인증 + 할당량 fetch;
알 수 없는 `glm-5*` id는 번들된 `glm-4.7` 템플릿에서 합성됨
- `xai`: 네이티브 Responses transport 정규화, Grok fast variant용
`/fast` alias 재작성, 기본 `tool_stream`, xAI별 tool-schema /
reasoning-payload 정리, `grok-imagine-video`용 번들 비디오 생성 provider
등록
- `mistral`: plugin 소유 capability 메타데이터
- `opencode``opencode-go`: plugin 소유 capability 메타데이터와 프록시-Gemini thought-signature 정리
- `alibaba`: `alibaba/wan2.6-t2v` 같은 직접 Wan 모델 ref용 plugin 소유 비디오 생성 카탈로그
- `byteplus`: plugin 소유 카탈로그와 Seedance text-to-video/image-to-video 모델용 번들 비디오 생성 provider 등록
- `fal`: FLUX 이미지 모델용 호스팅된 타사 이미지 생성 provider 등록과 호스팅된 타사 비디오 모델용 번들 비디오 생성 provider 등록
- `opencode``opencode-go`: plugin 소유 capability 메타데이터와
프록시 Gemini thought-signature 정리
- `alibaba`: `alibaba/wan2.6-t2v` 같은 직접 Wan 모델 ref용
plugin 소유 비디오 생성 catalog
- `byteplus`: plugin 소유 catalog와 Seedance 텍스트-비디오/이미지-비디오 모델용
번들 비디오 생성 provider 등록
- `fal`: 호스팅된 서드파티용 번들 비디오 생성 provider 등록,
FLUX 이미지 모델용 이미지 생성 provider 등록,
그리고 호스팅된 서드파티 비디오 모델용 번들
비디오 생성 provider 등록
- `cloudflare-ai-gateway`, `huggingface`, `kimi`, `nvidia`, `qianfan`,
`stepfun`, `synthetic`, `venice`, `vercel-ai-gateway`, `volcengine`:
plugin 소유 카탈로그만 제공
- `qwen`: 텍스트 모델용 plugin 소유 카탈로그와 멀티모달 표면용 공유 media-understanding 및 비디오 생성 provider 등록; Qwen 비디오 생성은 `wan2.6-t2v``wan2.7-r2v` 같은 번들 Wan 모델과 함께 표준 DashScope 비디오 엔드포인트를 사용
- `runway`: `gen4.5` 같은 네이티브 Runway 작업 기반 모델용 plugin 소유 비디오 생성 provider 등록
- `minimax`: plugin 소유 카탈로그, Hailuo 비디오 모델용 번들 비디오 생성 provider 등록, `image-01`용 번들 이미지 생성 provider 등록, 하이브리드 Anthropic/OpenAI replay-policy 선택, 사용량 인증/스냅샷 로직
- `together`: plugin 소유 카탈로그와 Wan 비디오 모델용 번들 비디오 생성 provider 등록
- `xiaomi`: plugin 소유 카탈로그와 사용량 인증/스냅샷 로직
plugin 소유 catalog만 제공
- `qwen`: 텍스트 모델용 plugin 소유 catalog와 멀티모달 화면용
공유 media-understanding 및 비디오 생성 provider 등록;
Qwen 비디오 생성은 `wan2.6-t2v``wan2.7-r2v` 같은 번들 Wan 모델과 함께
Standard DashScope 비디오 엔드포인트를 사용
- `runway`: `gen4.5` 같은 네이티브 Runway 태스크 기반 모델용
plugin 소유 비디오 생성 provider 등록
- `minimax`: plugin 소유 catalog, Hailuo 비디오 모델용 번들 비디오 생성 provider
등록, `image-01`용 번들 이미지 생성 provider
등록, 하이브리드 Anthropic/OpenAI replay-policy
선택, 사용량 인증/스냅샷 로직
- `together`: plugin 소유 catalog와 Wan 비디오 모델용 번들 비디오 생성 provider
등록
- `xiaomi`: plugin 소유 catalog와 사용량 인증/스냅샷 로직
번들된 `openai` plugin은 이제 `openai`
`openai-codex` 두 provider id를 모두 소유합니다.
여기까지가 여전히 OpenClaw의 일반 transport에 맞는 provider입니다. 완전히 커스텀 요청 실행기가 필요한 provider는 별도의 더 깊은 확장 표면입니다.
여기까지는 여전히 OpenClaw의 일반 transport에 맞는 provider를 다룹니다. 완전히
커스텀 요청 실행기가 필요한 provider는 별도의 더 깊은 확장 표면입니다.
## API 키 로테이션
- 선택된 provider에 대해 일반 provider 로테이션을 지원합니다.
- 여러 키를 다음을 통해 구성합니다.
- `OPENCLAW_LIVE_<PROVIDER>_KEY`(단일 live override, 가장 높은 우선순위)
- `<PROVIDER>_API_KEYS`(쉼표 또는 세미콜론으로 구분된 목록)
- 여러 키를 다음으로 구성합니다:
- `OPENCLAW_LIVE_<PROVIDER>_KEY`(단일 라이브 override, 최우선)
- `<PROVIDER>_API_KEYS`(쉼표 또는 세미콜론 목록)
- `<PROVIDER>_API_KEY`(기본 키)
- `<PROVIDER>_API_KEY_*`(번호가 붙은 목록, 예: `<PROVIDER>_API_KEY_1`)
- Google provider의 경우 `GOOGLE_API_KEY`도 fallback으로 포함됩니다.
- Google provider의 경우 `GOOGLE_API_KEY`폴백으로 포함됩니다.
- 키 선택 순서는 우선순위를 유지하고 값을 중복 제거합니다.
- 요청은 rate-limit 응답에서만 다음 키로 재시도됩니다(예:
`429`, `rate_limit`, `quota`, `resource exhausted`, `Too many
concurrent requests`, `ThrottlingException`, `concurrency limit reached`,
`workers_ai ... quota limit exceeded` 또는 주기적 usage-limit 메시지).
- rate-limit 아닌 실패는 즉시 실패하며 키 로테이션을 시도하지 않습니다.
`workers_ai ... quota limit exceeded`, 또는 주기적 usage-limit 메시지).
- rate-limit 아닌 실패는 즉시 실패하며 키 로테이션을 시도하지 않습니다.
- 모든 후보 키가 실패하면 마지막 시도의 최종 오류가 반환됩니다.
## 내장 provider (pi-ai 카탈로그)
## 내장 provider (pi-ai catalog)
OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아무**
`models.providers` 구성도 필요하지 않습니다. 인증만 설정하고 모델을 선택하면 됩니다.
OpenClaw는 piai catalog를 함께 제공합니다. 이 provider는
`models.providers` config가 **필요하지 않습니다**.
인증만 설정하고 모델을 선택하면 됩니다.
### OpenAI
@ -167,17 +252,19 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- 선택적 로테이션: `OPENAI_API_KEYS`, `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, 그리고 `OPENCLAW_LIVE_OPENAI_KEY`(단일 override)
- 예시 모델: `openai/gpt-5.4`, `openai/gpt-5.4-pro`
- CLI: `openclaw onboard --auth-choice openai-api-key`
- 기본 transport는 `auto`입니다(WebSocket 우선, SSE fallback).
- 모델별`agents.defaults.models["openai/<model>"].params.transport`를 통해 override할 수 있습니다(`"sse"`, `"websocket"`, 또는 `"auto"`).
- OpenAI Responses WebSocket 워밍업은 기본적으로 `params.openaiWsWarmup`(`true`/`false`)을 통해 활성화됩니다.
- OpenAI priority processing은 `agents.defaults.models["openai/<model>"].params.serviceTier`를 통해 활성화할 수 있습니다.
- `/fast``params.fastMode`는 직접 `openai/*` Responses 요청을 `api.openai.com``service_tier=priority`로 매핑합니다.
- 공유 `/fast` 토글 대신 명시적 tier를 원하면 `params.serviceTier`를 사용하세요.
- 기본 transport는 `auto`입니다(WebSocket 우선, SSE 폴백)
- 모델별 override는 `agents.defaults.models["openai/<model>"].params.transport`로 설정합니다(`"sse"`, `"websocket"`, 또는 `"auto"`)
- OpenAI Responses WebSocket 워밍업은 기본적으로 `params.openaiWsWarmup`으로 활성화됩니다(`true`/`false`)
- OpenAI priority processing은 `agents.defaults.models["openai/<model>"].params.serviceTier`로 활성화할 수 있습니다
- `/fast``params.fastMode`는 직접 `openai/*` Responses 요청을 `api.openai.com``service_tier=priority`로 매핑합니다
- 공유 `/fast` 토글 대신 명시적 tier를 원하면 `params.serviceTier`를 사용하세요
- 숨겨진 OpenClaw attribution 헤더(`originator`, `version`,
`User-Agent`)는 일반 OpenAI 호환 프록시가 아니라 `api.openai.com`으로 가는 네이티브 OpenAI 트래픽에만 적용됩니다.
- 네이티브 OpenAI 경로는 또한 Responses `store`, prompt-cache 힌트,
OpenAI reasoning-compat 페이로드 형태도 유지하며, 프록시 경로는 그렇지 않습니다.
- `openai/gpt-5.3-codex-spark`는 live OpenAI API가 이를 거부하므로 OpenClaw에서 의도적으로 숨겨집니다. Spark는 Codex 전용으로 취급됩니다.
`User-Agent`)는 일반 OpenAI 호환 프록시가 아니라
`api.openai.com`으로 가는 네이티브 OpenAI 트래픽에만 적용됩니다
- 네이티브 OpenAI 경로는 Responses `store`, prompt-cache 힌트,
OpenAI reasoning-compat payload shaping도 유지하지만,
프록시 경로는 그렇지 않습니다
- `openai/gpt-5.3-codex-spark`는 라이브 OpenAI API가 이를 거부하기 때문에 OpenClaw에서 의도적으로 숨겨집니다. Spark는 Codex 전용으로 처리됩니다
```json5
{
@ -192,9 +279,9 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- 선택적 로테이션: `ANTHROPIC_API_KEYS`, `ANTHROPIC_API_KEY_1`, `ANTHROPIC_API_KEY_2`, 그리고 `OPENCLAW_LIVE_ANTHROPIC_KEY`(단일 override)
- 예시 모델: `anthropic/claude-opus-4-6`
- CLI: `openclaw onboard --auth-choice apiKey`
- 직접 공개 Anthropic 요청은 공유 `/fast` 토글과 `params.fastMode`도 지원하며, `api.anthropic.com`으로 전송되는 API-key 및 OAuth 인증 트래픽을 포함합니다. OpenClaw는 이를 Anthropic `service_tier`(`auto` 대 `standard_only`)로 매핑합니다.
- Anthropic 참고: Anthropic 직원들이 OpenClaw 방식의 Claude CLI 사용이 다시 허용된다고 알려왔기 때문에, Anthropic이 새 정책을 게시하지 않는 한 OpenClaw는 Claude CLI 재사용과 `claude -p` 사용을 이 통합에 대해 허용된 것으로 취급합니다.
- Anthropic setup-token은 여전히 지원되는 OpenClaw 토큰 경로로 남아 있지만, 이제 OpenClaw는 가능할 때 Claude CLI 재사용과 `claude -p`를 우선합니다.
- 직접 공개 Anthropic 요청은 공유 `/fast` 토글과 `params.fastMode`도 지원하며, 여기에는 `api.anthropic.com`으로 전송되는 API-key 및 OAuth 인증 트래픽이 포함됩니다. OpenClaw는 이를 Anthropic `service_tier`(`auto` 대 `standard_only`)로 매핑합니다
- Anthropic 참고: Anthropic 직원이 OpenClaw 스타일 Claude CLI 사용이 다시 허용된다고 알려왔으므로, Anthropic이 새 정책을 게시하지 않는 한 OpenClaw는 이 통합에 대해 Claude CLI 재사용과 `claude -p` 사용을 허용된 것으로 처리합니다.
- Anthropic setup-token은 여전히 지원되는 OpenClaw 토큰 경로로 제공되지만, OpenClaw는 이제 가능하면 Claude CLI 재사용과 `claude -p`를 우선합니다.
```json5
{
@ -208,16 +295,17 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- 인증: OAuth (ChatGPT)
- 예시 모델: `openai-codex/gpt-5.4`
- CLI: `openclaw onboard --auth-choice openai-codex` 또는 `openclaw models auth login --provider openai-codex`
- 기본 transport는 `auto`입니다(WebSocket 우선, SSE fallback).
- 모델별`agents.defaults.models["openai-codex/<model>"].params.transport`를 통해 override할 수 있습니다(`"sse"`, `"websocket"`, 또는 `"auto"`).
- `params.serviceTier`도 네이티브 Codex Responses 요청(`chatgpt.com/backend-api`)에서 전달됩니다.
- 기본 transport는 `auto`입니다(WebSocket 우선, SSE 폴백)
- 모델별 override는 `agents.defaults.models["openai-codex/<model>"].params.transport`로 설정합니다(`"sse"`, `"websocket"`, 또는 `"auto"`)
- `params.serviceTier`도 네이티브 Codex Responses 요청(`chatgpt.com/backend-api`)에서 전달됩니다
- 숨겨진 OpenClaw attribution 헤더(`originator`, `version`,
`User-Agent`)는 일반 OpenAI 호환 프록시가 아니라
`chatgpt.com/backend-api`로 가는 네이티브 Codex 트래픽에만 첨부됩니다.
- 직접 `openai/*`와 동일한 `/fast` 토글 및 `params.fastMode` 구성을 공유하며, OpenClaw는 이를 `service_tier=priority`로 매핑합니다.
- `openai-codex/gpt-5.3-codex-spark`는 Codex OAuth 카탈로그가 이를 노출할 때 계속 사용할 수 있습니다. 사용 권한에 따라 달라집니다.
- `openai-codex/gpt-5.4`는 네이티브 `contextWindow = 1050000`과 기본 런타임 `contextTokens = 272000`을 유지합니다. 런타임 상한은 `models.providers.openai-codex.models[].contextTokens`로 override하세요.
- 정책 참고: OpenAI Codex OAuth는 OpenClaw 같은 외부 도구/워크플로에 대해 명시적으로 지원됩니다.
`chatgpt.com/backend-api`로 가는 네이티브 Codex 트래픽에만
첨부됩니다
- 직접 `openai/*`와 같은 `/fast` 토글 및 `params.fastMode` config를 공유하며, OpenClaw는 이를 `service_tier=priority`로 매핑합니다
- `openai-codex/gpt-5.3-codex-spark`는 Codex OAuth catalog가 이를 노출할 때 계속 사용할 수 있습니다. entitlement에 따라 달라집니다
- `openai-codex/gpt-5.4`는 네이티브 `contextWindow = 1050000`과 기본 런타임 `contextTokens = 272000`을 유지합니다. 런타임 상한은 `models.providers.openai-codex.models[].contextTokens`로 override하세요
- 정책 참고: OpenAI Codex OAuth는 OpenClaw 같은 외부 도구/워크플로우에 대해 명시적으로 지원됩니다.
```json5
{
@ -261,40 +349,40 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- Provider: `google`
- 인증: `GEMINI_API_KEY`
- 선택적 로테이션: `GEMINI_API_KEYS`, `GEMINI_API_KEY_1`, `GEMINI_API_KEY_2`, `GOOGLE_API_KEY` fallback, 그리고 `OPENCLAW_LIVE_GEMINI_KEY`(단일 override)
- 선택적 로테이션: `GEMINI_API_KEYS`, `GEMINI_API_KEY_1`, `GEMINI_API_KEY_2`, `GOOGLE_API_KEY` 폴백, 그리고 `OPENCLAW_LIVE_GEMINI_KEY`(단일 override)
- 예시 모델: `google/gemini-3.1-pro-preview`, `google/gemini-3-flash-preview`
- 호환성: `google/gemini-3.1-flash-preview`를 사용하는 레거시 OpenClaw 구성은 `google/gemini-3-flash-preview`로 정규화됩니다.
- 호환성: `google/gemini-3.1-flash-preview`를 사용하는 레거시 OpenClaw config는 `google/gemini-3-flash-preview`로 정규화됩니다
- CLI: `openclaw onboard --auth-choice gemini-api-key`
- 직접 Gemini 실행은 `agents.defaults.models["google/<model>"].params.cachedContent`
(또는 레거시 `cached_content`)도 허용하 provider 네이티브
`cachedContents/...` 핸들을 전달합니다. Gemini 캐시 적중은 OpenClaw `cacheRead`로 표시됩니다.
(또는 레거시 `cached_content`)도 허용하며, provider 네이티브
`cachedContents/...` 핸들을 전달합니다. Gemini cache hit는 OpenClaw `cacheRead`로 표시됩니다
### Google Vertex 및 Gemini CLI
- Provider: `google-vertex`, `google-gemini-cli`
- 인증: Vertex는 gcloud ADC를 사용하고 Gemini CLI는 자체 OAuth 흐름을 사용합니다.
- 주의: OpenClaw의 Gemini CLI OAuth는 비공식 통합입니다. 일부 사용자는 타사 클라이언트를 사용한 뒤 Google 계정 제한을 보고했습니다. 진행하기로 한다면 Google 약관을 검토하고 중요하지 않은 계정을 사용하세요.
- 인증: Vertex는 gcloud ADC 사용, Gemini CLI는 자체 OAuth 흐름 사용
- 주의: OpenClaw에서의 Gemini CLI OAuth는 비공식 통합입니다. 일부 사용자는 서드파티 클라이언트를 사용한 뒤 Google 계정 제한을 보고했습니다. 진행하기로 선택했다면 Google 약관을 검토하고 중요하지 않은 계정을 사용하세요.
- Gemini CLI OAuth는 번들된 `google` plugin의 일부로 제공됩니다.
- 먼저 Gemini CLI를 설치합니다.
- 먼저 Gemini CLI를 설치하세요:
- `brew install gemini-cli`
- 또는 `npm install -g @google/gemini-cli`
- 활성화: `openclaw plugins enable google`
- 로그인: `openclaw models auth login --provider google-gemini-cli --set-default`
- 기본 모델: `google-gemini-cli/gemini-3-flash-preview`
- 참고: `openclaw.json`에 client id 또는 secret을 붙여 넣지 **않습니다**. CLI 로그인 흐름은
토큰을 gateway host의 인증 프로필에 저장합니다.
- 로그인 후 요청이 실패하면 gateway host에 `GOOGLE_CLOUD_PROJECT` 또는 `GOOGLE_CLOUD_PROJECT_ID`를 설정하세요.
- Gemini CLI JSON 응답은 `response`에서 파싱되며, 사용량은 `stats`로 fallback하고
`stats.cached`는 OpenClaw `cacheRead`로 정규화됩니다.
- 참고: `openclaw.json`에 client id secret을 붙여 넣지 **않습니다**. CLI 로그인 흐름은
게이트웨이 호스트의 인증 profile에 토큰을 저장합니다.
- 로그인 후 요청이 실패하면 게이트웨이 호스트에서 `GOOGLE_CLOUD_PROJECT` 또는 `GOOGLE_CLOUD_PROJECT_ID`를 설정하세요.
- Gemini CLI JSON 응답은 `response`에서 파싱되며, 사용량은
`stats`로 폴백되고, `stats.cached`는 OpenClaw `cacheRead`로 정규화됩니다.
### Z.AI (GLM)
- Provider: `zai`
- 인증: `ZAI_API_KEY`
- 예시 모델: `zai/glm-5`
- 예시 모델: `zai/glm-5.1`
- CLI: `openclaw onboard --auth-choice zai-api-key`
- 별칭: `z.ai/*``z-ai/*``zai/*`로 정규화됩니다.
- `zai-api-key`는 일치하는 Z.AI 엔드포인트를 자동 감지하며, `zai-coding-global`, `zai-coding-cn`, `zai-global`, `zai-cn`은 특정 표면을 강제로 사용합니다.
- Alias: `z.ai/*``z-ai/*``zai/*`로 정규화됩니다
- `zai-api-key`는 일치하는 Z.AI 엔드포인트를 자동 감지하며, `zai-coding-global`, `zai-coding-cn`, `zai-global`, `zai-cn`은 특정 표면을 강제합니다
### Vercel AI Gateway
@ -309,38 +397,39 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- 인증: `KILOCODE_API_KEY`
- 예시 모델: `kilocode/kilo/auto`
- CLI: `openclaw onboard --auth-choice kilocode-api-key`
- Base URL: `https://api.kilo.ai/api/gateway/`
- 정적 fallback 카탈로그는 `kilocode/kilo/auto`를 포함하며, live
`https://api.kilo.ai/api/gateway/models` 조회는 런타임
카탈로그를 더 확장할 수 있습니다.
- `kilocode/kilo/auto` 뒤의 정확한 업스트림 라우팅은 OpenClaw에 하드코딩되지 않고
Kilo Gateway가 소유합니다.
- 기본 URL: `https://api.kilo.ai/api/gateway/`
- 정적 폴백 catalog는 `kilocode/kilo/auto`를 포함하며, 라이브
`https://api.kilo.ai/api/gateway/models` 발견을 통해 런타임
catalog가 더 확장될 수 있습니다.
- `kilocode/kilo/auto` 뒤의 정확한 업스트림 라우팅은 OpenClaw에
하드코딩되어 있지 않고 Kilo Gateway가 소유합니다.
설정 세부 정보는 [/providers/kilocode](/ko/providers/kilocode)를 참조하세요.
설정 세부 사항은 [/providers/kilocode](/ko/providers/kilocode)를 참고하세요.
### 기타 번들 provider plugin
- OpenRouter: `openrouter` (`OPENROUTER_API_KEY`)
- 예시 모델: `openrouter/auto`
- OpenClaw는 요청이 실제로 `openrouter.ai`를 대상으로 할 때만 OpenRouter 문서화 앱 attribution 헤더를 적용합니다.
- OpenRouter 전용 Anthropic `cache_control` 마커도 임의 프록시 URL이 아니라
검증된 OpenRouter 경로에서만 활성화됩니다.
- OpenRouter는 프록시 스타일 OpenAI 호환 경로를 유지하므로 네이티브
OpenAI 전용 요청 형태 지정(`serviceTier`, Responses `store`,
prompt-cache 힌트, OpenAI reasoning-compat 페이로드)은 전달되지 않습니다.
- Gemini 기반 OpenRouter ref는 프록시-Gemini thought-signature 정리만 유지하며,
네이티브 Gemini 재생 검증과 부트스트랩 재작성은 비활성 상태로 유지됩니다.
- OpenClaw는 요청이 실제로 `openrouter.ai`를 대상으로 할 때만
OpenRouter 문서의 앱 attribution 헤더를 적용합니다
- OpenRouter 전용 Anthropic `cache_control` 마커도
임의의 프록시 URL이 아니라 검증된 OpenRouter 경로에만 적용됩니다
- OpenRouter는 프록시 스타일 OpenAI 호환 경로에 남아 있으므로 네이티브
OpenAI 전용 요청 shaping(`serviceTier`, Responses `store`,
prompt-cache 힌트, OpenAI reasoning-compat payload)은 전달되지 않습니다
- Gemini 기반 OpenRouter ref는 프록시 Gemini thought-signature 정리만
유지하며, 네이티브 Gemini replay 검증과 bootstrap 재작성은 비활성화됩니다
- Kilo Gateway: `kilocode` (`KILOCODE_API_KEY`)
- 예시 모델: `kilocode/kilo/auto`
- Gemini 기반 Kilo ref는 동일한 프록시-Gemini thought-signature
정리 경로를 유지하며, `kilocode/kilo/auto`기타 프록시 reasoning 미지원
힌트는 프록시 reasoning 주입을 건너뜁니다.
- Gemini 기반 Kilo ref도 동일한 프록시 Gemini thought-signature
정리 경로를 유지하며, `kilocode/kilo/auto`다른 proxy-reasoning-unsupported
힌트는 프록시 reasoning 주입을 건너뜁니다
- MiniMax: `minimax`(API 키) 및 `minimax-portal`(OAuth)
- 인증: `minimax``MINIMAX_API_KEY`, `minimax-portal` `MINIMAX_OAUTH_TOKEN` 또는 `MINIMAX_API_KEY`
- 인증: `minimax`에는 `MINIMAX_API_KEY`; `minimax-portal`에는 `MINIMAX_OAUTH_TOKEN` 또는 `MINIMAX_API_KEY`
- 예시 모델: `minimax/MiniMax-M2.7` 또는 `minimax-portal/MiniMax-M2.7`
- MiniMax 온보딩/API 키 설정은 명시적 M2.7 모델 정의를
`input: ["text", "image"]`와 함께 기록합니다. 번들 provider 카탈로그는
해당 provider 구성이 구체화될 때까지 채팅 ref를 텍스트 전용으로 유지합니다.
- MiniMax 온보딩/API 키 설정은 명시적 M2.7 모델 정의를
`input: ["text", "image"]`와 함께 기록합니다. 번들된 provider catalog는 해당 provider config가 materialize될 때까지
채팅 ref를 텍스트 전용으로 유지합니다
- Moonshot: `moonshot` (`MOONSHOT_API_KEY`)
- 예시 모델: `moonshot/kimi-k2.5`
- Kimi Coding: `kimi` (`KIMI_API_KEY` 또는 `KIMICODE_API_KEY`)
@ -366,12 +455,12 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- BytePlus: `byteplus` (`BYTEPLUS_API_KEY`)
- 예시 모델: `byteplus-plan/ark-code-latest`
- xAI: `xai` (`XAI_API_KEY`)
- 네이티브 번들 xAI 요청은 xAI Responses 경로를 사용합니다.
- 네이티브 번들 xAI 요청은 xAI Responses 경로를 사용합니다
- `/fast` 또는 `params.fastMode: true``grok-3`, `grok-3-mini`,
`grok-4`, `grok-4-0709`를 해당 `*-fast` 변형으로 재작성합니다.
- `tool_stream`은 기본적으로 활성화됩니다.
`agents.defaults.models["xai/<model>"].params.tool_stream``false`로 설정하
비활성화됩니다.
`grok-4`, `grok-4-0709`를 해당 `*-fast` variant로 재작성합니다
- `tool_stream`은 기본 활성화되어 있습니다.
비활성화하려
`agents.defaults.models["xai/<model>"].params.tool_stream``false`로 설정하세요
- Mistral: `mistral` (`MISTRAL_API_KEY`)
- 예시 모델: `mistral/mistral-large-latest`
- CLI: `openclaw onboard --auth-choice mistral-api-key`
@ -380,21 +469,22 @@ OpenClaw는 piai 카탈로그를 제공합니다. 이러한 provider는 **아
- Cerebras의 GLM 모델은 `zai-glm-4.7``zai-glm-4.6` id를 사용합니다.
- OpenAI 호환 base URL: `https://api.cerebras.ai/v1`.
- GitHub Copilot: `github-copilot` (`COPILOT_GITHUB_TOKEN` / `GH_TOKEN` / `GITHUB_TOKEN`)
- Hugging Face Inference 예시 모델: `huggingface/deepseek-ai/DeepSeek-R1`; CLI: `openclaw onboard --auth-choice huggingface-api-key`. [Hugging Face (Inference)](/ko/providers/huggingface)를 참하세요.
- Hugging Face Inference 예시 모델: `huggingface/deepseek-ai/DeepSeek-R1`; CLI: `openclaw onboard --auth-choice huggingface-api-key`. [Hugging Face (Inference)](/ko/providers/huggingface)를 참하세요.
## `models.providers`를 통한 provider (custom/base URL)
## `models.providers`를 통한 provider (커스텀/base URL)
`models.providers`(또는 `models.json`)를 사용해 **custom** provider 또는
OpenAI/Anthropic 호환 프록시를 추가하세요.
**커스텀** provider 또는
OpenAI/Anthropic 호환 프록시를 추가하려면 `models.providers`(또는 `models.json`)를 사용하세요.
아래의 번들 provider plugin 중 다수는 이미 기본 카탈로그를 게시합니다.
아래의 많은 번들 provider plugin은 이미 기본 catalog를 게시합니다.
기본 base URL, 헤더 또는 모델 목록을 override하려는 경우에만
명시적 `models.providers.<id>` 항목을 사용하세요.
명시적 `models.providers.<id>` 항목을 사용하세요.
### Moonshot AI (Kimi)
Moonshot은 번들 provider plugin으로 제공됩니다. 기본적으로 내장 provider를 사용하고,
base URL 또는 모델 메타데이터를 override해야 할 때만 명시적 `models.providers.moonshot` 항목을 추가하세요.
Moonshot은 번들 provider plugin으로 제공됩니다. 기본적으로 내장 provider를
사용하고, base URL 또는 모델 메타데이터를 override해야 할 때만
명시적인 `models.providers.moonshot` 항목을 추가하세요.
- Provider: `moonshot`
- 인증: `MOONSHOT_API_KEY`
@ -448,13 +538,13 @@ Kimi Coding은 Moonshot AI의 Anthropic 호환 엔드포인트를 사용합니
}
```
레거시 `kimi/k2p5`여전히 호환성 모델 id로 허용됩니다.
레거시 `kimi/k2p5`는 호환성 모델 id로 계속 허용됩니다.
### Volcano Engine (Doubao)
Volcano Engine(화산엔진, 火山引擎)은 중국에서 Doubao 및 기타 모델에 대한 액세스를 제공합니다.
Volcano Engine(화산엔진)은 중국에서 Doubao 및 기타 모델에 대한 액세스를 제공합니다.
- Provider: `volcengine`(코딩: `volcengine-plan`)
- Provider: `volcengine` (coding: `volcengine-plan`)
- 인증: `VOLCANO_ENGINE_API_KEY`
- 예시 모델: `volcengine-plan/ark-code-latest`
- CLI: `openclaw onboard --auth-choice volcengine-api-key`
@ -467,12 +557,13 @@ Volcano Engine(화산엔진, 火山引擎)은 중국에서 Doubao 및 기타 모
}
```
온보딩은 기본적으로 코딩 표면을 사용하지만, 일반 `volcengine/*`
카탈로그도 동시에 등록됩니다.
온보딩은 기본적으로 coding 표면을 사용하지만, 일반 `volcengine/*`
catalog도 동시에 등록됩니다.
온보딩/모델 구성 picker에서 Volcengine 인증 선택은
`volcengine/*``volcengine-plan/*` 행을 모두 우선합니다. 아직 해당 모델이 로드되지 않았다면,
OpenClaw는 비어 있는 provider 범위 picker를 표시하는 대신 필터링되지 않은 카탈로그로 fallback합니다.
`volcengine/*``volcengine-plan/*` 행을 모두 우선합니다. 해당 모델이 아직 로드되지 않았다면
OpenClaw는 provider 범위 picker가 비어 보이지 않도록
필터링되지 않은 catalog로 폴백합니다.
사용 가능한 모델:
@ -482,7 +573,7 @@ OpenClaw는 비어 있는 provider 범위 picker를 표시하는 대신 필터
- `volcengine/glm-4-7-251222` (GLM 4.7)
- `volcengine/deepseek-v3-2-251201` (DeepSeek V3.2 128K)
코딩 모델(`volcengine-plan`):
Coding 모델(`volcengine-plan`):
- `volcengine-plan/ark-code-latest`
- `volcengine-plan/doubao-seed-code`
@ -490,11 +581,11 @@ OpenClaw는 비어 있는 provider 범위 picker를 표시하는 대신 필터
- `volcengine-plan/kimi-k2-thinking`
- `volcengine-plan/glm-4.7`
### BytePlus (국제)
### BytePlus (International)
BytePlus ARK는 국제 사용자를 위해 Volcano Engine과 동일한 모델에 대한 액세스를 제공합니다.
- Provider: `byteplus`(코딩: `byteplus-plan`)
- Provider: `byteplus` (coding: `byteplus-plan`)
- 인증: `BYTEPLUS_API_KEY`
- 예시 모델: `byteplus-plan/ark-code-latest`
- CLI: `openclaw onboard --auth-choice byteplus-api-key`
@ -507,12 +598,13 @@ BytePlus ARK는 국제 사용자를 위해 Volcano Engine과 동일한 모델에
}
```
온보딩은 기본적으로 코딩 표면을 사용하지만, 일반 `byteplus/*`
카탈로그도 동시에 등록됩니다.
온보딩은 기본적으로 coding 표면을 사용하지만, 일반 `byteplus/*`
catalog도 동시에 등록됩니다.
온보딩/모델 구성 picker에서 BytePlus 인증 선택은
`byteplus/*``byteplus-plan/*` 행을 모두 우선합니다. 아직 해당 모델이 로드되지 않았다면,
OpenClaw는 비어 있는 provider 범위 picker를 표시하는 대신 필터링되지 않은 카탈로그로 fallback합니다.
`byteplus/*``byteplus-plan/*` 행을 모두 우선합니다. 해당 모델이 아직 로드되지 않았다면
OpenClaw는 provider 범위 picker가 비어 보이지 않도록
필터링되지 않은 catalog로 폴백합니다.
사용 가능한 모델:
@ -520,7 +612,7 @@ OpenClaw는 비어 있는 provider 범위 picker를 표시하는 대신 필터
- `byteplus/kimi-k2-5-260127` (Kimi K2.5)
- `byteplus/glm-4-7-251222` (GLM 4.7)
코딩 모델(`byteplus-plan`):
Coding 모델(`byteplus-plan`):
- `byteplus-plan/ark-code-latest`
- `byteplus-plan/doubao-seed-code`
@ -558,22 +650,22 @@ Synthetic는 `synthetic` provider 뒤에서 Anthropic 호환 모델을 제공합
### MiniMax
MiniMax는 custom 엔드포인트를 사용하므로 `models.providers`를 통해 구성합니다.
MiniMax는 커스텀 엔드포인트를 사용하므로 `models.providers`를 통해 구성합니다.
- MiniMax OAuth(글로벌): `--auth-choice minimax-global-oauth`
- MiniMax OAuth(CN): `--auth-choice minimax-cn-oauth`
- MiniMax API 키(글로벌): `--auth-choice minimax-global-api`
- MiniMax API 키(CN): `--auth-choice minimax-cn-api`
- 인증: `minimax``MINIMAX_API_KEY`, `minimax-portal``MINIMAX_OAUTH_TOKEN`
`MINIMAX_API_KEY`
- MiniMax OAuth (Global): `--auth-choice minimax-global-oauth`
- MiniMax OAuth (CN): `--auth-choice minimax-cn-oauth`
- MiniMax API 키 (Global): `--auth-choice minimax-global-api`
- MiniMax API 키 (CN): `--auth-choice minimax-cn-api`
- 인증: `minimax``MINIMAX_API_KEY`, `minimax-portal`
`MINIMAX_OAUTH_TOKEN` 또는 `MINIMAX_API_KEY`
설정 세부 정보, 모델 옵션, 구성 스니펫은 [/providers/minimax](/ko/providers/minimax)를 참조하세요.
설정 세부 사항, 모델 옵션, config snippet은 [/providers/minimax](/ko/providers/minimax)를 참고하세요.
MiniMax의 Anthropic 호환 스트리밍 경로에서 OpenClaw는
명시적으로 설정하지 않으면 기본적으로 thinking을 비활성화하며, `/fast on`
MiniMax의 Anthropic 호환 스트리밍 경로에서는 OpenClaw가 thinking을
명시적으로 설정하지 않는 한 기본적으로 비활성화하며, `/fast on`
`MiniMax-M2.7``MiniMax-M2.7-highspeed`로 재작성합니다.
plugin 소유 capability 분리:
Plugin 소유 capability 분리:
- 텍스트/채팅 기본값은 `minimax/MiniMax-M2.7`에 유지
- 이미지 생성은 `minimax/image-01` 또는 `minimax-portal/image-01`
@ -590,7 +682,7 @@ Ollama는 번들 provider plugin으로 제공되며 Ollama의 네이티브 API
- 설치: [https://ollama.com/download](https://ollama.com/download)
```bash
# Ollama를 설치한 다음 모델을 가져옵니다:
# Ollama를 설치한 다음 모델을 pull하세요:
ollama pull llama3.3
```
@ -602,27 +694,27 @@ ollama pull llama3.3
}
```
`OLLAMA_API_KEY`로 opt-in하면 Ollama는 로컬의 `http://127.0.0.1:11434`에서 감지되며,
번들 provider plugin이 Ollama를 직접
`openclaw onboard`와 모델 picker에 추가합니다. 온보딩, 클라우드/로컬 모드, custom 구성은 [/providers/ollama](/ko/providers/ollama)를
참조하세요.
Ollama는 `OLLAMA_API_KEY`로 opt in하면 로컬 `http://127.0.0.1:11434`에서
감지되며, 번들 provider plugin이 Ollama를 직접
`openclaw onboard`와 모델 picker에 추가합니다. 온보딩, cloud/local 모드,
커스텀 구성은 [/providers/ollama](/ko/providers/ollama)를 참고하세요.
### vLLM
vLLM은 로컬/self-hosted OpenAI 호환
서버 번들 provider plugin으로 제공됩니다.
vLLM은 로컬/셀프호스트 OpenAI 호환
서버를 위한 번들 provider plugin으로 제공됩니다.
- Provider: `vllm`
- 인증: 선택 사항(서버에 따라 다름)
- 기본 base URL: `http://127.0.0.1:8000/v1`
로컬에서 auto-discovery를 opt-in하려면(서버가 인증을 강제하지 않는 경우 아무 값이나 가능):
로컬에서 자동 감지를 opt in하려면(서버가 인증을 강제하지 않으면 아무 값이나 가능):
```bash
export VLLM_API_KEY="vllm-local"
```
그런 다음 모델을 설정합니다(`/v1/models`가 반환하는 ID 중 하나로 교체):
그런 다음 모델을 설정하세요(`/v1/models`가 반환하는 ID 중 하나로 교체):
```json5
{
@ -632,25 +724,25 @@ export VLLM_API_KEY="vllm-local"
}
```
자세한 내용은 [/providers/vllm](/ko/providers/vllm)을 참하세요.
자세한 내용은 [/providers/vllm](/ko/providers/vllm)을 참하세요.
### SGLang
SGLang은 빠른 self-hosted
OpenAI 호환 서버 번들 provider plugin으로 제공됩니다.
SGLang은 빠른 셀프호스트
OpenAI 호환 서버를 위한 번들 provider plugin으로 제공됩니다.
- Provider: `sglang`
- 인증: 선택 사항(서버에 따라 다름)
- 기본 base URL: `http://127.0.0.1:30000/v1`
로컬에서 auto-discovery를 opt-in하려면(서버가 인증을 강제하지
않는 경우 아무 값이나 가능):
로컬에서 자동 감지를 opt in하려면(서버가 인증을
강제하지 않으면 아무 값이나 가능):
```bash
export SGLANG_API_KEY="sglang-local"
```
그런 다음 모델을 설정합니다(`/v1/models`가 반환하는 ID 중 하나로 교체):
그런 다음 모델을 설정하세요(`/v1/models`가 반환하는 ID 중 하나로 교체):
```json5
{
@ -660,7 +752,7 @@ export SGLANG_API_KEY="sglang-local"
}
```
자세한 내용은 [/providers/sglang](/ko/providers/sglang)을 참하세요.
자세한 내용은 [/providers/sglang](/ko/providers/sglang)을 참하세요.
### 로컬 프록시(LM Studio, vLLM, LiteLLM 등)
@ -699,21 +791,21 @@ export SGLANG_API_KEY="sglang-local"
참고:
- custom provider의 경우 `reasoning`, `input`, `cost`, `contextWindow`, `maxTokens`는 선택 사항입니다.
생략하면 OpenClaw는 다음 기본값을 사용합니다.
- 커스텀 provider의 경우 `reasoning`, `input`, `cost`, `contextWindow`, `maxTokens`는 선택 사항입니다.
생략하면 OpenClaw는 기본적으로 다음 값을 사용합니다:
- `reasoning: false`
- `input: ["text"]`
- `cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }`
- `contextWindow: 200000`
- `maxTokens: 8192`
- 권장: 프록시/모델 한에 맞는 명시적 값을 설정하세요.
- 네이티브가 아닌 엔드포인트의 `api: "openai-completions"`(호스트가 `api.openai.com`이 아닌 비어 있지 않은 `baseUrl`)에 대해서는, OpenClaw가 지원되지 않는 `developer` 역할로 인한 provider 400 오류를 피하기 위해 `compat.supportsDeveloperRole: false`를 강제합니다.
- 프록시 스타일 OpenAI 호환 경로는 네이티브 OpenAI 전용 요청 형태 지정도 건너뜁니다.
`service_tier` 없음, Responses `store` 없음, prompt-cache 힌트 없음,
OpenAI reasoning-compat 페이로드 형태 지정 없음, 숨겨진 OpenClaw attribution
- 권장: 프록시/모델 한에 맞는 명시적 값을 설정하세요.
- 비네이티브 엔드포인트(`api.openai.com`이 아닌 호스트를 가진 비어 있지 않은 `baseUrl`)의 `api: "openai-completions"`에 대해 OpenClaw는 지원되지 않는 `developer` 역할로 인한 provider 400 오류를 피하기 위해 `compat.supportsDeveloperRole: false`를 강제로 적용합니다.
- 프록시 스타일 OpenAI 호환 경로도 네이티브 OpenAI 전용 요청
shaping을 건너뜁니다: `service_tier` 없음, Responses `store` 없음, prompt-cache 힌트 없음,
OpenAI reasoning-compat payload shaping 없음, 숨겨진 OpenClaw attribution
헤더 없음.
- `baseUrl`이 비어 있거나 생략되면 OpenClaw는 기본 OpenAI 동작을 유지합니다(`api.openai.com`으로 해됨).
- 안전을 위해 명시적 `compat.supportsDeveloperRole: true` 네이티브가 아닌 `openai-completions` 엔드포인트에서는 여전히 override됩니다.
- `baseUrl`이 비어 있거나 생략되면 OpenClaw는 기본 OpenAI 동작을 유지합니다(`api.openai.com`으로 해됨).
- 안전을 위해 비네이티브 `openai-completions` 엔드포인트에서는 명시적 `compat.supportsDeveloperRole: true`도 여전히 override됩니다.
## CLI 예시
@ -723,11 +815,11 @@ openclaw models set opencode/claude-opus-4-6
openclaw models list
```
전체 구성 예시는 [/gateway/configuration](/ko/gateway/configuration)도 참하세요.
전체 구성 예시는 [/gateway/configuration](/ko/gateway/configuration)도 참하세요.
## 관련 항목
- [Models](/ko/concepts/models) — 모델 구성 및 별칭
- [Model Failover](/ko/concepts/model-failover) — fallback 체인 및 재시도 동작
- [Configuration Reference](/ko/gateway/configuration-reference#agent-defaults) — 모델 구성
- [Models](/ko/concepts/models) — 모델 구성 및 alias
- [Model Failover](/ko/concepts/model-failover) — 폴백 체인과 재시도 동작
- [Configuration Reference](/ko/gateway/configuration-reference#agent-defaults) — 모델 config
- [Providers](/ko/providers) — provider별 설정 가이드

View File

@ -1,15 +1,15 @@
---
read_when:
- qa-lab 또는 qa-channel을 확장할 때
- 리포지토리 기반 QA 시나리오를 추가할 때
- Gateway 대시보드를 중심으로 더 높은 현실성의 QA 자동화를 구축할 때
summary: qa-lab, qa-channel, 시드된 시나리오, 프로토콜 보고서를 위한 비공개 QA 자동화 형태
- qa-lab 또는 qa-channel 확장 시
- 리포지토리 기반 QA 시나리오 추가 시
- Gateway 대시보드 주변에 더 높은 현실성의 QA 자동화를 구축할 때
summary: qa-lab, qa-channel, 시드된 시나리오, 프로토콜 보고서를 위한 비공개 QA 자동화 구조
title: QA E2E 자동화
x-i18n:
generated_at: "2026-04-08T02:14:01Z"
generated_at: "2026-04-08T05:55:40Z"
model: gpt-5.4
provider: openai
source_hash: 3b4aa5acc8e77303f4045d4f04372494cae21b89d2fdaba856dbb4855ced9d27
source_hash: 57da147dc06abf9620290104e01a83b42182db1806514114fd9e8467492cda99
source_path: concepts/qa-e2e-automation.md
workflow: 15
---
@ -23,15 +23,15 @@ x-i18n:
- `extensions/qa-channel`: DM, 채널, 스레드,
반응, 수정, 삭제 표면을 갖춘 합성 메시지 채널
- `extensions/qa-lab`: 트랜스크립트를 관찰하고,
- `extensions/qa-lab`: 대화 기록을 관찰하고,
인바운드 메시지를 주입하며, Markdown 보고서를 내보내기 위한 디버거 UI 및 QA 버스
- `qa/`: 시작 작업과 기준 QA
시나리오를 위한 리포지토리 기반 시드 자산
현재 QA 운영자 흐름은 2패널로 구성된 QA 사이트입니다:
현재 QA 운영자 흐름은 2패널 QA 사이트입니다:
- 왼쪽: 에이전트가 있는 Gateway 대시보드(Control UI)
- 오른쪽: Slack와 비슷한 트랜스크립트와 시나리오 계획을 보여주는 QA Lab
- 오른쪽: Slack과 유사한 대화 기록 및 시나리오 계획을 보여주는 QA Lab
다음으로 실행합니다:
@ -40,11 +40,11 @@ pnpm qa:lab:up
```
이 명령은 QA 사이트를 빌드하고, Docker 기반 gateway 레인을 시작하며, 운영자 또는 자동화 루프가 에이전트에 QA
미션을 부여하고, 실제 채널 동작을 관찰하며, 무엇이 작동했고 무엇이 실패했으며 무엇이
여전히 막혀 있는지 기록할 수 있는 QA Lab 페이지를 노출합니다.
미션을 전달하고, 실제 채널 동작을 관찰하며, 무엇이 성공했고 실패했으며
무엇이 계속 막혀 있었는지 기록할 수 있는 QA Lab 페이지를 노출합니다.
매번 Docker 이미지를 다시 빌드하지 않고 더 빠르게 QA Lab UI를 반복 개발하려면,
바인드 마운트된 QA Lab 번들과 함께 스택을 시작하세요:
바인드 마운트된 QA Lab 번들 스택을 시작하세요:
```bash
pnpm openclaw qa docker-build-image
@ -53,18 +53,19 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast`는 Docker 서비스를 사전 빌드된 이미지로 유지하고
`qa:lab:up:fast`사전 빌드된 이미지에서 Docker 서비스를 유지하고
`extensions/qa-lab/web/dist``qa-lab` 컨테이너에 바인드 마운트합니다. `qa:lab:watch`
변경 시 해당 번들을 다시 빌드하며, QA Lab 자산 해시가 변경되면 브라우저가 자동으로 다시 로드됩니다.
변경 시 해당 번들을 다시 빌드하며, QA Lab 자산 해시가 바뀌면 브라우저가 자동으로 다시 로드됩니다.
## 리포지토리 기반 시드
시드 자산은 `qa/`에 있습니다:
- `qa/scenarios.md`
- `qa/scenarios/index.md`
- `qa/scenarios/*.md`
항목들은 QA 계획이 사람과
에이전트 모두에게 보이도록 의도적으로 git에 포함되어 있습니다. 기준 목록은 다음을 포괄할 만큼 충분히 넓어야 합니다:
이들은 QA 계획이 사람과
에이전트 모두에게 보이도록 의도적으로 git에 포함니다. 기준 목록은 다음을 포괄할 만큼 충분히 넓게 유지되어야 합니다:
- DM 및 채널 채팅
- 스레드 동작
@ -74,12 +75,12 @@ pnpm qa:lab:watch
- 모델 전환
- 서브에이전트 핸드오프
- 리포지토리 읽기 및 문서 읽기
- Lobster Invaders 같은 작은 빌드 작업 하나
- Lobster Invaders 같은 작은 빌드 작업 하나
## 보고
`qa-lab`은 관찰된 버스 타임라인에서 Markdown 프로토콜 보고서를 내보냅니다.
보고서는 다음 질문에 답해야 합니다:
보고서는 다음에 답해야 합니다:
- 무엇이 작동했는가
- 무엇이 실패했는가
@ -88,6 +89,6 @@ pnpm qa:lab:watch
## 관련 문서
- [테스](/ko/help/testing)
- [테스](/ko/help/testing)
- [QA 채널](/ko/channels/qa-channel)
- [대시보드](/web/dashboard)

View File

@ -1,31 +1,31 @@
---
read_when:
- 채널에서 스트리밍 또는 청킹이 어떻게 동작하는지 설명할 때
- 채널에서 스트리밍 또는 청킹이 작동하는 방식을 설명할 때
- 블록 스트리밍 또는 채널 청킹 동작을 변경할 때
- 중복/조기 블록 답장 또는 채널 미리보기 스트리밍을 디버깅할 때
- 중복되거나 이른 블록 답장 또는 채널 미리보기 스트리밍을 디버깅할 때
summary: 스트리밍 + 청킹 동작(블록 답장, 채널 미리보기 스트리밍, 모드 매핑)
title: 스트리밍 청킹
title: 스트리밍 청킹
x-i18n:
generated_at: "2026-04-05T12:41:12Z"
generated_at: "2026-04-08T05:55:57Z"
model: gpt-5.4
provider: openai
source_hash: 44b0d08c7eafcb32030ef7c8d5719c2ea2d34e4bac5fdad8cc8b3f4e9e9fad97
source_hash: a8e847bb7da890818cd79dec7777f6ae488e6d6c0468e948e56b6b6c598e0000
source_path: concepts/streaming.md
workflow: 15
---
# 스트리밍 + 청킹
OpenClaw에는 서로 분리된 두 개의 스트리밍 계층이 있습니다:
OpenClaw에는 서로 분리된 두 가지 스트리밍 계층이 있습니다.
- **블록 스트리밍(채널):** assistant가 작성하는 동안 완료된 **블록**을 전송합니다. 이는 일반 채널 메시지이며(토큰 델타 아님).
- **미리보기 스트리밍(Telegram/Discord/Slack):** 생성 중 임시 **미리보기 메시지**를 업데이트합니다.
- **블록 스트리밍(채널):** 어시스턴트가 작성하는 동안 완료된 **블록**을 내보냅니다. 이는 일반 채널 메시지이며(토큰 델타 아님)입니다.
- **미리보기 스트리밍(Telegram/Discord/Slack):** 생성 중 임시 **미리보기 메시지**를 업데이트합니다.
현재 채널 메시지에는 **진정한 토큰 델타 스트리밍이 없습니다**. 미리보기 스트리밍은 메시지 기반입니다(전송 + 편집/추가).
현재 채널 메시지에는 **진정한 토큰 델타 스트리밍이 없습니다**. 미리보기 스트리밍은 메시지 기반입니다(`send` + `edits/appends`).
## 블록 스트리밍(채널 메시지)
블록 스트리밍은 assistant 출력이 준비되는 대로 거친 청크 단위로 전송합니다.
블록 스트리밍은 어시스턴트 출력이 준비되는 대로 비교적 큰 청크로 전송합니다.
```
Model output
@ -39,77 +39,77 @@ Model output
범례:
- `text_delta/events`: 모델 스트림 이벤트(비스트리밍 모델에서는 드물 수 있음).
- `text_delta/events`: 모델 스트림 이벤트(스트리밍하지 않는 모델의 경우 드물 수 있음).
- `chunker`: 최소/최대 경계 + 분할 선호도를 적용하는 `EmbeddedBlockChunker`.
- `channel send`: 실제 발신 메시지(블록 답장).
**제어 항목:**
- `agents.defaults.blockStreamingDefault`: `"on"`/`"off"`(기본값 꺼짐).
- `agents.defaults.blockStreamingDefault`: `"on"`/`"off"` (기본값: off).
- 채널 재정의: 채널별로 `"on"`/`"off"`를 강제하는 `*.blockStreaming`(및 계정별 변형).
- `agents.defaults.blockStreamingBreak`: `"text_end"` 또는 `"message_end"`.
- `agents.defaults.blockStreamingChunk`: `{ minChars, maxChars, breakPreference? }`.
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }`(전송 전에 스트리밍된 블록 병합).
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }` (전송 전에 스트리밍된 블록 병합).
- 채널 하드 상한: `*.textChunkLimit`(예: `channels.whatsapp.textChunkLimit`).
- 채널 청크 모드: `*.chunkMode`(`length`가 기본값, `newline`은 길이 기 청킹 전에 빈 줄(문단 경계)에서 분할).
- Discord 소프트 상한: `channels.discord.maxLinesPerMessage`(기본값 17)는 UI 잘림을 방지하기 위해 긴 답장을 분할합니다.
- 채널 청크 모드: `*.chunkMode`(`length`가 기본값, `newline`은 길이 기 청킹 전에 빈 줄(문단 경계)에서 분할).
- Discord 소프트 상한: `channels.discord.maxLinesPerMessage`(기본값 17)는 UI 잘림을 하기 위해 긴 답장을 분할합니다.
**경계 의미:**
- `text_end`: chunker가 방출하는 즉시 스트림 블록을 전송하고`text_end`에서 flush합니다.
- `message_end`: assistant 메시지가 끝날 때까지 기다린 뒤 버퍼된 출력을 flush합니다.
- `text_end`: chunker가 내보내는 즉시 블록을 스트리밍하고,`text_end`에서 flush합니다.
- `message_end`: 어시스턴트 메시지가 끝날 때까지 기다린 뒤, 버퍼링된 출력을 flush합니다.
`message_end`도 버퍼된 텍스트가 `maxChars`를 초과하면 여전히 chunker를 사용하므로 마지막에 여러 청크를 방출할 수 있습니다.
`message_end`도 버퍼된 텍스트가 `maxChars`를 초과하면 여전히 chunker를 사용하므로, 끝에서 여러 청크를 내보낼 수 있습니다.
## 청킹 알고리즘(하한/상한)
블록 청킹은 `EmbeddedBlockChunker`로 구현됩니다:
블록 청킹은 `EmbeddedBlockChunker`에서 구현됩니다.
- **하한:** 버퍼가 `minChars` 이상이 되기 전에는 방출하지 않습니다(강제되는 경우 제외).
- **상한:** 가능하면 `maxChars` 전에 분할합니다. 강제되는 경우 `maxChars`에서 분할합니다.
- **하한:** 버퍼가 `minChars` 이상이 될 때까지 내보내지 않습니다(강제되는 경우 제외).
- **상한:** `maxChars` 이전에서 분할을 우선 시도하며, 강제되면 `maxChars`에서 분할합니다.
- **분할 선호도:** `paragraph``newline``sentence``whitespace` → 강제 분할.
- **코드 펜스:** 펜스 내부에서는 절대 분할하지 않습니다. `maxChars`에서 강제 분할될 때는 Markdown 유효성을 유지하기 위해 펜스를 닫고 다시 엽니다.
- **코드 펜스:** 펜스 내부에서는 절대 분할하지 않으며, `maxChars`에서 강제 분할할 때는 Markdown 유효성을 유지하기 위해 펜스를 닫았다가 다시 엽니다.
`maxChars`는 채널 `textChunkLimit`로 제한되므로 채널별 상한을 초과할 수 없습니다.
`maxChars`는 채널 `textChunkLimit`에 맞춰 제한되므로, 채널별 상한을 초과할 수 없습니다.
## 병합(coalescing, 스트리밍된 블록 병합)
## 코얼레싱(스트리밍된 블록 병합)
블록 스트리밍이 활성화되면 OpenClaw는 **연속된 블록 청크를 병합한 후**
전송할 수 있습니다. 이렇게 하면 진행형 출력을 유지하면서도
블록 스트리밍이 활성화되면, OpenClaw는 연속된 블록 청크를 **병합**
한 뒤 전송할 수 있습니다. 이렇게 하면 점진적 출력을 유지하면서도
“한 줄짜리 스팸”을 줄일 수 있습니다.
- 병합은 flush 전에 **유휴 간격**(`idleMs`)을 기다립니다.
- 코얼레싱은 flush 전에 **유휴 간격**(`idleMs`)을 기다립니다.
- 버퍼는 `maxChars`로 제한되며, 이를 초과하면 flush됩니다.
- `minChars`는 충분한 텍스트가 누적될 때까지 작은 조각이 전송되지 않도록 합니다
(최종 flush는 항상 남은 텍스트를 전송).
- 결자는 `blockStreamingChunk.breakPreference`에서 파생됩니다
(최종 flush는 항상 남은 텍스트를 전송합니다).
- 결자는 `blockStreamingChunk.breakPreference`에서 파생됩니다
(`paragraph` → `\n\n`, `newline``\n`, `sentence` → 공백).
- `*.blockStreamingCoalesce`를 통한 채널 재정의도 사용할 수 있습니다(계정별 config 포함).
- 재정의되지 않은 경우 Signal/Slack/Discord의 기본 coalesce `minChars`는 1500으로 올라갑니다.
- `*.blockStreamingCoalesce`를 통한 채널 재정의가 가능합니다(계정별 구성 포함).
- 재정의하지 않으면 Signal/Slack/Discord의 기본 coalesce `minChars`는 1500으로 상향 조정됩니다.
## 블록 간 사람 같은 페이싱
블록 스트리밍이 활성화되면 블록 답장 사이에 **무작위 일시 정지**를 추가할 수 있습니다
(첫 번째 블록 이후). 이렇게 하면 여러 버블로 나뉜 응답이
자연스럽게 느껴집니다.
블록 스트리밍이 활성화되면, 블록 답장 사이에 **무작위 지연**을 추가할 수
있습니다(첫 번째 블록 이후). 이렇게 하면 여러 말풍선으로 된 응답이 더
자연스럽게 느껴집니다.
- config: `agents.defaults.humanDelay`(에이전트별 재정의: `agents.list[].humanDelay`).
- 설정: `agents.defaults.humanDelay`(에이전트별 재정의: `agents.list[].humanDelay`).
- 모드: `off`(기본값), `natural`(8002500ms), `custom`(`minMs`/`maxMs`).
- **블록 답장**에만 적용되며, 최종 답장이나 도구 요약에는 적용되지 않습니다.
## "청크로 스트리밍할지 전부 보낼지"
## "청크 스트리밍 또는 전체 전송"
이는 다음에 매핑됩니다:
이는 다음에 매핑됩니다.
- **청크 스트리밍:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"`(작성하면서 전송). Telegram이 아닌 채널은 `*.blockStreaming: true`도 필요합니다.
- **마지막에 전부 스트리밍:** `blockStreamingBreak: "message_end"`(한 번 flush, 매우 길면 여러 청크 가능).
- **블록 스트리밍 없음:** `blockStreamingDefault: "off"`(최종 답장만 전송).
- **청크 스트리밍:** `blockStreamingDefault: "on"` + `blockStreamingBreak: "text_end"`(생성하면서 내보냄). Telegram이 아닌 채널은 `*.blockStreaming: true`도 필요합니다.
- **끝에서 전체 스트리밍:** `blockStreamingBreak: "message_end"`(한 번 flush, 매우 길면 여러 청크일 수 있음).
- **블록 스트리밍 없음:** `blockStreamingDefault: "off"`(최종 답장만).
**채널 참고:** 블록 스트리밍은 `*.blockStreaming`
명시적으로 `true`로 설정되지 않으면 **비활성화**됩니다. 채널은 블록 답장 없이도
실시간 미리보기(`channels.<channel>.streaming`)를 스트리밍할 수 있습니다.
**채널 참고:** 블록 스트리밍은 `*.blockStreaming` 명시적으로 `true`
설정되지 않으면 **비활성화** 상태입니다. 채널은 블록 답장 없이도
라이브 미리보기(`channels.<channel>.streaming`)를 스트리밍할 수 있습니다.
config 위치 참고: `blockStreaming*` 기본값은 루트 config가 아니라
설정 위치 참고: `blockStreaming*` 기본값은 루트 설정이 아니라
`agents.defaults` 아래에 있습니다.
## 미리보기 스트리밍 모드
@ -120,12 +120,12 @@ config 위치 참고: `blockStreaming*` 기본값은 루트 config가 아니라
- `off`: 미리보기 스트리밍 비활성화.
- `partial`: 최신 텍스트로 교체되는 단일 미리보기.
- `block`: 청크/추가 단계로 업데이트되는 미리보기.
- `progress`: 생성 중 진행/상태 미리보기, 완료 시 최종 답변.
- `block`: 청크/추가 단계로 미리보기를 업데이트.
- `progress`: 생성 중 진행/상태 미리보기를 표시하고, 완료 시 최종 답변 전송.
### 채널 매핑
| 채널 | `off` | `partial` | `block` | `progress` |
| Channel | `off` | `partial` | `block` | `progress` |
| -------- | ----- | --------- | ------- | ----------------- |
| Telegram | ✅ | ✅ | ✅ | `partial`로 매핑 |
| Discord | ✅ | ✅ | ✅ | `partial`로 매핑 |
@ -133,13 +133,14 @@ config 위치 참고: `blockStreaming*` 기본값은 루트 config가 아니라
Slack 전용:
- `channels.slack.nativeStreaming``streaming=partial`일 때 Slack 기본 스트리밍 API 호출을 전환합니다(기본값: `true`).
- `channels.slack.streaming.nativeTransport``channels.slack.streaming.mode="partial"`일 때 Slack 기본 스트리밍 API 호출 사용 여부를 전환합니다(기본값: `true`).
- Slack 기본 스트리밍과 Slack 어시스턴트 스레드 상태는 답장 스레드 대상이 있어야 합니다. 최상위 DM에서는 해당 스레드 스타일 미리보기가 표시되지 않습니다.
레거시 키 마이그레이션:
- Telegram: `streamMode` + 불리언 `streaming`은 자동으로 `streaming` enum으로 마이그레이션됩니다.
- Discord: `streamMode` + 불리언 `streaming`은 자동으로 `streaming` enum으로 마이그레이션됩니다.
- Slack: `streamMode`자동으로 `streaming` enum으로 마이그레이션되며, 불리언 `streaming`은 자동으로 `nativeStreaming`으로 마이그레이션됩니다.
- Telegram: `streamMode`와 불리언 `streaming``streaming` enum으로 자동 마이그레이션됩니다.
- Discord: `streamMode`와 불리언 `streaming``streaming` enum으로 자동 마이그레이션됩니다.
- Slack: `streamMode``streaming.mode`로 자동 마이그레이션되고, 불리언 `streaming``streaming.mode``streaming.nativeTransport`로 자동 마이그레이션되며, 레거시 `nativeStreaming``streaming.nativeTransport`로 자동 마이그레이션됩니다.
### 런타임 동작
@ -147,7 +148,7 @@ Telegram:
- DM과 그룹/토픽 전반에서 `sendMessage` + `editMessageText` 미리보기 업데이트를 사용합니다.
- Telegram 블록 스트리밍이 명시적으로 활성화된 경우 미리보기 스트리밍은 건너뜁니다(이중 스트리밍 방지).
- `/reasoning stream`reasoning을 미리보기에 쓸 수 있습니다.
- `/reasoning stream`추론 내용을 미리보기에 쓸 수 있습니다.
Discord:
@ -157,12 +158,12 @@ Discord:
Slack:
- `partial`사용 가능한 경우 Slack 기본 스트리밍(`chat.startStream`/`append`/`stop`)을 사용할 수 있습니다.
- `partial`가능할 때 Slack 기본 스트리밍(`chat.startStream`/`append`/`stop`)을 사용할 수 있습니다.
- `block`은 추가형 초안 미리보기를 사용합니다.
- `progress`는 상태 미리보기 텍스트를 사용한 뒤 완료 시 최종 답변을 전송합니다.
- `progress`는 상태 미리보기 텍스트를 사용한 뒤, 최종 답변을 전송합니다.
## 관련
- [Messages](/concepts/messages) — 메시지 수명 주기 및 전달
- [Retry](/concepts/retry) — 전달 실패 시 재시도 동작
- [Channels](/channels) — 채널별 스트리밍 지원
- [메시지](/ko/concepts/messages) — 메시지 수명 주기와 전달
- [재시도](/ko/concepts/retry) — 전달 실패 시 재시도 동작
- [채널](/ko/channels) — 채널별 스트리밍 지원

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,36 @@
---
read_when:
- OpenClaw를 처음 설정하는 중
- 일반적인 구성 패턴을 찾는 중
- 특정 config 섹션으로 이동하는 중
- 처음으로 OpenClaw 설정하기
- 일반적인 구성 패턴 찾기
- 특정 구성 섹션으로 이동하기
summary: '구성 개요: 일반적인 작업, 빠른 설정, 전체 참조 링크'
title: Configuration
title: 구성
x-i18n:
generated_at: "2026-04-05T12:42:55Z"
generated_at: "2026-04-08T05:56:44Z"
model: gpt-5.4
provider: openai
source_hash: a39a7de09c5f9540785ec67f37d435a7a86201f0f5f640dae663054f35976712
source_hash: 199a1e515bd4003319e71593a2659bb883299a76ff67e273d92583df03c96604
source_path: gateway/configuration.md
workflow: 15
---
# Configuration
# 구성
OpenClaw는 `~/.openclaw/openclaw.json`에서 선택적 <Tooltip tip="JSON5는 주석과 후행 쉼표를 지원합니다">**JSON5**</Tooltip> config를 읽습니다.
OpenClaw는 `~/.openclaw/openclaw.json`에서 선택적 <Tooltip tip="JSON5는 주석과 후행 쉼표를 지원합니다">**JSON5**</Tooltip> 구성을 읽습니다.
파일이 없으면 OpenClaw는 안전한 기본값을 사용합니다. config를 추가하는 일반적인 이유는 다음과 같습니다.
파일이 없으면 OpenClaw는 안전한 기본값을 사용합니다. 구성을 추가하는 일반적인 이유는 다음과 같습니다.
- 채널을 연결하고 누가 봇에 메시지를 보낼 수 있는지 제어
- 모델, 도구, 샌드박싱 또는 자동화(cron, hooks) 설정
- 세션, 미디어, 네트워킹 또는 UI 조정
사용 가능한 모든 필드는 [full reference](/gateway/configuration-reference)를 참조하세요.
사용 가능한 모든 필드는 [전체 참조](/ko/gateway/configuration-reference)에서 확인하세요.
<Tip>
**구성이 처음이신가요?** 대화형 설정에는 `openclaw onboard`로 시작하거나, 완전한 복사-붙여넣기 config는 [Configuration Examples](/gateway/configuration-examples) 가이드를 확인하세요.
**구성이 처음이신가요?** 대화형 설정을 위해 `openclaw onboard`로 시작하거나, 완전한 복사-붙여넣기 구성은 [구성 예시](/ko/gateway/configuration-examples) 가이드를 확인하세요.
</Tip>
## 최소 config
## 최소 구성
```json5
// ~/.openclaw/openclaw.json
@ -40,16 +40,16 @@ OpenClaw는 `~/.openclaw/openclaw.json`에서 선택적 <Tooltip tip="JSON5는
}
```
## config 편집
## 구성 편집
<Tabs>
<Tab title="대화형 마법사">
```bash
openclaw onboard # 전체 온보딩 흐름
openclaw configure # config 마법사
openclaw configure # 구성 마법사
```
</Tab>
<Tab title="CLI (원라이너)">
<Tab title="CLI (한 줄 명령)">
```bash
openclaw config get agents.defaults.workspace
openclaw config set agents.defaults.heartbeat.every "2h"
@ -58,63 +58,57 @@ OpenClaw는 `~/.openclaw/openclaw.json`에서 선택적 <Tooltip tip="JSON5는
</Tab>
<Tab title="Control UI">
[http://127.0.0.1:18789](http://127.0.0.1:18789)을 열고 **Config** 탭을 사용하세요.
Control UI는 사용 가능한 경우 field
`title` / `description` 문서 메타데이터와 plugin 및 channel 스키마를 포함해 라이브 config 스키마에서 폼을 렌더링하며,
탈출구로 **Raw JSON** 편집기도 제공합니다. 드릴다운
UI 및 기타 도구용으로 gateway는
`config.schema.lookup`도 노출하여 경로 범위 스키마 노드 하나와 직접 자식 요약을 가져올 수 있습니다.
Control UI는 라이브 config 스키마로부터 폼을 렌더링하며, 사용 가능한 경우
필드 `title` / `description` 문서 메타데이터와 plugin 및 channel 스키마를 포함하고,
탈출구로 사용할 수 있는 **Raw JSON** 편집기도 제공합니다. 드릴다운 UI와
기타 도구를 위해 gateway는 `config.schema.lookup`도 제공하며,
경로 범위가 지정된 스키마 노드 하나와 즉시 하위 요약을 가져올 수 있습니다.
</Tab>
<Tab title="직접 편집">
`~/.openclaw/openclaw.json`을 직접 편집하세요. Gateway는 파일을 감시하며 변경 사항을 자동으로 적용합니다([hot reload](#config-hot-reload) 참조).
`~/.openclaw/openclaw.json`을 직접 편집하세요. Gateway는 파일을 감시하고 변경 사항을 자동으로 적용합니다([핫 리로드](#config-hot-reload) 참조).
</Tab>
</Tabs>
## 엄격한 검증
<Warning>
OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알 수 없는 키, 잘못된 타입, 또는 유효하지 않은 값이 있으면 Gateway는 **시작을 거부**합니다. 루트 수준의 유일한 예외는 편집기가 JSON Schema 메타데이터를 붙일 수 있도록 하는 `$schema`(문자열)입니다.
OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알 수 없는 키, 잘못된 타입, 유효하지 않은 값이 있으면 Gateway는 **시작을 거부합니다**. 루트 수준의 유일한 예외는 편집기가 JSON Schema 메타데이터를 연결할 수 있도록 하는 `$schema`(문자열)입니다.
</Warning>
스키마 도구 참고:
스키마 도구 참고 사항:
- `openclaw config schema`는 Control UI와
config 검증에서 사용하는 동일한 JSON Schema 계열을 출력합니다.
- Field `title``description` 값은 편집기 및 폼 도구를 위해
스키마 출력에도 포함됩니다.
- 중첩 객체, 와일드카드(`*`), 배열 항목(`[]`) 항목도
일치하는 field 문서가 있는 경우 동일한 문서 메타데이터를 상속합니다.
- `anyOf` / `oneOf` / `allOf` 구성 분기도 동일한 문서
메타데이터를 상속하므로 union/intersection 변형에서도 같은 field 도움말을 유지합니다.
- `config.schema.lookup`은 정규화된 config 경로 하나와 얕은
스키마 노드(`title`, `description`, `type`, `enum`, `const`, 공통 경계값,
및 유사한 검증 필드), 일치하는 UI 힌트 메타데이터, 드릴다운 도구용 즉시 자식
요약을 반환합니다.
- 런타임 plugin/channel 스키마는 gateway가 현재
manifest 레지스트리를 로드할 수 있을 때 병합됩니다.
- `openclaw config schema`는 Control UI와 config 검증에서 사용하는 것과 동일한 JSON Schema 계열을 출력합니다.
- 해당 스키마 출력은 `openclaw.json`의 표준 기계 판독 계약으로 취급하세요. 이 개요와 구성 참조는 이를 요약한 것입니다.
- 필드 `title``description` 값은 편집기와 폼 도구를 위해 스키마 출력에 포함됩니다.
- 중첩 객체, 와일드카드(`*`), 배열 항목(`[]`) 항목은 일치하는 필드 문서가 존재하는 경우 동일한 문서 메타데이터를 상속합니다.
- `anyOf` / `oneOf` / `allOf` 구성 분기 역시 동일한 문서 메타데이터를 상속하므로, union/intersection 변형도 같은 필드 도움말을 유지합니다.
- `config.schema.lookup`은 정규화된 config 경로 하나와 얕은 스키마 노드(`title`, `description`, `type`, `enum`, `const`, 일반적인 경계값 및 유사한 검증 필드), 일치하는 UI 힌트 메타데이터, 그리고 드릴다운 도구를 위한 즉시 하위 요약을 반환합니다.
- runtime plugin/channel 스키마는 gateway가 현재 manifest 레지스트리를 로드할 수 있을 때 병합됩니다.
- `pnpm config:docs:check`는 문서용 config 기준 아티팩트와 현재 스키마 표면 간의 드리프트를 감지합니다.
검증 실패 시:
검증에 실패하면:
- Gateway는 부팅되지 않습니다
- 진단 명령만 동작합니다(`openclaw doctor`, `openclaw logs`, `openclaw health`, `openclaw status`)
- 정확한 문제를 보려면 `openclaw doctor`를 실행하세요
- 수정을 적용하려면 `openclaw doctor --fix`(또는 `--yes`) 실행하세요
- Gateway가 부팅되지 않음
- 진단 명령만 작동함(`openclaw doctor`, `openclaw logs`, `openclaw health`, `openclaw status`)
- 정확한 문제를 확인하려면 `openclaw doctor` 실행
- 수정을 적용하려면 `openclaw doctor --fix`(또는 `--yes`) 실행
## 일반적인 작업
<AccordionGroup>
<Accordion title="채널 설정하기(WhatsApp, Telegram, Discord 등)">
각 채널은 `channels.<provider>` 아래에 자체 config 섹션을 가집니다. 설정 단계는 전용 채널 페이지를 참조하세요.
<Accordion title="채널 설정하기 (WhatsApp, Telegram, Discord 등)">
각 채널은 `channels.<provider>` 아래에 자체 구성 섹션을 가집니다. 설정 단계는 전용 채널 페이지를 참조하세요.
- [WhatsApp](/channels/whatsapp) — `channels.whatsapp`
- [Telegram](/channels/telegram) — `channels.telegram`
- [Discord](/channels/discord) — `channels.discord`
- [Feishu](/channels/feishu) — `channels.feishu`
- [Google Chat](/channels/googlechat) — `channels.googlechat`
- [Microsoft Teams](/channels/msteams) — `channels.msteams`
- [Slack](/channels/slack) — `channels.slack`
- [Signal](/channels/signal) — `channels.signal`
- [iMessage](/channels/imessage) — `channels.imessage`
- [Mattermost](/channels/mattermost) — `channels.mattermost`
- [WhatsApp](/ko/channels/whatsapp) — `channels.whatsapp`
- [Telegram](/ko/channels/telegram) — `channels.telegram`
- [Discord](/ko/channels/discord) — `channels.discord`
- [Feishu](/ko/channels/feishu) — `channels.feishu`
- [Google Chat](/ko/channels/googlechat) — `channels.googlechat`
- [Microsoft Teams](/ko/channels/msteams) — `channels.msteams`
- [Slack](/ko/channels/slack) — `channels.slack`
- [Signal](/ko/channels/signal) — `channels.signal`
- [iMessage](/ko/channels/imessage) — `channels.imessage`
- [Mattermost](/ko/channels/mattermost) — `channels.mattermost`
모든 채널은 동일한 DM 정책 패턴을 공유합니다.
@ -134,7 +128,7 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
</Accordion>
<Accordion title="모델 선택 및 구성">
기본 모델과 선택적 폴백을 설정하세요.
기본 모델과 선택적 폴백을 설정합니다.
```json5
{
@ -153,30 +147,30 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
}
```
- `agents.defaults.models`는 모델 카탈로그를 정의하며 `/model`allowlist 역할도 합니다.
- `agents.defaults.models`는 모델 카탈로그를 정의하며 `/model`허용 목록 역할도 합니다.
- 모델 참조는 `provider/model` 형식을 사용합니다(예: `anthropic/claude-opus-4-6`).
- `agents.defaults.imageMaxDimensionPx`기록/도구 이미지 다운스케일링을 제어합니다(기본값 `1200`). 값이 낮을수록 스크린샷이 많은 실행에서 비전 토큰 사용량이 줄어드는 경우가 많습니다.
- 채팅에서 모델 전환은 [Models CLI](/concepts/models)를, 인증 회전 및 폴백 동작은 [Model Failover](/concepts/model-failover)를 참조하세요.
- 커스텀/self-hosted providers는 참조 문서의 [Custom providers](/gateway/configuration-reference#custom-providers-and-base-urls)를 참조하세요.
- `agents.defaults.imageMaxDimensionPx`transcript/tool 이미지 축소 크기 조정을 제어합니다(기본값 `1200`). 값을 낮추면 스크린샷이 많은 실행에서 일반적으로 비전 토큰 사용량이 줄어듭니다.
- 채팅에서 모델 전환은 [Models CLI](/ko/concepts/models), 인증 순환 및 폴백 동작은 [Model Failover](/ko/concepts/model-failover)를 참조하세요.
- 사용자 지정/자체 호스팅 provider는 참조 문서의 [사용자 지정 provider](/ko/gateway/configuration-reference#custom-providers-and-base-urls)를 참조하세요.
</Accordion>
<Accordion title="누가 봇에 메시지를 보낼 수 있는지 제어">
DM 액세스는 채널별 `dmPolicy` 제어됩니다.
DM 접근은 채널별로 `dmPolicy`를 통해 제어됩니다.
- `"pairing"` (기본값): 알 수 없는 발신자는 승인할 일회용 페어링 코드를 받습니다
- `"allowlist"`: `allowFrom`(또는 페어링 allow 저장소)에 있는 발신자만 허용
- `"pairing"` (기본값): 알 수 없는 발신자는 승인을 위한 일회성 페어링 코드를 받음
- `"allowlist"`: `allowFrom`(또는 페어링된 허용 저장소)에 있는 발신자만 허용
- `"open"`: 모든 수신 DM 허용(`allowFrom: ["*"]` 필요)
- `"disabled"`: 모든 DM 무시
그룹의 경우 `groupPolicy` + `groupAllowFrom` 또는 채널별 allowlist를 사용하세요.
그룹의 경우 `groupPolicy` + `groupAllowFrom` 또는 채널별 허용 목록을 사용하세요.
채널별 세부 사항은 [full reference](/gateway/configuration-reference#dm-and-group-access)를 참조하세요.
채널별 세부 사항은 [전체 참조](/ko/gateway/configuration-reference#dm-and-group-access)를 참조하세요.
</Accordion>
<Accordion title="그룹 채팅 mention 게이팅 설정">
그룹 메시지는 기본적으로 **mention 필요**입니다. 에이전트별로 패턴을 구성하세요.
<Accordion title="그룹 채팅 멘션 게이팅 설정">
그룹 메시지는 기본적으로 **멘션 필요**입니다. 에이전트별 패턴을 구성하세요.
```json5
{
@ -198,15 +192,14 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
}
```
- **메타데이터 mention**: 네이티브 @mention(WhatsApp 탭-투-멘션, Telegram @bot 등)
- **메타데이터 멘션**: 네이티브 @멘션(WhatsApp 탭하여 멘션, Telegram @bot 등)
- **텍스트 패턴**: `mentionPatterns`의 안전한 정규식 패턴
- 채널별 재정의 및 self-chat mode는 [full reference](/gateway/configuration-reference#group-chat-mention-gating)를 참조하세요.
- 채널별 재정의와 self-chat 모드는 [전체 참조](/ko/gateway/configuration-reference#group-chat-mention-gating)를 참조하세요.
</Accordion>
<Accordion title="에이전트별 Skills 제한">
공유 기준선에는 `agents.defaults.skills`를 사용하고, 특정
에이전트 재정의에는 `agents.list[].skills`를 사용하세요.
공유 기준선에는 `agents.defaults.skills`를 사용하고, 특정 에이전트는 `agents.list[].skills`로 재정의하세요.
```json5
{
@ -223,11 +216,10 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
}
```
- 기본적으로 Skills를 제한하지 않으려`agents.defaults.skills`를 생략하세요.
- 기본적으로 제한 없는 Skills를 원하`agents.defaults.skills`를 생략하세요.
- 기본값을 상속하려면 `agents.list[].skills`를 생략하세요.
- Skills를 사용하지 않으려면 `agents.list[].skills: []`를 설정하세요.
- [Skills](/tools/skills), [Skills config](/tools/skills-config), 그리고
[Configuration Reference](/gateway/configuration-reference#agentsdefaultsskills)를 참조하세요.
- Skills가 없도록 하려면 `agents.list[].skills: []`를 설정하세요.
- [Skills](/ko/tools/skills), [Skills config](/ko/tools/skills-config), 그리고 [구성 참조](/ko/gateway/configuration-reference#agentsdefaultsskills)를 참조하세요.
</Accordion>
@ -256,13 +248,13 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
- 전역적으로 상태 모니터 재시작을 비활성화하려면 `gateway.channelHealthCheckMinutes: 0`을 설정하세요.
- `channelStaleEventThresholdMinutes`는 검사 간격보다 크거나 같아야 합니다.
- 전역 모니터를 끄지 않고 특정 채널 또는 account의 자동 재시작을 비활성화하려면 `channels.<provider>.healthMonitor.enabled` 또는 `channels.<provider>.accounts.<id>.healthMonitor.enabled`를 사용하세요.
- 운영 디버깅은 [Health Checks](/gateway/health), 모든 field는 [full reference](/gateway/configuration-reference#gateway)를 참조하세요.
- 전역 모니터를 끄지 않고 특정 채널 또는 계정의 자동 재시작만 끄려면 `channels.<provider>.healthMonitor.enabled` 또는 `channels.<provider>.accounts.<id>.healthMonitor.enabled`를 사용하세요.
- 운영 디버깅은 [상태 검사](/ko/gateway/health), 모든 필드는 [전체 참조](/ko/gateway/configuration-reference#gateway)를 참조하세요.
</Accordion>
<Accordion title="세션 및 리셋 구성">
세션은 대화 연속성과 격리를 제어합니다.
세션은 대화 연속성과 격리를 제어합니다.
```json5
{
@ -283,9 +275,9 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
```
- `dmScope`: `main` (공유) | `per-peer` | `per-channel-peer` | `per-account-channel-peer`
- `threadBindings`: 스레드 바인딩 세션 라우팅 전역 기본값(Discord는 `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` 지원).
- 범위, identity 링크, 전송 정책은 [Session Management](/concepts/session)를 참조하세요.
- 모든 field는 [full reference](/gateway/configuration-reference#session)를 참조하세요.
- `threadBindings`: 스레드 바인딩 세션 라우팅 전역 기본값(Discord는 `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age` 지원).
- 범위, identity 링크, send 정책은 [세션 관리](/ko/concepts/session)를 참조하세요.
- 모든 필드는 [전체 참조](/ko/gateway/configuration-reference#session)를 참조하세요.
</Accordion>
@ -307,12 +299,12 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
먼저 이미지를 빌드하세요: `scripts/sandbox-setup.sh`
전체 가이드는 [Sandboxing](/gateway/sandboxing), 모든 옵션은 [full reference](/gateway/configuration-reference#agentsdefaultssandbox)를 참조하세요.
전체 가이드는 [샌드박싱](/ko/gateway/sandboxing), 모든 옵션은 [전체 참조](/ko/gateway/configuration-reference#agentsdefaultssandbox)를 참조하세요.
</Accordion>
<Accordion title="공식 iOS 빌드를 위한 relay 기반 push 활성화">
Relay 기반 push`openclaw.json`에서 구성합니다.
<Accordion title="공식 iOS 빌드를 위한 relay 기반 푸시 활성화">
relay 기반 푸시`openclaw.json`에서 구성합니다.
gateway config에 다음을 설정하세요.
@ -338,37 +330,37 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
openclaw config set gateway.push.apns.relay.baseUrl https://relay.example.com
```
것이 하는 일:
설정의 역할:
- gateway가 외부 relay를 통해 `push.test`, wake nudges, reconnect wakes를 보낼 수 있게 합니다.
- 페어링된 iOS 앱이 전달한 registration 범위 send grant를 사용합니다. gateway에는 배포 전역 relay 토큰이 필요하지 않습니다.
- 각 relay 기반 registration을 iOS 앱이 페어링한 gateway identity에 바인딩하므로 다른 gateway가 저장된 registration을 재사용할 수 없습니다.
- 로컬/수동 iOS 빌드는 direct APNs를 계속 사용합니다. Relay 기반 전송은 relay를 통해 등록한 공식 배포 빌드에만 적용됩니다.
- registration과 send 트래픽이 동일한 relay 배포에 도달하도록, 공식/TestFlight iOS 빌드에 내장된 relay base URL과 일치해야 합니다.
- 페어링된 iOS 앱이 전달한 등록 범위 send grant를 사용합니다. gateway에는 배포 전체 범위의 relay 토큰이 필요하지 않습니다.
- 각 relay 기반 등록을 iOS 앱이 페어링한 gateway identity에 바인딩하므로, 다른 gateway는 저장된 등록을 재사용할 수 없습니다.
- 로컬/수동 iOS 빌드는 direct APNs를 유지합니다. relay 기반 전송은 relay를 통해 등록된 공식 배포 빌드에만 적용됩니다.
- 등록 및 전송 트래픽이 동일한 relay 배포에 도달하도록, 공식/TestFlight iOS 빌드에 내장된 relay base URL과 일치해야 합니다.
엔드투엔드 흐름:
종단 간 흐름:
1. 동일한 relay base URL로 컴파일된 공식/TestFlight iOS 빌드를 설치합니다.
2. gateway에 `gateway.push.apns.relay.baseUrl`을 구성합니다.
3. iOS 앱을 gateway에 페어링하고 node operator 세션이 모두 연결되도록 합니다.
4. iOS 앱은 gateway identity를 가져오고, App Attest와 앱 영수증을 사용해 relay에 등록한 , relay 기반 `push.apns.register` 페이로드를 페어링된 gateway에 게시합니다.
5. gateway는 relay handle과 send grant를 저장한 뒤, 이를 `push.test`, wake nudges, reconnect wakes에 사용합니다.
2. gateway에 `gateway.push.apns.relay.baseUrl`을 구성합니다.
3. iOS 앱을 gateway에 페어링하고 node 세션과 operator 세션이 모두 연결되도록 합니다.
4. iOS 앱은 gateway identity를 가져오고, App Attest와 앱 영수증을 사용해 relay에 등록한 다음, relay 기반 `push.apns.register` 페이로드를 페어링된 gateway에 게시합니다.
5. gateway는 relay 핸들과 send grant를 저장하고, 이를 `push.test`, wake nudges, reconnect wakes에 사용합니다.
운영 참고:
운영 참고 사항:
- iOS 앱을 다른 gateway로 전환하면 앱을 다시 연결하여 새 gateway에 바인딩된 새 relay registration을 게시하게 하세요.
- 다른 relay 배포를 가리키는 새 iOS 빌드를 배포하면, 앱은 이전 relay origin을 재사용하는 대신 캐시된 relay registration을 새로 고칩니다.
- iOS 앱을 다른 gateway로 전환하는 경우, 앱이 해당 gateway에 바인딩된 새 relay 등록을 게시할 수 있도록 다시 연결하세요.
- 다른 relay 배포를 가리키는 새 iOS 빌드를 배포하는 경우, 앱은 이전 relay origin을 재사용하는 대신 캐시된 relay 등록을 갱신합니다.
호환성 참고:
- `OPENCLAW_APNS_RELAY_BASE_URL` `OPENCLAW_APNS_RELAY_TIMEOUT_MS`는 여전히 임시 env 재정의로 동합니다.
- `OPENCLAW_APNS_RELAY_ALLOW_HTTP=true`loopback 전용 개발용 탈출구로 유지됩니다. HTTP relay URL을 config에 영구 저장하지 마세요.
- `OPENCLAW_APNS_RELAY_BASE_URL` `OPENCLAW_APNS_RELAY_TIMEOUT_MS`는 여전히 임시 env 재정의로 동합니다.
- `OPENCLAW_APNS_RELAY_ALLOW_HTTP=true`계속 loopback 전용 개발용 탈출구로 남아 있으며, config에 HTTP relay URL을 영구 저장해서는 안 됩니다.
엔드투엔드 흐름은 [iOS App](/platforms/ios#relay-backed-push-for-official-builds), relay 보안 모델은 [Authentication and trust flow](/platforms/ios#authentication-and-trust-flow)를 참조하세요.
종단 간 흐름은 [iOS 앱](/ko/platforms/ios#relay-backed-push-for-official-builds), relay 보안 모델은 [인증 및 신뢰 흐름](/ko/platforms/ios#authentication-and-trust-flow)을 참조하세요.
</Accordion>
<Accordion title="heartbeat 설정(주기적 체크인)">
<Accordion title="heartbeat 설정하기 (주기적 체크인)">
```json5
{
agents: {
@ -384,8 +376,8 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
- `every`: 기간 문자열(`30m`, `2h`). 비활성화하려면 `0m` 설정.
- `target`: `last` | `none` | `<channel-id>` (예: `discord`, `matrix`, `telegram`, `whatsapp`)
- `directPolicy`: `allow` (기본값) 또는 DM 스타일 heartbeat 대상에는 `block`
- 전체 가이드는 [Heartbeat](/gateway/heartbeat)를 참조하세요.
- `directPolicy`: DM 스타일 heartbeat 대상에 대해 `allow`(기본값) 또`block`
- 전체 가이드는 [Heartbeat](/ko/gateway/heartbeat)를 참조하세요.
</Accordion>
@ -404,13 +396,13 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
}
```
- `sessionRetention`: 완료된 격리 실행 세션을 `sessions.json`에서 정리합니다(기본값 `24h`; 비활성화하려면 `false`).
- `runLog`: 크기와 보존 줄 수를 기준으로 `cron/runs/<jobId>.jsonl` 정리.
- 기능 개요와 CLI 예시는 [Cron jobs](/automation/cron-jobs)를 참조하세요.
- `sessionRetention`: 완료된 격리 실행 세션을 `sessions.json`에서 정리합니다(기본값 `24h`; 비활성화하려면 `false` 설정).
- `runLog`: 크기와 유지할 줄 수 기준으로 `cron/runs/<jobId>.jsonl` 정리합니다.
- 기능 개요와 CLI 예시는 [Cron 작업](/ko/automation/cron-jobs)을 참조하세요.
</Accordion>
<Accordion title="웹훅 설정(hooks)">
<Accordion title="webhook(hooks) 설정">
Gateway에서 HTTP webhook 엔드포인트를 활성화합니다.
```json5
@ -435,20 +427,20 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
```
보안 참고:
- 모든 hook/webhook 페이로드 콘텐츠는 신뢰되지 않은 입력으로 취급하세요.
- 모든 hook/webhook 페이로드 콘텐츠는 신뢰할 수 없는 입력으로 취급하세요.
- 전용 `hooks.token`을 사용하세요. 공유 Gateway 토큰을 재사용하지 마세요.
- Hook 인증은 헤더 전용입니다(`Authorization: Bearer ...` 또는 `x-openclaw-token`). 쿼리 문자열 토큰은 거부됩니다.
- `hooks.path``/`가 될 수 없습니다. webhook 유입은 `/hooks` 같은 전용 하위 경로에 두세요.
- tightly scoped debugging이 아닌 한, 안전하지 않은 콘텐츠 우회 플래그(`hooks.gmail.allowUnsafeExternalContent`, `hooks.mappings[].allowUnsafeExternalContent`)는 비활성화 상태로 유지하세요.
- `hooks.allowRequestSessionKey`를 활성화한다면 `hooks.allowedSessionKeyPrefixes`도 함께 설정해 호출자가 선택한 session key 범위를 제한하세요.
- hook 기반 에이전트에는 강한 최신 모델 티어와 엄격한 도구 정책(예: 가능한 경우 메시징 전용 + 샌드박싱)을 권장합니다.
- `hooks.path``/`가 될 수 없습니다. webhook 수신은 `/hooks` 같은 전용 하위 경로에 유지하세요.
- 엄격히 범위가 제한된 디버깅이 아닌 한, 안전하지 않은 콘텐츠 우회 플래그(`hooks.gmail.allowUnsafeExternalContent`, `hooks.mappings[].allowUnsafeExternalContent`)는 비활성화 상태로 유지하세요.
- `hooks.allowRequestSessionKey`를 활성화하는 경우, 호출자가 선택하는 세션 키의 범위를 제한하도록 `hooks.allowedSessionKeyPrefixes`도 설정하세요.
- hook 기반 에이전트에는 가능한 경우 강력한 최신 모델 등급과 엄격한 도구 정책(예: 메시징 전용 + 샌드박싱)을 권장합니다.
모든 매핑 옵션과 Gmail 통합은 [full reference](/gateway/configuration-reference#hooks)를 참조하세요.
모든 매핑 옵션과 Gmail 통합은 [전체 참조](/ko/gateway/configuration-reference#hooks)를 참조하세요.
</Accordion>
<Accordion title="다중 에이전트 라우팅 구성">
별도의 workspaces와 세션을 가진 여러 격리 에이전트를 실행합니다.
별도의 워크스페이스와 세션을 사용하는 여러 격리된 에이전트를 실행합니다.
```json5
{
@ -465,12 +457,12 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
}
```
바인딩 규칙과 에이전트별 액세스 프로필은 [Multi-Agent](/concepts/multi-agent) 및 [full reference](/gateway/configuration-reference#multi-agent-routing)를 참조하세요.
바인딩 규칙과 에이전트별 액세스 프로필은 [다중 에이전트](/ko/concepts/multi-agent)와 [전체 참조](/ko/gateway/configuration-reference#multi-agent-routing)를 참조하세요.
</Accordion>
<Accordion title="config를 여러 파일로 분리($include)">
configs를 정리하려면 `$include`를 사용하세요.
<Accordion title="구성을 여러 파일로 분할하기 ($include)">
구성을 정리하려면 `$include`를 사용하세요.
```json5
// ~/.openclaw/openclaw.json
@ -484,27 +476,27 @@ OpenClaw는 스키마와 완전히 일치하는 구성만 허용합니다. 알
```
- **단일 파일**: 포함하는 객체를 대체
- **파일 배열**: 순서대로 깊은 병합(나중 항목 우선)
- **형제 키**: include 뒤에 병합됨(포함된 값 재정의)
- **파일 배열**: 순서대로 깊은 병합(나중 것이 우선)
- **형제 키**: include 이후 병합됨(포함된 값 재정의)
- **중첩 include**: 최대 10단계까지 지원
- **상대 경로**: 포함하는 파일 기준으로 해석
- **오류 처리**: 누락 파일, 파싱 오류, 순환 include에 대해 명확한 오류 제공
- **상대 경로**: 포함하는 파일 기준으로 해석
- **오류 처리**: 누락된 파일, 구문 분석 오류, 순환 include에 대해 명확한 오류 제공
</Accordion>
</AccordionGroup>
## Config 핫 리로드
## config 핫 리로드
Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동 적용합니다 — 대부분의 설정에는 수동 재시작이 필요하지 않습니다.
Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동으로 적용합니다 — 대부분의 설정에는 수동 재시작이 필요하지 않습니다.
### 리로드 모드
| 모드 | 동작 |
| ---------------------- | ------------------------------------------------------------------------------------ |
| **`hybrid`** (기본값) | 안전한 변경은 즉시 핫 적용합니다. 중요한 변경은 자동으로 재시작합니다. |
| **`hot`** | 안전한 변경만 핫 적용합니다. 재시작이 필요할 때 경고를 기록하며 직접 처리해야 합니다. |
| **`restart`** | 안전 여부와 관계없이 모든 config 변경 시 Gateway를 재시작합니다. |
| **`off`** | 파일 감시를 비활성화합니다. 변경은 다음 수동 재시작 때 적용됩니다. |
| 모드 | 동작 |
| ---------------------- | --------------------------------------------------------------------------------------- |
| **`hybrid`** (기본값) | 안전한 변경은 즉시 핫 적용합니다. 중요한 변경은 자동으로 재시작합니다. |
| **`hot`** | 안전한 변경만 핫 적용합니다. 재시작이 필요하면 경고를 기록하며, 처리는 사용자가 해야 합니다. |
| **`restart`** | 안전 여부와 관계없이 모든 config 변경 시 Gateway를 재시작합니다. |
| **`off`** | 파일 감시를 비활성화합니다. 변경 사항은 다음 수동 재시작 시 적용됩니다. |
```json5
{
@ -516,44 +508,42 @@ Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동
### 핫 적용되는 항목과 재시작이 필요한 항목
대부분의 필드는 다운타임 없이 핫 적용됩니다. `hybrid` 모드에서는 재시작이 필요한 변경도 자동 처리됩니다.
대부분의 필드는 다운타임 없이 핫 적용됩니다. `hybrid` 모드에서는 재시작이 필요한 변경이 자동으로 처리됩니다.
| 범주 | 필드 | 재시작 필요? |
| ------------------- | -------------------------------------------------------------------- | ------------ |
| Channels | `channels.*`, `web` (WhatsApp) — 모든 내장 및 extension 채널 | 아니요 |
| Agent & models | `agent`, `agents`, `models`, `routing` | 아니요 |
| Automation | `hooks`, `cron`, `agent.heartbeat` | 아니요 |
| Sessions & messages | `session`, `messages` | 아니요 |
| Tools & media | `tools`, `browser`, `skills`, `audio`, `talk` | 아니요 |
| UI & misc | `ui`, `logging`, `identity`, `bindings` | 아니요 |
| Gateway server | `gateway.*` (port, bind, auth, tailscale, TLS, HTTP) | **예** |
| Infrastructure | `discovery`, `canvasHost`, `plugins` | **예** |
| 범주 | 필드 | 재시작 필요? |
| ------------------- | -------------------------------------------------------------------- | --------------- |
| 채널 | `channels.*`, `web` (WhatsApp) — 모든 내장 및 extension 채널 | 아니요 |
| 에이전트 및 모델 | `agent`, `agents`, `models`, `routing` | 아니요 |
| 자동화 | `hooks`, `cron`, `agent.heartbeat` | 아니요 |
| 세션 및 메시지 | `session`, `messages` | 아니요 |
| 도구 및 미디어 | `tools`, `browser`, `skills`, `audio`, `talk` | 아니요 |
| UI 및 기타 | `ui`, `logging`, `identity`, `bindings` | 아니요 |
| Gateway 서버 | `gateway.*` (port, bind, auth, tailscale, TLS, HTTP) | **예** |
| 인프라 | `discovery`, `canvasHost`, `plugins` | **예** |
<Note>
`gateway.reload``gateway.remote`는 예외입니다 — 이를 변경해도 **재시작이 트리거되지 않습니다**.
`gateway.reload``gateway.remote`는 예외입니다 — 이를 변경해도 재시작이 트리거되지 않습니다.
</Note>
## Config RPC (프로그래밍 방식 업데이트)
## config RPC (프로그래밍 방식 업데이트)
<Note>
컨트롤 플레인 쓰기 RPC(`config.apply`, `config.patch`, `update.run`)는 `deviceId+clientIp` 기준으로 **60초당 3요청**으로 속도 제한됩니다. 제한되면 RPC는 `retryAfterMs`와 함께 `UNAVAILABLE`을 반환합니다.
control-plane 쓰기 RPC(`config.apply`, `config.patch`, `update.run`)는 `deviceId+clientIp`당 **60초마다 3회 요청**으로 속도 제한됩니다. 제한되면 RPC는 `retryAfterMs`와 함께 `UNAVAILABLE`을 반환합니다.
</Note>
안전한/기본 흐름:
안전한 기본 흐름:
- `config.schema.lookup`: 얕은
스키마 노드, 일치하는 힌트 메타데이터, 즉시 자식 요약이 포함된 하나의 경로 범위 config 서브트리를 검사
- `config.schema.lookup`: 얕은 스키마 노드, 일치하는 힌트 메타데이터, 즉시 하위 요약이 포함된 경로 범위 config 하위 트리 하나 검사
- `config.get`: 현재 스냅샷 + 해시 가져오기
- `config.patch`: 권장되는 부분 업데이트 경로
- `config.apply`: 전체 config 교체
- `update.run`: 명시적인 self-update + 재시작
- `config.apply`: 전체 config 교체 시에만 사
- `update.run`: 명시적 자체 업데이트 + 재시작
전체 config를 교체하는 것이 아니라면 `config.schema.lookup`
다음 `config.patch`를 우선 사용하세요.
전체 config를 교체하는 것이 아니라면 `config.schema.lookup``config.patch`를 우선 사용하세요.
<AccordionGroup>
<Accordion title="config.apply (전체 교체)">
전체 config를 검증 + 기록하고 한 번에 Gateway를 재시작합니다.
전체 config를 검증 + 기록하고 Gateway를 한 단계로 재시작합니다.
<Warning>
`config.apply`는 **전체 config**를 교체합니다. 부분 업데이트에는 `config.patch`, 단일 키에는 `openclaw config set`을 사용하세요.
@ -561,13 +551,13 @@ Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동
매개변수:
- `raw` (string) — 전체 config JSON5 페이로드
- `raw` (string) — 전체 config에 대한 JSON5 페이로드
- `baseHash` (선택 사항) — `config.get`의 config 해시(config가 존재하면 필수)
- `sessionKey` (선택 사항) — 재시작 후 wake-up ping 세션 키
- `note` (선택 사항) — restart sentinel용 메모
- `restartDelayMs` (선택 사항) — 재시작 전 지연(기본값 2000)
- `sessionKey` (선택 사항) — 재시작 후 wake-up ping을 위한 세션 키
- `note` (선택 사항) — 재시작 센티널용 메모
- `restartDelayMs` (선택 사항) — 재시작 전 지연 시간(기본값 2000)
이미 재시작이 보류/진행 중인 동안의 재시작 요청은 병합되며, 재시작 주기 사이에는 30초 쿨다운이 적용됩니다.
재시작 요청은 이미 보류 중/진행 중인 요청이 있으면 합쳐지며, 재시작 주기 사이에는 30초 쿨다운이 적용됩니다.
```bash
openclaw gateway call config.get --params '{}' # payload.hash 캡처
@ -581,10 +571,10 @@ Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동
</Accordion>
<Accordion title="config.patch (부분 업데이트)">
기존 config에 부분 업데이트를 병합합니다(JSON merge patch 의미).
기존 config에 부분 업데이트를 병합합니다(JSON merge patch 의미 체계).
- 객체는 재귀적으로 병합
- `null`은 키 삭제
- `null`은 키 삭제
- 배열은 교체
매개변수:
@ -593,7 +583,7 @@ Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동
- `baseHash` (필수) — `config.get`의 config 해시
- `sessionKey`, `note`, `restartDelayMs``config.apply`와 동일
재시작 동작은 `config.apply`와 동일합니다: 보류 중 재시작 병합 + 재시작 주기 간 30초 쿨다운.
재시작 동작은 `config.apply`와 동일합니다. 보류 중인 재시작은 합쳐지며 재시작 주기 사이에는 30초 쿨다운이 적용됩니다.
```bash
openclaw gateway call config.patch --params '{
@ -607,12 +597,12 @@ Gateway는 `~/.openclaw/openclaw.json`을 감시하고 변경 사항을 자동
## 환경 변수
OpenClaw는 부모 프로세스의 env와 다음 위치를 읽습니다.
OpenClaw는 상위 프로세스의 env vars와 함께 다음도 읽습니다.
- 현재 작업 디렉터리의 `.env`(있을 경우)
- `~/.openclaw/.env` (전역 폴백)
- 현재 작업 디렉터리의 `.env`(존재하는 경우)
- `~/.openclaw/.env`(전역 폴백)
어느 파일도 기존 env vars를 재정의하지 않습니다. config에서 인라인 env vars를 설정할 수도 있습니다.
두 파일 모두 기존 env vars를 재정의하지 않습니다. config에서 인라인 env vars도 설정할 수 있습니다.
```json5
{
@ -623,8 +613,8 @@ OpenClaw는 부모 프로세스의 env와 다음 위치를 읽습니다.
}
```
<Accordion title="셸 env 가져오기(선택 사항)">
활성화되어 있고 예상 키가 설정되지 않은 경우, OpenClaw는 로그인 셸을 실행 누락된 키만 가져옵니다.
<Accordion title="셸 env 가져오기 (선택 사항)">
활성화되어 있고 예상 키가 설정되지 않은 경우, OpenClaw는 로그인 셸을 실행하고 누락된 키만 가져옵니다.
```json5
{
@ -637,8 +627,8 @@ OpenClaw는 부모 프로세스의 env와 다음 위치를 읽습니다.
Env var 동등값: `OPENCLAW_LOAD_SHELL_ENV=1`
</Accordion>
<Accordion title="config 값에서 Env var 치환">
`${VAR_NAME}`을 사용해 모든 config 문자열 값에서 env vars를 참조할 수 있습니다.
<Accordion title="config 값에서 env var 치환">
`${VAR_NAME}`으로 모든 config 문자열 값에서 env vars를 참조할 수 있습니다.
```json5
{
@ -649,7 +639,7 @@ Env var 동등값: `OPENCLAW_LOAD_SHELL_ENV=1`
규칙:
- 대문자 이름만 매칭됨: `[A-Z_][A-Z0-9_]*`
- 대문자 이름만 일치: `[A-Z_][A-Z0-9_]*`
- 누락되었거나 비어 있는 vars는 로드 시 오류를 발생시킴
- 리터럴 출력은 `$${VAR}`로 이스케이프
- `$include` 파일 내부에서도 동작
@ -658,7 +648,7 @@ Env var 동등값: `OPENCLAW_LOAD_SHELL_ENV=1`
</Accordion>
<Accordion title="Secret refs (env, file, exec)">
SecretRef 객체를 지원하는 필드에는 다음을 사용할 수 있습니다.
SecretRef 객체를 지원하는 필드에는 다음을 사용할 수 있습니다.
```json5
{
@ -690,16 +680,16 @@ Env var 동등값: `OPENCLAW_LOAD_SHELL_ENV=1`
}
```
SecretRef 세부 사항(`env`/`file`/`exec`용 `secrets.providers` 포함)은 [Secrets Management](/gateway/secrets)에 있습니다.
지원되는 자격 증명 경로는 [SecretRef Credential Surface](/reference/secretref-credential-surface)에 나열되어 있습니다.
SecretRef 세부 사항(`env`/`file`/`exec`용 `secrets.providers` 포함)은 [Secrets Management](/ko/gateway/secrets)에 있습니다.
지원되는 자격 증명 경로는 [SecretRef Credential Surface](/ko/reference/secretref-credential-surface)에 나열되어 있습니다.
</Accordion>
전체 우선순위와 소스는 [Environment](/help/environment)를 참조하세요.
전체 우선순위와 소스는 [환경](/ko/help/environment)를 참조하세요.
## 전체 참조
필드별 완전한 참조는 **[Configuration Reference](/gateway/configuration-reference)**를 참조하세요.
완전한 필드별 참조는 **[구성 참조](/ko/gateway/configuration-reference)**를 확인하세요.
---
_관련 문서: [Configuration Examples](/gateway/configuration-examples) · [Configuration Reference](/gateway/configuration-reference) · [Doctor](/gateway/doctor)_
_관련 항목: [구성 예시](/ko/gateway/configuration-examples) · [구성 참조](/ko/gateway/configuration-reference) · [Doctor](/ko/gateway/doctor)_

View File

@ -0,0 +1,362 @@
---
read_when:
- 단순한 MEMORY.md 노트를 넘어서는 지속적인 지식을 원할 때
- 번들된 memory-wiki plugin을 구성하고 있을 때
- wiki_search, wiki_get 또는 브리지 모드를 이해하고 싶을 때
summary: 'memory-wiki: 출처, 클레임, 대시보드, 브리지 모드를 갖춘 컴파일된 지식 볼트'
title: 메모리 위키
x-i18n:
generated_at: "2026-04-08T05:56:05Z"
model: gpt-5.4
provider: openai
source_hash: b78dd6a4ef4451dae6b53197bf0c7c2a2ba846b08e4a3a93c1026366b1598d82
source_path: plugins/memory-wiki.md
workflow: 15
---
# 메모리 위키
`memory-wiki`는 지속 가능한 메모리를 컴파일된 지식 볼트로 바꿔 주는 번들 plugin입니다.
이 plugin은 활성 메모리 plugin을 **대체하지 않습니다**. 활성 메모리 plugin은 여전히
회상, 승격, 인덱싱, dreaming을 담당합니다. `memory-wiki`는 그 옆에서
작동하며, 지속 가능한 지식을 탐색 가능한 위키로 컴파일해 결정적인 페이지,
구조화된 클레임, 출처, 대시보드, 기계가 읽을 수 있는 다이제스트를 제공합니다.
메모리가 Markdown 파일 더미처럼 작동하기보다 유지 관리되는 지식 계층처럼
작동하길 원한다면 이것을 사용하세요.
## 추가되는 기능
- 결정적인 페이지 레이아웃을 갖춘 전용 위키 볼트
- 단순한 산문이 아닌 구조화된 클레임 및 증거 메타데이터
- 페이지 수준의 출처, 신뢰도, 모순, 미해결 질문
- 에이전트/런타임 소비자를 위한 컴파일된 다이제스트
- 위키 전용 search/get/apply/lint 도구
- 활성 메모리 plugin의 공개 아티팩트를 가져오는 선택적 브리지 모드
- 선택적 Obsidian 친화적 렌더 모드 및 CLI 통합
## 메모리와의 관계
이 구분은 다음과 같이 생각하면 됩니다:
| 계층 | 담당 |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| 활성 메모리 plugin (`memory-core`, QMD, Honcho 등) | 회상, 시맨틱 검색, 승격, dreaming, 메모리 런타임 |
| `memory-wiki` | 컴파일된 위키 페이지, 출처가 풍부한 종합, 대시보드, 위키 전용 search/get/apply |
활성 메모리 plugin이 공유 회상 아티팩트를 노출하면 OpenClaw는
`memory_search corpus=all`로 한 번에 두 계층을 모두 검색할 수 있습니다.
위키 전용 순위 지정, 출처, 또는 직접 페이지 접근이 필요할 때는
대신 위키 전용 도구를 사용하세요.
## 볼트 모드
`memory-wiki`는 세 가지 볼트 모드를 지원합니다:
### `isolated`
자체 볼트, 자체 소스, `memory-core`에 대한 의존성 없음.
위키를 자체적으로 큐레이션된 지식 저장소로 사용하고 싶다면 이 모드를 사용하세요.
### `bridge`
활성 메모리 plugin의 공개 메모리 아티팩트와 메모리 이벤트를
공개 plugin SDK 경계를 통해 읽습니다.
메모리 plugin의 내보낸 아티팩트를 private plugin 내부 구현에 접근하지 않고
위키에서 컴파일하고 정리하고 싶다면 이 모드를 사용하세요.
브리지 모드는 다음을 인덱싱할 수 있습니다:
- 내보낸 메모리 아티팩트
- dream 보고서
- 일일 노트
- 메모리 루트 파일
- 메모리 이벤트 로그
### `unsafe-local`
로컬 private 경로를 위한, 동일 머신에서만 사용하는 명시적 탈출구입니다.
이 모드는 의도적으로 실험적이며 이식성이 없습니다. 신뢰 경계를 이해하고,
브리지 모드로는 제공할 수 없는 로컬 파일 시스템 접근이 꼭 필요할 때만
사용하세요.
## 볼트 레이아웃
plugin은 다음과 같은 볼트를 초기화합니다:
```text
<vault>/
AGENTS.md
WIKI.md
index.md
inbox.md
entities/
concepts/
syntheses/
sources/
reports/
_attachments/
_views/
.openclaw-wiki/
```
관리되는 콘텐츠는 생성된 블록 내부에 유지됩니다. 사람이 작성한 노트 블록은 보존됩니다.
주요 페이지 그룹은 다음과 같습니다:
- `sources/`: 가져온 원본 자료와 브리지 기반 페이지
- `entities/`: 지속적인 사물, 사람, 시스템, 프로젝트, 객체
- `concepts/`: 아이디어, 추상화, 패턴, 정책
- `syntheses/`: 컴파일된 요약과 유지 관리되는 롤업
- `reports/`: 생성된 대시보드
## 구조화된 클레임과 증거
페이지는 자유 형식 텍스트만이 아니라 구조화된 `claims` frontmatter를 가질 수 있습니다.
각 클레임에는 다음이 포함될 수 있습니다:
- `id`
- `text`
- `status`
- `confidence`
- `evidence[]`
- `updatedAt`
증거 항목에는 다음이 포함될 수 있습니다:
- `sourceId`
- `path`
- `lines`
- `weight`
- `note`
- `updatedAt`
이것이 위키를 수동적인 노트 덤프가 아니라 신념 계층처럼 작동하게 만듭니다.
클레임은 추적, 점수화, 이의 제기, 소스로의 해결이 가능합니다.
## 컴파일 파이프라인
컴파일 단계는 위키 페이지를 읽고, 요약을 정규화한 뒤, 안정적인
기계 지향 아티팩트를 다음 경로에 출력합니다:
- `.openclaw-wiki/cache/agent-digest.json`
- `.openclaw-wiki/cache/claims.jsonl`
이 다이제스트는 에이전트와 런타임 코드가 Markdown 페이지를 직접
스크래핑하지 않아도 되도록 존재합니다.
컴파일된 출력은 다음에도 사용됩니다:
- search/get 흐름을 위한 1차 위키 인덱싱
- 소유 페이지로의 claim-id 조회
- 간결한 프롬프트 보조 정보
- 보고서/대시보드 생성
## 대시보드와 상태 보고서
`render.createDashboards`가 활성화되면, 컴파일은 `reports/` 아래에
대시보드를 유지합니다.
기본 제공 보고서는 다음과 같습니다:
- `reports/open-questions.md`
- `reports/contradictions.md`
- `reports/low-confidence.md`
- `reports/claim-health.md`
- `reports/stale-pages.md`
이 보고서는 다음과 같은 항목을 추적합니다:
- 모순 노트 클러스터
- 경쟁하는 클레임 클러스터
- 구조화된 증거가 없는 클레임
- 신뢰도가 낮은 페이지와 클레임
- 오래되었거나 최신성 정보를 알 수 없는 항목
- 해결되지 않은 질문이 있는 페이지
## 검색 및 조회
`memory-wiki`는 두 가지 검색 백엔드를 지원합니다:
- `shared`: 가능할 때 공유 메모리 검색 흐름 사용
- `local`: 위키를 로컬에서 검색
또한 세 가지 corpus를 지원합니다:
- `wiki`
- `memory`
- `all`
중요한 동작:
- `wiki_search``wiki_get`은 가능할 때 컴파일된 다이제스트를 1차 단계로 사용합니다
- claim id는 소유 페이지로 다시 해석될 수 있습니다
- 이의 제기됨/오래됨/최신 클레임이 순위에 영향을 줍니다
- 출처 라벨은 결과까지 유지될 수 있습니다
실용적인 규칙:
- 폭넓은 한 번의 회상 패스에는 `memory_search corpus=all`을 사용하세요
- 위키 전용 순위 지정, 출처, 페이지 수준의 신념 구조가 중요할 때는 `wiki_search` + `wiki_get`을 사용하세요
## 에이전트 도구
plugin은 다음 도구를 등록합니다:
- `wiki_status`
- `wiki_search`
- `wiki_get`
- `wiki_apply`
- `wiki_lint`
각 도구의 역할:
- `wiki_status`: 현재 볼트 모드, 상태, Obsidian CLI 사용 가능 여부
- `wiki_search`: 위키 페이지를 검색하고, 구성된 경우 공유 메모리 corpus도 검색
- `wiki_get`: id/path로 위키 페이지를 읽거나 공유 메모리 corpus로 폴백
- `wiki_apply`: 자유 형식 페이지 수술 없이 좁은 범위의 종합/메타데이터 변경 수행
- `wiki_lint`: 구조 검사, 출처 공백, 모순, 미해결 질문 확인
또한 이 plugin은 비독점적 메모리 corpus 보조 기능도 등록하므로, 활성 메모리
plugin이 corpus 선택을 지원할 경우 공유 `memory_search``memory_get`
위키에 도달할 수 있습니다.
## 프롬프트 및 컨텍스트 동작
`context.includeCompiledDigestPrompt`가 활성화되면, 메모리 프롬프트 섹션은
`agent-digest.json`의 간결한 컴파일 스냅샷을 덧붙입니다.
그 스냅샷은 의도적으로 작고 신호 대비 잡음이 적습니다:
- 상위 페이지만
- 상위 클레임만
- 모순 개수
- 질문 개수
- 신뢰도/최신성 한정자
이 옵션은 프롬프트 형태를 바꾸며, 메모리 보조 정보를 명시적으로 소비하는
컨텍스트 엔진이나 레거시 프롬프트 조립에 주로 유용하기 때문에 opt-in입니다.
## 구성
구성은 `plugins.entries.memory-wiki.config` 아래에 두세요:
```json5
{
plugins: {
entries: {
"memory-wiki": {
enabled: true,
config: {
vaultMode: "isolated",
vault: {
path: "~/.openclaw/wiki/main",
renderMode: "obsidian",
},
obsidian: {
enabled: true,
useOfficialCli: true,
vaultName: "OpenClaw Wiki",
openAfterWrites: false,
},
bridge: {
enabled: false,
readMemoryArtifacts: true,
indexDreamReports: true,
indexDailyNotes: true,
indexMemoryRoot: true,
followMemoryEvents: true,
},
ingest: {
autoCompile: true,
maxConcurrentJobs: 1,
allowUrlIngest: true,
},
search: {
backend: "shared",
corpus: "wiki",
},
context: {
includeCompiledDigestPrompt: false,
},
render: {
preserveHumanBlocks: true,
createBacklinks: true,
createDashboards: true,
},
},
},
},
},
}
```
주요 토글:
- `vaultMode`: `isolated`, `bridge`, `unsafe-local`
- `vault.renderMode`: `native` 또는 `obsidian`
- `bridge.readMemoryArtifacts`: 활성 메모리 plugin의 공개 아티팩트 가져오기
- `bridge.followMemoryEvents`: 브리지 모드에서 이벤트 로그 포함
- `search.backend`: `shared` 또는 `local`
- `search.corpus`: `wiki`, `memory`, 또는 `all`
- `context.includeCompiledDigestPrompt`: 메모리 프롬프트 섹션에 간결한 다이제스트 스냅샷 추가
- `render.createBacklinks`: 결정적인 관련 블록 생성
- `render.createDashboards`: 대시보드 페이지 생성
## CLI
`memory-wiki`는 최상위 CLI 표면도 제공합니다:
```bash
openclaw wiki status
openclaw wiki doctor
openclaw wiki init
openclaw wiki ingest ./notes/alpha.md
openclaw wiki compile
openclaw wiki lint
openclaw wiki search "alpha"
openclaw wiki get entity.alpha
openclaw wiki apply synthesis "Alpha Summary" --body "..." --source-id source.alpha
openclaw wiki bridge import
openclaw wiki obsidian status
```
전체 명령 참조는 [CLI: 위키](/cli/wiki)를 참조하세요.
## Obsidian 지원
`vault.renderMode``obsidian`이면, plugin은 Obsidian 친화적인
Markdown을 작성하고 선택적으로 공식 `obsidian` CLI를 사용할 수 있습니다.
지원되는 워크플로는 다음과 같습니다:
- 상태 프로빙
- 볼트 검색
- 페이지 열기
- Obsidian 명령 호출
- 일일 노트로 이동
이 기능은 선택 사항입니다. 위키는 Obsidian 없이 native 모드에서도 계속 작동합니다.
## 권장 워크플로
1. 회상/승격/dreaming에는 활성 메모리 plugin을 계속 사용하세요.
2. `memory-wiki`를 활성화하세요.
3. 브리지 모드를 명시적으로 원하지 않는 한 `isolated` 모드로 시작하세요.
4. 출처가 중요할 때는 `wiki_search` / `wiki_get`을 사용하세요.
5. 좁은 범위의 종합 또는 메타데이터 업데이트에는 `wiki_apply`를 사용하세요.
6. 의미 있는 변경 후에는 `wiki_lint`를 실행하세요.
7. 오래됨/모순 가시성이 필요하다면 대시보드를 켜세요.
## 관련 문서
- [메모리 개요](/ko/concepts/memory)
- [CLI: memory](/cli/memory)
- [CLI: 위키](/cli/wiki)
- [Plugin SDK 개요](/ko/plugins/sdk-overview)

View File

@ -1,58 +1,58 @@
---
read_when:
- OpenClaw에서 GLM 모델을 사용하려는 경우
- 모델 명명 규칙과 설정 방법이 필요한 경우
summary: GLM 모델 패밀리 개요 + OpenClaw에서 사용하는 방법
- 모델 명명 규칙과 설정이 필요한 경우
summary: GLM 모델 패밀리 개요 OpenClaw에서 사용하는 방법
title: GLM 모델
x-i18n:
generated_at: "2026-04-05T12:51:52Z"
generated_at: "2026-04-08T05:55:48Z"
model: gpt-5.4
provider: openai
source_hash: 59622edab5094d991987f9788fbf08b33325e737e7ff88632b0c3ac89412d4c7
source_hash: 79a55acfa139847b4b85dbc09f1068cbd2febb1e49f984a23ea9e3b43bc910eb
source_path: providers/glm.md
workflow: 15
---
# GLM 모델
GLM은 Z.AI 플랫폼에서 제공되**모델 패밀리**(회사가 아님)입니다. OpenClaw에서 GLM
모델은 `zai` 제공자와 `zai/glm-5` 같은 모델 ID를 통해 사용합니다.
GLM은 Z.AI 플랫폼을 통해 사용할 수 있**모델 패밀리**(회사가 아님)입니다. OpenClaw에서 GLM
모델은 `zai` provider와 `zai/glm-5` 같은 모델 ID를 통해 액세스합니다.
## CLI 설정
```bash
# 엔드포인트 자동 감지가 포함된 일반 API 키 설정
# 엔드포인트 자동 감지를 사용하는 일반 API 키 설정
openclaw onboard --auth-choice zai-api-key
# Coding Plan Global, Coding Plan 사용자에게 권장
# 코딩 플랜 Global, 코딩 플랜 사용자에게 권장
openclaw onboard --auth-choice zai-coding-global
# Coding Plan CN(중국 지역), Coding Plan 사용자에게 권장
# 코딩 플랜 CN(중국 리전), 코딩 플랜 사용자에게 권장
openclaw onboard --auth-choice zai-coding-cn
# 일반 API
openclaw onboard --auth-choice zai-global
# 일반 API CN(중국 지역)
# 일반 API CN(중국 리전)
openclaw onboard --auth-choice zai-cn
```
## 설정 스니펫
## 구성 스니펫
```json5
{
env: { ZAI_API_KEY: "sk-..." },
agents: { defaults: { model: { primary: "zai/glm-5" } } },
agents: { defaults: { model: { primary: "zai/glm-5.1" } } },
}
```
`zai-api-key`를 사용하면 OpenClaw가 키에서 일치하는 Z.AI 엔드포인트를 감지하고
올바른 기본 URL을 자동으로 적용할 수 있습니다. 특정 Coding Plan 또는 일반 API 표면을
강제로 사용하려면 명시적인 지역 선택지를 사용하세요.
올바른 기본 URL을 자동으로 적용할 수 있습니다. 특정 코딩 플랜 또는 일반 API 표면을 강제하려는 경우
명시적인 지역 선택지를 사용하세요.
## 현재 번들된 GLM 모델
OpenClaw는 현재 번들된 `zai` 제공자에 다음 GLM 참조를 시드합니다:
OpenClaw는 현재 번들된 `zai` provider에 다음 GLM ref를 시드합니다:
- `glm-5.1`
- `glm-5`
@ -71,5 +71,5 @@ OpenClaw는 현재 번들된 `zai` 제공자에 다음 GLM 참조를 시드합
## 참고
- GLM 버전과 제공 여부는 변경될 수 있으므로 최신 정보는 Z.AI 문서를 확인하세요.
- 기본 번들 모델 참조는 `zai/glm-5`입니다.
- 제공자에 대한 자세한 내용은 [/providers/zai](/providers/zai)를 참고하세요.
- 기본 번들 모델 ref는 `zai/glm-5.1`입니다.
- provider 세부 정보는 [/providers/zai](/ko/providers/zai)를 참조하세요.

View File

@ -1,32 +1,34 @@
---
read_when:
- OpenClaw에서 Z.AI / GLM 모델을 사용하려는 경우
- 간단한 `ZAI_API_KEY` 설정이 필요한 경우
summary: OpenClaw에서 Z.AI(GLM 모델)를 사용합니다
- 간단한 ZAI_API_KEY 설정이 필요한 경우
summary: OpenClaw에서 Z.AI(GLM 모델) 사용하기
title: Z.AI
x-i18n:
generated_at: "2026-04-05T12:53:32Z"
generated_at: "2026-04-08T05:55:56Z"
model: gpt-5.4
provider: openai
source_hash: 48006cdd580484f0c62e2877b27a6a68d7bc44795b3e97a28213d95182d9acf9
source_hash: 66cbd9813ee28d202dcae34debab1b0cf9927793acb00743c1c62b48d9e381f9
source_path: providers/zai.md
workflow: 15
---
# Z.AI
Z.AI는 **GLM** 모델용 API 플랫폼입니다. GLM용 REST API를 제공하며 인증에는 API 키를 사용합니다. Z.AI 콘솔에서 API 키를 생성하세요. OpenClaw는 Z.AI API 키와 함께 `zai` provider를 사용합니다.
Z.AI는 **GLM** 모델용 API 플랫폼입니다. GLM용 REST API를 제공하며 인증에는 API 키를
사용합니다. Z.AI 콘솔에서 API 키를 생성하세요. OpenClaw는 Z.AI API 키와 함께 `zai` provider를
사용합니다.
## CLI 설정
```bash
# 엔드포인트 자동 감지가 포함된 일반 API 키 설정
# 엔드포인트 자동 감지를 사용하는 일반 API 키 설정
openclaw onboard --auth-choice zai-api-key
# Coding Plan Global, Coding Plan 사용자에게 권장
# 코딩 플랜 Global, 코딩 플랜 사용자에게 권장
openclaw onboard --auth-choice zai-coding-global
# Coding Plan CN(중국 리전), Coding Plan 사용자에게 권장
# 코딩 플랜 CN(중국 리전), 코딩 플랜 사용자에게 권장
openclaw onboard --auth-choice zai-coding-cn
# 일반 API
@ -41,16 +43,17 @@ openclaw onboard --auth-choice zai-cn
```json5
{
env: { ZAI_API_KEY: "sk-..." },
agents: { defaults: { model: { primary: "zai/glm-5" } } },
agents: { defaults: { model: { primary: "zai/glm-5.1" } } },
}
```
`zai-api-key`를 사용하면 OpenClaw가 키에서 일치하는 Z.AI 엔드포인트를 감지하고
올바른 기본 URL을 자동으로 적용할 수 있습니다. 특정 Coding Plan 또는 일반 API 표면을 강제로 사용하려는 경우에는 명시적인 리전 선택을 사용하세요.
올바른 기본 URL을 자동으로 적용할 수 있습니다. 특정 코딩 플랜 또는 일반 API 표면을 강제하려는 경우
명시적인 지역 선택지를 사용하세요.
## 번들된 GLM 카탈로그
OpenClaw는 현재 번들된 `zai` provider에 다음 모델을 시드합니다:
OpenClaw는 현재 번들된 `zai` provider를 다음으로 시드합니다:
- `glm-5.1`
- `glm-5`
@ -68,9 +71,11 @@ OpenClaw는 현재 번들된 `zai` provider에 다음 모델을 시드합니다:
## 참고
- GLM 모델은 `zai/<model>`로 제공됩니다(예: `zai/glm-5`).
- 기본 번들 모델 참조: `zai/glm-5`
- 알 수 없는 `glm-5*` id도 현재 GLM-5 제품군 형태와 일치하는 경우 `glm-4.7` 템플릿에서 provider 소유 메타데이터를 합성하여 번들 provider 경로에서 계속 정방향 해석됩니다.
- Z.AI tool-call 스트리밍에는 기본적으로 `tool_stream`이 활성화되어 있습니다. 비활성화하려면 `agents.defaults.models["zai/<model>"].params.tool_stream``false`로 설정하세요.
- 모델 제품군 개요는 [/providers/glm](/providers/glm)을 참조하세요.
- GLM 모델은 `zai/<model>`로 사용할 수 있습니다(예: `zai/glm-5`).
- 기본 번들 모델 ref: `zai/glm-5.1`
- 알 수 없는 `glm-5*` ID도 현재 GLM-5 패밀리 형태와 일치하는 경우
`glm-4.7` 템플릿에서 provider 소유 메타데이터를 합성하여 번들된 provider 경로에서 계속 해석됩니다.
- Z.AI 도구 호출 스트리밍을 위해 `tool_stream`은 기본적으로 활성화되어 있습니다.
비활성화하려면 `agents.defaults.models["zai/<model>"].params.tool_stream``false`로 설정하세요.
- 모델 패밀리 개요는 [/providers/glm](/ko/providers/glm)를 참조하세요.
- Z.AI는 API 키와 함께 Bearer 인증을 사용합니다.

View File

@ -1,85 +1,88 @@
---
x-i18n:
generated_at: "2026-04-08T02:18:32Z"
generated_at: "2026-04-08T05:56:30Z"
model: gpt-5.4
provider: openai
source_hash: 0e156cc8e2fe946a0423862f937754a7caa1fe7e6863b50a80bff49a1c86e1e8
source_hash: 4a9066b2a939c5a9ba69141d75405f0e8097997b523164340e2f0e9a0d5060dd
source_path: refactor/qa.md
workflow: 15
---
# QA 리팩터링
상태: 기반 마이그레이션이 완료되었습니다.
상태: 기반 마이그레이션이 적용되었습니다.
## 목표
OpenClaw QA를 분리된 정의 모델에서 단일 신뢰 가능한 정보원으로 옮깁니다.
OpenClaw QA를 분리된 정의 모델에서 단일 진실 공급원으로 이동합니다:
- 시나리오 메타데이터
- 모델에 전송되는 프롬프트
- 설정 및 정리
- 하스 로직
- 단언 성공 기준
- 아티팩트 및 리포트 힌트
- 하스 로직
- 단언 성공 기준
- 아티팩트 및 보고서 힌트
목표하는 최종 상태는 대부분의 동작을 TypeScript에 하드코딩하는 대신 강력한 시나리오 정의 파일을 로드하는 일반적인 QA 하니스입니다.
목표하는 최종 상태는 대부분의 동작을 TypeScript에 하드코딩하는 대신, 강력한 시나리오 정의 파일을 로드하는 범용 QA 하네스입니다.
## 현재 상태
현재의 기본 신뢰 가능한 정보원은 `qa/scenarios.md`에 있습니다.
이제 주된 진실 공급원은 `qa/scenarios/index.md``qa/scenarios/*.md` 아래의 시나리오별 파일 하나씩입니다.
구현 완료:
구현:
- `qa/scenarios.md`
- 정식 QA 팩
- 운영자 신원
- `qa/scenarios/index.md`
- 정식 QA 팩 메타데이터
- 운영자 식별 정보
- 시작 미션
- `qa/scenarios/*.md`
- 시나리오별 Markdown 파일 하나
- 시나리오 메타데이터
- 핸들러 바인딩
- 시나리오별 실행 설정
- `extensions/qa-lab/src/scenario-catalog.ts`
- 마크다운 팩 파서 + zod 검증
- Markdown 팩 파서 + zod 검증
- `extensions/qa-lab/src/qa-agent-bootstrap.ts`
- 마크다운 팩에서 계획 렌더링
- Markdown 팩에서 계획 렌더링
- `extensions/qa-lab/src/qa-agent-workspace.ts`
- 생성된 호환성 파일과 `QA_SCENARIOS.md` 시드
- `extensions/qa-lab/src/suite.ts`
- 마크다운으로 정의된 핸들러 바인딩을 통해 실행 가능한 시나리오 선택
- QA bus 프로토콜 + UI
- 이미지/비디오/오디오/파일 렌더링을 위한 일반적인 인라인 첨부 파일
- Markdown으로 정의된 핸들러 바인딩을 통해 실행 가능한 시나리오 선택
- QA 버스 프로토콜 + UI
- 이미지/비디오/오디오/파일 렌더링을 위한 범용 인라인 첨부
여전히 분리되어 있는 표면:
남아 있는 분리된 표면:
- `extensions/qa-lab/src/suite.ts`
- 여전히 대부분의 실행 가능한 사용자 지정 핸들러 로직을 소유
- 여전히 대부분의 실행 가능한 커스텀 핸들러 로직을 소유
- `extensions/qa-lab/src/report.ts`
- 여전히 런타임 출력에서 리포트 구조를 도출
- 여전히 런타임 출력에서 보고서 구조를 도출
따라서 신뢰 가능한 정보원 분리는 해결되었지만, 실행은 여전히 완전히 선언적이기보다는 대부분 핸들러 기반입니다.
즉, 진실 공급원 분리는 해결되었지만, 실행은 아직 완전한 선언형이 아니라 대부분 핸들러 기반입니다.
## 실제 시나리오 표면의 형태
## 실제 시나리오 표면의 모습
현재 suite를 읽어보면 몇 가지 뚜렷한 시나리오 클래스가 보입니다.
현재 suite를 읽어 보면 몇 가지 뚜렷한 시나리오 클래스가 보입니다.
### 단순 상호작용
- 채널 기준선
- DM 기준선
- 스레드 후속 조치
- 채널 베이스라인
- DM 베이스라인
- 스레드 후속 응답
- 모델 전환
- 승인 후속 처리
- 반응/편집/삭제
- 승인 후속 진행
- 반응/수정/삭제
### 구성 및 런타임 변경
- config patch skill 비활성화
- config apply 재시작 wake-up
- config 재시작 capability 전환
- 런타임 인벤토리 드리프트 검사
- config apply 재시작 웨이크업
- config 재시작 기능 전환
- 런타임 인벤토리 드리프트 확인
### 파일 시스템 및 repo 단언
### 파일 시스템 및 리포지토리 단언
- source/docs 탐색 리포트
- source/docs 발견 보고서
- Lobster Invaders 빌드
- 생성된 이미지 아티팩트 조회
@ -87,10 +90,10 @@ OpenClaw QA를 분리된 정의 모델에서 단일 신뢰 가능한 정보원
- 메모리 회상
- 채널 컨텍스트에서의 메모리 도구
- 메모리 실패 fallback
- 세션 메모리 순위
- 메모리 실패 폴백
- 세션 메모리 랭킹
- 스레드 메모리 격리
- 메모리 dreaming 스윕
- 메모리 dreaming sweep
### 도구 및 plugin 통합
@ -99,36 +102,36 @@ OpenClaw QA를 분리된 정의 모델에서 단일 신뢰 가능한 정보원
- skill 핫 설치
- 네이티브 이미지 생성
- 이미지 왕복
- 첨부 파일의 이미지 이해
- 첨부에서의 이미지 이해
### 다중 턴 및 다중 액터
### 멀티턴 및 멀티 액터
- subagent handoff
- subagent fanout synthesis
- 재시작 복구 스타일 흐름
- 서브에이전트 핸드오프
- 서브에이전트 팬아웃 합성
- 재시작 복구 스타일 플로우
이 범주는 DSL 요구 사항을 결정하므로 중요합니다. 프롬프트 + 예상 텍스트의 평면 목록만으로는 충분하지 않습니다.
이 범주들은 DSL 요구사항을 결정하기 때문에 중요합니다. 프롬프트 + 기대 텍스트의 평면 목록만으로는 충분하지 않습니다.
## 방향
### 단일 신뢰 가능한 정보
### 단일 진실 공급
작성된 신뢰 가능한 정보원으로 `qa/scenarios.md`를 사용합니다.
작성되는 진실 공급원으로 `qa/scenarios/index.md``qa/scenarios/*.md`를 사용합니다.
이 팩은 다음 특성을 유지해야 합니다.
팩은 다음 상태를 유지해야 합니다:
- 리뷰에서 사람이 읽기 쉬움
- 기계가 파싱 가능함
- 다음을 구동할 만큼 충분히 풍부함:
- suite 실행
- QA 워크스페이스 부트스트랩
- QA 작업 공간 부트스트랩
- QA Lab UI 메타데이터
- docs/discovery 프롬프트
- 리포트 생성
- 보고서 생성
### 선호는 작성 형식
### 선호는 작성 형식
최상위 형식으로는 마크다운을 사용하고, 그 안에 구조화된 YAML을 넣습니다.
최상위 형식은 Markdown을 사용하고, 그 안에 구조화된 YAML을 둡니다.
권장 형태:
@ -139,12 +142,12 @@ OpenClaw QA를 분리된 정의 모델에서 단일 신뢰 가능한 정보원
- tags
- docs refs
- code refs
- 모델/프로바이더 override
- model/provider 재정의
- prerequisites
- 본문 섹션
- 설명 섹션
- objective
- notes
- 디버깅 힌트
- debugging hints
- fenced YAML 블록
- setup
- steps
@ -157,7 +160,7 @@ OpenClaw QA를 분리된 정의 모델에서 단일 신뢰 가능한 정보원
- 순수 YAML보다 더 풍부한 컨텍스트
- 엄격한 파싱과 zod 검증
순수 JSON은 중간 생성 형식으로만 허용됩니다.
원시 JSON은 중간 생성 형태로만 허용됩니다.
## 제안하는 시나리오 파일 형태
@ -232,11 +235,11 @@ Verify generated media is reattached on the follow-up turn.
```
````
## DSL이 지원해야 하는 러너 기능
## DSL이 다뤄야 하는 러너 기능
현재 suite를 기준으로 보면, 일반적인 러너는 프롬프트 실행 이상의 기능이 필요합니다.
현재 suite를 기준으로 보면, 범용 러너는 단순한 프롬프트 실행 이상의 기능이 필요합니다.
### 환경 및 설정 액션
### 환경 및 설정 작업
- `bus.reset`
- `gateway.waitHealthy`
@ -245,14 +248,14 @@ Verify generated media is reattached on the follow-up turn.
- `thread.create`
- `workspace.writeSkill`
### 에이전트 턴 액션
### 에이전트 턴 작업
- `agent.send`
- `agent.wait`
- `bus.injectInbound`
- `bus.injectOutbound`
### 구성 및 런타임 액션
### 구성 및 런타임 작업
- `config.get`
- `config.patch`
@ -261,7 +264,7 @@ Verify generated media is reattached on the follow-up turn.
- `tools.effective`
- `skills.status`
### 파일 및 아티팩트 액션
### 파일 및 아티팩트 작업
- `file.write`
- `file.read`
@ -270,7 +273,7 @@ Verify generated media is reattached on the follow-up turn.
- `artifact.captureGeneratedImage`
- `artifact.capturePath`
### 메모리 및 cron 액션
### 메모리 및 cron 작업
- `memory.indexForce`
- `memory.searchCli`
@ -280,7 +283,7 @@ Verify generated media is reattached on the follow-up turn.
- `cron.waitCompletion`
- `sessionTranscript.write`
### MCP 액션
### MCP 작업
- `mcp.callTool`
@ -308,128 +311,129 @@ DSL은 저장된 출력과 이후 참조를 지원해야 합니다.
- 스레드를 만든 뒤 `threadId` 재사용
- 세션을 만든 뒤 `sessionKey` 재사용
- 이미지를 생성한 뒤 다음 턴에 파일 첨부
- wake marker 문자열을 생성한 뒤 나중에 나타나는지 단언
- 이미지를 생성한 뒤 다음 턴에 해당 파일 첨부
- 웨이크 마커 문자열을 생성한 뒤 나중에 나타나는지 단언
필요한 기능:
- `saveAs`
- `${vars.name}`
- `${artifacts.name}`
- 경로, 세션 키, 스레드 id, 마커, 도구 출력에 대한 타입 지정 참조
- 경로, 세션 키, 스레드 id, 마커, 도구 출력을 위한 타입 지정 참조
변수 지원이 없으면 하니스는 계속 시나리오 로직을 TypeScript 쪽으로 새어나가게 됩니다.
변수 지원이 없으면 하네스는 계속해서 시나리오 로직을 TypeScript로 다시 새어 나가게 됩니다.
## 이스케이프 해치로 남겨야 할 것
완전히 순수한 선언형 러너는 1단계에서는 현실적이지 않습니다.
1단계에서 완전히 순수한 선언형 러너는 현실적이지 않습니다.
일부 시나리오는 본질적으로 오케스트레이션 비중이 큽니다.
일부 시나리오는 본질적으로 오케스트레이션 비중이 큽니다:
- 메모리 dreaming 스윕
- config apply 재시작 wake-up
- config 재시작 capability 전환
- memory dreaming sweep
- config apply 재시작 웨이크업
- config 재시작 기능 전환
- 타임스탬프/경로 기준 생성 이미지 아티팩트 해석
- discovery-report 평가
런 항목은 당분간 명시적인 사용자 지정 핸들러를 사용해야 합니다.
들은 우선 명시적인 커스텀 핸들러를 사용해야 합니다.
권장 규칙:
- 85-90% 선언형
- 어려운 나머지 부분에는 명시적 `customHandler` 단계 사용
- 이름이 있고 문서화된 사용자 지정 핸들러만 허용
- 시나리오 파일 안에 익명 인라인 코드는 금지
- 85-90% 선언형
- 어려운 나머지를 위해 명시적인 `customHandler` 단계 사용
- 이름이 있고 문서화된 커스텀 핸들러만 허용
- 시나리오 파일에 익명 인라인 코드는 허용하지 않음
이렇게 하면 일반 엔진을 깔끔하게 유지하면서도 계속 진전할 수 있습니다.
이렇게 하면 범용 엔진을 깔끔하게 유지하면서도 계속 진전할 수 있습니다.
## 아키텍처 변경
### 현재
시나리오 마크다운은 이미 다음의 신뢰 가능한 정보원입니다.
시나리오 Markdown은 이미 다음의 진실 공급원입니다:
- suite 실행
- 워크스페이스 부트스트랩 파일
- 작업 공간 부트스트랩 파일
- QA Lab UI 시나리오 카탈로그
- 리포트 메타데이터
- 보고서 메타데이터
- discovery 프롬프트
생성된 호환성 항목:
- 시드된 워크스페이스에는 여전히 `QA_KICKOFF_TASK.md`가 포함됨
- 시드된 워크스페이스에는 여전히 `QA_SCENARIO_PLAN.md`가 포함됨
- 시드된 워크스페이스에는 이제 `QA_SCENARIOS.md`도 포함됨
- 시드된 작업 공간에는 여전히 `QA_KICKOFF_TASK.md`가 포함됨
- 시드된 작업 공간에는 여전히 `QA_SCENARIO_PLAN.md`가 포함됨
- 시드된 작업 공간에는 이제 `QA_SCENARIOS.md`도 포함됨
## 리팩터링 계획
### 1단계: 로더 및 스키마
완료.
완료.
- `qa/scenarios.md` 추가
- 이름 있는 마크다운 YAML 팩 콘텐츠용 파서 추가
- `qa/scenarios/index.md` 추가
- 시나리오를 `qa/scenarios/*.md`로 분리
- 이름 있는 Markdown YAML 팩 콘텐츠용 파서 추가
- zod로 검증
- 소비자를 파싱된 팩으로 전환
- repo 수준의 `qa/seed-scenarios.json``qa/QA_KICKOFF_TASK.md` 제거
- 리포지토리 수준의 `qa/seed-scenarios.json``qa/QA_KICKOFF_TASK.md` 제거
### 2단계: 일반 엔진
### 2단계: 범용 엔진
- `extensions/qa-lab/src/suite.ts`를 다음으로 분리:
- 로더
- 엔진
- 액션 레지스트리
- 단언 레지스트리
- 사용자 지정 핸들러
- 기존 helper 함수를 엔진 연산으로 유지
- loader
- engine
- action registry
- assertion registry
- custom handlers
- 기존 헬퍼 함수를 엔진 작업으로 유지
결과물:
- 엔진이 단순 선언형 시나리오를 실행함
- 엔진이 단순 선언형 시나리오를 실행함
대부분 프롬프트 + 대기 + 단언으로 구성된 시나리오부터 시작:
우선 대부분 프롬프트 + 대기 + 단언으로 구성된 시나리오부터 시작:
- 스레드 후속 조치
- 첨부 파일의 이미지 이해
- skill 가시성 호출
- 채널 기준선
- 스레드 후속 응답
- 첨부에서의 이미지 이해
- skill 가시성 호출
- 채널 베이스라인
결과물:
- 일반 엔진을 통해 전달되는 첫 실제 마크다운 정의 시나리오 출시
- 최초의 실제 Markdown 정의 시나리오가 범용 엔진을 통해 제공됨
### 4단계: 중간 난이도 시나리오 마이그레이션
- 이미지 생성 왕복
- 채널 컨텍스트에서의 메모리 도구
- 세션 메모리 순위
- subagent handoff
- subagent fanout synthesis
- 세션 메모리 랭킹
- 서브에이전트 핸드오프
- 서브에이전트 팬아웃 합성
결과물:
- 변수, 아티팩트, 도구 단언, 요청 로그 단언이 실제로 검증됨
- 변수, 아티팩트, 도구 단언, request-log 단언이 검증됨
### 5단계: 어려운 시나리오는 사용자 지정 핸들러에 유지
### 5단계: 어려운 시나리오는 커스텀 핸들러에 유지
- 메모리 dreaming 스윕
- config apply 재시작 wake-up
- config 재시작 capability 전환
- memory dreaming sweep
- config apply 재시작 웨이크업
- config 재시작 기능 전환
- 런타임 인벤토리 드리프트
결과물:
- 동일한 작성 형식이지만 필요 시 명시적인 custom-step 블록 사용
- 동일한 작성 형식이지만, 필요 시 명시적인 custom-step 블록 사용
### 6단계: 하드코딩된 시나리오 맵 삭제
범위가 충분히 좋아지면:
커버리지가 충분히 좋아지면:
- `extensions/qa-lab/src/suite.ts`에서 대부분의 시나리오별 TypeScript 분기 제거
- `extensions/qa-lab/src/suite.ts`에서 대부분의 시나리오별 TypeScript 분기 제거
## 가짜 Slack / 리치 미디어 지원
현재 QA bus는 텍스트 우선입니다.
현재 QA 버스는 텍스트 우선입니다.
관련 파일:
@ -439,17 +443,17 @@ DSL은 저장된 출력과 이후 참조를 지원해야 합니다.
- `extensions/qa-lab/src/bus-server.ts`
- `extensions/qa-lab/web/src/ui-render.ts`
현재 QA bus가 지원하는 항목:
오늘날 QA 버스가 지원하는 항목:
- 텍스트
- 반응
- 스레드
아직 인라인 미디어 첨부 파일은 모델링하지 않습니다.
아직 인라인 미디어 첨부 모델링하지 않습니다.
### 필요한 전송 계약
일반적인 QA bus 첨부 파일 모델을 추가합니다.
범용 QA 버스 첨부 모델을 추가합니다:
```ts
type QaBusAttachment = {
@ -468,67 +472,67 @@ type QaBusAttachment = {
};
```
그다음 다음 항목에 `attachments?: QaBusAttachment[]`를 추가합니다.
다음 다음 항목`attachments?: QaBusAttachment[]`를 추가합니다:
- `QaBusMessage`
- `QaBusInboundMessageInput`
- `QaBusOutboundMessageInput`
### 왜 먼저 일반화해야 하나
### 왜 먼저 범용으로 해야 하는가
Slack 전용 미디어 모델을 만들지 마세요.
대신:
- 하나의 일반 QA 전송 모델
- 그 위에 여러 렌더러
- 하나의 범용 QA 전송 모델
- 그 위에 여러 렌더러를 구축
- 현재 QA Lab 채팅
- 향후 가짜 Slack 웹
- 그 외 다른 가짜 전송 뷰
- 기타 다른 가짜 전송 뷰
이렇게 하면 중복 로직을 방지하고 미디어 시나리오를 전송 방식에 독립적으로 유지할 수 있습니다.
이렇게 하면 로직 중복을 방지하고 미디어 시나리오가 전송 수단에 독립적으로 유지됩니다.
### 필요한 UI 작업
QA UI를 업데이트해 다음을 렌더링합니다.
QA UI를 업데이트하여 다음을 렌더링합니다:
- 인라인 이미지 미리보기
- 인라인 오디오 플레이어
- 인라인 비디오 플레이어
- 파일 첨부 chip
- 파일 첨부
현재 UI는 이미 스레드와 반응을 렌더링할 수 있으므로, 첨부 파일 렌더링도 동일한 메시지 카드 모델 위에 얹으면 됩니다.
현재 UI는 이미 스레드와 반응을 렌더링할 수 있으므로, 첨부 렌더링은 동일한 메시지 카드 모델 위에 계층화할 수 있어야 합니다.
### 미디어 전송이 가능하게 하는 시나리오 작업
### 미디어 전송으로 가능해지는 시나리오 작업
첨부 파일이 QA bus를 통해 흐르게 되면 더 풍부한 가짜 채팅 시나리오를 추가할 수 있습니다.
첨부가 QA 버스를 통해 흐르기 시작하면 더 풍부한 가짜 채팅 시나리오를 추가할 수 있습니다:
- 가짜 Slack의 인라인 이미지 응답
- 오디오 첨부 파일 이해
- 비디오 첨부 파일 이해
- 혼합 첨부 파일 순서
- 미디어를 유지한 스레드 응답
- 가짜 Slack에서의 인라인 이미지 응답
- 오디오 첨부 이해
- 비디오 첨부 이해
- 혼합 첨부 순서
- 미디어가 유지되는 스레드 응답
## 권장 사항
다음 구현 단위는 다음이어야 합니다.
다음 구현 단위는 다음이어야 합니다:
1. 마크다운 시나리오 로더 + zod 스키마 추가
2. 마크다운에서 현재 카탈로그 생성
3. 몇 가지 단순 시나리오를 먼저 마이그레이션
4. 일반 QA bus 첨부 파일 지원 추가
5. QA UI에 인라인 이미지 렌더링
6. 그다음 오디오와 비디오로 확장
1. Markdown 시나리오 로더 + zod 스키마 추가
2. 현재 카탈로그를 Markdown에서 생성
3. 먼저 몇 가지 단순 시나리오 마이그레이션
4. 범용 QA 버스 첨부 지원 추가
5. QA UI에 인라인 이미지 렌더링
6. 그 다음 오디오와 비디오로 확장
이것이 두 목표를 모두 입증하는 가장 작은 경로입니다.
이것이 두 목표를 모두 입증하는 가장 작은 경로입니다:
- 일반적인 마크다운 정의 QA
- 범용 Markdown 정의 QA
- 더 풍부한 가짜 메시징 표면
## 열린 질문
- 시나리오 파일이 변수 보간이 포함된 임베디드 마크다운 프롬프트 템플릿을 허용해야 하는지
- setup/cleanup이 이름 있는 섹션이어야 하는지 아니면 단순히 순서가 있는 액션 목록이면 되는지
- 아티팩트 참조를 스키마에서 강한 타입으로 둘지 문자열 기반으로 둘지
- 사용자 지정 핸들러가 하나의 레지스트리에 있어야 하는지, 표면별 레지스트리여야 하는지
- 생성된 JSON 호환성 파일을 마이그레이션 중에도 계속 체크인 상태로 유지해야 하는지
- 시나리오 파일에서 변수 보간이 포함된 내장 Markdown 프롬프트 템플릿을 허용해야 하는지 여부
- setup/cleanup을 이름 있는 섹션으로 둘지, 아니면 단순한 순서형 작업 목록으로 둘지 여부
- 아티팩트 참조를 스키마에서 강한 타입으로 둘지, 아니면 문자열 기반으로 둘지 여부
- 커스텀 핸들러를 하나의 레지스트리에 둘지, 아니면 surface별 레지스트리로 나눌지 여부
- 생성된 JSON 호환성 파일을 마이그레이션 중에도 계속 체크인 상태로 유지해야 하는지 여부

View File

@ -1,36 +1,36 @@
---
read_when:
- 채팅 명령을 사용하거나 구성할 때
- 명령 라우팅 또는 권한을 디버깅할 때
summary: 'Slash commands: 텍스트 vs 네이티브, 구성, 지원 명령'
title: Slash Commands
- 채팅 명령을 사용하거나 구성하는 경우
- 명령 라우팅 또는 권한을 디버그하는 경우
summary: '슬래시 명령: 텍스트 대 네이티브, 구성, 지원되는 명령'
title: 슬래시 명령
x-i18n:
generated_at: "2026-04-06T03:14:22Z"
generated_at: "2026-04-08T05:57:08Z"
model: gpt-5.4
provider: openai
source_hash: 417e35b9ddd87f25f6c019111b55b741046ea11039dde89210948185ced5696d
source_hash: 4a7ee7f1a8012058279b9e632889b291d4e659e4ec81209ca8978afbb9ad4b96
source_path: tools/slash-commands.md
workflow: 15
---
# Slash Commands
# 슬래시 명령
명령은 Gateway에서 처리됩니다. 대부분의 명령은 `/`로 시작하는 **독립 실행형** 메시지로 보내야 합니다.
host 전용 bash 채팅 명령은 `! <cmd>`를 사용합니다(` /bash <cmd>`는 별칭).
명령은 Gateway에서 처리됩니다. 대부분의 명령은 `/`로 시작하는 **독립형** 메시지로 보내야 합니다.
호스트 전용 bash 채팅 명령은 `! <cmd>`를 사용합니다(`/bash <cmd>`는 별칭).
서로 관련된 두 가지 시스템이 있습니다.
서로 관련된 두 시스템이 있습니다:
- **Commands**: 독립 실행`/...` 메시지
- **Directives**: `/think`, `/fast`, `/verbose`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`
- Directives는 모델이 메시지를 보기 전에 제거됩니다.
- 일반 채팅 메시지(지시어만 있는 메시지가 아님)에서는 “인라인 힌트”로 처리되며 세션 설정을 유지하지 않습니다.
- 지시어만 있는 메시지(메시지에 지시어만 포함됨)에서는 세션에 유지되며 확인 응답을 보냅니다.
- Directives는 **권한 있는 발신자**에게만 적용됩니다. `commands.allowFrom`이 설정되어 있으면 것만
directives와 commands에 사용되는 허용 목록이 되며, 그렇지 않으면 권한은 채널 허용 목록/페어링 + `commands.useAccessGroups`에서 옵니다.
권한이 없는 발신자에게는 directives가 일반 텍스트로 처리됩니다.
- **명령**: 독립`/...` 메시지
- **지시어**: `/think`, `/fast`, `/verbose`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`
- 지시어는 모델이 메시지를 보기 전에 제거됩니다.
- 일반 채팅 메시지에서는(지시어만 있는 메시지가 아님) “인라인 힌트”로 취급되며 세션 설정을 유지하지 않습니다.
- 지시어만 있는 메시지에서는(메시지가 지시어만 포함하는 경우) 세션에 유지되며 확인 응답을 반환합니다.
- 지시어는 **권한이 있는 발신자**에게만 적용됩니다. `commands.allowFrom`이 설정되어 있으면 것만
사용되는 허용 목록이며, 그렇지 않으면 권한 부여는 채널 허용 목록/페어링과 `commands.useAccessGroups`에서 옵니다.
권한이 없는 발신자에게는 지시어가 일반 텍스트로 처리됩니다.
또한 몇 가지 **인라인 단축키**도 있습니다(allowlist에 있거나 권한 있는 발신자만): `/help`, `/commands`, `/status`, `/whoami` (`/id`).
이들은 즉시 실행되고, 모델이 메시지를 보기 전에 제거되며, 남은 텍스트는 정상 흐름으로 계속 진행됩니다.
몇 가지 **인라인 바로가기**도 있습니다(허용 목록에 있거나 권한이 있는 발신자만): `/help`, `/commands`, `/status`, `/whoami` (`/id`).
이들은 즉시 실행되고, 모델이 메시지를 보기 전에 제거되며, 남은 텍스트는 일반 흐름을 계속 따릅니다.
## 구성
@ -46,7 +46,10 @@ host 전용 bash 채팅 명령은 `! <cmd>`를 사용합니다(` /bash <cmd>`는
mcp: false,
plugins: false,
debug: false,
restart: false,
restart: true,
ownerAllowFrom: ["discord:123456789012345678"],
ownerDisplay: "raw",
ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
allowFrom: {
"*": ["user1"],
discord: ["user:123"],
@ -56,150 +59,184 @@ host 전용 bash 채팅 명령은 `! <cmd>`를 사용합니다(` /bash <cmd>`는
}
```
- `commands.text`(기본값 `true`)는 채팅 메시지에서 `/...` 파싱을 활성화합니다.
- 네이티브 명령이 없는 표면(WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams)에서는 이를 `false`로 설정해도 텍스트 명령은 계속 동작합니다.
- `commands.text`(기본값 `true`)는 채팅 메시지에서 `/...` 구문 분석을 활성화합니다.
- 네이티브 명령이 없는 표면에서는(WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams) 이를 `false`로 설정해도 텍스트 명령은 계속 동작합니다.
- `commands.native`(기본값 `"auto"`)는 네이티브 명령을 등록합니다.
- 자동: Discord/Telegram에서는 켜짐, Slack에서는 꺼짐(Slack slash command를 추가하기 전까지), 네이티브 지원이 없는 공급자에서는 무시됨.
- 공급자별 재정의를 위해 `channels.discord.commands.native`, `channels.telegram.commands.native`, 또는 `channels.slack.commands.native`를 설정하세요(bool 또는 `"auto"`).
- 자동: Discord/Telegram에서는 켜짐, Slack에서는 꺼짐(슬래시 명령을 추가할 때까지), 네이티브 지원이 없는 provider에서는 무시됩니다.
- provider별로 재정의하려면 `channels.discord.commands.native`, `channels.telegram.commands.native`, 또는 `channels.slack.commands.native`를 설정하세요(bool 또는 `"auto"`).
- `false`는 시작 시 Discord/Telegram에서 이전에 등록된 명령을 지웁니다. Slack 명령은 Slack 앱에서 관리되며 자동으로 제거되지 않습니다.
- `commands.nativeSkills`(기본값 `"auto"`)는 지원되는 경우 **skill** 명령을 네이티브로 등록합니다.
- 자동: Discord/Telegram에서는 켜짐, Slack에서는 꺼짐(Slack은 skill별로 slash command를 하나씩 만들어야 함).
- 공급자별 재정의를 위해 `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills`, 또는 `channels.slack.commands.nativeSkills`를 설정하세요(bool 또는 `"auto"`).
- `commands.bash`(기본값 `false`)는 host 셸 명령을 실행하는 `! <cmd>`를 활성화합니다(` /bash <cmd>`는 별칭이며 `tools.elevated` allowlist가 필요).
- `commands.bashForegroundMs`(기본값 `2000`)는 bash가 백그라운드 모드로 전환되기 전에 얼마나 기다릴지 제어합니다(`0`이면 즉시 백그라운드 전환).
- `commands.nativeSkills`(기본값 `"auto"`)는 지원될 때 **skill** 명령을 네이티브로 등록합니다.
- 자동: Discord/Telegram에서는 켜짐, Slack에서는 꺼짐(Slack은 skill마다 슬래시 명령을 하나씩 만들어야 합니다).
- provider별로 재정의하려면 `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills`, 또는 `channels.slack.commands.nativeSkills`를 설정하세요(bool 또는 `"auto"`).
- `commands.bash`(기본값 `false`)는 `! <cmd>`로 호스트 셸 명령을 실행할 수 있게 합니다(`/bash <cmd>`는 별칭이며 `tools.elevated` 허용 목록 필요).
- `commands.bashForegroundMs`(기본값 `2000`)는 bash가 백그라운드 모드로 전환하기 전에 얼마나 기다릴지 제어합니다(`0`이면 즉시 백그라운드 처리).
- `commands.config`(기본값 `false`)는 `/config`를 활성화합니다(`openclaw.json` 읽기/쓰기).
- `commands.mcp`(기본값 `false`)는 `/mcp`를 활성화합니다(`mcp.servers` 아래의 OpenClaw 관리 MCP config 읽기/쓰기).
- `commands.plugins`(기본값 `false`)는 `/plugins`를 활성화합니다(plugin 색/상태와 설치 + 활성화/비활성화 제어).
- `commands.mcp`(기본값 `false`)는 `/mcp`를 활성화합니다(`mcp.servers` 아래의 OpenClaw 관리 MCP 구성을 읽기/쓰기).
- `commands.plugins`(기본값 `false`)는 `/plugins`를 활성화합니다(plugin 색/상태와 설치 + 활성화/비활성화 제어).
- `commands.debug`(기본값 `false`)는 `/debug`를 활성화합니다(런타임 전용 재정의).
- `commands.allowFrom`(선택 사항)은 명령 권한 부여를 위한 공급자별 허용 목록을 설정합니다. 구성되면 이것이
commands와 directives의 유일한 권한 부여 소스가 되며(채널 허용 목록/페어링과 `commands.useAccessGroups`
는 무시됨). 전역 기본값에는 `"*"`를 사용하고, 공급자별 키가 있으면 그것이 우선합니다.
- `commands.useAccessGroups`(기본값 `true`)는 `commands.allowFrom`이 설정되지 않았을 때 commands에 대해 허용 목록/정책을 적용합니다.
- `commands.restart`(기본값 `true`)는 `/restart`와 gateway 재시작 도구 동작을 활성화합니다.
- `commands.ownerAllowFrom`(선택 사항)은 소유자 전용 명령/도구 표면에 대한 명시적 소유자 허용 목록을 설정합니다. 이는 `commands.allowFrom`과 별개입니다.
- `commands.ownerDisplay`는 시스템 프롬프트에서 소유자 ID가 어떻게 표시되는지 제어합니다: `raw` 또는 `hash`.
- `commands.ownerDisplaySecret``commands.ownerDisplay="hash"`일 때 사용되는 HMAC 시크릿을 선택적으로 설정합니다.
- `commands.allowFrom`(선택 사항)은 명령 권한 부여를 위한 provider별 허용 목록을 설정합니다. 구성되면 이것이 명령과 지시어의
유일한 권한 부여 소스가 됩니다(채널 허용 목록/페어링과 `commands.useAccessGroups`는 무시됨). 전역 기본값에는 `"*"`를 사용하고, provider별 키가 이를 재정의합니다.
- `commands.useAccessGroups`(기본값 `true`)는 `commands.allowFrom`이 설정되지 않았을 때 명령에 대해 허용 목록/정책을 적용합니다.
## 명령 목록
텍스트 + 네이티브(활성화된 경우):
현재 소스 오브 트루스:
- `/help`
- `/commands`
- `/tools [compact|verbose]` (현재 에이전트가 지금 바로 사용할 수 있는 것을 표시; `verbose`는 설명 추가)
- `/skill <name> [input]` (이름으로 skill 실행)
- `/status` (현재 상태 표시; 사용 가능한 경우 현재 모델 공급자의 공급자 사용량/할당량 포함)
- `/tasks` (현재 세션의 백그라운드 작업 나열; agent-local 폴백 횟수와 함께 활성/최근 작업 세부 정보 표시)
- `/allowlist` (허용 목록 항목 나열/추가/제거)
- `/approve <id> <decision>` (exec 승인 프롬프트 해결; 사용 가능한 결정은 대기 중 승인 메시지를 사용)
- `/context [list|detail|json]` (“context” 설명; `detail`은 파일별 + 도구별 + skill별 + 시스템 프롬프트 크기 표시)
- `/btw <question>` (현재 세션에 대한 일회성 사이드 질문을 미래 세션 컨텍스트를 바꾸지 않고 수행; [/tools/btw](/ko/tools/btw) 참고)
- `/export-session [path]` (별칭: `/export`) (전체 시스템 프롬프트와 함께 현재 세션을 HTML로 내보내기)
- `/whoami` (발신자 id 표시; 별칭: `/id`)
- `/session idle <duration|off>` (포커스된 스레드 바인딩의 비활성 자동 언포커스 관리)
- `/session max-age <duration|off>` (포커스된 스레드 바인딩의 하드 max-age 자동 언포커스 관리)
- `/subagents list|kill|log|info|send|steer|spawn` (현재 세션에 대한 서브에이전트 실행 검사, 제어, 생성)
- `/acp spawn|cancel|steer|close|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|sessions` (ACP 런타임 세션 검사 및 제어)
- `/agents` (이 세션에 스레드 바인딩된 에이전트 나열)
- `/focus <target>` (Discord: 이 스레드 또는 새 스레드를 세션/서브에이전트 대상에 바인딩)
- `/unfocus` (Discord: 현재 스레드 바인딩 제거)
- `/kill <id|#|all>` (이 세션의 실행 중인 하나 또는 모든 서브에이전트를 즉시 중단, 확인 메시지 없음)
- `/steer <id|#> <message>` (실행 중인 서브에이전트를 즉시 조향: 가능하면 실행 중에, 아니면 현재 작업을 중단하고 조향 메시지로 재시작)
- `/tell <id|#> <message>` (`/steer`의 별칭)
- `/config show|get|set|unset` (config를 디스크에 지속 저장, 소유자 전용; `commands.config: true` 필요)
- `/mcp show|get|set|unset` (OpenClaw MCP server config 관리, 소유자 전용; `commands.mcp: true` 필요)
- `/plugins list|show|get|install|enable|disable` (탐색된 plugin 검사, 새 plugin 설치, 활성화 전환; 쓰기는 소유자 전용; `commands.plugins: true` 필요)
- `/plugin``/plugins`의 별칭입니다.
- `/plugin install <spec>``openclaw plugins install`과 동일한 plugin spec을 받습니다: 로컬 경로/아카이브, npm 패키지, 또는 `clawhub:<pkg>`.
- 활성화/비활성화 쓰기 후에도 재시작 힌트로 응답합니다. watched foreground gateway에서는 OpenClaw가 쓰기 직후 자동으로 재시작할 수 있습니다.
- `/debug show|set|unset|reset` (런타임 재정의, 소유자 전용; `commands.debug: true` 필요)
- `/usage off|tokens|full|cost` (응답별 사용량 푸터 또는 로컬 비용 요약)
- `/tts off|always|inbound|tagged|status|provider|limit|summary|audio` (TTS 제어; [/tts](/ko/tools/tts) 참고)
- Discord: 네이티브 명령은 `/voice`입니다(Discord는 `/tts` 예약). 텍스트 `/tts`는 계속 동작합니다.
- `/stop`
- `/restart`
- `/dock-telegram` (별칭: `/dock_telegram`) (응답을 Telegram으로 전환)
- `/dock-discord` (별칭: `/dock_discord`) (응답을 Discord로 전환)
- `/dock-slack` (별칭: `/dock_slack`) (응답을 Slack으로 전환)
- `/activation mention|always` (그룹 전용)
- `/send on|off|inherit` (소유자 전용)
- `/reset` 또는 `/new [model]` (선택적 모델 힌트, 나머지는 그대로 전달됨)
- `/think <off|minimal|low|medium|high|xhigh>` (모델/공급자별 동적 선택지; 별칭: `/thinking`, `/t`)
- `/fast status|on|off` (인수를 생략하면 현재 유효한 fast-mode 상태 표시)
- `/verbose on|full|off` (별칭: `/v`)
- `/reasoning on|off|stream` (별칭: `/reason`; on이면 `Reasoning:`으로 시작하는 별도 메시지를 보냄, `stream` = Telegram draft 전용)
- `/elevated on|off|ask|full` (별칭: `/elev`; `full`은 exec 승인을 건너뜀)
- `/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>` (현재 값을 보려면 `/exec` 전송)
- `/model <name>` (별칭: `/models`; 또는 `agents.defaults.models.*.alias``/<alias>`)
- `/queue <mode>` (`debounce:2s cap:25 drop:summarize` 같은 옵션 포함; 현재 설정을 보려면 `/queue` 전송)
- `/bash <command>` (host 전용; `! <command>`의 별칭; `commands.bash: true` + `tools.elevated` allowlist 필요)
- `/dreaming [on|off|status|help]` (전역 dreaming 전환 또는 상태 표시; [Dreaming](/concepts/dreaming) 참고)
- 코어 내장 명령은 `src/auto-reply/commands-registry.shared.ts`에서 옵니다
- 생성된 dock 명령은 `src/auto-reply/commands-registry.data.ts`에서 옵니다
- plugin 명령은 plugin `registerCommand()` 호출에서 옵니다
- gateway에서 실제 사용 가능 여부는 여전히 구성 플래그, 채널 표면, 설치/활성화된 plugins에 따라 달라집니다
텍스트 전용:
### 코어 내장 명령
- `/compact [instructions]` ([/concepts/compaction](/ko/concepts/compaction) 참고)
- `! <command>` (host 전용; 한 번에 하나씩; 장기 실행 작업에는 `!poll` + `!stop` 사용)
- `!poll` (출력/상태 확인; 선택적으로 `sessionId` 허용; `/bash poll`도 동작)
- `!stop` (실행 중인 bash 작업 중지; 선택적으로 `sessionId` 허용; `/bash stop`도 동작)
현재 사용 가능한 내장 명령:
- `/new [model]`은 새 세션을 시작합니다. `/reset`은 reset 별칭입니다.
- `/compact [instructions]`는 세션 컨텍스트를 압축합니다. [/concepts/compaction](/ko/concepts/compaction)을 참조하세요.
- `/stop`은 현재 실행을 중단합니다.
- `/session idle <duration|off>``/session max-age <duration|off>`는 스레드 바인딩 만료를 관리합니다.
- `/think <off|minimal|low|medium|high|xhigh>`는 thinking 수준을 설정합니다. 별칭: `/thinking`, `/t`.
- `/verbose on|off|full`은 자세한 출력 표시를 전환합니다. 별칭: `/v`.
- `/fast [status|on|off]`는 fast 모드를 표시하거나 설정합니다.
- `/reasoning [on|off|stream]`은 reasoning 표시 여부를 전환합니다. 별칭: `/reason`.
- `/elevated [on|off|ask|full]`은 elevated 모드를 전환합니다. 별칭: `/elev`.
- `/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>`는 exec 기본값을 표시하거나 설정합니다.
- `/model [name|#|status]`는 모델을 표시하거나 설정합니다.
- `/models [provider] [page] [limit=<n>|size=<n>|all]`는 provider 또는 provider의 모델을 나열합니다.
- `/queue <mode>`는 큐 동작(`steer`, `interrupt`, `followup`, `collect`, `steer-backlog`)과 `debounce:2s cap:25 drop:summarize` 같은 옵션을 관리합니다.
- `/help`는 짧은 도움말 요약을 표시합니다.
- `/commands`는 생성된 명령 카탈로그를 표시합니다.
- `/tools [compact|verbose]`는 현재 에이전트가 지금 사용할 수 있는 것을 보여줍니다.
- `/status`는 가능한 경우 provider 사용량/할당량을 포함한 런타임 상태를 보여줍니다.
- `/tasks`는 현재 세션의 활성/최근 백그라운드 작업을 나열합니다.
- `/context [list|detail|json]`는 컨텍스트가 어떻게 조립되는지 설명합니다.
- `/export-session [path]`는 현재 세션을 HTML로 내보냅니다. 별칭: `/export`.
- `/whoami`는 발신자 ID를 보여줍니다. 별칭: `/id`.
- `/skill <name> [input]`은 이름으로 skill을 실행합니다.
- `/allowlist [list|add|remove] ...`는 허용 목록 항목을 관리합니다. 텍스트 전용.
- `/approve <id> <decision>`은 exec 승인 프롬프트를 해결합니다.
- `/btw <question>`은 미래 세션 컨텍스트를 바꾸지 않고 곁가지 질문을 합니다. [/tools/btw](/ko/tools/btw)를 참조하세요.
- `/subagents list|kill|log|info|send|steer|spawn`은 현재 세션의 서브에이전트 실행을 관리합니다.
- `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help`는 ACP 세션 및 런타임 옵션을 관리합니다.
- `/focus <target>`은 현재 Discord 스레드 또는 Telegram 토픽/대화를 세션 대상으로 바인딩합니다.
- `/unfocus`는 현재 바인딩을 제거합니다.
- `/agents`는 현재 세션의 스레드 바인딩된 에이전트를 나열합니다.
- `/kill <id|#|all>`은 하나 또는 모든 실행 중인 서브에이전트를 중단합니다.
- `/steer <id|#> <message>`는 실행 중인 서브에이전트에 steering을 보냅니다. 별칭: `/tell`.
- `/config show|get|set|unset``openclaw.json`을 읽거나 씁니다. 소유자 전용. `commands.config: true` 필요.
- `/mcp show|get|set|unset``mcp.servers` 아래의 OpenClaw 관리 MCP 서버 구성을 읽거나 씁니다. 소유자 전용. `commands.mcp: true` 필요.
- `/plugins list|inspect|show|get|install|enable|disable`은 plugin 상태를 조회하거나 변경합니다. `/plugin`은 별칭입니다. 쓰기는 소유자 전용. `commands.plugins: true` 필요.
- `/debug show|set|unset|reset`은 런타임 전용 구성 재정의를 관리합니다. 소유자 전용. `commands.debug: true` 필요.
- `/usage off|tokens|full|cost`는 응답별 사용량 푸터를 제어하거나 로컬 비용 요약을 출력합니다.
- `/tts on|off|status|provider|limit|summary|audio|help`는 TTS를 제어합니다. [/tools/tts](/ko/tools/tts)를 참조하세요.
- `/restart`는 활성화되어 있을 때 OpenClaw를 재시작합니다. 기본값: 활성화됨. 비활성화하려면 `commands.restart: false`를 설정하세요.
- `/activation mention|always`는 그룹 활성화 모드를 설정합니다.
- `/send on|off|inherit`는 전송 정책을 설정합니다. 소유자 전용.
- `/bash <command>`는 호스트 셸 명령을 실행합니다. 텍스트 전용. 별칭: `! <command>`. `commands.bash: true``tools.elevated` 허용 목록 필요.
- `!poll [sessionId]`는 백그라운드 bash 작업을 확인합니다.
- `!stop [sessionId]`는 백그라운드 bash 작업을 중지합니다.
### 생성된 dock 명령
Dock 명령은 네이티브 명령 지원이 있는 채널 plugins에서 생성됩니다. 현재 번들된 세트:
- `/dock-discord`(별칭: `/dock_discord`)
- `/dock-mattermost`(별칭: `/dock_mattermost`)
- `/dock-slack`(별칭: `/dock_slack`)
- `/dock-telegram`(별칭: `/dock_telegram`)
### 번들된 plugin 명령
번들된 plugins는 더 많은 슬래시 명령을 추가할 수 있습니다. 이 리포지토리의 현재 번들 명령:
- `/dreaming [on|off|status|help]`는 메모리 dreaming을 전환합니다. [Dreaming](/ko/concepts/dreaming)을 참조하세요.
- `/pair [qr|status|pending|approve|cleanup|notify]`는 디바이스 페어링/설정 흐름을 관리합니다. [Pairing](/ko/channels/pairing)을 참조하세요.
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm`은 고위험 phone 노드 명령을 일시적으로 활성화합니다.
- `/voice status|list [limit]|set <voiceId|name>`는 Talk 음성 구성을 관리합니다. Discord에서 네이티브 명령 이름은 `/talkvoice`입니다.
- `/card ...`는 LINE 리치 카드 프리셋을 전송합니다. [LINE](/ko/channels/line)을 참조하세요.
- QQBot 전용 명령:
- `/bot-ping`
- `/bot-version`
- `/bot-help`
- `/bot-upgrade`
- `/bot-logs`
### 동적 skill 명령
사용자가 호출할 수 있는 skills도 슬래시 명령으로 노출됩니다:
- `/skill <name> [input]`은 항상 일반 진입점으로 동작합니다.
- skill/plugin이 등록하면 `/prose` 같은 직접 명령으로도 나타날 수 있습니다.
- 네이티브 skill 명령 등록은 `commands.nativeSkills``channels.<provider>.commands.nativeSkills`로 제어됩니다.
참고:
- 명령은 명령과 인수 사이에 선택적으로 `:`를 받을 수 있습니다(예: `/think: high`, `/send: on`, `/help:`).
- `/new <model>`은 모델 별칭, `provider/model`, 또는 공급자 이름(퍼지 매칭)을 받습니다. 일치하지 않으면 텍스트는 메시지 본문으로 처리됩니다.
- 전체 공급자 사용량 분석은 `openclaw status --usage`를 사용하세요.
- 명령은 명령과 인수 사이에 선택적 `:`를 받을 수 있습니다(예: `/think: high`, `/send: on`, `/help:`).
- `/new <model>`은 모델 별칭, `provider/model`, 또는 provider 이름(퍼지 매치)을 받을 수 있으며, 일치하는 것이 없으면 텍스트는 메시지 본문으로 처리됩니다.
- 전체 provider 사용량 분석에는 `openclaw status --usage`를 사용하세요.
- `/allowlist add|remove``commands.config=true`가 필요하며 채널 `configWrites`를 따릅니다.
- 멀티 계정 채널에서는 config 대상 `/allowlist --account <id>``/config set channels.<provider>.accounts.<id>...`도 대상 계정의 `configWrites`를 따릅니다.
- 다중 계정 채널에서 구성 대상 `/allowlist --account <id>``/config set channels.<provider>.accounts.<id>...`도 대상 계정의 `configWrites`를 따릅니다.
- `/usage`는 응답별 사용량 푸터를 제어합니다. `/usage cost`는 OpenClaw 세션 로그에서 로컬 비용 요약을 출력합니다.
- `/restart`는 기본적으로 활성화됩니다. 비활성화하려면 `commands.restart: false`를 설정하세요.
- Discord 전용 네이티브 명령: `/vc join|leave|status`는 음성 채널을 제어합니다(`channels.discord.voice`와 네이티브 명령 필요, 텍스트로는 사용 불가).
- `/restart`는 기본적으로 활성화되어 있습니다. 비활성화하려면 `commands.restart: false`를 설정하세요.
- `/plugins install <spec>``openclaw plugins install`과 동일한 plugin spec을 받습니다: 로컬 경로/아카이브, npm 패키지, 또는 `clawhub:<pkg>`.
- `/plugins enable|disable`는 plugin 구성을 업데이트하며 재시작을 요청할 수 있습니다.
- Discord 전용 네이티브 명령: `/vc join|leave|status`는 음성 채널을 제어합니다(`channels.discord.voice` 및 네이티브 명령 필요, 텍스트로는 사용 불가).
- Discord 스레드 바인딩 명령(`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`)은 유효한 스레드 바인딩이 활성화되어 있어야 합니다(`session.threadBindings.enabled` 및/또는 `channels.discord.threadBindings.enabled`).
- ACP 명령 참조와 런타임 동작: [ACP Agents](/ko/tools/acp-agents).
- `/verbose`는 디버깅과 추가 가시성을 위한 것입니다. 일반 사용에서는 **꺼둔 상태**를 유지하세요.
- `/fast on|off`는 세션 재정의를 유지합니다. 이를 지우고 config 기본값으로 되돌리려면 Sessions UI의 `inherit` 옵션을 사용하세요.
- `/fast`는 공급자별입니다. OpenAI/OpenAI Codex는 이를 네이티브 Responses 엔드포인트에서 `service_tier=priority`로 매핑하는 반면, `api.anthropic.com`으로 보내는 OAuth 인증 트래픽을 포함한 직접 공개 Anthropic 요청은 이를 `service_tier=auto` 또는 `standard_only`로 매핑합니다. [OpenAI](/ko/providers/openai) 및 [Anthropic](/ko/providers/anthropic)을 참고하세요.
- 도구 실패 요약은 관련이 있을 때 계속 표시되지만, 자세한 실패 텍스트는 `/verbose``on` 또는 `full`일 때만 포함됩니다.
- `/reasoning`(및 `/verbose`)은 그룹 설정에서 위험할 수 있습니다. 노출 의도가 없던 내부 reasoning 또는 도구 출력을 드러낼 수 있습니다. 특히 그룹 채팅에서는 꺼 두는 것이 좋습니다.
- `/model`은 새로운 세션 모델을 즉시 유지합니다.
- 에이전트가 유휴 상태이면 다음 실행에서 즉시 사용됩니다.
- 실행이 이미 진행 중이면 OpenClaw는 live 전환을 보류로 표시하고 깔끔한 재시도 지점에서만 새 모델로 재시작합니다.
- 도구 활동이나 응답 출력이 이미 시작되었다면, 보류 중인 전환은 나중 재시도 기회나 다음 사용자 턴까지 대기할 수 있습니다.
- **빠른 경로:** allowlist에 있는 발신자의 명령 전용 메시지는 즉시 처리됩니다(큐 + 모델 우회).
- **그룹 멘션 게이팅:** allowlist에 있는 발신자의 명령 전용 메시지는 멘션 요구 사항을 우회합니다.
- **인라인 단축키(allowlist에 있는 발신자만):** 일부 명령은 일반 메시지 안에 포함되어도 동작하며 모델이 남은 텍스트를 보기 전에 제거됩니다.
- 예: `hey /status`는 상태 응답을 트리거하고, 남은 텍스트는 정상 흐름으로 계속 진행됩니다.
- ACP 명령 참조 및 런타임 동작: [ACP 에이전트](/ko/tools/acp-agents).
- `/verbose`는 디버깅과 추가 가시성을 위한 것입니다. 일반 사용에서는 **꺼짐**으로 유지하세요.
- `/fast on|off`는 세션 재정의를 유지합니다. 이를 지우고 구성 기본값으로 되돌리려면 Sessions UI의 `inherit` 옵션을 사용하세요.
- `/fast`provider별입니다: OpenAI/OpenAI Codex는 이를 네이티브 Responses 엔드포인트에서 `service_tier=priority`에 매핑하고, `api.anthropic.com`으로 전송되는 OAuth 인증 트래픽을 포함한 직접 공개 Anthropic 요청은 이를 `service_tier=auto` 또는 `standard_only`에 매핑합니다. [OpenAI](/ko/providers/openai)와 [Anthropic](/ko/providers/anthropic)을 참조하세요.
- 도구 실패 요약은 관련 있을 때 여전히 표시되지만, 자세한 실패 텍스트는 `/verbose``on` 또는 `full`일 때만 포함됩니다.
- `/reasoning`(및 `/verbose`)은 그룹 설정에서 위험할 수 있습니다. 노출하려 하지 않았던 내부 reasoning 또는 도구 출력을 드러낼 수 있습니다. 특히 그룹 채팅에서는 꺼둔 상태를 유지하는 것이 좋습니다.
- `/model`은 새 세션 모델을 즉시 유지합니다.
- 에이전트가 유휴 상태이면 다음 실행에서 바로 사용합니다.
- 이미 실행이 활성 상태이면 OpenClaw는 라이브 전환을 보류 중으로 표시하고 깔끔한 재시도 시점에만 새 모델로 재시작합니다.
- 도구 활동이나 응답 출력이 이미 시작된 경우, 보류 중인 전환은 이후 재시도 기회나 다음 사용자 턴까지 대기열에 남을 수 있습니다.
- **빠른 경로:** 허용 목록에 있는 발신자의 명령 전용 메시지는 즉시 처리됩니다(큐 + 모델 우회).
- **그룹 멘션 게이팅:** 허용 목록에 있는 발신자의 명령 전용 메시지는 멘션 요구 사항을 우회합니다.
- **인라인 바로가기(허용 목록에 있는 발신자만):** 일부 명령은 일반 메시지에 포함되어 있어도 동작하며, 모델이 나머지 텍스트를 보기 전에 제거됩니다.
- 예: `hey /status`는 상태 응답을 트리거하고, 남은 텍스트는 일반 흐름을 계속 따릅니다.
- 현재: `/help`, `/commands`, `/status`, `/whoami` (`/id`)
- 권한 없는 명령 전용 메시지는 조용히 무시되며, 인라인 `/...` 토큰은 일반 텍스트로 처리됩니다.
- **Skill commands:** `user-invocable` skills는 slash command로 노출됩니다. 이름은 `a-z0-9_`로 정리되며(최대 32자), 충돌 시 숫자 접미사가 붙습니다(예: `_2`).
- `/skill <name> [input]`은 이름으로 skill을 실행합니다(skill별 명령에 대한 네이티브 명령 제한이 있을 때 유용).
- 기본적으로 skill 명령은 정상 요청으로 모델에 전달됩니다.
- skills는 선택적으로 `command-dispatch: tool`을 선언하여 명령을 도구로 직접 라우팅할 수 있습니다(결정적, 모델 없음).
- 예: `/prose` (OpenProse plugin) — [OpenProse](/ko/prose) 참고
- **네이티브 명령 인수:** Discord는 동적 옵션에 autocomplete를 사용합니다(필수 인수를 생략하면 버튼 메뉴도 사용). Telegram과 Slack은 명령이 선택지를 지원하고 인수를 생략하면 버튼 메뉴를 표시합니다.
- 권한 없는 명령 전용 메시지는 조용히 무시되며, 인라인 `/...` 토큰은 일반 텍스트로 처리됩니다.
- **Skill 명령:** `user-invocable` skills는 슬래시 명령으로 노출됩니다. 이름은 `a-z0-9_`로 정리되며(최대 32자), 충돌 시 숫자 접미사가 붙습니다(예: `_2`).
- `/skill <name> [input]`은 이름으로 skill을 실행합니다(네이티브 명령 제한 때문에 skill별 명령이 불가능할 때 유용).
- 기본적으로 skill 명령은 일반 요청으로 모델에 전달됩니다.
- skill은 선택적으로 `command-dispatch: tool`을 선언하여 명령을 직접 도구로 라우팅할 수 있습니다(결정적이며 모델 없음).
- 예: `/prose`(OpenProse plugin) — [OpenProse](/ko/prose)를 참조하세요.
- **네이티브 명령 인수:** Discord는 동적 옵션에 자동완성을 사용합니다(필수 인수를 생략하면 버튼 메뉴도 사용). Telegram과 Slack은 명령이 선택지를 지원하고 인수를 생략하면 버튼 메뉴를 표시합니다.
## `/tools`
`/tools`는 config 질문이 아니라 런타임 질문에 답합니다. 즉, **이 에이전트가 지금
이 대화에서 실제로 무엇을 사용할 수 있는가**입니다.
`/tools`구성 질문이 아니라 런타임 질문에 답합니다: **이 에이전트가 지금
이 대화에서 무엇을 사용할 수 있는가**.
- 기본 `/tools`는 compact하며 빠르게 훑어보기에 최적화되어 있습니다.
- 기본 `/tools`간결하며 빠르게 훑어보기에 최적화되어 있습니다.
- `/tools verbose`는 짧은 설명을 추가합니다.
- 인수를 지원하는 네이티브 명령 표면은 `compact|verbose`와 같은 모드 전환을 노출합니다.
- 결과는 세션 범위이므로 에이전트, 채널, 스레드, 발신자 권한, 모델을 변경하면 출력이
달라질 수 있습니다.
- `/tools`에는 core 도구, 연결된
plugin 도구, 채널 소유 도구를 포함하여 런타임에서 실제 도달 가능한 도구가 포함됩니다.
- 결과는 세션 범위이므로 에이전트, 채널, 스레드, 발신자 권한, 또는 모델을 변경하면
출력이 바뀔 수 있습니다.
- `/tools`는 코어 도구, 연결된
plugin 도구, 채널 소유 도구를 포함해 런타임에서 실제로 도달 가능한 도구를 포함합니다.
프로필 및 재정의 편집은 `/tools`를 정적 카탈로그처럼 다루기보다
Control UI Tools 패널이나 config/catalog 표면을 사용하세요.
프로필 및 재정의 편집은 `/tools`를 정적 카탈로그처럼 취급하는 대신
Control UI Tools 패널 또는 구성/카탈로그 표면을 사용하세요.
## 사용량 표면(어디에 무엇이 표시되는지)
- **공급자 사용량/할당량**(예: “Claude 80% left”)은 사용량 추적이 활성화되어 있을 때 현재 모델 공급자에 대해 `/status`에 표시됩니다. OpenClaw는 공급자 기간을 `% left`로 정규화합니다. MiniMax의 경우 남은 양만 나타내는 퍼센트 필드는 표시 전에 반전되며, `model_remains` 응답은 채팅 모델 항목과 모델 태그가 붙은 플랜 레이블을 우선 사용합니다.
- `/status`의 **토큰/캐시 줄**은 live 세션 스냅샷이 빈약할 때 최신 transcript 사용량 항목으로 폴백할 수 있습니다. 기존의 0이 아닌 live 값은 여전히 우선하며, transcript 폴백은 저장된 총계가 없거나 더 작을 때 활성 런타임 모델 레이블과 더 큰 프롬프트 지향 총량도 복구할 수 있습니다.
- **응답별 토큰/비용**은 `/usage off|tokens|full`로 제어됩니다(일반 응답에 덧붙여짐).
- **Provider 사용량/할당량**(예: “Claude 80% left”)은 사용량 추적이 활성화되어 있을 때 현재 모델 provider의 `/status`에 표시됩니다. OpenClaw는 provider 윈도우를 `% left`로 정규화합니다. MiniMax의 경우 남은 비율 전용 필드는 표시 전에 반전되며, `model_remains` 응답은 모델 태그가 있는 플랜 라벨과 함께 채팅 모델 항목을 우선합니다.
- `/status`의 **토큰/캐시 줄**은 라이브 세션 스냅샷이 희소할 때 최신 대화 기록 사용량 항목으로 대체될 수 있습니다. 기존의 0이 아닌 라이브 값이 여전히 우선하며, 대화 기록 대체는 저장된 총계가 없거나 더 작을 때 활성 런타임 모델 라벨과 더 큰 프롬프트 지향 총계도 복구할 수 있습니다.
- **응답별 토큰/비용**은 `/usage off|tokens|full`로 제어됩니다(일반 응답에 추가됨).
- `/model status`는 사용량이 아니라 **모델/인증/엔드포인트**에 관한 것입니다.
## 모델 선택(`/model`)
## 모델 선택(``/model`)
`/model`은 directive로 구현됩니다.
`/model`지시어로 구현됩니다.
예시:
예:
```
/model
@ -212,16 +249,16 @@ Control UI Tools 패널이나 config/catalog 표면을 사용하세요.
참고:
- `/model``/model list`compact하고 번호가 매겨진 선택기(모델 패밀리 + 사용 가능한 공급자)를 표시합니다.
- Discord에서`/model``/models`가 공급자 및 모델 드롭다운과 Submit 단계가 있는 대화형 선택기를 엽니다.
- `/model <#>`는 해당 선택기에서 선택합니다(가능하면 현재 공급자를 우선함).
- `/model status`자세한 보기를 표시하며, 사용 가능한 경우 구성된 공급자 엔드포인트(`baseUrl`)와 API 모드(`api`)를 포함합니다.
- `/model``/model list`간결한 번호형 선택기(모델 패밀리 + 사용 가능한 providers)를 보여줍니다.
- Discord에서 `/model``/models`는 provider 및 모델 드롭다운과 Submit 단계를 포함한 대화형 선택기를 엽니다.
- `/model <#>`는 해당 선택기에서 선택합니다(가능하면 현재 provider를 우선).
- `/model status`구성된 provider 엔드포인트(`baseUrl`)와 가능한 경우 API 모드(`api`)를 포함한 자세한 보기를 보여줍니다.
## 디버그 재정의
`/debug`를 사용하면 **런타임 전용** config 재정의(메모리, 디스크 아님)를 설정할 수 있습니다. 소유자 전용입니다. 기본적으로 비활성화되어 있으며 `commands.debug: true`로 활성화하세요.
`/debug`**런타임 전용** 구성 재정의(메모리, 디스크 아님)를 설정할 수 있게 합니다. 소유자 전용. 기본적으로 비활성화되어 있으며 `commands.debug: true`로 활성화합니다.
:
예:
```
/debug show
@ -233,14 +270,14 @@ Control UI Tools 패널이나 config/catalog 표면을 사용하세요.
참고:
- 재정의는 새 config 읽기에 즉시 적용되지만 `openclaw.json`에 기록되지는 않습니다.
- 모든 재정의를 지우고 디스크의 config로 돌아가려면 `/debug reset`을 사용하세요.
- 재정의는 새 구성 읽기에 즉시 적용되지만 `openclaw.json`에는 쓰지 않습니다.
- 모든 재정의를 지우고 디스크의 구성으로 돌아가려면 `/debug reset`을 사용하세요.
## Config 업데이트
## 구성 업데이트
`/config`는 디스크의 config(`openclaw.json`)에 기록합니다. 소유자 전용입니다. 기본적으로 비활성화되어 있으며 `commands.config: true`로 활성화하세요.
`/config`는 디스크의 구성(`openclaw.json`)에 씁니다. 소유자 전용. 기본적으로 비활성화되어 있으며 `commands.config: true`로 활성화합니다.
:
예:
```
/config show
@ -252,14 +289,14 @@ Control UI Tools 패널이나 config/catalog 표면을 사용하세요.
참고:
- config는 기록 전에 검증되며, 유효하지 않은 변경은 거부됩니다.
- 쓰기 전에 구성이 검증되며, 잘못된 변경은 거부됩니다.
- `/config` 업데이트는 재시작 후에도 유지됩니다.
## MCP 업데이트
`/mcp``mcp.servers` 아래의 OpenClaw 관리 MCP server 정의를 기록합니다. 소유자 전용입니다. 기본적으로 비활성화되어 있으며 `commands.mcp: true`로 활성화하세요.
`/mcp``mcp.servers` 아래의 OpenClaw 관리 MCP 서버 정의를 씁니다. 소유자 전용. 기본적으로 비활성화되어 있으며 `commands.mcp: true`로 활성화합니다.
:
예:
```text
/mcp show
@ -270,14 +307,14 @@ Control UI Tools 패널이나 config/catalog 표면을 사용하세요.
참고:
- `/mcp`는 Pi 소유 프로젝트 설정이 아니라 OpenClaw config에 저장합니다.
- 실제로 어떤 전송이 실행 가능한지는 런타임 어댑터가 결정합니다.
- `/mcp`는 Pi 소유 프로젝트 설정이 아니라 OpenClaw 구성에 저장합니다.
- 어떤 전송을 실제로 실행할 수 있는지는 런타임 어댑터가 결정합니다.
## Plugin 업데이트
`/plugins`를 통해 운영자는 탐색된 plugin을 검사하고 config에서 활성화를 전환할 수 있습니다. 읽기 전용 흐름에서는 `/plugin`을 별칭으로 사용할 수 있습니다. 기본적으로 비활성화되어 있으며 `commands.plugins: true`로 활성화하세요.
`/plugins`는 운영자가 검색된 plugins를 검사하고 구성에서 활성화 여부를 전환할 수 있게 합니다. 읽기 전용 흐름에서는 `/plugin`을 별칭으로 사용할 수 있습니다. 기본적으로 비활성화되어 있으며 `commands.plugins: true`로 활성화합니다.
:
예:
```text
/plugins
@ -289,40 +326,41 @@ Control UI Tools 패널이나 config/catalog 표면을 사용하세요.
참고:
- `/plugins list``/plugins show`는 현재 작업공간과 디스크상의 config를 기준으로 실제 plugin 탐색을 사용합니다.
- `/plugins enable|disable`는 plugin config만 업데이트하며 plugin을 설치하거나 제거하지 않습니다.
- 활성화/비활성화 변경 후 적용하려면 gateway를 재시작하세요.
- `/plugins list``/plugins show`는 현재 워크스페이스와 디스크 구성을 대상으로 실제 plugin 검색을 사용합니다.
- `/plugins enable|disable`는 plugin 구성만 업데이트하며 plugin을 설치하거나 제거하지 않습니다.
- 활성화/비활성화 변경 후에는 적용을 위해 gateway를 재시작하세요.
## 표면 참고
- **텍스트 명령**은 정상 채팅 세션에서 실행됩니다(DM은 `main`을 공유하고, 그룹은 자체 세션을 가짐).
- **네이티브 명령**은 격리된 세션을 사용합니다.
- **텍스트 명령**은 일반 채팅 세션에서 실행됩니다(DM은 `main`을 공유하고, 그룹은 자체 세션을 가짐).
- **네이티브 명령**은 격리된 세션을 사용합니다:
- Discord: `agent:<agentId>:discord:slash:<userId>`
- Slack: `agent:<agentId>:slack:slash:<userId>` (접두사는 `channels.slack.slashCommand.sessionPrefix`로 구성 가능)
- Telegram: `telegram:slash:<userId>` (`CommandTargetSessionKey`를 통해 채팅 세션을 대상으로 지정)
- Slack: `agent:<agentId>:slack:slash:<userId>`(접두사는 `channels.slack.slashCommand.sessionPrefix`로 구성 가능)
- Telegram: `telegram:slash:<userId>`(`CommandTargetSessionKey`를 통해 채팅 세션을 대상으로 )
- **`/stop`**은 활성 채팅 세션을 대상으로 하므로 현재 실행을 중단할 수 있습니다.
- **Slack:** `channels.slack.slashCommand`는 단일 `/openclaw` 스타일 명령용으로 여전히 지원됩니다. `commands.native`를 활성화하면 내장 명령마다 Slack slash command를 하나씩 만들어야 합니다(`/help`와 같은 이름). Slack용 명령 인수 메뉴는 ephemeral Block Kit 버튼으로 전달됩니다.
- Slack 네이티브 예외: Slack이 `/status`를 예약했기 때문에 `/status`가 아니라 `/agentstatus`를 등록하세요. 텍스트 `/status`는 Slack 메시지에서 계속 동작합니다.
- **Slack:** `channels.slack.slashCommand`는 단일 `/openclaw` 스타일 명령에 대해 여전히 지원됩니다. `commands.native`를 활성화하면 내장 명령마다 하나의 Slack 슬래시 명령을 만들어야 합니다(`/help`와 같은 이름). Slack용 명령 인수 메뉴는 임시 Block Kit 버튼으로 전달됩니다.
- Slack 네이티브 예외: Slack이 `/status`를 예약하므로 `/status`가 아니라 `/agentstatus`를 등록하세요. 텍스트 `/status`는 Slack 메시지에서 여전히 동작합니다.
## BTW 사이드 질문
## BTW 곁가지 질문
`/btw`는 현재 세션에 대한 빠른 **사이드 질문**입니다.
`/btw`는 현재 세션에 대한 빠른 **곁가지 질문**입니다.
일반 채팅과 달리 다음과 같습니다.
일반 채팅과 달리:
- 현재 세션을 배경 컨텍스트로 사용하고,
- 별도의 **도구 없는** 원샷 호출로 실행되며,
- 미래 세션 컨텍스트를 변경하지 않고,
- transcript 기록에 쓰이지 않으며,
- 일반 assistant 메시지 대신 live 사이드 결과로 전달됩니다.
- 미래 세션 컨텍스트를 바꾸지 않고,
- 대화 기록 히스토리에 기록되지 않으며,
- 일반 어시스턴트 메시지 대신 라이브 곁가지 결과로 전달됩니다.
따라서 `/btw`주요
작업은 계속 진행하면서 일시적인 설명이 필요할 때 유용합니다.
따라서 `/btw`메인
작업을 계속 진행하면서 일시적인 명확화가 필요할 때 유용합니다.
:
예:
```text
/btw what are we doing right now?
/btw 지금 우리는 무엇을 하고 있나요?
```
전체 동작과 클라이언트 UX 세부 사항은 [BTW Side Questions](/ko/tools/btw)를 참고하세요.
전체 동작과 클라이언트 UX 세부 정보는 [BTW 곁가지 질문](/ko/tools/btw)을
참조하세요.

View File

@ -1,57 +1,57 @@
---
read_when:
- 답장에 text-to-speech를 활성화하는 경우
- TTS provider 또는 제한을 구성하는 경우
- '`/tts` 명령을 사용하는 경우'
summary: 발신 답장을 위한 text-to-speech(TTS)
title: Text-to-Speech
- 답장에 텍스트 음성 변환을 활성화할 때
- TTS 제공자나 제한을 구성할 때
- '`/tts` 명령을 사용할 때'
summary: 발신 답장용 텍스트 음성 변환(TTS)
title: 텍스트 음성 변환
x-i18n:
generated_at: "2026-04-05T12:59:11Z"
generated_at: "2026-04-08T05:56:50Z"
model: gpt-5.4
provider: openai
source_hash: 8487c8acef7585bd4eb5e3b39e2a063ebc6b5f0103524abdcbadd3a7781ffc46
source_hash: 6e0fbcaf61282733c134f682e05a71f94d2169c03a85131ce9ad233c71a1e533
source_path: tools/tts.md
workflow: 15
---
# Text-to-speech (TTS)
# 텍스트 음성 변환(TTS)
OpenClaw는 ElevenLabs, Microsoft, MiniMax, 또는 OpenAI를 사용해 발신 답장을 오디오로 변환할 수 있습니다.
OpenClaw는 ElevenLabs, Microsoft, MiniMax 또는 OpenAI를 사용해 발신 답장을 오디오로 변환할 수 있습니다.
이 기능은 OpenClaw가 오디오를 보낼 수 있는 모든 곳에서 작동합니다.
## 지원되는 서비스
## 지원 서비스
- **ElevenLabs** (기본 또는 fallback provider)
- **Microsoft** (기본 또는 fallback provider; 현재 번들 구현은 `node-edge-tts` 사용)
- **MiniMax** (기본 또는 fallback provider; T2A v2 API 사용)
- **OpenAI** (기본 또는 fallback provider; 요약에도 사용)
- **ElevenLabs**(주 제공자 또는 대체 제공자)
- **Microsoft**(주 제공자 또는 대체 제공자, 현재 번들 구현은 `node-edge-tts` 사용)
- **MiniMax**(주 제공자 또는 대체 제공자, T2A v2 API 사용)
- **OpenAI**(주 제공자 또는 대체 제공자, 요약에도 사용)
### Microsoft speech 참고 사항
### Microsoft 음성 참고 사항
번들된 Microsoft speech provider는 현재 `node-edge-tts` 라이브러리를 통해 Microsoft Edge의 온라인
neural TTS 서비스를 사용합니다. 이는 로컬이 아닌 호스팅 서비스이며,
Microsoft 엔드포인트를 사용하고 API 키가 필요하지 않습니다.
`node-edge-tts`는 speech 구성 옵션과 출력 형식을 제공하지만,
모든 옵션이 서비스에서 지원되는 것은 아닙니다. `edge`를 사용하는 레거시 구성 및 directive 입력은
여전히 작동하며 `microsoft`로 정규화됩니다.
번들된 Microsoft 음성 제공자는 현재 `node-edge-tts` 라이브러리를 통해
Microsoft Edge의 온라인 신경망 TTS 서비스를 사용합니다. 이는 호스팅된
서비스이며(로컬 아님), Microsoft 엔드포인트를 사용하고, API 키가 필요하지
않습니다. `node-edge-tts`는 음성 구성 옵션과 출력 형식을 제공하지만,
모든 옵션이 서비스에서 지원되는 것은 아닙니다. `edge`를 사용하는 레거시
구성과 directive 입력도 계속 작동하며 `microsoft`로 정규화됩니다.
이 경로는 공개 웹 서비스이며 게시된 SLA나 quota가 없으므로,
best-effort로 취급하세요. 보장된 한도와 지원이 필요하다면 OpenAI
이 경로는 공개 웹 서비스이며 게시된 SLA나 할당량이 없으므로,
best-effort로 취급해야 합니다. 보장된 제한과 지원이 필요하다면 OpenAI
또는 ElevenLabs를 사용하세요.
## 선택적 키
OpenAI, ElevenLabs, 또는 MiniMax를 사용하려면:
OpenAI, ElevenLabs 또는 MiniMax를 사용하려면:
- `ELEVENLABS_API_KEY` (또는 `XI_API_KEY`)
- `ELEVENLABS_API_KEY`(또는 `XI_API_KEY`)
- `MINIMAX_API_KEY`
- `OPENAI_API_KEY`
Microsoft speech에는 API 키가 **필요하지 않습니다**.
Microsoft 음성은 API 키가 **필요하지 않습니다**.
여러 provider가 구성된 경우 선택된 provider가 먼저 사용되고, 나머지는 fallback 옵션이 됩니다.
여러 제공자가 구성되어 있으면, 선택된 제공자를 먼저 사용하고 나머지는 대체 옵션으로 사용합니다.
자동 요약은 구성된 `summaryModel`(또는 `agents.defaults.model.primary`)을 사용하므로,
요약을 활성화한다면 해당 provider도 인증되어 있어야 합니다.
요약을 활성화했다면 해당 제공자도 인증되어 있어야 합니다.
## 서비스 링크
@ -63,20 +63,20 @@ Microsoft speech에는 API 키가 **필요하지 않습니다**.
- [node-edge-tts](https://github.com/SchneeHertz/node-edge-tts)
- [Microsoft Speech output formats](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech#audio-outputs)
## 기본으로 활성화되어 있나요?
## 기본으로 활성화되어 있나요?
아니요. 자동 TTS는 기본적으로 **꺼져 있습니다**. 구성에서
`messages.tts.auto`로 활성화하거나 세션별로 `/tts always`(별칭: `/tts on`)로 활성화하세요.
아니요. 자동 TTS는 기본적으로 **비활성화**되어 있습니다. 구성에서
`messages.tts.auto`로 활성화하거나, 로컬에서 `/tts on`로 활성화하세요.
`messages.tts.provider`가 설정되지 않으면 OpenClaw는 registry 자동 선택 순서에서
구성된 첫 번째 speech provider를 선택합니다.
`messages.tts.provider`가 설정되지 않은 경우, OpenClaw는 레지스트리 자동 선택 순서에서
구성된 첫 번째 음성 제공자를 선택합니다.
## 구성
TTS 구성은 `openclaw.json``messages.tts` 아래에 있습니다.
전체 스키마는 [Gateway configuration](/ko/gateway/configuration)에 있습니다.
### 최소 구성(활성화 + provider)
### 최소 구성(활성화 + 제공자)
```json5
{
@ -89,7 +89,7 @@ TTS 구성은 `openclaw.json`의 `messages.tts` 아래에 있습니다.
}
```
### OpenAI 기본 + ElevenLabs fallback
### OpenAI 주 제공자 + ElevenLabs 대체 제공자
```json5
{
@ -130,7 +130,7 @@ TTS 구성은 `openclaw.json`의 `messages.tts` 아래에 있습니다.
}
```
### Microsoft 기본(API 키 없음)
### Microsoft 주 제공자(API 키 없음)
```json5
{
@ -153,7 +153,7 @@ TTS 구성은 `openclaw.json`의 `messages.tts` 아래에 있습니다.
}
```
### MiniMax 기본
### MiniMax 주 제공자
```json5
{
@ -177,7 +177,7 @@ TTS 구성은 `openclaw.json`의 `messages.tts` 아래에 있습니다.
}
```
### Microsoft speech 비활성화
### Microsoft 음성 비활성화
```json5
{
@ -232,7 +232,7 @@ TTS 구성은 `openclaw.json`의 `messages.tts` 아래에 있습니다.
}
```
다음 다음을 실행하세요:
그다음 실행:
```
/tts summary off
@ -243,60 +243,62 @@ TTS 구성은 `openclaw.json`의 `messages.tts` 아래에 있습니다.
- `auto`: 자동 TTS 모드(`off`, `always`, `inbound`, `tagged`).
- `inbound`는 수신 음성 메시지 뒤에만 오디오를 보냅니다.
- `tagged`는 답장에 `[[tts]]` 태그가 포함될 때만 오디오를 보냅니다.
- `enabled`: 레거시 토글입니다(doctor가 이를 `auto`로 마이그레이션).
- `enabled`: 레거시 토글(`doctor`가 이를 `auto`로 마이그레이션).
- `mode`: `"final"`(기본값) 또는 `"all"`(도구/블록 답장 포함).
- `provider`: `"elevenlabs"`, `"microsoft"`, `"minimax"`, 또는 `"openai"` 같은 speech provider id입니다(fallback은 자동).
- `provider`**설정되지 않으면**, OpenClaw는 registry 자동 선택 순서에서 구성된 첫 번째 speech provider를 사용합니다.
- 레거시 `provider: "edge"`여전히 작동하며 `microsoft`로 정규화됩니다.
- `summaryModel`: 자동 요약용 선택적 저비용 모델입니다. 기본값은 `agents.defaults.model.primary`입니다.
- `provider`: `"elevenlabs"`, `"microsoft"`, `"minimax"`, `"openai"` 같은 음성 제공자 ID(대체는 자동).
- `provider`**설정되지 않은** 경우, OpenClaw는 레지스트리 자동 선택 순서에서 구성된 첫 번째 음성 제공자를 사용합니다.
- 레거시 `provider: "edge"`계속 작동하며 `microsoft`로 정규화됩니다.
- `summaryModel`: 자동 요약용 선택적 저비용 모델, 기본값은 `agents.defaults.model.primary`.
- `provider/model` 또는 구성된 모델 별칭을 허용합니다.
- `modelOverrides`: 모델이 TTS directive를 출력할 수 있도록 허용합니다(기본적으로 활성화).
- `allowProvider`의 기본값은 `false`입니다(provider 전환은 opt-in).
- `providers.<id>`: speech provider id를 키로 하는 provider 소유 설정입니다.
- 레거시 직접 provider 블록(`messages.tts.openai`, `messages.tts.elevenlabs`, `messages.tts.microsoft`, `messages.tts.edge`)은 로드 시 `messages.tts.providers.<id>`로 자동 마이그레이션됩니다.
- `maxTextLength`: TTS 입력의 하드 상한(문자 수)입니다. 초과하면 `/tts audio` 실패합니다.
- `timeoutMs`: 요청 timeout(ms)입니다.
- `prefsPath`: 로컬 prefs JSON 경로(provider/limit/summary)를 재정의합니다.
- `apiKey` 값은 env vars(`ELEVENLABS_API_KEY`/`XI_API_KEY`, `MINIMAX_API_KEY`, `OPENAI_API_KEY`)로 fallback됩니다.
- `providers.elevenlabs.baseUrl`: ElevenLabs API 기본 URL 재정의합니다.
- `providers.openai.baseUrl`: OpenAI TTS 엔드포인트 재정의합니다.
- `modelOverrides`: 모델이 TTS directive를 내보내도록 허용합니다(기본적으로 활성화).
- `allowProvider` 기본값은 `false`입니다(제공자 전환은 opt-in).
- `providers.<id>`: 음성 제공자 ID를 키로 하는 제공자 소유 설정.
- 레거시 직접 제공자 블록(`messages.tts.openai`, `messages.tts.elevenlabs`, `messages.tts.microsoft`, `messages.tts.edge`)은 로드 시 `messages.tts.providers.<id>`로 자동 마이그레이션됩니다.
- `maxTextLength`: TTS 입력의 하드 상한(문자 수). 초과하면 `/tts audio` 실패합니다.
- `timeoutMs`: 요청 타임아웃(ms).
- `prefsPath`: 로컬 prefs JSON 경로 재정의(provider/limit/summary).
- `apiKey` 값은 env vars(`ELEVENLABS_API_KEY`/`XI_API_KEY`, `MINIMAX_API_KEY`, `OPENAI_API_KEY`)로 대체될 수 있습니다.
- `providers.elevenlabs.baseUrl`: ElevenLabs API 기본 URL 재정의.
- `providers.openai.baseUrl`: OpenAI TTS 엔드포인트 재정의.
- 확인 순서: `messages.tts.providers.openai.baseUrl` -> `OPENAI_TTS_BASE_URL` -> `https://api.openai.com/v1`
- 기본값이 아닌 값은 OpenAI 호환 TTS 엔드포인트로 취급되므로 사용자 지정 모델 및 voice 이름이 허용됩니다.
- 기본값이 아닌 값은 OpenAI 호환 TTS 엔드포인트로 취급되므로, 사용자 지정 모델 및 음성 이름을 허용합니다.
- `providers.elevenlabs.voiceSettings`:
- `stability`, `similarityBoost`, `style`: `0..1`
- `useSpeakerBoost`: `true|false`
- `speed`: `0.5..2.0` (1.0 = 보통)
- `speed`: `0.5..2.0`(1.0 = 보통)
- `providers.elevenlabs.applyTextNormalization`: `auto|on|off`
- `providers.elevenlabs.languageCode`: 2자 ISO 639-1 (예: `en`, `de`)
- `providers.elevenlabs.seed`: 정수 `0..4294967295` (best-effort 결정성)
- `providers.minimax.baseUrl`: MiniMax API 기본 URL 재정의합니다(기본값 `https://api.minimax.io`, env: `MINIMAX_API_HOST`).
- `providers.minimax.model`: TTS 모델입니다(기본값 `speech-2.8-hd`, env: `MINIMAX_TTS_MODEL`).
- `providers.minimax.voiceId`: 음성 식별자입니다(기본값 `English_expressive_narrator`, env: `MINIMAX_TTS_VOICE_ID`).
- `providers.minimax.speed`: 재생 속도 `0.5..2.0` (기본값 1.0).
- `providers.minimax.vol`: 볼륨 `(0, 10]` (기본값 1.0, 0보다 커야 함).
- `providers.minimax.pitch`: 피치 시프트 `-12..12` (기본값 0).
- `providers.microsoft.enabled`: Microsoft speech 사용을 허용합니다(기본값 `true`, API 키 없음).
- `providers.microsoft.voice`: Microsoft neural voice 이름입니다(예: `en-US-MichelleNeural`).
- `providers.microsoft.lang`: 언어 코드입니다(예: `en-US`).
- `providers.microsoft.outputFormat`: Microsoft 출력 형식입니다(예: `audio-24khz-48kbitrate-mono-mp3`).
- 유효한 값은 Microsoft Speech output formats를 참조하세요. 번들된 Edge 기반 전송에서는 일부 형식만 지원됩니다.
- `providers.microsoft.rate` / `providers.microsoft.pitch` / `providers.microsoft.volume`: 퍼센트 문자열입니다(예: `+10%`, `-5%`).
- `providers.elevenlabs.languageCode`: 2자 ISO 639-1(예: `en`, `de`)
- `providers.elevenlabs.seed`: 정수 `0..4294967295`(best-effort 결정성)
- `providers.minimax.baseUrl`: MiniMax API 기본 URL 재정의(기본값 `https://api.minimax.io`, env: `MINIMAX_API_HOST`).
- `providers.minimax.model`: TTS 모델(기본값 `speech-2.8-hd`, env: `MINIMAX_TTS_MODEL`).
- `providers.minimax.voiceId`: 음성 식별자(기본값 `English_expressive_narrator`, env: `MINIMAX_TTS_VOICE_ID`).
- `providers.minimax.speed`: 재생 속도 `0.5..2.0`(기본값 1.0).
- `providers.minimax.vol`: 볼륨 `(0, 10]`(기본값 1.0, 0보다 커야 함).
- `providers.minimax.pitch`: 피치 이동 `-12..12`(기본값 0).
- `providers.microsoft.enabled`: Microsoft 음성 사용 허용(기본값 `true`, API 키 없음).
- `providers.microsoft.voice`: Microsoft 신경망 음성 이름(예: `en-US-MichelleNeural`).
- `providers.microsoft.lang`: 언어 코드(예: `en-US`).
- `providers.microsoft.outputFormat`: Microsoft 출력 형식(예: `audio-24khz-48kbitrate-mono-mp3`).
- 유효한 값은 Microsoft Speech output formats를 참조하세요. 번들된 Edge 기반 전송에서 모든 형식을 지원하는 것은 아닙니다.
- `providers.microsoft.rate` / `providers.microsoft.pitch` / `providers.microsoft.volume`: 퍼센트 문자열(예: `+10%`, `-5%`).
- `providers.microsoft.saveSubtitles`: 오디오 파일과 함께 JSON 자막을 기록합니다.
- `providers.microsoft.proxy`: Microsoft speech 요청용 프록시 URL입니다.
- `providers.microsoft.timeoutMs`: 요청 timeout 재정의(ms)입니다.
- `edge.*`: 동일한 Microsoft 설정에 대한 레거시 별칭입니다.
- `providers.microsoft.proxy`: Microsoft 음성 요청용 프록시 URL.
- `providers.microsoft.timeoutMs`: 요청 타임아웃 재정의(ms).
- `edge.*`: 동일한 Microsoft 설정에 대한 레거시 별칭.
## 모델 기반 재정의(기본적으로 활성화)
기본적으로 모델은 단일 답장에 대해 TTS directive를 출력할 **수 있습니다**.
`messages.tts.auto``tagged`인 경우 오디오를 트리거하려면 이 directive가 필요합니다.
기본적으로 모델은 단일 답장에 대해 TTS directive를 내보낼 수 **있습니다**.
`messages.tts.auto``tagged`일 때는 오디오를 트리거하려면 이러한 directive가 필요합니다.
활성화되어 있으면 모델은 단일 답장의 voice를 재정의하기 위한 `[[tts:...]]` directive와,
오디오에만 나타나야 하는 표현 태그(웃음, 노래 큐 등)를 제공하기 위한 선택적 `[[tts:text]]...[[/tts:text]]` 블록을 출력할 수 있습니다.
활성화되면 모델은 단일 답장의 음성을 재정의하기 위해 `[[tts:...]]` directive를 내보낼 수 있고,
선택적으로 `[[tts:text]]...[[/tts:text]]` 블록을 사용해
표현 태그(웃음, 노래 신호 등)를 제공할 수 있습니다. 이러한 내용은
오디오에만 나타나야 합니다.
`provider=...` directive는 `modelOverrides.allowProvider: true`가 아닌 한 무시됩니다.
`provider=...` directive는 `modelOverrides.allowProvider: true`가 아니면 무시됩니다.
예시 답장 payload:
답장 payload 예시:
```
Here you go.
@ -307,14 +309,14 @@ Here you go.
사용 가능한 directive 키(활성화된 경우):
- `provider` (등록된 speech provider id, 예: `openai`, `elevenlabs`, `minimax`, 또는 `microsoft`; `allowProvider: true` 필요)
- `voice` (OpenAI voice) 또는 `voiceId` (ElevenLabs / MiniMax)
- `model` (OpenAI TTS 모델, ElevenLabs model id, 또는 MiniMax 모델)
- `provider`(등록된 음성 제공자 ID, 예: `openai`, `elevenlabs`, `minimax`, `microsoft`; `allowProvider: true` 필요)
- `voice`(OpenAI 음성) 또는 `voiceId`(ElevenLabs / MiniMax)
- `model`(OpenAI TTS 모델, ElevenLabs 모델 ID 또는 MiniMax 모델)
- `stability`, `similarityBoost`, `style`, `speed`, `useSpeakerBoost`
- `vol` / `volume` (MiniMax 볼륨, 0-10)
- `pitch` (MiniMax 피치, -12 ~ 12)
- `applyTextNormalization` (`auto|on|off`)
- `languageCode` (ISO 639-1)
- `vol` / `volume`(MiniMax 볼륨, 0-10)
- `pitch`(MiniMax 피치, -12 ~ 12)
- `applyTextNormalization`(`auto|on|off`)
- `languageCode`(ISO 639-1)
- `seed`
모든 모델 재정의 비활성화:
@ -331,7 +333,7 @@ Here you go.
}
```
선택적 allowlist(provider 전환은 허용하면서 다른 조절 항목은 계속 구성 가능):
선택적 allowlist(제공자 전환을 활성화하면서 다른 설정은 구성 가능하게 유지):
```json5
{
@ -347,77 +349,75 @@ Here you go.
}
```
## 사용자별 환경설정
## 사용자별 기본 설정
슬래시 명령은 로컬 재정의를 `prefsPath`(기본값:
슬래시 명령은 로컬 재정의를 `prefsPath`에 기록합니다(기본값:
`~/.openclaw/settings/tts.json`, `OPENCLAW_TTS_PREFS` 또는
`messages.tts.prefsPath`로 재정의 가능)에 기록합니다.
`messages.tts.prefsPath`로 재정의 가능).
저장되는 필드:
- `enabled`
- `provider`
- `maxLength` (요약 임곗값, 기본값 1500자)
- `summarize` (기본값 `true`)
- `maxLength`(요약 임계값, 기본값 1500자)
- `summarize`(기본값 `true`)
이 값들은 해당 호스트에서 `messages.tts.*`를 재정의합니다.
이 값들은 해당 호스트 `messages.tts.*`를 재정의합니다.
## 출력 형식(고정)
- **Feishu / Matrix / Telegram / WhatsApp**: Opus 음성 메시지(ElevenLabs의 `opus_48000_64`, OpenAI의 `opus`).
- 48kHz / 64kbps는 음성 메시지에 적한 절충안입니다.
- 48kHz / 64kbps는 음성 메시지에 적한 절충안입니다.
- **기타 채널**: MP3(ElevenLabs의 `mp3_44100_128`, OpenAI의 `mp3`).
- 44.1kHz / 128kbps는 음성 명료도를 위한 기본 균형입니다.
- **MiniMax**: MP3(`speech-2.8-hd` 모델, 32kHz 샘플 레이트). 음성 노트 형식을 기본 지원하지 않으므로, 보장된 Opus 음성 메시지가 필요하면 OpenAI 또는 ElevenLabs를 사용하세요.
- **Microsoft**: `microsoft.outputFormat` 사용합니다(기본값 `audio-24khz-48kbitrate-mono-mp3`).
- 번들 전송은 `outputFormat`을 허용하지만, 모든 형식을 서비스에서 사용할 수 있는 것은 아닙니다.
- 44.1kHz / 128kbps는 음성 명료도를 위한 기본 균형입니다.
- **MiniMax**: MP3(`speech-2.8-hd` 모델, 32kHz 샘플링 속도). 음성 노트 형식은 기본 지원되지 않으므로, Opus 음성 메시지가 반드시 필요하면 OpenAI 또는 ElevenLabs를 사용하세요.
- **Microsoft**: `microsoft.outputFormat` 사용(기본값 `audio-24khz-48kbitrate-mono-mp3`).
- 번들 전송은 `outputFormat`을 허용하지만, 모든 형식을 서비스에서 사용할 수 있는 것은 아닙니다.
- 출력 형식 값은 Microsoft Speech output formats를 따릅니다(Ogg/WebM Opus 포함).
- Telegram `sendVoice`는 OGG/MP3/M4A를 허용합니다. 보장된 Opus 음성 메시지가 필요하면 OpenAI/ElevenLabs를 사용하세요.
- 구성된 Microsoft 출력 형식이 실패하면 OpenClaw는 MP3로 다시 시도합니다.
- Telegram `sendVoice`는 OGG/MP3/M4A를 허용합니다. Opus 음성 메시지가 반드시 필요하면 OpenAI/ElevenLabs를 사용하세요.
- 구성된 Microsoft 출력 형식이 실패하면 OpenClaw는 MP3로 시도합니다.
OpenAI/ElevenLabs 출력 형식은 채널별로 고정됩니다(위 참).
OpenAI/ElevenLabs 출력 형식은 채널별로 고정됩니다(위 참).
## 자동 TTS 동작
활성화되면 OpenClaw는:
활성화되면 OpenClaw는 다음과 같이 동작합니다.
- 답장에 이미 미디어 또는 `MEDIA:` directive가 있으면 TTS를 건너뜁니다.
- 너무 짧은 답장(< 10자) 건너뜁니다.
- 긴 답장은 활성화된 경우 `agents.defaults.model.primary`(또는 `summaryModel`)를 사용해 요약합니다.
- 답장에 이미 미디어 또는 `MEDIA:` directive가 포함되어 있으면 TTS를 건너뜁니다.
- 매우 짧은 답장(< 10자) 건너뜁니다.
- 활성화된 경우 긴 답장을 `agents.defaults.model.primary`(또는 `summaryModel`)를 사용해 요약합니다.
- 생성된 오디오를 답장에 첨부합니다.
답장이 `maxLength`를 초과하고 요약이 꺼져 있거나(또는
summary model용 API 키가 없으면), 오디오는
건너뛰고 일반 텍스트 답장을 전송합니다.
답장이 `maxLength`를 초과하고 요약이 비활성화되어 있거나(또는
요약 모델에 대한 API 키가 없는 경우), 오디오는
건너뛰고 일반 텍스트 답장을 보냅니다.
## 흐름도
```
Reply -> TTS enabled?
no -> 텍스트 전송
yes -> 미디어 / MEDIA: / 짧은 답장인가?
yes -> 텍스트 전송
no -> 길이 > 제한?
no -> TTS -> 오디오 첨부
yes -> 요약 활성화됨?
no -> 텍스트 전송
yes -> 요약(summaryModel 또는 agents.defaults.model.primary)
-> TTS -> 오디오 첨부
no -> send text
yes -> has media / MEDIA: / short?
yes -> send text
no -> length > limit?
no -> TTS -> attach audio
yes -> summary enabled?
no -> send text
yes -> summarize (summaryModel or agents.defaults.model.primary)
-> TTS -> attach audio
```
## 슬래시 명령 사용법
명령은 하나뿐입니다: `/tts`.
활성화 세부 사항은 [Slash commands](/tools/slash-commands)를 참조하세요.
활성화 세부 정보는 [Slash commands](/ko/tools/slash-commands)를 참조하세요.
Discord 참고: `/tts`는 Discord 기본 명령이므로 OpenClaw는
거기에서 네이티브 명령으로 `/voice`를 등록합니다. 텍스트 `/tts ...`는 여전히 작동합니다.
Discord 참고: `/tts`는 Discord 기본 명령이므로, OpenClaw는
그곳에서 `/voice`를 네이티브 명령으로 등록합니다. 텍스트 `/tts ...`도 계속 작동합니다.
```
/tts off
/tts always
/tts inbound
/tts tagged
/tts on
/tts status
/tts provider openai
/tts limit 2000
@ -427,21 +427,23 @@ Discord 참고: `/tts`는 Discord 기본 명령이므로 OpenClaw는
참고 사항:
- 명령에는 인증된 발신자가 필요합니다(allowlist/owner 규칙 계속 적용됨).
- 명령에는 인증된 발신자가 필요합니다(allowlist/owner 규칙 계속 적용됨).
- `commands.text` 또는 네이티브 명령 등록이 활성화되어 있어야 합니다.
- `off|always|inbound|tagged`는 세션별 토글입니다(`/tts on`은 `/tts always`의 별칭).
- `limit``summary`는 메인 구성이 아니라 로컬 prefs에 저장됩니다.
- 구성 `messages.tts.auto``off|always|inbound|tagged`를 허용합니다.
- `/tts on`은 로컬 TTS 기본 설정을 `always`로 기록하고, `/tts off``off`로 기록합니다.
- `inbound` 또는 `tagged` 기본값을 원하면 구성을 사용하세요.
- `limit``summary`는 메인 구성이 아니라 로컬 prefs에 저장됩니다.
- `/tts audio`는 일회성 오디오 답장을 생성합니다(TTS를 켜지 않음).
- `/tts status`는 최신 시도에 대한 fallback 가시성을 포함합니다:
- 성공 fallback: `Fallback: <primary> -> <used>` `Attempts: ...`
- 실패: `Error: ...` `Attempts: ...`
- 상세 진단: `Attempt details: provider:outcome(reasonCode) latency`
- OpenAI 및 ElevenLabs API 실패는 이제 파싱된 provider 오류 세부 정보와 요청 id(제공된 경우)를 포함하며, 이는 TTS 오류/로그에 표시됩니다.
- `/tts status`에는 최신 시도에 대한 대체 가시성이 포함됩니다.
- 성공적인 대체: `Fallback: <primary> -> <used>` + `Attempts: ...`
- 실패: `Error: ...` + `Attempts: ...`
- 자세한 진단: `Attempt details: provider:outcome(reasonCode) latency`
- OpenAI 및 ElevenLabs API 실패는 이제 파싱된 제공자 오류 상세 정보와 요청 ID(제공자가 반환한 경우)를 포함하며, 이는 TTS 오류/로그에 표시됩니다.
## 에이전트 도구
`tts` 도구는 텍스트를 speech로 변환하고
답장 전달 오디오 첨부 파일을 반환합니다. 채널이 Feishu, Matrix, Telegram, 또는 WhatsApp인 경우
`tts` 도구는 텍스트를 음성으로 변환하고
답장 전달을 위한 오디오 첨부 파일을 반환합니다. 채널이 Feishu, Matrix, Telegram 또는 WhatsApp인 경우,
오디오는 파일 첨부가 아니라 음성 메시지로 전달됩니다.
## Gateway RPC