Déployer un agent hébergé

Cet article vous montre comment déployer un agent conteneurisé sur Foundry Agent Service à l’aide du KIT de développement logiciel (SDK) Python ou de l’API REST. Utilisez ces approches lorsque vous souhaitez gérer les déploiements d’agents directement à partir de vos propres applications ou services.

Si vous effectuez un déploiement pour la première fois ou souhaitez le chemin le plus rapide, utilisez le guide de démarrage rapide : Créer et déployer un agent hébergé à la place. Le démarrage rapide utilise Azure Developer CLI (azd) ou l’extension VS Code, qui gèrent automatiquement la génération, l’envoi, la gestion des versions et la configuration RBAC.

Cycle de vie du déploiement

Chaque déploiement d’agent hébergé suit cette séquence :

  1. Build et push : empaqueter votre code d’agent dans une image conteneur et l’envoyer à Azure Container Registry.
  2. Créer une version d’agent : enregistrer l’image auprès de Foundry Agent Service. La plateforme provisionne l’infrastructure et crée une identité d’agent Entra dédiée.
  3. Interroger l’état : attendre que l’état de la version atteigne active.
  4. Appel : envoyer des demandes au point de terminaison dédié de l’agent.

Conditions préalables

Autorisations requises

Vous avez besoin d'Azure AI Project Manager dans le cadre du projet pour créer et déployer des agents hébergés. Ce rôle inclut à la fois les autorisations de plan de données pour créer des agents et la possibilité d’attribuer le rôle Azure utilisateur IA au rôle d’agent créé par la plateforme. L’identité de l’agent a besoin de Azure AI User sur le projet pour accéder aux modèles et artefacts en temps d'exécution.

Si vous utilisez azd ou l’extension VS Code, les outils gèrent automatiquement la plupart des affectations RBAC, notamment :

  • Lecteur du référentiel de registre de conteneurs pour l’identité managée du projet (extractions d’images)
  • Utilisateur Azure AI pour l’identité d'agent créée par la plateforme (modèle d’exécution et accès aux outils)

Note

La plateforme crée une identité d’agent Entra dédiée pour chaque agent hébergé au moment du déploiement. Cette identité est un principal de service que votre conteneur en cours d’exécution utilise pour appeler des modèles et des outils. Vous n’avez pas besoin de configurer manuellement les identités managées. Toutefois, l’utilisateur qui crée l’agent doit avoir l’autorisation d’attribuer Azure utilisateur IA à cette identité, c’est pourquoi Azure AI Project Manager est recommandé sur Azure utilisateur IA seul.

Note

Bien que les extensions azd et VS Code gèrent automatiquement les affectations RBAC de base, des scénarios complexes peuvent nécessiter une configuration manuelle supplémentaire. Pour plus d’informations sur toutes les autorisations et attributions de rôles impliquées, consultez les informations de référence sur les autorisations de l’agent hébergé.

Pour plus d’informations, consultez Authentification et autorisation.

Important

La Azure Container Registry qui contient l'image conteneur de votre agent hébergé doit être accessible sur son point de terminaison public. Le fait de placer le registre derrière un réseau privé (point de terminaison privé avec accès au réseau public désactivé) n’est actuellement pas pris en charge pour les agents hébergés . La plateforme ne peut pas extraire l’image. Pour obtenir la liste complète des contraintes réseau, consultez Limitations.

Exigences pour les conteneurs

Votre image conteneur doit répondre aux exigences suivantes pour s’exécuter sur la plateforme d’agent hébergée.

Important

La plateforme d’hébergement nécessite des images conteneur x86_64 (linux/amd64). Si vous construisez sur Apple Silicon ou sur d’autres machines ARM, utilisez docker build --platform linux/amd64 . pour éviter de créer une image ARM incompatible.

Bibliothèques de protocole

Les agents hébergés communiquent avec la passerelle Foundry via des bibliothèques de protocole. Choisissez le protocole qui correspond au modèle d’interaction de votre agent :

