Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Heartbeat와 Cron? 각각을 언제 사용할지에 대한 지침은 자동화를 참조하세요.
빠른 시작(초보자)
Pick a cadence
Heartbeat를 활성화된 상태로 두거나(기본값은
30m, 또는 Claude CLI 재사용을 포함한 Anthropic OAuth/token 인증의 경우 1h) 원하는 주기를 설정하세요.Decide where heartbeat messages should go
target: "none"이 기본값입니다. 마지막 연락처로 라우팅하려면 target: "last"를 설정하세요.기본값
- 간격:
30m(또는 Claude CLI 재사용을 포함해 Anthropic OAuth/token 인증이 감지된 인증 모드인 경우1h).agents.defaults.heartbeat.every또는 에이전트별agents.list[].heartbeat.every를 설정하세요. 비활성화하려면0m을 사용하세요. - 프롬프트 본문(
agents.defaults.heartbeat.prompt로 구성 가능):Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK. - Heartbeat 프롬프트는 사용자 메시지로 그대로 전송됩니다. Heartbeat가 기본 에이전트에 대해 활성화된 경우에만 시스템 프롬프트에 “Heartbeat” 섹션이 포함되며, 실행은 내부적으로 플래그 처리됩니다.
- Heartbeat가
0m으로 비활성화되면, 일반 실행에서도 모델이 Heartbeat 전용 지침을 보지 않도록 부트스트랩 컨텍스트에서HEARTBEAT.md를 제외합니다. - 활성 시간(
heartbeat.activeHours)은 구성된 시간대에서 확인됩니다. 창 밖에서는 Heartbeat가 해당 창 안의 다음 틱까지 건너뜁니다. - Heartbeat는 Cron 작업이 활성 상태이거나 대기 중이면 자동으로 지연됩니다.
heartbeat.skipWhenBusy: true를 설정하면 에이전트 자체의 세션 키 기반 하위 에이전트나 중첩 명령 레인에서도 해당 에이전트를 지연합니다. 형제 에이전트는 다른 에이전트에 진행 중인 하위 에이전트 작업이 있다는 이유만으로 더 이상 일시 중지되지 않습니다.
Heartbeat 프롬프트의 용도
기본 프롬프트는 의도적으로 폭넓게 설계되었습니다.- 백그라운드 작업: “Consider outstanding tasks”는 에이전트가 후속 조치(받은 편지함, 캘린더, 미리 알림, 대기 중인 작업)를 검토하고 긴급한 사항을 드러내도록 유도합니다.
- 사람 체크인: “Checkup sometimes on your human during day time”는 가끔 가벼운 “필요한 것이 있나요?” 메시지를 유도하지만, 구성된 현지 시간대를 사용해 야간 스팸을 피합니다(시간대 참조).
agents.defaults.heartbeat.prompt(또는 agents.list[].heartbeat.prompt)를 사용자 지정 본문으로 설정하세요(그대로 전송됨).
응답 계약
- 주의가 필요한 사항이 없으면 **
HEARTBEAT_OK**로 답하세요. - 도구를 사용할 수 있는 Heartbeat 실행은 표시되는 업데이트가 없을 때
notify: false로heartbeat_respond를 호출하거나, 알림을 위해notify: true와notificationText를 함께 호출할 수 있습니다. 구조화된 도구 응답이 있으면 텍스트 폴백보다 우선합니다. - Heartbeat 실행 중 OpenClaw는 답변의 시작 또는 끝에 나타나는
HEARTBEAT_OK를 ack로 처리합니다. 해당 토큰은 제거되며, 남은 콘텐츠가 ≤ackMaxChars(기본값: 300)이면 답변은 버려집니다. HEARTBEAT_OK가 답변의 중간에 나타나면 특별하게 처리되지 않습니다.- 알림의 경우
HEARTBEAT_OK를 포함하지 마세요. 알림 텍스트만 반환하세요.
HEARTBEAT_OK가 제거되고 로그에 기록됩니다. HEARTBEAT_OK만 있는 메시지는 버려집니다.
구성
범위와 우선순위
agents.defaults.heartbeat는 전역 Heartbeat 동작을 설정합니다.agents.list[].heartbeat는 그 위에 병합됩니다. 어떤 에이전트든heartbeat블록이 있으면 해당 에이전트들만 Heartbeat를 실행합니다.channels.defaults.heartbeat는 모든 채널의 표시 기본값을 설정합니다.channels.<channel>.heartbeat는 채널 기본값을 재정의합니다.channels.<channel>.accounts.<id>.heartbeat(다중 계정 채널)는 채널별 설정을 재정의합니다.
에이전트별 Heartbeat
agents.list[] 항목 중 하나라도 heartbeat 블록을 포함하면 해당 에이전트들만 Heartbeat를 실행합니다. 에이전트별 블록은 agents.defaults.heartbeat 위에 병합됩니다(따라서 공유 기본값을 한 번 설정하고 에이전트별로 재정의할 수 있습니다).
예: 에이전트 두 개 중 두 번째 에이전트만 Heartbeat를 실행합니다.
활성 시간 예시
특정 시간대의 업무 시간으로 Heartbeat를 제한합니다.24/7 설정
Heartbeat를 하루 종일 실행하려면 다음 패턴 중 하나를 사용하세요.activeHours를 완전히 생략합니다(시간 창 제한 없음. 이것이 기본 동작입니다).- 하루 전체 창을 설정합니다:
activeHours: { start: "00:00", end: "24:00" }.
다중 계정 예시
Telegram 같은 다중 계정 채널에서 특정 계정을 대상으로 지정하려면accountId를 사용하세요.
필드 참고 사항
Heartbeat 간격(기간 문자열, 기본 단위 = 분).
Heartbeat 실행을 위한 선택적 모델 재정의(
provider/model).활성화하면 사용 가능한 경우 별도의
Reasoning: 메시지도 전달합니다(/reasoning on과 동일한 형태).true이면 Heartbeat 실행은 가벼운 부트스트랩 컨텍스트를 사용하고 워크스페이스 부트스트랩 파일에서
HEARTBEAT.md만 유지합니다.true이면 각 Heartbeat가 이전 대화 기록이 없는 새 세션에서 실행됩니다. Cron
sessionTarget: "isolated"와 동일한 격리 패턴을 사용합니다. Heartbeat당 토큰 비용을 크게 줄입니다. 최대 절감을 위해 lightContext: true와 함께 사용하세요. 전달 라우팅은 여전히 메인 세션 컨텍스트를 사용합니다.true이면 Heartbeat 실행은 해당 에이전트의 추가 바쁜 레인, 즉 자체 세션 키 기반 하위 에이전트 또는 중첩 명령 작업에서도 지연됩니다. Cron 레인은 이 플래그가 없어도 항상 Heartbeat를 지연하므로, 로컬 모델 호스트가 Cron과 Heartbeat 프롬프트를 동시에 실행하지 않습니다.
Heartbeat 실행을 위한 선택적 세션 키입니다.
main(기본값): 에이전트 메인 세션.- 명시적 세션 키(
openclaw sessions --json또는 sessions CLI에서 복사). - 세션 키 형식: 세션 및 그룹을 참조하세요.
last: 마지막으로 사용한 외부 채널로 전달합니다.- 명시적 채널: 구성된 채널 또는 Plugin id. 예:
discord,matrix,telegram,whatsapp. none(기본값): Heartbeat를 실행하지만 외부로는 전달하지 않습니다.
direct/DM 전달 동작을 제어합니다.
allow: direct/DM Heartbeat 전달을 허용합니다. block: direct/DM 전달을 억제합니다(reason=dm-blocked).선택적 수신자 재정의(채널별 id, 예: WhatsApp의 E.164 또는 Telegram chat id). Telegram topic/thread의 경우
<chatId>:topic:<messageThreadId>를 사용하세요.다중 계정 채널을 위한 선택적 계정 id입니다.
target: "last"인 경우, 계정을 지원하면 계정 id가 확인된 마지막 채널에 적용되고, 그렇지 않으면 무시됩니다. 계정 id가 확인된 채널에 구성된 계정과 일치하지 않으면 전달은 건너뜁니다.기본 프롬프트 본문을 재정의합니다(병합되지 않음).
전달 전에
HEARTBEAT_OK 뒤에 허용되는 최대 문자 수입니다.true이면 Heartbeat 실행 중 도구 오류 경고 페이로드를 숨깁니다.
Heartbeat 실행을 시간 창으로 제한합니다.
start(HH:MM, 포함; 하루 시작에는 00:00 사용), end(HH:MM 제외; 하루 끝에는 24:00 허용), 선택 사항인 timezone이 있는 객체입니다.- 생략하거나
"user": 설정되어 있으면agents.defaults.userTimezone을 사용하고, 그렇지 않으면 호스트 시스템 시간대로 대체합니다. "local": 항상 호스트 시스템 시간대를 사용합니다.- 모든 IANA 식별자(예:
America/New_York): 직접 사용되며, 유효하지 않으면 위의"user"동작으로 대체합니다. - 활성 창에서는
start와end가 같으면 안 됩니다. 같은 값은 너비가 0인 것으로 처리됩니다(항상 창 밖). - 활성 창 밖에서는 창 안의 다음 틱까지 Heartbeat를 건너뜁니다.
전달 동작
세션 및 대상 라우팅
세션 및 대상 라우팅
- Heartbeat는 기본적으로 에이전트의 기본 세션(
agent:<id>:<mainKey>)에서 실행되며,session.scope = "global"이면global에서 실행됩니다. 특정 채널 세션(Discord/WhatsApp 등)으로 재정의하려면session을 설정하세요. session은 실행 컨텍스트에만 영향을 줍니다. 전달은target과to로 제어됩니다.- 특정 채널/수신자에게 전달하려면
target+to를 설정하세요.target: "last"를 사용하면 전달은 해당 세션의 마지막 외부 채널을 사용합니다. - Heartbeat 전달은 기본적으로 직접/DM 대상을 허용합니다. Heartbeat 턴은 계속 실행하면서 직접 대상 전송을 숨기려면
directPolicy: "block"을 설정하세요. - 기본 큐, 대상 세션 레인, cron 레인 또는 활성 cron 작업이 사용 중이면 Heartbeat를 건너뛰고 나중에 다시 시도합니다.
skipWhenBusy: true이면 이 에이전트의 세션 키 기반 하위 에이전트와 중첩 레인도 Heartbeat 실행을 연기합니다. 다른 에이전트의 사용 중인 레인은 이 에이전트를 연기하지 않습니다.target이 외부 대상으로 해석되지 않으면 실행은 계속되지만 outbound 메시지는 전송되지 않습니다.
가시성 및 건너뛰기 동작
가시성 및 건너뛰기 동작
showOk,showAlerts,useIndicator가 모두 비활성화되어 있으면 실행은 시작 전에reason=alerts-disabled로 건너뜁니다.- 알림 전달만 비활성화되어 있으면 OpenClaw는 여전히 Heartbeat를 실행하고, 만기 작업 타임스탬프를 업데이트하고, 세션 유휴 타임스탬프를 복원하고, 외부 알림 페이로드를 숨길 수 있습니다.
- 해석된 Heartbeat 대상이 입력 표시를 지원하면 OpenClaw는 Heartbeat 실행이 활성 상태인 동안 입력 중 표시를 보여줍니다. 이는 Heartbeat가 채팅 출력을 보낼 대상과 같은 대상을 사용하며,
typingMode: "never"로 비활성화됩니다.
세션 수명 주기 및 감사
세션 수명 주기 및 감사
- Heartbeat 전용 답장은 세션을 활성 상태로 유지하지 않습니다. Heartbeat 메타데이터가 세션 행을 업데이트할 수는 있지만, 유휴 만료는 마지막 실제 사용자/채널 메시지의
lastInteractionAt을 사용하고, 일일 만료는sessionStartedAt을 사용합니다. - 제어 UI와 WebChat 기록은 Heartbeat 프롬프트와 OK 전용 확인 응답을 숨깁니다. 기본 세션 transcript에는 감사/재생을 위해 해당 턴이 여전히 포함될 수 있습니다.
- 분리된 백그라운드 작업은 기본 세션이 무언가를 빠르게 알아야 할 때 시스템 이벤트를 큐에 넣고 Heartbeat를 깨울 수 있습니다. 이 깨우기는 Heartbeat 실행을 백그라운드 작업으로 만들지 않습니다.
가시성 제어
기본적으로 알림 콘텐츠는 전달되지만HEARTBEAT_OK 확인 응답은 숨겨집니다. 이를 채널별 또는 계정별로 조정할 수 있습니다.
각 플래그의 역할
showOk: 모델이 OK 전용 답장을 반환하면HEARTBEAT_OK확인 응답을 보냅니다.showAlerts: 모델이 OK가 아닌 답장을 반환하면 알림 콘텐츠를 보냅니다.useIndicator: UI 상태 surface용 indicator 이벤트를 내보냅니다.
채널별 및 계정별 예시
일반적인 패턴
| 목표 | 구성 |
|---|---|
| 기본 동작(OK는 조용히, 알림은 켜짐) | (구성 필요 없음) |
| 완전히 조용함(메시지 없음, indicator 없음) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Indicator 전용(메시지 없음) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| 한 채널에서만 OK 표시 | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md(선택 사항)
작업 영역에HEARTBEAT.md 파일이 있으면 기본 프롬프트는 에이전트에게 이 파일을 읽으라고 지시합니다. 이것을 30분마다 포함해도 안전한 작고 안정적인 “Heartbeat 체크리스트”라고 생각하면 됩니다.
일반 실행에서는 기본 에이전트에 대해 Heartbeat 지침이 활성화된 경우에만 HEARTBEAT.md가 주입됩니다. Heartbeat 주기를 0m로 비활성화하거나 includeSystemPromptSection: false를 설정하면 일반 bootstrap 컨텍스트에서 제외됩니다.
HEARTBEAT.md가 존재하지만 사실상 비어 있으면(빈 줄과 # Heading 같은 markdown 헤더만 있음) OpenClaw는 API 호출을 절약하기 위해 Heartbeat 실행을 건너뜁니다. 이 건너뛰기는 reason=empty-heartbeat-file로 보고됩니다. 파일이 없으면 Heartbeat는 계속 실행되고 모델이 수행할 작업을 결정합니다.
프롬프트 비대화를 피하려면 아주 작게 유지하세요(짧은 체크리스트나 알림).
HEARTBEAT.md 예시:
tasks: 블록
HEARTBEAT.md는 Heartbeat 자체 안에서 간격 기반 확인을 수행하기 위한 작은 구조화된 tasks: 블록도 지원합니다.
예시:
동작
동작
- OpenClaw는
tasks:블록을 파싱하고 각 작업을 자체interval에 대해 확인합니다. - 만기된 작업만 해당 틱의 Heartbeat 프롬프트에 포함됩니다.
- 만기된 작업이 없으면 낭비되는 모델 호출을 피하기 위해 Heartbeat를 완전히 건너뜁니다(
reason=no-tasks-due). HEARTBEAT.md의 작업이 아닌 콘텐츠는 보존되며 만기 작업 목록 뒤에 추가 컨텍스트로 덧붙습니다.- 작업의 마지막 실행 타임스탬프는 세션 상태(
heartbeatTaskState)에 저장되므로 일반적인 재시작 후에도 간격이 유지됩니다. - 작업 타임스탬프는 Heartbeat 실행이 정상 답장 경로를 완료한 후에만 갱신됩니다. 건너뛴
empty-heartbeat-file/no-tasks-due실행은 작업을 완료된 것으로 표시하지 않습니다.
에이전트가 HEARTBEAT.md를 업데이트할 수 있나요?
예. 요청하면 가능합니다.HEARTBEAT.md는 에이전트 작업 영역의 일반 파일일 뿐이므로 일반 채팅에서 에이전트에게 다음과 같이 말할 수 있습니다.
- “
HEARTBEAT.md를 업데이트해서 일일 캘린더 확인을 추가해.” - “
HEARTBEAT.md를 더 짧고 받은 편지함 후속 조치에 집중하도록 다시 작성해.”
수동 깨우기(온디맨드)
다음으로 시스템 이벤트를 큐에 넣고 즉시 Heartbeat를 트리거할 수 있습니다.heartbeat가 구성되어 있으면 수동 깨우기는 해당 에이전트들의 Heartbeat를 각각 즉시 실행합니다.
다음 예약된 틱까지 기다리려면 --mode next-heartbeat를 사용하세요.
추론 전달(선택 사항)
기본적으로 Heartbeat는 최종 “answer” 페이로드만 전달합니다. 투명성이 필요하면 다음을 활성화하세요.agents.defaults.heartbeat.includeReasoning: true
Reasoning: 접두사가 붙은 별도 메시지도 전달합니다(/reasoning on과 같은 형태). 에이전트가 여러 세션/codex를 관리하고 있고 왜 당신에게 ping하기로 결정했는지 보고 싶을 때 유용할 수 있지만, 원하는 것보다 더 많은 내부 세부 정보를 유출할 수도 있습니다. 그룹 채팅에서는 꺼 두는 것을 권장합니다.
비용 인식
Heartbeat는 전체 에이전트 턴을 실행합니다. 간격이 짧을수록 더 많은 토큰을 소모합니다. 비용을 줄이려면:- 전체 대화 기록 전송을 피하려면
isolatedSession: true를 사용하세요(실행당 약 100K 토큰에서 약 2~5K로 감소). - bootstrap 파일을
HEARTBEAT.md로만 제한하려면lightContext: true를 사용하세요. - 더 저렴한
model을 설정하세요(예:ollama/llama3.2:1b). HEARTBEAT.md를 작게 유지하세요.- 내부 상태 업데이트만 원하면
target: "none"을 사용하세요.
Heartbeat 이후 컨텍스트 오버플로
이전에 Heartbeat가 기존 세션을 더 작은 로컬 모델(예: 32k 창을 가진 Ollama 모델)에 남겨 두었고 다음 기본 세션 턴에서 컨텍스트 오버플로가 보고되면, 세션 런타임 모델을 구성된 기본 모델로 다시 재설정하세요. 마지막 런타임 모델이 구성된heartbeat.model과 일치하면 OpenClaw의 재설정 메시지가 이를 명시합니다.
현재 Heartbeat는 실행이 완료된 후 공유 세션의 기존 런타임 모델을 보존합니다. 여전히 isolatedSession: true를 사용해 새로운 세션에서 Heartbeat를 실행하거나, 가장 작은 프롬프트를 위해 lightContext: true와 결합하거나, 공유 세션에 충분히 큰 컨텍스트 창을 가진 Heartbeat 모델을 선택할 수 있습니다.