Penyandingan
Pemecahan masalah kanal
Konfigurasi Gateway
Penyiapan cepat
Buat token bot di BotFather
@BotFather).Jalankan /newbot, ikuti prompt, dan simpan tokennya.Konfigurasikan token dan kebijakan DM
TELEGRAM_BOT_TOKEN=... (hanya akun bawaan).
Telegram tidak menggunakan openclaw channels login telegram; konfigurasikan token di config/env, lalu mulai gateway.Tambahkan bot ke grup
- ID pengguna Telegram Anda, digunakan di
allowFrom/groupAllowFrom - ID chat grup Telegram, digunakan sebagai kunci di bawah
channels.telegram.groups
openclaw logs --follow, bot ID terusan, atau Bot API getUpdates. Setelah grup diizinkan, /whoami@<bot_username> dapat mengonfirmasi ID pengguna dan grup.ID supergroup Telegram negatif yang dimulai dengan -100 adalah ID chat grup. Letakkan di bawah channels.telegram.groups, bukan di bawah groupAllowFrom.TELEGRAM_BOT_TOKEN hanya berlaku untuk akun bawaan.
Setelah startup berhasil, OpenClaw menyimpan identitas bot dalam cache di direktori state hingga 24 jam agar restart dapat menghindari panggilan Telegram getMe tambahan; mengubah atau menghapus token akan menghapus cache tersebut.Pengaturan sisi Telegram
Mode privasi dan visibilitas grup
Mode privasi dan visibilitas grup
- nonaktifkan mode privasi melalui
/setprivacy, atau - jadikan bot sebagai admin grup.
Izin grup
Izin grup
Toggle BotFather yang berguna
Toggle BotFather yang berguna
/setjoingroupsuntuk mengizinkan/menolak penambahan grup/setprivacyuntuk perilaku visibilitas grup
Kontrol akses dan aktivasi
Identitas bot grup
Di grup Telegram dan topik forum, mention eksplisit handle bot yang dikonfigurasi (misalnya@my_bot) diperlakukan sebagai penyapaan ke agen OpenClaw yang dipilih, bahkan ketika nama persona agen berbeda dari nama pengguna Telegram. Kebijakan senyap grup tetap berlaku untuk trafik grup yang tidak terkait, tetapi handle bot itu sendiri tidak dianggap sebagai “orang lain.”
- Kebijakan DM
- Kebijakan grup dan allowlist
- Perilaku mention
channels.telegram.dmPolicy mengontrol akses pesan langsung:pairing(bawaan)allowlist(memerlukan setidaknya satu ID pengirim diallowFrom)open(memerlukanallowFromuntuk menyertakan"*")disabled
dmPolicy: "open" dengan allowFrom: ["*"] memungkinkan akun Telegram apa pun yang menemukan atau menebak nama pengguna bot untuk memberi perintah ke bot. Gunakan hanya untuk bot yang sengaja dibuat publik dengan alat yang dibatasi ketat; bot satu pemilik sebaiknya menggunakan allowlist dengan ID pengguna numerik.channels.telegram.allowFrom menerima ID pengguna Telegram numerik. Prefiks telegram: / tg: diterima dan dinormalisasi.
Dalam konfigurasi multi-akun, channels.telegram.allowFrom tingkat atas yang restriktif diperlakukan sebagai batas keamanan: entri allowFrom: ["*"] tingkat akun tidak membuat akun tersebut publik kecuali allowlist akun efektif masih berisi wildcard eksplisit setelah penggabungan.
dmPolicy: "allowlist" dengan allowFrom kosong memblokir semua DM dan ditolak oleh validasi konfigurasi.
Penyiapan hanya meminta ID pengguna numerik.
Jika Anda telah meningkatkan versi dan konfigurasi Anda berisi entri allowlist @username, jalankan openclaw doctor --fix untuk menyelesaikannya (upaya terbaik; memerlukan token bot Telegram).
Jika sebelumnya Anda bergantung pada berkas allowlist pairing-store, openclaw doctor --fix dapat memulihkan entri ke channels.telegram.allowFrom dalam alur allowlist (misalnya saat dmPolicy: "allowlist" belum memiliki ID eksplisit).Untuk bot dengan satu pemilik, pilih dmPolicy: "allowlist" dengan ID numerik allowFrom eksplisit agar kebijakan akses tetap tahan lama dalam konfigurasi (alih-alih bergantung pada persetujuan pairing sebelumnya).Kebingungan umum: persetujuan pairing DM tidak berarti “pengirim ini diotorisasi di mana saja”.
Pairing memberikan akses DM. Jika belum ada pemilik perintah, pairing pertama yang disetujui juga menetapkan commands.ownerAllowFrom sehingga perintah khusus pemilik dan persetujuan eksekusi memiliki akun operator eksplisit.
Otorisasi pengirim grup tetap berasal dari allowlist konfigurasi eksplisit.
Jika Anda ingin “Saya diotorisasi sekali dan baik DM maupun perintah grup berfungsi”, masukkan ID pengguna Telegram numerik Anda di channels.telegram.allowFrom; untuk perintah khusus pemilik, pastikan commands.ownerAllowFrom berisi telegram:<your user id>.Menemukan ID pengguna Telegram Anda
Lebih aman (tanpa bot pihak ketiga):- Kirim DM ke bot Anda.
- Jalankan
openclaw logs --follow. - Baca
from.id.
@userinfobot atau @getidsbot.Perilaku runtime
- Telegram dimiliki oleh proses gateway.
- Perutean bersifat deterministik: balasan masuk Telegram dibalas kembali ke Telegram (model tidak memilih channel).
- Pesan masuk dinormalisasi ke dalam envelope channel bersama dengan metadata balasan, placeholder media, dan konteks rantai balasan yang dipersistenkan untuk balasan Telegram yang telah diamati gateway.
- Sesi grup diisolasi berdasarkan ID grup. Topik forum menambahkan
:topic:<threadId>agar topik tetap terisolasi. - Pesan DM dapat membawa
message_thread_id; OpenClaw mempertahankannya untuk balasan. Sesi topik DM hanya dipisah ketika TelegramgetMemelaporkanhas_topics_enabled: trueuntuk bot; jika tidak, DM tetap berada pada sesi datar. - Long polling menggunakan grammY runner dengan pengurutan per-chat/per-thread. Konkurensi sink runner keseluruhan menggunakan
agents.defaults.maxConcurrent. - Startup multi-akun membatasi probe Telegram
getMeyang berjalan serentak agar armada bot besar tidak menyebarkan setiap probe akun sekaligus. - Long polling dijaga di dalam setiap proses gateway sehingga hanya satu poller aktif yang dapat menggunakan token bot pada satu waktu. Jika Anda masih melihat konflik
getUpdates409, kemungkinan gateway OpenClaw lain, skrip, atau poller eksternal sedang menggunakan token yang sama. - Restart watchdog long-polling dipicu setelah 120 detik tanpa liveness
getUpdatesyang selesai secara default. Tingkatkanchannels.telegram.pollingStallThresholdMshanya jika deployment Anda masih melihat restart polling-stall palsu selama pekerjaan yang berjalan lama. Nilainya dalam milidetik dan diizinkan dari30000hingga600000; override per-akun didukung. - Telegram Bot API tidak memiliki dukungan tanda terima baca (
sendReadReceiptstidak berlaku).
channels.telegram.dm.threadReplies dan channels.telegram.direct.<chatId>.threadReplies telah dihapus. Jalankan openclaw doctor --fix setelah upgrade jika config Anda masih memiliki key tersebut. Perutean topik DM sekarang mengikuti kapabilitas bot dari Telegram getMe.has_topics_enabled, yang dikendalikan oleh mode ber-thread BotFather: bot dengan topik aktif menggunakan sesi DM scoped thread ketika Telegram mengirim message_thread_id; DM lain tetap berada pada sesi datar.Referensi fitur
Pratinjau stream langsung (edit pesan)
Pratinjau stream langsung (edit pesan)
- chat langsung: pesan pratinjau +
editMessageText - grup/topik: pesan pratinjau +
editMessageText
channels.telegram.streamingadalahoff | partial | block | progress(default:partial)- pratinjau jawaban awal yang pendek di-debounce, lalu diwujudkan setelah jeda terbatas jika run masih aktif
progressmempertahankan satu draf status yang dapat diedit untuk progres tool, menampilkan label status stabil ketika aktivitas jawaban tiba sebelum progres tool, membersihkannya saat selesai, dan mengirim jawaban final sebagai pesan normalstreaming.preview.toolProgressmengontrol apakah pembaruan tool/progres menggunakan ulang pesan pratinjau yang sama yang diedit (default:trueketika streaming pratinjau aktif)streaming.preview.commandTextmengontrol detail perintah/eksekusi di dalam baris progres tool tersebut:raw(default, mempertahankan perilaku rilis) ataustatus(hanya label tool)streaming.progress.commentary(default:false) memilih ikut menyertakan teks komentar/preambule asisten di draf progres sementara- legacy
channels.telegram.streamMode, nilai booleanstreaming, dan key pratinjau draf native yang sudah dihentikan terdeteksi; jalankanopenclaw doctor --fixuntuk memigrasikannya ke config streaming saat ini
v2026.4.22 dan setelahnya.Untuk mempertahankan pratinjau yang diedit untuk teks jawaban tetapi menyembunyikan baris progres tool, atur:progress ketika Anda menginginkan progres tool yang terlihat tanpa mengedit jawaban final ke dalam pesan yang sama. Letakkan kebijakan teks perintah di bawah streaming.progress:streaming.mode: "off" hanya ketika Anda menginginkan pengiriman final saja: edit pratinjau Telegram dinonaktifkan dan obrolan tool/progres generik ditekan, bukan dikirim sebagai pesan status mandiri. Prompt persetujuan, payload media, dan error tetap dirutekan melalui pengiriman final normal. Gunakan streaming.preview.toolProgress: false ketika Anda hanya ingin mempertahankan edit pratinjau jawaban sambil menyembunyikan baris status progres tool.replyToMode adalah "first", "all", atau "batched" dan pesan masuk menyertakan teks kutipan terpilih, OpenClaw mengirim jawaban final melalui jalur quote-reply native Telegram alih-alih mengedit pratinjau jawaban, sehingga streaming.preview.toolProgress tidak dapat menampilkan baris status pendek untuk giliran tersebut. Balasan pesan saat ini tanpa teks kutipan terpilih tetap mempertahankan streaming pratinjau. Atur replyToMode: "off" ketika visibilitas progres tool lebih penting daripada balasan kutipan native, atau atur streaming.preview.toolProgress: false untuk mengakui trade-off tersebut.- pratinjau DM/grup/topik pendek: OpenClaw mempertahankan pesan pratinjau yang sama dan melakukan edit final di tempat
- final teks panjang yang dipecah menjadi beberapa pesan Telegram menggunakan ulang pratinjau yang ada sebagai chunk final pertama jika memungkinkan, lalu hanya mengirim chunk yang tersisa
- final mode progres membersihkan draf status dan menggunakan pengiriman final normal alih-alih mengedit draf menjadi jawaban
- jika edit final gagal sebelum teks selesai dikonfirmasi, OpenClaw menggunakan pengiriman final normal dan membersihkan pratinjau yang sudah stale
/reasoning streammenggunakan jalur pratinjau penalaran channel yang didukung; di Telegram, ini melakukan stream penalaran ke pratinjau langsung saat menghasilkan- pratinjau penalaran dihapus setelah pengiriman final; gunakan
/reasoning onketika penalaran harus tetap terlihat - jawaban final dikirim tanpa teks penalaran
Pemformatan pesan kaya
Pemformatan pesan kaya
channels.telegram.richMessages: true untuk memilih ikut menggunakan pesan kaya Bot API 10.1:- Agent diberi tahu bahwa pesan kaya Telegram tersedia untuk bot/akun ini.
- Teks Markdown dirender melalui Markdown IR OpenClaw dan dikirim sebagai HTML kaya Telegram.
- Payload HTML kaya eksplisit mempertahankan tag Bot API 10.1 yang didukung seperti heading, tabel, detail, media kaya, dan formula.
- Caption media tetap menggunakan caption HTML Telegram karena pesan kaya tidak menggantikan caption.
$400-600K tidak diparsing sebagai matematika. Teks kaya yang panjang dipecah secara otomatis sesuai batas teks kaya dan blok kaya Telegram. Tabel yang melampaui batas kolom Telegram dikirim sebagai blok kode.Default: nonaktif untuk kompatibilitas klien. Pesan kaya memerlukan klien Telegram yang kompatibel; beberapa klien Desktop, Web, Android, dan pihak ketiga saat ini menampilkan pesan kaya yang diterima sebagai tidak didukung. Biarkan opsi ini dinonaktifkan kecuali setiap klien yang digunakan dengan bot dapat merendernya. /status menampilkan apakah sesi Telegram saat ini menyalakan atau mematikan pesan kaya.Pratinjau tautan diaktifkan secara default. channels.telegram.linkPreview: false melewati deteksi entity otomatis untuk teks kaya.Perintah native dan perintah kustom
Perintah native dan perintah kustom
setMyCommands.Default perintah native:commands.native: "auto"mengaktifkan perintah native untuk Telegram
- nama dinormalisasi (hapus
/di awal, huruf kecil) - pola valid:
a-z,0-9,_, panjang1..32 - perintah kustom tidak dapat menimpa perintah native
- konflik/duplikat dilewati dan dicatat
- perintah kustom hanya berupa entri menu; perintah tersebut tidak otomatis mengimplementasikan perilaku
- perintah plugin/skill tetap dapat berfungsi ketika diketik meskipun tidak ditampilkan di menu Telegram
setMyCommands faileddenganBOT_COMMANDS_TOO_MUCHberarti menu Telegram masih meluap setelah dipangkas; kurangi perintah plugin/skill/kustom atau nonaktifkanchannels.telegram.commands.native.deleteWebhook,deleteMyCommands, atausetMyCommandsgagal dengan404: Not Foundsementara perintah curl Bot API langsung berfungsi dapat berartichannels.telegram.apiRootdisetel ke endpoint lengkap/bot<TOKEN>.apiRootharus hanya berupa root Bot API, danopenclaw doctor --fixmenghapus akhiran/bot<TOKEN>yang tidak sengaja.getMe returned 401berarti Telegram menolak token bot yang dikonfigurasi. PerbaruibotToken,tokenFile, atauTELEGRAM_BOT_TOKENdengan token BotFather saat ini; OpenClaw berhenti sebelum polling sehingga ini tidak dilaporkan sebagai kegagalan pembersihan webhook.setMyCommands faileddengan error jaringan/fetch biasanya berarti DNS/HTTPS keluar keapi.telegram.orgdiblokir.
Perintah pemasangan perangkat (plugin device-pair)
Ketika plugin device-pair terinstal:/pairmenghasilkan kode setup- tempel kode di aplikasi iOS
/pair pendingmencantumkan permintaan tertunda (termasuk peran/scope)- setujui permintaan:
/pair approve <requestId>untuk persetujuan eksplisit/pair approveketika hanya ada satu permintaan tertunda/pair approve latestuntuk yang paling baru
scopes: [] plus token handoff operator terbatas untuk onboarding mobile tepercaya. Token operator tersebut dapat membaca konfigurasi native saat setup, tetapi tidak memberikan scope mutasi pemasangan atau operator.admin.Jika perangkat mencoba ulang dengan detail auth yang berubah (misalnya peran/scope/public key), permintaan tertunda sebelumnya digantikan dan permintaan baru menggunakan requestId berbeda. Jalankan ulang /pair pending sebelum menyetujui.Detail selengkapnya: Pemasangan.Tombol inline
Tombol inline
offdmgroupallallowlist(default)
capabilities: ["inlineButtons"] dipetakan ke inlineButtons: "all".Contoh tindakan pesan:web_app Telegram hanya berfungsi di obrolan privat antara pengguna dan
bot.Klik callback yang tidak diklaim oleh handler interaktif Plugin terdaftar
diteruskan ke agen sebagai teks:
callback_data: <value>Tindakan pesan Telegram untuk agen dan automasi
Tindakan pesan Telegram untuk agen dan automasi
sendMessage(to,content, opsionalmediaUrl,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,contentataucaption, opsional tombol inlinepresentation; edit yang hanya berisi tombol memperbarui markup balasan)createForumTopic(chatId,name, opsionaliconColor,iconCustomEmojiId)
send, react, delete, edit, sticker, sticker-search, topic-create).Kontrol gating:channels.telegram.actions.sendMessagechannels.telegram.actions.deleteMessagechannels.telegram.actions.reactionschannels.telegram.actions.sticker(default: dinonaktifkan)
edit dan topic-create saat ini diaktifkan secara default dan tidak memiliki toggle channels.telegram.actions.* terpisah.
Pengiriman runtime menggunakan snapshot config/secret aktif (startup/reload), sehingga jalur tindakan tidak melakukan resolusi ulang SecretRef ad hoc per pengiriman.Semantik penghapusan reaksi: /tools/reactionsTag threading balasan
Tag threading balasan
[[reply_to_current]]membalas pesan pemicu[[reply_to:<id>]]membalas ID pesan Telegram tertentu
channels.telegram.replyToMode mengontrol penanganan:off(default)firstall
off menonaktifkan threading balasan implisit. Tag [[reply_to_*]] eksplisit tetap dihormati.Topik forum dan perilaku thread
Topik forum dan perilaku thread
- kunci sesi topik menambahkan
:topic:<threadId> - balasan dan pengetikan menargetkan thread topik
- jalur config topik:
channels.telegram.groups.<chatId>.topics.<threadId>
threadId=1):- pengiriman pesan menghilangkan
message_thread_id(Telegram menolaksendMessage(...thread_id=1)) - tindakan pengetikan tetap menyertakan
message_thread_id
requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy).
agentId hanya untuk topik dan tidak diwarisi dari default grup.
topics."*" menetapkan default untuk setiap topik dalam grup tersebut; ID topik yang persis tetap mengungguli "*".Perutean agen per topik: Setiap topik dapat dirutekan ke agen berbeda dengan mengatur agentId dalam config topik. Ini memberi setiap topik workspace, memori, dan sesi terisolasi sendiri. Contoh:agent:zu:telegram:group:-1001234567890:topic:3Binding topik ACP persisten: Topik forum dapat memasang pin sesi harness ACP melalui binding ACP bertipe tingkat atas (bindings[] dengan type: "acp" dan match.channel: "telegram", peer.kind: "group", serta id berkualifikasi topik seperti -1001234567890:topic:42). Saat ini dicakupkan ke topik forum dalam grup/supergroup. Lihat Agen ACP.Spawn ACP terikat thread dari chat: /acp spawn <agent> --thread here|auto mengikat topik saat ini ke sesi ACP baru; tindak lanjut dirutekan langsung ke sana. OpenClaw memasang pin konfirmasi spawn di dalam topik. Memerlukan channels.telegram.threadBindings.spawnSessions tetap diaktifkan (default: true).Konteks template mengekspos MessageThreadId dan IsForum. Obrolan DM dengan message_thread_id mempertahankan metadata balasan; obrolan tersebut menggunakan kunci sesi sadar thread hanya ketika Telegram getMe melaporkan has_topics_enabled: true untuk bot.
Penggantian dm.threadReplies dan direct.*.threadReplies sebelumnya sengaja dipensiunkan; gunakan mode threaded BotFather sebagai satu-satunya sumber kebenaran dan jalankan openclaw doctor --fix untuk menghapus kunci config usang.Audio, video, dan stiker
Audio, video, dan stiker
Pesan audio
Telegram membedakan catatan suara dan file audio.- default: perilaku file audio
- tag
[[audio_as_voice]]dalam balasan agen untuk memaksa pengiriman catatan suara - transkrip catatan suara masuk dibingkai sebagai teks yang dibuat mesin, tidak tepercaya dalam konteks agen; deteksi mention tetap menggunakan transkrip mentah sehingga pesan suara dengan gating mention tetap berfungsi.
Pesan video
Telegram membedakan berkas video dan catatan video.Contoh aksi pesan:Stiker
Penanganan stiker masuk:- WEBP statis: diunduh dan diproses (placeholder
<media:sticker>) - TGS animasi: dilewati
- WEBM video: dilewati
Sticker.emojiSticker.setNameSticker.fileIdSticker.fileUniqueIdSticker.cachedDescription
Reaction notifications
Reaction notifications
message_reaction (terpisah dari payload pesan).Jika diaktifkan, OpenClaw mengantrekan peristiwa sistem seperti:Telegram reaction added: 👍 by Alice (@alice) on msg 42
channels.telegram.reactionNotifications:off | own | all(default:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(default:minimal)
ownberarti reaksi pengguna hanya terhadap pesan yang dikirim bot (upaya terbaik melalui cache pesan terkirim).- Peristiwa reaksi tetap mematuhi kontrol akses Telegram (
dmPolicy,allowFrom,groupPolicy,groupAllowFrom); pengirim tidak sah akan dibuang. - Telegram tidak menyediakan ID utas dalam pembaruan reaksi.
- grup non-forum diarahkan ke sesi obrolan grup
- grup forum diarahkan ke sesi topik umum grup (
:topic:1), bukan topik asal yang persis
allowed_updates untuk polling/Webhook menyertakan message_reaction secara otomatis.Ack reactions
Ack reactions
ackReaction mengirim emoji pengakuan saat OpenClaw memproses pesan masuk. ackReactionScope menentukan kapan emoji itu benar-benar dikirim.Urutan resolusi emoji (ackReaction):channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- fallback emoji identitas agen (
agents.list[].identity.emoji, jika tidak ada ”👀”)
- Telegram mengharapkan emoji unicode (misalnya ”👀”).
- Gunakan
""untuk menonaktifkan reaksi bagi channel atau akun.
messages.ackReactionScope):Penyedia Telegram membaca cakupan dari messages.ackReactionScope (default "group-mentions"). Saat ini tidak ada override tingkat akun Telegram atau tingkat channel Telegram.Nilai: "all" (DM + grup), "direct" (hanya DM), "group-all" (setiap pesan grup, tanpa DM), "group-mentions" (grup saat bot disebut; tanpa DM — ini adalah default), "off" / "none" (dinonaktifkan)."group-mentions") tidak memicu reaksi ack dalam pesan langsung. Untuk mendapatkan reaksi ack pada DM Telegram masuk, atur messages.ackReactionScope ke "direct" atau "all". Nilai ini dibaca saat penyedia Telegram mulai berjalan, sehingga restart Gateway diperlukan agar perubahan berlaku.Config writes from Telegram events and commands
Config writes from Telegram events and commands
configWrites !== false).Penulisan yang dipicu Telegram mencakup:- peristiwa migrasi grup (
migrate_to_chat_id) untuk memperbaruichannels.telegram.groups /config setdan/config unset(memerlukan pengaktifan perintah)
Long polling vs webhook
Long polling vs webhook
channels.telegram.webhookUrl dan channels.telegram.webhookSecret; opsional webhookPath, webhookHost, webhookPort (default /telegram-webhook, 127.0.0.1, 8787).Dalam mode long-polling, OpenClaw mempertahankan watermark restart hanya setelah sebuah pembaruan berhasil didispatch. Jika handler gagal, pembaruan tersebut tetap dapat dicoba ulang dalam proses yang sama dan tidak ditulis sebagai selesai untuk deduplikasi restart.Listener lokal mengikat ke 127.0.0.1:8787. Untuk ingress publik, pasang proxy balik di depan port lokal atau atur webhookHost: "0.0.0.0" secara sengaja.Mode Webhook memvalidasi guard permintaan, token rahasia Telegram, dan body JSON sebelum mengembalikan 200 ke Telegram.
OpenClaw kemudian memproses pembaruan secara asinkron melalui lane bot per-obrolan/per-topik yang sama seperti yang digunakan oleh long polling, sehingga giliran agen yang lambat tidak menahan ACK pengiriman Telegram.Batas, percobaan ulang, dan target CLI
Batas, percobaan ulang, dan target CLI
- Default
channels.telegram.textChunkLimitadalah 4000. channels.telegram.chunkMode="newline"mengutamakan batas paragraf (baris kosong) sebelum pemisahan berdasarkan panjang.channels.telegram.mediaMaxMb(default 100) membatasi ukuran media Telegram masuk dan keluar.channels.telegram.mediaGroupFlushMs(default 500) mengontrol berapa lama album/grup media Telegram ditampung sebelum OpenClaw mengirimkannya sebagai satu pesan masuk. Tingkatkan jika bagian album datang terlambat; turunkan untuk mengurangi latensi balasan album.channels.telegram.timeoutSecondsmengganti batas waktu klien API Telegram (jika tidak diatur, default grammY berlaku). Klien bot membatasi nilai yang dikonfigurasi di bawah penjaga permintaan teks/pengetikan keluar 60 detik agar grammY tidak membatalkan pengiriman balasan yang terlihat sebelum penjaga transport dan cadangan OpenClaw dapat berjalan. Long polling tetap menggunakan penjaga permintaangetUpdates45 detik agar polling menganggur tidak ditinggalkan tanpa batas.channels.telegram.pollingStallThresholdMsdefault ke120000; sesuaikan antara30000dan600000hanya untuk restart polling-stall positif palsu.- riwayat konteks grup menggunakan
channels.telegram.historyLimitataumessages.groupChat.historyLimit(default 50);0menonaktifkan. - konteks tambahan balasan/kutipan/terusan dinormalisasi menjadi satu jendela konteks percakapan terpilih ketika gateway telah mengamati pesan induk; cache pesan yang diamati berada di status Plugin SQLite OpenClaw, dan
openclaw doctor --fixmengimpor sidecar lama. Telegram hanya menyertakan satureply_to_messagedangkal dalam pembaruan, jadi rantai yang lebih lama daripada cache dibatasi oleh payload pembaruan Telegram saat ini. - allowlist Telegram terutama membatasi siapa yang dapat memicu agen, bukan batas penyuntingan konteks tambahan penuh.
- Kontrol riwayat DM:
channels.telegram.dmHistoryLimitchannels.telegram.dms["<user_id>"].historyLimit
- Konfigurasi
channels.telegram.retryberlaku untuk helper pengiriman Telegram (CLI/alat/tindakan) untuk error API keluar yang dapat dipulihkan. Pengiriman balasan akhir masuk juga menggunakan percobaan ulang safe-send terbatas untuk kegagalan pra-koneksi Telegram, tetapi tidak mencoba ulang amplop jaringan pasca-kirim yang ambigu yang dapat menggandakan pesan terlihat.
openclaw message poll dan mendukung topik forum:--poll-duration-seconds(5-600)--poll-anonymous--poll-public--thread-iduntuk topik forum (atau gunakan target:topic:)
--presentationdengan blokbuttonsuntuk keyboard inline ketikachannels.telegram.capabilities.inlineButtonsmengizinkannya--pinatau--delivery '{"pin":true}'untuk meminta pengiriman yang disematkan ketika bot dapat menyematkan di chat tersebut--force-documentuntuk mengirim gambar, GIF, dan video keluar sebagai dokumen, bukan unggahan foto terkompresi, media animasi, atau video
channels.telegram.actions.sendMessage=falsemenonaktifkan pesan Telegram keluar, termasuk pollchannels.telegram.actions.poll=falsemenonaktifkan pembuatan poll Telegram sambil tetap mengaktifkan pengiriman biasa
Persetujuan exec di Telegram
Persetujuan exec di Telegram
channels.telegram.execApprovals.enabled(otomatis aktif ketika setidaknya satu pemberi persetujuan dapat diresolusikan)channels.telegram.execApprovals.approvers(fallback ke ID pemilik numerik daricommands.ownerAllowFrom)channels.telegram.execApprovals.target:dm(default) |channel|bothagentFilter,sessionFilter
channels.telegram.allowFrom, groupAllowFrom, dan defaultTo mengontrol siapa yang dapat berbicara ke bot dan ke mana bot mengirim balasan normal. Kunci tersebut tidak menjadikan seseorang pemberi persetujuan exec. Pasangan DM pertama yang disetujui mem-bootstrap commands.ownerAllowFrom ketika belum ada pemilik perintah, sehingga penyiapan satu pemilik tetap berfungsi tanpa menduplikasi ID di bawah execApprovals.approvers.Pengiriman kanal menampilkan teks perintah di chat; aktifkan channel atau both hanya di grup/topik tepercaya. Ketika prompt tiba di topik forum, OpenClaw mempertahankan topik untuk prompt persetujuan dan tindak lanjutnya. Persetujuan exec kedaluwarsa setelah 30 menit secara default.Tombol persetujuan inline juga membutuhkan channels.telegram.capabilities.inlineButtons untuk mengizinkan permukaan target (dm, group, atau all). ID persetujuan yang diawali dengan plugin: diresolusikan melalui persetujuan plugin; lainnya diresolusikan melalui persetujuan exec terlebih dahulu.Lihat Persetujuan exec.Kontrol balasan error
Ketika agen mengalami error pengiriman atau penyedia, kebijakan error mengontrol apakah pesan error dikirim ke chat Telegram:| Kunci | Nilai | Default | Deskripsi |
|---|---|---|---|
channels.telegram.errorPolicy | always, once, silent | always | always — kirim setiap pesan error ke chat. once — kirim setiap pesan error unik satu kali per jendela cooldown (menekan error identik yang berulang). silent — jangan pernah kirim pesan error ke chat. |
channels.telegram.errorCooldownMs | angka (ms) | 14400000 (4j) | Jendela cooldown untuk kebijakan once. Setelah error dikirim, pesan error yang sama ditekan hingga interval ini berlalu. Mencegah spam error selama gangguan. |
Pemecahan masalah
Bot tidak merespons pesan grup tanpa mention
Bot tidak merespons pesan grup tanpa mention
- Jika
requireMention=false, mode privasi Telegram harus mengizinkan visibilitas penuh.- BotFather:
/setprivacy-> Disable - lalu hapus + tambahkan kembali bot ke grup
- BotFather:
openclaw channels statusmemperingatkan ketika konfigurasi mengharapkan pesan grup tanpa mention.openclaw channels status --probedapat memeriksa ID grup numerik eksplisit; wildcard"*"tidak dapat diperiksa keanggotaannya.- uji sesi cepat:
/activation always.
Bot sama sekali tidak melihat pesan grup
Bot sama sekali tidak melihat pesan grup
- ketika
channels.telegram.groupsada, grup harus dicantumkan (atau menyertakan"*") - verifikasi keanggotaan bot di grup
- tinjau log:
openclaw logs --followuntuk alasan dilewati
Perintah berfungsi sebagian atau tidak sama sekali
Perintah berfungsi sebagian atau tidak sama sekali
- otorisasi identitas pengirim Anda (pairing dan/atau
allowFromnumerik) - otorisasi perintah tetap berlaku bahkan ketika kebijakan grup adalah
open setMyCommands faileddenganBOT_COMMANDS_TOO_MUCHberarti menu native memiliki terlalu banyak entri; kurangi perintah plugin/skill/kustom atau nonaktifkan menu native- Panggilan startup
deleteMyCommands/setMyCommandsdan panggilan pengetikansendChatActiondibatasi dan dicoba ulang satu kali melalui cadangan transport Telegram saat batas waktu permintaan. Error jaringan/fetch yang persisten biasanya menunjukkan masalah keterjangkauan DNS/HTTPS keapi.telegram.org
Startup melaporkan token tidak terotorisasi
Startup melaporkan token tidak terotorisasi
getMe returned 401adalah kegagalan autentikasi Telegram untuk token bot yang dikonfigurasi.- Salin ulang atau buat ulang token bot di BotFather, lalu perbarui
channels.telegram.botToken,channels.telegram.tokenFile,channels.telegram.accounts.<id>.botToken, atauTELEGRAM_BOT_TOKENuntuk akun default. deleteWebhook 401 Unauthorizedselama startup juga merupakan kegagalan auth; memperlakukannya sebagai “tidak ada webhook” hanya akan menunda kegagalan token buruk yang sama ke panggilan API berikutnya.
Ketidakstabilan polling atau jaringan
Ketidakstabilan polling atau jaringan
- Node 22+ + fetch/proxy kustom dapat memicu perilaku batal seketika jika tipe AbortSignal tidak cocok.
- Beberapa host meresolusikan
api.telegram.orgke IPv6 terlebih dahulu; egress IPv6 yang rusak dapat menyebabkan kegagalan API Telegram intermiten. - Jika log menyertakan
TypeError: fetch failedatauNetwork request for 'getUpdates' failed!, OpenClaw sekarang mencoba ulang ini sebagai error jaringan yang dapat dipulihkan. - Selama startup polling, OpenClaw menggunakan kembali probe startup
getMeyang berhasil untuk grammY sehingga runner tidak memerlukangetMekedua sebelumgetUpdatespertama. - Jika
deleteWebhookgagal dengan error jaringan sementara selama startup polling, OpenClaw melanjutkan ke long polling alih-alih membuat panggilan control-plane pra-polling lain. Webhook yang masih aktif muncul sebagai konflikgetUpdates; OpenClaw lalu membangun ulang transport Telegram dan mencoba ulang pembersihan webhook. - Jika soket Telegram didaur ulang pada kadens tetap yang pendek, periksa
channels.telegram.timeoutSecondsyang rendah; klien bot membatasi nilai yang dikonfigurasi di bawah penjaga permintaan keluar dangetUpdates, tetapi rilis lama dapat membatalkan setiap polling atau balasan ketika nilai ini diatur di bawah penjaga tersebut. - Jika log menyertakan
Polling stall detected, OpenClaw memulai ulang polling dan membangun ulang transport Telegram setelah 120 detik tanpa liveness long-poll yang selesai secara default. openclaw channels status --probedanopenclaw doctormemperingatkan ketika akun polling yang berjalan belum menyelesaikangetUpdatessetelah grace startup, ketika akun webhook yang berjalan belum menyelesaikansetWebhooksetelah grace startup, atau ketika aktivitas transport polling terakhir yang berhasil sudah basi.- Tingkatkan
channels.telegram.pollingStallThresholdMshanya ketika panggilangetUpdatesyang berjalan lama sehat tetapi host Anda masih melaporkan restart polling-stall positif palsu. Stall persisten biasanya mengarah ke masalah proxy, DNS, IPv6, atau egress TLS antara host danapi.telegram.org. - Telegram juga menghormati env proxy proses untuk transport Bot API, termasuk
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY, dan varian huruf kecilnya.NO_PROXY/no_proxytetap dapat melewatiapi.telegram.org. - Jika proxy terkelola OpenClaw dikonfigurasi melalui
OPENCLAW_PROXY_URLuntuk lingkungan layanan dan tidak ada env proxy standar, Telegram juga menggunakan URL tersebut untuk transport Bot API. - Pada host VPS dengan egress/TLS langsung yang tidak stabil, rutekan panggilan API Telegram melalui
channels.telegram.proxy:
- Node 22+ default ke
autoSelectFamily=true(kecuali WSL2). Urutan hasil DNS Telegram mengikutiOPENCLAW_TELEGRAM_DNS_RESULT_ORDER, laluchannels.telegram.network.dnsResultOrder, lalu default proses sepertiNODE_OPTIONS=--dns-result-order=ipv4first; jika tidak ada yang berlaku, Node 22+ beralih keipv4first. - Jika host Anda adalah WSL2 atau secara eksplisit bekerja lebih baik dengan perilaku khusus IPv4, paksa pemilihan family:
- Jawaban rentang benchmark RFC 2544 (
198.18.0.0/15) sudah diizinkan untuk unduhan media Telegram secara default. Jika fake-IP tepercaya atau proksi transparan menulis ulangapi.telegram.orgke alamat privat/internal/penggunaan-khusus lain selama unduhan media, Anda dapat ikut serta dalam bypass khusus Telegram:
- Opt-in yang sama tersedia per akun di
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork. - Jika proksi Anda me-resolve host media Telegram menjadi
198.18.x.x, biarkan flag berbahaya tetap nonaktif terlebih dahulu. Media Telegram sudah mengizinkan rentang benchmark RFC 2544 secara default.
- Override lingkungan (sementara):
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
- Validasi jawaban DNS:
Referensi konfigurasi
Referensi utama: Referensi konfigurasi - Telegram.Bidang Telegram bernilai sinyal tinggi
Bidang Telegram bernilai sinyal tinggi
- startup/auth:
enabled,botToken,tokenFile,accounts.*(tokenFileharus menunjuk ke file reguler; symlink ditolak) - kontrol akses:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*,bindings[]tingkat atas (type: "acp") - default topik:
groups.<chatId>.topics."*"berlaku untuk topik forum yang tidak cocok; ID topik persis menimpanya - persetujuan exec:
execApprovals,accounts.*.execApprovals - perintah/menu:
commands.native,commands.nativeSkills,customCommands - threading/balasan:
replyToMode - streaming:
streaming(pratinjau),streaming.preview.toolProgress,blockStreaming - pemformatan/pengiriman:
textChunkLimit,chunkMode,richMessages,linkPreview,responsePrefix - media/jaringan:
mediaMaxMb,mediaGroupFlushMs,timeoutSeconds,pollingStallThresholdMs,retry,network.autoSelectFamily,network.dangerouslyAllowPrivateNetwork,proxy - root API kustom:
apiRoot(hanya root Bot API; jangan sertakan/bot<TOKEN>) - webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost - aksi/kapabilitas:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker - reaksi:
reactionNotifications,reactionLevel - error:
errorPolicy,errorCooldownMs - penulisan/riwayat:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit
channels.telegram.defaultAccount (atau sertakan channels.telegram.accounts.default) agar routing default eksplisit. Jika tidak, OpenClaw beralih ke ID akun ternormalisasi pertama dan openclaw doctor memberi peringatan. Akun bernama mewarisi channels.telegram.allowFrom / groupAllowFrom, tetapi tidak nilai accounts.default.*.