Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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. Agenci hostowani Microsoft Foundry są już ogólnie dostępni.
Dzięki integracji hostingu Agent Framework możesz udostępnić obiekt Agent, w tym przepływ pracy opakowany za pomocą Workflow.as_agent(), za pośrednictwem protokołu Foundry Responses lub Invocations przy użyciu minimalnej ilości kodu.
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
$HOMEi 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
Integracja języka Python agent-framework-foundry-hosting jest w wersji przedpremierowej. Agenci hostowani Microsoft Foundry, usługa zarządzanego hostingu, są już ogólnie dostępni.
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:
- Projekt Microsoft Foundry z wdrożeniem modelu (na przykład
gpt-4o) - Zainstalowany i uwierzytelniony interfejs wiersza polecenia platformy Azure (
az login)
- .NET 10 SDK lub nowszy
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 hostingu wersji wstępnej, klienta programu Foundry i pakiet uwierzytelniania Azure:
pip install --pre agent-framework-foundry agent-framework-foundry-hosting azure-identity
W Foundry platforma dostarcza kontekst użytkownika podmiotu wywołującego oraz kontekst wywołania; infrastruktura hostująca używa ich do izolowania stanu dla poszczególnych użytkowników i przekazywania kontekstu żądania do usług Foundry. W przypadku uruchomień lokalnych ten kontekst platformy nie jest dostępny, dlatego aplikacje muszą w razie potrzeby zapewnić własne mechanizmy tożsamości i zarządzania stanem.
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.",
)
server = ResponsesHostServer(agent)
server.run()
Element ResponsesHostServer opakowuje instancję agenta i uwidacznia ją za pośrednictwem protokołu Foundry Responses. W przypadku agenta, który nie jest agentem przepływu pracy, domyślny element history_source="agent_server" używa skonfigurowanego dostawcy odpowiedzi serwera Agent Server jako źródła historii modelu. Host uniemożliwia usłudze modelu podrzędnego zachowywanie drugiej kopii, gdy klient domyślnie przechowuje historię.
Nie łącz domyślnego źródła historii z elementem HistoryProvider, który ma load_messages=True. Nie ustawiaj również opcji kontynuacji conversation_idusługi , previous_response_idlub conversation podrzędnej. Host odrzuca te konfiguracje, aby zapobiec zduplikowaniu historii.
Użyj ResponsesHostServer(agent, history_source="agent"), gdy dostawca historii agenta lub usługa modelu podrzędnego musi zarządzać historią rozmowy. Ten tryb przekazuje tylko dane wejściowe bieżącego żądania z Agent Server i zachowuje historię agenta oraz sposób działania magazynu usługi. Implementacje niestandardowe SupportsAgentRun muszą używać tego trybu. Parametr store pozostaje oddzielny: wybiera dostawcę odpowiedzi, który utrwala dane wejściowe interfejsu API odpowiedzi i dane wyjściowe w obu trybach.
Host jest właścicielem dostarczonego agenta i może dodać dostawców kontekstu specyficznych dla hostingu. Nie należy ponownie używać agenta z innym hostem ani wywoływać go bezpośrednio po zakończeniu budowy hosta.
Zachowywać stan i obsługiwać długotrwałe rozmowy
ResponsesHostServer Domyślnie konfiguruje magazyny oparte na platformie Foundry. W przypadku agentów niebędących agentami przepływu pracy AgentSessionStoreProvider udostępnia element FoundryAgentSessionStore. W przypadku agentów przepływu pracy element CheckpointStoreProvider udostępnia element FoundryCheckpointStore.
FunctionApprovalStoreProvider udostępnia FoundryFunctionApprovalStore dla oczekujących zatwierdzeń. Te repozytoria używają Foundry State Store w środowisku hostowanym oraz lokalnego stanu serwera Agent Server, gdy uruchamiasz je lokalnie.
W przypadku history_source="agent" skonfigurowany magazyn sesji zachowuje stan dostawcy przenoszony przez AgentSession, w tym komunikaty z InMemoryHistoryProvider.
Aby dostosować pamięć, przekaż StoreProvider do function_approval_store_provider lub agent_session_store_provider. Przekaż element ContextScopedStoreProvider do checkpoint_store_provider. Na przykład zaimplementuj SessionStore i StoreProvider[SessionStore] tak, aby używały własnego magazynu sesji dla agenta nieopartego na przepływie pracy.
Zaimportuj ResponsesServerOptions z azure.ai.agentserver.responses i przekaż go do ResponsesHostServer za pomocą parametru options. Dostępne długotrwałe opcje konwersacji zależą od typu agenta:
| Zdolność | Typ agenta | Wymagania i zachowanie |
|---|---|---|
| Odpowiedzi w tle odporne na błędy | Tylko przepływ pracy | Ustaw wartość ResponsesServerOptions(resilient_background=True). Wyślij żądanie Responses za pomocą store=true i background=true. Po ponownym uruchomieniu host wznowi najnowszy trwały punkt kontrolny przepływu pracy lub odtwarza oryginalne dane wejściowe, jeśli nie istnieje żaden punkt kontrolny. Nie konfiguruj magazynu punktów kontrolnych w przepływie pracy, ponieważ host zarządza nim. Spraw, aby zewnętrzne efekty uboczne były idempotentne, ponieważ operacje wykonane po ostatnim trwałym punkcie kontrolnym mogą się powtórzyć. |
| Konwersacje sterowane | Tylko bez przepływu pracy | Ustaw ResponsesServerOptions(steerable_conversations=True) i wyślij żądania odpowiedzi za pomocą polecenia store=true. Zachowaj włączenie jednego łańcucha liniowego, ponownie używając tej samej conversation wartości. Alternatywnie wyślij bezpośrednio poprzedzający previous_response_id i zachowaj rozwiązany agent_session_id. Host odrzuca przestarzałych poprzedników, którzy spowodowaliby rozgałęzienie. |
ResponsesHostServer zgłasza RuntimeError, jeśli włączysz odpowiedzi działające w tle z mechanizmem odporności dla agenta, który nie jest agentem przepływu pracy, lub konwersacje sterowalne dla agenta przepływu pracy. Aby zapoznać się z pełnymi implementacjami, zobacz przykłady niestandardowego magazynu danych, odpornego długotrwałego przepływu pracy i sterowalnego długotrwałego agenta.
Obsługa żądań zgody OAuth
Gdy narzędzie MCP hostowane w usłudze Foundry wymaga zgody użytkownika, ResponsesHostServer zwraca niekompletną odpowiedź z elementem wyjściowym oauth_consent_request . Przedstaw użytkownikowi element consent_link, a następnie kontynuuj, używając identyfikatora niekompletnej odpowiedzi jako previous_response_id, po wyrażeniu zgody przez użytkownika. Host zachowuje sesję agenta dla tej próby i uwidacznia tylko bezwzględne łącza zgody HTTPS.
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()
Warning
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.
Kompletny przykład wdrożenia Invocations znajdziesz w przykładzie Telegrama hostowanym w Foundry. Umieszcza usługę API Management przed webhookiem hostowanego agenta i używa tożsamości zarządzanych, usługi Key Vault oraz usługi Cosmos DB do przechowywania trwałej historii konwersacji.
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:
Aprowizuj zasoby (jeśli nie masz jeszcze projektu Foundry):
azd provisionTworzy grupę zasobów z instancją Foundry, projektem, implementacją modelu, Application Insights i rejestrem kontenerów.
Wdróż agenta:
azd deploySpakietuje 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:
| Variable | Opis |
|---|---|
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.