計画とタスク

2 つのコンテキスト プロバイダーは、実行時間の長い作業をサポートします。

  • Todo プロバイダーは、追跡可能な作業項目を格納し、エージェント ツールに追加、完了、削除、および検査を提供します。
  • エージェント モード プロバイダーは、現在の動作モードを格納し、エージェント ツールに読み取りまたは変更を提供します。

計画が必要な場合にのみこれらのプロバイダーを直接作成するか、Harness エージェントを使用して、より広範な既定のパイプラインの一部として両方を有効にします。

Todo ツール

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

ツール Purpose
todos_add タイトルとオプションの説明を含む 1 つ以上の項目を追加します。
todos_complete 1 つ以上の項目を完了としてマークし、完了理由を含めます。
todos_remove 関連性がなくなった項目を削除します。
todos_get_remaining 不完全なアイテムを返します。
todos_get_all 完全なアイテムと不完全なアイテムを返します。

プロバイダーは、各実行の前に現在の todo リストを挿入するため、エージェントは未処理の作業を再開できます。

プランモードと実行モード

AgentModeProvider では、既定で plan モードと execute モードが提供されます。

  1. プラン は対話型です。 エージェントは、要件の分析、ToDO の作成、明確な質問、プランの提示、モードの変更前の質問を行います。
  2. 実行 は自律的です。 エージェントは計画に沿って作業を進め、詳細が曖昧な場合は適切な判断を行い、ToDo を完了としてマークします。

プロバイダーは、 mode_getmode_setを公開します。 この手順では、ユーザーが明示的に切り替えを許可する場合にのみ、 mode_set を使用するようにモデルに指示します。 アプリケーションはモードを直接変更することもできます。これにより、プロバイダーは次の実行時にモード変更通知を挿入します。

計画と To Do を手動で設定する

プロバイダーをインポートして構築した後、 ChatClientAgentOptions.AIContextProvidersを使用してプロバイダーを追加します。

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

var todoProvider = new TodoProvider();
var modeProvider = new AgentModeProvider(
    new AgentModeProviderOptions
    {
        DefaultMode = "plan",
    });

AIAgent agent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
    AIContextProviders = [todoProvider, modeProvider],
});

AgentSession session = await agent.CreateSessionAsync();

AgentModeProviderOptions.Modesを使用してモード名と指示をカスタマイズします。 .NET todo プロバイダーは、状態をAgentSession.StateBagに格納します。 TodoProviderOptions は、命令を置き換えたり、挿入された todo-list メッセージを抑制したり、カスタム メッセージ ビルダーを提供したりできます。

既定の plan 命令には、プランのファイル メモリへの書き込みが含まれます。 手動で構成されたエージェントがファイル メモリ ツールを提供していない場合は、モード命令をカスタマイズするか、適切なメモリ プロバイダーを追加します。

アプリケーションからモードを変更する

await modeProvider.SetModeAsync(session, "execute");

GetModeAsyncを使用して現在のモードを読み取ります。

プロバイダーをインポートして構築し、通常の Agentに追加します。

from agent_framework import (
    Agent,
    AgentModeProvider,
    TodoFileStore,
    TodoProvider,
)

todo_provider = TodoProvider(
    store=TodoFileStore("./todo-state"),
)
mode_provider = AgentModeProvider(
    default_mode="plan",
)

agent = Agent(
    client=client,
    context_providers=[todo_provider, mode_provider],
)

session = agent.create_session()

TodoProvider では、既定で TodoSessionStore が使用されます。 todo 状態をセッション ペイロードの外部に格納する必要がある場合は、 TodoFileStore またはカスタム TodoStore を使用します。 AgentModeProvider(mode_instructions={...})を使用してモードをカスタマイズします。

既定の plan 命令には、プランのファイル メモリへの書き込みが含まれます。 手動で構成されたエージェントでファイル メモリ ツールが提供されない場合は、 mode_instructions をカスタマイズするか、適切なメモリ プロバイダーを追加します。

アプリケーションからモードを変更する

from agent_framework import get_agent_mode, set_agent_mode

set_agent_mode(
    session,
    "execute",
    source_id=mode_provider.source_id,
    available_modes=mode_provider.available_modes,
)

current_mode = get_agent_mode(
    session,
    source_id=mode_provider.source_id,
    default_mode=mode_provider.default_mode,
    available_modes=mode_provider.available_modes,
)

