バックグラウンド エージェント

バックグラウンド エージェントを使用すると、親エージェントは独立したタスクを名前付き子エージェントに委任できます。 各タスクは独自の子エージェント セッションで同時に実行されますが、親はタスク ID を保持します。この ID は、待機、結果の取得、作業の続行、またはタスクの解放に使用できます。

Important

バックグラウンド エージェントは試験段階です。

バックグラウンド エージェントは、 バックグラウンド応答とは異なります。 バックグラウンド応答は、アプリケーションがポーリングまたは再開する 1 つのプロバイダー要求を表します。 バックグラウンド エージェント タスクは、別の Agent Framework エージェントを呼び出し、後でそのエージェントのテキスト結果を親にフィードします。

バックグラウンド エージェントを手動で設定する

各子エージェントには、大文字と小文字を区別せずに一意の名前を指定する必要があります。 子エージェントに重点を置いた指示と、委任されたロールに必要なツールのみを提供します。

BackgroundAgentsProviderインポートし、ChatClientAgentOptions.AIContextProvidersを使用して通常のエージェントに追加します。

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

var backgroundProvider = new BackgroundAgentsProvider(
    [webSearchAgent, codeAnalysisAgent]);

AIAgent parentAgent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
    Name = "research-coordinator",
    AIContextProviders = [backgroundProvider],
});

AgentSession session = await parentAgent.CreateSessionAsync();

BackgroundAgentsProviderOptions は、プロバイダーの指示とエージェントリストの書式設定をカスタマイズします。

from agent_framework import Agent, BackgroundAgentsProvider

background_provider = BackgroundAgentsProvider(
    [web_search_agent, code_analysis_agent]
)

parent_agent = Agent(
    client=client,
    name="research-coordinator",
    context_providers=[background_provider],
)
session = parent_agent.create_session()

instructions=BackgroundAgentsProviderに渡して、その指示を置き換えます。 書式設定された子エージェントの一覧が表示される場所 {background_agents} 含めます。

Note

このページで説明されているパッケージ化されたバックグラウンド エージェント プロバイダーは、現在 Go では使用できません。

タスクのライフサイクル

プロバイダーは、.NETとPythonに同じモデル向けツールを追加します。

ツール ライフサイクル アクション
background_agents_start_task 名前付きエージェントで非ブロッキング タスクを開始し、その整数タスク ID を返します。
background_agents_wait_for_first_completion 指定されたセット内の最初のタスクが終了状態になるまで待ちます。
background_agents_get_task_results 完了したテキスト、エラー メッセージ、または現在の状態を返します。
background_agents_get_all_tasks ID、状態、エージェント名、および説明を一覧表示します。
background_agents_continue_task タスクが完了または失敗した後、既存の子セッションでフォローアップ入力を実行します。
background_agents_clear_completed_task ターミナル タスクを削除し、その子セッションを解放します。

一般的な親エージェント シーケンスは次のとおりです。

  1. 待機する前にすべての独立したタスクを開始し、タスクが同時に実行されるようにします。
  2. 最初の完了を待ち、その結果を取得し、タスクが実行されないまで繰り返します。
  3. フォローアップ作業に既存の会話コンテキストが必要な場合は、完了したタスクまたは失敗したタスクを続行します。
  4. 結果を取得した後、続行されない限り、ターミナル タスクをクリアします。

タスクの状態は、 runningcompletedfailed、または lostです。 プロセスの再起動やセッションの復元後など、インプロセス タスク ハンドルまたは子セッションが使用できない場合、タスクは失われます。 シリアル化可能なタスク メタデータは親セッションに残ることができますが、作業中の作業ハンドルと子セッション ハンドルは、その境界に残りません。

プロバイダーにキャンセル ツールはありません。 タスクをクリアする前に、実行中のタスクを終了状態にします。

同じ親セッションを順番に再利用します。 各タスクは、専用の子セッションを受け取ります。 ターミナル タスクを続行すると、その子セッションが再利用されます。これをクリアすると、タスク メタデータが削除され、子セッション ハンドルが解放されます。

