メッセージと配信
コマンドキュー
私たちは、インバウンドの自動返信実行(すべてのチャネル)を、小さなプロセス内キューを通じてシリアライズし、複数のエージェント実行が衝突するのを防ぎながら、セッション間での安全な並列処理を可能にします。
理由
- 自動返信実行は(LLM呼び出しにより)高コストになる可能性があり、複数のインバウンドメッセージが近接して到着すると衝突する可能性があります。
- シリアライズすることで、共有リソース(セッションファイル、ログ、CLI標準入力)の競合を避け、上流のレート制限が発生する可能性を減らします。
仕組み
- レーン対応のFIFOキューが、設定可能な並行性上限(デフォルトでは未設定レーンは1;メインはデフォルト4、サブエージェントは8)で各レーンを排出します。
runEmbeddedPiAgentは セッションキー(レーンsession:<key>)によってエンキューし、セッションごとにアクティブな実行が1つだけであることを保証します。- 各セッション実行は、その後 グローバルレーン(デフォルトでは
main)にキューイングされるため、全体の並列処理はagents.defaults.maxConcurrentによって上限が設定されます。 - 詳細ログが有効な場合、キューイングされた実行は、開始前に約2秒以上待機した場合に短い通知を出力します。
- タイピングインジケータは、エンキュー時に(チャネルがサポートしている場合)即座に発火するため、順番を待っている間もユーザーエクスペリエンスは変わりません。
キューモード(チャネルごと)
インバウンドメッセージは、現在の実行を操縦したり、次のターンを待機したり、その両方を行ったりできます:
steer: 現在の実行に即座に注入します(次のツール境界の後に保留中のツール呼び出しをキャンセルします)。ストリーミングでない場合は、フォローアップにフォールバックします。followup: 現在の実行終了後の次のエージェントターンにエンキューします。collect: キューイングされたすべてのメッセージを 単一の フォローアップターンに統合します(デフォルト)。メッセージが異なるチャネル/スレッドを対象としている場合、ルーティングを維持するために個別に排出されます。steer-backlog(別名steer+backlog):今すぐ操縦し かつ フォローアップターンのためにメッセージを保持します。interrupt(レガシー):そのセッションのアクティブな実行を中止し、最新のメッセージを実行します。queue(レガシーエイリアス):steerと同じです。
Steer-backlogは、操縦された実行の後にフォローアップ応答を得ることができることを意味するため、ストリーミングサーフェスでは重複のように見えることがあります。インバウンドメッセージごとに1つの応答が必要な場合は、collect/steer を優先してください。スタンドアロンコマンドとして(セッションごとに) /queue collect を送信するか、messages.queue.byChannel.discord: "collect" を設定します。デフォルト(設定で未設定の場合):
- すべてのサーフェス →
collect
messages.queue を介してグローバルまたはチャネルごとに設定します:
{
messages: {
queue: {
mode: "collect",
debounceMs: 1000,
cap: 20,
drop: "summarize",
byChannel: { discord: "collect" },
},
},
}
キューオプション
オプションは followup、collect、steer-backlog(および steer がフォローアップにフォールバックする場合)に適用されます:
debounceMs: フォローアップターンを開始する前に静寂を待機します(「続けて、続けて」を防ぎます)。cap: セッションごとの最大キューイングメッセージ数。drop: オーバーフローポリシー(old、new、summarize)。
Summarizeは、ドロップされたメッセージの短い箇条書きリストを保持し、それを合成フォローアッププロンプトとして注入します。デフォルト:debounceMs: 1000、cap: 20、drop: summarize。
セッションごとのオーバーライド
- スタンドアロンコマンドとして
/queue <mode>を送信して、現在のセッションのモードを保存します。 - オプションは組み合わせ可能:
/queue collect debounce:2s cap:25 drop:summarize /queue defaultまたは/queue resetはセッションオーバーライドをクリアします。
スコープと保証
- ゲートウェイ返信パイプラインを使用するすべてのインバウンドチャネル(WhatsApp web、Telegram、Slack、Discord、Signal、iMessage、webchatなど)にわたる自動返信エージェント実行に適用されます。
- デフォルトレーン(
main)は、インバウンド + メインハートビートに対してプロセス全体で有効です;agents.defaults.maxConcurrentを設定して、複数のセッションを並列に実行できるようにします。 - 追加のレーンが存在する可能性があります(例:
cron、subagent)。これにより、バックグラウンドジョブがインバウンド返信をブロックせずに並列実行できます。 - セッションごとのレーンは、一度に1つのエージェント実行のみが特定のセッションに触れることを保証します。
- 外部依存関係やバックグラウンドワーカースレッドはありません;純粋なTypeScript + プロミスです。
トラブルシューティング
- コマンドが詰まっているように見える場合は、詳細ログを有効にし、「queued for …ms」行を探してキューが排出されていることを確認してください。
- キューの深さが必要な場合は、詳細ログを有効にしてキューのタイミング行を監視してください。