OpenClawSkills
GitHub
コア概念 • 5分で読める

コマンドキュー

インバウンド自動応答実行をシリアル化するコマンドキューの設計

複数のエージェント実行が競合するのを防ぎながら、セッション間で安全な並列処理を可能にするために、小さなプロセス内キューを介してインバウンド自動応答実行(すべてのチャネル)をシリアル化します。

Tutorial.step

Why

- 自動応答実行は高価(LLM 呼び出し)になる可能性があり、複数のインバウンドメッセージが同時に到着すると競合が発生する可能性があります。

- シリアル化は、共有リソース(セッションファイル、ログ、CLI 標準入力)の競合を回避し、上流レート制限の可能性を低減します。

Tutorial.step

仕組み

- チャネル対応 FIFO キューは、設定可能な並列性上限で各チャネルを排出します(設定されていないチャネルはデフォルトで 1、メインはデフォルトで 4、サブエージェントはデフォルトで 8)。

- ''runEmbeddedPiAgent'' は''セッションキー''(チャネル ''session:<key>'')でキューに入れ、セッションごとに最大 1 回のアクティブ実行を保証します。

- 各セッション実行はその後、''グローバルチャネル''(デフォルト ''main'')にキューに入れられるため、全体的な並列性は ''agents.defaults.maxConcurrent'' で制限されます。

- 詳細ログが有効になっている場合、キューに入れられた実行が開始前に 2 秒以上待機すると、短い通知が発行されます。

- タイピングインジケーターは、キューに入れたときにすぐに起動します(チャネルがサポートしている場合)、私たちの順番を待っている間、ユーザー体験は変わりません。

Tutorial.step

キューモード(チャネルごと)

インバウンドメッセージは、現在の実行を誘導し、フォローアップターンを待つか、その両方を行うことができます:

- ''steer'':現在の実行に即座に注入します(次のツール境界の後に保留中のツール呼び出しをキャンセル)。ストリーミングでない場合は、フォローアップにフォールバックします。

- ''followup'':現在の実行が完了した後、次のエージェントターンのためにキューに入れます。

- `drop`: overflow policy (`old`, `new`, `summarize`).

- ''steer-backlog''(別名 ''steer+backlog''):即座に誘導''し''、メッセージをフォローアップターンのために保持します。

- ''interrupt''(レガシー):そのセッションのアクティブ実行を中止し、最新のメッセージを実行します。

- ''queue''(レガシーエイリアス):''steer'' と同じ。

Steer-backlog は、誘導実行後にフォローアップ応答を取得できることを意味するため、

ストリーミングサーフェスは重複しているように見える場合があります。必要に応じて、''collect''/''steer'' を選択します

インバウンドメッセージごとに 1 つの応答。

''/queue collect'' をスタンドアロンコマンド(セッションごと)として送信するか、''messages.queue.byChannel.discord: "collect"'' を設定します。

デフォルト(設定で設定されていない場合):

- すべてのサーフェス → ''collect''

''messages.queue'' を介してグローバルまたはチャネルごとに設定します:

Json5
{
  messages: {
    queue: {
      mode: "collect",
      debounceMs: 1000,
      cap: 20,
      drop: "summarize",
      byChannel: { discord: "collect" },
    },
  },
}
Tutorial.step

キューオプション

オプションは ''followup''、''collect''、および ''steer-backlog''(フォローアップにフォールバックするときは ''steer'' にも適用されます)に適用されます:

- ''debounceMs'':フォローアップターンを開始する前に静寂を待ちます("続けて、続けて"を防ぎます)。

- ''cap'':セッションごとのキューに入れられたメッセージの最大数。

- ''drop'':オーバーフロー戦略(''old''、''new''、''summarize'')。

Summarize は、削除されたメッセージの短い箇条書きリストを保持し、それらを合成されたフォローアッププロンプトとして注入します。デフォルト:''debounceMs: 1000''、''cap: 20''、''drop: summarize''。

Tutorial.step

セッションごとのオーバーライド

- ''/queue <mode>'' をスタンドアロンコマンドとして送信して、現在のセッションのモードを保存します。

- オプションを組み合わせることができます:''/queue collect debounce:2s cap:25 drop:summarize''

- ''/queue default'' または ''/queue reset'' はセッションオーバーライドをクリアします。

Tutorial.step

スコープと保証

- ゲートウェイ返信パイプラインを使用するすべてのインバウンドチャネル(WhatsApp web、Telegram、Slack、Discord、Signal、iMessage、ウェブチャットなど)で実行されている自動応答エージェントに適用されます。

- デフォルトチャネル (''main'') はプロセススコープのインバウンド+メインハートビートです。''agents.defaults.maxConcurrent'' を設定して、複数のセッションを並列で実行できるようにします。

- 他のチャネルが存在する場合があります(例: ''cron''、''subagent'')ため、バックグラウンドジョブはインバウンド返信をブロックせずに並列で実行できます。

- セッションごとのチャネルは、一度に 1 つのエージェント実行のみが特定のセッションに触れることを保証します。

- 外部依存関係やバックグラウンドワーカースレッドはありません。純粋な TypeScript + プロミス。

Tutorial.step

トラブルシューティング

- コマンドがスタックしているように見える場合は、詳細ログを有効にし、"queued for …ms" 行を探して、キューが排出されていることを確認します。

- キューの深さが必要な場合は、詳細ログを有効にし、キュータイミングラインを観察します。