Protocole bibliothèque Python bibliothèque .NET Point de terminaison Idéal pour
Réponses azure-ai-agentserver-responses Azure.AI.AgentServer.Responses /responses Chatbots conversationnels, en streaming, avec multiples échanges et historique géré par la plateforme
Invocations azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations Récepteurs webhook, traitement non conversationnel, flux de travail asynchrones personnalisés

Un conteneur unique peut exposer les deux protocoles simultanément en déclarant à la fois lorsque vous créez l’agent ( dans le agent.yaml fichier, l’appel du SDK ou la demande d’API REST) et en important les deux bibliothèques. Utilisez les bibliothèques de protocole dans votre infrastructure existante, que ce soit Microsoft Framework Agent, LangChain ou du code personnalisé.

Points de terminaison d’intégrité

Les bibliothèques de protocole exposent automatiquement un point de terminaison /readiness pour les vérifications d’intégrité de la plateforme. Vous n’avez pas besoin d’implémenter cela vous-même.

Port

Les conteneurs servent le trafic sur le port 8088 localement. En production, la passerelle Foundry gère le routage : votre conteneur n’a pas besoin d’exposer un port public.

Variables d’environnement injectées par la plateforme

La plateforme d’agent hébergé injecte automatiquement des variables d’environnement dans votre conteneur au moment de l’exécution. Votre code peut les lire sans les déclarer dans agent.yaml ou environment_variables. Le préfixe FOUNDRY_* est strictement réservé à l’usage de la plateforme.

Variable Objectif
FOUNDRY_PROJECT_ENDPOINT URL du point de terminaison de projet Foundry
FOUNDRY_PROJECT_ARM_ID ID de ressource ARM du projet Foundry
FOUNDRY_AGENT_NAME Nom de l’agent en cours d’exécution
FOUNDRY_AGENT_VERSION Version de l’agent en cours d’exécution
FOUNDRY_AGENT_SESSION_ID ID de session de la requête actuelle (conteneurs hébergés uniquement)
APPLICATIONINSIGHTS_CONNECTION_STRING Chaîne de connexion pour la télémétrie de Application Insights

Ne rééclarez pas les variables injectées par la plateforme . agent.yaml Elles sont définies automatiquement.

Les variables que vous déclarez vous-même, comme MODEL_DEPLOYMENT_NAME ou les points de terminaison MCP de l'outil de développement, se trouvent dans la section environment_variables de agent.yaml ou dans l'appel SDK create_version.

Empaqueter et tester votre agent localement

Avant de déployer sur Foundry, vérifiez que votre agent fonctionne localement à l’aide de la bibliothèque de protocole. Le conteneur sert les mêmes points de terminaison localement qu’en production.

Tester le protocole de Réponses

POST http://localhost:8088/responses
Content-Type: application/json

{
    "input": "Where is Seattle?",
    "stream": false
}

Tester le protocole Invocations

POST http://localhost:8088/invocations
Content-Type: application/json

{
    "message": "Hello!"
}

Déployez à l'aide de l'Azure Developer CLI ou de Visual Studio Code

L’interface CLI Azure développeur (azd) et l’extension VS Code automatisent le cycle de vie complet du déploiement. Pour obtenir une procédure pas à pas, consultez le guide de démarrage rapide : Créer et déployer un agent hébergé.

Déployer à l’aide du Kit de développement logiciel (SDK) Python

Utilisez le Kit de développement logiciel (SDK) lorsque vous souhaitez gérer les déploiements d’agents directement à partir de Python code.

Prérequis supplémentaires

Générer et pousser votre image de conteneur

  1. Générez votre image Docker :

    docker build --platform linux/amd64 -t myagent:v1 .
    

    Consultez des exemples de fichiers Dockerfiles pour Python et C#.

  2. Pousser vers Azure Container Registry :

    az acr login --name myregistry
    docker tag myagent:v1 myregistry.azurecr.io/myagent:v1
    docker push myregistry.azurecr.io/myagent:v1
    

Conseil

Utilisez des balises d’image uniques au lieu de :latest pour des déploiements reproductibles.

Configurer des autorisations de registre de conteneurs