タスクの結果は、親にテキストとして返されます。 プロバイダーは、子の構造化されたツール承認要求を親経由でプロキシ処理しないため、対話型の承認なしで委任された作業を完了するか、子エージェント ホスト内で承認を処理するように子エージェントを構成します。

自動待機を手動で追加する

手動で構成された親を LoopAgentでラップします。 BackgroundTaskCompletionLoopEvaluator は、タスクが Running 状態の間のみ続行されます。

AIAgent loopingParent = new LoopAgent(
    parentAgent,
    new BackgroundTaskCompletionLoopEvaluator(),
    new LoopAgentOptions { MaxIterations = 10 });

エバリュエーターは、完了したタスク、失敗したタスク、および失われたタスクを停止します。

通常の親に AgentLoopMiddleware を追加し、バックグラウンド タスク述語を次のメッセージ ヘルパーとペアにします。

from agent_framework import (
    Agent,
    AgentLoopMiddleware,
    background_tasks_running,
    background_tasks_running_message,
)

parent_agent = Agent(
    client=client,
    context_providers=[background_provider],
    middleware=[
        AgentLoopMiddleware(
            background_tasks_running(),
            next_message=background_tasks_running_message,
            max_iterations=10,
        )
    ],
)

述語は、永続化されたタスクの状態が実行中のタスクを報告している間のみ続行されます。

バックグラウンド タスク ループの自動統合は、現在 Go では使用できません。

Harness Agent でバックグラウンド エージェントを使用する

Harness エージェントの既定の計画、メモリ、承認、および可観測パイプラインも必要な場合は、このセットアップを使用します。

HarnessAgentOptions.BackgroundAgentsを設定します。 委任された作業が実行されなくなるまで親が実行を続ける必要がある場合は、完了エバリュエーターを追加します。

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

var options = new HarnessAgentOptions
{
    Name = "research-coordinator",
    BackgroundAgents = [webSearchAgent, codeAnalysisAgent],
    LoopEvaluators = [new BackgroundTaskCompletionLoopEvaluator()],
    LoopAgentOptions = new LoopAgentOptions { MaxIterations = 10 },
};

HarnessAgent parentAgent = chatClient.AsHarnessAgent(options);
// Equivalent construction: new HarnessAgent(chatClient, options)
AgentSession session = await parentAgent.CreateSessionAsync();

HarnessAgentOptions.BackgroundAgentsProviderOptionsを使用して、プロバイダーの指示とエージェントリストの書式設定をカスタマイズします。 LoopEvaluatorsを省略すると、自動再呼び出しなしでバックグラウンド委任を使用できます。

create_harness_agentbackground_agentsを提供します。 親が自動的に待機する必要があるときに、それを有界ループとペアリングします。

from agent_framework import (
    background_tasks_running,
    background_tasks_running_message,
    create_harness_agent,
)

parent_agent = create_harness_agent(
    client=client,
    name="research-coordinator",
    background_agents=[web_search_agent, code_analysis_agent],
    loop_should_continue=background_tasks_running(),
    loop_next_message=background_tasks_running_message,
    loop_max_iterations=10,
)
session = parent_agent.create_session()

プロバイダーの指示を置き換えるには、 background_agents_instructions を使用します。 Python ハーネスでは、ツールの自動承認ミドルウェアが既定で有効になるため、実行ごとにsession渡します。

Note

Harness エージェントのバックグラウンド委任は、現在 Go では使用できません。

セキュリティに関する考慮事項

信頼できる子エージェントのみを登録します。 親は、プライベート コンテキストまたは信頼されていないコンテキストから派生したテキストを送信でき、その結果は親のコンテキストに追加されます。 侵害された子は、委任された入力を流出させたり、間接的なプロンプト挿入コンテンツを返したりする可能性があります。

次のステップ

さらに詳しく