Een gehoste agent implementeren vanuit broncode

In dit artikel wordt uitgelegd hoe u een Hosted-agent in Foundry Agent Service uitrolt vanuit Python- of .NET-broncode, zonder een containerimage te bouwen of te uploaden. U uploadt een .zip van uw code (en eventueel uw afhankelijkheden) en agentservice voert deze uit as-is of bouwt uw afhankelijkheden voor u in de cloud.

Tip

Implementeer voor de meeste scenario's met de Azure Developer CLI (azd) of de Foundry Toolkit for VS Code. Deze hulpprogramma's doen het zware werk voor u: ze verpakken uw bron, uploaden, peilen naar activeen configureren op rollen gebaseerd toegangsbeheer automatisch. Volg de quickstart om aan de slag te gaan : Implementeer uw eerste gehoste agent en kies Code (of Broncode (ZIP Upload)) wanneer u wordt gevraagd om een implementatiemethode.

Gebruik de SDK- en REST-procedures in dit artikel wanneer u broncodeagents programmatisch moet implementeren, van de Python SDK of .NET SDK in uw eigen toepassingen, of rechtstreeks via de REST API voor aangepaste hulpprogramma's, taalagnostische automatisering of integratie met bestaande systemen voor continue levering. In dit artikel voert u de volgende taken uit:

  • Kies een modus voor afhankelijkheidsoplossing en pak uw bron in.
  • Maak de agent, wacht tot hij active bereikt en roep hem aan.
  • Logboeken voor updates, versies, downloads en streams van de geïmplementeerde agent.

Als u volledige controle over de runtime-installatiekopie nodig hebt of als u al een werkende Dockerfile hebt, gebruikt u het pad op basis van de container: Een gehoste agent implementeren.

Als u een coderingsagent zoals GitHub Copilot gebruikt om broncode te verpakken en te implementeren, kan de Microsoft Foundry Skill u helpen uw project voor te bereiden en de vereisteazd, SDK of REST-stappen te volgen.

Prerequisites

  • pip van Python 3.13 of hoger om uw bron lokaal te verpakken.

  • De azure-ai-projects versie 2.2.0 of hoger en azure-identity pakketten.

    pip install "azure-ai-projects>=2.2.0" azure-identity
    

Ondersteunde runtimes

Het code_configuration.runtime veld in de agentdefinitie accepteert de volgende waarden. Kies de runtime die overeenkomt met de binaire bestanden in uw zip- Linux-x86_64 wielen voor Python of de TargetFramework van uw dotnet publish-uitvoer voor .NET.

Taal Runtime-waarden
Python python_3_13, python_3_14
.NET dotnet_10

Ondersteuningsbeleid voor taalversies

De runtime van de Agent Service bevat de door het platform gegenereerde containerimage voor elke waarde van code_configuration.runtime. Om ervoor te zorgen dat uw geïmplementeerde agents volledig ondersteund blijven, stemt Foundry de taalondersteuning voor gehoste agents af op de ondersteuning tot het einde van de levensduur van elke taal. De ondersteuning eindigt op de einddatum van de ondersteuning van de community voor de taalversie. Microsoft kan een code_configuration.runtime-waarde eerder buiten gebruik stellen wanneer platformbeperkingen (zoals de onderliggende basisinstallatiekopieën) dit vereisen.

Zie voor upstream-schema's voor einde van ondersteuning:

Uitfaseringsfase

Na een einddatum van de taal kunt u nog steeds gehoste agents maken, bijwerken en uitvoeren die gebruikmaken van de buiten gebruik gestelde runtimewaarde. Deze agents komen echter pas in aanmerking voor ondersteuning, nieuwe functies of beveiligingspatches als u ze bijwerkt naar een ondersteunde runtime door een huidige code_configuration.runtime waarde in te stellen en opnieuw te implementeren.

Vereiste toestemmingen

U hebt de rol Foundry Project Manager nodig op projectniveau om een gehoste agent te implementeren. Deze rol verleent machtigingen voor het gegevensvlak om agenten te maken en bij te werken, en indien nodig de mogelijkheid om roltoewijzingen te maken voor de agentidentiteit die door het platform is gemaakt. Zie Naslaginformatie over machtigingen voor gehoste agents voor een gedetailleerd overzicht van de betrokken machtigingen.

