Messages and delivery
Pesan
OpenClaw menangani pesan masuk melalui pipeline resolusi sesi, antrean, streaming, eksekusi alat, dan visibilitas penalaran. Halaman ini memetakan jalur dari pesan masuk hingga balasan.
Alur pesan (tingkat tinggi)
Inbound message -> routing/bindings -> session key -> queue (if a run is active) -> agent run (streaming + tools) -> outbound replies (channel limits + chunking)Knob utama berada di konfigurasi:
messages.*untuk prefiks, antrean, dan perilaku grup.agents.defaults.*untuk default streaming blok dan pemotongan.- Override saluran (
channels.whatsapp.*,channels.telegram.*, dll.) untuk batas dan toggle streaming.
Lihat Konfigurasi untuk skema lengkap.
Deduplikasi masuk
Saluran dapat mengirim ulang pesan yang sama setelah koneksi ulang. OpenClaw menyimpan cache berumur singkat yang dikunci berdasarkan saluran/akun/peer/sesi/id pesan agar pengiriman duplikat tidak memicu proses agen lain.
Debouncing masuk
Pesan beruntun cepat dari pengirim yang sama dapat digabungkan menjadi satu
giliran agen melalui messages.inbound. Debouncing dicakup per saluran + percakapan
dan menggunakan pesan terbaru untuk threading/id balasan.
Konfigurasi (default global + override per saluran):
{ messages: { inbound: { debounceMs: 2000, byChannel: { whatsapp: 5000, slack: 1500, discord: 1500, }, }, },}Catatan:
- Debounce berlaku untuk pesan hanya teks; media/lampiran langsung dikirim.
- Perintah kontrol melewati debouncing agar tetap berdiri sendiri. Saluran yang secara eksplisit memilih ikut dalam penggabungan DM dari pengirim yang sama dapat mempertahankan perintah DM di dalam jendela debounce sehingga payload kirim-terpisah dapat bergabung ke giliran agen yang sama.
Sesi dan perangkat
Sesi dimiliki oleh Gateway, bukan oleh klien.
- Chat langsung diringkas ke kunci sesi utama agen.
- Grup/saluran mendapatkan kunci sesinya sendiri.
- Penyimpanan sesi dan transkrip berada di host Gateway.
Beberapa perangkat/saluran dapat dipetakan ke sesi yang sama, tetapi riwayat tidak sepenuhnya disinkronkan kembali ke setiap klien. Rekomendasi: gunakan satu perangkat utama untuk percakapan panjang agar konteks tidak bercabang. UI Kontrol dan TUI selalu menampilkan transkrip sesi yang didukung Gateway, sehingga keduanya menjadi sumber kebenaran.
Detail: Manajemen sesi.
Metadata hasil alat
content hasil alat adalah hasil yang terlihat oleh model. details hasil alat adalah
metadata runtime untuk rendering UI, diagnostik, pengiriman media, dan Plugin.
OpenClaw menjaga batas tersebut tetap eksplisit:
toolResult.detailsdihapus sebelum replay penyedia dan input Compaction.- Transkrip sesi yang dipersistenkan hanya menyimpan
detailsyang berbatas; metadata terlalu besar diganti dengan ringkasan ringkas bertandapersistedDetailsTruncated: true. - Plugin dan alat harus menaruh teks yang harus dibaca model di
content, bukan hanya didetails.
Isi masuk dan konteks riwayat
OpenClaw memisahkan isi prompt dari isi perintah:
BodyForAgent: teks utama yang menghadap model untuk pesan saat ini. Plugin saluran harus menjaga ini tetap berfokus pada teks pengirim saat ini yang memuat prompt.Body: fallback prompt lama. Ini dapat mencakup amplop saluran dan wrapper riwayat opsional, tetapi saluran saat ini tidak boleh mengandalkannya sebagai input model utama ketikaBodyForAgenttersedia.CommandBody: teks pengguna mentah untuk penguraian direktif/perintah.RawBody: alias lama untukCommandBody(dipertahankan untuk kompatibilitas).
Ketika saluran menyediakan riwayat, saluran menggunakan wrapper bersama:
[Chat messages since your last reply - for context][Current message - respond to this]
Untuk chat non-langsung (grup/saluran/ruang), isi pesan saat ini diberi prefiks dengan label pengirim (gaya yang sama digunakan untuk entri riwayat). Ini menjaga pesan real-time dan antrean/riwayat tetap konsisten dalam prompt agen.
Buffer riwayat bersifat hanya tertunda: buffer menyertakan pesan grup yang tidak memicu proses jalan (misalnya, pesan yang dibatasi oleh mention) dan mengecualikan pesan yang sudah ada di transkrip sesi.
Penghapusan direktif hanya berlaku untuk bagian pesan saat ini sehingga riwayat
tetap utuh. Saluran yang membungkus riwayat harus menetapkan CommandBody (atau
RawBody) ke teks pesan asli dan mempertahankan Body sebagai prompt gabungan.
Riwayat terstruktur, balasan, pesan yang diteruskan, dan metadata saluran dirender sebagai
blok konteks tidak tepercaya berperan pengguna selama penyusunan prompt.
Buffer riwayat dapat dikonfigurasi melalui messages.groupChat.historyLimit (default
global) dan override per saluran seperti channels.slack.historyLimit atau
channels.telegram.accounts.<id>.historyLimit (atur 0 untuk menonaktifkan).
Antrean dan tindak lanjut
Jika proses jalan sudah aktif, pesan masuk diarahkan ke proses saat ini secara
default. messages.queue memilih apakah pesan proses-aktif diarahkan, diantrekan untuk
nanti, dikumpulkan menjadi satu giliran nanti, atau menginterupsi proses aktif.
- Konfigurasikan melalui
messages.queue(danmessages.queue.byChannel). - Mode default adalah
steer, dengan debounce 500 md untuk batch pengarahan Codex dan antrean tindak lanjut/kumpulkan. - Mode:
steer,followup,collect, daninterrupt.
Detail: Antrean perintah dan Antrean pengarahan.
Kepemilikan proses saluran
Plugin saluran dapat mempertahankan urutan, men-debounce input, dan menerapkan backpressure transport sebelum pesan masuk ke antrean sesi. Plugin tidak boleh memberlakukan timeout terpisah di sekitar giliran agen itu sendiri. Setelah pesan dirutekan ke sesi, pekerjaan berjalan lama diatur oleh siklus hidup sesi, alat, dan runtime sehingga semua saluran melaporkan dan pulih dari giliran lambat secara konsisten.
Streaming, pemotongan, dan batching
Streaming blok mengirim balasan parsial saat model menghasilkan blok teks. Pemotongan menghormati batas teks saluran dan menghindari pemisahan kode berpagar.
Pengaturan utama:
agents.defaults.blockStreamingDefault(on|off, default nonaktif)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(batching berbasis idle)agents.defaults.humanDelay(jeda seperti manusia di antara balasan blok)- Override saluran:
*.blockStreamingdan*.blockStreamingCoalesce(saluran non-Telegram memerlukan*.blockStreaming: trueeksplisit)
Detail: Streaming + pemotongan.
Visibilitas dan token penalaran
OpenClaw dapat menampilkan atau menyembunyikan penalaran model:
/reasoning on|off|streammengontrol visibilitas.- Konten penalaran tetap dihitung terhadap penggunaan token saat diproduksi oleh model.
- Telegram mendukung stream penalaran ke gelembung draf sementara yang dihapus setelah pengiriman final; gunakan
/reasoning onuntuk output penalaran persisten.
Detail: Direktif berpikir + penalaran dan Penggunaan token.
Prefiks, threading, dan balasan
Pemformatan pesan keluar dipusatkan di messages:
messages.responsePrefix,channels.<channel>.responsePrefix, danchannels.<channel>.accounts.<id>.responsePrefix(kaskade prefiks keluar), pluschannels.whatsapp.messagePrefix(prefiks masuk WhatsApp)- Threading balasan melalui
replyToModedan default per saluran
Detail: Konfigurasi dan dokumentasi saluran.
Balasan senyap
Token senyap persis NO_REPLY / no_reply berarti "jangan kirim balasan yang terlihat pengguna".
Ketika giliran juga memiliki media alat tertunda, seperti audio TTS yang dihasilkan, OpenClaw
menghapus teks senyap tetapi tetap mengirim lampiran media.
OpenClaw menyelesaikan perilaku itu berdasarkan jenis percakapan:
- Percakapan langsung tidak pernah menerima panduan prompt
NO_REPLY. Jika proses langsung secara tidak sengaja mengembalikan token senyap polos, OpenClaw menekannya alih-alih menulis ulang atau mengirimnya. - Grup/saluran mengizinkan senyap secara default hanya untuk balasan grup otomatis.
Dalam mode balasan-terlihat
message_tool, senyap berarti model tidak memanggilmessage(action=send). - Orkestrasi internal mengizinkan senyap secara default.
OpenClaw juga menggunakan balasan senyap untuk kegagalan runner internal generik di
chat non-langsung, sehingga grup/saluran tidak melihat boilerplate kesalahan Gateway.
Kegagalan terklasifikasi dengan salinan pemulihan yang menghadap pengguna, seperti auth hilang,
rate limit, atau pemberitahuan overload, tetap dapat dikirim. Chat langsung menampilkan
salinan kegagalan ringkas secara default; detail runner mentah hanya ditampilkan saat
/verbose full diaktifkan.
Default berada di bawah agents.defaults.silentReply; surfaces.<id>.silentReply
dapat meng-override kebijakan grup/internal per surface.
Balasan senyap polos dibuang di semua surface, sehingga sesi induk tetap diam alih-alih menulis ulang teks sentinel menjadi obrolan fallback.
Terkait
- Refaktor siklus hidup pesan - target desain kirim dan terima yang tahan lama
- Streaming — pengiriman pesan real-time
- Coba lagi — perilaku percobaan ulang pengiriman pesan
- Antrean — antrean pemrosesan pesan
- Saluran — integrasi platform perpesanan