Hermes Agentが非同期サブエージェントを追加、委任作業が親チャットをブロックしなくなる
Nous ResearchがHermes Agentに非同期サブエージェント機能を導入しました。デリゲートツールがバックグラウンドエージェントを生成できるようになり、親チャットをブロックしません。本記事では、async_delegationツールセット(issue #5586)を用いた生成、確認、誘導、収集の方法を解説し、サブエージェントの分離、同期と非同期のトレードオフ、ACPを使用するタイミングについても触れます。
Nous ResearchはHermes Agentに変更を加え、デリゲートツールが非同期でサブエージェントを実行できるようにしました。発表によると、委任作業は親チャットをブロックしなくなります。
Hermes AgentはNous Researchが開発したオープンソースのパーソナルエージェントです。親エージェントは子エージェント(サブエージェント)を生成して作業を分散できます。これまでは、その委任によって待機が発生していました。
このアップデートはNous Researchと共同創業者TekniumによってXで発表されました。既存ユーザーはhermes updateを実行することで有効化できます。
サブエージェントとは
デリゲートツールはdelegate_taskです。それはサブエージェントを生成します。サブエージェントは分離された子エージェントであり、それぞれ独自の会話、ターミナルセッション、ツールセットを持ちます。最終サマリーのみが親に返されます。親のコンテキストは子の中間的なツール呼び出しや推論を見ることはありません。これにより、親のコンテキストウィンドウは小さく保たれます。
分離は厳格です。サブエージェントは完全に新しい会話から開始し、親の履歴に関する知識は一切持ちません。親はgoalフィールドとcontextフィールドを通じてすべてを渡す必要があります。
サブエージェントは親のAPIキー、プロバイダー設定、認証情報プールを継承します。この認証情報プールにより、レート制限時のキーローテーションが可能になります。config.yamlを通じてサブエージェントをより安価なモデルにルーティングすることもできます。
これまでの問題と変更点
ソースコードでは、delegate_taskは同期的です。親はツール呼び出し内で全ての子が完了するまでブロックされます。その間、チャットはフリーズします。
この設計はいくつかのワークフローを妨げていました。長時間のエージェントを開始しても作業を続けられず、実行中の確認や途中での誘導もできませんでした。
Nousはオープンな環境で非ブロッキングパスを構築しました。Issue #5586はasync_delegationツールセットを追加します。それはバックグラウンドエージェントを生成し、即座にtask_idを返します。発表は非同期サブエージェントが利用可能になったことを確認しています。
非同期ツールは完全なライフサイクルをカバーします:
- delegate_task_async — バックグラウンドエージェントを生成、task_idを返す
- check_task — 非ブロッキングでステータスと最新出力を確認
- steer_task — 実行中のタスクにメッセージを注入
- collect_task — 完了するまでブロックし、完全な結果を返す
- cancel_task — 実行中のタスクを停止
- list_tasks — セッション内の全非同期タスクを一覧表示
バックグラウンドエージェントはプロセス内スレッドとして実行され、delegate_taskと同じAIAgent機構、認証情報、ツールセットを再利用します。
同期 vs 非同期委任
| 次元 | 同期 delegate_task | 非同期委任 (async_delegation, #5586) | |------|-------------------|--------------------------------------| | 親チャット | 全子タスク完了までブロック | 即座にtask_idを返す;チャットは自由 | | 実行中の制御 | なし — 待機 | タスクごとにステータス確認、誘導、収集、キャンセル可能 | | 実行方法 | 親がツール呼び出し内で待機 | バックグラウンドのプロセス内スレッド | | コンテキストコスト | 最終サマリーのみ返る | 最終サマリーのみ返る | | 分離性 | 子ごとに新しい会話 | 子ごとに新しい会話 | | 最適な用途 | 待機可能な高速な並列タスク | チャットと並行して実行する長時間タスク | | 永続性 | ターン間で非永続 | シングルセッション;ACP (#4949) はターン間対応 |
コード例:生成と誘導
同期的なバッチは子を並列に生成し待機します。同時実行数はdelegation.max_concurrent_childrenで制限され、デフォルトは3です。
# 同期:親は全ての子が完了するまで待機
delegate_task(tasks=[
{"goal": "トピックAを調査", "toolsets": ["web"]},
{"goal": "ビルドを修正", "toolsets": ["terminal", "file"]},
])issue #5586の非同期ツールセットは即座に制御を返します。
# 非同期 (async_delegationツールセット, issue #5586)
t1 = delegate_task_async(goal="トピックAを調査")
t2 = delegate_task_async(goal="トピックBを調査")
check_task(t1["task_id"]) # ステータス確認、ブロッキングなし
steer_task(t2["task_id"], "2024年以降の情報源のみ使用")
results = [collect_task(t["task_id"]) for t in (t1, t2)]使用事例
- 長時間の調査と並行作業:市場スキャンのサブエージェントを起動し、メインチャットで執筆を続ける。
- 並行アプローチ評価:3つの検索バックエンドをテストするサブエージェントを生成。それぞれ分離されているため、評価が相互に汚染されない。
- バックグラウンドコーディングタスク:複数ファイルのリファクタリングをサブエージェントに委任し、自分は他のファイルをレビュー。
- モニタリング実行:TUIは/agentsオーバーレイ(別名/tasks)を提供し、実行中および完了したサブエージェントのライブツリーを表示。
主要なポイント
Hermes Agentは非同期サブエージェントをサポートするようになりました。デリゲートツールは親チャットをブロックしません。非ブロッキング委任はasync_delegationツールセット(issue #5586)を通じて提供されます。非同期ツールはライフサイクル全体(生成、確認、誘導、収集、キャンセル、一覧表示)をカバーします。サブエージェントは分離され、最終サマリーのみが返されるため、親コンテキストは小さく保たれます。これはプロセス内およびシングルセッションで動作し、既存ユーザーはhermes updateで有効化できます。