Note

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

プランを手動で実行して完了する

Todo 追跡は進行状況を記録しますが、単独ではエージェントを再呼び出しません。 すべての todo が完了するまで実行モードを続行する必要がある場合は、それを有界 エージェント ループ と組み合わせます。

手動で作成したエージェントを LoopAgentでラップします。 TodoCompletionLoopEvaluator では、ループを選択したモードに制限できます。

AIAgent loopingAgent = new LoopAgent(
    agent,
    new TodoCompletionLoopEvaluator(
        new TodoCompletionLoopEvaluatorOptions
        {
            Modes = ["execute"],
        }),
    new LoopAgentOptions { MaxIterations = 10 });

通常のエージェントに AgentLoopMiddleware を追加し、モード フィルターで todos_remaining() を使用します。

from agent_framework import (
    Agent,
    AgentLoopMiddleware,
    todos_remaining,
    todos_remaining_message,
)

agent = Agent(
    client=client,
    context_providers=[todo_provider, mode_provider],
    middleware=[
        AgentLoopMiddleware(
            todos_remaining(looping_modes=["execute"]),
            next_message=todos_remaining_message,
            max_iterations=10,
        )
    ],
)

Todo ドリブン ループ統合は、Go では現在使用できません。

Harness Agent で計画と ToDo を使用する

Harness エージェントの事前構成済みの履歴、メモリ、承認、監視パイプラインも必要な場合は、このセットアップを使用します。

HarnessAgent では、既定で TodoProviderAgentModeProvider が有効になります。 HarnessAgentOptionsを使用して、モード プロバイダーとオプションの todo ドリブン ループを構成します。

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

var options = new HarnessAgentOptions
{
    AgentModeProviderOptions = new AgentModeProviderOptions
    {
        DefaultMode = "plan",
    },
    LoopEvaluators =
    [
        new TodoCompletionLoopEvaluator(
            new TodoCompletionLoopEvaluatorOptions
            {
                Modes = ["execute"],
            }),
    ],
    LoopAgentOptions = new LoopAgentOptions { MaxIterations = 10 },
};

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

既定のプロバイダーを削除するには、 DisableTodoProvider または DisableAgentModeProvider を設定します。 構成済みの TodoProviderを使用するには、既定値を無効にし、 AIContextProvidersを使用してインスタンスを追加します。 agent.GetService<TProvider>()を通じて有効なプロバイダーを解決できます。

create_harness_agent では、両方のプロバイダーが既定で有効になります。 設定済みのインスタンスを指定して置き換え、オプションの TODO 駆動ループを追加します。

from agent_framework import (
    AgentModeProvider,
    TodoFileStore,
    TodoProvider,
    create_harness_agent,
    todos_remaining,
    todos_remaining_message,
)

todo_provider = TodoProvider(store=TodoFileStore("./todo-state"))
mode_provider = AgentModeProvider(default_mode="plan")

agent = create_harness_agent(
    client=client,
    todo_provider=todo_provider,
    mode_provider=mode_provider,
    loop_should_continue=todos_remaining(looping_modes=["execute"]),
    loop_next_message=todos_remaining_message,
    loop_max_iterations=10,
)
session = agent.create_session()

既定のプロバイダーを削除するには、 disable_todo または disable_mode を設定します。 Python ハーネスでは、ツールの自動承認ミドルウェアが既定で有効になるため、実行ごとにsession渡します。

Note

Harness Agent のプランニング機能と ToDo プロバイダは、現在 Go では利用できません。

セッションの動作

同じ セッション を順番に使用します。 モードの状態は、両方の SDK でセッションによってサポートされます。 .NET todo 状態はAgentSession.StateBagに格納されます。Pythonでは既定でTodoSessionStoreが使用されますが、TodoFileStoreまたはカスタム TodoStoreは todo 永続化を外部化できます。

アプリケーション コードからモードを変更すると、次回の実行時に 1 回限りのモード変更通知がキューに格納されます。 モデル側の mode_set ツールでは、モデルが既に独自のツール呼び出しを観察しているため、その追加の通知はキューに入れられません。

実行計画の確認は、ツール承認要求ではなく、命令レベルの動作です。 todo ツールとモード ツール自体は、関数の承認を必要としません。アプリケーション コードは、ホストが必要なアクセス許可を既に取得している場合に、モードを直接変更できます。

次のステップ

さらに詳しく