Hostowani agenci programu Foundry

Hostowane agenty w usłudze Microsoft Foundry Agent umożliwiają wdrażanie agentów programu *Agent Framework* jako konteneryzowanych aplikacji w infrastrukturze zarządzanej przez Microsoft. Platforma obsługuje skalowanie, trwałość stanu sesji, zabezpieczenia i zarządzanie cyklem życia, dzięki czemu można skoncentrować się na logice agenta.

Dzięki integracji hostingu w ramach Agent Framework możesz wziąć dowolny Agent lub przepływ pracy i wystawić go za pośrednictwem protokołu Foundry Responses lub Invocations przy minimalnym kodzie.

Kiedy używać hostowanych agentów

Wybierz hostowane przez Foundry agenty, jeśli chcesz:

  • Infrastruktura zarządzana — nie trzeba samodzielnie konfigurować kontenerów, serwerów internetowych ani reguł skalowania.
  • Wbudowane zarządzanie sesjami — platforma utrwala $HOME i przesyła pliki przez kolejki i okresy bezczynności.
  • Tożsamość dedykowanego agenta — każdy wdrożony agent uzyskuje własną tożsamość Entra na potrzeby bezpiecznego dostępu do modeli, narzędzi i usług podrzędnych.
  • Punkty końcowe zgodne z interfejsem OpenAI — klienci mogą korzystać z agenta przy użyciu dowolnego zestawu SDK zgodnego z interfejsem OpenAI za pośrednictwem protokołu Odpowiedzi.

Uwaga / Notatka

Hostowani agenci programu Foundry są obecnie w wersji zapoznawczej. Zapoznaj się z dokumentacją agentów hostowanych w usłudze Foundry , aby uzyskać informacje o najnowszej dostępności, limitach i cenach.

Wymagania wstępne

  • Subskrypcja platformy Azure
  • Azure Developer CLI (azd) z rozszerzeniem agenta sztucznej inteligencji:

Do testowania lokalnego potrzebne są również następujące elementy:

Zainstaluj pakiet NuGet hostingu:

dotnet add package Microsoft.Agents.AI.Foundry.Hosting --prerelease
dotnet add package Azure.AI.Projects --prerelease
  • Python 3.10 lub nowszy

Zainstaluj pakiet Python hostingu:

pip install agent-framework agent-framework-foundry-hosting

Protokół odpowiedzi

Protokół Responses jest zalecanym punktem wyjścia dla większości agentów. Udostępnia punkt końcowy zgodny z interfejsem OpenAI /responses, a platforma automatycznie zarządza historią konwersacji, przesyłaniem strumieniowym oraz cyklem życia sesji.

using Azure.AI.AgentServer.Core;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;

