Messages and delivery
Pesan
Pesan masuk melewati perutean, deduplikasi/debounce, proses agen, dan pengiriman keluar:
Pesan masuk -> perutean/pengikatan -> kunci sesi -> deduplikasi + debounce -> antrean (jika proses sudah aktif) -> proses agen (streaming + alat) -> balasan keluar (batas kanal + pemotongan)Permukaan konfigurasi utama:
messages.*untuk prefiks, pengantrean, debounce pesan masuk, dan perilaku grup.agents.defaults.*untuk streaming blok, pemotongan, dan nilai default balasan senyap.- Penimpaan kanal (
channels.telegram.*,channels.whatsapp.*, dll.) untuk batas dan pengaturan streaming per kanal.
Lihat Konfigurasi untuk skema lengkap.
Deduplikasi pesan masuk
Kanal dapat mengirimkan ulang pesan yang sama setelah tersambung kembali. OpenClaw menyimpan cache dalam memori yang dikunci berdasarkan cakupan agen, rute kanal (kanal + rekan + akun + utas), dan ID pesan, sehingga pesan yang dikirimkan ulang tidak memicu proses agen kedua. Entri cache kedaluwarsa setelah 20 menit atau setelah 5000 entri dilacak, mana pun yang terjadi lebih dahulu.
Debounce pesan masuk
Pesan teks berurutan dengan cepat dari pengirim yang sama dapat dikumpulkan menjadi satu giliran agen melalui messages.inbound. Debounce dicakup per kanal + percakapan dan menggunakan pesan terbaru untuk pengutasan/ID balasan.
{ messages: { inbound: { debounceMs: 2000, byChannel: { discord: 1500, slack: 1500, whatsapp: 5000, }, }, },}- Debounce berlaku hanya untuk pesan teks; media/lampiran langsung mengosongkan kumpulan.
- Perintah kontrol (stop/abort/status, dll.) melewati debounce agar langsung dikirim.
- Dinonaktifkan secara default:
messages.inbound.debounceMstidak memiliki nilai default bawaan, sehingga debounce hanya aktif setelah Anda mengaturnya (secara global atau per kanal). - Pilihan keikutsertaan
coalesceSameSenderDmsmilik iMessage adalah satu-satunya pengecualian: pengaturan ini menahan semua teks DM dari pengirim yang sama (termasuk perintah) cukup lama agar pengiriman terpisah perintah+URL dari Apple tiba sebagai satu giliran. Obrolan grup selalu dikirim seketika terlepas dari pengaturan ini.
Sesi dan perangkat
Sesi dimiliki oleh Gateway, bukan oleh klien.
- Obrolan langsung digabungkan ke kunci sesi utama agen.
- Grup/kanal memiliki kunci sesi masing-masing.
- Penyimpanan sesi dan transkrip berada di host Gateway.
Beberapa perangkat/kanal dapat dipetakan ke sesi yang sama, tetapi riwayat tidak sepenuhnya disinkronkan kembali ke setiap klien. Gunakan satu perangkat utama untuk percakapan panjang agar konteks tidak menyimpang. UI Kontrol dan TUI selalu menampilkan transkrip sesi yang didukung Gateway, sehingga keduanya merupakan sumber kebenaran.
Detail: Pengelolaan sesi.
Isi prompt dan konteks riwayat
Plugin kanal mengisi beberapa bidang teks pada konteks pesan masuk, dari yang paling hingga paling tidak diutamakan:
| Bidang | Tujuan |
|---|---|
BodyForAgent |
Teks yang ditampilkan kepada model untuk giliran saat ini. Beralih ke CommandBody / RawBody / Body jika tidak ditetapkan. |
BodyForCommands |
Teks bersih yang digunakan untuk penguraian arahan/perintah. Beralih ke CommandBody / RawBody / Body jika tidak ditetapkan. |
CommandBody |
Isi perantara lama; utamakan BodyForCommands. |
RawBody |
Alias usang untuk CommandBody. |
Body |
Isi prompt lama; dapat menyertakan amplop kanal dan pembungkus riwayat. |
Saat kanal menyediakan riwayat, kanal membungkusnya dengan:
[Chat messages since your last reply - for context][Current message - respond to this]
Untuk obrolan nonlangsung (grup/kanal/ruang), isi pesan saat ini diawali dengan label pengirim, sesuai dengan gaya yang digunakan untuk entri riwayat. Penghapusan arahan hanya berlaku pada bagian pesan saat ini, sehingga riwayat tetap utuh. Kanal yang membungkus riwayat harus menetapkan BodyForCommands (atau CommandBody / RawBody yang lama) ke teks pesan asli dan mempertahankan Body sebagai prompt gabungan.
Buffer riwayat hanya berisi pesan tertunda: buffer ini mencakup pesan grup yang tidak memicu proses (misalnya, pesan yang memerlukan penyebutan) dan mengecualikan pesan yang sudah ada dalam transkrip sesi. Riwayat terstruktur, balasan, pesan yang diteruskan, dan metadata kanal dirender sebagai blok konteks peran pengguna yang tidak tepercaya selama penyusunan prompt.
Konfigurasikan ukuran riwayat dengan messages.groupChat.historyLimit (nilai default global) atau penimpaan per kanal seperti channels.slack.historyLimit dan channels.telegram.accounts.<id>.historyLimit (tetapkan 0 untuk menonaktifkannya).
Metadata hasil alat
content pada hasil alat adalah hasil yang terlihat oleh model; details adalah metadata runtime untuk rendering UI, diagnostik, pengiriman media, dan Plugin.
toolResult.detailsdihapus sebelum pemutaran ulang penyedia dan sebelum masukan Compaction.- Transkrip sesi tersimpan hanya mempertahankan
detailsyang dibatasi; metadata yang terlalu besar diganti dengan ringkasan ringkas bertandapersistedDetailsTruncated: true. - Plugin dan alat harus menempatkan teks yang wajib dibaca model di
content, bukan hanya didetails.
Pengantrean dan tindak lanjut
Saat proses sudah aktif, pesan masuk diarahkan ke dalamnya secara default. messages.queue mengontrol mode:
| Mode | Perilaku |
|---|---|
steer (default) |
Suntikkan prompt baru ke proses aktif. |
followup |
Jalankan pesan setelah proses aktif selesai. |
collect |
Kumpulkan pesan yang kompatibel menjadi satu giliran berikutnya. |
interrupt |
Batalkan proses aktif, lalu mulai prompt terbaru. |
Antrean menggunakan debounce bawaan 500ms untuk pengumpulan steer, tindak lanjut, dan collect. messages.queue.cap memiliki nilai default 20 pesan dalam antrean, dan messages.queue.drop memiliki nilai default summarize (old dan new juga tersedia). Konfigurasikan penimpaan per kanal melalui messages.queue.byChannel dan messages.queue.debounceMsByChannel.
Detail: Antrean perintah dan Antrean pengarah.
Kepemilikan proses kanal
Plugin kanal dapat mempertahankan urutan, menerapkan debounce pada masukan, dan menerapkan tekanan balik transportasi sebelum pesan memasuki antrean sesi. Plugin tidak boleh menetapkan batas waktu terpisah untuk giliran agen itu sendiri. Setelah pesan dirutekan ke sesi, siklus hidup sesi, alat, dan runtime mengatur pekerjaan yang berlangsung lama agar semua kanal melaporkan dan pulih dari giliran yang lambat secara konsisten.
Streaming, pemotongan, dan pengumpulan
Streaming blok mengirimkan balasan parsial saat model menghasilkan blok teks; pemotongan mematuhi batas teks kanal dan menghindari pemisahan kode berpagar.
agents.defaults.blockStreamingDefault(on|off, nilai defaultoff)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(pengumpulan berdasarkan waktu tidak aktif)agents.defaults.humanDelay(jeda menyerupai manusia di antara balasan blok)- Penimpaan kanal:
*.streaming.block.enableddan*.streaming.block.coalescepada kanal bawaan; kunci datar usang dimigrasikan olehopenclaw doctor --fix. Streaming blok dinonaktifkan kecuali diaktifkan secara eksplisit, pada setiap kanal termasuk Telegram. QQ Bot adalah pengecualian: QQ Bot tidak memiliki kuncistreaming.blockdan men-streaming balasan blok kecualichannels.qqbot.streaming.modebernilai"off".
Detail: Streaming + pemotongan.
Visibilitas penalaran dan token
/reasoning on|off|streammengontrol visibilitas.- Konten penalaran tetap dihitung dalam penggunaan token saat model menghasilkannya.
- Telegram mendukung streaming penalaran ke gelembung draf sementara yang dihapus setelah pengiriman akhir; gunakan
/reasoning onuntuk keluaran penalaran persisten.
Detail: Arahan pemikiran + penalaran dan Penggunaan token.
Prefiks, pengutasan, dan balasan
- Urutan prefiks keluar:
messages.responsePrefix,channels.<channel>.responsePrefix,channels.<channel>.accounts.<id>.responsePrefix. WhatsApp juga memilikichannels.whatsapp.messagePrefixuntuk prefiks pesan masuk. - Pengutasan balasan melalui
replyToModedan nilai default per kanal.
Detail: Konfigurasi dan dokumentasi kanal.
Balasan senyap
Token senyap NO_REPLY (tidak peka huruf besar/kecil, sehingga no_reply juga cocok) berarti "jangan kirimkan balasan yang terlihat oleh pengguna." Saat suatu giliran juga memiliki media alat yang tertunda, seperti audio TTS yang dihasilkan, OpenClaw menghapus teks senyap tetapi tetap mengirimkan lampiran media.
Kebijakan kesenyapan ditentukan berdasarkan jenis percakapan:
- Percakapan langsung tidak pernah menerima panduan prompt
NO_REPLY. Jika proses langsung secara tidak sengaja mengembalikan token senyap saja, OpenClaw menekannya alih-alih menulis ulang atau mengirimkannya. - Grup/kanal mengizinkan kesenyapan secara default. Dalam mode balasan terlihat
message_tool, kesenyapan berarti model tidak memanggilmessage(action=send). - Orkestrasi internal mengizinkan kesenyapan secara default.
Nilai default berada di bawah agents.defaults.silentReply; surfaces.<id>.silentReply dapat menimpa kebijakan grup/internal per permukaan.
OpenClaw juga menggunakan balasan senyap untuk kegagalan runner internal generik dalam obrolan nonlangsung, sehingga grup/kanal tidak melihat teks standar kesalahan Gateway. Kegagalan yang diklasifikasikan dengan teks pemulihan untuk pengguna, seperti pemberitahuan autentikasi yang hilang, batas laju, atau beban berlebih, tetap dapat dikirimkan. Obrolan langsung menampilkan teks kegagalan ringkas secara default; detail mentah runner hanya ditampilkan saat /verbose full diaktifkan.
Balasan yang hanya berisi token senyap dibuang pada semua permukaan, sehingga sesi induk tetap senyap alih-alih menulis ulang teks sentinel menjadi percakapan cadangan.
Terkait
- Refaktor siklus hidup pesan - desain target pengiriman dan penerimaan yang tahan lama
- Streaming - pengiriman pesan waktu nyata
- Percobaan ulang - perilaku percobaan ulang pengiriman pesan
- Antrean - antrean pemrosesan pesan
- Kanal - integrasi platform perpesanan