Шаг 7. Размещение агента

Сведения о сравнении агентов Foundry Hosted Agents под управлением Microsoft, самостоятельного размещения и долговечных рабочих нагрузок Функции Azure см. в разделе «Размещение приложений Agent Framework».

Размещение в ASP.NET Core

Платформа Agent Framework предоставляет библиотеки хостинга, которые позволяют интегрировать ИИ-агентов в приложения ASP.NET Core. Эти библиотеки упрощают регистрацию, настройку и делают агентов доступными с помощью различных протоколов.

Как описано в разделе "Агенты", AIAgent является основной абстракцией агента в Agent Framework. Он определяет оболочку LLM, которая обрабатывает входные данные пользователей, принимает решения, вызывает средства и выполняет дополнительную работу для выполнения действий и создания ответов. Предоставление агентов ИИ из приложения ASP.NET Core является не тривиальной задачей. Библиотеки размещения решают это путем регистрации агентов ИИ в контейнере внедрения зависимостей, что дает возможность разрешать зависимости и использовать их в службах приложений. Они также позволяют управлять зависимостями агента, такими как средства и хранилище сеансов, из того же контейнера. Агенты могут размещаться вместе с инфраструктурой приложений, независимо от используемых протоколов. Аналогичным образом рабочие процессы можно размещать и использовать общую инфраструктуру приложения.

Библиотека основной хостинговой функции

Библиотека Microsoft.Agents.AI.Hosting является основой для размещения агентов ИИ в ASP.NET Core. Он предоставляет расширения для регистрации и настройки агентов ИИ и рабочих процессов через 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);

Предупреждение

DefaultAzureCredential удобно для разработки, но требует тщательного рассмотрения в рабочей среде. В рабочей среде рекомендуется использовать определенные учетные данные (например, ManagedIdentityCredential), чтобы избежать проблем с задержкой, непреднамеренной проверки данных аутентификации и потенциальных рисков безопасности из-за резервных механизмов.

AddAIAgent

Зарегистрируйте агент ИИ с инъекцией зависимостей:

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, и агенты взаимодействуют друг с другом.

В этом примере два агента работают последовательно. Сначала ввод пользователя отправляется в 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]);
});

Предоставить рабочий процесс как AI-агента

Чтобы использовать интеграции протокола (например, A2A или OpenAI) с рабочим процессом, преобразуйте его в автономный агент. В настоящее время рабочие процессы не предоставляют аналогичные возможности интеграции самостоятельно, поэтому этот шаг преобразования требуется:

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

Сведения о реализации

Библиотеки размещения действуют как адаптеры протоколов, которые объединяют внешние протоколы связи и внутреннюю реализацию AIAgent Agent Framework. При использовании библиотеки интеграции размещения библиотека извлекает зарегистрированную AIAgent из внедрения зависимостей, оборачивает ее с помощью промежуточного ПО, относящегося к протоколу, чтобы переводить входящие запросы и исходящие ответы, и вызывает AIAgent для обработки запросов. Эта архитектура делает реализацию агента независимой от конкретного протокола.

Например, используя библиотеку хостинга ASP.NET Core с адаптером протокола 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 — это основной вариант управляемого размещения. Выполните предварительные требования для Foundry Hosted Agents, включая расширение агента ИИ Azure Developer CLI и вход в Azure CLI.

Пример начала работы создает агент с отключенным хранилищем модели на стороне сервера и запускает 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()

Замените жестко закодированную конечную точку проекта и имя развертывания модели, а затем запустите пример PEP 723 локально из корневого каталога репозитория Agent Framework:

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

Чтобы развернуть полный проект размещенного агента, инициализируйте его из поддерживаемого манифеста размещения:

mkdir my-hosted-agent && cd my-hosted-agent
azd ai agent init -m https://github.com/microsoft/agent-framework/blob/main/python/samples/04-hosting/foundry-hosted-agents/responses/basic/agent.manifest.yaml

Запустите хост агента:

azd ai agent run

В другом терминале вызовите локального агента:

azd ai agent invoke --local "Hello!"

Размещение с помощью протокола A2A

Порт Go обеспечивает A2A-хостинг через a2aprovider, который оборачивает агента в HTTP-обработчик, совместимый с протоколом Agent-to-Agent.

Замечание

Поддержка Durable Extension в Go пока недоступна. Сведения о последнем состоянии пакета SDK go см. в репозитории 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 для полноценного рабочего примера.

Дальнейшие действия

Вернитесь глубже:

См. также