var projectEndpoint = new Uri(Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
    ?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT is not set."));
var deployment = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-4o";

AIAgent agent = new AIProjectClient(projectEndpoint, new DefaultAzureCredential())
    .AsAIAgent(
        model: deployment,
        instructions: "You are a helpful AI assistant.",
        name: "my-agent");

var builder = AgentHost.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.RegisterProtocol("responses", endpoints => endpoints.MapFoundryResponses());

var app = builder.Build();
app.Run();

Obiekt AgentHost.CreateBuilder tworzy wstępnie skonfigurowany serwer aplikacji w środowisku hostingu Foundry. AddFoundryResponses rejestruje agenta w procedurze obsługi protokołu Responses i MapFoundryResponses mapuje /responses punkt końcowy HTTP.

import os

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

client = FoundryChatClient(
    project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
    model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=DefaultAzureCredential(),
)

agent = Agent(
    client=client,
    instructions="You are a helpful AI assistant.",
    default_options={"store": False},
)

server = ResponsesHostServer(agent)
server.run()

Element ResponsesHostServer opakowuje instancję agenta i uwidacznia ją za pośrednictwem protokołu Foundry Responses. Ustawienie store na False w default_options pozwala uniknąć duplikowania historii konwersacji, ponieważ historia jest automatycznie zarządzana przez infrastrukturę hostingu.

Protokół wywołań

Protokół Wywołania zapewnia pełną kontrolę nad żądaniem HTTP i odpowiedzią. Użyj go, gdy potrzebujesz niestandardowych ładunków, przetwarzania niekonwersacyjnego lub protokołów przesyłania strumieniowego, które nie są zgodne z OpenAI.

Za pomocą protokołu Invocations w języku C# implementujesz niestandardowy InvocationHandler, aby przetwarzać przychodzące żądania.

using Azure.AI.AgentServer.Core;
using Azure.AI.AgentServer.Invocations;
using Microsoft.Agents.AI;

var builder = AgentHost.CreateBuilder(args);

builder.Services.AddSingleton<AIAgent, MyAgent>();
builder.Services.AddInvocationsServer();
builder.Services.AddScoped<InvocationHandler, MyInvocationHandler>();

builder.RegisterProtocol("invocations", endpoints => endpoints.MapInvocationsServer());

var app = builder.Build();
app.Run();

Metoda AddInvocationsServer rejestruje usługi protokołu Invocations. Zaimplementowana jest implementacja InvocationHandler w celu zdefiniowania sposobu przetwarzania poszczególnych żądań przez agenta.

Dla uproszczonej konfiguracji użyj InvocationsHostServer z pakietu agent_framework_foundry_hosting. Automatycznie opakowuje agenta w sposób podobny do ResponsesHostServer i zajmuje się zarządzaniem sesjami:

import os

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from agent_framework_foundry_hosting import InvocationsHostServer
from azure.identity import DefaultAzureCredential

client = FoundryChatClient(
    project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
    model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=DefaultAzureCredential(),
)

agent = Agent(
    client=client,
    instructions="You are a friendly assistant. Keep your answers brief.",
    default_options={"store": False},
)

server = InvocationsHostServer(agent)
server.run()

Aby uzyskać pełną kontrolę nad obsługą żądań, użyj InvocationAgentServerHost bezpośrednio z pakietu azure.ai.agentserver.invocations i zaimplementuj własną procedurę obsługi wywołań:

import os
from collections.abc import AsyncGenerator

from agent_framework import Agent, AgentSession
from agent_framework.foundry import FoundryChatClient
from azure.ai.agentserver.invocations import InvocationAgentServerHost
from azure.identity import DefaultAzureCredential
from starlette.requests import Request
from starlette.responses import JSONResponse, Response, StreamingResponse

_sessions: dict[str, AgentSession] = {}

client = FoundryChatClient(
    project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
    model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=DefaultAzureCredential(),
)

agent = Agent(
    client=client,
    instructions="You are a friendly assistant. Keep your answers brief.",
    default_options={"store": False},
)

app = InvocationAgentServerHost()


@app.invoke_handler
async def handle_invoke(request: Request):
    """Handle streaming multi-turn chat."""
    data = await request.json()
    session_id = request.state.session_id
    stream = data.get("stream", False)
    user_message = data.get("message", None)

    if user_message is None:
        return Response(content="Missing 'message' in request", status_code=400)

    session = _sessions.setdefault(session_id, AgentSession(session_id=session_id))

    if stream:

        async def stream_response() -> AsyncGenerator[str]:
            async for update in agent.run(user_message, session=session, stream=True):
                yield update.text

        return StreamingResponse(
            stream_response(),
            media_type="text/event-stream",
            headers={"Cache-Control": "no-cache", "Connection": "keep-alive"},
        )

    response = await agent.run([user_message], session=session, stream=stream)
    return JSONResponse({"response": response.text})


if __name__ == "__main__":
    app.run()

Ostrzeżenie

Magazyn sesji w pamięci w przykładowym niestandardowym programie obsługi jest tracony po ponownym uruchomieniu. Użyj magazynu trwałego (na przykład Cosmos DB) w środowisku produkcyjnym.

Uwaga / Notatka

Obsługa języka Go dla agentów hostowanych w usłudze Foundry będzie wkrótce dostępna. Aktualny status znajdziesz w repozytorium Agent Framework dla Go.

Tip

Zapoznaj się z przykładami Python lub C#, aby zobaczyć projekty hostowanych agentów. Możesz też użyć polecenia azd ai agent init do utworzenia szkieletu projektu agenta hostowanego od podstaw. Zapoznaj się z tym przewodnikiem Szybki start , aby uzyskać instrukcje krok po kroku.

Uruchamianie lokalnie

Interfejs wiersza polecenia dewelopera Azure (azd) zapewnia najprostszy sposób uruchamiania i testowania hostowanego agenta lokalnie.

Inicjowanie projektu

Utwórz nowy folder i zainicjuj go na podstawie przykładowego manifestu:

mkdir my-hosted-agent && cd my-hosted-agent
azd ai agent init -m <path-to-agent.manifest.yaml>

Tip

Manifest może być ścieżką do lokalnego pliku YAML lub adresu URL zdalnego manifestu.

Ustawianie zmiennych środowiskowych

export FOUNDRY_PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
export AZURE_AI_MODEL_DEPLOYMENT_NAME="<your-model-deployment>"

Uruchom hosta agenta

azd ai agent run

Agent host rozpoczyna działanie na http://localhost:8088.

Wywoływanie agenta

azd ai agent invoke --local "Hello!"

Możesz też użyć curl:

curl -X POST http://localhost:8088/responses \
  -H "Content-Type: application/json" \
  -d '{"input": "Hello!"}'

Lub w programie PowerShell:

(Invoke-WebRequest -Uri http://localhost:8088/responses -Method POST -ContentType "application/json" -Body '{"input": "Hello!"}').Content

Wdrażanie do platformy Foundry

Po zweryfikowaniu agenta lokalnie wdróż go w usłudze Microsoft Foundry:

  1. Aprowizuj zasoby (jeśli nie masz jeszcze projektu Foundry):

    azd provision
    

    Tworzy grupę zasobów z instancją Foundry, projektem, implementacją modelu, Application Insights i rejestrem kontenerów.

  2. Wdróż agenta:

    azd deploy
    

    Spakietuje to Twojego agenta jako obraz kontenera, wypchnie go do Azure Container Registry i wdroży w usłudze Foundry Agent Service.

Infrastruktura hostingu rozwiązania Foundry automatycznie wprowadza następujące zmienne środowiskowe do kontenera agenta w czasie wykonywania:

Zmienna Description
FOUNDRY_PROJECT_ENDPOINT Adres URL punktu końcowego dla projektu Foundry.
AZURE_AI_MODEL_DEPLOYMENT_NAME Nazwa wdrożenia modelu (skonfigurowana podczas azd ai agent init).
APPLICATIONINSIGHTS_CONNECTION_STRING Usługa Application Insights parametry połączenia na potrzeby telemetrii.

Po wdrożeniu agent jest dostępny za pośrednictwem dedykowanego punktu końcowego rozwiązania Foundry i można go również przetestować w portalu Foundry.

Dalsze kroki