エージェント ハーネス

エージェント ハーネスは、言語モデルを作業を実行できるエージェントに変換するランタイム スキャフォールディングです。 これは、モデルとツールの呼び出しを促進し、会話の状態とコンテキストを管理し、承認ポリシーを適用し、複数ステップのタスクを通じてエージェントの進行状況を維持できます。

Agent Framework は、研究、コーディング、データ分析、その他の長時間にわたる作業のために、電池を含むオピニオン付きハーネスを提供します。 チャット クライアントを提供し、アプリケーションで必要な機能のみをカスタマイズします。

Architecture

Harness は、別のエージェント ランタイムを定義するのではなく、既存の Agent Framework の構成要素を構成します。

  1. チャット クライアント - エージェントをモデルに接続します。
  2. チャット パイプライン - 関数の呼び出し、メッセージの挿入、サービスごとの呼び出し履歴の永続化、およびオプションの圧縮が追加されます。
  3. エージェントとコンテキスト プロバイダー — セッション スコープの命令、ツール、メモリ、todo 状態、操作モード、およびオプションの機能を追加します。
  4. ミドルウェアとデコレーター — 承認処理、可観測性、およびオプションの有界ループを追加します。
  5. アプリケーション UX — 応答をストリーム配信し、進行状況を表示し、ツールの承認などの入力を収集します。

結果のオブジェクトは、通常の Agent Framework エージェント (.NET のHarnessAgentから派生したAIAgent、または Python のAgentによって返されるcreate_harness_agent) のままです。 そのセッションでは、他のエージェントと同じ セッションコンテキスト プロバイダー の抽象化が使用されます。

ハーネス機能マトリックス

Capability ハーネスの動作 標準ガイダンス
関数呼び出し 構成可能な要求ごとのイテレーション制限で有効になります。 関数ツール
サービスごとの呼び出し履歴の永続化 ツール呼び出しの実行で各モデル呼び出しの後に履歴を保持します。 セッション
圧縮 トークンの制限またはカスタム戦略が指定されたときに有効になります。 圧縮
Todo の追跡 既定で有効になっています。 計画とToDo
エージェント モード プラン モードと実行モードは、既定で有効になっています。 計画とToDo
ファイル メモリとファイル アクセス セッション ファイル メモリは既定で有効になっています。共有ファイル アクセスはオプトインです。 コンテキスト プロバイダー
ツールの承認 永続的な承認と自動承認ルールは、既定で有効になっています。 ツールの承認
OpenTelemetry エージェントの可観測性は既定で有効になっています。 可観測性
Web 検索 選択したチャット クライアントがサポートする場所に、既定で追加されます。 Web 検索
エージェント のスキル .NETでは既定で有効になります。Pythonのプロバイダーまたはパスを使用してオプトインします。 エージェント のスキル
バックグラウンド エージェント 名前付き子エージェントへの並列委任 (省略可能)。 バックグラウンド エージェント
シェルの実行 シェル パッケージから構成されます。Pythonファクトリは自動的に配線できます。 シェル ツール
ループ エバリュエーターまたは述語によって駆動される、オプションの境界付き再呼び出し。 エージェントのループ動作

バックグラウンド エージェントの委任は、プロバイダーが管理 するバックグラウンド応答とは別です。 バックグラウンド エージェントは、委任されたタスクで子エージェントを実行します。バックグラウンド応答は、継続トークンを使用して 1 つのプロバイダー要求をポーリングまたは再開します。

ハーネス エージェントを作成する

Microsoft.Agents.AI.Harness パッケージは、HarnessAgent名前空間のMicrosoft.Agents.AIを公開します。 IChatClientを使用して任意のAsHarnessAgentから作成するか、HarnessAgentを直接構築します。

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

AIAgent agent = chatClient.AsHarnessAgent();

AgentResponse response = await agent.RunAsync("Plan a weekend trip to Seattle.");
Console.WriteLine(response.Text);

HarnessAgentOptionsを使用して、ハーネス レベルの運用ガイダンス、エージェント固有の手順、および機能オプションを設定します。

AIAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions
{
    Name = "research-agent",
    HarnessInstructions = "Use tools deliberately and report verified results.",
    ChatOptions = new ChatOptions
    {
        Instructions = "You are a research assistant focused on academic sources.",
    },
    MaxContextWindowTokens = 128_000,
    MaxOutputTokens = 16_384,
});

HarnessAgent.DefaultInstructions は、既定のハーネス ガイダンスを提供します。 HarnessInstructions は、 ChatOptions.Instructionsの前に表示されます。

コンポジションをカスタマイズする

既定の機能には、 DisableTodoProviderDisableAgentModeProviderDisableFileMemoryDisableAgentSkillsProviderDisableWebSearchDisableToolAutoApprovalDisableOpenTelemetryDisableCompactionなどの対象オプションがあります。

AIContextProvidersを使用してカスタム コンテキスト プロバイダーを追加します。 FileAccessStoreでのファイル アクセス、BackgroundAgentsを使用したバックグラウンド委任、および LoopEvaluators でのループを選択します。

ハーネスエージェントを作成する

create_harness_agent ファクトリは、完全に構成されたAgentを返します。

from agent_framework import create_harness_agent
from agent_framework.openai import OpenAIChatClient

agent = create_harness_agent(
    client=OpenAIChatClient(model="gpt-4o"),
)

session = agent.create_session()
response = await agent.run("Plan a weekend trip to Seattle.", session=session)
print(response.text)

ハーネス レベルとエージェント固有の命令を個別に設定します。

agent = create_harness_agent(
    client=client,
    name="research-agent",
    harness_instructions="Use tools deliberately and report verified results.",
    agent_instructions="You are a research assistant focused on academic sources.",
    max_context_window_tokens=128_000,
    max_output_tokens=16_384,
)

DEFAULT_HARNESS_INSTRUCTIONS は、既定のハーネス ガイダンスを提供します。 harness_instructions は、 agent_instructionsの前に表示されます。

コンポジションをカスタマイズする

disable_tododisable_modedisable_file_memorydisable_web_searchdisable_tool_auto_approvaldisable_compactionなどのオプションで既定値を無効にします。

組み込みのプロバイダーを todo_provider または mode_providerに置き換え、プロバイダーを context_providersに追加します。 スキルは skills_provider または skills_pathsによってオプトインされます。ファイル アクセス、バックグラウンド エージェント、シェル ツール、ループもオプトインされます。

Note

create_harness_agent がリリースされました。 バックグラウンド エージェント、ファイル アクセス、ループは試験段階のままであり、シェル ツールはプレリリース agent-framework-tools パッケージから取得されます。

Note

パッケージ化された Go Harness は現在使用できません。 対応する Go エージェント、コンテキスト プロバイダー、圧縮、ミドルウェア パッケージを直接作成します。 現在のサポートについては、 Agent Framework Go リポジトリ を参照してください。

ターミナル UX のサンプル

Harness はアプリケーション インターフェイスを規定していません。 リポジトリには、出力のストリーミング、todo と現在のモードの表示、ツール承認プロンプトの表示、 /todos/mode/exitなどのコマンドを提供するサンプル ターミナル アプリケーションが含まれています。

Important

これらのコンソール プロジェクトはサンプルであり、出荷されたフレームワーク コンポーネントではありません。 実行可能な例として、または独自のターミナル エクスペリエンスの開始点として使用します。

.NETサンプル エントリ ポイントはHarnessConsole.RunAgentAsync

using Harness.Shared.Console;

await HarnessConsole.RunAgentAsync(
    agent,
    userPrompt: "Ask me anything to get started.");

オブザーバー、ツール フォーマッタ、コマンド ハンドラー、 HarnessConsoleOptionsを使用してサンプルをカスタマイズします。 .NET ハーネスのサンプルを参照してください。

Pythonサンプルでは、Harness サンプルの横にあるテキストベースのconsole パッケージを使用します。

from console import run_agent_async

await run_agent_async(agent)

オブザーバー、フォーマッタ、コマンド、UI コンポーネントを使用してサンプルをカスタマイズします。 Python ハーネスのサンプルを参照してください。

リポジトリには現在、パッケージ化された Go Harness ターミナル サンプルは含まれていません。

次のステップ

さらに詳しく