手順 7: エージェントをホストする

Microsoftマネージド Foundry Hosted Agents、セルフホスティング、および Durable Extension を使用した永続的な実行の比較については、Agent Framework アプリケーションのホスティングに関するページを参照してください。

ASP.NET Core でのホスティング

Agent Framework には、AI エージェントを ASP.NET Core アプリケーションに統合できるホスティング ライブラリが用意されています。 これらのライブラリを使用すると、さまざまなプロトコルを使用したエージェントの登録、構成、公開が簡単になります。

エージェントで説明されているように、AIAgentは Agent Framework の基本的なエージェント抽象化です。 ユーザー入力を処理し、意思決定を行い、ツールを呼び出し、アクションを実行して応答を生成するための追加作業を実行する "LLM ラッパー" を定義します。 ASP.NET Core アプリケーションから AI エージェントを公開することは簡単ではありません。 ホスティング ライブラリは、依存関係挿入コンテナーに AI エージェントを登録することでこれを解決し、アプリケーション サービスで解決して使用できるようにします。 また、ツールやセッション ストレージなどのエージェントの依存関係を同じコンテナーから管理することもできます。 エージェントは、使用するプロトコルに関係なく、アプリケーション インフラストラクチャと共にホストできます。 同様に、ワークフローをホストし、アプリケーションの一般的なインフラストラクチャを活用できます。

コア ホスティング ライブラリ

Microsoft.Agents.AI.Hosting ライブラリは、ASP.NET Core で AI エージェントをホストするための基盤です。 AI エージェントとワークフローを登録して構成する IHostApplicationBuilder の拡張機能を提供します。 ASP.NET Core では、 IHostApplicationBuilder は、ホストされているアプリケーションとサービスのビルダー、構成、ログ記録、有効期間などを管理する基本的な種類です。

エージェントまたはワークフローを構成する前に、依存関係挿入コンテナーに IChatClient を登録します。 次の例では、 chat-modelという名前のキー付きシングルトンとして登録されています。

// endpoint is your Microsoft Foundry project endpoint
// deploymentName is 'gpt-4o-mini' for example

IChatClient chatClient = new AIProjectClient(
        new Uri(endpoint),
        new DefaultAzureCredential())
    .GetProjectOpenAIClient()
    .GetProjectResponsesClient()
    .AsIChatClient(deploymentName);
builder.Services.AddSingleton(chatClient);

Warning

DefaultAzureCredential は開発には便利ですが、運用環境では慎重に考慮する必要があります。 運用環境では、待機時間の問題、意図しない資格情報のプローブ、フォールバック メカニズムによる潜在的なセキュリティ リスクを回避するために、特定の資格情報 ( ManagedIdentityCredential など) を使用することを検討してください。

AddAIAgent

依存関係の挿入を使用して AI エージェントを登録します。

var pirateAgent = builder.AddAIAgent(
    "pirate",
    instructions: "You are a pirate. Speak like a pirate",
    description: "An agent that speaks like a pirate.",
    chatClientServiceKey: "chat-model");

AddAIAgent() メソッドは、エージェントを構成するための拡張メソッドを提供するIHostedAgentBuilderを返します。 たとえば、エージェントにツールを追加できます。

var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate")
    .WithAITool(new MyTool()); // MyTool is a custom type derived from AITool

セッション ストア (会話データのストレージ) を構成することもできます。

var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate")
    .WithInMemorySessionStore();

AddWorkflow

複数のエージェントを調整するワークフローを登録します。 ワークフローは基本的に、各ノードが AIAgentであり、エージェントが相互に通信する "グラフ" です。

この例では、2 つのエージェントが順番に動作します。 ユーザー入力は最初に agent-1 に送信され、応答が生成され、 agent-2に送信されます。 その後、ワークフローによって最終的な応答が出力されます。 同時エージェント ワークフローを作成する BuildConcurrent メソッドもあります。

builder.AddAIAgent("agent-1", instructions: "you are agent 1!");
builder.AddAIAgent("agent-2", instructions: "you are agent 2!");

var workflow = builder.AddWorkflow("my-workflow", (sp, key) =>
{
    var agent1 = sp.GetRequiredKeyedService<AIAgent>("agent-1");
    var agent2 = sp.GetRequiredKeyedService<AIAgent>("agent-2");
    return AgentWorkflowBuilder.BuildSequential(key, [agent1, agent2]);
});

ワークフローを AIAgent として公開する

ワークフローでプロトコル統合 (A2A や OpenAI など) を使用するには、スタンドアロン エージェントに変換します。 現時点では、ワークフローは独自に同様の統合機能を提供しないため、この変換手順が必要です。

var workflowAsAgent = builder
    .AddWorkflow("science-workflow", (sp, key) => { ... })
    .AddAsAIAgent();  // Now the workflow can be used as an agent

