chore(i18n): refresh ko translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-10 06:07:26 +00:00
parent c50e47614a
commit 37f6599b1c
8 changed files with 3086 additions and 1565 deletions

View File

@ -1,44 +1,44 @@
---
read_when:
- 진행 중이거나 최근 완료된 백그라운드 작업을 확인할 때
- 분리된 에이전트 실행의 전달 실패 디버깅할 때
- 백그라운드 실행이 세션, cron, heartbeat와 어떻게 연결되는지 이해할 때
summary: ACP 실행, 하위 에이전트, 격리된 cron 작업, CLI 작업에 대한 백그라운드 작업 추적
- 진행 중이거나 최근 완료된 백그라운드 작업 검사
- 분리된 에이전트 실행의 전달 실패 디버깅
- 백그라운드 실행이 세션, cron, 그리고 하트비트와 어떻게 연결되는지 이해하기
summary: ACP 실행, 하위 에이전트, 격리된 cron 작업, 그리고 CLI 작업을 위한 백그라운드 작업 추적
title: 백그라운드 작업
x-i18n:
generated_at: "2026-04-06T03:06:46Z"
generated_at: "2026-04-10T05:59:51Z"
model: gpt-5.4
provider: openai
source_hash: 2f56c1ac23237907a090c69c920c09578a2f56f5d8bf750c7f2136c603c8a8ff
source_hash: d7b5ba41f1025e0089986342ce85698bc62f676439c3ccf03f3ed146beb1b1ac
source_path: automation/tasks.md
workflow: 15
---
# 백그라운드 작업
> **예약을 찾고 있나요?** 적절한 메커니즘을 선택하려면 [Automation & Tasks](/ko/automation)를 참고하세요. 이 페이지는 백그라운드 작업의 **추적**을 다루며, 예약 자체를 설명하지 않습니다.
> **일정을 찾고 있나요?** 적절한 메커니즘을 선택하려면 [Automation & Tasks](/ko/automation)를 참조하세요. 이 페이지는 백그라운드 작업의 **추적**을 다루며, 예약을 다루지 않습니다.
백그라운드 작업은 **주 대화 세션 외부**에서 실행되는 작업을 추적합니다:
백그라운드 작업은 **기본 대화 세션 외부에서** 실행되는 작업을 추적합니다:
ACP 실행, 하위 에이전트 생성, 격리된 cron 작업 실행, 그리고 CLI로 시작된 작업입니다.
작업은 세션, cron 작업, heartbeat를 **대체하지 않습니다**. 대신 어떤 분리된 작업이 발생했고, 언제 발생했으며, 성공했는지를 기록하는 **활동 원장**입니다.
작업은 세션, cron 작업, 또는 하트비트를 대체하지 않습니다 — 이것들은 분리된 작업이 무엇이었는지, 언제 발생했는지, 그리고 성공했는지를 기록하는 **활동 원장**입니다.
<Note>
모든 에이전트 실행이 작업을 생성하는 것은 아닙니다. Heartbeat 턴과 일반적인 대화형 채팅은 생성하지 않습니다. 모든 cron 실행, ACP 생성, 하위 에이전트 생성, CLI 에이전트 명령은 작업을 생성합니다.
모든 에이전트 실행이 작업을 생성하는 것은 아닙니다. 하트비트 턴과 일반 대화형 채팅은 생성하지 않습니다. 모든 cron 실행, ACP 생성, 하위 에이전트 생성, 그리고 CLI 에이전트 명령은 생성합니다.
</Note>
## 요약
## TL;DR
- 작업은 스케줄러가 아니라 **기록**입니다. cron과 heartbeat는 작업이 _언제_ 실행될지 결정하고, 작업은 _무슨 일이 있었는지_ 추적합니다.
- ACP, 하위 에이전트, 모든 cron 작업, CLI 작업은 작업을 생성합니다. Heartbeat 턴은 생성하지 않습니다.
- 각 작업은 `queued → running → terminal`(succeeded, failed, timed_out, cancelled 또는 lost) 단계를 거칩니다.
- Cron 작업은 cron 런타임이 여전히 해당 작업을 소유하는 동안 활성 상태를 유지하며, 채팅 기반 CLI 작업은 소유한 실행 컨텍스트가 아직 활성 상태일 때만 활성 상태를 유지합니다.
- 완료는 푸시 기반입니다. 분리된 작업은 완료되면 직접 알리거나 요청자 세션/heartbeat를 깨울 수 있으므로, 상태를 폴링하는 루프는 대개 적절한 형태가 아닙니다.
- 격리된 cron 실행과 하위 에이전트 완료는 최종 정리 bookkeeping 전에 해당 하위 세션의 추적된 브라우저 탭/프로세스를 가능한 범위에서 정리합니다.
- 격리된 cron 전달은 하위 하위 에이전트 작업이 아직 마무리 중일 때 오래된 중간 부모 응답을 억제하며, 전달 전에 최종 하위 출력이 도착하면 이를 우선합니다.
- 완료 알림은 채널로 직접 전달되거나 다음 heartbeat를 위해 대기열에 들어갑니다.
- 작업은 스케줄러가 아니라 **기록**입니다 — cron과 하트비트는 작업이 _언제_ 실행될지 결정하고, 작업은 _무슨 일이 일어났는지_ 추적합니다.
- ACP, 하위 에이전트, 모든 cron 작업, 그리고 CLI 작업은 작업을 생성합니다. 하트비트 턴은 생성하지 않습니다.
- 각 작업은 `queued → running → terminal`(succeeded, failed, timed_out, cancelled, 또는 lost)을 거칩니다.
- cron 작업은 cron 런타임이 여전히 해당 작업을 소유하는 동안 활성 상태를 유지합니다. 채팅 기반 CLI 작업은 소유한 실행 컨텍스트가 여전히 활성 상태인 동안에만 활성 상태를 유지합니다.
- 완료는 푸시 기반입니다: 분리된 작업은 완료 시 직접 알리거나 요청자 세션/하트비트를 깨울 수 있으므로, 상태를 폴링하는 루프는 보통 적절한 방식이 아닙니다.
- 격리된 cron 실행과 하위 에이전트 완료는 최종 정리 기록을 남기기 전에 자식 세션의 추적된 브라우저 탭/프로세스를 최선의 노력으로 정리합니다.
- 격리된 cron 전달은 하위 하위 에이전트 작업이 아직 마무리 중일 때 오래된 중간 부모 응답을 억제하고, 전달 전에 최종 하위 결과가 도착하면 그것을 우선합니다.
- 완료 알림은 채널로 직접 전달되거나 다음 하트비트를 위해 대기열에 들어갑니다.
- `openclaw tasks list`는 모든 작업을 표시하고, `openclaw tasks audit`는 문제를 표시합니다.
- 종료된 기록은 7일 동안 보관된 후 자동으로 정리됩니다.
- 종료된 기록은 7일간 보관된 뒤 자동으로 정리됩니다.
## 빠른 시작
@ -50,48 +50,48 @@ openclaw tasks list
openclaw tasks list --runtime acp
openclaw tasks list --status running
# 특정 작업의 세부 정보 표시(ID, run ID 또는 session key로 조회)
# 특정 작업의 세부 정보 표시(ID, run ID, 또는 session key로)
openclaw tasks show <lookup>
# 실행 중인 작업 취소(하위 세션 종료)
# 실행 중인 작업 취소(자식 세션 종료)
openclaw tasks cancel <lookup>
# 작업의 알림 정책 변경
openclaw tasks notify <lookup> state_changes
# 상태 점검 실행
# 상태 점검 감사 실행
openclaw tasks audit
# 유지 관리 미리보기 또는 적용
# 유지 관리 미리 보기 또는 적용
openclaw tasks maintenance
openclaw tasks maintenance --apply
# TaskFlow 상태 확인
# TaskFlow 상태 검사
openclaw tasks flow list
openclaw tasks flow show <lookup>
openclaw tasks flow cancel <lookup>
```
## 작업을 생성하는
## 작업을 생성하는 항목
| 소스 | 런타임 유형 | 작업 레코드가 생성되는 시점 | 기본 알림 정책 |
| ---------------------- | ----------- | ---------------------------------------------------- | -------------- |
| ACP 백그라운드 실행 | `acp` | 하위 ACP 세션 생성 시 | `done_only` |
| 하위 에이전트 오케스트레이션 | `subagent` | `sessions_spawn`를 통해 하위 에이전트 생성 시 | `done_only` |
| Cron 작업(모든 유형) | `cron` | 모든 cron 실행(주 세션 및 격리 실행) | `silent` |
| CLI 작업 | `cli` | 게이트웨이를 통해 실행되는 `openclaw agent` 명령 | `silent` |
| 에이전트 미디어 작업 | `cli` | 세션 기반 `video_generate` 실행 | `silent` |
| 소스 | 런타임 유형 | 작업 기록이 생성되는 시점 | 기본 알림 정책 |
| ---------------------- | ------------ | ------------------------------------------------------ | --------------------- |
| ACP 백그라운드 실행 | `acp` | 자식 ACP 세션 생성 시 | `done_only` |
| 하위 에이전트 오케스트레이션 | `subagent` | `sessions_spawn`를 통해 하위 에이전트 생성 시 | `done_only` |
| cron 작업(모든 유형) | `cron` | 모든 cron 실행(기본 세션 및 격리 실행) | `silent` |
| CLI 작업 | `cli` | 게이트웨이를 통해 실행되는 `openclaw agent` 명령 | `silent` |
| 에이전트 미디어 작업 | `cli` | 세션 기반 `video_generate` 실행 | `silent` |
주 세션 cron 작업은 기본적으로 `silent` 알림 정책을 사용합니다. 즉, 추적용 레코드는 만들지만 알림은 생성하지 않습니다. 격리된 cron 작업도 기본적으로 `silent`이지만 자체 세션에서 실행되므로 더 눈에 띕니다.
기본 세션 cron 작업은 기본적으로 `silent` 알림 정책을 사용합니다 — 추적을 위한 기록은 생성하지만 알림은 만들지 않습니다. 격리된 cron 작업도 기본값은 `silent`이지만 자체 세션에서 실행되므로 더 눈에 띕니다.
세션 기반 `video_generate` 실행도 `silent` 알림 정책을 사용합니다. 여전히 작업 레코드는 생성되지만, 완료는 내부 깨우기 형태로 원래 에이전트 세션에 되돌아가므로 에이전트가 후속 메시지를 작성하고 완성된 비디오를 직접 첨부할 수 있습니다. `tools.media.asyncCompletion.directSend`를 활성화하면, 비동기 `music_generate``video_generate` 완료는 먼저 채널에 직접 전달을 시도한 뒤, 실패하면 요청자 세션 깨우기 경로로 대체됩니다.
세션 기반 `video_generate` 실행도 `silent` 알림 정책을 사용합니다. 여전히 작업 기록은 생성하지만, 완료는 원래 에이전트 세션으로 내부 웨이크 형태로 되돌아가므로 에이전트가 직접 후속 메시지를 작성하고 완성된 비디오를 첨부할 수 있습니다. `tools.media.asyncCompletion.directSend`를 활성화하면 비동기 `music_generate``video_generate` 완료는 요청자 세션 웨이크 경로로 돌아가기 전에 먼저 채널 직접 전달을 시도합니다.
세션 기반 `video_generate` 작업이 아직 활성 상태인 동안에는 이 도구가 가드레일 역할도 수행합니다. 같은 세션에서 `video_generate`를 반복 호출하면 두 번째 동시 생성을 시작하는 대신 활성 작업 상태를 반환합니다. 에이전트 측에서 명시적인 진행 상황/상태 조회가 필요할 때는 `action: "status"`를 사용하세요.
세션 기반 `video_generate` 작업이 아직 활성 상태일 때 이 도구는 가드레일 역할도 합니다: 같은 세션에서 `video_generate`를 반복 호출하면 두 번째 동시 생성을 시작하는 대신 활성 작업 상태를 반환합니다. 에이전트 측에서 명시적인 진행 상황/상태 조회를 원할 때는 `action: "status"`를 사용하세요.
**작업을 생성하지 않는 :**
**작업을 생성하지 않는 항목:**
- Heartbeat 턴 — 주 세션, [Heartbeat](/ko/gateway/heartbeat) 참고
- 일반적인 대화형 채팅 턴
- 하트비트 턴 — 기본 세션; [Heartbeat](/ko/gateway/heartbeat) 참조
- 일반 대화형 채팅 턴
- 직접 `/command` 응답
## 작업 수명 주기
@ -102,56 +102,56 @@ stateDiagram-v2
queued --> running : 에이전트 시작
running --> succeeded : 정상 완료
running --> failed : 오류
running --> timed_out : 시간 제한 초과
running --> timed_out : 제한 시간 초과
running --> cancelled : 운영자가 취소
queued --> lost : 세션 사라짐 > 5분
running --> lost : 세션 사라짐 > 5분
```
| 상태 | 의미 |
| 상태 | 의미 |
| ----------- | -------------------------------------------------------------------------- |
| `queued` | 생성되었으며 에이전트 시작 대기 중 |
| `running` | 에이전트 턴이 현재 실행 중 |
| `succeeded` | 성공적으로 완료됨 |
| `failed` | 오류와 함께 완료됨 |
| `timed_out` | 구성된 시간 제한을 초과함 |
| `cancelled` | 운영자가 `openclaw tasks cancel`을 통해 중지함 |
| `lost` | 5분 유예 기간 후 런타임이 권위 있는 백업 상태를 잃음 |
| `queued` | 생성되었으며, 에이전트 시작 대기 중 |
| `running` | 에이전트 턴이 현재 실행 중 |
| `succeeded` | 성공적으로 완료됨 |
| `failed` | 오류와 함께 완료됨 |
| `timed_out` | 구성된 제한 시간을 초과함 |
| `cancelled` | 운영자가 `openclaw tasks cancel`을 통해 중지함 |
| `lost` | 런타임이 5분 유예 기간 후 권위 있는 백킹 상태를 잃음 |
전환은 자동으로 발생합니다. 연결된 에이전트 실행이 끝나면 작업 상태도 그에 맞게 업데이트됩니다.
전환은 자동으로 발생합니다 — 연결된 에이전트 실행이 끝나면 작업 상태가 그에 맞게 업데이트됩니다.
`lost`는 런타임 인지형입니다.
`lost`는 런타임 인지형입니다:
- ACP 작업: 기반 ACP 하위 세션 메타데이터가 사라졌습니다.
- 하위 에이전트 작업: 대상 에이전트 저장소에서 기반 하위 세션이 사라졌습니다.
- Cron 작업: cron 런타임이 더 이상 해당 작업을 활성 상태로 추적하지 않습니다.
- CLI 작업: 격리된 하위 세션 작업은 하위 세션을 사용하고, 채팅 기반 CLI 작업은 대신 활성 실행 컨텍스트를 사용하므로 남아 있는 채널/그룹/직접 세션 행이 이들을 활성 상태로 유지하지는 않습니다.
- ACP 작업: 백킹 ACP 자식 세션 메타데이터가 사라졌습니다.
- 하위 에이전트 작업: 백킹 자식 세션이 대상 에이전트 저장소에서 사라졌습니다.
- cron 작업: cron 런타임이 더 이상 해당 작업을 활성 상태로 추적하지 않습니다.
- CLI 작업: 격리된 자식 세션 작업은 자식 세션을 사용하고, 채팅 기반 CLI 작업은 대신 활성 실행 컨텍스트를 사용하므로, 채널/그룹/다이렉트 세션 행이 남아 있어도 활성 상태로 유지되지 않습니다.
## 전달 및 알림
작업이 종료 상태에 도달하면 OpenClaw가 알립니다. 전달 경로는 두 가지입니다.
작업이 종료 상태에 도달하면 OpenClaw가 알립니다. 전달 경로는 두 가지입니다:
**직접 전달** — 작업에 채널 대상(`requesterOrigin`)이 있으면 완료 메시지가 해당 채널(Telegram, Discord, Slack 등)로 바로 전송됩니다. 하위 에이전트 완료의 경우, OpenClaw는 가능한 경우 연결된 스레드/토픽 라우팅도 유지하며, 직접 전달을 포기하기 전에 요청자 세션의 저장된 경로(`lastChannel` / `lastTo` / `lastAccountId`)에서 누락된 `to` / 계정을 보완할 수 있습니다.
**직접 전달** — 작업에 채널 대상(`requesterOrigin`)이 있으면 완료 메시지가 해당 채널(Telegram, Discord, Slack 등)로 바로 전달됩니다. 하위 에이전트 완료의 경우, OpenClaw는 가능할 때 바인딩된 스레드/토픽 라우팅도 유지하며, 직접 전달을 포기하기 전에 요청자 세션에 저장된 라우트(`lastChannel` / `lastTo` / `lastAccountId`)에서 누락된 `to` / 계정을 채울 수 있습니다.
**세션 대기열 전달** — 직접 전달에 실패했거나 origin이 설정되지 않았으면, 업데이트는 요청자 세션의 시스템 이벤트로 대기열에 들어가며 다음 heartbeat에 표시됩니다.
**세션 대기열 전달** — 직접 전달에 실패했거나 origin이 설정되지 않았으면, 업데이트가 요청자 세션의 시스템 이벤트로 대기열에 들어가고 다음 하트비트에서 표시됩니다.
<Tip>
작업 완료는 즉시 heartbeat 깨우기를 트리거하므로 결과를 빠르게 확인할 수 있습니다. 다음 예약 heartbeat tick까지 기다릴 필요가 없습니다.
작업 완료는 즉시 하트비트 웨이크를 트리거하므로 결과를 빠르게 볼 수 있습니다 — 다음 예약된 하트비트 틱까지 기다릴 필요가 없습니다.
</Tip>
즉, 일반적인 워크플로는 푸시 기반입니다. 분리된 작업을 한 번 시작한 다음, 런타임이 완료 시 깨우거나 알리도록 두면 됩니다. 디버깅, 개입 또는 명시적 감사가 필요할 때만 작업 상태를 폴링하세요.
즉, 일반적인 워크플로는 푸시 기반입니다: 분리된 작업을 한 번 시작한 뒤 런타임이 완료 시 깨우거나 알리도록 두세요. 디버깅, 개입, 또는 명시적인 감사를 위해 필요할 때만 작업 상태를 폴링하세요.
### 알림 정책
각 작업에 대해 어느 정도까지 알림을 받을지 제어합니다.
각 작업에 대해 얼마나 많은 알림을 받을지 제어합니다:
| 정책 | 전달되는 내용 |
| 정책 | 전달되는 내용 |
| --------------------- | ----------------------------------------------------------------------- |
| `done_only` (기본값) | 종료 상태(succeeded, failed 등)만 전달 **이것이 기본값입니다** |
| `state_changes` | 모든 상태 전환 및 진행 상황 업데이트 |
| `silent` | 아무것도 전달하지 않음 |
| `done_only` (기본값) | 종료 상태(succeeded, failed 등)만 — **이것이 기본값입니다** |
| `state_changes` | 모든 상태 전환 및 진행 상황 업데이트 |
| `silent` | 아무것도 없음 |
작업 실행 중에도 정책을 변경할 수 있습니다.
작업이 실행 중일 때 정책을 변경할 수 있습니다:
```bash
openclaw tasks notify <lookup> state_changes
@ -165,7 +165,7 @@ openclaw tasks notify <lookup> state_changes
openclaw tasks list [--runtime <acp|subagent|cron|cli>] [--status <status>] [--json]
```
출력 열: Task ID, Kind, Status, Delivery, Run ID, Child Session, Summary.
출력 열: 작업 ID, 종류, 상태, 전달, 실행 ID, 자식 세션, 요약.
### `tasks show`
@ -173,7 +173,7 @@ openclaw tasks list [--runtime <acp|subagent|cron|cli>] [--status <status>] [--j
openclaw tasks show <lookup>
```
조회 토큰은 task ID, run ID 또는 session key를 받을 수 있습니다. 타이밍, 전달 상태, 오류, 종료 요약을 포함한 전체 레코드를 표시합니다.
조회 토큰은 작업 ID, 실행 ID, 또는 세션 키를 받을 수 있습니다. 시간 정보, 전달 상태, 오류, 종료 요약을 포함한 전체 기록을 표시합니다.
### `tasks cancel`
@ -181,7 +181,7 @@ openclaw tasks show <lookup>
openclaw tasks cancel <lookup>
```
ACP 및 하위 에이전트 작업의 경우 하위 세션을 종료합니다. 상태는 `cancelled`로 전환되고 전달 알림이 전송됩니다.
ACP 및 하위 에이전트 작업의 경우 자식 세션을 종료합니다. CLI 추적 작업의 경우, 취소는 작업 레지스트리에 기록됩니다(별도의 자식 런타임 핸들은 없습니다). 상태는 `cancelled`로 전환되며, 해당하는 경우 전달 알림이 전송됩니다.
### `tasks notify`
@ -197,14 +197,14 @@ openclaw tasks audit [--json]
운영상 문제를 표시합니다. 문제가 감지되면 결과는 `openclaw status`에도 표시됩니다.
| 항목 | 심각도 | 트리거 |
| ------------------------- | ------ | --------------------------------------------------- |
| `stale_queued` | warn | 10분 이상 대기 상태 |
| `stale_running` | error | 30분 이상 실행 상태 |
| `lost` | error | 런타임 기반 작업 소유 상태가 사라짐 |
| `delivery_failed` | warn | 전달에 실패했고 알림 정책이 `silent`가 아님 |
| `missing_cleanup` | warn | 종료된 작업에 cleanup 타임스탬프가 없음 |
| `inconsistent_timestamps` | warn | 타임라인 위반(예: 시작 전에 종료됨) |
| 항목 | 심각도 | 트리거 |
| ------------------------- | -------- | ----------------------------------------------------- |
| `stale_queued` | warn | 10분 이상 queued 상태 |
| `stale_running` | error | 30분 이상 running 상태 |
| `lost` | error | 런타임 기반 작업 소유 상태가 사라짐 |
| `delivery_failed` | warn | 전달에 실패했고 알림 정책이 `silent`가 아님 |
| `missing_cleanup` | warn | 정리 타임스탬프가 없는 종료 작업 |
| `inconsistent_timestamps` | warn | 타임라인 위반(예: 시작 전에 종료됨) |
### `tasks maintenance`
@ -213,20 +213,20 @@ openclaw tasks maintenance [--json]
openclaw tasks maintenance --apply [--json]
```
명령은 작업 및 Task Flow 상태에 대한 조정, cleanup stamping, 정리를 미리 보거나 적용할 때 사용합니다.
를 사용해 작업 및 Task Flow 상태에 대한 조정, 정리 타임스탬프 기록, 그리고 정리 작업을 미리 보거나 적용할 수 있습니다.
조정은 런타임 인지형입니다.
조정은 런타임 인지형입니다:
- ACP/하위 에이전트 작업은 기반 하위 세션을 확인합니다.
- Cron 작업은 cron 런타임이 여전히 해당 작업을 소유하는지 확인합니다.
- 채팅 기반 CLI 작업은 채팅 세션 행이 아니라 소유한 활성 실행 컨텍스트를 확인합니다.
- ACP/하위 에이전트 작업은 백킹 자식 세션을 확인합니다.
- cron 작업은 cron 런타임이 여전히 해당 작업을 소유하는지 확인합니다.
- 채팅 기반 CLI 작업은 단순히 채팅 세션 행이 아니라 소유한 활성 실행 컨텍스트를 확인합니다.
완료 정리도 런타임 인지형입니다.
완료 정리도 런타임 인지형입니다:
- 하위 에이전트 완료 시 알림 정리가 계속되기 전에 하위 세션의 추적된 브라우저 탭/프로세스를 가능한 범위에서 닫습니다.
- 격리된 cron 완료 시 실행이 완전히 종료되기 전에 cron 세션의 추적된 브라우저 탭/프로세스를 가능한 범위에서 닫습니다.
- 격리된 cron 전달은 필요할 경우 하위 하위 에이전트 후속 작업이 끝날 때까지 기다리며, 이를 알리는 대신 오래된 부모 확인 텍스트를 억제합니다.
- 하위 에이전트 완료 전달은 최신의 표시 가능한 assistant 텍스트를 우선하며, 이것이 비어 있으면 정제된 최신 tool/toolResult 텍스트로 대체하고, 시간 초과만 발생한 tool-call 실행은 짧은 부분 진행 요약으로 축약될 수 있습니다.
- 하위 에이전트 완료는 알림 정리가 계속되기 전에 자식 세션의 추적된 브라우저 탭/프로세스를 최선의 노력으로 닫습니다.
- 격리된 cron 완료는 실행이 완전히 종료되기 전에 cron 세션의 추적된 브라우저 탭/프로세스를 최선의 노력으로 닫습니다.
- 격리된 cron 전달은 필요할 경우 하위 하위 에이전트 후속 작업이 마무리될 때까지 기다리고, 이를 알리는 대신 오래된 부모 확인 텍스트를 억제합니다.
- 하위 에이전트 완료 전달은 가장 최근의 표시 가능한 assistant 텍스트를 우선하며, 그것이 비어 있으면 정제된 최신 tool/toolResult 텍스트로 대체하고, 시간 초과만 발생한 도구 호출 실행은 짧은 부분 진행 요약으로 축약될 수 있습니다.
- 정리 실패가 실제 작업 결과를 가리지는 않습니다.
### `tasks flow list|show|cancel`
@ -237,86 +237,86 @@ openclaw tasks flow show <lookup> [--json]
openclaw tasks flow cancel <lookup>
```
개별 백그라운드 작업 레코드 하나보다 오케스트레이션하는 Task Flow 자체가 더 중요할 때 이 명령을 사용하세요.
개별 백그라운드 작업 기록 하나보다 이를 오케스트레이션하는 Task Flow 자체가 더 중요할 때 사용하세요.
## 채팅 작업 보드(`/tasks`)
어떤 채팅 세션에서든 `/tasks`를 사용해 해당 세션에 연결된 백그라운드 작업을 볼 수 있습니다. 보드는 런타임, 상태, 타이밍, 진행 상황 또는 오류 세부 정보를 포함해 활성 및 최근 완료된 작업을 표시합니다.
아무 채팅 세션에서나 `/tasks`를 사용해 해당 세션에 연결된 백그라운드 작업을 볼 수 있습니다. 보드는 런타임, 상태, 시간 정보, 그리고 진행 상황 또는 오류 세부 정보와 함께 활성 작업 및 최근 완료된 작업을 표시합니다.
현재 세션에 표시 가능한 연결 작업이 없으면, `/tasks`는 에이전트 로컬 작업 수로 대체되어 다른 세션 세부 정보를 노출하지 않으면서도 개요를 확인할 수 있습니다.
현재 세션에 표시 가능한 연결 작업이 없으면, `/tasks`는 에이전트 로컬 작업 수로 대체되어 다른 세션의 세부 정보를 노출하지 않고도 개요를 계속 볼 수 있습니다.
전체 운영자 원장은 CLI `openclaw tasks list`를 사용하세요.
전체 운영자 원장을 보려면 CLI를 사용하세요: `openclaw tasks list`.
## 상태 통합(작업 압력)
`openclaw status`에는 한눈에 보는 작업 요약이 포함됩니다.
`openclaw status`에는 한눈에 보는 작업 요약이 포함됩니다:
```
Tasks: 3 queued · 2 running · 1 issues
```
이 요약은 다음을 보고합니다.
요약은 다음을 보고합니다:
- **active**`queued` + `running` 개수
- **failures**`failed` + `timed_out` + `lost` 개수
- **byRuntime**`acp`, `subagent`, `cron`, `cli`별 분류
`/status``session_status` 도구는 모두 cleanup 인지형 작업 스냅샷을 사용합니다. 활성 작업이 우선되며, 오래된 완료 행은 숨겨지고, 최근 실패는 활성 작업이 없을 때만 표시됩니다. 이렇게 하면 상태 카드가 현재 중요한 사항에 집중됩니다.
`/status``session_status` 도구는 모두 정리 상태를 인지하는 작업 스냅샷을 사용합니다: 활성 작업이 우선되며, 오래된 완료 행은 숨겨지고, 최근 실패는 활성 작업이 남아 있지 않을 때만 표시됩니다. 이렇게 하면 상태 카드가 지금 중요한 내용에 집중할 수 있습니다.
## 저장소 및 유지 관리
### 작업 저장 위치
### 작업 저장되는 위치
작업 레코드는 다음 SQLite에 영구 저장됩니다.
작업 기록은 다음 위치의 SQLite에 영속 저장됩니다:
```
$OPENCLAW_STATE_DIR/tasks/runs.sqlite
```
레지스트리는 게이트웨이 시작 시 메모리에 로드되고, 재시작 후에도 내구성을 유지할 수 있도록 쓰기를 SQLite와 동기화합니다.
레지스트리는 게이트웨이 시작 시 메모리로 로드되며, 재시작 후에도 내구성을 보장하기 위해 쓰기 작업을 SQLite와 동기화합니다.
### 자동 유지 관리
스위퍼가 **60초**마다 실행되며 세 가지를 처리합니다.
스위퍼가 **60초**마다 실행되며 세 가지를 처리합니다:
1. **조정** — 활성 작업에 여전히 권위 있는 런타임 백업이 있는지 확인합니다. ACP/하위 에이전트 작업은 하위 세션 상태를, cron 작업은 활성 작업 소유권을, 채팅 기반 CLI 작업은 소유한 실행 컨텍스트를 사용합니다. 이 백업 상태가 5분 이상 사라져 있으면 작업은 `lost`로 표시됩니다.
2. **Cleanup stamping** — 종료된 작업에 `cleanupAfter` 타임스탬프를 설정합니다(`endedAt + 7일`).
3. **정리**`cleanupAfter` 날짜가 지난 레코드를 삭제합니다.
1. **조정** — 활성 작업이 여전히 권위 있는 런타임 백킹을 갖고 있는지 확인합니다. ACP/하위 에이전트 작업은 자식 세션 상태를 사용하고, cron 작업은 활성 작업 소유 상태를 사용하며, 채팅 기반 CLI 작업은 소유한 실행 컨텍스트를 사용합니다. 이 백킹 상태가 5분 이상 사라져 있으면 작업은 `lost`로 표시됩니다.
2. **정리 타임스탬프 기록** — 종료된 작업에 `cleanupAfter` 타임스탬프를 설정합니다(`endedAt + 7일`).
3. **정리**`cleanupAfter` 날짜가 지난 기록을 삭제합니다.
**보관 기간**: 종료된 작업 레코드는 **7일** 동안 보관된 후 자동으로 정리됩니다. 별도의 설정은 필요하지 않습니다.
**보존 기간**: 종료된 작업 기록은 **7일** 동안 유지된 뒤 자동으로 정리됩니다. 별도 구성은 필요하지 않습니다.
## 작업이 다른 시스템과 연결되는 방식
### 작업과 Task Flow
[Task Flow](/ko/automation/taskflow)는 백그라운드 작업 위에 있는 흐름 오케스트레이션 계층입니다. 하나의 flow는 수명 주기 동안 관리형 또는 미러링 동기화 모드를 사용해 여러 작업을 조정할 수 있습니다. 개별 작업 레코드를 확인하려면 `openclaw tasks`를, 오케스트레이션 흐름을 확인하려면 `openclaw tasks flow`를 사용하세요.
[Task Flow](/ko/automation/taskflow)는 백그라운드 작업 위에 있는 플로우 오케스트레이션 계층입니다. 하나의 플로우는 수명 주기 동안 관리형 또는 미러링 동기화 모드를 사용해 여러 작업을 조정할 수 있습니다. 개별 작업 기록을 확인하려면 `openclaw tasks`를 사용하고, 오케스트레이션하는 플로우를 확인하려면 `openclaw tasks flow`를 사용하세요.
자세한 내용은 [Task Flow](/ko/automation/taskflow)를 참하세요.
자세한 내용은 [Task Flow](/ko/automation/taskflow)를 참하세요.
### 작업과 cron
cron 작업 **정의**는 `~/.openclaw/cron/jobs.json`에 있습니다. **모든** cron 실행은 작업 레코드를 생성합니다. 주 세션과 격리 실행 모두 해당됩니다. 주 세션 cron 작업은 기본적으로 `silent` 알림 정책을 사용하므로 알림을 생성하지 않고도 추적됩니다.
cron 작업 **정의**는 `~/.openclaw/cron/jobs.json`에 저장됩니다. **모든** cron 실행은 작업 기록을 생성합니다 — 기본 세션과 격리 실행 모두 해당됩니다. 기본 세션 cron 작업은 기본적으로 `silent` 알림 정책을 사용하므로 알림을 생성하지 않고 추적만 수행합니다.
[크론 작업](/ko/automation/cron-jobs)을 참고하세요.
[Cron Jobs](/ko/automation/cron-jobs)를 참조하세요.
### 작업과 heartbeat
### 작업과 하트비트
Heartbeat 실행은 주 세션 턴이며 작업 레코드를 생성하지 않습니다. 작업이 완료되면 heartbeat 깨우기를 트리거해 결과를 신속히 확인할 수 있습니다.
하트비트 실행은 기본 세션 턴입니다 — 작업 기록을 생성하지 않습니다. 작업이 완료되면 결과를 빠르게 볼 수 있도록 하트비트 웨이크를 트리거할 수 있습니다.
[Heartbeat](/ko/gateway/heartbeat)를 참하세요.
[Heartbeat](/ko/gateway/heartbeat)를 참하세요.
### 작업과 세션
작업은 `childSessionKey`(작업이 실행되는 위치)와 `requesterSessionKey`(작업을 시작한 주체)를 참조할 수 있습니다. 세션은 대화 컨텍스트이고, 작업은 그 위에서 동작 추적을 담당합니다.
작업은 `childSessionKey`(작업이 실행되는 위치)와 `requesterSessionKey`(작업을 시작한 주체)를 참조할 수 있습니다. 세션은 대화 컨텍스트이고, 작업은 그 위에서 이루어지는 활동 추적입니다.
### 작업과 에이전트 실행
작업의 `runId`실제 작업을 수행하는 에이전트 실행과 연결됩니다. 에이전트 수명 주기 이벤트(시작, 종료, 오류)는 작업 상태를 자동으로 업데이트하므로, 수명 주기를 수동으로 관리할 필요가 없습니다.
작업의 `runId`작업을 수행하는 에이전트 실행에 연결됩니다. 에이전트 수명 주기 이벤트(시작, 종료, 오류)는 작업 상태를 자동으로 업데이트하므로 수명 주기를 수동으로 관리할 필요가 없습니다.
## 관련 문서
- [Automation & Tasks](/ko/automation) — 모든 자동화 메커니즘 한눈에 보기
- [Task Flow](/ko/automation/taskflow) — 작업 위의 흐름 오케스트레이션
- [Task Flow](/ko/automation/taskflow) — 작업 위의 플로우 오케스트레이션
- [Scheduled Tasks](/ko/automation/cron-jobs) — 백그라운드 작업 예약
- [Heartbeat](/ko/gateway/heartbeat) — 주기적인 세션 턴
- [Heartbeat](/ko/gateway/heartbeat) — 주기적인 기본 세션 턴
- [CLI: Tasks](/cli/index#tasks) — CLI 명령 참조

View File

@ -0,0 +1,580 @@
---
read_when:
- 활성 메모리가 무엇을 위한 것인지 이해하고 싶습니다
- 대화형 에이전트에 활성 메모리를 켜고 싶습니다
- 어디에서나 활성화하지 않고 활성 메모리 동작을 조정하고 싶습니다
summary: 대화형 채팅 세션에 관련 메모리를 주입하는 plugin 소유 차단 메모리 하위 에이전트
title: 활성 메모리
x-i18n:
generated_at: "2026-04-10T05:59:51Z"
model: gpt-5.4
provider: openai
source_hash: 6a51437df4ae4d9d57764601dfcfcdadb269e2895bf49dc82b9f496c1b3cb341
source_path: concepts/active-memory.md
workflow: 15
---
# 활성 메모리
활성 메모리는 적격한 대화형 세션에서 메인 응답 전에 실행되는 선택적 plugin 소유 차단 메모리 하위 에이전트입니다.
이 기능이 존재하는 이유는 대부분의 메모리 시스템이 유능하지만 반응형이기 때문입니다. 메인 에이전트가 언제 메모리를 검색할지 결정하거나, 사용자가 "이걸 기억해" 또는 "메모리 검색해" 같은 말을 하길 기다립니다. 그 시점에는 메모리가 응답을 자연스럽게 느끼게 만들 수 있었던 순간이 이미 지나가 버립니다.
활성 메모리는 메인 응답이 생성되기 전에 시스템이 관련 메모리를 노출할 수 있는 제한된 한 번의 기회를 제공합니다.
## 이를 에이전트에 붙여 넣으세요
자체 포함형의 안전한 기본 설정으로 Active Memory를 활성화하려면 이것을 에이전트에 붙여 넣으세요:
```json5
{
plugins: {
entries: {
"active-memory": {
enabled: true,
config: {
enabled: true,
agents: ["main"],
allowedChatTypes: ["direct"],
modelFallbackPolicy: "default-remote",
queryMode: "recent",
promptStyle: "balanced",
timeoutMs: 15000,
maxSummaryChars: 220,
persistTranscripts: false,
logging: true,
},
},
},
},
}
```
이 설정은 `main` 에이전트에 대해 plugin을 켜고, 기본적으로 direct-message 스타일 세션으로 제한하며, 먼저 현재 세션 모델을 상속하도록 하고, 명시적이거나 상속된 모델을 사용할 수 없는 경우에도 내장 원격 폴백을 허용합니다.
그다음 게이트웨이를 다시 시작하세요:
```bash
node scripts/run-node.mjs gateway --profile dev
```
대화에서 실시간으로 확인하려면:
```text
/verbose on
```
## 활성 메모리 켜기
가장 안전한 설정은 다음과 같습니다:
1. plugin 활성화
2. 하나의 대화형 에이전트를 대상으로 지정
3. 조정하는 동안에만 로깅 유지
`openclaw.json`에서 다음으로 시작하세요:
```json5
{
plugins: {
entries: {
"active-memory": {
enabled: true,
config: {
agents: ["main"],
allowedChatTypes: ["direct"],
modelFallbackPolicy: "default-remote",
queryMode: "recent",
promptStyle: "balanced",
timeoutMs: 15000,
maxSummaryChars: 220,
persistTranscripts: false,
logging: true,
},
},
},
},
}
```
그런 다음 게이트웨이를 다시 시작하세요:
```bash
node scripts/run-node.mjs gateway --profile dev
```
이 의미는 다음과 같습니다:
- `plugins.entries.active-memory.enabled: true`는 plugin을 켭니다
- `config.agents: ["main"]``main` 에이전트만 활성 메모리에 옵트인합니다
- `config.allowedChatTypes: ["direct"]`는 기본적으로 direct-message 스타일 세션에서만 활성 메모리를 유지합니다
- `config.model`이 설정되지 않은 경우, 활성 메모리는 먼저 현재 세션 모델을 상속합니다
- `config.modelFallbackPolicy: "default-remote"`는 명시적이거나 상속된 모델을 사용할 수 없을 때 기본값으로 내장 원격 폴백을 유지합니다
- `config.promptStyle: "balanced"``recent` 모드에 대해 기본 범용 프롬프트 스타일을 사용합니다
- 활성 메모리는 여전히 적격한 대화형 지속 채팅 세션에서만 실행됩니다
## 확인하는 방법
활성 메모리는 모델에 숨겨진 시스템 컨텍스트를 주입합니다. 클라이언트에 원시 `<active_memory_plugin>...</active_memory_plugin>` 태그를 노출하지 않습니다.
## 세션 토글
설정을 수정하지 않고 현재 채팅 세션에 대해 활성 메모리를 일시 중지하거나 다시 시작하려면 plugin 명령을 사용하세요:
```text
/active-memory status
/active-memory off
/active-memory on
```
이것은 세션 범위입니다.
`plugins.entries.active-memory.enabled`, 에이전트 대상 지정 또는 기타 전역 설정은 변경하지 않습니다.
명령이 설정을 기록하고 모든 세션에 대해 활성 메모리를 일시 중지하거나 다시 시작하게 하려면 명시적인 전역 형식을 사용하세요:
```text
/active-memory status --global
/active-memory off --global
/active-memory on --global
```
전역 형식은 `plugins.entries.active-memory.config.enabled`를 기록합니다. 나중에 명령으로 활성 메모리를 다시 켤 수 있도록 `plugins.entries.active-memory.enabled`는 켜 둡니다.
라이브 세션에서 활성 메모리가 무엇을 하는지 보고 싶다면 해당 세션에 대해 상세 모드를 켜세요:
```text
/verbose on
```
상세 모드가 활성화되면 OpenClaw는 다음을 표시할 수 있습니다:
- `Active Memory: ok 842ms recent 34 chars`와 같은 활성 메모리 상태 줄
- `Active Memory Debug: Lemon pepper wings with blue cheese.`와 같은 읽기 쉬운 디버그 요약
이 줄들은 숨겨진 시스템 컨텍스트를 공급하는 동일한 활성 메모리 패스에서 파생되지만, 원시 프롬프트 마크업을 노출하는 대신 사람이 읽을 수 있도록 형식화됩니다.
기본적으로 차단 메모리 하위 에이전트 전사는 임시이며 실행이 완료되면 삭제됩니다.
예시 흐름:
```text
/verbose on
어떤 윙을 주문해야 할까?
```
예상되는 표시 응답 형태:
```text
...일반적인 어시스턴트 응답...
🧩 Active Memory: ok 842ms recent 34 chars
🔎 Active Memory Debug: 블루치즈를 곁들인 레몬 페퍼 윙.
```
## 실행 시점
활성 메모리는 두 개의 게이트를 사용합니다:
1. **설정 옵트인**
plugin이 활성화되어 있어야 하며, 현재 에이전트 ID가
`plugins.entries.active-memory.config.agents`에 있어야 합니다.
2. **엄격한 런타임 적격성**
활성화되고 대상이 지정된 경우에도 활성 메모리는 적격한
대화형 지속 채팅 세션에서만 실행됩니다.
실제 규칙은 다음과 같습니다:
```text
plugin 활성화
+
에이전트 ID 대상 지정
+
허용된 채팅 유형
+
적격한 대화형 지속 채팅 세션
=
활성 메모리 실행
```
이 중 하나라도 실패하면 활성 메모리는 실행되지 않습니다.
## 세션 유형
`config.allowedChatTypes`는 어떤 종류의 대화에서 Active Memory를 실행할 수 있는지 전체적으로 제어합니다.
기본값은 다음과 같습니다:
```json5
allowedChatTypes: ["direct"]
```
즉, Active Memory는 기본적으로 direct-message 스타일 세션에서 실행되지만, group 또는 channel 세션에서는 명시적으로 옵트인하지 않는 한 실행되지 않습니다.
예시:
```json5
allowedChatTypes: ["direct"]
```
```json5
allowedChatTypes: ["direct", "group"]
```
```json5
allowedChatTypes: ["direct", "group", "channel"]
```
## 실행 위치
활성 메모리는 플랫폼 전체 추론 기능이 아니라 대화 강화 기능입니다.
| Surface | 활성 메모리 실행 여부 |
| ------------------------------------------------------------------- | ----------------------------------------------------- |
| Control UI / 웹 채팅 지속 세션 | 예, plugin이 활성화되어 있고 에이전트가 대상이면 실행 |
| 같은 지속 채팅 경로의 다른 대화형 채널 세션 | 예, plugin이 활성화되어 있고 에이전트가 대상이면 실행 |
| 헤드리스 원샷 실행 | 아니요 |
| 하트비트/백그라운드 실행 | 아니요 |
| 일반 내부 `agent-command` 경로 | 아니요 |
| 하위 에이전트/내부 헬퍼 실행 | 아니요 |
## 사용해야 하는 이유
다음과 같은 경우 활성 메모리를 사용하세요:
- 세션이 지속적이고 사용자 대상일 때
- 에이전트가 검색할 만한 의미 있는 장기 메모리를 가지고 있을 때
- 연속성과 개인화가 원시 프롬프트 결정성보다 더 중요할 때
특히 다음에 잘 맞습니다:
- 안정적인 선호
- 반복되는 습관
- 자연스럽게 드러나야 하는 장기 사용자 컨텍스트
다음에는 적합하지 않습니다:
- 자동화
- 내부 워커
- 원샷 API 작업
- 숨겨진 개인화가 놀랍게 느껴질 수 있는 곳
## 동작 방식
런타임 형태는 다음과 같습니다:
```mermaid
flowchart LR
U["사용자 메시지"] --> Q["메모리 쿼리 빌드"]
Q --> R["Active Memory 차단 메모리 하위 에이전트"]
R -->|NONE 또는 비어 있음| M["메인 응답"]
R -->|관련 요약| I["숨겨진 active_memory_plugin 시스템 컨텍스트 추가"]
I --> M["메인 응답"]
```
차단 메모리 하위 에이전트가 사용할 수 있는 것은 다음뿐입니다:
- `memory_search`
- `memory_get`
연결 상태가 약하면 `NONE`을 반환해야 합니다.
## 쿼리 모드
`config.queryMode`는 차단 메모리 하위 에이전트가 얼마나 많은 대화를 볼지 제어합니다.
## 프롬프트 스타일
`config.promptStyle`는 차단 메모리 하위 에이전트가 메모리를 반환할지 결정할 때 얼마나 적극적이거나 엄격할지 제어합니다.
사용 가능한 스타일:
- `balanced`: `recent` 모드용 범용 기본값
- `strict`: 가장 덜 적극적임; 인접한 컨텍스트의 영향이 매우 적기를 원할 때 가장 적합
- `contextual`: 연속성 친화성이 가장 높음; 대화 기록이 더 중요해야 할 때 가장 적합
- `recall-heavy`: 더 약하지만 여전히 그럴듯한 일치에도 메모리를 더 기꺼이 노출함
- `precision-heavy`: 일치가 명확하지 않으면 적극적으로 `NONE`을 선호함
- `preference-only`: 즐겨찾기, 습관, 루틴, 취향, 반복되는 개인 사실에 최적화됨
`config.promptStyle`이 설정되지 않았을 때의 기본 매핑:
```text
message -> strict
recent -> balanced
full -> contextual
```
`config.promptStyle`을 명시적으로 설정하면 그 재정의가 우선합니다.
예시:
```json5
promptStyle: "preference-only"
```
## 모델 폴백 정책
`config.model`이 설정되지 않은 경우, Active Memory는 다음 순서로 모델을 확인하려고 합니다:
```text
명시적 plugin 모델
-> 현재 세션 모델
-> 에이전트 기본 모델
-> 선택적 내장 원격 폴백
```
`config.modelFallbackPolicy`는 마지막 단계를 제어합니다.
기본값:
```json5
modelFallbackPolicy: "default-remote"
```
다른 옵션:
```json5
modelFallbackPolicy: "resolved-only"
```
명시적이거나 상속된 모델을 사용할 수 없을 때 내장 원격 기본값으로 폴백하는 대신 Active Memory가 회상을 건너뛰게 하려면 `resolved-only`를 사용하세요.
## 고급 이스케이프 해치
이 옵션들은 의도적으로 권장 설정에 포함되지 않았습니다.
`config.thinking`은 차단 메모리 하위 에이전트의 사고 수준을 재정의할 수 있습니다:
```json5
thinking: "medium"
```
기본값:
```json5
thinking: "off"
```
이것을 기본으로 활성화하지 마세요. Active Memory는 응답 경로에서 실행되므로 추가 사고 시간은 사용자에게 보이는 지연 시간을 직접 증가시킵니다.
`config.promptAppend`는 기본 Active Memory 프롬프트 뒤와 대화 컨텍스트 앞에 추가 운영자 지침을 더합니다:
```json5
promptAppend: "일회성 이벤트보다 안정적인 장기 선호를 우선하세요."
```
`config.promptOverride`는 기본 Active Memory 프롬프트를 대체합니다. OpenClaw는 그 뒤에 대화 컨텍스트를 계속 추가합니다:
```json5
promptOverride: "당신은 메모리 검색 에이전트입니다. NONE 또는 하나의 간결한 사용자 사실을 반환하세요."
```
프롬프트 커스터마이징은 의도적으로 다른 회상 계약을 테스트하는 경우가 아니라면 권장되지 않습니다. 기본 프롬프트는 메인 모델에 대해 `NONE` 또는 간결한 사용자 사실 컨텍스트를 반환하도록 조정되어 있습니다.
### `message`
최신 사용자 메시지만 전송됩니다.
```text
최신 사용자 메시지만
```
다음과 같은 경우 사용하세요:
- 가장 빠른 동작을 원할 때
- 안정적인 선호 회상에 가장 강한 편향을 원할 때
- 후속 턴에 대화 컨텍스트가 필요 없을 때
권장 타임아웃:
- `3000`~`5000`ms 정도에서 시작
### `recent`
최신 사용자 메시지와 소량의 최근 대화 꼬리가 전송됩니다.
```text
최근 대화 꼬리:
user: ...
assistant: ...
user: ...
최신 사용자 메시지:
...
```
다음과 같은 경우 사용하세요:
- 속도와 대화 맥락화 사이에서 더 나은 균형을 원할 때
- 후속 질문이 종종 마지막 몇 턴에 의존할 때
권장 타임아웃:
- `15000`ms 정도에서 시작
### `full`
전체 대화가 차단 메모리 하위 에이전트로 전송됩니다.
```text
전체 대화 컨텍스트:
user: ...
assistant: ...
user: ...
...
```
다음과 같은 경우 사용하세요:
- 지연 시간보다 가장 강한 회상 품질이 더 중요할 때
- 대화에 스레드 앞부분의 중요한 설정이 포함되어 있을 때
권장 타임아웃:
- `message` 또는 `recent`보다 상당히 늘리세요
- 스레드 크기에 따라 `15000`ms 이상에서 시작
일반적으로 타임아웃은 컨텍스트 크기에 따라 증가해야 합니다:
```text
message < recent < full
```
## 전사 지속성
활성 메모리 차단 메모리 하위 에이전트 실행은 차단 메모리 하위 에이전트 호출 중 실제 `session.jsonl` 전사를 생성합니다.
기본적으로 그 전사는 임시입니다:
- 임시 디렉터리에 기록됩니다
- 차단 메모리 하위 에이전트 실행에만 사용됩니다
- 실행이 끝나면 즉시 삭제됩니다
디버깅이나 검토를 위해 이러한 차단 메모리 하위 에이전트 전사를 디스크에 유지하려면 지속성을 명시적으로 켜세요:
```json5
{
plugins: {
entries: {
"active-memory": {
enabled: true,
config: {
agents: ["main"],
persistTranscripts: true,
transcriptDir: "active-memory",
},
},
},
},
}
```
활성화되면 활성 메모리는 메인 사용자 대화 전사 경로가 아니라 대상 에이전트의 세션 폴더 아래 별도 디렉터리에 전사를 저장합니다.
기본 레이아웃의 개념은 다음과 같습니다:
```text
agents/<agent>/sessions/active-memory/<blocking-memory-sub-agent-session-id>.jsonl
```
상대 하위 디렉터리는 `config.transcriptDir`로 변경할 수 있습니다.
이 기능은 주의해서 사용하세요:
- 바쁜 세션에서는 차단 메모리 하위 에이전트 전사가 빠르게 누적될 수 있습니다
- `full` 쿼리 모드는 많은 대화 컨텍스트를 중복할 수 있습니다
- 이러한 전사에는 숨겨진 프롬프트 컨텍스트와 회상된 메모리가 포함됩니다
## 구성
모든 활성 메모리 구성은 다음 아래에 있습니다:
```text
plugins.entries.active-memory
```
가장 중요한 필드는 다음과 같습니다:
| Key | Type | 의미 |
| --------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `enabled` | `boolean` | plugin 자체를 활성화합니다 |
| `config.agents` | `string[]` | 활성 메모리를 사용할 수 있는 에이전트 ID |
| `config.model` | `string` | 선택적 차단 메모리 하위 에이전트 모델 참조; 설정되지 않으면 활성 메모리는 현재 세션 모델을 사용합니다 |
| `config.queryMode` | `"message" \| "recent" \| "full"` | 차단 메모리 하위 에이전트가 얼마나 많은 대화를 볼지 제어합니다 |
| `config.promptStyle` | `"balanced" \| "strict" \| "contextual" \| "recall-heavy" \| "precision-heavy" \| "preference-only"` | 차단 메모리 하위 에이전트가 메모리를 반환할지 결정할 때 얼마나 적극적이거나 엄격할지 제어합니다 |
| `config.thinking` | `"off" \| "minimal" \| "low" \| "medium" \| "high" \| "xhigh" \| "adaptive"` | 차단 메모리 하위 에이전트용 고급 사고 재정의; 속도를 위해 기본값은 `off` |
| `config.promptOverride` | `string` | 고급 전체 프롬프트 대체; 일반적인 사용에는 권장되지 않음 |
| `config.promptAppend` | `string` | 기본 또는 재정의된 프롬프트에 추가되는 고급 추가 지침 |
| `config.timeoutMs` | `number` | 차단 메모리 하위 에이전트의 하드 타임아웃 |
| `config.maxSummaryChars` | `number` | active-memory 요약에 허용되는 총 최대 문자 수 |
| `config.logging` | `boolean` | 조정 중에 활성 메모리 로그를 출력합니다 |
| `config.persistTranscripts` | `boolean` | 임시 파일을 삭제하는 대신 차단 메모리 하위 에이전트 전사를 디스크에 유지합니다 |
| `config.transcriptDir` | `string` | 에이전트 세션 폴더 아래의 상대 차단 메모리 하위 에이전트 전사 디렉터리 |
유용한 조정 필드:
| Key | Type | 의미 |
| ----------------------------- | -------- | ------------------------------------------------------------- |
| `config.maxSummaryChars` | `number` | active-memory 요약에 허용되는 총 최대 문자 수 |
| `config.recentUserTurns` | `number` | `queryMode``recent`일 때 포함할 이전 사용자 턴 수 |
| `config.recentAssistantTurns` | `number` | `queryMode``recent`일 때 포함할 이전 어시스턴트 턴 수 |
| `config.recentUserChars` | `number` | 최근 사용자 턴당 최대 문자 수 |
| `config.recentAssistantChars` | `number` | 최근 어시스턴트 턴당 최대 문자 수 |
| `config.cacheTtlMs` | `number` | 반복되는 동일 쿼리에 대한 캐시 재사용 |
## 권장 설정
`recent`로 시작하세요.
```json5
{
plugins: {
entries: {
"active-memory": {
enabled: true,
config: {
agents: ["main"],
queryMode: "recent",
promptStyle: "balanced",
timeoutMs: 15000,
maxSummaryChars: 220,
logging: true,
},
},
},
},
}
```
조정하는 동안 라이브 동작을 확인하고 싶다면 별도의 active-memory 디버그 명령을 찾는 대신 세션에서 `/verbose on`을 사용하세요.
그런 다음 다음으로 이동하세요:
- 더 낮은 지연 시간을 원하면 `message`
- 추가 컨텍스트가 더 느린 차단 메모리 하위 에이전트의 가치가 있다고 판단되면 `full`
## 디버깅
활성 메모리가 예상한 위치에 표시되지 않는다면:
1. `plugins.entries.active-memory.enabled` 아래에서 plugin이 활성화되어 있는지 확인합니다.
2. 현재 에이전트 ID가 `config.agents`에 나열되어 있는지 확인합니다.
3. 대화형 지속 채팅 세션을 통해 테스트하고 있는지 확인합니다.
4. `config.logging: true`를 켜고 게이트웨이 로그를 확인합니다.
5. `openclaw memory status --deep`로 메모리 검색 자체가 작동하는지 검증합니다.
메모리 적중이 너무 시끄럽다면 다음을 더 엄격하게 하세요:
- `maxSummaryChars`
활성 메모리가 너무 느리다면:
- `queryMode`를 낮추기
- `timeoutMs`를 낮추기
- 최근 턴 수 줄이기
- 턴당 문자 제한 줄이기
## 관련 페이지
- [메모리 검색](/ko/concepts/memory-search)
- [메모리 구성 참조](/ko/reference/memory-config)
- [Plugin SDK 설정](/ko/plugins/sdk-setup)

View File

@ -1,26 +1,26 @@
---
read_when:
- '`memory_search`가 어떻게 작동하는지 이해하려는 경우'
- 임베딩 provider를 선택하려는 경우
- 검색 품질을 조정하려는 경우
summary: 메모리 검색이 임베딩과 하이브리드 검색을 사용해 관련 메모를 찾는 방법
- memory_search가 어떻게 작동하는지 이해하고 싶습니다.
- 임베딩 공급자를 선택하고 싶습니다.
- 검색 품질을 조정하고 싶습니다.
summary: 메모리 검색은 임베딩과 하이브리드 검색을 사용해 관련 메모를 찾는 방식입니다.
title: 메모리 검색
x-i18n:
generated_at: "2026-04-06T03:06:42Z"
generated_at: "2026-04-10T06:00:19Z"
model: gpt-5.4
provider: openai
source_hash: b6541cd702bff41f9a468dad75ea438b70c44db7c65a4b793cbacaf9e583c7e9
source_hash: ca0237f4f1ee69dcbfb12e6e9527a53e368c0bf9b429e506831d4af2f3a3ac6f
source_path: concepts/memory-search.md
workflow: 15
---
# 메모리 검색
`memory_search`는 표현이 원문과 다르더라도 메모리 파일에서 관련 메모를 찾아냅니다. 이 기능은 메모리를 작은 청크로 인덱싱한 뒤, 임베딩, 키워드 또는 둘 다를 사용해 검색하는 방식으로 동합니다.
`memory_search`원래 텍스트와 표현이 다르더라도 메모리 파일에서 관련 메모를 찾니다. 이 기능은 메모리를 작은 청크로 인덱싱한 뒤, 임베딩, 키워드 또는 둘 다를 사용해 검색하는 방식으로 동합니다.
## 빠른 시작
OpenAI, Gemini, Voyage 또는 Mistral API 키가 구성되어 있으면 메모리 검색은 자동으로 작동합니다. provider를 명시적으로 설정하려면 다음을 사용하세요.
OpenAI, Gemini, Voyage 또는 Mistral API 키가 구성되어 있으면 메모리 검색은 자동으로 작동합니다. 공급자를 명시적으로 설정하려면 다음과 같이 하세요.
```json5
{
@ -36,21 +36,21 @@ OpenAI, Gemini, Voyage 또는 Mistral API 키가 구성되어 있으면 메모
API 키 없이 로컬 임베딩을 사용하려면 `provider: "local"`을 사용하세요(`node-llama-cpp` 필요).
## 지원되는 provider
## 지원되는 공급자
| Provider | ID | API 키 필요 | 참고 |
| -------- | --------- | ----------- | ---- |
| OpenAI | `openai` | 예 | 자동 감지, 빠름 |
| Gemini | `gemini` | 예 | 이미지/오디오 인덱싱 지원 |
| Voyage | `voyage` | 예 | 자동 감지 |
| Mistral | `mistral` | 예 | 자동 감지 |
| Bedrock | `bedrock` | 아니요 | AWS 자격 증명 체인이 확인되면 자동 감지됨 |
| Ollama | `ollama` | 아니요 | 로컬, 명시적으로 설정해야 함 |
| Local | `local` | 아니요 | GGUF 모델, 약 0.6 GB 다운로드 |
| 공급자 | ID | API 키 필요 | 참고 |
| ------ | --------- | ----------- | ---------------------------------------------------- |
| OpenAI | `openai` | 예 | 자동 감지, 빠름 |
| Gemini | `gemini` | 예 | 이미지/오디오 인덱싱 지원 |
| Voyage | `voyage` | 예 | 자동 감지 |
| Mistral| `mistral` | 예 | 자동 감지 |
| Bedrock| `bedrock` | 아니요 | AWS 자격 증명 체인이 해석되면 자동 감지 |
| Ollama | `ollama` | 아니요 | 로컬, 명시적으로 설정해야 함 |
| Local | `local` | 아니요 | GGUF 모델, 약 0.6 GB 다운로드 필요 |
## 검색 작동 방식
OpenClaw는 두 개의 검색 경로를 병렬로 실행하고 결과를 병합합니다.
OpenClaw는 두 개의 검색 경로를 병렬로 실행한 뒤 결과를 병합합니다.
```mermaid
flowchart LR
@ -63,31 +63,31 @@ flowchart LR
M --> R["Top Results"]
```
- **벡터 검색**은 의미가 비슷한 메모를 찾습니다("gateway host"는 "OpenClaw를 실행하는 머신"과 일치).
- **BM25 키워드 검색**은 정확히 일치하는 항목을 찾습니다(ID, 오류 문자열, 구성 키).
- **벡터 검색**은 의미가 비슷한 메모를 찾습니다("gateway host"는 "the machine running OpenClaw"와 일치할 수 있습니다).
- **BM25 키워드 검색**은 정확히 일치하는 항목을 찾습니다(ID, 오류 문자열, 설정 키 등).
한 경로만 사용할 수 있는 경우(임베딩 없음 또는 FTS 없음), 다른 경로만 단독으로 실행됩니다.
## 검색 품질 개선
메모 기록이 많은 경우, 두 가지 선택적 기능이 도움이 됩니다.
메모 기록이 많을 때 도움이 되는 선택적 기능 두 가지가 있습니다.
### 시간 감쇠
오래된 메모는 순위 가중치가 점차 낮아져 최근 정보가 먼저 표시됩니다.
기본 반감기 30일에서는 지난달의 메모 점수가 원래 가중치의 50%가 됩니다.
`MEMORY.md` 같은 상시 유 파일에는 감쇠가 적용되지 않습니다.
오래된 메모는 순위 가중치가 점차 낮아져 최근 정보가 먼저 노출됩니다.
기본 반감기 30일 기준으로 지난달의 메모는 원래 가중치의 50% 점수를 받습니다.
`MEMORY.md` 같은 상시 유 파일에는 감쇠가 적용되지 않습니다.
<Tip>
에이전트에 수개월치 일일 메모가 있고 오래된 정보가 최근 컨텍스트보다 계속 더 높은 순위에 오른다면 시간 감쇠를 활성화하세요.
에이전트에 수개월치 일일 메모가 있고 오래된 정보가 최신 컨텍스트보다 계속 더 높은 순위에 오르면 시간 감쇠를 활성화하세요.
</Tip>
### MMR(다양성)
중복 결과를 줄입니다. 다섯 개의 메모가 모두 같은 라우터 구성을 언급하더라도, MMR은 상위 결과가 반복되지 않고 서로 다른 주제를 다루도록 보장합니다.
중복되는 결과를 줄입니다. 다섯 개의 메모가 모두 동일한 라우터 설정을 언급하더라도, MMR은 같은 내용이 반복되지 않도록 상위 결과가 서로 다른 주제를 다루게 합니다.
<Tip>
`memory_search`가 서로 다른 일일 메모에서 거의 중복 스니펫을 계속 반환한다면 MMR을 활성화하세요.
`memory_search`가 서로 다른 일일 메모에서 거의 중복되는 스니펫을 계속 반환한다면 MMR을 활성화하세요.
</Tip>
### 둘 다 활성화
@ -112,24 +112,23 @@ flowchart LR
## 멀티모달 메모리
Gemini Embedding 2를 사용하면 Markdown과 함께 이미지 및 오디오 파일도 인덱싱할 수 있습니다.
검색 쿼리는 여전히 텍스트이지만, 시각 및 오디오 콘텐츠와 일치합니다.
검색 질의는 여전히 텍스트이지만, 시각 및 오디오 콘텐츠와 매칭됩니다.
설정 방법은 [메모리 구성 참조](/ko/reference/memory-config)를 확인하세요.
## 세션 메모리 검색
선택적으로 세션 대화록을 인덱싱하여 `memory_search`가 이전 대화를 회상할 수 있게 할 수 있습니다.
이는 `memorySearch.experimental.sessionMemory`를 통해 옵트인 방식으로 활성화합니다.
자세한 내용은 [구성 참조](/ko/reference/memory-config)를 확인하세요.
세션 대화 내용을 선택적으로 인덱싱해 `memory_search`가 이전 대화를 기억하도록 할 수 있습니다. 이 기능은 `memorySearch.experimental.sessionMemory`를 통해 옵트인 방식으로 활성화됩니다. 자세한 내용은 [구성 참조](/ko/reference/memory-config)를 확인하세요.
## 문제 해결
**결과가 없나요?** 인덱스를 확인하려면 `openclaw memory status`를 실행하세요. 비어 있다면 `openclaw memory index --force`를 실행하세요.
**결과가 없나요?** `openclaw memory status`를 실행해 인덱스를 확인하세요. 비어 있다면 `openclaw memory index --force`를 실행하세요.
**키워드 일치만 나오나요?** 임베딩 provider가 구성되지 않았을 수 있습니다. `openclaw memory status --deep` 확인하세요.
**키워드 일치만 되나요?** 임베딩 공급자가 구성되지 않았을 수 있습니다. `openclaw memory status --deep` 확인하세요.
**CJK 텍스트를 찾을 수 없나요?** `openclaw memory index --force`로 FTS 인덱스를 다시 빌드하세요.
**CJK 텍스트가 검색되지 않나요?** `openclaw memory index --force`로 FTS 인덱스를 다시 빌드하세요.
## 추가 읽을거리
## 더 읽어보기
- [메모리](/ko/concepts/memory) -- 파일 레이아웃, 백엔드, 도구
- [메모리 구성 참조](/ko/reference/memory-config) -- 모든 구성 옵션
- [Active Memory](/ko/concepts/active-memory) -- 대화형 채팅 세션을 위한 서브 에이전트 메모리
- [Memory](/ko/concepts/memory) -- 파일 레이아웃, 백엔드, 도구
- [Memory configuration reference](/ko/reference/memory-config) -- 모든 구성 옵션

View File

@ -1,50 +1,51 @@
---
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-09T01:27:48Z"
generated_at: "2026-04-10T05:59:51Z"
model: gpt-5.4
provider: openai
source_hash: c922607d67e0f3a2489ac82bc9f510f7294ced039c1014c15b676d826441d833
source_hash: 357d6698304ff7a8c4aa8a7be97f684d50f72b524740050aa761ac0ee68266de
source_path: concepts/qa-e2e-automation.md
workflow: 15
---
# QA E2E 자동화
비공개 QA 스택은 단일 단위 테스트보다 더 현실적이고
채널 형태에 가까운 방식으로 OpenClaw를 검증하도록 설계되었습니다.
비공개 QA 스택은 단일 단위 테스트보다 더 현실적이고,
채널 형태에 가까운 방식으로 OpenClaw를 검증하기 위한 것입니다.
현재 구성 요소:
- `extensions/qa-channel`: DM, 채널, 스레드,
리액션, 편집, 삭제 인터페이스를 갖춘 합성 메시지 채널
- `extensions/qa-lab`: 트랜스크립트를 관찰하고,
인바운드 메시지를 주입하, Markdown 보고서를 내보내기 위한 디버거 UI 및 QA 버스
- `extensions/qa-lab`: 대화 기록을 관찰하고,
인바운드 메시지를 주입하, Markdown 보고서를 내보내기 위한 디버거 UI 및 QA 버스
- `qa/`: 시작 작업과 기본 QA
시나리오를 위한 리포지토리 기반 시드 자산
현재 QA 운영자 흐름은 2패널 QA 사이트입니다:
현재 QA 운영자 흐름은 2패널로 구성된 QA 사이트입니다:
- 왼쪽: 에이전트가 있는 Gateway 대시보드(Control UI)
- 오른쪽: Slack 스타일의 트랜스크립트와 시나리오 계획을 보여주는 QA Lab
- 오른쪽: Slack과 유사한 대화 기록과 시나리오 계획을 보여주는 QA Lab
다음으로 실행합니다:
다음 명령으로 실행합니다:
```bash
pnpm qa:lab:up
```
이 명령은 QA 사이트를 빌드하고, Docker 기반 gateway 레인을 시작하며, 운영자나 자동화 루프가 에이전트에 QA
미션을 부여하고, 실제 채널 동작을 관찰하며, 무엇이 작동했고 실패했으며
또는 계속 막혀 있었는지를 기록할 수 있는 QA Lab 페이지를 노출합니다.
이 명령은 QA 사이트를 빌드하고, Docker 기반 Gateway 레인을 시작하며,
운영자 또는 자동화 루프가 에이전트에 QA
미션을 부여하고, 실제 채널 동작을 관찰하고, 무엇이 작동했고, 실패했고, 계속 막혀 있었는지 기록할 수 있는
QA Lab 페이지를 노출합니다.
매번 Docker 이미지를 다시 빌드하지 않고 QA Lab UI를 더 빠르게 반복 개발하려면,
bind mount된 QA Lab 번들로 스택을 시작하세요:
매번 Docker 이미지를 다시 빌드하지 않고 더 빠르게 QA Lab UI를 반복 개발하려면,
바인드 마운트된 QA Lab 번들로 스택을 시작하세요:
```bash
pnpm openclaw qa docker-build-image
@ -53,9 +54,24 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast`는 사전 빌드된 이미지에서 Docker 서비스를 유지하고
`extensions/qa-lab/web/dist``qa-lab` 컨테이너에 bind mount합니다. `qa:lab:watch`
변경 시 해당 번들을 다시 빌드하고, QA Lab 자산 해시가 변경되면 브라우저가 자동으로 다시 로드됩니다.
`qa:lab:up:fast`는 Docker 서비스를 사전 빌드된 이미지로 유지하고
`extensions/qa-lab/web/dist``qa-lab` 컨테이너에 바인드 마운트합니다. `qa:lab:watch`
변경 시 해당 번들을 다시 빌드하며, QA Lab 자산 해시가 바뀌면 브라우저가 자동으로 다시 로드됩니다.
QA 경로에 Docker를 포함하지 않는 일회용 Linux VM 레인의 경우 다음을 실행하세요:
```bash
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
이 명령은 새 Multipass 게스트를 부팅하고, 의존성을 설치하고, 게스트 내부에서 OpenClaw를 빌드하고,
`qa suite`를 실행한 다음, 일반 QA 보고서와
요약을 다시 호스트의 `.artifacts/qa-e2e/...`로 복사합니다.
시나리오 선택 동작은 호스트에서의 `qa suite`와 동일하게 재사용합니다.
라이브 실행은 게스트에서 실용적으로 사용할 수 있는 지원 QA 인증 입력을 전달합니다:
환경 변수 기반 제공자 키, QA 라이브 제공자 구성 경로,
그리고 존재할 경우 `CODEX_HOME`입니다. 게스트가
마운트된 워크스페이스를 통해 다시 쓸 수 있도록 `--output-dir`은 리포지토리 루트 아래에 유지하세요.
## 리포지토리 기반 시드
@ -64,8 +80,9 @@ pnpm qa:lab:watch
- `qa/scenarios/index.md`
- `qa/scenarios/*.md`
이 파일들은 QA 계획이 사람과
에이전트 모두에게 보이도록 의도적으로 git에 포함됩니다. 기본 목록은 다음을 포괄할 만큼 충분히 넓게 유지되어야 합니다:
이 항목들은 QA 계획이 사람과
에이전트 모두에게 보이도록 의도적으로 git에 포함됩니다. 기본 목록은 다음을 포괄할 수 있을 만큼
충분히 넓어야 합니다:
- DM 및 채널 채팅
- 스레드 동작
@ -73,22 +90,22 @@ pnpm qa:lab:watch
- cron 콜백
- 메모리 회상
- 모델 전환
- 서브에이전트 핸드오프
- 하위 에이전트 핸드오프
- 리포지토리 읽기 및 문서 읽기
- Lobster Invaders 같은 작은 빌드 작업 하나
- Lobster Invaders 같은 작은 빌드 작업 하나
## 보고
`qa-lab`은 관찰된 버스 타임라인에서 Markdown 프로토콜 보고서를 내보냅니다.
보고서는 다음에 답해야 합니다:
보고서는 다음에 답해야 합니다:
- 무엇이 작동했는가
- 무엇이 실패했는가
- 무엇이 계속 막혀 있었는가
- 어떤 후속 시나리오를 추가할 가치가 있는가
캐릭터 및 스타일 검사를 위해 동일한 시나리오를 여러 라이브 모델
ref에서 실행하고 판단된 Markdown 보고서를 작성하세요:
캐릭터 및 스타일 점검을 위해, 동일한 시나리오를 여러 라이브 모델 ref에 걸쳐 실행하고
판정된 Markdown 보고서를 작성하세요:
```bash
pnpm openclaw qa character-eval \
@ -107,36 +124,38 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
이 명령은 Docker가 아니라 로컬 QA gateway 자식 프로세스를 실행합니다. 캐릭터 평가
시나리오는 `SOUL.md`를 통해 페르소나를 설정한 다음, 채팅, 워크스페이스 도움말, 작은 파일 작업과 같은
일반 사용자 턴을 실행해야 합니다. 후보 모델에는 자신이 평가되고 있다는 사실을 알려서는 안 됩니다.
이 명령은 각 전체 트랜스크립트를 보존하고, 기본 실행 통계를 기록한 뒤, judge 모델에 fast 모드와
`xhigh` 추론을 사용해 자연스러움, 분위기, 유머를 기준으로 실행 결과의 순위를 매기도록 요청합니다.
제공자들을 비교할 때는 `--blind-judge-models`를 사용하세요. 이 경우 judge 프롬프트는 여전히
모든 트랜스크립트와 실행 상태를 받지만, 후보 ref는 `candidate-01` 같은 중립적인
레이블로 대체됩니다. 보고서는 파싱 후 순위를 실제 ref에 다시 매핑합니다.
후보 실행은 기본적으로 `high` thinking을 사용하며, 이를 지원하는 OpenAI 모델은 `xhigh`를 사용합니다.
특정 후보를 개별적으로 재정의하려면
`--model provider/model,thinking=<level>`을 사용하세요. `--thinking <level>`은 여전히 전역 기본값을 설정하며,
기존의 `--model-thinking <provider/model=level>` 형식도 호환성을 위해 유지됩니다.
OpenAI 후보 ref는 기본적으로 fast 모드를 사용하므로, 제공자가 이를 지원하는 경우 우선 처리됩니다.
단일 후보나 judge에 재정의가 필요하면 인라인으로 `,fast`, `,no-fast`, 또는 `,fast=false`를 추가하세요.
모든 후보 모델에 fast 모드를 강제로 적용하려는 경우에만 `--fast`를 전달하세요. 후보와 judge의 실행 시간은
벤치마크 분석을 위해 보고서에 기록되지만, judge 프롬프트에는 속도로 순위를 매기지 말라고 명시되어 있습니다.
후보 및 judge 모델 실행은 모두 기본적으로 동시성 16을 사용합니다.
제공자 제한이나 로컬 gateway 부하 때문에 실행이 너무 불안정해지면
`--concurrency` 또는 `--judge-concurrency`를 낮추세요.
후보 `--model`이 전달되지 않으면 character eval은 기본적으로
이 명령은 Docker가 아니라 로컬 QA Gateway 자식 프로세스를 실행합니다. 캐릭터 평가
시나리오는 `SOUL.md`를 통해 페르소나를 설정한 다음, 채팅, 워크스페이스 도움말,
작은 파일 작업과 같은 일반 사용자 턴을 실행해야 합니다. 후보 모델에는
평가 중이라는 사실을 알려주면 안 됩니다. 이 명령은 각 전체 대화 기록을 보존하고,
기본 실행 통계를 기록한 다음, 판정 모델에 빠른 모드와
`xhigh` 추론으로 실행 결과를 자연스러움, 분위기, 유머 기준으로 순위를 매기도록 요청합니다.
제공자 간 비교 시에는 `--blind-judge-models`를 사용하세요. 판정 프롬프트는 여전히
모든 대화 기록과 실행 상태를 받지만, 후보 ref는
`candidate-01` 같은 중립적인 레이블로 대체됩니다. 이후 보고서는 파싱 후 순위를 실제 ref에 다시 매핑합니다.
후보 실행은 기본적으로 `high` 추론을 사용하며, 이를 지원하는 OpenAI 모델의 경우 `xhigh`를 사용합니다.
특정 후보를 개별적으로 덮어쓰려면
`--model provider/model,thinking=<level>`을 사용하세요. `--thinking <level>`은 여전히
전역 대체값을 설정하며, 이전의 `--model-thinking <provider/model=level>` 형식도
호환성을 위해 유지됩니다.
OpenAI 후보 ref는 제공자가 지원하는 경우 우선 처리에 fast 모드를 사용하도록 기본 설정됩니다.
단일 후보 또는 판정자에 대해 재정의가 필요하면 인라인으로 `,fast`, `,no-fast`, 또는 `,fast=false`를 추가하세요.
모든 후보 모델에 fast 모드를 강제로 적용하려는 경우에만 `--fast`를 전달하세요. 후보 및
판정 모델 실행 시간은 벤치마크 분석을 위해 보고서에 기록되지만,
판정 프롬프트에는 속도로 순위를 매기지 말라고 명시되어 있습니다.
후보 및 판정 모델 실행은 둘 다 기본 동시성 16을 사용합니다. 제공자 제한 또는 로컬 Gateway
부하로 인해 실행 결과에 노이즈가 너무 많다면 `--concurrency` 또는 `--judge-concurrency`를 낮추세요.
후보 `--model`이 전달되지 않으면, 캐릭터 평가는 기본적으로
`openai/gpt-5.4`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5`, 그리고
`google/gemini-3.1-pro-preview`를 사용합니다.
`--judge-model`이 전달되지 않으면 judge는 기본적으로
판정 `--judge-model`이 전달되지 않으면, 판정자는 기본적으로
`openai/gpt-5.4,thinking=xhigh,fast`
`anthropic/claude-opus-4-6,thinking=high`를 사용합니다.
## 관련 문서
- [테스트](/ko/help/testing)
- [QA 채널](/ko/channels/qa-channel)
- [QA Channel](/ko/channels/qa-channel)
- [대시보드](/web/dashboard)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,47 +1,58 @@
---
read_when:
- 메모리 검색 provider 또는 임베딩 모델을 구성하고 싶을 때
- QMD 백엔드를 설정하고 싶을 때
- 하이브리드 검색, MMR 또는 시간 감쇠를 조정하고 싶을 때
- 멀티모달 메모리 인덱싱을 활성화하고 싶을 때
summary: 메모리 검색, 임베딩 provider, QMD, 하이브리드 검색, 멀티모달 인덱싱을 위한 모든 구성 항목
- 메모리 검색 제공자나 임베딩 모델을 구성하려고 합니다
- QMD 백엔드를 설정하려고 합니다
- 하이브리드 검색, MMR 또는 시간 감쇠를 조정하려고 합니다
- 멀티모달 메모리 인덱싱을 활성화하려고 합니다
summary: 메모리 검색, 임베딩 제공자, QMD, 하이브리드 검색, 멀티모달 인덱싱에 대한 모든 구성 옵션
title: 메모리 구성 참조
x-i18n:
generated_at: "2026-04-06T03:12:41Z"
generated_at: "2026-04-10T05:59:52Z"
model: gpt-5.4
provider: openai
source_hash: 0de0b85125443584f4e575cf673ca8d9bd12ecd849d73c537f4a17545afa93fd
source_hash: 5f9076bdfad95b87bd70625821bf401326f8eaeb53842b70823881419dbe43cb
source_path: reference/memory-config.md
workflow: 15
---
# 메모리 구성 참조
이 페이지는 OpenClaw 메모리 검색의 모든 구성 항목을 나열합니다.
개념적 개요는 다음을 참고하세요.
이 페이지에는 OpenClaw 메모리 검색의 모든 구성 옵션이 나열되어 있습니다. 개념적 개요는 다음 문서를 참조하세요.
- [Memory Overview](/ko/concepts/memory) -- 메모리가 동작하는 방식
- [Builtin Engine](/ko/concepts/memory-builtin) -- 기본 SQLite 백엔드
- [QMD Engine](/ko/concepts/memory-qmd) -- 로컬 우선 사이드카
- [Memory Search](/ko/concepts/memory-search) -- 검색 파이프라인 및 조정
- [메모리 개요](/ko/concepts/memory) -- 메모리가 작동하는 방식
- [내장 엔진](/ko/concepts/memory-builtin) -- 기본 SQLite 백엔드
- [QMD 엔진](/ko/concepts/memory-qmd) -- 로컬 우선 사이드카
- [메모리 검색](/ko/concepts/memory-search) -- 검색 파이프라인 및 튜닝
- [액티브 메모리](/ko/concepts/active-memory) -- 대화형 세션에 메모리 하위 에이전트를 활성화하는 방법
별도로 언급되지 않는 한 모든 메모리 검색 설정은
`openclaw.json``agents.defaults.memorySearch` 아래에 있습니다.
모든 메모리 검색 설정은 별도 언급이 없는 한 `openclaw.json`
`agents.defaults.memorySearch` 아래에 있습니다.
**액티브 메모리** 기능 토글과 하위 에이전트 구성을 찾고 있다면,
이는 `memorySearch`가 아니라 `plugins.entries.active-memory` 아래에 있습니다.
액티브 메모리는 2단계 게이트 모델을 사용합니다.
1. 플러그인이 활성화되어 있어야 하며 현재 에이전트 ID를 대상으로 해야 합니다
2. 요청이 적격한 대화형 영구 채팅 세션이어야 합니다
활성화 모델, 플러그인 소유 구성, 트랜스크립트 영속성, 안전한 롤아웃 패턴은
[액티브 메모리](/ko/concepts/active-memory)를 참조하세요.
---
## Provider 선택
## 제공자 선택
| 키 | 타입 | 기본값 | 설명 |
| ---------- | --------- | -------------- | -------------------------------------------------------------------------------------- |
| 키 | 유형 | 기본값 | 설명 |
| ---------- | --------- | -------------- | ------------------------------------------------------------------------------------------ |
| `provider` | `string` | 자동 감지 | 임베딩 어댑터 ID: `openai`, `gemini`, `voyage`, `mistral`, `bedrock`, `ollama`, `local` |
| `model` | `string` | provider 기본값 | 임베딩 모델 이름 |
| `fallback` | `string` | `"none"` | 기본 어댑터가 실패할 때 사용할 대체 어댑터 ID |
| `enabled` | `boolean` | `true` | 메모리 검색 활성화 또는 비활성화 |
| `model` | `string` | 제공자 기본값 | 임베딩 모델 이름 |
| `fallback` | `string` | `"none"` | 기본 제공자가 실패할 때 사용할 대체 어댑터 ID |
| `enabled` | `boolean` | `true` | 메모리 검색 활성화 또는 비활성화 |
### 자동 감지 순서
`provider`가 설정되지 않은 경우 OpenClaw는 사용 가능한 첫 항목을 선택합니다.
`provider`가 설정되지 않으면 OpenClaw는 사용 가능한 첫 번째 항목을 선택합니다.
1. `local` -- `memorySearch.local.modelPath`가 구성되어 있고 파일이 존재하는 경우
2. `openai` -- OpenAI 키를 확인할 수 있는 경우
@ -50,36 +61,36 @@ x-i18n:
5. `mistral` -- Mistral 키를 확인할 수 있는 경우
6. `bedrock` -- AWS SDK 자격 증명 체인이 확인되는 경우(인스턴스 역할, 액세스 키, 프로필, SSO, 웹 아이덴티티 또는 공유 구성)
`ollama`도 지원되지만 자동 감지는 하지 않습니다(명시적으로 설정하세요).
`ollama`도 지원되지만 자동 감지되지는 않습니다(명시적으로 설정해야 함).
### API 키 확인
원격 임베딩에는 API 키가 필요합니다. 대신 Bedrock은 AWS SDK 기본
자격 증명 체인(인스턴스 역할, SSO, 액세스 키)을 사용합니다.
| Provider | Env var | 구성 키 |
| -------- | ------------------------------ | --------------------------------- |
| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` |
| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` |
| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` |
| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` |
| Bedrock | AWS 자격 증명 체인 | API 키 필요 없음 |
| Ollama | `OLLAMA_API_KEY` (placeholder) | -- |
| 제공자 | 환경 변수 | 구성 키 |
| ------ | ----------------------------- | --------------------------------- |
| OpenAI | `OPENAI_API_KEY` | `models.providers.openai.apiKey` |
| Gemini | `GEMINI_API_KEY` | `models.providers.google.apiKey` |
| Voyage | `VOYAGE_API_KEY` | `models.providers.voyage.apiKey` |
| Mistral | `MISTRAL_API_KEY` | `models.providers.mistral.apiKey` |
| Bedrock | AWS 자격 증명 체인 | API 키 필요 없음 |
| Ollama | `OLLAMA_API_KEY` (자리표시자) | -- |
Codex OAuth는 채팅/completions만 지원하며 임베딩
Codex OAuth는 채팅/완성 요청만 지원하며 임베딩
요청에는 사용할 수 없습니다.
---
## 원격 엔드포인트 구성
사용자 지정 OpenAI 호환 엔드포인트를 사용하거나 provider 기본값을 재정의하려면 다음을 사용하세요.
사용자 지정 OpenAI 호환 엔드포인트를 사용하거나 제공자 기본값을 재정의하려면 다음을 사용하세요.
| 키 | 타입 | 설명 |
| ---------------- | -------- | ---------------------------------------------- |
| `remote.baseUrl` | `string` | 사용자 지정 API 기본 URL |
| `remote.apiKey` | `string` | API 키 재정의 |
| `remote.headers` | `object` | 추가 HTTP 헤더(provider 기본값과 병합됨) |
| 키 | 유형 | 설명 |
| ---------------- | -------- | -------------------------------------------- |
| `remote.baseUrl` | `string` | 사용자 지정 API 기본 URL |
| `remote.apiKey` | `string` | API 키 재정의 |
| `remote.headers` | `object` | 추가 HTTP 헤더(제공자 기본값과 병합됨) |
```json5
{
@ -102,22 +113,22 @@ Codex OAuth는 채팅/completions만 지원하며 임베딩
## Gemini 전용 구성
| 키 | 타입 | 기본값 | 설명 |
| 키 | 유형 | 기본값 | 설명 |
| ---------------------- | -------- | ---------------------- | ------------------------------------------ |
| `model` | `string` | `gemini-embedding-001` | `gemini-embedding-2-preview`도 지원 |
| `outputDimensionality` | `number` | `3072` | Embedding 2의 경우: 768, 1536 또는 3072 |
<Warning>
모델 또는 `outputDimensionality`를 변경하면 자동으로 전체 재인덱싱이 수행됩니다.
모델 또는 `outputDimensionality`를 변경하면 자동으로 전체 재인덱싱이 트리거됩니다.
</Warning>
---
## Bedrock 임베딩 구성
Bedrock은 AWS SDK 기본 자격 증명 체인을 사용하므로 API 키가 필요하지 않습니다.
Bedrock은 AWS SDK 기본 자격 증명 체인을 사용하므로 API 키가 필요습니다.
OpenClaw가 Bedrock이 활성화된 인스턴스 역할이 있는 EC2에서 실행 중이라면,
provider와 모델만 설정하면 됩니다.
제공자와 모델만 설정하면 됩니다.
```json5
{
@ -132,47 +143,47 @@ provider와 모델만 설정하면 됩니다.
}
```
| 키 | 타입 | 기본값 | 설명 |
| ---------------------- | -------- | ------------------------------ | ------------------------------- |
| `model` | `string` | `amazon.titan-embed-text-v2:0` | 모든 Bedrock 임베딩 모델 ID |
| 키 | 유형 | 기본값 | 설명 |
| ---------------------- | -------- | ------------------------------ | ------------------------------ |
| `model` | `string` | `amazon.titan-embed-text-v2:0` | 모든 Bedrock 임베딩 모델 ID |
| `outputDimensionality` | `number` | 모델 기본값 | Titan V2의 경우: 256, 512 또는 1024 |
### 지원 모델
### 지원되는 모델
다음 모델이 지원됩니다(패밀리 감지 및 차원 기본값 포함).
| 모델 ID | Provider | 기본 차원 | 구성 가능한 차원 |
| ------------------------------------------ | ---------- | ------------ | ------------------- |
| `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256, 512, 1024 |
| `amazon.titan-embed-text-v1` | Amazon | 1536 | -- |
| `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- |
| `amazon.titan-embed-image-v1` | Amazon | 1024 | -- |
| `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256, 384, 1024, 3072 |
| `cohere.embed-english-v3` | Cohere | 1024 | -- |
| `cohere.embed-multilingual-v3` | Cohere | 1024 | -- |
| `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 |
| `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- |
| `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- |
| 모델 ID | 제공자 | 기본 차원 | 구성 가능한 차원 |
| ------------------------------------------ | ---------- | --------- | -------------------- |
| `amazon.titan-embed-text-v2:0` | Amazon | 1024 | 256, 512, 1024 |
| `amazon.titan-embed-text-v1` | Amazon | 1536 | -- |
| `amazon.titan-embed-g1-text-02` | Amazon | 1536 | -- |
| `amazon.titan-embed-image-v1` | Amazon | 1024 | -- |
| `amazon.nova-2-multimodal-embeddings-v1:0` | Amazon | 1024 | 256, 384, 1024, 3072 |
| `cohere.embed-english-v3` | Cohere | 1024 | -- |
| `cohere.embed-multilingual-v3` | Cohere | 1024 | -- |
| `cohere.embed-v4:0` | Cohere | 1536 | 256-1536 |
| `twelvelabs.marengo-embed-3-0-v1:0` | TwelveLabs | 512 | -- |
| `twelvelabs.marengo-embed-2-7-v1:0` | TwelveLabs | 1024 | -- |
처리량 접미사가 붙은 변형(예: `amazon.titan-embed-text-v1:2:8k`)은
기본 모델의 구성을 그대로 상속합니다.
기본 모델의 구성을 상속합니다.
### 인증
Bedrock 인증은 표준 AWS SDK 자격 증명 확인 순서를 사용합니다.
1. 환경 변수(`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`)
1. 환경 변수 (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`)
2. SSO 토큰 캐시
3. 웹 아이덴티티 토큰 자격 증명
4. 공유 자격 증명 및 구성 파일
5. ECS 또는 EC2 메타데이터 자격 증명
리전은 `AWS_REGION`, `AWS_DEFAULT_REGION`, `amazon-bedrock`
provider의 `baseUrl`에서 확인되며, 없으면 기본값은 `us-east-1`니다.
리전은 `AWS_REGION`, `AWS_DEFAULT_REGION`,
`amazon-bedrock` 제공자의 `baseUrl`에서 확인되며, 없으면 기본값으로 `us-east-1`을 사용합니다.
### IAM 권한
IAM 역할 또는 사용자에게 다음 권한이 필요합니다.
IAM 역할 또는 사용자에게 다음 권한이 필요합니다.
```json
{
@ -192,13 +203,13 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
## 로컬 임베딩 구성
| 키 | 타입 | 기본값 | 설명 |
| --------------------- | -------- | ---------------------- | ------------------------------- |
| `local.modelPath` | `string` | 자동 다운로드 | GGUF 모델 파일 경로 |
| 키 | 유형 | 기본값 | 설명 |
| --------------------- | -------- | ---------------------- | ------------------------------ |
| `local.modelPath` | `string` | 자동 다운로드 | GGUF 모델 파일 경로 |
| `local.modelCacheDir` | `string` | node-llama-cpp 기본값 | 다운로드된 모델의 캐시 디렉터리 |
기본 모델: `embeddinggemma-300m-qat-Q8_0.gguf`(~0.6 GB, 자동 다운로드).
네이티브 빌드가 필요합니다: `pnpm approve-builds` `pnpm rebuild node-llama-cpp`.
기본 모델: `embeddinggemma-300m-qat-Q8_0.gguf` (~0.6 GB, 자동 다운로드).
네이티브 빌드가 필요합니다: `pnpm approve-builds` 다음 `pnpm rebuild node-llama-cpp`.
---
@ -206,28 +217,28 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
모두 `memorySearch.query.hybrid` 아래에 있습니다.
| 키 | 타입 | 기본값 | 설명 |
| --------------------- | --------- | ------ | -------------------------------- |
| 키 | 유형 | 기본값 | 설명 |
| --------------------- | --------- | ------ | ---------------------------------- |
| `enabled` | `boolean` | `true` | 하이브리드 BM25 + 벡터 검색 활성화 |
| `vectorWeight` | `number` | `0.7` | 벡터 점수 가중치(0-1) |
| `textWeight` | `number` | `0.3` | BM25 점수 가중치(0-1) |
| `candidateMultiplier` | `number` | `4` | 후보 풀 크기 배수 |
| `vectorWeight` | `number` | `0.7` | 벡터 점수 가중치(0-1) |
| `textWeight` | `number` | `0.3` | BM25 점수 가중치(0-1) |
| `candidateMultiplier` | `number` | `4` | 후보 풀 크기 배수 |
### MMR(다양성)
| 키 | 타입 | 기본값 | 설명 |
| ------------- | --------- | ------ | ----------------------------------- |
| `mmr.enabled` | `boolean` | `false` | MMR 재순위화 활성화 |
| `mmr.lambda` | `number` | `0.7` | 0 = 최대 다양성, 1 = 최대 관련성 |
| 키 | 유형 | 기본값 | 설명 |
| ------------- | --------- | ------ | ------------------------------------ |
| `mmr.enabled` | `boolean` | `false`| MMR 재순위화 활성화 |
| `mmr.lambda` | `number` | `0.7` | 0 = 최대 다양성, 1 = 최대 관련성 |
### 시간 감쇠(최신성)
| 키 | 타입 | 기본값 | 설명 |
| ---------------------------- | --------- | ------ | ------------------------------ |
| `temporalDecay.enabled` | `boolean` | `false` | 최신성 부스트 활성화 |
| `temporalDecay.halfLifeDays` | `number` | `30` | N일마다 점수가 절반으로 감소 |
| 키 | 유형 | 기본값 | 설명 |
| ---------------------------- | --------- | ------ | --------------------------- |
| `temporalDecay.enabled` | `boolean` | `false`| 최신성 부스트 활성화 |
| `temporalDecay.halfLifeDays` | `number` | `30` | N일마다 점수가 절반으로 감소 |
상시 유지 파일(`MEMORY.md`, `memory/` 날짜가 없는 파일)은 감쇠되지 않습니다.
에버그린 파일(`MEMORY.md`, `memory/` 날짜가 없는 파일)은 감쇠되지 않습니다.
### 전체 예시
@ -254,9 +265,9 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
## 추가 메모리 경로
| 키 | 타입 | 설명 |
| ------------ | ---------- | --------------------------------- |
| `extraPaths` | `string[]` | 인덱싱할 추가 디렉터리 또는 파일 |
| 키 | 유형 | 설명 |
| ------------ | ---------- | ------------------------------------- |
| `extraPaths` | `string[]` | 인덱싱할 추가 디렉터리 또는 파일 |
```json5
{
@ -270,154 +281,152 @@ arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0
}
```
경로는 절대 경로 또는 workspace 기준 상대 경로일 수 있습니다. 디렉터리는
경로는 절대 경로이거나 워크스페이스 기준 상대 경로일 수 있습니다. 디렉터리는
`.md` 파일을 재귀적으로 스캔합니다. 심볼릭 링크 처리 방식은 활성 백엔드에 따라 다릅니다.
builtin 엔진은 심볼릭 링크를 무시하고, QMD는 기반 QMD
스캐너 동작을 따릅니다.
내장 엔진은 심볼릭 링크를 무시하고, QMD는 기반 QMD 스캐너의 동작을 따릅니다.
에이전트 범위의 교차 에이전트 transcript 검색에는
`memory.qmd.paths` 대신 `agents.list[].memorySearch.qmd.extraCollections`
사용하세요. 이 추가 컬렉션은 동일한 `{ path, name, pattern? }` 형태를 따르지만,
에이전트별로 병합되며 경로가 현재 workspace 밖을 가리킬 때도
명시적인 공유 이름을 유지할 수 있습니다.
같은 확인된 경로가 `memory.qmd.paths`
`memorySearch.qmd.extraCollections`에 모두 나타나면 QMD는 첫 번째 항목을 유지하고
중복은 건너뜁니다.
에이전트 범위의 교차 에이전트 트랜스크립트 검색에는
`memory.qmd.paths` 대신 `agents.list[].memorySearch.qmd.extraCollections`를 사용하세요.
이 추가 컬렉션은 동일한 `{ path, name, pattern? }` 형태를 따르지만,
에이전트별로 병합되며 경로가 현재 워크스페이스 밖을 가리킬 때 명시적인 공유 이름을 유지할 수 있습니다.
동일한 확인된 경로가 `memory.qmd.paths`
`memorySearch.qmd.extraCollections`에 모두 나타나면, QMD는 첫 번째 항목을 유지하고
중복 항목은 건너뜁니다.
---
## 멀티모달 메모리(Gemini)
Gemini Embedding 2를 사용해 Markdown과 함께 이미지와 오디오 인덱싱합니다.
Gemini Embedding 2를 사용해 Markdown과 함께 이미지와 오디오 인덱싱합니다.
| 키 | 타입 | 기본값 | 설명 |
| ------------------------- | ---------- | ---------- | ---------------------------------------- |
| `multimodal.enabled` | `boolean` | `false` | 멀티모달 인덱싱 활성화 |
| `multimodal.modalities` | `string[]` | -- | `["image"]`, `["audio"]` 또는 `["all"]` |
| `multimodal.maxFileBytes` | `number` | `10000000` | 인덱싱할 최대 파일 크기 |
| 키 | 유형 | 기본값 | 설명 |
| ------------------------- | ---------- | ---------- | -------------------------------------- |
| `multimodal.enabled` | `boolean` | `false` | 멀티모달 인덱싱 활성화 |
| `multimodal.modalities` | `string[]` | -- | `["image"]`, `["audio"]` 또는 `["all"]` |
| `multimodal.maxFileBytes` | `number` | `10000000` | 인덱싱할 최대 파일 크기 |
`extraPaths`의 파일에만 적용됩니다. 기본 메모리 루트는 여전히 Markdown 전용입니다.
`gemini-embedding-2-preview`가 필요합니다. `fallback`반드시 `"none"`이어야 합니다.
`extraPaths`의 파일에만 적용됩니다. 기본 메모리 루트는 계속 Markdown 전용입니다.
`gemini-embedding-2-preview`가 필요합니다. `fallback``"none"`이어야 합니다.
지원 형식: `.jpg`, `.jpeg`, `.png`, `.webp`, `.gif`, `.heic`, `.heif`
(이미지); `.mp3`, `.wav`, `.ogg`, `.opus`, `.m4a`, `.aac`, `.flac`(오디오).
(이미지); `.mp3`, `.wav`, `.ogg`, `.opus`, `.m4a`, `.aac`, `.flac` (오디오).
---
## 임베딩 캐시
| 키 | 타입 | 기본값 | 설명 |
| ------------------ | --------- | ------ | ----------------------------------- |
| `cache.enabled` | `boolean` | `false` | SQLite에 청크 임베딩 캐시 |
| `cache.maxEntries` | `number` | `50000` | 최대 캐시 임베딩 수 |
| 키 | 유형 | 기본값 | 설명 |
| ------------------ | --------- | ------ | ------------------------------ |
| `cache.enabled` | `boolean` | `false`| SQLite에 청크 임베딩 캐시 |
| `cache.maxEntries` | `number` | `50000`| 캐시할 최대 임베딩 수 |
재인덱싱 또는 transcript 업데이트 중 변경되지 않은 텍스트를 다시 임베딩하는 일을 방지합니다.
재인덱싱 또는 트랜스크립트 업데이트 중 변경되지 않은 텍스트를 다시 임베딩하는 일을 방지합니다.
---
## 배치 인덱싱
| 키 | 타입 | 기본값 | 설명 |
| ----------------------------- | --------- | ------ | ------------------------- |
| `remote.batch.enabled` | `boolean` | `false` | 배치 임베딩 API 활성화 |
| `remote.batch.concurrency` | `number` | `2` | 병렬 배치 작업 수 |
| `remote.batch.wait` | `boolean` | `true` | 배치 완료까지 대기 |
| `remote.batch.pollIntervalMs` | `number` | -- | 폴링 간격 |
| `remote.batch.timeoutMinutes` | `number` | -- | 배치 타임아웃 |
| 키 | 유형 | 기본값 | 설명 |
| ----------------------------- | --------- | ------ | ---------------------------- |
| `remote.batch.enabled` | `boolean` | `false`| 배치 임베딩 API 활성화 |
| `remote.batch.concurrency` | `number` | `2` | 병렬 배치 작업 수 |
| `remote.batch.wait` | `boolean` | `true` | 배치 완료까지 대기 |
| `remote.batch.pollIntervalMs` | `number` | -- | 폴링 간격 |
| `remote.batch.timeoutMinutes` | `number` | -- | 배치 타임아웃 |
`openai`, `gemini`, `voyage`에서 사용할 수 있습니다. OpenAI 배치는 일반적으로
대규모 백필에서 가장 빠르고 저렴합니다.
대규모 백필에서 가장 빠르고 비용도 가장 저렴합니다.
---
## 세션 메모리 검색(실험적)
세션 transcript를 인덱싱하고 `memory_search`를 통해 노출합니다.
세션 트랜스크립트를 인덱싱하고 `memory_search`를 통해 노출합니다.
| 키 | 타입 | 기본값 | 설명 |
| 키 | 유형 | 기본값 | 설명 |
| ----------------------------- | ---------- | ------------ | ----------------------------------------- |
| `experimental.sessionMemory` | `boolean` | `false` | 세션 인덱싱 활성화 |
| `sources` | `string[]` | `["memory"]` | transcript를 포함하려면 `"sessions"` 추가 |
| `sources` | `string[]` | `["memory"]` | 트랜스크립트를 포함하려면 `"sessions"` 추가 |
| `sync.sessions.deltaBytes` | `number` | `100000` | 재인덱싱 바이트 임계값 |
| `sync.sessions.deltaMessages` | `number` | `50` | 재인덱싱 메시지 임계값 |
세션 인덱싱은 opt-in이며 비동기적으로 실행됩니다. 결과는 약간
오래되었을 수 있습니다. 세션 로그는 디스크에 있으므로 파일 시스템 접근을
신뢰 경계로 취급하세요.
세션 인덱싱은 옵트인 방식이며 비동기적으로 실행됩니다. 결과는 약간
오래되었을 수 있습니다. 세션 로그는 디스크에 저장되므로 파일 시스템 접근을
신뢰 경계로 취급해야 합니다.
---
## SQLite 벡터 가속(sqlite-vec)
| 키 | 타입 | 기본값 | 설명 |
| ---------------------------- | --------- | ------- | ---------------------------------- |
| `store.vector.enabled` | `boolean` | `true` | 벡터 쿼리에 sqlite-vec 사용 |
| `store.vector.extensionPath` | `string` | bundled | sqlite-vec 경로 재정의 |
| 키 | 유형 | 기본값 | 설명 |
| ---------------------------- | --------- | ------ | --------------------------------- |
| `store.vector.enabled` | `boolean` | `true` | 벡터 쿼리에 sqlite-vec 사용 |
| `store.vector.extensionPath` | `string` | 번들됨 | sqlite-vec 경로 재정의 |
sqlite-vec을 사용할 수 없으면 OpenClaw는 자동으로 프로세스 내 cosine
similarity로 대체합니다.
sqlite-vec를 사용할 수 없으면 OpenClaw는 자동으로 프로세스 내 코사인
유사도로 대체합니다.
---
## 인덱스 저장소
| 키 | 타입 | 기본값 | 설명 |
| --------------------- | -------- | ------------------------------------ | ----------------------------------------- |
| `store.path` | `string` | `~/.openclaw/memory/{agentId}.sqlite` | 인덱스 위치(`{agentId}` 토큰 지원) |
| `store.fts.tokenizer` | `string` | `unicode61` | FTS5 tokenizer(`unicode61` 또는 `trigram`) |
| 키 | 유형 | 기본값 | 설명 |
| --------------------- | -------- | ------------------------------------- | ---------------------------------------- |
| `store.path` | `string` | `~/.openclaw/memory/{agentId}.sqlite` | 인덱스 위치(`{agentId}` 토큰 지원) |
| `store.fts.tokenizer` | `string` | `unicode61` | FTS5 토크나이저(`unicode61` 또는 `trigram`) |
---
## QMD 백엔드 구성
활성화하려면 `memory.backend = "qmd"`를 설정하세요. 모든 QMD 설정은
활성화하려면 `memory.backend = "qmd"`로 설정합니다. 모든 QMD 설정은
`memory.qmd` 아래에 있습니다.
| 키 | 타입 | 기본값 | 설명 |
| ------------------------ | --------- | -------- | ------------------------------------------------ |
| `command` | `string` | `qmd` | QMD 실행 파일 경로 |
| `searchMode` | `string` | `search` | 검색 명령: `search`, `vsearch`, `query` |
| `includeDefaultMemory` | `boolean` | `true` | `MEMORY.md` + `memory/**/*.md` 자동 인덱싱 |
| `paths[]` | `array` | -- | 추가 경로: `{ name, path, pattern? }` |
| `sessions.enabled` | `boolean` | `false` | 세션 transcript 인덱싱 |
| `sessions.retentionDays` | `number` | -- | transcript 보관 기간 |
| `sessions.exportDir` | `string` | -- | 내보내기 디렉터리 |
| 키 | 유형 | 기본값 | 설명 |
| ------------------------ | --------- | -------- | -------------------------------------------- |
| `command` | `string` | `qmd` | QMD 실행 파일 경로 |
| `searchMode` | `string` | `search` | 검색 명령: `search`, `vsearch`, `query` |
| `includeDefaultMemory` | `boolean` | `true` | `MEMORY.md` + `memory/**/*.md` 자동 인덱싱 |
| `paths[]` | `array` | -- | 추가 경로: `{ name, path, pattern? }` |
| `sessions.enabled` | `boolean` | `false` | 세션 트랜스크립트 인덱싱 |
| `sessions.retentionDays` | `number` | -- | 트랜스크립트 보존 기간 |
| `sessions.exportDir` | `string` | -- | 내보내기 디렉터리 |
OpenClaw는 현재 QMD 컬렉션 및 MCP 쿼리 형태를 우선 사용하지만,
필요할 경우 레거시 `--mask` 컬렉션 플래그와
이전 MCP 도구 이름으로 대체해 구버전 QMD도 계속 작동하도록 유지합니다.
OpenClaw는 현재 QMD 컬렉션 및 MCP 쿼리 형태를 우선 사용하지만, 필요할 경우
레거시 `--mask` 컬렉션 플래그와 이전 MCP 도구 이름으로 폴백하여
오래된 QMD 릴리스도 계속 동작하도록 유지합니다.
QMD 모델 재정의는 OpenClaw 구성 쪽이 아니라 QMD 쪽에 유지됩니다.
QMD 모델을 전역적으로 재정의해야 한다면 gateway
런타임 환경에서 `QMD_EMBED_MODEL`, `QMD_RERANK_MODEL`,
`QMD_GENERATE_MODEL` 같은 환경 변수를 설정하세요.
QMD 모델 재정의는 OpenClaw 구성이 아니라 QMD 측에 유지됩니다. QMD의 모델을
전역으로 재정의해야 한다면 게이트웨이 런타임 환경에서
`QMD_EMBED_MODEL`, `QMD_RERANK_MODEL`, `QMD_GENERATE_MODEL` 같은
환경 변수를 설정하세요.
### 업데이트 일정
| 키 | 타입 | 기본값 | 설명 |
| 키 | 유형 | 기본값 | 설명 |
| ------------------------- | --------- | ------- | ------------------------------------- |
| `update.interval` | `string` | `5m` | 새로고침 간격 |
| `update.interval` | `string` | `5m` | 새로 고침 간격 |
| `update.debounceMs` | `number` | `15000` | 파일 변경 디바운스 |
| `update.onBoot` | `boolean` | `true` | 시작 시 새로고침 |
| `update.waitForBootSync` | `boolean` | `false` | 새로고침 완료까지 시작 차단 |
| `update.embedInterval` | `string` | -- | 별도 임베딩 주기 |
| `update.onBoot` | `boolean` | `true` | 시작 시 새로 고침 |
| `update.waitForBootSync` | `boolean` | `false` | 새로 고침 완료될 때까지 시작 차단 |
| `update.embedInterval` | `string` | -- | 별도 임베딩 주기 |
| `update.commandTimeoutMs` | `number` | -- | QMD 명령 타임아웃 |
| `update.updateTimeoutMs` | `number` | -- | QMD 업데이트 작업 타임아웃 |
| `update.embedTimeoutMs` | `number` | -- | QMD 임베딩 작업 타임아웃 |
### 제한
| 키 | 타입 | 기본값 | 설명 |
| 키 | 유형 | 기본값 | 설명 |
| ------------------------- | -------- | ------ | ---------------------------- |
| `limits.maxResults` | `number` | `6` | 최대 검색 결과 수 |
| `limits.maxSnippetChars` | `number` | -- | snippet 길이 제한 |
| `limits.maxSnippetChars` | `number` | -- | 스니펫 길이 제한 |
| `limits.maxInjectedChars` | `number` | -- | 총 주입 문자 수 제한 |
| `limits.timeoutMs` | `number` | `4000` | 검색 타임아웃 |
### 범위
어떤 세션이 QMD 검색 결과를 받을 수 있는지 제어합니다. 스키마는
[`session.sendPolicy`](/ko/gateway/configuration-reference#session)와 같습니다.
QMD 검색 결과를 받을 수 있는 세션을 제어합니다.
[`session.sendPolicy`](/ko/gateway/configuration-reference#session)와 동일한 스키마를 사용합니다.
```json5
{
@ -441,7 +450,7 @@ QMD 모델을 전역적으로 재정의해야 한다면 gateway
| 값 | 동작 |
| ---------------- | -------------------------------------------------- |
| `auto` (기본값) | snippet`Source: <path#line>` 바닥글 포함 |
| `auto` (기본값) | 스니펫`Source: <path#line>` 바닥글 포함 |
| `on` | 항상 바닥글 포함 |
| `off` | 바닥글 생략(경로는 여전히 내부적으로 에이전트에 전달됨) |
@ -473,17 +482,17 @@ QMD 모델을 전역적으로 재정의해야 한다면 gateway
Dreaming은 `agents.defaults.memorySearch` 아래가 아니라
`plugins.entries.memory-core.config.dreaming` 아래에서 구성합니다.
Dreaming은 하나의 예약된 스윕으로 실행되며, 내부 light/deep/REM 단계는
구현 세부 사항으로 사용니다.
Dreaming은 예약된 하나의 스윕으로 실행되며 내부적인 light/deep/REM 단계를
구현 세부 사항으로 사용니다.
개념적 동작과 슬래시 명령은 [Dreaming](/concepts/dreaming)을 참고하세요.
개념적 동작과 슬래시 명령은 [Dreaming](/ko/concepts/dreaming)을 참조하세요.
### 사용자 설정
| 키 | 타입 | 기본값 | 설명 |
| ----------- | --------- | ----------- | ------------------------------------------- |
| `enabled` | `boolean` | `false` | Dreaming 전체 활성화 또는 비활성화 |
| `frequency` | `string` | `0 3 * * *` | 전체 dreaming 스윕에 대한 선택적 cron 주기 |
| 키 | 유형 | 기본값 | 설명 |
| ----------- | --------- | ----------- | ----------------------------------------- |
| `enabled` | `boolean` | `false` | Dreaming 전체 활성화 또는 비활성화 |
| `frequency` | `string` | `0 3 * * *` | 전체 Dreaming 스윕의 선택적 cron 주기 |
### 예시
@ -506,6 +515,6 @@ Dreaming은 하나의 예약된 스윕으로 실행되며, 내부 light/deep/REM
참고:
- Dreaming은 기계 상태를 `memory/.dreams/`에 기록합니다.
- Dreaming은 사람이 읽을 수 있는 서사 출력을 `DREAMS.md`(또는 기존 `dreams.md`)에 기록합니다.
- light/deep/REM 단계 정책과 임계값은 내부 동작이며 사용자 대상 config가 아닙니다.
- Dreaming은 머신 상태를 `memory/.dreams/`에 기록합니다.
- Dreaming은 사람이 읽을 수 있는 내러티브 출력을 `DREAMS.md`(또는 기존 `dreams.md`)에 기록합니다.
- light/deep/REM 단계 정책과 임계값은 사용자 대상 구성이 아니라 내부 동작입니다.

View File

@ -1,41 +1,40 @@
---
read_when:
- 에이전트 제어하는 브라우저 자동화 추가하는 경우
- openclaw가 내 Chrome에 왜 간섭하는지 디버깅하는 경우
- macOS 앱에서 브라우저 설정 + 수명 주기를 구현하는 경우
- 에이전트 제어 브라우저 자동화 추가
- openclaw가 사용자의 Chrome에 간섭하는 이유 디버깅하기
- macOS 앱에서 브라우저 설정 및 수명 주기 구현하기
summary: 통합 브라우저 제어 서비스 + 작업 명령
title: 브라우저(OpenClaw 관리)
title: 브라우저(OpenClaw 관리)
x-i18n:
generated_at: "2026-04-05T12:58:18Z"
generated_at: "2026-04-10T05:59:51Z"
model: gpt-5.4
provider: openai
source_hash: a41162efd397ea918469e16aa67e554bcbb517b3112df1d3e7927539b6a0926a
source_hash: cd3424f62178bbf25923b8bc8e4d9f70e330f35428d01fe153574e5fa45d7604
source_path: tools/browser.md
workflow: 15
---
# 브라우저(openclaw 관리)
# 브라우저(openclaw 관리)
OpenClaw는 에이전트가 제어하는 **전용 Chrome/Brave/Edge/Chromium 프로필**을 실행할 수 있습니다.
이 프로필은 개인 브라우저와 분리되어 있으며 Gateway 내부의 작은 로컬
제어 서비스(루프백 전용)를 통해 관리됩니다.
초보자 관점에서 보면:
초보자용 설명:
- 이를 **에이전트 전용 별도 브라우저**라고 생각하면 됩니다.
- `openclaw` 프로필은 **개인 브라우저 프로필을 건드리지 않습니다**.
- 에이전트는 안전한 범위 안에서 **탭 열기, 페이지 읽기, 클릭, 입력**을 할 수 있습니다.
- 내장 `user` 프로필은 Chrome MCP를 통해 실제 로그인된 Chrome 세션에 연결합니다.
- 이것은 **별도의 에이전트 전용 브라우저**라고 생각하면 됩니다.
- `openclaw` 프로필은 사용자의 개인 브라우저 프로필에 **영향을 주지 않습니다**.
- 에이전트는 안전하게 분리된 환경에서 **탭을 열고, 페이지를 읽고, 클릭하고, 입력할 수 있습니다**.
- 내장 `user` 프로필은 Chrome MCP를 통해 사용자가 실제로 로그인한 Chrome 세션에 연결됩니다.
## 제공 기능
- **openclaw**라는 이름의 별도 브라우저 프로필(기본적으로 주황색 강조).
- **openclaw**라는 이름의 별도 브라우저 프로필(기본값은 주황색 강조).
- 결정적인 탭 제어(목록/열기/포커스/닫기).
- 에이전트 작업(클릭/입력/드래그/선택), 스냅샷, 스크린샷, PDF.
- 선택적 멀티 프로필 지원(`openclaw`, `work`, `remote`, ...).
- 선택적 다중 프로필 지원(`openclaw`, `work`, `remote`, ...).
이 브라우저는 일상적으로 사용하는 메인 브라우저가 **아닙니다**. 에이전트
자동화와 검증을 위한 안전하고 분리된 표면입니다.
이 브라우저는 **일상적으로 사용하는 기본 브라우저가 아닙니다**. 에이전트 자동화와 검증을 위한 안전하고 격리된 표면입니다.
## 빠른 시작
@ -46,16 +45,14 @@ openclaw browser --browser-profile openclaw open https://example.com
openclaw browser --browser-profile openclaw snapshot
```
“Browser disabled”가 나오면 config에서 활성화하고(아래 참조) Gateway를
재시작하세요.
“Browser disabled”가 표시되면 config에서 이를 활성화하고(아래 참조) Gateway를 다시 시작하세요.
`openclaw browser` 명령 자체가 없거나, 에이전트가 브라우저 도구를 사용할 수 없다고 하면
[브라우저 명령 또는 도구 누락](/tools/browser#missing-browser-command-or-tool)으로 이동하세요.
`openclaw browser` 자체가 완전히 없거나, 에이전트가 브라우저 도구를 사용할 수 없다고 말하면 [브라우저 명령 또는 도구 누락](/ko/tools/browser#missing-browser-command-or-tool)으로 이동하세요.
## plugin 제어
## 플러그인 제어
기본 `browser` 도구는 이제 기본적으로 활성화된 상태로 제공되는 번들 plugin입니다.
즉, OpenClaw의 나머지 plugin 시스템을 제거하지 않고도 이를 비활성화하거나 교체할 수 있습니다:
기본 `browser` 도구는 이제 기본적으로 활성화된 상태로 함께 제공되는 번들 플러그인입니다.
즉, 나머지 OpenClaw 플러그인 시스템을 제거하지 않고도 이 도구를 비활성화하거나 교체할 수 있습니다:
```json5
{
@ -69,31 +66,23 @@ openclaw browser --browser-profile openclaw snapshot
}
```
동일한 `browser` 도구 이름을 제공하는 다른 plugin을 설치하기 전에 이 번들 plugin을 비활성화하세요. 기본 브라우저 경험에는 다음 두 가지가 모두 필요합니다:
동일한 `browser` 도구 이름을 제공하는 다른 플러그인을 설치하기 전에 번들 플러그인을 비활성화하세요. 기본 브라우저 경험에는 다음 두 가지가 모두 필요합니다:
- `plugins.entries.browser.enabled`가 비활성화되어 있지 않을 것
- `browser.enabled=true`
plugin만 끄면 번들 브라우저 CLI(`openclaw browser`),
gateway 메서드(`browser.request`), 에이전트 도구, 기본 브라우저 제어
서비스가 모두 함께 사라집니다. `browser.*` config는 그대로 유지되므로
대체 plugin이 이를 재사용할 수 있습니다.
플러그인만 끄면 번들 브라우저 CLI(`openclaw browser`), gateway 메서드(`browser.request`), 에이전트 도구, 기본 브라우저 제어 서비스가 모두 함께 사라집니다. `browser.*` config는 그대로 유지되므로 교체 플러그인이 이를 재사용할 수 있습니다.
번들 브라우저 plugin은 이제 브라우저 런타임 구현도 소유합니다.
코어에는 공유 Plugin SDK 헬퍼와 이전 내부 import 경로용 호환 re-export만 남아 있습니다.
실제로는 브라우저 plugin 패키지를 제거하거나 교체하면
코어 소유의 두 번째 런타임이 남는 대신 브라우저 기능 세트 자체가 제거됩니다.
번들 브라우저 플러그인은 이제 브라우저 런타임 구현도 담당합니다.
코어에는 공유 Plugin SDK 도우미와 이전 내부 import 경로용 호환성 re-export만 남아 있습니다. 실제로는 브라우저 플러그인 패키지를 제거하거나 교체하면 코어 소유 런타임이 따로 남는 대신 브라우저 기능 세트가 제거됩니다.
브라우저 config 변경은 번들 plugin이 새 설정으로 브라우저 서비스를
다시 등록할 수 있도록 여전히 Gateway 재시작이 필요합니다.
브라우저 config 변경 사항을 새 설정으로 번들 플러그인이 브라우저 서비스를 다시 등록할 수 있도록 하려면 여전히 Gateway 재시작이 필요합니다.
## 브라우저 명령 또는 도구 누락
업그레이드 후 `openclaw browser`가 갑자기 알 수 없는 명령이 되거나,
에이전트가 브라우저 도구가 없다고 보고한다면 가장 흔한 원인은
제한적인 `plugins.allow` 목록에 `browser`가 포함되어 있지 않은 경우입니다.
업그레이드 후 `openclaw browser`가 갑자기 알 수 없는 명령이 되거나, 에이전트가 브라우저 도구가 없다고 보고하는 경우 가장 흔한 원인은 `browser`가 포함되지 않은 제한적인 `plugins.allow` 목록입니다.
잘못된 config 예시:
문제가 있는 config 예시:
```json5
{
@ -103,7 +92,7 @@ gateway 메서드(`browser.request`), 에이전트 도구, 기본 브라우저
}
```
plugin allowlist에 `browser`를 추가해 해결하세요:
플러그인 허용 목록에 `browser`를 추가해서 해결할 수 있습니다:
```json5
{
@ -115,28 +104,27 @@ plugin allowlist에 `browser`를 추가해 해결하세요:
중요한 참고 사항:
- `plugins.allow`가 설정된 경우 `browser.enabled=true`만으로는 충분하지 않습니다.
- `plugins.allow`가 설정된 경우 `plugins.entries.browser.enabled=true`만으로도 충분하지 않습니다.
- `tools.alsoAllow: ["browser"]`는 번들 브라우저 plugin을 로드하지 않습니다. plugin이 이미 로드된 후에만 도구 정책을 조정합니다.
- 제한적인 plugin allowlist가 필요 없다면 `plugins.allow`를 제거하는 것만으로도 기본 번들 브라우저 동작이 복원됩니다.
- `plugins.allow`가 설정되어 있으면 `browser.enabled=true`만으로는 충분하지 않습니다.
- `plugins.allow`가 설정되어 있으면 `plugins.entries.browser.enabled=true`만으로도 충분하지 않습니다.
- `tools.alsoAllow: ["browser"]`는 번들 브라우저 플러그인을 로드하지 **않습니다**. 이는 플러그인이 이미 로드된 뒤 도구 정책만 조정합니다.
- 제한적인 플러그인 허용 목록이 필요하지 않다면 `plugins.allow`를 제거해도 기본 번들 브라우저 동작이 복원됩니다.
일반적인 증상:
- `openclaw browser`가 알 수 없는 명령입니다.
- `browser.request`가 없습니다.
- 에이전트가 브라우저 도구를 사용할 수 없거나 다고 보고합니다.
- 에이전트가 브라우저 도구를 사용할 수 없거나 누락되었다고 보고합니다.
## 프로필: `openclaw` vs `user`
- `openclaw`: 관리형, 격리된 브라우저(확장 프로그램 필요 없음).
- `user`: 실제 **로그인된 Chrome**
세션에 연결되는 내장 Chrome MCP attach 프로필.
- `user`: 사용자의 **실제 로그인된 Chrome** 세션에 연결하는 내장 Chrome MCP 연결 프로필.
에이전트 브라우저 도구 호출:
에이전트 브라우저 도구 호출의 경우:
- 기본값: 격리된 `openclaw` 브라우저 사용합니다.
- 기존 로그인 세션이 중요하고 사용자가 컴퓨터 앞에서 attach 프롬프트를 클릭/승인할 수 있다면 `profile="user"`를 선호하세요.
- 특정 브라우저 모드가 필요할 때는 `profile` 명시적 재정의입니다.
- 기본값: 격리된 `openclaw` 브라우저 사용.
- 기존 로그인 세션이 중요하고 사용자가 컴퓨터 앞에서 연결 프롬프트를 클릭/승인할 수 있을 때는 `profile="user"`를 우선 사용.
- `profile`은 특정 브라우저 모드를 원할 때 사용하는 명시적 재정의입니다.
기본적으로 관리형 모드를 사용하려면 `browser.defaultProfile: "openclaw"`를 설정하세요.
@ -183,32 +171,33 @@ plugin allowlist에 `browser`를 추가해 해결하세요:
}
```
참고:
참고 사항:
- 브라우저 제어 서비스는 `gateway.port`에서 파생된 포트의 루프백에 바인딩됩니다
(기본값: `18791`, 즉 gateway + 2).
- Gateway 포트(`gateway.port` 또는 `OPENCLAW_GATEWAY_PORT`)를 재정의하면
파생 브라우저 포트도 같은 “패밀리” 안에 있도록 함께 이동합니다.
- `cdpUrl`이 설정되지 않으면 기본적으로 관리형 로컬 CDP 포트를 사용합니다.
파생된 브라우저 포트도 같은 “패밀리”를 유지하도록 함께 이동합니다.
- `cdpUrl`이 설정되지 않은 경우 관리형 로컬 CDP 포트가 기본값으로 사용됩니다.
- `remoteCdpTimeoutMs`는 원격(비루프백) CDP 도달 가능성 검사에 적용됩니다.
- `remoteCdpHandshakeTimeoutMs`는 원격 CDP WebSocket 도달 가능성 검사에 적용됩니다.
- 브라우저 탐색/탭 열기는 탐색 전에 SSRF 보호가 적용되며, 탐색 후 최종 `http(s)` URL에 대해서도 최선의 노력으로 다시 검사합니다.
- 엄격한 SSRF 모드에서는 원격 CDP 엔드포인트 색/프로브(`cdpUrl`, `/json/version` 조회 포함)도 검사됩니다.
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork`의 기본값은 `true`(신뢰 네트워크 모델)입니다. 엄격한 공용 전용 브라우징이 필요하면 `false`로 설정하세요.
- 브라우저 탐색/탭 열기는 탐색 전에 SSRF 보호가 적용되며, 탐색 후 최종 `http(s)` URL에 대해 가능하면 다시 확인합니다.
- 엄격한 SSRF 모드에서는 원격 CDP 엔드포인트 색/프로브(`cdpUrl`, `/json/version` 조회 포함)도 검사됩니다.
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork`의 기본값은 `true`입니다(신뢰 네트워크 모델). 엄격한 공개 네트워크 전용 탐색을 원하면 `false`로 설정하세요.
- `browser.ssrfPolicy.allowPrivateNetwork`는 호환성을 위한 레거시 별칭으로 계속 지원됩니다.
- `attachOnly: true`는 “로컬 브라우저를 절대 실행하지 않고, 이미 실행 중일 때만 연결한다”는 의미입니다.
- `color` 및 프로필별 `color`는 브라우저 UI에 색을 입혀 어느 프로필이 활성 상태인지 볼 수 있게 합니다.
- 기본 프로필은 `openclaw`입니다(OpenClaw 관리형 독립 브라우저). 로그인된 사용자 브라우저를 사용하려면 `defaultProfile: "user"`를 사용하세요.
- 자동 감지 순서: 시스템 기본 브라우저가 Chromium 기반이면 그것을 사용하고, 아니면 Chrome → Brave → Edge → Chromium → Chrome Canary 순입니다.
- 로컬 `openclaw` 프로필은 `cdpPort`/`cdpUrl`이 자동 할당되므로, 원격 CDP가 아닌 경우에는 이를 설정하지 마세요.
- `driver: "existing-session"`은 raw CDP 대신 Chrome DevTools MCP를 사용합니다. 이 드라이버에는 `cdpUrl`을 설정하지 마세요.
- 기존 세션 프로필이 Brave 또는 Edge 같은 비기본 Chromium 사용자 프로필에 연결되어야 한다면 `browser.profiles.<name>.userDataDir`을 설정하세요.
- `attachOnly: true`는 “로컬 브라우저를 절대 실행하지 않고, 이미 실행 중일 때만 연결한다”는 뜻입니다.
- `color` 및 프로필별 `color`는 브라우저 UI에 색을 입혀 어떤 프로필이 활성화되어 있는지 확인할 수 있게 합니다.
- 기본 프로필은 `openclaw`입니다(OpenClaw 관리 독립형 브라우저). 로그인된 사용자 브라우저를 사용하려면 `defaultProfile: "user"`를 사용하세요.
- 자동 감지 순서: 시스템 기본 브라우저가 Chromium 기반이면 그것을 사용하고, 그렇지 않으면 Chrome → Brave → Edge → Chromium → Chrome Canary 순입니다.
- 로컬 `openclaw` 프로필은 `cdpPort`/`cdpUrl`을 자동 할당합니다 — 원격 CDP에만 이를 설정하세요.
- `driver: "existing-session"`은 raw CDP 대신 Chrome DevTools MCP를 사용합니다. 이
드라이버에는 `cdpUrl`을 설정하지 마세요.
- 기존 세션 프로필이 Brave 또는 Edge 같은 기본값이 아닌 Chromium 사용자 프로필에
연결해야 한다면 `browser.profiles.<name>.userDataDir`를 설정하세요.
## Brave(또는 다른 Chromium 기반 브라우저) 사용
**시스템 기본** 브라우저가 Chromium 기반(Chrome/Brave/Edge 등)이면
OpenClaw가 자동으로 이를 사용합니다. 자동 감지를 재정의하려면
`browser.executablePath`를 설정하세요:
사용자의 **시스템 기본** 브라우저가 Chromium 기반(Chrome/Brave/Edge 등)이면
OpenClaw가 자동으로 이를 사용합니다. 자동 감지를 재정의하려면 `browser.executablePath`를 설정하세요:
CLI 예시:
@ -242,47 +231,45 @@ openclaw config set browser.executablePath "/usr/bin/google-chrome"
## 로컬 제어 vs 원격 제어
- **로컬 제어(기본값):** Gateway가 루프백 제어 서비스를 시작하고 로컬 브라우저를 실행할 수 있습니다.
- **원격 제어(node host):** 브라우저가 있는 머신에서 node host를 실행하면 Gateway가 브라우저 작업을 그 노드로 프록시합니다.
- **원격 제어(node host):** 브라우저가 있는 머신에서 node host를 실행하면 Gateway가 브라우저 작업을 해당 호스트로 프록시합니다.
- **원격 CDP:** 원격 Chromium 기반 브라우저에 연결하려면 `browser.profiles.<name>.cdpUrl`(또는 `browser.cdpUrl`)을 설정하세요. 이 경우 OpenClaw는 로컬 브라우저를 실행하지 않습니다.
중지 동작은 프로필 모드에 따라 다릅니다:
- 로컬 관리형 프로필: `openclaw browser stop`
OpenClaw가 시작한 브라우저 프로세스를 중지합니다
- attach-only 및 원격 CDP 프로필: `openclaw browser stop`
OpenClaw가 브라우저 프로세스를 시작하지 않았더라도 활성 제어 세션을 닫고
Playwright/CDP 에뮬레이션 재정의(뷰포트, 색 구성표, 로캘, 시간대, 오프라인 모드 등)를 해제합니다
- 로컬 관리형 프로필: `openclaw browser stop`은 OpenClaw가 실행한 브라우저 프로세스를 중지합니다
- attach-only 및 원격 CDP 프로필: `openclaw browser stop`은 활성 제어 세션을 닫고 Playwright/CDP 에뮬레이션 재정의(뷰포트,
색 구성표, 로캘, 시간대, 오프라인 모드 및 유사한 상태)를 해제하지만,
OpenClaw가 브라우저 프로세스를 실행한 것은 아닙니다
원격 CDP URL에는 인증 정보를 포함할 수 있습니다:
- 쿼리 토큰(예: `https://provider.example?token=<token>`)
- HTTP Basic auth(예: `https://user:pass@provider.example`)
- HTTP Basic 인증(예: `https://user:pass@provider.example`)
OpenClaw는 `/json/*` 엔드포인트 호출 시와
CDP WebSocket 연결 시 인증 정보를 유지합니다. 토큰은 config 파일에 커밋하는 대신
환경 변수 또는 시크릿 매니저를 사용하는 것이 좋습니다.
OpenClaw는 `/json/*` 엔드포인트 호출 시와 CDP WebSocket 연결 시
인증 정보를 유지합니다. 토큰은 config 파일에 커밋하는 대신 환경 변수나 시크릿 관리자 사용을 권장합니다.
## Node 브라우저 프록시(기본 제로 구성)
## 노드 브라우저 프록시(기본 무설정)
브라우저가 있는 머신에서 **node host**를 실행 중이라면, OpenClaw는
추가 브라우저 config 없이도 브라우저 도구 호출을 해당 노드로
자동 라우팅할 수 있습니다. 이는 원격 게이트웨이의 기본 경로입니다.
브라우저가 있는 머신에서 **node host**를 실행하면 OpenClaw는
추가 브라우저 config 없이도 브라우저 도구 호출을 해당 노드로 자동 라우팅할 수 있습니다.
이것이 원격 gateway의 기본 경로입니다.
참고:
참고 사항:
- node host는 로컬 브라우저 제어 서버를 **프록시 명령**으로 노출합니다.
- node host는 **프록시 명령**을 통해 자신의 로컬 브라우저 제어 서버를 노출합니다.
- 프로필은 노드 자체의 `browser.profiles` config(로컬과 동일)에서 가져옵니다.
- `nodeHost.browserProxy.allowProfiles`는 선택 사항입니다. 비워 두면 레거시/기본 동작이 적용되어, 프로필 생성/삭제 라우트를 포함해 구성된 모든 프로필이 프록시를 통해 접근 가능합니다.
- `nodeHost.browserProxy.allowProfiles`를 설정하면, OpenClaw는 이를 최소 권한 경계로 취급합니다. allowlist에 있는 프로필만 대상으로 지정할 수 있으며, 영구 프로필 생성/삭제 라우트는 프록시 표면에서 차단됩니다.
- `nodeHost.browserProxy.allowProfiles`는 선택 사항입니다. 비워 두면 레거시/기본 동작이 적용되어, 프로필 생성/삭제 경로를 포함해 구성된 모든 프로필에 프록시를 통해 접근할 수 있습니다.
- `nodeHost.browserProxy.allowProfiles`를 설정하면 OpenClaw는 이를 최소 권한 경계로 취급합니다. 허용 목록에 있는 프로필만 대상으로 지정할 수 있고, 영구 프로필 생성/삭제 경로는 프록시 표면에서 차단됩니다.
- 원하지 않으면 비활성화하세요:
- 노드에서: `nodeHost.browserProxy.enabled=false`
- 게이트웨이에서: `gateway.nodes.browser.mode="off"`
- gateway에서: `gateway.nodes.browser.mode="off"`
## Browserless(호스팅 원격 CDP)
## Browserless(호스팅 원격 CDP)
[Browserless](https://browserless.io)는 HTTPS와 WebSocket을 통해
CDP 연결 URL을 노출하는 호스팅 Chromium 서비스입니다. OpenClaw는 두 형식을 모두 사용할 수 있지만,
원격 브라우저 프로필에는 Browserless 연결 문서에 있는 직접 WebSocket URL을 사용하는 것이 가장 간단합니다.
원격 브라우저 프로필에서는 Browserless의 연결 문서에 있는 직접 WebSocket URL이 가장 간단한 옵션입니다.
예시:
@ -303,29 +290,31 @@ CDP 연결 URL을 노출하는 호스팅 Chromium 서비스입니다. OpenClaw
}
```
참고:
참고 사항:
- `<BROWSERLESS_API_KEY>`를 실제 Browserless 토큰으로 바꾸세요.
- Browserless 계정에 맞는 리전 엔드포인트를 선택하세요(자세한 내용은 해당 문서 참조).
- Browserless가 HTTPS 기본 URL을 제공하는 경우, 직접 CDP 연결을 위해 이를 `wss://`로 변환하거나 HTTPS URL을 그대로 두고 OpenClaw가 `/json/version`을 탐색하도록 할 수 있습니다.
- Browserless가 HTTPS 기본 URL을 제공하는 경우 이를 직접 CDP 연결용 `wss://`
변환해도 되고, HTTPS URL을 그대로 유지한 채 OpenClaw가
`/json/version`을 검색하도록 해도 됩니다.
## 직접 WebSocket CDP provider
## 직접 WebSocket CDP 제공자
일부 호스팅 브라우저 서비스는 표준 HTTP 기반 CDP 탐색(`/json/version`)이 아니라
**직접 WebSocket** 엔드포인트를 제공합니다. OpenClaw는 둘 다 지원합니다:
일부 호스팅 브라우저 서비스는 표준 HTTP 기반 CDP 검색(`/json/version`) 대신
**직접 WebSocket** 엔드포인트를 제공합니다. OpenClaw는 두 방식 모두 지원합니다:
- **HTTP(S) 엔드포인트** — OpenClaw `/json/version`을 호출해
WebSocket 디버거 URL을 탐색한 후 연결합니다.
- **WebSocket 엔드포인트** (`ws://` / `wss://`) — OpenClaw가 직접 연결하며
`/json/version`은 건너뜁니다. 이는
- **HTTP(S) 엔드포인트** — OpenClaw `/json/version`을 호출해
WebSocket 디버거 URL을 찾은 다음 연결합니다.
- **WebSocket 엔드포인트** (`ws://` / `wss://`) — OpenClaw`/json/version`을 건너뛰고
직접 연결합니다. 이는
[Browserless](https://browserless.io),
[Browserbase](https://www.browserbase.com) 또는 WebSocket URL을 직접 제공하는
모든 provider에 사용하세요.
[Browserbase](https://www.browserbase.com) 또는 WebSocket URL을 제공하는
모든 서비스에 사용합니다.
### Browserbase
[Browserbase](https://www.browserbase.com)는 내장 CAPTCHA 해결, stealth 모드,
residential proxy를 제공하는 헤드리스 브라우저 실행용 클라우드 플랫폼입니다.
[Browserbase](https://www.browserbase.com)는 내장 CAPTCHA 해결, 스텔스 모드, 주거용
프록시를 갖춘 헤드리스 브라우저 실행용 클라우드 플랫폼입니다.
```json5
{
@ -344,61 +333,62 @@ residential proxy를 제공하는 헤드리스 브라우저 실행용 클라우
}
```
참고:
참고 사항:
- [회원 가입](https://www.browserbase.com/sign-up) 후 [Overview dashboard](https://www.browserbase.com/overview)에서 **API Key**를 복사하세요.
- [가입](https://www.browserbase.com/sign-up)한 뒤 [Overview dashboard](https://www.browserbase.com/overview)에서
**API Key**를 복사하세요.
- `<BROWSERBASE_API_KEY>`를 실제 Browserbase API 키로 바꾸세요.
- Browserbase는 WebSocket 연결 시 브라우저 세션을 자동 생성하므로
수동 세션 생성 단계가 필요하지 않습니다.
- 무료 등급은 동시 세션 1개와 월 1 브라우저 시간을 허용합니다.
유료 요금제 한도는 [pricing](https://www.browserbase.com/pricing)을 참조하세요.
수동 세션 생성 단계가 필요습니다.
- 무료 플랜은 동시 세션 1개와 월 1 브라우저 시간을 제공합니다.
유료 플랜 제한은 [pricing](https://www.browserbase.com/pricing)을 참조하세요.
- 전체 API 참조, SDK 가이드, 통합 예시는 [Browserbase docs](https://docs.browserbase.com)를 참조하세요.
## 보안
핵심 개념:
- 브라우저 제어는 루프백 전용이며, 액세스는 Gateway 인증 또는 node pairing을 통해 흐릅니다.
- 독립형 루프백 브라우저 HTTP API는 **공유 비밀 인증만** 사용합니다:
gateway 토큰 bearer auth, `x-openclaw-password`, 또는
구성된 gateway 비밀번호를 사용한 HTTP Basic auth.
- Tailscale Serve identity 헤더와 `gateway.auth.mode: "trusted-proxy"`
이 독립형 루프백 브라우저 API를 인증하지 않습니다.
- 브라우저 제어가 활성화되어 있고 공유 비밀 인증이 구성되지 않은 경우, OpenClaw는
시작 시 `gateway.auth.token`을 자동 생성하고 config에 저장합니다.
- 브라우저 제어는 루프백 전용이며, 액세스는 Gateway 인증 또는 노드 페어링을 통해 이루어집니다.
- 독립형 루프백 브라우저 HTTP API는 **공유 시크릿 인증만** 사용합니다:
gateway 토큰 bearer 인증, `x-openclaw-password`, 또는
설정된 gateway 비밀번호를 사용하는 HTTP Basic 인증입니다.
- Tailscale Serve ID 헤더와 `gateway.auth.mode: "trusted-proxy"`
이 독립형 루프백 브라우저 API를 **인증하지 않습니다**.
- 브라우저 제어가 활성화되어 있고 공유 시크릿 인증이 구성되지 않은 경우 OpenClaw는
시작 시 `gateway.auth.token`을 자동 생성하고 이를 config에 저장합니다.
- `gateway.auth.mode`가 이미
`password`, `none`, 또는 `trusted-proxy`인 경우는 해당 토큰을 자동 생성하지 않습니다.
- Gateway와 모든 node host는 비공개 네트워크(Tailscale)에 유지하고, 공용 노출은 피하세요.
- 원격 CDP URL/토큰은 시크릿으로 취급하고, env var 또는 시크릿 매니저를 선호하세요.
`password`, `none`, 또는 `trusted-proxy`인 경우 OpenClaw는 해당 토큰을 자동 생성하지 않습니다.
- Gateway와 모든 node host는 비공개 네트워크(Tailscale)에 두고 공개적으로 노출하지 마세요.
- 원격 CDP URL/토큰은 시크릿으로 취급하고 환경 변수나 시크릿 관리자를 사용하는 것이 좋습니다.
원격 CDP 팁:
- 가능하면 암호화된 엔드포인트(HTTPS 또는 WSS)와 짧은 수명의 토큰을 선호하세요.
- 오래 유지되는 토큰을 config 파일에 직접 포함하지 마세요.
- 가능하면 암호화된 엔드포인트(HTTPS 또는 WSS)와 짧은 수명의 토큰을 사용하세요.
- 장기 토큰을 config 파일에 직접 포함하지 마세요.
## 프로필(멀티 브라우저)
OpenClaw는 여러 개의 이름 있는 프로필(라우팅 config)을 지원합니다. 프로필 유형:
OpenClaw는 여러 개의 이름 있는 프로필(라우팅 config)을 지원합니다. 프로필은 다음과 같을 수 있습니다:
- **openclaw-managed**: 자체 사용자 데이터 디렉터리와 CDP 포트를 가진 전용 Chromium 기반 브라우저 인스턴스
- **remote**: 명시적 CDP URL(다른 곳에서 실행 중인 Chromium 기반 브라우저)
- **existing session**: Chrome DevTools MCP 자동 연결을 통한 기존 Chrome 프로필
- **openclaw 관리형**: 자체 사용자 데이터 디렉터리와 CDP 포트를 가진 전용 Chromium 기반 브라우저 인스턴스
- **원격**: 명시적인 CDP URL(다른 위치에서 실행 중인 Chromium 기반 브라우저)
- **기존 세션**: Chrome DevTools MCP 자동 연결을 통한 기존 Chrome 프로필
기본값:
- `openclaw` 프로필은 없으면 자동 생성됩니다.
- `user` 프로필은 Chrome MCP existing-session attach용 내장 프로필입니다.
- existing-session 프로필은 `user` 외에는 opt-in이며, `--driver existing-session`으로 생성하세요.
- `user` 프로필은 Chrome MCP 기존 세션 연결용으로 내장되어 있습니다.
- 기존 세션 프로필은 `user` 외에는 opt-in입니다. `--driver existing-session`으로 생성하세요.
- 로컬 CDP 포트는 기본적으로 **1880018899** 범위에서 할당됩니다.
- 프로필을 삭제하면 해당 로컬 데이터 디렉터리는 휴지통으로 이동합니다.
모든 제어 엔드포인트는 `?profile=<name>`허용하며, CLI는 `--browser-profile`을 사용합니다.
모든 제어 엔드포인트는 `?profile=<name>`받으며, CLI는 `--browser-profile`을 사용합니다.
## Chrome DevTools MCP를 통한 existing-session
## Chrome DevTools MCP를 통한 기존 세션
OpenClaw는 공식 Chrome DevTools MCP 서버를 통해 실행 중인 Chromium 기반 브라우저 프로필에 연결할 수도 있습니다. 이를 통해 해당 브라우저 프로필에 이미 열려 있는 탭과 로그인 상태를 재사용할 수 있습니다.
OpenClaw는 공식 Chrome DevTools MCP 서버를 통해 실행 중인 Chromium 기반 브라우저 프로필에 연결할 수도 있습니다. 이렇게 하면 해당 브라우저 프로필에서 이미 열려 있는 탭과 로그인 상태를 재사용합니다.
공식 배경 자료 및 설정 참고 링크:
공식 배경 및 설정 참고 자료:
- [Chrome for Developers: Use Chrome DevTools MCP with your browser session](https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session)
- [Chrome DevTools MCP README](https://github.com/ChromeDevTools/chrome-devtools-mcp)
@ -407,15 +397,15 @@ OpenClaw는 공식 Chrome DevTools MCP 서버를 통해 실행 중인 Chromium
- `user`
선택 사항: 다른 이름, 색상 또는 브라우저 데이터 디렉터리가 필요하면
직접 custom existing-session 프로필을 만들 수 있습니다.
선택 사항: 다른 이름, 색상 또는 브라우저 데이터 디렉터리를 원하면
자체 사용자 지정 기존 세션 프로필을 만들 수 있습니다.
기본 동작:
- 내장 `user` 프로필은 Chrome MCP 자동 연결을 사용하며,
- 내장 `user` 프로필은 Chrome MCP 자동 연결을 사용하며,
기본 로컬 Google Chrome 프로필을 대상으로 합니다.
Brave, Edge, Chromium 또는 기본 Chrome 프로필에는 `userDataDir`을 사용하세요:
Brave, Edge, Chromium 또는 기본이 아닌 Chrome 프로필에는 `userDataDir`을 사용하세요:
```json5
{
@ -436,7 +426,7 @@ Brave, Edge, Chromium 또는 비기본 Chrome 프로필에는 `userDataDir`을
1. 원격 디버깅용 inspect 페이지를 엽니다.
2. 원격 디버깅을 활성화합니다.
3. 브라우저를 계속 실행한 채 OpenClaw가 연결할 때 나타나는 연결 승인 프롬프트를 수락합니다.
3. 브라우저를 계속 실행한 상태로 두고 OpenClaw가 연결할 때 연결 프롬프트를 승인합니다.
일반적인 inspect 페이지:
@ -444,7 +434,7 @@ Brave, Edge, Chromium 또는 비기본 Chrome 프로필에는 `userDataDir`을
- Brave: `brave://inspect/#remote-debugging`
- Edge: `edge://inspect/#remote-debugging`
실시간 attach 스모크 테스트:
라이브 연결 스모크 테스트:
```bash
openclaw browser --browser-profile user start
@ -453,57 +443,63 @@ openclaw browser --browser-profile user tabs
openclaw browser --browser-profile user snapshot --format ai
```
성공 시 확인할 수 있는 내용:
성공 시 확인할 수 있는 모습:
- `status``driver: existing-session`이 표시됨
- `status``transport: chrome-mcp`가 표시됨
- `status``running: true`가 표시됨
- `tabs`에 이미 열려 있는 브라우저 탭이 나열
- `tabs`에 이미 열려 있는 브라우저 탭이 표시
- `snapshot`이 선택된 라이브 탭의 ref를 반환함
attach가 작동하지 않을 때 확인할 사항:
연결이 작동하지 않을 때 확인할 사항:
- 대상 Chromium 기반 브라우저 버전이 `144+`인지
- 해당 브라우저 inspect 페이지에서 원격 디버깅이 활성화되어 있는지
- 브라우저에 연결 승인 프롬프트가 표시되었고 이를 수락했는지
- `openclaw doctor`이전 확장 기반 브라우저 config를 마이그레이션하고
- 해당 브라우저 inspect 페이지에서 원격 디버깅이 활성화되어 있는지
- 브라우저에 연결 동의 프롬프트가 표시되었고 이를 수락했는지
- `openclaw doctor`오래된 확장 기반 브라우저 config를 마이그레이션하고
기본 자동 연결 프로필용으로 Chrome이 로컬에 설치되어 있는지 확인하지만,
브라우저 측 원격 디버깅까지 대신 활성화해 주지는 않습니다
브라우저 측 원격 디버깅 대신 활성화해 주지는 않습니다
에이전트 사용:
- 사용자 로그인 브라우저 상태가 필요할 때는 `profile="user"`를 사용하세요.
- custom existing-session 프로필을 사용한다면 명시적으로 해당 프로필 이름을 전달하세요.
- 사용자가 컴퓨터 앞에 있어 attach 프롬프트를 승인할 수 있을 때만 이 모드를 선택하세요.
- 사용자 로그인 브라우저 상태가 필요할 때는 `profile="user"`를 사용하세요.
- 사용자 지정 기존 세션 프로필을 사용한다면 해당 명시적 프로필 이름을 전달하세요.
- 사용자가 컴퓨터 앞에 있어 연결 프롬프트를 승인할 수 있을 때만 이 모드를 선택하세요.
- Gateway 또는 node host는 `npx chrome-devtools-mcp@latest --autoConnect`를 실행할 수 있습니다
참고:
참고 사항:
- 이 경로는 로그인된 브라우저 세션 내부에서 동작할 수 있으므로 격리된 `openclaw` 프로필보다 위험도가 높습니다.
- 이 드라이버에서는 OpenClaw가 브라우저를 실행하지 않으며, 기존 세션에만 연결합니다.
- OpenClaw는 여기서 공식 Chrome DevTools MCP `--autoConnect` 흐름을 사용합니다. `userDataDir`이 설정되어 있으면 해당 명시적 Chromium 사용자 데이터 디렉터리를 대상으로 하도록 이를 전달합니다.
- existing-session 스크린샷은 페이지 캡처와 스냅샷의 `--ref` 요소 캡처는 지원하지만 CSS `--element` 선택자는 지원하지 않습니다.
- existing-session 페이지 스크린샷은 Chrome MCP를 통해 Playwright 없이도 작동합니다.
ref 기반 요소 스크린샷(`--ref`)도 작동하지만, `--full-page``--ref` 또는 `--element`와 함께 사용할 수 없습니다.
- existing-session 작업은 관리형 브라우저 경로보다 여전히 더 제한적입니다:
- `click`, `type`, `hover`, `scrollIntoView`, `drag`, `select`는 CSS 선택자 대신 스냅샷 ref가 필요합니다
- `click`은 왼쪽 버튼만 지원합니다(버튼 재정의나 modifier 없음)
- `type``slowly=true`를 지원하지 않으며, `fill` 또는 `press`를 사용해야 합니다
- 이 경로는 로그인된 브라우저 세션 내부에서 동작할 수 있으므로 격리된 `openclaw` 프로필보다 위험이 더 큽니다.
- OpenClaw는 이 드라이버에 대해 브라우저를 실행하지 않으며,
기존 세션에만 연결합니다.
- OpenClaw는 여기서 공식 Chrome DevTools MCP `--autoConnect` 흐름을 사용합니다. `userDataDir`이 설정된 경우 OpenClaw는 이를 전달하여
해당 명시적 Chromium 사용자 데이터 디렉터리를 대상으로 지정합니다.
- 기존 세션 스크린샷은 페이지 캡처와 스냅샷의 `--ref` 요소
캡처는 지원하지만 CSS `--element` 선택자는 지원하지 않습니다.
- 기존 세션 페이지 스크린샷은 Chrome MCP를 통해 Playwright 없이 작동합니다.
ref 기반 요소 스크린샷(`--ref`)도 작동하지만 `--full-page`
`--ref` 또는 `--element`와 함께 사용할 수 없습니다.
- 기존 세션 작업은 관리형 브라우저 경로보다 여전히 제한이 많습니다:
- `click`, `type`, `hover`, `scrollIntoView`, `drag`, `select`
CSS 선택자 대신 스냅샷 ref가 필요합니다
- `click`은 왼쪽 버튼만 지원합니다(버튼 재정의 또는 modifier 없음)
- `type``slowly=true`를 지원하지 않으며 `fill` 또는 `press`를 사용해야 합니다
- `press``delayMs`를 지원하지 않습니다
- `hover`, `scrollIntoView`, `drag`, `select`, `fill`, `evaluate`는 호출별 타임아웃 재정의를 지원하지 않습니다
- `hover`, `scrollIntoView`, `drag`, `select`, `fill`, `evaluate`
호출별 타임아웃 재정의를 지원하지 않습니다
- `select`는 현재 단일 값만 지원합니다
- existing-session `wait --url`은 다른 브라우저 드라이버처럼 정확 일치, 부분 문자열, glob 패턴을 지원합니다. `wait --load networkidle`은 아직 지원하지 않습니다.
- existing-session 업로드 훅은 `ref` 또는 `inputRef`가 필요하고, 한 번에 한 파일만 지원하며, CSS `element` 대상 지정은 지원하지 않습니다.
- existing-session 대화상자 훅은 타임아웃 재정의를 지원하지 않습니다.
- 일부 기능은 여전히 관리형 브라우저 경로가 필요합니다. 예를 들면 배치 작업, PDF 내보내기, 다운로드 가로채기, `responsebody` 등이 있습니다.
- existing-session은 호스트 로컬 전용입니다. Chrome이 다른 머신이나
다른 네트워크 네임스페이스에 있다면 remote CDP 또는 node host를 대신 사용하세요.
- 기존 세션 `wait --url`은 다른 브라우저 드라이버와 마찬가지로 정확 일치, 부분 문자열, glob 패턴을 지원합니다. `wait --load networkidle`은 아직 지원지 않습니다.
- 기존 세션 업로드 훅은 `ref` 또는 `inputRef`가 필요하고 한 번에 하나의 파일만 지원하며 CSS `element` 대상 지정은 지원하지 않습니다.
- 기존 세션 대화상자 훅은 타임아웃 재정의를 지원하지 않습니다.
- 배치 작업, PDF 내보내기, 다운로드 가로채기, `responsebody`를 포함한 일부 기능은 여전히 관리형 브라우저 경로가 필요합니다.
- 기존 세션은 호스트 로컬입니다. Chrome이 다른 머신이나
다른 네트워크 네임스페이스에 있다면 대신 원격 CDP 또는 node host를 사용하세요.
## 격리 보장
- **전용 사용자 데이터 디렉터리**: 개인 브라우저 프로필을 절대 건드리지 않습니다.
- **전용 포트**: 개발 워크플로와의 충돌을 피하기 위해 `9222`를 사용하지 않습니다.
- **결정적인 탭 제어**: “마지막 탭”이 아니라 `targetId`로 탭을 대상으로 지정합니다.
- **전용 사용자 데이터 디렉터리**: 사용자의 개인 브라우저 프로필에 절대 영향을 주지 않습니다.
- **전용 포트**: 개발 워크플로와의 충돌을 방지하기 위해 `9222`를 피합니다.
- **결정적인 탭 제어**: “마지막 탭”이 아니라 `targetId`로 탭을 지정합니다.
## 브라우저 선택
@ -515,9 +511,9 @@ attach가 작동하지 않을 때 확인할 사항:
4. Chromium
5. Chrome Canary
`browser.executablePath`이를 재정의할 수 있습니다.
`browser.executablePath`로 재정의할 수 있습니다.
플랫폼:
플랫폼:
- macOS: `/Applications``~/Applications`를 확인합니다.
- Linux: `google-chrome`, `brave`, `microsoft-edge`, `chromium` 등을 찾습니다.
@ -540,35 +536,56 @@ attach가 작동하지 않을 때 확인할 사항:
- 상태: `GET /storage/:kind`, `POST /storage/:kind/set`, `POST /storage/:kind/clear`
- 설정: `POST /set/offline`, `POST /set/headers`, `POST /set/credentials`, `POST /set/geolocation`, `POST /set/media`, `POST /set/timezone`, `POST /set/locale`, `POST /set/device`
모든 엔드포인트는 `?profile=<name>`허용합니다.
모든 엔드포인트는 `?profile=<name>`받습니다.
공유 비밀 gateway 인증이 구성되어 있다면 브라우저 HTTP 라우트도 인증이 필요합니다:
공유 시크릿 gateway 인증이 구성되어 있으면 브라우저 HTTP 경로에도 인증이 필요합니다:
- `Authorization: Bearer <gateway token>`
- `x-openclaw-password: <gateway password>` 또는 해당 비밀번호를 사용하는 HTTP Basic auth
- `x-openclaw-password: <gateway password>` 또는 해당 비밀번호를 사용하는 HTTP Basic 인증
참고:
참고 사항:
- 이 독립형 루프백 브라우저 API는 `trusted-proxy` 또는
Tailscale Serve identity 헤더를 사용하지 않습니다.
- `gateway.auth.mode``none` 또는 `trusted-proxy`인 경우에도 이 루프백 브라우저
라우트는 그런 identity 기반 모드를 상속하지 않으므로 반드시 루프백 전용으로 유지하세요.
Tailscale Serve ID 헤더를 사용하지 않습니다.
- `gateway.auth.mode``none` 또는 `trusted-proxy`이면 이러한 루프백 브라우저
경로는 해당 ID 기반 모드를 상속하지 않으므로 루프백 전용으로 유지하세요.
### Playwright 필요 사항
### `/act` 오류 계약
`POST /act`는 경로 수준 유효성 검사와 정책 실패에 대해
구조화된 오류 응답을 사용합니다:
```json
{ "error": "<message>", "code": "ACT_*" }
```
현재 `code` 값:
- `ACT_KIND_REQUIRED` (HTTP 400): `kind`가 없거나 인식되지 않습니다.
- `ACT_INVALID_REQUEST` (HTTP 400): 작업 페이로드 정규화 또는 유효성 검사에 실패했습니다.
- `ACT_SELECTOR_UNSUPPORTED` (HTTP 400): 지원되지 않는 작업 종류에 `selector`가 사용되었습니다.
- `ACT_EVALUATE_DISABLED` (HTTP 403): config에서 `evaluate`(또는 `wait --fn`)가 비활성화되어 있습니다.
- `ACT_TARGET_ID_MISMATCH` (HTTP 403): 최상위 또는 배치된 `targetId`가 요청 대상과 충돌합니다.
- `ACT_EXISTING_SESSION_UNSUPPORTED` (HTTP 501): 기존 세션 프로필에서는 작업이 지원되지 않습니다.
기타 런타임 실패는 여전히 `code` 필드 없이
`{ "error": "<message>" }`를 반환할 수 있습니다.
### Playwright 요구 사항
일부 기능(navigate/act/AI snapshot/role snapshot, 요소 스크린샷,
PDF)에는 Playwright가 필요합니다. Playwright가 설치되어 있지 않으면
해당 엔드포인트는 명확한 501 오류를 반환합니다.
PDF)에는 Playwright가 필요합니다. Playwright가 설치되지 않은 경우 해당 엔드포인트는
명확한 501 오류를 반환합니다.
Playwright 없이도 작동하는 항목:
Playwright 없이도 여전히 작동하는 기능:
- ARIA 스냅샷
- 탭별 CDP
WebSocket을 사용할 수 있는 경우 관리형 `openclaw` 브라우저의 페이지 스크린샷
WebSocket을 사용할 수 있을 때 관리형 `openclaw` 브라우저의 페이지 스크린샷
- `existing-session` / Chrome MCP 프로필의 페이지 스크린샷
- 스냅샷 출력에서 `existing-session` ref 기반 스크린샷(`--ref`)
- 스냅샷 출력 `existing-session` ref 기반 스크린샷(`--ref`)
여전히 Playwright가 필요한 항목:
여전히 Playwright가 필요한 기능:
- `navigate`
- `act`
@ -576,16 +593,15 @@ Playwright 없이도 작동하는 항목:
- CSS 선택자 요소 스크린샷(`--element`)
- 전체 브라우저 PDF 내보내기
요소 스크린샷은 `--full-page`도 거부합니다. 해당 라우트는 `fullPage is
요소 스크린샷은 `--full-page`도 거부하며 경로는 `fullPage is
not supported for element screenshots`를 반환합니다.
`Playwright is not available in this gateway build`가 보이면 전체
Playwright 패키지(`playwright-core`가 아님)를 설치하고 gateway를 재시작하거나,
브라우저 지원이 포함된 OpenClaw를 다시 설치하세요.
`Playwright is not available in this gateway build`가 표시되면 전체
Playwright 패키지(`playwright-core`가 아님)를 설치하고 gateway를 다시 시작하거나, 브라우저 지원이 포함된 OpenClaw를 다시 설치하세요.
#### Docker Playwright 설치
Gateway가 Docker에서 실행되는 경우 `npx playwright`는 피하세요(npm override 충돌).
Gateway가 Docker에서 실행 중이면 `npx playwright`는 피하세요(npm override 충돌).
대신 번들 CLI를 사용하세요:
```bash
@ -594,8 +610,8 @@ docker compose run --rm openclaw-cli \
```
브라우저 다운로드를 유지하려면 `PLAYWRIGHT_BROWSERS_PATH`를 설정하고(예:
`/home/node/.cache/ms-playwright`), `/home/node` `OPENCLAW_HOME_VOLUME` 또는
bind mount를 통해 유지되도록 하세요. [Docker](/ko/install/docker)를 참조하세요.
`/home/node/.cache/ms-playwright`), `/home/node`
`OPENCLAW_HOME_VOLUME` 또는 bind mount를 통해 유지되도록 하세요. 자세한 내용은 [Docker](/ko/install/docker)를 참조하세요.
## 작동 방식(내부)
@ -606,13 +622,13 @@ bind mount를 통해 유지되도록 하세요. [Docker](/ko/install/docker)를
- 고급 작업(클릭/입력/스냅샷/PDF)에는 CDP 위에서 **Playwright**를 사용합니다.
- Playwright가 없으면 Playwright 비의존 작업만 사용할 수 있습니다.
이 설계는 에이전트에 안정적이고 결정적인 인터페이스를 제공하면서도,
로컬/원격 브라우저와 프로필을 자유롭게 교체할 수 있게 합니다.
이 설계는 에이전트가 안정적이고 결정적인 인터페이스를 사용하도록 유지하면서도
로컬/원격 브라우저와 프로필을 교체할 수 있게 합니다.
## CLI 빠른 참조
모든 명령은 특정 프로필을 대상으로 지정하기 위해 `--browser-profile <name>`을 받습니다.
모든 명령은 기계가 읽을 수 있는 출력(안정적인 페이로드)을 위해 `--json`도 받습니다.
모든 명령은 특정 프로필을 대상으로 `--browser-profile <name>`을 받을 수 있습니다.
모든 명령은 기계가 읽을 수 있는 출력(안정적인 페이로드)을 위해 `--json`도 받을 수 있습니다.
기본:
@ -645,9 +661,9 @@ bind mount를 통해 유지되도록 하세요. [Docker](/ko/install/docker)를
수명 주기 참고:
- attach-only 및 원격 CDP 프로필에서는 테스트 후에도 `openclaw browser stop`
올바른 정리 명령입니다. 기본 브라우저를 종료하는 대신 활성 제어 세션을 닫고
임시 에뮬레이션 재정의를 해제합니다.
- attach-only 및 원격 CDP 프로필의 경우에도 테스트 후 정리 명령으로는
`openclaw browser stop`이 올바릅니다. 이 명령은 실제 브라우저를 종료하는 대신
활성 제어 세션을 닫고 임시 에뮬레이션 재정의를 지웁니다.
- `openclaw browser errors --clear`
- `openclaw browser requests --filter api --clear`
- `openclaw browser pdf`
@ -696,26 +712,27 @@ bind mount를 통해 유지되도록 하세요. [Docker](/ko/install/docker)를
- `openclaw browser set locale en-US`
- `openclaw browser set device "iPhone 14"`
참고:
참고 사항:
- `upload``dialog`**arming** 호출입니다. 파일 선택기/대화상자를 트리거하는 클릭/press 전에 먼저 실행하세요.
- `upload``dialog`**사전 준비** 호출입니다. 파일 선택기/대화상자를
트리거하는 클릭/키 입력 전에 실행하세요.
- 다운로드 및 trace 출력 경로는 OpenClaw 임시 루트로 제한됩니다:
- traces: `/tmp/openclaw` (폴백: `${os.tmpdir()}/openclaw`)
- downloads: `/tmp/openclaw/downloads` (폴백: `${os.tmpdir()}/openclaw/downloads`)
- 업로드 경로 OpenClaw 임시 업로드 루트로 제한됩니다:
- uploads: `/tmp/openclaw/uploads` (폴백: `${os.tmpdir()}/openclaw/uploads`)
- traces: `/tmp/openclaw` (대체 경로: `${os.tmpdir()}/openclaw`)
- downloads: `/tmp/openclaw/downloads` (대체 경로: `${os.tmpdir()}/openclaw/downloads`)
- 업로드 경로 OpenClaw 임시 업로드 루트로 제한됩니다:
- uploads: `/tmp/openclaw/uploads` (대체 경로: `${os.tmpdir()}/openclaw/uploads`)
- `upload``--input-ref` 또는 `--element`를 통해 파일 입력을 직접 설정할 수도 있습니다.
- `snapshot`:
- `--format ai`(기본값, Playwright 설치 시): 숫자 ref(`aria-ref="<n>"`)가 있는 AI 스냅샷을 반환합니다.
- `--format ai`(기본값, Playwright 설치 시): 숫자 ref(`aria-ref="<n>"`)가 포함된 AI 스냅샷을 반환합니다.
- `--format aria`: 접근성 트리를 반환합니다(ref 없음, 검사 전용).
- `--efficient`(또는 `--mode efficient`): compact role 스냅샷 프리셋(interactive + compact + depth + 낮은 maxChars)입니다.
- config 기본값(도구/CLI 전용): 호출자가 모드를 전달하지 않을 때 efficient 스냅샷을 사용하려면 `browser.snapshotDefaults.mode: "efficient"`를 설정하세요([Gateway configuration](/ko/gateway/configuration-reference#browser) 참조).
- role 스냅샷 옵션(`--interactive`, `--compact`, `--depth`, `--selector`)은 `ref=e12` 같은 ref가 있는 role 기반 스냅샷을 강제합니다.
- `--frame "<iframe selector>"`는 role 스냅샷을 해당 iframe으로 범위 제한합니다(`e12` 같은 role ref와 함께 사용).
- `--interactive`는 상호작용 가능한 요소를 평면적이고 선택하기 쉽게 출력합니다(작업 구동에 가장 적합).
- `--labels`는 ref 레이블이 오버레이된 뷰포트 전용 스크린샷을 추가합니다(`MEDIA:<path>` 출력).
- `click`/`type` 등은 `snapshot`에서 얻은 `ref`(숫자 `12` 또는 role ref `e12`)가 필요합니다.
작업에는 의도적으로 CSS 선택자를 지원하지 않습니다.
- `--efficient`(또는 `--mode efficient`): 간결한 role 스냅샷 프리셋(interactive + compact + depth + 낮은 maxChars)입니다.
- config 기본값(도구/CLI 전용): 호출자가 모드를 전달하지 않을 때 효율적인 스냅샷을 사용하려면 `browser.snapshotDefaults.mode: "efficient"`를 설정하세요([Gateway configuration](/ko/gateway/configuration-reference#browser) 참조).
- Role 스냅샷 옵션(`--interactive`, `--compact`, `--depth`, `--selector`)은 `ref=e12` 같은 ref가 있는 role 기반 스냅샷을 강제합니다.
- `--frame "<iframe selector>"`는 role 스냅샷을 iframe으로 범위 지정합니다(`e12` 같은 role ref와 함께 사용).
- `--interactive`는 상호작용 가능한 요소를 평면의, 선택하기 쉬운 목록으로 출력합니다(작업 수행에 가장 적합).
- `--labels`는 ref 라벨이 오버레이된 뷰포트 전용 스크린샷을 추가합니다(`MEDIA:<path>` 출력).
- `click`/`type`/기타는 `snapshot` `ref`(숫자 `12` 또는 role ref `e12`)가 필요합니다.
작업에는 의도적으로 CSS 선택자가 지원되지 않습니다.
## 스냅샷과 ref
@ -724,33 +741,33 @@ OpenClaw는 두 가지 “스냅샷” 스타일을 지원합니다:
- **AI 스냅샷(숫자 ref)**: `openclaw browser snapshot`(기본값, `--format ai`)
- 출력: 숫자 ref가 포함된 텍스트 스냅샷.
- 작업: `openclaw browser click 12`, `openclaw browser type 23 "hello"`.
- 내부적으로 ref는 Playwright의 `aria-ref`를 통해 확인됩니다.
- 내부적으로 ref는 Playwright의 `aria-ref`를 통해 확인됩니다.
- **Role 스냅샷(`e12` 같은 role ref)**: `openclaw browser snapshot --interactive`(`--compact`, `--depth`, `--selector`, `--frame`도 가능)
- 출력: `[ref=e12]`(선택적으로 `[nth=1]`)가 있는 role 기반 목록/트리.
- **Role 스냅샷(`e12` 같은 role ref)**: `openclaw browser snapshot --interactive`(또는 `--compact`, `--depth`, `--selector`, `--frame`)
- 출력: `[ref=e12]`(선택적으로 `[nth=1]`)가 있는 role 기반 목록/트리.
- 작업: `openclaw browser click e12`, `openclaw browser highlight e12`.
- 내부적으로 이 ref는 `getByRole(...)`(`중복일 경우 nth()` 포함)로 확인됩니다.
- `--labels`를 추가하면 `e12` 레이블이 오버레이된 뷰포트 스크린샷이 포함됩니다.
- 내부적으로 ref는 `getByRole(...)`(중복에 대해서는 `nth()` 추가)로 확인됩니다.
- `--labels`를 추가하면 `e12` 라벨이 오버레이된 뷰포트 스크린샷이 포함됩니다.
ref 동작:
- ref는 **탐색 간에 안정적이지 않습니다**. 실패하면 `snapshot`을 다시 실행해 새 ref를 사용하세요.
- role 스냅샷`--frame`으로 찍었다면, 다음 role 스냅샷 전까지 role ref는 해당 iframe 범위로 제한됩니다.
- ref는 **탐색 간에 안정적이지 않으므로** 실패하면 `snapshot`을 다시 실행하고 새 ref를 사용하세요.
- role 스냅샷`--frame`으로 생성된 경우 role ref는 다음 role 스냅샷까지 해당 iframe 범위로 제한됩니다.
## wait 기능 강화
## Wait 확장 기능
시간/텍스트 외에도 다양한 조건을 기다릴 수 있습니다:
시간/텍스트 외에도 더 많은 조건을 기다릴 수 있습니다:
- URL 대기(Playwright glob 지원):
- URL 대기(Playwright가 지원하는 glob 사용 가능):
- `openclaw browser wait --url "**/dash"`
- 로드 상태 대기:
- `openclaw browser wait --load networkidle`
- JS predicate 대기:
- `openclaw browser wait --fn "window.ready===true"`
- 선택자가 보이게 될 때까지 대기:
- 선택자가 표시될 때까지 대기:
- `openclaw browser wait "#main"`
이들은 조합해서 사용할 수 있습니다:
이들은 함께 조합할 수 있습니다:
```bash
openclaw browser wait "#main" \
@ -765,19 +782,19 @@ openclaw browser wait "#main" \
작업이 실패할 때(예: “not visible”, “strict mode violation”, “covered”):
1. `openclaw browser snapshot --interactive`
2. `click <ref>` / `type <ref>` 사용(interactive 모드에서는 role ref 권장)
3. 여전히 실패하면: `openclaw browser highlight <ref>`로 Playwright가 무엇을 대상으로 는지 확인
2. `click <ref>` / `type <ref>` 사용(대화형 모드에서는 role ref 권장)
3. 그래도 실패하면: `openclaw browser highlight <ref>`로 Playwright가 무엇을 대상으로 는지 확인
4. 페이지 동작이 이상하면:
- `openclaw browser errors --clear`
- `openclaw browser requests --filter api --clear`
5. 심층 디버깅이 필요하면 trace를 기록:
5. 깊이 있는 디버깅을 위해 trace 기록:
- `openclaw browser trace start`
- 문제 재현
- `openclaw browser trace stop`(`TRACE:<path>` 출력)
- `openclaw browser trace stop` (`TRACE:<path>` 출력)
## JSON 출력
`--json`은 스크립팅 구조화된 도구용입니다.
`--json`은 스크립팅 구조화된 도구용입니다.
예시:
@ -788,16 +805,16 @@ openclaw browser requests --filter api --json
openclaw browser cookies --json
```
JSON의 role 스냅샷에는 `refs`함께 작은 `stats` 블록(lines/chars/refs/interactive)이 포함되므로 도구가 페이로드 크기와 밀도를 판단할 수 있습니다.
JSON의 role 스냅샷에는 `refs`와 작은 `stats` 블록(lines/chars/refs/interactive)이 포함되어 있어 도구가 페이로드 크기와 밀도를 판단할 수 있습니다.
## 상태 및 환경 옵션
## 상태 및 환경 설정
이들은 “사이트가 X처럼 동작하게 만들기” 유형의 워크플로에 유용합니다:
기능들은 “사이트가 X처럼 동작하게 만들기” 워크플로에 유용합니다:
- 쿠키: `cookies`, `cookies set`, `cookies clear`
- 저장소: `storage local|session get|set|clear`
- 스토리지: `storage local|session get|set|clear`
- 오프라인: `set offline on|off`
- 헤더: `set headers --headers-json '{"X-Debug":"1"}'`(레거시 `set headers --json '{"X-Debug":"1"}'`도 계속 지원)
- 헤더: `set headers --headers-json '{"X-Debug":"1"}'` (레거시 `set headers --json '{"X-Debug":"1"}'`도 계속 지원)
- HTTP basic auth: `set credentials user pass`(또는 `--clear`)
- 위치 정보: `set geo <lat> <lon> --origin "https://example.com"`(또는 `--clear`)
- 미디어: `set media dark|light|no-preference|none`
@ -808,15 +825,15 @@ JSON의 role 스냅샷에는 `refs`와 함께 작은 `stats` 블록(lines/chars/
## 보안 및 개인정보 보호
- openclaw 브라우저 프로필에는 로그인된 세션이 포함될 수 있으므로 민감하게 취급하세요.
- `browser act kind=evaluate` / `openclaw browser evaluate` `wait --fn`
페이지 컨텍스트에서 임의 JavaScript를 실행합니다. 프롬프트 인젝션으로
것이 유도될 수 있습니다. 필요 없다면 `browser.evaluateEnabled=false`로 비활성화하세요.
- 로그인 및 안티봇 참고 사항(X/Twitter 등)은 [Browser login + X/Twitter posting](/tools/browser-login)을 참조하세요.
- openclaw 브라우저 프로필에는 로그인된 세션이 포함될 수 있으므로 민감한 것으로 취급하세요.
- `browser act kind=evaluate` / `openclaw browser evaluate` `wait --fn`
페이지 컨텍스트에서 임의 JavaScript를 실행합니다. 프롬프트 인젝션
를 유도할 수 있습니다. 필요하지 않다면 `browser.evaluateEnabled=false`로 비활성화하세요.
- 로그인 및 안티봇 참고 사항(X/Twitter 등)은 [브라우저 로그인 + X/Twitter 게시](/ko/tools/browser-login)를 참조하세요.
- Gateway/node host는 비공개 상태(루프백 또는 tailnet 전용)로 유지하세요.
- 원격 CDP 엔드포인트는 강력하므로 터널링하고 보호해야 합니다.
- 원격 CDP 엔드포인트는 강력하므로 터널링하고 보호하세요.
엄격 모드 예시(기본적으로 private/internal 대상 차단):
엄격 모드 예시(기본적으로 비공개/내부 목적지 차단):
```json5
{
@ -833,10 +850,10 @@ JSON의 role 스냅샷에는 `refs`와 함께 작은 `stats` 블록(lines/chars/
## 문제 해결
Linux 전용 문제(특히 snap Chromium)는
[브라우저 문제 해결](/tools/browser-linux-troubleshooting)을 참조하세요.
[브라우저 문제 해결](/ko/tools/browser-linux-troubleshooting)을 참조하세요.
WSL2 Gateway + Windows Chrome 분리 호스트 구성
[WSL2 + Windows + remote Chrome CDP 문제 해결](/tools/browser-wsl2-windows-remote-cdp-troubleshooting)을 참조하세요.
WSL2 Gateway + Windows Chrome 분리 호스트 설정
[WSL2 + Windows + 원격 Chrome CDP 문제 해결](/ko/tools/browser-wsl2-windows-remote-cdp-troubleshooting)을 참조하세요.
## 에이전트 도구 + 제어 방식
@ -847,19 +864,19 @@ WSL2 Gateway + Windows Chrome 분리 호스트 구성은
매핑 방식:
- `browser snapshot`은 안정적인 UI 트리(AI 또는 ARIA)를 반환합니다.
- `browser act`는 스냅샷 `ref` ID를 사용해 클릭/입력/드래그/선택을 수행합니다.
- `browser act`는 스냅샷 `ref` ID를 사용해 클릭/입력/드래그/선택을 수행합니다.
- `browser screenshot`은 픽셀을 캡처합니다(전체 페이지 또는 요소).
- `browser`는 다음을 받습니다:
- `profile`: 이름 있는 브라우저 프로필 선택(openclaw, chrome 또는 remote CDP).
- `target` (`sandbox` | `host` | `node`): 브라우저가 존재하는 위치 선택.
- 이름 있는 브라우저 프로필(openclaw, chrome 또는 원격 CDP)을 선택하는 `profile`
- 브라우저가 어디에 있는지 선택하는 `target` (`sandbox` | `host` | `node`)
- 샌드박스 세션에서 `target: "host"``agents.defaults.sandbox.browser.allowHostControl=true`가 필요합니다.
- `target`이 생략되면: 샌드박스 세션은 기본적으로 `sandbox`, 비샌드박스 세션은 기본적으로 `host`.
- 브라우저 기능이 있는 노드가 연결되어 있으면 `target="host"` 또는 `target="node"`로 고정하지 않는 한 도구가 자동 라우팅될 수 있습니다.
- `target`이 생략되면 샌드박스 세션은 기본적으로 `sandbox`, 비샌드박스 세션은 기본적으로 `host`를 사용합니다.
- 브라우저 사용 가능한 노드가 연결되어 있으면 `target="host"` 또는 `target="node"`로 고정하지 않는 한 도구가 자동으로 그 노드로 라우팅될 수 있습니다.
렇게 하면 에이전트 동작이 결정적으로 유지되고 깨지기 쉬운 선택자를 피할 수 있습니다.
방식은 에이전트를 결정적으로 유지하고 깨지기 쉬운 선택자를 피하게 합니다.
## 관련 항목
## 관련 문서
- [도구 개요](/tools) — 사용 가능한 모든 에이전트 도구
- [도구 개요](/ko/tools) — 사용 가능한 모든 에이전트 도구
- [샌드박싱](/ko/gateway/sandboxing) — 샌드박스 환경에서의 브라우저 제어
- [보안](/ko/gateway/security) — 브라우저 제어 위험 및 강화 방법
- [보안](/ko/gateway/security) — 브라우저 제어 위험 및 강화