Foundry-Hosting-Agenten

Hosted Agents in Microsoft Foundry Agent Service können Sie Agent Framework-Agents als containerisierte Anwendungen für Microsoft verwaltete Infrastruktur bereitstellen. Die Plattform behandelt Skalierung, Sitzungszustandspersistenz, Sicherheit und Lebenszyklusverwaltung, damit Sie sich auf die Logik Ihres Agents konzentrieren können.

Mit der Hostintegration des Agent-Frameworks können Sie beliebige Agent oder Workflows mit minimalem Code verwenden und über das Foundry-Responses- oder Invocations-Protokoll verfügbar machen.

Wann werden gehostete Agents verwendet?

Wählen Sie die von Foundry gehosteten Agents aus, wenn Sie möchten:

  • Verwaltete Infrastruktur – sie müssen keine Container, Webserver oder Skalierungsregeln selbst konfigurieren.
  • Integrierte Sitzungsverwaltung – die Plattform speichert $HOME und hochgeladene Dateien während Sitzungswechseln und Leerlaufzeiten.
  • Dedizierte Agentidentität – jeder bereitgestellte Agent erhält seine eigene Entra-Identität, um sicheren Zugriff auf Modelle, Tools und downstream-Dienste zu erhalten.
  • OpenAI-kompatible Endpunkte – Clients können mit Ihrem Agent über das Antwortprotokoll mit jedem openAI-kompatiblen SDK interagieren.

Hinweis

Gehostete Foundry-Agenten befinden sich derzeit in der Vorschau. In der Dokumentation zu den in Foundry gehosteten Agents finden Sie die neuesten Verfügbarkeit, Grenzwerte und Preise.

Voraussetzungen

Für lokale Tests benötigen Sie außerdem Folgendes:

  • Ein Microsoft Foundry-Projekt mit einer Modellbereitstellung (z. B. gpt-4o)
  • Azure CLI installiert und authentifiziert (az login)

Installieren Sie das Hosting-NuGet-Paket:

dotnet add package Microsoft.Agents.AI.Foundry.Hosting --prerelease
dotnet add package Azure.AI.Projects --prerelease
  • Python 3.10 oder höher

Installieren Sie das Hosting-Python-Paket:

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

Antwortprotokoll

Das Antwortprotokoll ist der empfohlene Ausgangspunkt für die meisten Agents. Er bietet einen OpenAI-kompatiblen /responses Endpunkt an, und die Plattform verwaltet den Konversationsverlauf, das Streaming und den Sitzungslebenszyklus automatisch.

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

Der AgentHost.CreateBuilder erstellt einen Anwendungshost, der für die Foundry-Hostingumgebung vorkonfiguriert ist. AddFoundryResponses registriert Ihren Agent mit dem Antwortprotokollhandler und MapFoundryResponses ordnet den /responses HTTP-Endpunkt zu.

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()

ResponsesHostServer umschließt Ihren Agenten und macht ihn über das Foundry Responses-Protokoll verfügbar. Das Festlegen von store auf False in default_options verhindert das Duplizieren des Unterhaltungsverlaufs, da die Hostinginfrastruktur den Verlauf automatisch verwaltet.

Aufrufeprotokoll

Das Aufrufprotokoll bietet Ihnen die vollständige Kontrolle über die HTTP-Anforderung und -Antwort. Verwenden Sie sie, wenn Sie benutzerdefinierte Nutzlasten, nicht unterhaltungsbezogene Verarbeitung oder Streamingprotokolle benötigen, die nicht mit OpenAI kompatibel sind.

Mit dem Invocations-Protokoll in C# implementieren Sie eine benutzerdefinierte InvocationHandler, um eingehende Anforderungen zu verarbeiten.

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

Die AddInvocationsServer Methode registriert die Invocations-Protokolldienste. Sie implementieren InvocationHandler , um zu definieren, wie Ihr Agent jede Anforderung verarbeitet.

Verwenden Sie InvocationsHostServer für ein einfaches Setup aus dem agent_framework_foundry_hosting Paket. Es umschließt Ihren Agenten ähnlich wie ResponsesHostServer und behandelt die Sitzungsverwaltung automatisch.

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()

Um die Vollständige Kontrolle über die Anforderungsverarbeitung zu erhalten, verwenden Sie InvocationAgentServerHost direkt das azure.ai.agentserver.invocations Paket, und implementieren Sie ihren eigenen Aufrufhandler:

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()

Warnung

Der speicherinterne Sitzungsspeicher im benutzerdefinierten Handlerbeispiel geht beim Neustart verloren. Verwenden Sie langlebige Lagerung (z. B. Cosmos DB) in der Produktion.

Hinweis

Go-Unterstützung für in Foundry gehostete Agenten ist bald verfügbar. Den neuesten Status finden Sie im Agent Framework Go-Repository .

Tipp

In den Beispielen Python oder in den Beispielen C# finden Sie Beispiele für ein gehostetes Agentprojekt. Oder verwenden Sie den azd ai agent init Befehl, um ein neues gehostetes Agent-Projekt von Grund auf neu zu erstellen. In dieser Schnellstartanleitung finden Sie schrittweise Anleitungen.

Lokales Ausführen

Die Azure Developer CLI (azd) bietet die einfachste Möglichkeit, Ihren gehosteten Agent lokal auszuführen und zu testen.

Initialisieren eines Projekts

Einen neuen Ordner erstellen und es mit einem Beispielmanifest initialisieren.

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

Tipp

Das Manifest kann ein Pfad zu einer lokalen YAML-Datei oder eine URL zu einem Remotemanifest sein.

Festlegen von Umgebungsvariablen

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

Starten Sie den Agenthost

azd ai agent run

Der Agenthost beginnt am http://localhost:8088.

Agent aufrufen

azd ai agent invoke --local "Hello!"

Oder verwenden Sie curl:

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

Oder in PowerShell:

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

Bereitstellen in Gießerei

Nachdem Sie Ihren Agent lokal überprüft haben, stellen Sie ihn für Microsoft Foundry bereit:

  1. Bereitstellen von Ressourcen (wenn Sie noch kein Foundry-Projekt haben):

    azd provision
    

    Dadurch wird eine Ressourcengruppe mit einer Foundry-Instanz, einem Projekt, einer Modellbereitstellung, Application Insights und einer Containerregistrierung erstellt.

  2. Bereitstellen des Agents:

    azd deploy
    

    Dadurch wird Ihr Agent als Containerimage verpackt, an Azure Container Registry verschoben und im Foundry Agent Service bereitgestellt.

Die Foundry-Hostinginfrastruktur fügt automatisch die folgenden Umgebungsvariablen zur Laufzeit in Ihren Agentcontainer ein:

Variable Description
FOUNDRY_PROJECT_ENDPOINT Die Endpunkt-URL für das Foundry-Projekt.
AZURE_AI_MODEL_DEPLOYMENT_NAME Der Name der Modellbereitstellung (konfiguriert während azd ai agent init).
APPLICATIONINSIGHTS_CONNECTION_STRING Die Verbindungszeichenfolge für Application Insights für Telemetrie.

Nach der Bereitstellung ist Ihr Agent über seinen dedizierten Foundry-Endpunkt zugänglich und kann auch über das Foundry-Portal getestet werden.

Nächste Schritte