Krok 7. Hostowanie agenta

Porównanie zarządzanych przez firmę Microsoft usług Foundry Hosted Agents, hostowania własnego oraz trwałego wykonywania przy użyciu rozszerzenia Durable można znaleźć w temacie Hostowanie aplikacji Agent Framework.

Hosting w ASP.NET Core

Struktura agentów udostępnia biblioteki hostingu, które umożliwiają integrowanie agentów sztucznej inteligencji z aplikacjami ASP.NET Core. Te biblioteki upraszczają rejestrowanie, konfigurowanie i udostępnianie agentów za pomocą różnych protokołów.

Jak opisano w temacie Agents, AIAgent jest podstawową abstrakcją agenta w strukturze Agent Framework. Definiuje "otokę LLM", która przetwarza dane wejściowe użytkownika, podejmuje decyzje, wywołuje narzędzia i wykonuje dodatkową pracę w celu wykonywania akcji i generowania odpowiedzi. Uwidacznianie agentów sztucznej inteligencji z aplikacji ASP.NET Core nie jest proste. Biblioteki hostingu rozwiążą ten problem, rejestrując agentów sztucznej inteligencji w kontenerze iniekcji zależności, umożliwiając rozpoznawanie i używanie ich w usługach aplikacji. Umożliwiają one również zarządzanie zależnościami agenta, takimi jak narzędzia i magazyn sesji, z tego samego kontenera. Agenci mogą być hostowani obok infrastruktury aplikacji niezależnie od używanych protokołów. Podobnie przepływy pracy mogą być hostowane i korzystać ze wspólnej infrastruktury aplikacji.

Podstawowa biblioteka hostingu

Biblioteka Microsoft.Agents.AI.Hosting jest podstawą hostowania agentów sztucznej inteligencji w ASP.NET Core. Udostępnia rozszerzenia IHostApplicationBuilder do rejestrowania i konfigurowania agentów i przepływów pracy AI. W ASP.NET Core IHostApplicationBuilder jest podstawowym typem reprezentującym konstruktora hostowanych aplikacji i usług, zarządzanie konfiguracją, rejestrowaniem, okresem istnienia i nie tylko.

Przed skonfigurowaniem agentów lub przepływów pracy zarejestruj IChatClient w kontenerze wstrzykiwania zależności. W poniższych przykładach jest on zarejestrowany jako kluczowy singleton pod nazwą 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 jest wygodne do programowania, ale wymaga starannego rozważenia w środowisku produkcyjnym. W środowisku produkcyjnym rozważ użycie określonego poświadczenia (np. ManagedIdentityCredential), aby uniknąć problemów z opóźnieniami, niezamierzonego sondowania poświadczeń i potencjalnych zagrożeń bezpieczeństwa wynikających z mechanizmów awaryjnych.

Dodaj agenta AI

Zarejestruj agenta sztucznej inteligencji za pomocą iniekcji zależności:

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");

Metoda AddAIAgent() zwraca metodę IHostedAgentBuilder, która udostępnia metody rozszerzenia do konfigurowania agenta. Na przykład, możesz dodać narzędzia do agenta:

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

Możesz również skonfigurować magazyn sesji (magazyn danych konwersacji):

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

AddWorkflow

Rejestrowanie przepływów pracy, które koordynują wielu agentów. Przepływ pracy to zasadniczo "graf", w którym każdy węzeł jest elementem AIAgent, a agenci komunikują się ze sobą.

W tym przykładzie dwóch agentów działa sekwencyjnie. Dane wejściowe użytkownika są najpierw wysyłane do agent-1elementu , który generuje odpowiedź i wysyła ją do elementu agent-2. Następnie przepływ pracy zwraca ostateczną odpowiedź. Istnieje również BuildConcurrent metoda, która tworzy współbieżny przepływ pracy agenta.

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]);
});

Uwidaczniaj przepływ pracy jako AIAgent

Aby używać integracji protokołów (takich jak A2A lub OpenAI) z przepływem pracy, przekonwertuj go na autonomicznego agenta. Obecnie przepływy pracy nie zapewniają samodzielnie podobnych możliwości integracji, więc ten krok konwersji jest wymagany:

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

Szczegóły implementacji

Biblioteki hostingu działają jako adaptery protokołów, które łączą zewnętrzne protokoły komunikacyjne i wewnętrzną AIAgent implementację ramy działania agenta. W przypadku korzystania z biblioteki integracji hostingu, biblioteka pobiera zarejestrowane AIAgent z iniekcji zależności, opakowuje je za pomocą oprogramowania middleware specyficznego dla protokołu w celu tłumaczenia przychodzących żądań i odpowiedzi wychodzących, a następnie wywołuje AIAgent w celu przetworzenia żądań. Ta architektura utrzymuje implementację agenta niezależną od protokołu.

Na przykład przy użyciu biblioteki hostingu ASP.NET Core z adapterem protokołu A2A:

// 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 to podstawowa opcja hostingu zarządzanego. Ukończ wymagania wstępne dotyczące Foundry Hosted Agents, w tym rozszerzenie agenta AI interfejsu wiersza polecenia dewelopera Azure oraz zalogowanie się przy użyciu interfejsu wiersza polecenia Azure CLI.

Przykład na początek tworzy agenta z wyłączonym magazynem modelu po stronie serwera i uruchamia 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()

Zastąp zakodowany na stałe punkt końcowy projektu i nazwę wdrożenia modelu, a następnie uruchom przykład PEP 723 lokalnie z katalogu głównego repozytorium Agent Framework:

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

Aby wdrożyć kompletny projekt hostowanego agenta, zainicjuj go z utrzymywanego przykładu 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 .

Uruchom hosta agenta:

azd ai agent run

W innym terminalu wywołaj agenta lokalnego:

azd ai agent invoke --local "Hello!"

Tip

Zapoznaj się z pełnym przykładem rozpoczynania pracy i kompletnym przykładem wdrożenia. Aby uzyskać wskazówki dotyczące wdrażania, zobacz Foundry Hosted Agents.

Hosting przy użyciu protokołu A2A

Implementacja w Go zapewnia hostowanie A2A za pomocą a2aprovider, które opakowuje agenta w moduł obsługi HTTP zgodny z protokołem Agent-to-Agent.

Uwaga / Notatka

Hostowanie rozszerzenia Durable nie jest obecnie dostępne dla języka Go. Aby uzyskać najnowszy stan zestawu SDK języka Go, zobacz repozytorium Agent Framework Go.

Utwórz agenta:

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{
    },
})

Uwidaczniaj agenta za pośrednictwem usługi 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

Zobacz pełny przykład klient-serwer A2A, aby poznać kompletny przykład gotowy do uruchomienia.

Następne kroki

Głębiej:

Zobacz także