実装の詳細

ホスティング ライブラリは、外部通信プロトコルと Agent Framework の内部 AIAgent 実装をブリッジするプロトコル アダプターとして機能します。 ホスティング統合ライブラリを使用する場合、ライブラリは依存関係の挿入から登録済みの AIAgent を取得し、それをプロトコル固有のミドルウェアでラップして受信要求と送信応答を変換し、 AIAgent を呼び出して要求を処理します。 このアーキテクチャでは、エージェント実装のプロトコルに依存しません。

たとえば、A2A プロトコル アダプターで ASP.NET Core ホスティング ライブラリを使用するとします。

// Register the agent
var pirateAgent = builder.AddAIAgent("pirate",
    instructions: "You are a pirate. Speak like a pirate",
    description: "An agent that speaks like a pirate.");

// Expose via a protocol (e.g. A2A)
builder.Services.AddA2AServer();
var app = builder.Build();
app.MapA2AServer();
app.Run();

Microsoft Foundry Hosted Agents は、プライマリ マネージド ホスティング オプションです。 Azure Developer CLI AI エージェント拡張機能や Azure CLI へのサインインなど、Foundry Hosted Agents の前提条件を完了します。

「はじめに」のサンプルでは、サーバーサイドのモデルストレージを無効にしたエージェントを作成し、ResponsesHostServer を起動します。

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, ResponsesHostServer
from azure.identity import DefaultAzureCredential


def main() -> None:
    agent = Agent(
        client=FoundryChatClient(
            project_endpoint="https://your-account.services.ai.azure.com/api/projects/your-project",
            model="gpt-6-luna",
            credential=DefaultAzureCredential(),
        ),
        instructions="You are a friendly assistant. Keep your answers brief.",
        default_options={"store": False},
    )
    ResponsesHostServer(agent=agent, history_source="agent_server").run()


if __name__ == "__main__":
    main()

ハードコーディングされたプロジェクト エンドポイントとモデルのデプロイ名を置き換え、Agent Framework リポジトリ ルートから PEP 723 サンプルをローカルで実行してください。

uv run python/samples/01-get-started/07_hosting.py

完全なホステッド エージェント プロジェクトをデプロイするには、管理されているサンプルの azure.yamlから初期化します。

mkdir my-hosted-agent && cd my-hosted-agent
azd ai agent init -t https://github.com/microsoft-foundry/foundry-samples/blob/main/samples/python/hosted-agents/agent-framework/responses/01-basic/azure.yaml --src .

エージェント ホストを実行:

azd ai agent run

別のターミナルで、ローカル エージェントを起動します:

azd ai agent invoke --local "Hello!"

Tip

詳細は、完全な入門サンプルと完全なデプロイ サンプルを参照してください。 デプロイ ガイダンスについては、「 Foundry Hosted Agents」を参照してください。

A2A プロトコルを使用したホスティング

Go ポートは、 a2aproviderを介して A2A ホスティングを提供します。これにより、エージェント間プロトコルと互換性のある HTTP ハンドラーでエージェントがラップされます。

Note

現在、Durable Extension ホスティングは Go では使用できません。 最新の Go SDK の状態については、 Agent Framework Go リポジトリを参照してください。

エージェントを作成します。

import (
    "github.com/microsoft/agent-framework-go/agent"
    "github.com/microsoft/agent-framework-go/provider/a2aprovider"
    "github.com/microsoft/agent-framework-go/provider/foundryprovider"

    "github.com/a2aproject/a2a-go/v2/a2a"
    "github.com/a2aproject/a2a-go/v2/a2asrv"
)

a := foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
    Instructions: "You are a helpful assistant.",
    Config: agent.Config{
    },
})

A2A を介してエージェントを公開します。

url := "http://localhost:5000"
card := &a2a.AgentCard{
    Name:               "MyAgent",
    Description:        "A helpful assistant.",
    Version:            "1.0.0",
    DefaultInputModes:  []string{"text"},
    DefaultOutputModes: []string{"text"},
    Capabilities:       a2a.AgentCapabilities{Streaming: false},
    SupportedInterfaces: []*a2a.AgentInterface{
        a2a.NewAgentInterface(url, a2a.TransportProtocolJSONRPC),
    },
}

mux := http.NewServeMux()
requestHandler := a2asrv.NewHandler(
    a2aprovider.NewExecutor(a, a2aprovider.ExecutorConfig{}),
    a2asrv.WithExtendedAgentCard(card),
)
mux.Handle("/", a2asrv.NewJSONRPCHandler(requestHandler))
mux.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(card))

log.Println("A2A server listening on :5000")
http.ListenAndServe(":5000", mux)

Tip

完全な実行可能な例については、 A2A クライアント/サーバーの完全なサンプル を参照してください。

次のステップ

より深く進む:

こちらも参照ください