프로덕션 환경에서 grammY를 통해 봇 DM과 그룹에 사용할 수 있습니다. 기본 모드는 긴 폴링이며, Webhook 모드는 선택 사항입니다.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.
페어링
Telegram의 기본 DM 정책은 페어링입니다.
채널 문제 해결
채널 간 진단 및 복구 플레이북입니다.
Gateway 구성
전체 채널 구성 패턴과 예시입니다.
빠른 설정
BotFather에서 봇 토큰 만들기
Telegram을 열고 @BotFather와 채팅합니다(핸들이 정확히
@BotFather인지 확인)./newbot을 실행하고 안내를 따른 다음 토큰을 저장합니다.토큰 및 DM 정책 구성
TELEGRAM_BOT_TOKEN=...(기본 계정만 해당).
Telegram은 openclaw channels login telegram을 사용하지 않습니다. config/env에 토큰을 구성한 다음 Gateway를 시작하세요.봇을 그룹에 추가
봇을 그룹에 추가한 다음, 그룹 접근에 필요한 두 ID를 모두 가져옵니다.
allowFrom/groupAllowFrom에서 사용되는 내 Telegram 사용자 IDchannels.telegram.groups아래의 키로 사용되는 Telegram 그룹 채팅 ID
openclaw logs --follow, 전달된 ID 봇, 또는 Bot API getUpdates에서 가져옵니다. 그룹이 허용된 후에는 /whoami@<bot_username>로 사용자 및 그룹 ID를 확인할 수 있습니다.-100으로 시작하는 음수 Telegram 슈퍼그룹 ID는 그룹 채팅 ID입니다. 이를 groupAllowFrom 아래가 아니라 channels.telegram.groups 아래에 넣으세요.토큰 확인 순서는 계정을 인식합니다. 실제로는 config 값이 env 대체값보다 우선하며,
TELEGRAM_BOT_TOKEN은 기본 계정에만 적용됩니다.Telegram 측 설정
개인정보 모드 및 그룹 표시 여부
개인정보 모드 및 그룹 표시 여부
Telegram 봇은 기본적으로 개인정보 모드를 사용하며, 이 모드는 봇이 받는 그룹 메시지를 제한합니다.봇이 모든 그룹 메시지를 확인해야 한다면 다음 중 하나를 수행하세요.
/setprivacy로 개인정보 모드를 비활성화하거나- 봇을 그룹 관리자로 지정합니다.
그룹 권한
그룹 권한
관리자 상태는 Telegram 그룹 설정에서 제어됩니다.관리자 봇은 모든 그룹 메시지를 받으며, 항상 켜져 있는 그룹 동작에 유용합니다.
유용한 BotFather 토글
유용한 BotFather 토글
- 그룹 추가 허용/거부를 위한
/setjoingroups - 그룹 표시 동작을 위한
/setprivacy
접근 제어 및 활성화
- DM 정책
- 그룹 정책 및 허용 목록
- 멘션 동작
channels.telegram.dmPolicy는 다이렉트 메시지 접근을 제어합니다.pairing(기본값)allowlist(allowFrom에 발신자 ID가 하나 이상 필요)open(allowFrom에"*"포함 필요)disabled
allowFrom: ["*"]와 함께 dmPolicy: "open"을 사용하면 봇 사용자 이름을 찾거나 추측한 모든 Telegram 계정이 봇에 명령을 보낼 수 있습니다. 도구가 엄격히 제한된 의도적인 공개 봇에만 사용하세요. 단일 소유자 봇은 숫자 사용자 ID와 함께 allowlist를 사용해야 합니다.channels.telegram.allowFrom은 숫자 Telegram 사용자 ID를 받습니다. telegram: / tg: 접두사는 허용되며 정규화됩니다.
다중 계정 config에서 제한적인 최상위 channels.telegram.allowFrom은 안전 경계로 처리됩니다. 계정 수준의 allowFrom: ["*"] 항목은 병합 후 유효 계정 허용 목록에 명시적 와일드카드가 여전히 포함되어 있지 않는 한 해당 계정을 공개로 만들지 않습니다.
빈 allowFrom과 함께 dmPolicy: "allowlist"를 사용하면 모든 DM이 차단되며 config 검증에서 거부됩니다.
설정은 숫자 사용자 ID만 요청합니다.
업그레이드 후 config에 @username 허용 목록 항목이 포함되어 있다면 openclaw doctor --fix를 실행해 이를 확인하세요(최선 노력 방식이며 Telegram 봇 토큰이 필요).
이전에 페어링 저장소 허용 목록 파일에 의존했다면, openclaw doctor --fix가 allowlist 흐름에서 항목을 channels.telegram.allowFrom으로 복구할 수 있습니다(예: dmPolicy: "allowlist"에 아직 명시적 ID가 없는 경우).단일 소유자 봇의 경우 이전 페어링 승인에 의존하는 대신, 명시적 숫자 allowFrom ID와 함께 dmPolicy: "allowlist"를 사용해 접근 정책을 config에 지속적으로 유지하는 것이 좋습니다.흔한 혼동: DM 페어링 승인이 “이 발신자가 모든 곳에서 승인됨”을 의미하지는 않습니다.
페어링은 DM 접근을 부여합니다. 아직 명령 소유자가 없는 경우, 첫 번째 승인된 페어링은 소유자 전용 명령과 exec 승인이 명시적인 운영자 계정을 갖도록 commands.ownerAllowFrom도 설정합니다.
그룹 발신자 승인은 여전히 명시적인 config 허용 목록에서 옵니다.
“한 번 승인되면 DM과 그룹 명령이 모두 작동”하길 원한다면 숫자 Telegram 사용자 ID를 channels.telegram.allowFrom에 넣으세요. 소유자 전용 명령의 경우 commands.ownerAllowFrom에 telegram:<your user id>가 포함되어 있는지 확인하세요.내 Telegram 사용자 ID 찾기
더 안전한 방법(서드파티 봇 없음):- 내 봇에 DM을 보냅니다.
openclaw logs --follow를 실행합니다.from.id를 읽습니다.
@userinfobot 또는 @getidsbot.런타임 동작
- Telegram은 Gateway 프로세스가 소유합니다.
- 라우팅은 결정적입니다. Telegram 인바운드는 Telegram으로 답장합니다(모델이 채널을 선택하지 않음).
- 인바운드 메시지는 답장 메타데이터, 미디어 플레이스홀더, Gateway가 관찰한 Telegram 답장에 대한 지속된 답장 체인 컨텍스트와 함께 공유 채널 엔벌로프로 정규화됩니다.
- 그룹 세션은 그룹 ID별로 격리됩니다. 포럼 토픽은 토픽을 격리하기 위해
:topic:<threadId>를 추가합니다. - DM 메시지는
message_thread_id를 포함할 수 있습니다. OpenClaw는 답장에 대해 스레드 ID를 보존하지만, 기본적으로 DM은 평면 세션에 유지합니다. 의도적으로 DM 토픽 세션 격리를 원할 때는channels.telegram.dm.threadReplies: "inbound",channels.telegram.direct.<chatId>.threadReplies: "inbound",requireTopic: true또는 일치하는 토픽 config를 구성하세요. - 긴 폴링은 채팅별/스레드별 순서 지정과 함께 grammY runner를 사용합니다. 전체 runner sink 동시성은
agents.defaults.maxConcurrent를 사용합니다. - 긴 폴링은 각 Gateway 프로세스 내부에서 보호되어 한 번에 하나의 활성 poller만 봇 토큰을 사용할 수 있습니다. 그래도
getUpdates409 충돌이 보인다면 다른 OpenClaw Gateway, 스크립트 또는 외부 poller가 같은 토큰을 사용하고 있을 가능성이 큽니다. - 긴 폴링 watchdog 재시작은 기본적으로 완료된
getUpdatesliveness가 120초 동안 없을 때 트리거됩니다. 배포 환경에서 장시간 작업 중에도 잘못된 폴링 정지 재시작이 계속 보이는 경우에만channels.telegram.pollingStallThresholdMs를 늘리세요. 값은 밀리초 단위이며30000부터600000까지 허용됩니다. 계정별 재정의가 지원됩니다. - Telegram Bot API는 읽음 확인을 지원하지 않습니다(
sendReadReceipts는 적용되지 않음).
기능 참조
실시간 스트림 미리보기(메시지 편집)
실시간 스트림 미리보기(메시지 편집)
OpenClaw는 부분 답장을 실시간으로 스트리밍할 수 있습니다.도구 진행 상황은 표시하되 명령/실행 텍스트를 숨기려면 다음과 같이 설정하세요.최종 답변을 같은 메시지로 편집하지 않고도 보이는 도구 진행 상황을 원할 때는 최종본만 전달하려는 경우에만 텍스트 전용 답글의 경우:
- 다이렉트 채팅: 미리보기 메시지 +
editMessageText - 그룹/토픽: 미리보기 메시지 +
editMessageText
channels.telegram.streaming은off | partial | block | progress입니다(기본값:partial).progress는 도구 진행 상황을 위한 편집 가능한 상태 초안 하나를 유지하고, 완료 시 이를 지운 뒤 최종 답변을 일반 메시지로 보냅니다.streaming.preview.toolProgress는 도구/진행 상황 업데이트가 동일한 편집된 미리보기 메시지를 재사용할지 제어합니다(기본값: 미리보기 스트리밍이 활성 상태일 때true).streaming.preview.commandText는 해당 도구 진행 상황 줄 안의 명령/실행 세부 정보를 제어합니다:raw(기본값, 릴리스된 동작 유지) 또는status(도구 레이블만).- 기존
channels.telegram.streamMode및 불리언streaming값은 감지됩니다. 이를channels.telegram.streaming.mode로 마이그레이션하려면openclaw doctor --fix를 실행하세요.
v2026.4.22 및 이후 버전의 릴리스된 OpenClaw 동작과 일치하도록 기본적으로 이를 활성화합니다. 답변 텍스트용 편집된 미리보기는 유지하되 도구 진행 상황 줄을 숨기려면 다음과 같이 설정하세요.progress 모드를 사용하세요. 명령 텍스트 정책은 streaming.progress 아래에 두세요.streaming.mode: "off"를 사용하세요. Telegram 미리보기 편집은 비활성화되고, 일반적인 도구/진행 상황 잡담은 독립 상태 메시지로 전송되는 대신 억제됩니다. 승인 프롬프트, 미디어 페이로드, 오류는 여전히 일반 최종 전달 경로를 따릅니다. 도구 진행 상황 상태 줄을 숨기면서 답변 미리보기 편집만 유지하려면 streaming.preview.toolProgress: false를 사용하세요.Telegram에서 선택한 인용 답글은 예외입니다.
replyToMode가 "first", "all" 또는 "batched"이고 인바운드 메시지에 선택된 인용 텍스트가 포함되어 있으면 OpenClaw는 답변 미리보기를 편집하는 대신 Telegram의 네이티브 인용 답글 경로를 통해 최종 답변을 보내므로, 해당 턴에서는 streaming.preview.toolProgress가 짧은 상태 줄을 표시할 수 없습니다. 선택된 인용 텍스트가 없는 현재 메시지 답글은 여전히 미리보기 스트리밍을 유지합니다. 도구 진행 상황 가시성이 네이티브 인용 답글보다 더 중요하면 replyToMode: "off"를 설정하고, 이 절충을 받아들이려면 streaming.preview.toolProgress: false를 설정하세요.- 짧은 DM/그룹/토픽 미리보기: OpenClaw는 동일한 미리보기 메시지를 유지하고 최종 편집을 그 자리에서 수행합니다.
- 여러 Telegram 메시지로 분할되는 긴 텍스트 최종본은 가능한 경우 기존 미리보기를 첫 번째 최종 청크로 재사용한 뒤 나머지 청크만 보냅니다.
- progress 모드 최종본은 상태 초안을 지우고 초안을 답변으로 편집하는 대신 일반 최종 전달을 사용합니다.
- 완료된 텍스트가 확인되기 전에 최종 편집이 실패하면 OpenClaw는 일반 최종 전달을 사용하고 오래된 미리보기를 정리합니다.
/reasoning stream은 생성 중 reasoning을 실시간 미리보기로 보냅니다.- reasoning 미리보기는 최종 전달 후 삭제됩니다. reasoning이 계속 표시되어야 하면
/reasoning on을 사용하세요. - 최종 답변은 reasoning 텍스트 없이 전송됩니다.
Formatting and HTML fallback
Formatting and HTML fallback
아웃바운드 텍스트는 Telegram
parse_mode: "HTML"을 사용합니다.- Markdown 비슷한 텍스트는 Telegram 안전 HTML로 렌더링됩니다.
- 지원되는 Telegram HTML 태그는 유지되고, 지원되지 않는 HTML은 이스케이프됩니다.
- Telegram이 파싱된 HTML을 거부하면 OpenClaw는 일반 텍스트로 다시 시도합니다.
channels.telegram.linkPreview: false로 비활성화할 수 있습니다.Native commands and custom commands
Native commands and custom commands
Telegram 명령 메뉴 등록은 시작 시 규칙:기기 페어링 명령(
setMyCommands로 처리됩니다.네이티브 명령 기본값:commands.native: "auto"는 Telegram용 네이티브 명령을 활성화합니다.
- 이름은 정규화됩니다(앞의
/제거, 소문자 변환). - 유효한 패턴:
a-z,0-9,_, 길이1..32 - 사용자 지정 명령은 네이티브 명령을 재정의할 수 없습니다.
- 충돌/중복은 건너뛰고 로그에 기록됩니다.
- 사용자 지정 명령은 메뉴 항목일 뿐이며, 동작을 자동으로 구현하지는 않습니다.
- Plugin/Skills 명령은 Telegram 메뉴에 표시되지 않더라도 입력하면 계속 작동할 수 있습니다.
BOT_COMMANDS_TOO_MUCH와 함께setMyCommands failed가 표시되면 잘라낸 후에도 Telegram 메뉴가 여전히 초과되었다는 뜻입니다. Plugin/Skills/사용자 지정 명령을 줄이거나channels.telegram.commands.native를 비활성화하세요.- 직접 Bot API curl 명령은 작동하는데
deleteWebhook,deleteMyCommands또는setMyCommands가404: Not Found로 실패하면channels.telegram.apiRoot가 전체/bot<TOKEN>엔드포인트로 설정되었을 수 있습니다.apiRoot는 Bot API 루트만이어야 하며,openclaw doctor --fix는 실수로 붙은 끝의/bot<TOKEN>을 제거합니다. getMe returned 401은 Telegram이 구성된 봇 토큰을 거부했다는 뜻입니다. 현재 BotFather 토큰으로botToken,tokenFile또는TELEGRAM_BOT_TOKEN을 업데이트하세요. OpenClaw는 폴링 전에 중지되므로 이는 Webhook 정리 실패로 보고되지 않습니다.- 네트워크/fetch 오류와 함께
setMyCommands failed가 표시되면 보통api.telegram.org로 나가는 DNS/HTTPS가 차단되었다는 뜻입니다.
기기 페어링 명령(device-pair Plugin)
device-pair Plugin이 설치된 경우:/pair가 설정 코드를 생성합니다.- iOS 앱에 코드를 붙여넣습니다.
/pair pending은 대기 중인 요청(역할/범위 포함)을 나열합니다.- 요청을 승인합니다.
- 명시적 승인은
/pair approve <requestId> - 대기 중인 요청이 하나뿐이면
/pair approve - 가장 최근 요청은
/pair approve latest
- 명시적 승인은
scopes: []로 유지합니다. 핸드오프된 운영자 토큰은 operator.approvals, operator.read, operator.talk.secrets, operator.write로 제한됩니다. 부트스트랩 범위 검사는 역할 접두사를 사용하므로 해당 운영자 허용 목록은 운영자 요청만 충족합니다. 운영자가 아닌 역할은 여전히 자체 역할 접두사 아래의 범위가 필요합니다.기기가 변경된 인증 세부 정보(예: 역할/범위/공개 키)로 다시 시도하면 이전 대기 요청은 대체되고 새 요청은 다른 requestId를 사용합니다. 승인하기 전에 /pair pending을 다시 실행하세요.자세한 내용: 페어링.Inline buttons
Inline buttons
Telegram message actions for agents and automation
Telegram message actions for agents and automation
Telegram 도구 작업에는 다음이 포함됩니다.
sendMessage(to,content, 선택 사항mediaUrl,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,content)createForumTopic(chatId,name, 선택 사항iconColor,iconCustomEmojiId)
send, react, delete, edit, sticker, sticker-search, topic-create)을 노출합니다.게이팅 제어:channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(기본값: 비활성화)
edit 및 topic-create는 현재 기본적으로 활성화되어 있으며 별도의 channels.telegram.actions.* 토글이 없습니다.
런타임 전송은 활성 구성/시크릿 스냅샷(시작/다시 로드)을 사용하므로, 작업 경로는 전송마다 임시로 SecretRef를 다시 확인하지 않습니다.반응 제거 의미론: /tools/reactionsReply threading tags
Reply threading tags
Forum topics and thread behavior
Forum topics and thread behavior
포럼 슈퍼그룹:그러면 각 topic에는 자체 session 키가 있습니다:
- 토픽 세션 키는
:topic:<threadId>를 덧붙입니다. - 답글과 입력 중 표시는 토픽 스레드를 대상으로 합니다.
- 토픽 구성 경로:
channels.telegram.groups.<chatId>.topics.<threadId>
threadId=1) 특수 사례:- 메시지 전송은
message_thread_id를 생략합니다(Telegram은sendMessage(...thread_id=1)를 거부합니다). - 입력 중 작업은 여전히
message_thread_id를 포함합니다.
requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy)을 상속합니다.
agentId는 토픽 전용이며 그룹 기본값에서 상속되지 않습니다.토픽별 에이전트 라우팅: 각 토픽은 토픽 구성에서 agentId를 설정하여 다른 에이전트로 라우팅할 수 있습니다. 이렇게 하면 각 토픽이 자체 격리된 작업 공간, 메모리, 세션을 가집니다. 예시:agent:zu:telegram:group:-1001234567890:topic:3영구 ACP topic 바인딩: Forum topic은 최상위 타입 지정 ACP 바인딩(type: "acp" 및 match.channel: "telegram", peer.kind: "group", -1001234567890:topic:42 같은 topic 한정 id가 있는 bindings[])을 통해 ACP 하네스 session을 고정할 수 있습니다. 현재는 그룹/슈퍼그룹의 forum topic으로 범위가 제한됩니다. ACP 에이전트를 참조하세요.채팅에서 thread 바인딩 ACP 생성: /acp spawn <agent> --thread here|auto는 현재 topic을 새 ACP session에 바인딩하며, 후속 메시지는 그곳으로 직접 라우팅됩니다. OpenClaw는 생성 확인을 topic 안에 고정합니다. channels.telegram.threadBindings.spawnSessions가 활성화된 상태로 유지되어야 합니다(기본값: true).템플릿 컨텍스트는 MessageThreadId와 IsForum을 노출합니다. message_thread_id가 있는 DM 채팅은 기본적으로 평면 session에서 DM 라우팅과 reply 메타데이터를 유지합니다. threadReplies: "inbound", threadReplies: "always", requireTopic: true 또는 일치하는 topic 설정으로 구성된 경우에만 thread 인식 session 키를 사용합니다. 계정 기본값에는 최상위 channels.telegram.dm.threadReplies를 사용하고, 단일 DM에는 direct.<chatId>.threadReplies를 사용하세요.Audio, video, and stickers
Audio, video, and stickers
오디오 메시지
Telegram은 음성 메모와 오디오 파일을 구분합니다.- 기본값: 오디오 파일 동작
- 에이전트 reply에 태그
[[audio_as_voice]]를 넣어 음성 메모 전송을 강제 - 수신 음성 메모 전사는 에이전트 컨텍스트에서 기계 생성의 신뢰할 수 없는 텍스트로 프레이밍됩니다. mention 감지는 여전히 원시 전사를 사용하므로 mention으로 제한된 음성 메시지도 계속 작동합니다.
비디오 메시지
Telegram은 비디오 파일과 비디오 메모를 구분합니다.메시지 action 예:스티커
수신 스티커 처리:- 정적 WEBP: 다운로드 및 처리됨(placeholder
<media:sticker>) - 애니메이션 TGS: 건너뜀
- 비디오 WEBM: 건너뜀
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
~/.openclaw/telegram/sticker-cache.json
Reaction notifications
Reaction notifications
Telegram reaction은
message_reaction update로 도착합니다(메시지 payload와 별도).활성화되면 OpenClaw는 다음과 같은 system event를 큐에 넣습니다:Telegram reaction added: 👍 by Alice (@alice) on msg 42
channels.telegram.reactionNotifications:off | own | all(기본값:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(기본값:minimal)
own은 봇이 보낸 메시지에 대한 사용자 reaction만 의미합니다(전송 메시지 캐시를 통한 최선 노력).- Reaction event는 여전히 Telegram access control(
dmPolicy,allowFrom,groupPolicy,groupAllowFrom)을 따릅니다. 권한 없는 발신자는 삭제됩니다. - Telegram은 reaction update에서 thread ID를 제공하지 않습니다.
- non-forum 그룹은 그룹 채팅 session으로 라우팅됩니다
- forum 그룹은 정확한 원래 topic이 아니라 그룹 general-topic session(
:topic:1)으로 라우팅됩니다
allowed_updates에는 message_reaction이 자동으로 포함됩니다.Ack reactions
Ack reactions
ackReaction은 OpenClaw가 수신 메시지를 처리하는 동안 확인 emoji를 보냅니다.해석 순서:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- 에이전트 identity emoji fallback(
agents.list[].identity.emoji, 없으면 ”👀”)
- Telegram은 unicode emoji를 기대합니다(예: ”👀”).
- 채널 또는 계정에 대해 reaction을 비활성화하려면
""를 사용하세요.
Config writes from Telegram events and commands
Config writes from Telegram events and commands
채널 config 쓰기는 기본적으로 활성화됩니다(
configWrites !== false).Telegram으로 트리거되는 쓰기에는 다음이 포함됩니다:channels.telegram.groups를 업데이트하기 위한 그룹 migration event(migrate_to_chat_id)/config set및/config unset(command 활성화 필요)
Long polling vs webhook
Long polling vs webhook
기본값은 long polling입니다. Webhook 모드에는
channels.telegram.webhookUrl 및 channels.telegram.webhookSecret을 설정하세요. 선택적으로 webhookPath, webhookHost, webhookPort를 사용할 수 있습니다(기본값 /telegram-webhook, 127.0.0.1, 8787).long-polling 모드에서 OpenClaw는 update가 성공적으로 dispatch된 후에만 restart watermark를 유지합니다. handler가 실패하면 해당 update는 같은 프로세스에서 재시도 가능 상태로 남으며, restart dedupe를 위해 완료로 기록되지 않습니다.로컬 listener는 127.0.0.1:8787에 바인딩됩니다. public ingress의 경우 로컬 포트 앞에 reverse proxy를 두거나 의도적으로 webhookHost: "0.0.0.0"을 설정하세요.Webhook 모드는 Telegram에 200을 반환하기 전에 request guard, Telegram secret token, JSON body를 검증합니다.
그런 다음 OpenClaw는 long polling에서 사용하는 것과 동일한 채팅별/topic별 bot lane을 통해 update를 비동기적으로 처리하므로, 느린 에이전트 turn이 Telegram의 delivery ACK를 붙잡지 않습니다.Limits, retry, and CLI targets
Limits, retry, and CLI targets
channels.telegram.textChunkLimit기본값은 4000입니다.channels.telegram.chunkMode="newline"은 길이 분할 전에 문단 경계(빈 줄)를 우선합니다.channels.telegram.mediaMaxMb(기본값 100)는 수신 및 발신 Telegram media 크기를 제한합니다.channels.telegram.mediaGroupFlushMs(기본값 500)는 Telegram album/media group이 OpenClaw에서 하나의 수신 메시지로 dispatch되기 전에 버퍼링되는 시간을 제어합니다. album 부분이 늦게 도착하면 값을 늘리고, album reply 지연 시간을 줄이려면 값을 줄이세요.channels.telegram.timeoutSeconds는 Telegram API client timeout을 재정의합니다(설정하지 않으면 grammY 기본값이 적용됨). bot client는 구성된 값을 60초 발신 text/typing request guard 아래로 제한하므로 grammY가 OpenClaw의 transport guard와 fallback이 실행되기 전에 보이는 reply delivery를 중단하지 않습니다. long polling은 여전히 45초getUpdatesrequest guard를 사용하므로 idle poll이 무기한 방치되지 않습니다.channels.telegram.pollingStallThresholdMs기본값은120000입니다. false-positive polling-stall restart에 대해서만30000에서600000사이로 조정하세요.- 그룹 컨텍스트 history는
channels.telegram.historyLimit또는messages.groupChat.historyLimit(기본값 50)을 사용합니다.0은 비활성화합니다. - reply/quote/forward 보조 컨텍스트는 Gateway가 parent message를 관찰한 경우 하나의 선택된 conversation context window로 정규화됩니다. 관찰된 메시지 캐시는 session store 옆에 유지됩니다. Telegram은 update에 하나의 얕은
reply_to_message만 포함하므로, 캐시보다 오래된 chain은 Telegram의 현재 update payload로 제한됩니다. - Telegram allowlist는 주로 agent를 트리거할 수 있는 사람을 제한하며, 전체 보조 컨텍스트 redaction boundary가 아닙니다.
- DM history 제어:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
channels.telegram.retry설정은 복구 가능한 발신 API error에 대해 Telegram send helper(CLI/tools/actions)에 적용됩니다. 수신 final-reply delivery도 Telegram pre-connect failure에 대해 제한된 safe-send retry를 사용하지만, 보이는 메시지를 중복시킬 수 있는 모호한 post-send network envelope는 재시도하지 않습니다.
openclaw message poll을 사용하며 forum topic을 지원합니다:--poll-duration-seconds(5-600)--poll-anonymous--poll-public- forum topic용
--thread-id(또는:topic:target 사용)
channels.telegram.capabilities.inlineButtons가 허용할 때 inline keyboard용buttonsblock이 있는--presentation- bot이 해당 채팅에서 pin할 수 있을 때 pinned delivery를 요청하는
--pin또는--delivery '{"pin":true}' - 발신 이미지, GIF, 비디오를 압축된 photo, animated-media 또는 video upload 대신 document로 보내는
--force-document
channels.telegram.actions.sendMessage=false는 poll을 포함한 발신 Telegram 메시지를 비활성화합니다channels.telegram.actions.poll=false는 일반 send를 활성 상태로 유지하면서 Telegram poll 생성을 비활성화합니다
Exec approvals in Telegram
Exec approvals in Telegram
Telegram은 승인자 DM에서 exec approval을 지원하며, 선택적으로 원래 채팅이나 topic에 prompt를 게시할 수 있습니다. 승인자는 숫자 Telegram user ID여야 합니다.설정 경로:
channels.telegram.execApprovals.enabled(하나 이상의 승인자를 해석할 수 있으면 자동 활성화)channels.telegram.execApprovals.approvers(commands.ownerAllowFrom의 숫자 owner ID로 fallback)channels.telegram.execApprovals.target:dm(기본값) |channel|bothagentFilter,sessionFilter
channels.telegram.allowFrom, groupAllowFrom, defaultTo는 누가 bot과 대화할 수 있는지와 bot이 일반 reply를 어디로 보내는지를 제어합니다. 이것이 누군가를 exec approver로 만들지는 않습니다. command owner가 아직 없을 때 첫 번째 승인된 DM pairing은 commands.ownerAllowFrom을 bootstrap하므로, 단일 owner 설정은 execApprovals.approvers 아래에 ID를 중복하지 않아도 계속 작동합니다.Channel delivery는 채팅에 command text를 표시합니다. 신뢰할 수 있는 그룹/topic에서만 channel 또는 both를 활성화하세요. prompt가 forum topic에 도착하면 OpenClaw는 approval prompt와 후속 메시지에 대해 topic을 보존합니다. Exec approval은 기본적으로 30분 후 만료됩니다.Inline approval button도 target surface(dm, group 또는 all)를 허용하도록 channels.telegram.capabilities.inlineButtons가 필요합니다. plugin: 접두사가 붙은 approval ID는 plugin approval을 통해 해석되고, 나머지는 exec approval을 먼저 통해 해석됩니다.Exec approval을 참조하세요.오류 응답 제어
에이전트가 전달 또는 공급자 오류를 만나면 Telegram은 오류 텍스트로 응답하거나 이를 숨길 수 있습니다. 이 동작은 두 가지 구성 키로 제어합니다.| 키 | 값 | 기본값 | 설명 |
|---|---|---|---|
channels.telegram.errorPolicy | reply, silent | reply | reply는 채팅에 친근한 오류 메시지를 보냅니다. silent는 오류 응답을 완전히 숨깁니다. |
channels.telegram.errorCooldownMs | number (ms) | 60000 | 같은 채팅에 오류 응답을 보낼 때 적용되는 최소 간격입니다. 장애 중 오류 스팸을 방지합니다. |
문제 해결
봇이 멘션이 아닌 그룹 메시지에 응답하지 않음
봇이 멘션이 아닌 그룹 메시지에 응답하지 않음
requireMention=false이면 Telegram 개인정보 보호 모드에서 전체 표시를 허용해야 합니다.- BotFather:
/setprivacy-> Disable - 그런 다음 그룹에서 봇을 제거한 뒤 다시 추가합니다.
- BotFather:
- 구성이 멘션되지 않은 그룹 메시지를 예상할 때
openclaw channels status가 경고합니다. openclaw channels status --probe는 명시적인 숫자 그룹 ID를 확인할 수 있습니다. 와일드카드"*"는 멤버십 조사를 할 수 없습니다.- 빠른 세션 테스트:
/activation always.
봇이 그룹 메시지를 전혀 보지 못함
봇이 그룹 메시지를 전혀 보지 못함
channels.telegram.groups가 있으면 그룹이 목록에 있어야 합니다(또는"*"포함).- 그룹 내 봇 멤버십을 확인합니다.
- 건너뛴 이유를 보려면 로그를 검토합니다:
openclaw logs --follow
명령이 부분적으로만 작동하거나 전혀 작동하지 않음
명령이 부분적으로만 작동하거나 전혀 작동하지 않음
- 보낸 사람 ID를 승인합니다(페어링 및/또는 숫자
allowFrom). - 그룹 정책이
open이어도 명령 승인은 계속 적용됩니다. BOT_COMMANDS_TOO_MUCH와 함께setMyCommands failed가 발생하면 네이티브 메뉴 항목이 너무 많다는 뜻입니다. Plugin/skill/사용자 지정 명령을 줄이거나 네이티브 메뉴를 비활성화하세요.- 시작 시
deleteMyCommands/setMyCommands호출과sendChatAction입력 표시 호출은 제한 시간이 적용되며, 요청 제한 시간 초과 시 Telegram 전송 대체 경로를 통해 한 번 재시도됩니다. 지속적인 네트워크/가져오기 오류는 보통api.telegram.org에 대한 DNS/HTTPS 도달성 문제를 나타냅니다.
시작 시 승인되지 않은 토큰이 보고됨
시작 시 승인되지 않은 토큰이 보고됨
폴링 또는 네트워크 불안정
폴링 또는 네트워크 불안정
- Node 22+와 사용자 지정 fetch/proxy 조합은 AbortSignal 타입이 일치하지 않으면 즉시 중단 동작을 유발할 수 있습니다.
- 일부 호스트는
api.telegram.org를 IPv6로 먼저 확인합니다. 손상된 IPv6 송신은 간헐적인 Telegram API 실패를 일으킬 수 있습니다. - 로그에
TypeError: fetch failed또는Network request for 'getUpdates' failed!가 포함되면 OpenClaw는 이제 이를 복구 가능한 네트워크 오류로 재시도합니다. - 폴링 시작 중 OpenClaw는 성공한 시작
getMe조사를 grammY에 재사용하므로 러너가 첫getUpdates전에 두 번째getMe를 수행할 필요가 없습니다. - 폴링 시작 중 일시적인 네트워크 오류로
deleteWebhook이 실패하면 OpenClaw는 다른 사전 폴링 제어 플레인 호출을 수행하지 않고 long polling으로 계속 진행합니다. 아직 활성 상태인 웹훅은getUpdates충돌로 드러납니다. 그러면 OpenClaw가 Telegram 전송을 다시 빌드하고 웹훅 정리를 재시도합니다. - Telegram 소켓이 짧고 고정된 주기로 재활용되면 낮은
channels.telegram.timeoutSeconds를 확인하세요. 봇 클라이언트는 송신 및getUpdates요청 보호값보다 낮게 구성된 값을 제한하지만, 이전 릴리스에서는 이 값이 보호값보다 낮게 설정되면 모든 폴링 또는 응답이 중단될 수 있었습니다. - 로그에
Polling stall detected가 포함되면 OpenClaw는 기본적으로 완료된 long-poll 활성 확인이 120초 동안 없을 때 폴링을 다시 시작하고 Telegram 전송을 다시 빌드합니다. openclaw channels status --probe와openclaw doctor는 실행 중인 폴링 계정이 시작 유예 후getUpdates를 완료하지 않았거나, 실행 중인 웹훅 계정이 시작 유예 후setWebhook을 완료하지 않았거나, 마지막으로 성공한 폴링 전송 활동이 오래된 경우 경고합니다.- 장시간 실행되는
getUpdates호출은 정상인데도 호스트가 잘못된 폴링 중단 재시작을 계속 보고할 때만channels.telegram.pollingStallThresholdMs를 늘리세요. 지속적인 중단은 보통 호스트와api.telegram.org사이의 프록시, DNS, IPv6 또는 TLS 송신 문제를 가리킵니다. - Telegram은 Bot API 전송에 대해
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY와 그 소문자 변형을 포함한 프로세스 프록시 환경도 따릅니다.NO_PROXY/no_proxy는 여전히api.telegram.org를 우회할 수 있습니다. - 서비스 환경에서 OpenClaw 관리형 프록시가
OPENCLAW_PROXY_URL을 통해 구성되어 있고 표준 프록시 환경이 없으면, Telegram도 Bot API 전송에 해당 URL을 사용합니다. - 직접 송신/TLS가 불안정한 VPS 호스트에서는 Telegram API 호출을
channels.telegram.proxy를 통해 라우팅합니다.
- Node 22+는 기본적으로
autoSelectFamily=true입니다(WSL2 제외). Telegram DNS 결과 순서는OPENCLAW_TELEGRAM_DNS_RESULT_ORDER, 그다음channels.telegram.network.dnsResultOrder, 그다음NODE_OPTIONS=--dns-result-order=ipv4first같은 프로세스 기본값을 따릅니다. 아무것도 적용되지 않으면 Node 22+는ipv4first로 폴백합니다. - 호스트가 WSL2이거나 IPv4 전용 동작이 명시적으로 더 잘 작동한다면 패밀리 선택을 강제합니다.
- RFC 2544 벤치마크 범위 응답(
198.18.0.0/15)은 기본적으로 이미 Telegram 미디어 다운로드에 허용됩니다. 신뢰할 수 있는 fake-IP 또는 투명 프록시가 미디어 다운로드 중api.telegram.org를 다른 사설/내부/특수 용도 주소로 다시 쓰는 경우, Telegram 전용 우회에 옵트인할 수 있습니다.
- 동일한 옵트인이 계정별로
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork에서도 제공됩니다. - 프록시가 Telegram 미디어 호스트를
198.18.x.x로 확인한다면 먼저 위험 플래그를 끈 상태로 두세요. Telegram 미디어는 기본적으로 이미 RFC 2544 벤치마크 범위를 허용합니다.
- 환경 재정의(임시):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- DNS 응답을 검증합니다.
구성 참조
기본 참조: 구성 참조 - Telegram.신호가 높은 Telegram 필드
신호가 높은 Telegram 필드
- 시작/인증:
enabled,botToken,tokenFile,accounts.*(tokenFile은 일반 파일을 가리켜야 하며, 심볼릭 링크는 거부됩니다) - 접근 제어:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*, 최상위bindings[](type: "acp") - 실행 승인:
execApprovals,accounts.*.execApprovals - 명령/메뉴:
commands.native,commands.nativeSkills,customCommands - 스레딩/응답:
replyToMode,dm.threadReplies,direct.*.threadReplies - 스트리밍:
streaming(미리 보기),streaming.preview.toolProgress,blockStreaming - 형식/전달:
textChunkLimit,chunkMode,linkPreview,responsePrefix - 미디어/네트워크:
mediaMaxMb,mediaGroupFlushMs,timeoutSeconds,pollingStallThresholdMs,retry,network.autoSelectFamily,network.dangerouslyAllowPrivateNetwork,proxy - 사용자 지정 API 루트:
apiRoot(Bot API 루트만 해당,/bot<TOKEN>을 포함하지 마세요) - Webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost - 작업/기능:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - 반응:
reactionNotifications,reactionLevel - 오류:
errorPolicy,errorCooldownMs - 쓰기/기록:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit
다중 계정 우선순위: 계정 ID가 두 개 이상 구성된 경우 기본 라우팅을 명시하려면
channels.telegram.defaultAccount를 설정하거나 channels.telegram.accounts.default를 포함하세요. 그렇지 않으면 OpenClaw는 첫 번째 정규화된 계정 ID로 폴백하며 openclaw doctor가 경고합니다. 이름이 지정된 계정은 channels.telegram.allowFrom / groupAllowFrom을 상속하지만 accounts.default.* 값은 상속하지 않습니다.관련 항목
페어링
Telegram 사용자를 Gateway에 페어링합니다.
그룹
그룹 및 주제 허용 목록 동작입니다.
채널 라우팅
인바운드 메시지를 에이전트로 라우팅합니다.
보안
위협 모델 및 강화입니다.
다중 에이전트 라우팅
그룹과 주제를 에이전트에 매핑합니다.
문제 해결
채널 간 진단입니다.