Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En värdbaserad agent är en container som uppfyller ett specifikt körningskontrakt med Microsoft Foundry-plattformen. Den här referensen beskriver vad plattformen förväntar sig av din container och hur SDK-adapterpaketen hjälper dig att uppfylla dessa krav.
SDK-adapterpaketen implementerar hela kontraktet åt dig. Om du använder azure-ai-agentserver-responses eller azure-ai-agentserver-invocationsimplementerar du endast din hanteringslogik.
Om du använder en kodningsagent som GitHub Copilot för att implementera eller granska en värdbaserad agentcontainer kan Microsoft Foundry Skill hjälpa dig att kontrollera körningskontraktet, adapteranvändningen och distributionsantagandena.
Kontraktskrav
Containern måste:
| Krav | Detail |
|---|---|
| Lyssna på port 8088 | HTTP/1.1, oformaterad HTTP. Plattformen avslutar TLS. |
| Hantera en hälsoavsökning | Gå tillbaka 200 OK från GET /readiness. |
| Implementera en protokollslutpunkt | Servera minst en av POST /responses eller POST /invocations. |
| Använda plattformsmiljövariabler | Läs variablerna som plattformen matar in vid start. |
| Stäng graciöst | Rensa skrivningar och stäng anslutningar på SIGTERM. |
Protokollslutpunkter
Ett protokoll definierar HTTP-kontraktet mellan Foundry och din agentcontainer. Containern implementerar minst en protokollslutpunkt.
Svarsprotokoll
Svarsprotokollet implementerar OpenAI-svars-API:et. Plattformen skickar begäranden till POST /responses och förväntar sig antingen ett JSON-svar eller en SSE-ström (Server-Sent Events).
| Aspect | Detail |
|---|---|
| Endpoint | POST /responses |
| Input | Api-begäran för OpenAI-svar (input, model, streamoch så vidare) |
| Output | JSON-svarsobjekt eller SSE-ström av svarshändelser |
| Konversationshistorik | Hydratiseras automatiskt av SDK-adaptern när conversation.id den finns |
| Strömmande | SSE med text/event-stream innehållstypen |
Använd svarsprotokollet som standardval. Det är kompatibelt med OpenAI API-ekosystemet.
Anropsprotokoll
Anropsprotokollet är ett minimalt direktprotokoll. Du definierar nyttolaststrukturen och plattformen skickar den utan tolkning.
| Aspect | Detail |
|---|---|
| Endpoint | POST /invocations |
| Input | Alla JSON-nyttolaster som din hanterare förväntar sig |
| Output | JSON-svar eller SSE-dataström |
| Konversationshistorik | Inte hanterad. Koden hanterar tillstånd om det behövs. |
| Strömmande | Valfritt, via SSE |
Använd anropsprotokollet när du behöver fullständig kontroll över nyttolasten för begäran och svar.
SDK-adapterpaket
Adapterpaketen är protokollspecifika och ramverksagnostiska. De arbetar med alla agentramverk, inklusive Microsoft Agent Framework, LangGraph och anpassad kod.
| Protokoll | Python-paket | .NET paket |
|---|---|---|
| Responses | azure-ai-agentserver-responses |
Azure.AI.AgentServer.Responses |
| Anrop | azure-ai-agentserver-invocations |
Azure.AI.AgentServer.Invocations |
Adaptern hanterar följande delar av kontraktet åt dig:
- HTTP-serverkonfiguration på port 8088.
- Slutpunkten för hälsoavsökningen (
GET /readiness). - Protokollspecifik frågeparsing och svarsformatering.
- Hydrering av konversationshistorik (svarsprotokoll).
- SSE-strömningsinfrastruktur.
- OpenTelemetry-instrumentation.
- Graciös avstängning på
SIGTERM. - Förbrukning av plattformsmiljövariabler.
Du implementerar en hanteringsfunktion som tar emot parsade begäranden och returnerar svar.
Tidskrävande och elastisk körning (förhandsversion)
Protokollkorten består av den motståndskraftiga uppgiften och strömmande primitiver i deras AgentServer Core-beroende. Använd dessa primitiver när arbetet måste överleva ett processavbrott eller klienter måste återansluta till återreplikerade utdata.
Svarskortet kan hantera elastisk körning för lagrade bakgrundssvar. Servern väljer elastisk bakgrundsbearbetning och din hanterare kör eller återupptar antingen på ett säkert sätt från en varaktig kontrollpunkt. Förgrundssvar anropas inte igen när processen har stoppats.
Kortet Anrop föreskriver inte något status- eller avsökningskontrakt. Registrera elastiska uppgifter för varaktig körning och definiera sedan svars-, avsöknings- eller strömslutpunkter som exponerar förloppet för dina klienter.
För körningsmodellen, kontrollpunktsstrategier och beteende för återspelning av klienter, se Motståndskraft för långvariga värdbaserade agenter.
Exempel på hanterare
De fullständiga bring-your-own-exemplen för båda protokollen och båda språken finns på lagringsplatsen foundry-samples .
Exempel på svarsprotokoll
Den här minimala hanteraren vidarebefordrar användarindata till en modell från foundry-modellkatalogen via svars-API:et. SDK-adaptern återfuktar konversationshistoriken automatiskt via context.get_history() (Python) eller context.GetHistoryAsync() (C#), så agenten behåller kontexten över varv.
Från bring-your-own/responses/hello-world/main.py:
import asyncio
import os
from azure.ai.agentserver.responses import (
CreateResponse,
ResponseContext,
ResponsesAgentServerHost,
ResponsesServerOptions,
TextResponse,
)
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
# FOUNDRY_PROJECT_ENDPOINT is auto-injected in hosted Foundry containers and
# set by 'azd ai agent run' for local development.
_endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
_model = os.environ["FOUNDRY_MODEL_NAME"]
_project_client = AIProjectClient(
endpoint=_endpoint, credential=DefaultAzureCredential()
)
_responses_client = _project_client.get_openai_client().responses
app = ResponsesAgentServerHost(
options=ResponsesServerOptions(default_fetch_history_count=20),
)
@app.response_handler
async def handler(
request: CreateResponse,
context: ResponseContext,
_cancellation_signal: asyncio.Event,
):
user_input = await context.get_input_text() or "Hello!"
history = await context.get_history()
# Build the model input from prior conversation turns + the current message.
input_items = []
for item in history:
# Map history items to {"role": ..., "content": ...} dicts; see the
# full sample for the unpacking helper.
...
input_items.append({"role": "user", "content": user_input})
response = await asyncio.get_running_loop().run_in_executor(
None,
lambda: _responses_client.create(
model=_model,
instructions="You are a helpful AI assistant.",
input=input_items,
store=False, # platform manages history; don't store at model level
),
)
return TextResponse(context, request, text=response.output_text)
app.run()
Referens: ResponsesAgentServerHost, AIProjectClient, DefaultAzureCredential
Exempel på anropsprotokoll
Med anropsprotokollet tar hanteraren emot det JSON som anroparen publicerar och returnerar det JSON-kod du väljer. Det finns ingen inbyggd konversationshistorik.
Mönster från bring-your-own/invocations/hello-world:
from starlette.requests import Request
from starlette.responses import JSONResponse, Response
from azure.ai.agentserver.invocations import InvocationAgentServerHost
app = InvocationAgentServerHost()
@app.invoke_handler
async def handle_invoke(request: Request) -> Response:
data = await request.json()
message = data.get("message", "Hello!")
return JSONResponse({"echo": message})
if __name__ == "__main__":
app.run()
De fullständiga exemplen omfattar även hydrering av konversationshistorik, felhantering, telemetri, integrering av verktygslåda och Dockerfile och azure.yaml konfiguration.
Hälsoavsökning
Plattformen skickar GET /readiness för att avgöra om containern är redo att hantera trafik. Returnera 200 OK när containern är klar eller en status som inte är 200 för att signalera att plattformen ska starta om instansen. SDK-korten registrerar den här slutpunkten automatiskt.
Nätverk och transport
| Fastighet | Value |
|---|---|
| Protokoll | HTTP/1.1 |
| Standardport | 8088 (åsidosättning med PORT miljövariabeln) |
| Bindningsadress |
0.0.0.0 (alla gränssnitt) |
| TLS | Avslutad av plattformen. Containern hanterar vanlig HTTP. |
Graciös avstängning
När plattformen skickar SIGTERMslutar containern att acceptera nya begäranden, slutför begäranden under flygning, töms väntande skrivningar till $HOME (sessionsfilsystemet) och avslutas rent. SDK-korten hanterar den här sekvensen automatiskt.
Plattformsmiljövariabler
Plattformen matar in miljövariabler i containern vid start. Koden kan läsa följande nyckelvariabler:
| Variable | Purpose |
|---|---|
FOUNDRY_PROJECT_ENDPOINT |
Foundry-projektslutpunkt för API-anrop |
FOUNDRY_AGENT_ID |
Agentens stabila identifierare (GUID). Använd den för routning per agent, telemetri eller lagringspartitionering. |
FOUNDRY_AGENT_NAME |
Agentens namn |
FOUNDRY_AGENT_VERSION |
Agentens version |
FOUNDRY_AGENT_SESSION_ID |
Aktuellt sessions-ID |
Plattformsbegärandehuvuden (containerprotokoll 2.0.0)
Dessa huvuden gäller endast för värdbaserade agenter i containerprotokollversion 2.0.0. På protokoll 2.0.0 matar plattformen in dem på varje begäran till protokollslutpunkterna, både för protokollen Svar och anrop. De skickas inte till infrastrukturslutpunkter som hälsoavsökningen. Behandla deras värden som ogenomskinliga och lästa men åsidosätt dem inte.
| Sidhuvud | Purpose |
|---|---|
x-agent-user-id |
Global identifierare per användare för den aktuella anroparen. Använd den som primär partitionsnyckel för data per användare som dina containerlager. Det är för din containers eget bruk och vidarebefordras inte utgående. Samma användare ger samma värde mellan agenter. |
x-agent-foundry-call-id |
Identifierare per begäran. Vidarebefordra den oförändrad på utgående anrop till Foundry-tjänster (lagring, verktygslåda och andra agenter); plattformen löser uppringarens identitet från den. De officiella SDK-korten vidarebefordrar det automatiskt när du anropar dessa tjänster via deras klienter. |
Båda rubrikerna är tillförlitliga – plattformen genererar dem från verifierad identitet – och ingen av dem garanteras när du kör lokalt, så hantera saknade värden korrekt.
AgentServer SDK exponerar dessa som konstanter på PlatformHeaders och läser dem åt dig – via FoundryAgentRequestContext.Current i .NET eller get_request_context() i Python. För den fullständiga listan över plattformshuvuden, inklusive svarshuvuden, lägger runtime till till exempel x-agent-session-id, x-platform-serveroch x-platform-error-source, i referensen för Azure AI Agent Server Core-bibliotek.
Information om hur protokoll 2.0.0 ändrar identitetsspridning finns i Migrera värdbaserade agenter.
Exempel: partition lagrade data per session
När containern bevarar användarägda data måste du ange dem efter sessionen (och för delade sessioner, användaren) så att en anropare inte kan läsa en annans data. Exemplet med anteckningsagenten gör detta genom att härleda en filsökväg per session under $HOME, där filer också kan nås via API:et sessionfiler:
# note_store.py - one JSONL file per session, stored under $HOME.
def _get_file_path(session_id: str) -> str:
safe_id = "".join(c if c.isalnum() or c in "-_" else "_" for c in session_id)
base_dir = os.environ.get("HOME", os.getcwd())
return os.path.join(base_dir, f"notes_{safe_id}.jsonl")
När fler än en användare kan dela en session lägger du till x-agent-user-id i nyckeln. Se Multiplex flera användare i en värdbaserad agentsession.
Vidarebefordra anpassade begärandehuvuden till din container
I föregående avsnitt beskrivs rubriker som plattformen matar in. Separat vidarebefordrar gatewayen endast en fast uppsättning begärandehuvuden som tillhandahålls av anroparen till containern. Alla anroparhuvud utanför den uppsättningen tas bort vid gatewayen innan begäran når containern, vilket håller autentiseringsuppgifter och interna huvuden utanför containern som standard.
Om du vill skicka dina egna kontextuella data till containern använder du prefixet för direktklienthuvud, x-client-. Plattformen vidarebefordrar varje rubrik som börjar med x-client- oförändrad, så att du kan skicka värden som ett klient-ID eller en funktionsflagga utan att ändra begärandetexten och sedan läsa dem i hanteraren som andra begäranderubriker. AgentServer SDK definierar det här prefixet som PlatformHeaders.ClientHeaderPrefix; för den fullständiga plattformshuvudlistan kan du läsa referensen för Azure AI Agent Server Core-bibliotek.
Gatewayen vidarebefordrar dessa anroparhuvuden till protokollslutpunkterna Svar och anrop:
| Rubrik eller prefix | Purpose |
|---|---|
x-client-* |
Alla anpassade huvuden som du prefixar med x-client-. Använd det här prefixet för att skicka dina egna kontextuella värden – till exempel klientorganisation, funktionsflaggor eller korrelationstoken – till din container. |
accept, accept-encoding, accept-language, content-type, , , content-lengthcontent-encoding |
Standardinnehållsförhandling och brödtextrubriker som behövs för att parsa begäran. |
traceparent, tracestate, baggage, x-ms-client-request-id, x-request-id, request-id, correlation-contextrequest-contextms-cv |
Distribuerade spårnings- och korrelations-ID:er, så containerns loggar länkar till den ursprungliga begäran. |
user-agent |
Identifierar den anropande SDK:t eller klienten för diagnostik. |
Gatewayen vidarebefordrar aldrig autentiseringshuvuden som Authorization, eller Host, Cookieoch x-forwarded-*. Alla huvuden som inte matchar listan över tillåtna tas bort, så förlita dig inte på anpassade rubriker utanför prefixet x-client-* som når containern.