Accordez l’accès à l’identité managée de votre projet pour extraire des images :

  1. Dans le portail Azure, accédez à votre ressource de projet Foundry.

  2. Sélectionnez Identité et copiez l’ID d’objet (principal) sous Système affecté.

  3. Attribuez le rôle Lecteur du référentiel du registre de conteneurs à cette identité sur votre registre de conteneurs. Consultez Azure Container Registry rôles et autorisations.

Créer une version de l’agent hébergé

La création d’une version déclenche la plateforme pour approvisionner l’agent automatiquement. Il n’existe aucune étape de démarrage distincte : la plateforme génère un instantané de conteneur et rend l’agent prêt à traiter les demandes.

from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import HostedAgentDefinition, ProtocolVersionRecord, AgentProtocol
from azure.identity import DefaultAzureCredential

# Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"

# Create project client
credential = DefaultAzureCredential()
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=credential,
    allow_preview=True,
)

# Create a hosted agent version
agent = project.agents.create_version(
    agent_name="my-agent",
    definition=HostedAgentDefinition(
        container_protocol_versions=[
            ProtocolVersionRecord(protocol=AgentProtocol.RESPONSES, version="1.0.0")
        ],
        cpu="1",
        memory="2Gi",
        image="your-registry.azurecr.io/your-image:tag",
        environment_variables={
            "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
        }
    )
)

print(f"Agent created: {agent.name}, version: {agent.version}")

Pour exposer les deux protocoles, passez les deux dans container_protocol_versions:

container_protocol_versions=[
    ProtocolVersionRecord(protocol=AgentProtocol.RESPONSES, version="1.0.0"),
    ProtocolVersionRecord(protocol=AgentProtocol.INVOCATIONS, version="1.0.0")
],

Paramètres clés :

Paramètre Description
agent_name Nom unique (alphanumérique avec traits d’union, 63 caractères maximum)
image URL complète de l’image Azure Container Registry avec étiquette
cpu Allocation du processeur (par exemple, "1")
memory Allocation de mémoire (par exemple, "2Gi")
container_protocol_versions Protocoles que le conteneur expose (responses, invocationsou les deux)

Interroger l’état de la version

Après la création d’une version, interrogez jusqu’à ce que son statut atteigne active avant de solliciter l’agent. L’approvisionnement prend généralement moins d’une minute en fonction de la taille de l’image.

import time

# Poll until the agent version is active
while True:
    version_info = project.agents.get_version(
        agent_name="my-agent",
        agent_version=agent.version
    )
    status = version_info["status"]
    print(f"Status: {status}")

    if status == "active":
        print("Agent is ready!")
        break
    elif status == "failed":
        print(f"Provisioning failed: {version_info['error']}")
        break

    time.sleep(5)

Valeurs d’état de version :

Statut Description
creating Approvisionnement d’infrastructure en cours
active L’agent est prêt à traiter les demandes
failed Échec de l’approvisionnement : vérifiez le error champ pour plus d’informations
deleting La version est en cours de nettoyage
deleted La version a été entièrement supprimée

Appeler l’agent

Une fois que la version atteint le statut active, utilisez get_openai_client pour créer un client OpenAI lié au point de terminaison de l’agent.

Pour le protocole Réponses :

# Create an OpenAI client bound to the agent endpoint
openai_client = project.get_openai_client(agent_name="my-agent")

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

print(response.output_text)

Pour le protocole Invocations , appelez directement le point de terminaison d’appel :

import requests

token = credential.get_token("https://ai.azure.com/.default").token
url = f"{PROJECT_ENDPOINT}/agents/my-agent/endpoint/protocols/invocations"

response = requests.post(url, headers={
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json",
    "Foundry-Features": "HostedAgents=V1Preview"
}, params={"api-version": "v1"}, json={
    "message": "Process this task"
})

print(response.json())

Pour obtenir des exemples plus complets, consultez les exemples d’agents hébergés.

Déployer à l’aide de l’API REST

Utilisez l’API REST pour les déploiements basés sur HTTP directs ou lors de l’intégration à des outils personnalisés.

Avant de commencer, générez et envoyez (push) votre image conteneur et configurez les autorisations de registre de conteneurs.

Configurer des variables

