Command Queue(命令佇列,2026-01-16)
我們透過一個小型程序內佇列序列化入站自動回覆運行(所有頻道),以防止多個代理運行碰撞,同時仍允許跨會話的安全並行。原因
- 自動回覆運行可能很昂貴(LLM 呼叫),當多個入站訊息接近時可能會碰撞。
- 序列化避免競爭共享資源(會話檔案、日誌、CLI stdin)並減少上游速率限制的機會。
如何運作
- 車道感知的 FIFO 佇列以可設定的並行上限清空每個車道(未設定車道預設為 1;main 預設為 4,subagent 為 8)。
runEmbeddedPiAgent按會話鍵入隊(車道session:<key>)以保證每會話只有一個活動運行。- 然後每個會話運行被排入全域車道(預設
main),因此總並行性受agents.defaults.maxConcurrent限制。 - 當啟用詳細日誌時,如果排隊的運行在開始前等待超過 ~2s,會發出短通知。
- 輸入指示器仍然在入隊時立即觸發(當頻道支援時),因此在等待輪次時使用者體驗不變。
佇列模式(每頻道)
入站訊息可以引導當前運行、等待後續輪次或兩者都做:steer:立即注入當前運行(在下一個工具邊界後取消待處理的工具呼叫)。如果未串流,回退到 followup。followup:在當前運行結束後為下一個代理輪次入隊。collect:將所有排隊訊息合併為單一後續輪次(預設)。如果訊息針對不同頻道/討論串,它們會單獨清空以保留路由。steer-backlog(又名steer+backlog):現在引導並保留訊息用於後續輪次。interrupt(舊版):中止該會話的活動運行,然後運行最新訊息。queue(舊版別名):與steer相同。
collect/steer。
發送 /queue collect 作為獨立命令(每會話)或設定 messages.queue.byChannel.discord: "collect"。
預設值(在設定中未設定時):
- 所有介面 →
collect
messages.queue 全域或每頻道設定:
佇列選項
選項適用於followup、collect 和 steer-backlog(以及當 steer 回退到 followup 時):
debounceMs:在開始後續輪次之前等待安靜(防止「continue, continue」)。cap:每會話最大排隊訊息數。drop:溢出策略(old、new、summarize)。
debounceMs: 1000、cap: 20、drop: summarize。
每會話覆寫
- 發送
/queue <mode>作為獨立命令以儲存當前會話的模式。 - 選項可以組合:
/queue collect debounce:2s cap:25 drop:summarize /queue default或/queue reset清除會話覆寫。
範圍和保證
- 適用於使用 Gateway 回覆管道的所有入站頻道的自動回覆代理運行(WhatsApp web、Telegram、Slack、Discord、Signal、iMessage、webchat 等)。
- 預設車道(
main)對於入站 + 主心跳是程序範圍的;設定agents.defaults.maxConcurrent以允許多個會話並行。 - 可能存在額外車道(例如
cron、subagent),以便背景工作可以並行運行而不阻塞入站回覆。 - 每會話車道保證一次只有一個代理運行接觸給定會話。
- 無外部依賴或背景工作執行緒;純 TypeScript + promises。
疑難排解
- 如果命令似乎卡住,啟用詳細日誌並尋找「queued for …ms」行以確認佇列正在清空。
- 如果您需要佇列深度,啟用詳細日誌並觀察佇列計時行。