Important

De rollen Foundry RBAC zijn onlangs hernoemd. Foundry User, Foundry Owner, Foundry Account Owner en Foundry Project Manager zijn eerder benoemd Azure AI-gebruiker, Azure AI-eigenaar Azure AI-accounteigenaar en Azure AI Project Manager. Het kan zijn dat u op sommige plekken nog steeds de vorige namen ziet terwijl de naamswijziging wordt doorgevoerd. De rol-id's en basismachtigingen worden niet gewijzigd door de naamswijziging.

Uw agent wordt uitgevoerd als een door het platform toegewezen beheerde identiteit die losstaat van uw gebruikersidentiteit. Deze identiteit heeft standaard toegang tot modeldeductie via het projecteindpunt en de sessieopslag. Wijs voor externe resources (bijvoorbeeld uw eigen Azure Storage) RBAC-rollen handmatig toe aan de Microsoft Entra ID van de agent. Zie Agent-toegang buiten de standaardinstellingen voor meer informatie.

Levenscyclus van implementatie

Elke broncode-implementatie volgt dezelfde volgorde: pakket -> maken of bijwerken -> poll tot active -> aanroepen. Het broncodepad gebruikt code_configuration in de agentdefinitie. Het pad op basis van afbeeldingen gebruikt container_configuration in plaats daarvan. Deze twee opties sluiten elkaar wederzijds uit voor één versie.

Kies het pad dat past bij uw werkstroom. Als u het niet zeker weet, begint u met de Azure Developer CLI of VS Code. Dit is het aanbevolen pad voor de meeste klanten.

Path Ideaal voor Verpakking
Azure Developer CLI of VS Code De meeste implementaties, inclusief eerste implementaties en de snelste binnenste lus. De tooling bouwt en uploadt het zipbestand voor u.
Python SDK Programmatisch implementeren met Python-apps of automatisering. Je bouwt de zip; de SDK uploadt deze.
.NET SDK Programmatisch uitrollen vanuit .NET-apps of via automatisering. De SDK comprimeert een map voor u.
JavaScript/TypeScript SDK Programmatische implementatie vanuit Node.js apps of automatisering. Implementeert Python of .NET bron; er is geen Node.js gehoste runtime. Je bouwt de zip; de SDK uploadt deze.
REST API Aangepaste hulpprogramma's, taalonafhankelijke automatisering en CD-systemen. U bouwt het zip-bestand en verzendt de aanvraag met meerdere onderdelen.

Kies hoe afhankelijkheden worden opgelost

Voordat u begint, kiest u een waarde voor code_configuration.dependency_resolution. Deze keuze is van invloed op wat u in de zip plaatst.

Waarde Gedrag Wanneer gebruiken
remote_build Agent Service installeert afhankelijkheden van requirements.txt (Python) of herstelt het projectbestand (.NET) tijdens het inrichten. Je wilt een kleine upload en de eenvoudigste inner loop. Aanbevolen voor gebruikers die dit voor het eerst gebruiken.
bundled Het zip-bestand wordt uitgevoerd zoals het is. U verzendt vooraf gemaakte Linux-afhankelijkheden in packages/ (Python) of dotnet publish-uitvoer (.NET). U hebt reproduceerbare builds nodig, uw afhankelijkheden zijn privé of uitsluitend wheels, of uw project kan aan serverzijde niet probleemloos worden hersteld.

Zie voor de gebundelde modus De zip handmatig verpakken voor de lokale build-opdrachten.

Firewallvereisten voor particuliere virtuele netwerken

Als u uw project beveiligt met een particulier virtueel netwerk, werkt u uw netwerkbeleid bij om uitgaande verbindingen met de volgende eindpunten toe te staan voordat u implementeert.

Alle broncode-implementaties vereisen uitgaande toegang tot:

  • mcr.microsoft.com
  • *.login.microsoft.com

Zie Een gehoste agent implementeren in een virtueel netwerk voor netwerkconfiguratie.

Implementeren met behulp van de Azure Developer CLI of VS Code

