Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een gehoste agent is een container die voldoet aan een specifiek runtime-contract met het Microsoft Foundry-platform. In deze verwijzing wordt beschreven wat het platform van uw container verwacht en hoe de SDK-adapterpakketten u helpen aan deze vereisten te voldoen.
De SDK-adapterpakketten implementeren het volledige contract voor u. Als u gebruikt azure-ai-agentserver-responses of azure-ai-agentserver-invocations, implementeert u alleen uw handlerlogica.
Als u een coderingsagent zoals GitHub Copilot gebruikt om een gehoste agentcontainer te implementeren of te controleren, kan de Microsoft Foundry Skill helpen bij het controleren van het runtime-contract, het gebruik van de adapter en de implementatie.
Contractvereisten
Uw container moet:
| Requirement | Het detail |
|---|---|
| Luisteren op poort 8088 | HTTP/1.1, gewone HTTP. Het platform beëindigt TLS. |
| Een statustest uitvoeren | Terug 200 OK van GET /readiness. |
| Een protocoleindpunt implementeren | Serveer ten minste één van POST /responses of POST /invocations. |
| Platformomgevingsvariabelen gebruiken | Lees de variabelen die het platform bij het opstarten injecteert. |
| Probleemloos afsluiten | Schrijfbewerkingen leegmaken en verbindingen sluiten op SIGTERM. |
Protocoleindpunten
Een protocol definieert het HTTP-contract tussen Foundry en uw agentcontainer. Uw container implementeert ten minste één protocoleindpunt.
Protocol voor antwoorden
Het protocol voor antwoorden implementeert de OpenAI-antwoorden-API. Het platform verzendt aanvragen naar POST /responses en verwacht een JSON-antwoord of een SSE-stroom (Server-Sent Events).
| Aspect | Het detail |
|---|---|
| Eindpunt | POST /responses |
| Invoer | Api-aanvraag voor OpenAI-antwoorden (input, model, streamenzovoort) |
| Uitvoer | JSON-antwoordobject of SSE-stroom van antwoordgebeurtenissen |
| Gespreksgeschiedenis | Automatisch gehydrateerd door de SDK-adapter wanneer conversation.id deze aanwezig is |
| Streaming | SSE met het text/event-stream inhoudstype |
Gebruik het antwoordprotocol als standaardoptie. Het is compatibel met het OpenAI API-ecosysteem.
Protocol voor aanroepen
Het protocol voor aanroepen is een minimaal passthrough-protocol. U definieert de nettoladingstructuur en het platform doorloopt deze zonder interpretatie.
| Aspect | Het detail |
|---|---|
| Eindpunt | POST /invocations |
| Invoer | Elke JSON-nettolading die uw handler verwacht |
| Uitvoer | Een JSON-antwoord of SSE-stream |
| Gespreksgeschiedenis | Niet beheerd. Uw code verwerkt de status indien nodig. |
| Streaming | Optioneel, via SSE |
Gebruik het protocol voor aanroepen wanneer u volledige controle nodig hebt over de nettoladingen van aanvragen en antwoorden.
SDK-adapterpakketten
De adapterpakketten zijn protocolspecifiek en frameworkneutraal. Ze werken met elk agentframework, waaronder Microsoft Agent Framework, LangGraph en aangepaste code.
| Protocol | Python-pakket | .NET pakket |
|---|---|---|
| Responses | azure-ai-agentserver-responses |
Azure.AI.AgentServer.Responses |
| Aanroepen | azure-ai-agentserver-invocations |
Azure.AI.AgentServer.Invocations |
De adapter verwerkt de volgende onderdelen van het contract voor u:
- HTTP-serverinstallatie op poort 8088.
- Het eindpunt van de statustest (
GET /readiness). - Protocolspecifieke aanvraagparsering en antwoordopmaak.
- Hydratatie van gespreksgeschiedenis (protocol voor antwoorden).
- SSE-streaminginfrastructuur.
- OpenTelemetry-instrumentatie.
- Probleemloos afsluiten op
SIGTERM. - Verbruik van platformomgevingsvariabelen.
U implementeert een handler-functie die geparseerde aanvragen ontvangt en antwoorden retourneert.
Langdurige en tolerante uitvoering (preview)
De protocoladapters bestaan uit de tolerante taak en streamingprimitief in hun AgentServer Core-afhankelijkheid. Gebruik deze primitieven wanneer werk een procesonderbreking moet overleven of clients opnieuw verbinding moeten maken met opnieuw afgespeelde uitvoer.
De adapter Antwoorden kan tolerante uitvoering beheren voor opgeslagen achtergrondreacties. Uw server kiest voor tolerante achtergrondverwerking en uw handler wordt veilig opnieuw uitgevoerd of hervat vanaf een duurzaam controlepunt. Reacties op de voorgrond worden niet opnieuw aangeroepen nadat het proces stopt.
De adapter Aanroepen schrijft geen status of polling-contract voor. Registreer tolerante taken voor duurzame uitvoering en definieer vervolgens het antwoord, polling of stream-eindpunten die de voortgang beschikbaar maken voor uw clients.
Zie Tolerantie voor langlopende gehoste agents voor het uitvoeringsmodel, controlepuntstrategieën en gedrag van clientherhaling.
Handlervoorbeelden
De volledige bring-your-own samples voor beide protocollen en beide talen bevinden zich in de opslagplaats foundry-samples .
Voorbeeld van antwoordprotocol
Deze minimale handler stuurt gebruikersinvoer door naar een model vanuit de Foundry-modelcatalogus via de Response-API. De SDK-adapter hydrateert de gespreksgeschiedenis automatisch via context.get_history() (Python) of context.GetHistoryAsync() (C#), zodat de agent context in stand houdt.
Van 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()
Naslaginformatie: ResponsesAgentServerHost, AIProjectClient, DefaultAzureCredential
Voorbeeld van het aanroepprotocol
Met het aanroepprotocol ontvangt uw handler elke JSON die de beller plaatst en retourneert elke JSON die uw code kiest. Er is geen ingebouwde gespreksgeschiedenis.
Patroon van 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 volledige voorbeelden omvatten ook hydratatie van gespreksgeschiedenis, foutafhandeling, telemetrie, integratie van werksets en Dockerfile en azure.yaml setup.
Gezondheidsonderzoek
Het platform verzendt GET /readiness om te bepalen of uw container gereed is om verkeer te verwerken. Retourneert 200 OK wanneer de container gereed is of een niet-200-status om aan te geven dat het platform het exemplaar opnieuw moet starten. De SDK-adapters registreren dit eindpunt automatisch.
Netwerk en transport
| Property | Value |
|---|---|
| Protocol | HTTP/1.1 |
| Standaardpoort | 8088 (overschrijven met de PORT omgevingsvariabele) |
| Bindadres |
0.0.0.0 (alle interfaces) |
| TLS | Beëindigd door het platform. Uw container dient gewone HTTP. |
Probleemloos afsluiten
Wanneer het platform wordt verzonden SIGTERM, stopt uw container met het accepteren van nieuwe aanvragen, worden aanvragen tijdens de vlucht voltooid, worden schrijfbewerkingen in behandeling verwijderd naar $HOME (het sessiebestandssysteem) en wordt deze op een schone manier afgesloten. De SDK-adapters verwerken deze reeks automatisch.
Platformomgevingsvariabelen
Het platform injecteert omgevingsvariabelen in uw container bij het opstarten. Uw code kan de volgende sleutelvariabelen lezen:
| Variable | Purpose |
|---|---|
FOUNDRY_PROJECT_ENDPOINT |
Foundry-projecteindpunt voor API-aanroepen |
FOUNDRY_AGENT_ID |
De stabiele id (GUID) van de agent. Gebruik deze functie voor routering per agent, telemetrie of opslagpartitionering. |
FOUNDRY_AGENT_NAME |
De naam van de agent |
FOUNDRY_AGENT_VERSION |
De versie van de agent |
FOUNDRY_AGENT_SESSION_ID |
De huidige sessie-id |
Platformaanvraagheaders (containerprotocol 2.0.0)
Deze headers zijn alleen van toepassing op gehoste agents op containerprotocolversie 2.0.0. Op protocol 2.0.0 injecteert het platform ze op elke aanvraag naar uw protocoleindpunten, voor zowel de protocollen Antwoorden als Aanroepen. Ze worden niet verzonden naar infrastructuureindpunten, zoals de statustest. Behandel de waarden als ondoorzichtig en lees ze, maar overschrijf ze niet.
| Koptekst | Purpose |
|---|---|
x-agent-user-id |
Globale id per gebruiker voor de huidige beller. Gebruik deze als de primaire partitiesleutel voor gegevens per gebruiker die in uw containeropslag worden opgeslagen; Dit is voor het eigen gebruik van uw container en wordt niet doorgestuurd naar uitgaand verkeer. Dezelfde gebruiker levert dezelfde waarde op voor agents. |
x-agent-foundry-call-id |
Id per aanvraag. Stuur deze ongewijzigd door bij uitgaande aanroepen naar Foundry-services (Opslag, Werkset en andere agents); het platform lost de identiteit van de beller op. De officiële SDK-adapters sturen deze automatisch door wanneer u deze services aanroept via hun clients. |
Beide headers zijn betrouwbaar: het platform genereert ze op basis van geverifieerde identiteit en geen van beide wordt gegarandeerd wanneer u lokaal wordt uitgevoerd, dus zorg ervoor dat ontbrekende waarden correct worden verwerkt.
De AgentServer SDK toont deze als constanten aan PlatformHeaders en leest ze voor u FoundryAgentRequestContext.Current door in .NET of get_request_context() in Python. Zie de x-agent-session-id voor de volledige lijst met platformheaders, inclusief antwoordheaders die de runtime toevoegt, zoals x-platform-server, x-platform-error-sourceen .
Zie Gehoste agents migreren voor meer informatie over hoe protocol 2.0.0 identiteitsdoorgifte wijzigt.
Voorbeeld: opgeslagen gegevens per sessie partitioneren
Wanneer uw container gegevens bewaart die eigendom zijn van de gebruiker, moet u deze sleutel gebruiken door de sessie (en, voor gedeelde sessies, de gebruiker), zodat de ene beller de gegevens van een andere gebruiker niet kan lezen. Het voorbeeld van de notitieagent doet dit door een pad per sessiebestand onder $HOMEaf te leiden, waar bestanden ook bereikbaar zijn via de Sessiebestanden-API:
# 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")
Wanneer meerdere gebruikers een sessie kunnen delen, voegt u deze toe x-agent-user-id aan de sleutel. Zie Multiplex meerdere gebruikers in één gehoste agentsessie.
Aangepaste aanvraagheaders doorsturen naar uw container
In de vorige sectie worden headers beschreven die het platform injecteert. Afzonderlijk stuurt de gateway alleen een vaste set doorroepende aanvraagheaders door naar uw container. Elke aanroeperheader buiten die set wordt verwijderd bij de gateway voordat de aanvraag uw container bereikt, waardoor referenties en interne headers standaard buiten uw container blijven.
Als u uw eigen contextuele gegevens wilt doorgeven aan uw container, gebruikt u het voorvoegsel van de passthrough-clientheader. x-client- Het platform stuurt elke header die begint met x-client- ongewijzigd, zodat u waarden zoals een tenant-id of een functievlag kunt verzenden zonder de aanvraagbody te wijzigen en deze vervolgens in uw handler te lezen, net zoals elke andere aanvraagheader. De AgentServer SDK definieert dit voorvoegsel als PlatformHeaders.ClientHeaderPrefix; voor de volledige lijst met platformheaders raadpleegt u de naslaginformatie over de Azure AI Agent Server Core-bibliotheek.
De gateway stuurt deze aanroeperheaders door naar de eindpunten van het antwoord- en aanroepprotocol:
| Koptekst of voorvoegsel | Purpose |
|---|---|
x-client-* |
Elke aangepaste koptekst waarmee x-client-u het voorvoegsel gebruikt. Gebruik dit voorvoegsel om uw eigen contextuele waarden, zoals tenant, functievlagken of correlatietokens, door te geven aan uw container. |
accept, , accept-encodingaccept-language, content-type, , , content-lengthcontent-encoding |
Standaardteksten voor inhoudsonderhandeling en hoofdteksten die nodig zijn om de aanvraag te parseren. |
traceparent, , tracestatebaggage, x-ms-client-request-id, , x-request-id, request-id, correlation-contextrequest-contextms-cv |
Gedistribueerde tracering en correlatie-id's, zodat de logboeken van uw container een koppeling maken naar de oorspronkelijke aanvraag. |
user-agent |
Identificeert de aanroepende SDK of client voor diagnostische gegevens. |
De gateway stuurt nooit referentieheaders Authorizationzoals , of Host, Cookieen x-forwarded-*. Eventuele headers die niet overeenkomen met de acceptatielijst, worden verwijderd, dus vertrouw niet op aangepaste headers buiten het x-client-* voorvoegsel dat uw container bereikt.