BASE_URL="https://{account}.services.ai.azure.com/api/projects/{project}"
API_VERSION="v1"
TOKEN=$(az account get-access-token --resource https://ai.azure.com --query accessToken -o tsv)

Créer un agent

curl -X POST "$BASE_URL/agents?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-agent",
    "definition": {
      "kind": "hosted",
      "image": "myacr.azurecr.io/my-agent:v1",
      "cpu": "1",
      "memory": "2Gi",
      "container_protocol_versions": [
        {"protocol": "responses", "version": "1.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

La création d’un agent crée également une version 1 et déclenche l’approvisionnement.

Interroger l’état de la version

Interrogez le point de terminaison de version jusqu'à ce que status soit active :

while true; do
  STATUS=$(curl -s -X GET "$BASE_URL/agents/my-agent/versions/1?api-version=$API_VERSION" \
    -H "Authorization: Bearer $TOKEN" | jq -r '.status')
  echo "Status: $STATUS"
  [ "$STATUS" = "active" ] && echo "Ready!" && break
  [ "$STATUS" = "failed" ] && echo "Provisioning failed." && exit 1
  sleep 5
done

Appeler l’agent

Utilisez le point de terminaison dédié de l’agent pour envoyer des demandes. Définir "stream": true pour recevoir les événements envoyés par le serveur.

Protocole réponses :

curl -X POST "$BASE_URL/agents/my-agent/endpoint/protocols/openai/responses?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Hello! What can you do?",
    "store": true
  }'

Protocole d’appel :

curl -X POST "$BASE_URL/agents/my-agent/endpoint/protocols/invocations?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Foundry-Features: HostedAgents=V1Preview" \
  -d '{
    "message": "Process this task"
  }'

Créer une nouvelle version

Déployez le code ou la configuration mis à jour en créant une nouvelle version :

curl -X POST "$BASE_URL/agents/my-agent/versions?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "definition": {
      "kind": "hosted",
      "image": "myacr.azurecr.io/my-agent:v2",
      "cpu": "1",
      "memory": "2Gi",
      "container_protocol_versions": [
        {"protocol": "responses", "version": "1.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

Nettoyer les ressources

Pour éviter les frais, nettoyez les ressources une fois terminées. Les ressources de calcul de l’agent sont désactivées après 15 minutes d’inactivité, donc il n’y a aucun coût lorsqu’un agent ne traite pas de requêtes.

Nettoyage de l’Azure Developer CLI

azd down

Nettoyage du Kit de développement logiciel (SDK

Supprimez une seule version :

project.agents.delete_version(agent_name="my-agent", agent_version=agent.version)

Ou supprimez l’ensemble de l’agent et toutes ses versions :

project.agents.delete(agent_name="my-agent")

Nettoyage de l’API REST

Supprimez une seule version :

curl -X DELETE "$BASE_URL/agents/my-agent/versions/1?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN"

Ou supprimez l’agent entier :

curl -X DELETE "$BASE_URL/agents/my-agent?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN"

Avertissement

La suppression d’un agent supprime toutes ses versions et met fin à des sessions actives. Cette action ne peut pas être annulée.

Dépannage

Les erreurs d’approvisionnement s’affichent sur les champs error.code et error.message de l’objet de version. Vérifiez l’état de la version après la création pour identifier les problèmes.

Code d’erreur Code HTTP Solution
image_pull_failed 400 Vérifiez que l’URI de l’image est correct et que l’identité managée du projet dispose du rôle Container Registry Repository Reader sur l’ACR
SubscriptionIsNotRegistered 400 Inscrire le fournisseur d’abonnement
InvalidAcrPullCredentials 401 Corriger l’identité managée ou le RBAC du registre
UnauthorizedAcrPull 403 Fournir des informations d’identification ou une identité correctes
AcrImageNotFound 404 Corriger le nom/la balise d'image ou publier l'image
RegistryNotFound 400/404 Corriger les enregistrements DNS ou l'accessibilité du réseau

Pour les erreurs 5xx, contactez Microsoft support technique.

Pour connaître les exigences RBAC détaillées et la résolution des problèmes d’autorisation, consultez les informations de référence sur les autorisations de l’agent hébergé.

Étapes suivantes