De Azure Developer CLI (azd) en de Foundry Toolkit voor VS Code automatiseren de volledige levenscyclus van de broncode-implementatie. Ze verpakken uw bron in een zip, berekenen de SHA-256, uploaden, peilen naar active en configureren op rollen gebaseerd toegangsbeheer voor u. Deze tools zijn voor de meeste klanten de aanbevolen keuze en bieden de snelste iteratiecyclus.

Zie de quickstart: Uw eerste gehoste agent implementeren voor stapsgewijze instructies. Kies Code (of Broncode (ZIP-upload)) wanneer de quickstart vraagt om een implementatiemethode.

Broncode-implementatie selecteren

Wanneer u azd ai agent init interactief uitvoert, vraagt het hulpprogramma u om een implementatiemodus te kiezen. Kies code om vanuit de broncode te implementeren via een ZIP-upload in plaats van een containerimage te bouwen. Code-implementatie is de standaardmodus voor Python en .NET gehoste agents. De Foundry Toolkit voor VS Code vraagt u op dezelfde manier om de implementatiemethode.

Als u de implementatie van broncode niet interactief wilt selecteren, bijvoorbeeld in een CI/CD-pijplijn, geeft u door --deploy-mode code. Voor deze modus zijn --runtime en --entry-point vereist, en wordt een optionele --dep-resolution-waarde van remote_build (standaard) of bundled geaccepteerd:

azd ai agent init --no-prompt --project-id "<project-resource-id>" \
  --deploy-mode code --runtime python_3_13 --entry-point main.py

Na de initialisatie azd schrijft u de instellingen voor de broncode-implementatie naar het codeConfiguration veld in de azure.ai.agent service in azure.yaml:

services:
  my-agent:
    host: azure.ai.agent
    project: src/my-agent
    kind: hosted
    codeConfiguration:
      runtime: python_3_13
      entryPoint:
        - python
        - main.py
      dependencyResolution: remote_build

Uitvoeren azd up om te provisioneren en te implementeren. Gebruik --deploy-mode container alleen als u in plaats daarvan een containerimage wilt opbouwen of ernaar wilt verwijzen.

Gebruik de SDK- of REST-paden in de volgende secties wanneer u programmatisch moet implementeren vanuit uw eigen toepassing of moet integreren met bestaande hulpprogramma's.

Implementeren vanuit broncode

Selecteer uw taal of interface. Elk tabblad doorloopt dezelfde levenscyclus: maak de agent, peiling totdat deze is bereikt active, roep deze aan en download de geïmplementeerde code.

Gebruik de Python SDK om broncodeagents te implementeren vanuit uw eigen toepassingen of automatisering. U bouwt de zip zelf en geeft de bytes en SHA-256 door aan de SDK, die deze uploadt en dezelfde bewerkingen voor maken, peilen, aanroepen en downloaden beschikbaar maakt als de REST API. Voor code-implementatie is versie 2.2.0 of hoger vereist azure-ai-projects .

De zip bouwen

De Python SDK uploadt een zip-bestand dat u bouwt. Gebruik dezelfde regels voor lay-out en afhankelijkheidsoplossing die worden beschreven in Het zip-bestand handmatig verpakken. Het minimale remote_build pakket is een platte zip met main.py en requirements.txt in de hoofdmap.

De agent maken

import hashlib
from pathlib import Path

from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    CodeConfiguration,
    HostedAgentDefinition,
    ProtocolVersionRecord,
)
from azure.identity import DefaultAzureCredential

# Format: "https://<account>.services.ai.azure.com/api/projects/<project>"
PROJECT_ENDPOINT = "your_project_endpoint"
AGENT_NAME = "my-code-agent"
ZIP_PATH = Path("agent-code.zip")

code_zip_bytes = ZIP_PATH.read_bytes()
code_zip_sha256 = hashlib.sha256(code_zip_bytes).hexdigest()

credential = DefaultAzureCredential()
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=credential,
)

created = project.agents.create_version_from_code(
    agent_name=AGENT_NAME,
    definition=HostedAgentDefinition(
        cpu="1",
        memory="2Gi",
        code_configuration=CodeConfiguration(
            runtime="python_3_13",
            entry_point=["python", "main.py"],
            dependency_resolution="remote_build",
        ),
        protocol_versions=[
            ProtocolVersionRecord(protocol="responses", version="1.0.0")
        ],
        environment_variables={"AZURE_AI_MODEL_DEPLOYMENT_NAME": "gpt-5.4-mini"},
    ),
    code=(ZIP_PATH.name, code_zip_bytes, "application/zip"),
    code_zip_sha256=code_zip_sha256,
    description="Hello-world code agent",
)
print(f"Created version: {created.version}")

