Foundry Hostade Agenter

Hosted-agenter i Microsoft Foundry Agent Service kan du distribuera Agent Framework-agenter som containerbaserade program till Microsoft hanterad infrastruktur. Plattformen hanterar skalning, sessionstillståndsbeständighet, säkerhet och livscykelhantering så att du kan fokusera på agentens logik. Microsoft Foundry Hosted Agents är allmänt tillgänglig.

Med agentramverkets värdintegrering kan du exponera ett Agent, inklusive ett arbetsflöde omslutet med Workflow.as_agent(), via protokollet Foundry Responses eller Invocations med minimal kod.

När värdbaserade agenter ska användas

Välj Foundry-värdbaserade agenter när du vill:

  • Hanterad infrastruktur – du behöver inte konfigurera containrar, webbservrar eller skalningsregler själv.
  • Inbyggd sessionshantering – plattformen bevarar $HOME och uppladdade filer över omgångar och inaktiva perioder.
  • Dedikerad agentidentitet – varje distribuerad agent får sin egen Entra-identitet för säker åtkomst till modeller, verktyg och underordnade tjänster.
  • OpenAI-kompatibla slutpunkter – klienter kan interagera med din agent med valfri OpenAI-kompatibel SDK via protokollet Svar.

Anmärkning

Python-integreringen agent-framework-foundry-hosting är en förhandsversion. Microsoft Foundry Hosted Agents, den hanterade värdtjänsten, är allmänt tillgänglig.

Förutsättningar

För lokal testning behöver du också:

Installera NuGet-värdpaketet:

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

Installera värdpaketet för förhandsversion, Foundry-klienten och Azure autentiseringspaketet:

pip install --pre agent-framework-foundry agent-framework-foundry-hosting azure-identity

I Foundry tillhandahåller plattformen anroparens användarkontext och samtalskontext. värdinfrastrukturen använder dem för att isolera tillstånd per användare och vidarebefordra begärandekontext till Foundry-tjänster. Lokala körningar får inte den plattformskontexten, så applikationer måste tillhandahålla egna kontroller för identitet och tillstånd vid behov.

Svarsprotokoll

Protokollet Svar är den rekommenderade startpunkten för de flesta agenter. Den exponerar en OpenAI-kompatibel /responses slutpunkt och plattformen hanterar konversationshistorik, strömning och sessionslivscykel automatiskt.

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

AgentHost.CreateBuilder skapar ett programvärd som är förkonfigurerat för värdmiljön Foundry. AddFoundryResponses registrerar din agent med svarsprotokollhanteraren och MapFoundryResponses mappar /responses HTTP-slutpunkten.

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

Omsluter ResponsesHostServer din agent och exponerar den via protokollet Foundry Responses. Om du anger storeFalse i default_options undviks duplicering av konversationshistorik eftersom värdinfrastrukturen hanterar historiken automatiskt.

Spara tillstånd och hantera långvariga konversationer

ResponsesHostServer konfigurerar lagringsplatser som stöds av Foundry som standard. För agenter som inte är arbetsflödesagenter tillhandahåller AgentSessionStoreProvider en FoundryAgentSessionStore. CheckpointStoreProvider tillhandahåller en FoundryCheckpointStore för arbetsflödesagenter. FunctionApprovalStoreProvider tillhandahåller en FoundryFunctionApprovalStore för väntande godkännanden. Dessa lagringsplatser använder Foundry State Store när de är värdbaserade och lokalt Agent Server-tillstånd när du kör lokalt.

Om du vill anpassa lagringen skickar du en StoreProvider till agent_session_store_provider eller function_approval_store_provider. Skicka en ContextScopedStoreProvider till checkpoint_store_provider. Till exempel implementera SessionStore och StoreProvider[SessionStore] för att använda din egen lagring för agentsessioner som inte är kopplad till arbetsflöden.

Importera ResponsesServerOptions från azure.ai.agentserver.responsesoch skicka den till ResponsesHostServer via parametern options . Vilka alternativ för långvariga konversationer som är tillgängliga beror på agenttypen:

