Messages and delivery
진행 상황 초안
진행 상황 초안은 에이전트가 작업하는 동안 여러 개의 임시 "아직 작업 중" 답글을 쌓는 대신, 하나의 채널 메시지를 실시간 상태 표시줄로 바꿉니다. channels.<channel>.streaming.mode: "progress"을 설정하면 OpenClaw는 실제 작업이 시작될 때 메시지를 생성하고, 에이전트가 읽거나, 계획하거나, 도구를 호출하거나, 승인을 기다리는 동안 메시지를 수정한 다음, 이를 최종 답변으로 바꿉니다.
작업 중...📖 docs/concepts/progress-drafts.md에서 읽는 중🔎 Web Search: "discord edit message" 검색🛠️ Bash: 테스트 실행빠른 시작
{ channels: { discord: { streaming: { mode: "progress", }, }, },}이 구성의 기본값은 5초의 시작 지연, 유용한 작업이 진행되는 동안 표시되는 간결한 진행 상황 줄, 해당 턴에서 이전의 독립형 진행 상황 메시지 억제입니다. 원시 도구 줄 초안에는 자동으로 한 단어 레이블이 사용됩니다. 상태 헤드라인은 명시적으로 구성하지 않는 한 중복되는 해당 제목을 생략합니다.
이 페이지에서는 진행 상황 초안의 사용자 경험과 구성 옵션을 다룹니다. 전체 스트리밍 모드 매트릭스, 채널별 런타임 참고 사항, 레거시 키 마이그레이션은 스트리밍 및 청킹을 참조하십시오.
사용자에게 표시되는 내용
| 부분 | 목적 |
|---|---|
| 상태 헤드라인 | Discord와 Telegram에서는 모델 프리앰블이며, Discord는 유틸리티 보충 문구를 추가합니다. |
| 레이블 | Working과 같은 선택적 시작/상태 줄입니다. |
| 진행 상황 줄 | /verbose과 동일한 도구 아이콘 및 세부 정보 포매터를 사용하는 간결한 실행 업데이트입니다. |
원시 도구 진행 상황의 경우 에이전트가 의미 있는 작업을 시작하고 초기 지연 시간 동안 계속 작업하면 레이블이 표시됩니다.
레이블은 순환하는 진행 상황 줄 목록의 맨 위에 있으므로, 구체적인 작업 줄이 충분히 표시되면 스크롤되어 사라집니다. 상태 헤드라인에는 레이블을 명시적으로 구성하지 않는 한 에이전트의 일반 언어 상태만 표시됩니다. 일반 텍스트로만 구성된 답글에는 진행 상황 초안이 표시되지 않습니다. 줄은 🛠️ Bash: run tests, 🔎 Web Search: for "discord edit message", ✍️ Write: to /tmp/file과 같은 실제 작업 업데이트에만 표시됩니다.
채널에서 안전하게 처리할 수 있으면 최종 답변이 초안을 그 자리에서 대체합니다. 그렇지 않으면 OpenClaw는 일반 전송 방식으로 최종 답변을 보내고 초안을 정리하거나 업데이트를 중지합니다(마무리 참조).
모드 선택
channels.<channel>.streaming.mode은 사용자에게 표시되는 진행 중 동작을 제어합니다.
| 모드 | 적합한 용도 | 채팅에 표시되는 내용 |
|---|---|---|
off |
조용한 채널 | 최종 답변만 표시됩니다. |
partial |
답변 텍스트가 나타나는 과정 확인 | 최신 답변 텍스트로 수정되는 하나의 초안입니다. |
block |
더 큰 답변 미리 보기 청크 | 더 큰 청크 단위로 업데이트되거나 추가되는 하나의 미리 보기입니다. |
progress |
도구를 많이 사용하거나 오래 실행되는 턴 | 하나의 상태 초안이 표시된 후 최종 답변이 표시됩니다. |
사용자가 답변 텍스트가 토큰 단위로 스트리밍되는 모습을 보는 것보다 "무슨 일이 진행 중인지"를 더 중요하게 여긴다면 progress을 선택하십시오. 답변 텍스트 자체가 진행 상황 신호라면 partial을, 더 큰 미리 보기 청크에는 block을 선택하십시오. Discord와 Telegram에서 streaming.mode: "block"은 여전히 미리 보기 스트리밍이며 일반 블록 답글 전송이 아닙니다. 일반 블록 답글 전송에는 streaming.block.enabled을 사용하십시오.
레이블 구성
진행 상황 레이블은 channels.<channel>.streaming.progress 아래에 있습니다. 기본 원시 도구 줄 레이블은 "auto"이며, 일반 기본 제공 Working 레이블을 사용합니다. 상태 헤드라인은 이 암시적 레이블을 숨깁니다. 상태 헤드라인 위에도 레이블을 표시하려면 label: "auto"을 명시적으로 설정하십시오.
작업 중고정 레이블을 사용합니다.
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "조사 중", }, }, }, },}자체 레이블 풀을 사용합니다(label: "auto"인 경우에도 무작위/시드에 따라 선택됨).
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "auto", labels: ["확인 중", "읽는 중", "테스트 중", "마무리 중"], }, }, }, },}레이블을 숨기고 진행 상황 줄만 표시합니다.
{ channels: { discord: { streaming: { mode: "progress", progress: { label: false, }, }, }, },}진행 상황 줄 제어
진행 상황 줄은 도구 시작, 항목 업데이트, 작업 계획, 승인, 명령 출력, 패치 요약 및 이와 유사한 에이전트 활동 등 실제 실행 이벤트에서 생성됩니다. 기본적으로 활성화되어 있습니다(progress.toolProgress, 기본값 true).
도구는 단일 호출이 계속 실행 중인 동안에도 형식이 지정된 진행 상황을 내보낼 수 있습니다. 이를 통해 느린 가져오기나 검색이 최종 결과를 반환하기 전에 사용자에게 표시되는 초안을 업데이트할 수 있습니다. 진행 상황 업데이트는 모델 콘텐츠가 비어 있고 명시적인 공개 채널 메타데이터가 포함된 부분 도구 결과입니다.
{ "content": [], "progress": { "text": "페이지 콘텐츠 가져오는 중...", "visibility": "channel", "privacy": "public", "id": "web_fetch:fetching" }}OpenClaw는 채널 진행 상황 UI에서 progress.text만 렌더링합니다. 일반 도구 결과는 나중에 content/details로 계속 도착하며, 모델에 반환되는 유일한 부분입니다.
도구에 진행 상황을 추가할 때는 짧고 일반적인 메시지를 내보내고, 작업이 유용할 만큼 충분히 오래 대기 중인 경우에만 표시되도록 지연하십시오. web_fetch은 5초의 지연을 두고 정확히 이 작업을 수행합니다.
const clearProgressTimer = scheduleToolProgress( onUpdate, { text: "페이지 콘텐츠 가져오는 중...", id: "web_fetch:fetching" }, 5_000, { signal },); try { return await runToolWork();} finally { clearProgressTimer();}빠른 호출에는 진행 상황 줄이 표시되지 않습니다. 오래 걸리는 호출에는 대기 중인 동안 진행 상황 줄이 표시됩니다. 취소된 호출은 오래된 진행 상황이 표시되기 전에 타이머를 지웁니다. 진행 상황 텍스트는 공개 UI 보조 채널이므로 비밀, 원시 인수, 가져온 콘텐츠, 명령 출력 또는 페이지 텍스트를 절대 포함해서는 안 됩니다.
세부 정보 모드
OpenClaw는 진행 상황 초안과 /verbose에 동일한 포매터를 사용합니다.
{ agents: { defaults: { toolProgressDetail: "explain", // explain | raw }, },}"explain"은 기본값이며 간결한 레이블을 사용해 초안을 안정적으로 유지합니다.
"raw"은 사용할 수 있는 경우 내부 명령을 추가합니다. 디버깅할 때 유용하지만 채팅에서는 더 번잡합니다. 예를 들어 node --check /tmp/app.js 호출은 모드에 따라 다르게 렌더링됩니다.
| 모드 | 진행 상황 줄 |
|---|---|
explain |
🛠️ check js syntax for /tmp/app.js |
raw |
🛠️ check js syntax for /tmp/app.js · node --check /tmp/app.js |
명령/실행 텍스트
streaming.progress.commandText(기본값 "raw")은 위의 세부 정보 모드와 별개로 exec/bash 진행 상황 줄 옆에 표시되는 명령 세부 정보의 양을 제어합니다. 명령 텍스트를 완전히 숨기면서 도구 진행 상황 줄은 계속 표시하려면 "status"로 설정하십시오.
{ channels: { discord: { streaming: { mode: "progress", progress: { commandText: "status", }, }, }, },}해설 레인
streaming.progress.commentary(기본값 false)은 모델이 도구 사용 전에 제공하는 해설/프리앰블 설명(💬, 예: "먼저 확인한 다음...")을 초안의 도구 줄 사이에 배치합니다. 채널 간 공유 구성 형태는 스트리밍 및 청킹을 참조하십시오.
해설 레인이 활성화되면 프리앰블은 이러한 중간 삽입 💬 줄로만 렌더링됩니다. 아래의 상태 헤드라인은 표시되지 않으므로 레인이 문서화된 형태를 유지합니다.
상태 헤드라인
Discord와 Telegram의 진행 상황 모드에서는 모델이 도구 사용 전에 형식이 지정된 프리앰블을 제공할 경우 해당 프리앰블이 초안의 상태 헤드라인이 됩니다. 다른 진행 상황 모드 채널은 기존 상태 동작을 유지합니다. 헤드라인은 기본적으로 활성화되어 있으며 짧은 턴에서 일반적인 활동 게이트를 우회하지 않습니다. streaming.progress.commentary을 활성화하면 프리앰블이 대신 중간 삽입 해설 레인으로 전달됩니다.
Discord에서 에이전트에 사용할 유틸리티 모델이 결정되면(명시적인 utilityModel 또는 주 공급자가 선언한 소형 모델 기본값(OpenAI → gpt-5.6-luna, Anthropic → claude-haiku-4-5)), 모델이 프리앰블을 내보내지 않거나 약 20초 동안 응답이 없을 때 짧은 일반 언어 보충 문구를 제공합니다(Telegram의 헤드라인은 현재 프리앰블만 사용합니다).
구성의 기본 모델을 업데이트한 다음, 변경 사항을 적용하기 위해 Gateway를 다시 시작하는 중입니다.에이전트 목록 조회 호출 하나가 실패하여 다시 시도하고 있습니다.유틸리티 설명은 기본적으로 활성화되어 있으며(streaming.progress.narration, 기본값 true) 주 모델로 절대 대체되지 않습니다. 에이전트의 주 공급자에 대해 명시적인 utilityModel 또는 공급자가 선언한 기본값이 있는 경우에만 실행됩니다. 유틸리티 라우팅을 완전히 비활성화하려면 utilityModel: ""로 설정하십시오. 도구 줄은 아래에 계속 누적되며 두 상태 소스가 모두 중지되면 다시 표시됩니다. 초안 수정은 일반적인 활동 게이트와 실제 텍스트 변경을 계속 기다립니다. 이를 통해 빠른 턴에서 순간적으로 표시되는 현상을 방지하고 사용량이 많은 채널에서 수정 횟수를 줄입니다. 유틸리티 모델 보충 문구만 비활성화하려면 narration: false로 설정하십시오. 모델 프리앰블 헤드라인은 계속 활성화됩니다.
{ channels: { discord: { streaming: { mode: "progress", progress: { narration: false, }, }, }, },}설명 입력은 제한되고 민감 정보가 제거됩니다. 유틸리티 모델은 수신 요청 텍스트와 초안에 렌더링되는 것과 동일한 간결하고 민감 정보가 제거된 도구 요약을 받으며, 원시 명령 출력이나 도구 결과는 절대 받지 않습니다. commandText: "status"을 사용하면 설명 입력에서도 exec/bash 명령 텍스트가 생략되어 초안에 표시되는 내용과 일치합니다.
줄 제한
표시되는 줄 수를 제한합니다(기본값 8).
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLines: 4, }, }, }, },}초안이 수정되는 동안 채팅 말풍선의 재배치를 줄이기 위해 진행 상황 줄은 자동으로 압축됩니다. 또한 OpenClaw는 초안을 반복해서 수정할 때마다 줄바꿈 위치가 달라지지 않도록 긴 줄을 잘라냅니다. 줄당 기본 제한은 120자입니다. 산문은 단어 경계에서 잘리며, 경로나 원시 명령과 같은 긴 세부 정보는 접미사가 보이도록 가운데 줄임표를 사용해 축약됩니다.
줄당 제한을 조정합니다.
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLineChars: 160, }, }, }, },}리치 렌더링(Slack)
Slack에서는 진행 상황 줄을 일반 텍스트 대신 구조화된 Block Kit 필드로 렌더링할 수 있습니다.
{ channels: { slack: { streaming: { mode: "progress", progress: { render: "rich", }, }, }, },}리치 렌더링은 항상 Block Kit 필드와 함께 동일한 일반 텍스트 본문을 전송하므로, 더 풍부한 형식을 렌더링할 수 없는 클라이언트에서도 간결한 진행 상황 텍스트가 계속 표시됩니다.
도구/작업 줄 숨기기
단일 진행 상황 초안은 유지하면서 도구 및 작업 줄을 숨깁니다.
{ channels: { discord: { streaming: { mode: "progress", progress: { toolProgress: false, }, }, }, },}toolProgress: false을 사용하면 OpenClaw는 해당 턴의 이전 독립 실행형
도구 진행 메시지를 계속 억제합니다. 레이블이 구성된 경우 해당 레이블을 제외하면
최종 답변이 나올 때까지 채널은 시각적으로 조용한 상태를 유지합니다.
채널 동작
| 채널 | 진행 상황 전송 방식 | 참고 |
|---|---|---|
| Discord | 메시지 하나를 보낸 후 편집합니다. | 기본값은 progress 모드입니다. 최종 답변에는 -# 활동 확인 표시가 포함되며, 답변이 게시된 후 상태 초안이 삭제됩니다. |
| Matrix | 이벤트 하나를 보낸 후 편집합니다. | 계정 수준 스트리밍 구성이 계정 수준 초안을 제어합니다. |
| Microsoft Teams | 개인 채팅에서 네이티브 Teams 스트림을 사용합니다. | 대신 streaming.mode: "block"은 Teams 블록 전송에 매핑됩니다. |
| Slack | 네이티브 스트림 또는 편집 가능한 초안 게시물을 사용합니다. | 답글 스레드 대상이 필요합니다. 대상이 없는 최상위 DM에서도 초안 미리보기 게시물과 편집은 계속 제공됩니다. |
| Telegram | 메시지 하나를 보낸 후 편집합니다. | 진행 상황 초안과 답변 사이에 메시지가 게시되면 클라이언트 화면이 갑자기 스크롤되지 않도록 초안을 그 아래에 다시 게시합니다(새 항목 게시 후 이전 항목 삭제). |
| Mattermost | 편집 가능한 초안 게시물을 사용합니다. | block 모드는 완료된 텍스트 게시물과 도구 활동 게시물을 번갈아 표시하며, 다른 모드는 도구 활동을 동일한 초안 형식의 게시물에 포함합니다. |
안전한 편집을 지원하지 않는 채널은 입력 중 표시기 또는 최종 답변만 전송하는 방식으로 대체됩니다. 채널별 전체 런타임 동작 분석은 스트리밍 및 청킹을 참조하십시오.
마무리
최종 답변이 준비되면 OpenClaw는 채팅을 깔끔하게 유지하려고 합니다.
- Discord의
progress모드에서는 최종 답변이 새 메시지로 전송되고, 작은-#활동 확인 표시가 추가되며(예:-# 🧠 2 thoughts · 🛠️ 5 tool calls · ⏱️ 12s), 해당 답변이 전송되면 상태 초안이 삭제됩니다. 사용량이 많은 채널에서도 답글 위에 고립된 도구 로그가 남지 않습니다. 오류로 끝난 경우에는 실패한 턴의 표시 기록으로 초안이 유지됩니다. - 초안을 안전하게 최종 답변으로 바꿀 수 있는 경우(
partial/block모드), OpenClaw는 해당 초안을 그대로 편집합니다. - 채널에서 네이티브 진행 상황 스트리밍을 사용하면 네이티브 전송 방식이 최종 텍스트를 수락할 때 OpenClaw가 해당 스트림을 마무리합니다.
- 그 밖의 경우(미디어, 승인 프롬프트, 명시적 답글 대상, 너무 많은 청크 또는 편집/전송 실패) OpenClaw는 초안을 덮어쓰는 대신 일반 채널 전송 경로를 통해 최종 답변을 전송합니다.
이 대체 동작은 의도된 것입니다. 텍스트가 유실되거나, 답글이 잘못된 스레드에 게시되거나, 채널에서 안전하게 표현할 수 없는 페이로드로 초안을 덮어쓰는 것보다 새 최종 답변을 전송하는 편이 낫습니다.
문제 해결
최종 답변만 표시됩니다.
메시지를 처리한 계정 또는 채널에서 channels.<channel>.streaming.mode이
progress인지 확인하십시오. 일부 그룹 또는 인용 답글 경로에서는
채널이 올바른 메시지를 안전하게 편집할 수 없는 경우 해당 턴의 초안 미리보기가
비활성화됩니다.
레이블은 표시되지만 도구 작업 줄은 표시되지 않습니다.
streaming.progress.toolProgress을 확인하십시오. 이 값이 false이면 OpenClaw는
단일 초안 동작을 유지하지만 도구 및 작업 진행 상황 줄은 숨깁니다.
편집된 초안 대신 새 최종 메시지가 표시됩니다.
이는 마무리에 설명된 안전 대체 동작입니다. 미디어 답글, 긴 답변, 명시적 답글 대상, 오래된 Telegram 초안, 누락된 Slack 스레드 대상, 삭제된 미리보기 메시지 또는 네이티브 스트림 마무리 실패 시 발생할 수 있습니다.
독립 실행형 진행 상황 메시지가 계속 표시됩니다.
진행 상황 모드에서는 초안이 활성화된 동안 기본 독립 실행형 도구 진행 메시지를
억제합니다. 독립 실행형 메시지가 계속 표시되면 해당 턴이 실제로
progress 모드를 사용하고 있으며, streaming.mode: "off" 또는 해당 메시지의
초안을 생성할 수 없는 채널 경로를 사용하고 있지 않은지 확인하십시오.
Teams가 Discord 또는 Telegram과 다르게 동작합니다.
Microsoft Teams는 일반적인 전송 후 편집 방식의 미리보기 전송 대신 개인 채팅에서
네이티브 스트림을 사용하며, Discord 및 Telegram과 같은 초안 미리보기 블록 모드가
없으므로 streaming.mode: "block"을 Teams 블록 전송에 매핑합니다.