Stel voor het protocol Aanroepen de protocol_versions vermelding in op ProtocolVersionRecord(protocol="invocations", version="1.0.0"). Gebruik ProtocolVersionRecord(protocol="invocations_ws", version="1.0.0") voor het protocol Invocations (WebSocket). Voor modus bundled, stelt u dependency_resolution="bundled" in en levert u vooraf gebouwde afhankelijkheden mee in het zipbestand. Zie Linux-afhankelijkheden lokaal bouwen voor meer informatie.

Poll voor actief

import time

while True:
    version = project.agents.get_version(
        agent_name=AGENT_NAME, agent_version=created.version
    )
    status = version["status"]
    print(f"Status: {status}")
    if status == "active":
        break
    if status == "failed":
        raise RuntimeError(f"Provisioning failed: {version.get('error')}")
    time.sleep(5)

Zie Poll for active voor de volledige lijst met statuswaarden en hoe u het object error kunt uitlezen bij een fout.

De agent aanroepen

Nadat de versie active heeft bereikt, koppelt u een OpenAI-client aan het agent-eindpunt en roept u het aan. In dit voorbeeld wordt het protocol Antwoorden gebruikt:

openai_client = project.get_openai_client(agent_name=AGENT_NAME)

response = openai_client.responses.create(input="Hello! What can you do?")
print(response.output_text)

Voor het Invocations-protocol roept u het invoke-eindpunt rechtstreeks aan met een bearertoken, zoals getoond in De agent aanroepen.

De geïmplementeerde zip downloaden

Controleer precies wat er is geïmplementeerd door het zip-bestand te downloaden en de SHA-256 te vergelijken met de waarde die u hebt geüpload:

import hashlib
from pathlib import Path

out_path = Path(f"{AGENT_NAME}-{created.version}.zip")
sha = hashlib.sha256()
with open(out_path, "wb") as f:
    for chunk in project.agents.download_code(
        agent_name=AGENT_NAME, agent_version=created.version
    ):
        f.write(chunk)
        sha.update(chunk)

print(f"Downloaded {out_path} (matches upload: {sha.hexdigest() == code_zip_sha256})")

Zie de Python voorbeelden van gehoste agents voor een volledig voorbeeld dat kan worden uitgevoerd.

Pak de zip handmatig in

Als u azd gebruikt, sla deze sectie over—azd maakt het zipbestand voor u. Lees het als u de REST API gebruikt, als u overschakelt naar gebundelde afhankelijkheidsresolutie of als u volledige controle over de uploadinhoud nodig hebt.

Het ZIP-bestand moet rechtstreeks in de hoofdmap staan—geen bovenliggende map op het hoogste niveau.

Selecteer het tabblad voor de taal van uw agent.

Python-opmaak (buildmodus op afstand)

De service installeert afhankelijkheden in de cloud van requirements.txt.

agent-code.zip
+-- main.py
+-- requirements.txt

Python-lay-out (gebundelde modus)

U verzendt vooraf gemaakte Linux-afhankelijkheden in packages/.

agent-code.zip
+-- main.py                    # entry point
+-- requirements.txt
+-- packages/                  # extracted modules (not raw .whl files)
    +-- azure/identity/__init__.py
    +-- requests/__init__.py

Lokale Linux-afhankelijkheden bouwen (gebundeld, Python)

Gebruik de manylinux2014_x86_64 platformtag, zodat pip Linux-wielen downloadt, zelfs vanuit Windows of macOS.

Bash

pip install -r requirements.txt \
    --target packages/ \
    --platform manylinux2014_x86_64 \
    --python-version 3.13 \
    --implementation cp \
    --only-binary=:all:

zip -r agent-code.zip main.py requirements.txt packages/

PowerShell/Windows cmd

pip install -r requirements.txt --target packages --platform manylinux2014_x86_64 --python-version 3.13 --implementation cp --only-binary=:all:

tar -a -c -f agent-code.zip main.py requirements.txt packages