Capability Agenttyp Krav och beteende
Motståndskraftiga bakgrundssvar Endast arbetsflöde Ange ResponsesServerOptions(resilient_background=True). Skicka svarsbegäran med store=true och background=true. Efter en omstart återupptar värden den senaste varaktiga kontrollpunkten för arbetsflödet eller använder de ursprungliga indata på nytt om det inte finns någon kontrollpunkt. Konfigurera inte kontrollpunktslagring i arbetsflödet eftersom värden hanterar det. Gör externa sidoeffekter idempotenta eftersom arbetet efter den senast beständiga kontrollpunkten kan upprepas.
Styrningsbara konversationer Endast utan arbetsflöde Ange ResponsesServerOptions(steerable_conversations=True) och skicka svarsbegäranden med store=true. Behåll vändor på en linjär kedja genom att återanvända samma conversation-värde. Du kan också skicka den omedelbart föregående previous_response_id och bevara den lösta agent_session_id. Värdnoden avvisar inaktuella föregångarnoder som skulle orsaka en förgrening.

ResponsesHostServer utlöser RuntimeError om du aktiverar resilienta bakgrundssvar för en agent som inte är en arbetsflödesagent eller styrbara konversationer för en arbetsflödesagent. För fullständiga implementeringar, se exemplen på anpassad lagring, motståndskraftigt långvarigt arbetsflöde och styrbar långvarig agent.

Anropsprotokoll

Protokollet Anrop ger dig fullständig kontroll över HTTP-begäran och -svaret. Använd den när du behöver anpassade nyttolaster, icke-konversationsbearbetning eller direktuppspelningsprotokoll som inte är OpenAI-kompatibla.

Med protokollet Anrop i C# implementerar du en anpassad InvocationHandler för att bearbeta inkommande begäranden:

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

Metoden AddInvocationsServer registrerar protokolltjänsterna för anrop. Du implementerar InvocationHandler för att definiera hur din agent bearbetar varje begäran.

För en enkel installation använder du InvocationsHostServer från agent_framework_foundry_hosting paketet. Den omsluter din agent på samma sätt som ResponsesHostServer och hanterar sessionshantering automatiskt:

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

För fullständig kontroll över hanteringen av förfrågningar, använder du InvocationAgentServerHost från azure.ai.agentserver.invocations-paketet direkt och implementerar din egen anroparhanterare.

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

Varning

Minnesinternt sessionsarkiv i exemplet med anpassad hanterare går förlorat vid omstart. Använd varaktig lagring (till exempel Cosmos DB) i produktion.

Anmärkning

Go-stöd för värdbaserade agenter i Foundry blir snart tillgängligt. Se Agent Framework Go-lagringsplatsen för den senaste statusen.

Tip

Se exemplen Python eller C# för exempel på ett värdbaserat agentprojekt. Eller använd azd ai agent init kommandot för att skapa ett nytt värdbaserat agentprojekt från grunden. I den här snabbstartsguiden finns stegvisa instruktioner.

Körs på lokal nivå

AZURE Developer CLI (azd) är det enklaste sättet att köra och testa din värdbaserade agent lokalt.

Initiera ett projekt

Skapa en ny mapp och initiera från ett exempelmanifest:

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

Tip

Manifestet kan vara en sökväg till en lokal YAML-fil eller en URL till ett fjärrmanifest.

Ange miljövariabler

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

Kör agentvärden

azd ai agent run

Värddator för agenten startar och körs på http://localhost:8088.

Anropa agenten

azd ai agent invoke --local "Hello!"

Eller använd curl:

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

Eller i PowerShell:

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

Distribuera till Foundry

När du har verifierat din agent lokalt distribuerar du den till Microsoft Foundry:

  1. Etablera resurser (om du inte redan har ett Foundry-projekt):

    azd provision
    

    Då skapas en resursgrupp med en Foundry-instans, ett projekt, en modelldistribution, Application Insights och ett containerregister.

  2. Distribuera agenten:

    azd deploy
    

    Detta paketerar din agent som en containeravbildning, push-överför den till Azure Container Registry och distribuerar den till Foundry Agent Service.

Foundry-värdinfrastrukturen matar automatiskt in följande miljövariabler i din agentcontainer vid körning:

Variabel Beskrivning
FOUNDRY_PROJECT_ENDPOINT Slutpunkts-URL:en för Foundry-projektet.
AZURE_AI_MODEL_DEPLOYMENT_NAME Namnet på modelldistributionen (konfigurerades under azd ai agent init).
APPLICATIONINSIGHTS_CONNECTION_STRING Anslutningssträng för Application Insights-telemetri.

När agenten har distribuerats är den tillgänglig via sin dedikerade Foundry-slutpunkt och kan även testas från Foundry-portalen.

Nästa steg