Runtimecontract voor gehoste agent

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.