--only-binary=:all: dwingt wielen (geen bron builds). De --python-version waarde moet overeenkomen met de runtime waarde in de agentdefinitie.

Waarschuwing

Veelvoorkomende verpakkingsfouten die session_creation_failed of ModuleNotFoundError veroorzaken:

  • De bron in een map verpakken (my-agent/main.py in plaats van main.py in de hoofdmap).
  • Opnemen van ruwe .whl-bestanden in packages/ in plaats van geëxtraheerde modules.
  • Binaire Windows bestanden (.pyd, .dll) bundelen voor een Linux-runtime.

Limits

Limit Waarde
Maximale zipgrootte (uploaden met meerdere onderdelen) 250 MB

Zie cpu voor de ondersteunde memory en combinaties.

Troubleshooting

Symptoom Waarschijnlijke oorzaak Oplossen
401 Unauthorized Token ontbreekt of heeft een verkeerde scope Een token verkrijgen met --resource https://ai.azure.com.
403 Forbidden De aanroeper heeft geen rolgebaseerde toegangscontrole voor het project Verleen Foundry Agent Consumer (uitsluitend om aan te roepen) of Foundry User (om ook te ontwikkelen) op projectniveau.
409 conflict bij Maken (Agent '<name>' already exists) Agentnaam bestaat al Gebruik Update (POST /agents/{name}) of kies een nieuwe naam.
400 bad_request (CPU and Memory must be specified as a valid resource tier) bij aanmaken of bijwerken cpu / memory zijn geen van de ondersteunde lagen Stel cpu en memory in op een geldig paar uit Sandboxgrootten.
400 bad_request (Agent version is still being provisioned) bij het aanroepen Een nieuwe versie wordt momenteel uitgerold en de actieve versie wordt vervangen Peil de versie status tot activeen probeer het opnieuw.
424 session_not_ready bij oproepen Container is gestart, maar /readiness heeft HTTP 200 niet geretourneerd binnen de time-out Stream logboeken met :logstream, corrigeer de gereedheidstest of opstartfout, implementeer opnieuw.
409 conflict bij DELETE-agent (Agent has active sessions) Open sessies blokkeren verwijdering Wacht tot sessies inactief worden, of voeg &force=true toe om sessies trapsgewijs te verwijderen.
Versie blijft hangen in creating (>10 min, build op afstand) Serverbuild is mislukt of kon requirements.txt niet oplossen Schakel over naar dependency_resolution: bundled en bouw lokaal vooraf.
Implementatie mislukt in een particulier virtueel netwerk Vereiste uitgaande eindpunten worden geblokkeerd door de firewall Sta de eindpunten toe in firewallvereisten voor particuliere virtuele netwerken en implementeer vervolgens opnieuw.
Versieovergangen naar failed Ongeldige zip-indeling, syntaxisfout of (remote_build) een herstel-/compileerfout Lees eerst het error-object van de versie: error.code classificeert de fout en error.message bevat de onderliggende herstel- of compileerfoutregel (pip voor Python, NuGet voor .NET) plus een koppeling voor probleemoplossing. Controleer de mapstructuur. Gebruik :logstream pas nadat de container is gestart.
ModuleNotFoundError tijdens de uitvoering packages/ ontbreekt, bevat onbewerkte .whl bestanden of bevat Windows binaire bestanden Herbouwen met pip install --target packages/ --platform manylinux2014_x86_64 --only-binary=:all:.
409 AgentNotCodeBased bij het downloaden Agent is imagegebaseerd Gebruik het document voor implementatie op basis van containers.

De hulpbronnen opschonen

Als u het project op basis van de Quickstart hebt gegenereerd met azd, voer dan azd down uit vanuit de hoofdmap van het project om de volledige ingerichte omgeving te verwijderen.

Als u een agent wilt verwijderen die u hebt geïmplementeerd met de SDK of REST API, gebruikt u het overeenkomende pad hieronder.

# Delete one version
project.agents.delete_version(agent_name=AGENT_NAME, agent_version=created.version)

# Delete the agent and all its versions
project.agents.delete(agent_name=AGENT_NAME)

Waarschuwing

Als u een agent verwijdert, worden alle versies ervan verwijderd en worden actieve sessies beëindigd. Deze actie kan niet ongedaan worden gemaakt.

Volgende stappen