Antrean Perintah (2026-01-16)
Kami menserialisasi eksekusi balas otomatis masuk (semua kanal) melalui antrean kecil dalam proses untuk mencegah beberapa eksekusi agen saling bertabrakan, sambil tetap memungkinkan paralelisme yang aman di seluruh sesi.Mengapa
- Eksekusi balas otomatis bisa mahal (panggilan LLM) dan dapat bertabrakan ketika beberapa pesan masuk tiba dalam waktu berdekatan.
- Serialisasi menghindari persaingan atas sumber daya bersama (file sesi, log, stdin CLI) dan mengurangi kemungkinan terkena rate limit dari upstream.
Cara kerjanya
- Antrean FIFO yang sadar jalur menguras setiap jalur dengan batas konkurensi yang dapat dikonfigurasi (default 1 untuk jalur yang tidak dikonfigurasi;
maindefault 4,subagent8). runEmbeddedPiAgentmemasukkan ke antrean berdasarkan kunci sesi (jalursession:<key>) untuk menjamin hanya satu eksekusi aktif per sesi.- Setiap eksekusi sesi kemudian dimasukkan ke antrean ke jalur global (
mainsecara default) sehingga paralelisme keseluruhan dibatasi olehagents.defaults.maxConcurrent. - Saat logging verbose diaktifkan, eksekusi yang masuk antrean memancarkan pemberitahuan singkat jika menunggu lebih dari ~2 detik sebelum dimulai.
- Indikator mengetik tetap dipicu segera saat dimasukkan ke antrean (bila didukung oleh kanal) sehingga pengalaman pengguna tidak berubah saat menunggu giliran.
Mode antrean (per kanal)
Pesan masuk dapat mengarahkan eksekusi saat ini, menunggu giliran tindak lanjut, atau melakukan keduanya:steer: suntikkan segera ke eksekusi saat ini (membatalkan panggilan tool yang tertunda setelah batas tool berikutnya). Jika tidak sedang streaming, kembali ke followup.followup: masukkan ke antrean untuk giliran agen berikutnya setelah eksekusi saat ini berakhir.collect: gabungkan semua pesan yang masuk antrean menjadi satu giliran followup (default). Jika pesan menargetkan kanal/thread yang berbeda, pesan dikuras secara terpisah untuk mempertahankan routing.steer-backlog(aliassteer+backlog): steer sekarang dan simpan pesan untuk giliran followup.interrupt(lama): batalkan eksekusi aktif untuk sesi tersebut, lalu jalankan pesan terbaru.queue(alias lama): sama dengansteer.
collect/steer jika Anda ingin
satu respons per pesan masuk.
Kirim /queue collect sebagai perintah mandiri (per sesi) atau setel messages.queue.byChannel.discord: "collect".
Default (saat tidak disetel di config):
- Semua permukaan →
collect
messages.queue:
Opsi antrean
Opsi berlaku untukfollowup, collect, dan steer-backlog (serta untuk steer saat kembali ke followup):
debounceMs: tunggu hingga hening sebelum memulai giliran followup (mencegah “lanjutkan, lanjutkan”).cap: jumlah maksimum pesan yang masuk antrean per sesi.drop: kebijakan overflow (old,new,summarize).
debounceMs: 1000, cap: 20, drop: summarize.
Override per sesi
- Kirim
/queue <mode>sebagai perintah mandiri untuk menyimpan mode bagi sesi saat ini. - Opsi dapat digabungkan:
/queue collect debounce:2s cap:25 drop:summarize /queue defaultatau/queue resetmenghapus override sesi.
Cakupan dan jaminan
- Berlaku untuk eksekusi agen balas otomatis di seluruh kanal masuk yang menggunakan pipeline balasan gateway (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, dll.).
- Jalur default (
main) berlaku untuk seluruh proses bagi lalu lintas masuk + heartbeat utama; setelagents.defaults.maxConcurrentuntuk mengizinkan beberapa sesi berjalan paralel. - Jalur tambahan dapat ada (misalnya
cron,subagent) sehingga pekerjaan latar belakang dapat berjalan paralel tanpa memblokir balasan masuk. Eksekusi terlepas ini dilacak sebagai tugas latar belakang. - Jalur per sesi menjamin bahwa hanya satu eksekusi agen yang menyentuh sesi tertentu pada satu waktu.
- Tidak ada dependensi eksternal atau thread worker latar belakang; murni TypeScript + promise.
Pemecahan masalah
- Jika perintah tampak macet, aktifkan log verbose dan cari baris “queued for …ms” untuk memastikan antrean sedang dikuras.
- Jika Anda memerlukan kedalaman antrean, aktifkan log verbose dan perhatikan baris waktu antrean.