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 モードが提供されます。
- プラン は対話型です。 エージェントは、要件の分析、ToDO の作成、明確な質問、プランの提示、モードの変更前の質問を行います。
- 実行 は自律的です。 エージェントは計画に沿って作業を進め、詳細が曖昧な場合は適切な判断を行い、ToDo を完了としてマークします。
プロバイダーは、 mode_get と mode_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 では、既定で TodoProvider と AgentModeProvider が有効になります。
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 ツールとモード ツール自体は、関数の承認を必要としません。アプリケーション コードは、ホストが必要なアクセス許可を既に取得している場合に、モードを直接変更できます。