Implementación de un agente hospedado

En este artículo se muestra cómo implementar un agente en contenedor en el servicio Foundry Agent mediante el SDK de Python o la API REST. Use estos enfoques cuando desee administrar implementaciones de agente directamente desde sus propias aplicaciones o servicios.

Si va a implementar por primera vez o desea la ruta de acceso más rápida, use el inicio rápido: Creación e implementación de un agente hospedado en su lugar. En el inicio rápido se utiliza la CLI de Azure para Desarrolladores (azd) o la extensión de VS Code, que gestionan automáticamente la compilación, el empuje, el control de versiones y la configuración de RBAC.

Ciclo de vida de la implementación

Cada implementación del agente hospedado sigue esta secuencia:

  1. Build and push: empaquete el código del agente en una imagen de contenedor e insértelo en Azure Container Registry.
  2. Crear una versión del agente — Registre la imagen con Foundry Agent Service. La plataforma aprovisiona la infraestructura y crea una identidad dedicada del agente Entra.
  3. Sondear el estado — esperar a que el estado de la versión alcance active.
  4. Invoke: envíe solicitudes al punto de conexión dedicado del agente.

Requisitos previos

Permisos necesarios

Usted necesita Azure AI Project Manager en el alcance del proyecto para crear y desplegar agentes hospedados. Este rol incluye los permisos del plano de datos para crear agentes y la capacidad de asignar el rol Azure usuario de IA a la identidad del agente creada por la plataforma. La identidad del agente necesita Usuario de Azure AI en el proyecto para acceder a los modelos y artefactos en tiempo de ejecución.

Si usa azd o la extensión de VS Code, las herramientas controlan la mayoría de las asignaciones de RBAC automáticamente, entre las que se incluyen:

  • Lector del repositorio de Container Registry para la identidad administrada del proyecto (extracción de imágenes)
  • Azure AI User para la identidad de agente creada por la plataforma (acceso a modelo de tiempo de ejecución y herramientas)

Nota

La plataforma crea una identidad de agente Entra dedicada para cada agente hospedado en el momento de la implementación. Esta identidad es un principal de servicio que utiliza el contenedor en ejecución para llamar a modelos y herramientas. No es necesario configurar las identidades administradas manualmente. Sin embargo, el usuario que crea el agente debe tener permiso para asignar Usuario de Azure AI a esa identidad, por lo que se recomienda Azure AI Project Manager en lugar de Usuario de Azure AI solo.

Nota

Aunque las extensiones azd y VS Code controlan automáticamente las asignaciones básicas de RBAC, los escenarios complejos pueden requerir una configuración manual adicional. Para obtener detalles completos sobre todos los permisos y asignaciones de roles implicados, consulte Referencia de permisos del agente hospedado.

Para obtener más información, consulte Autenticación y autorización.

Importante

El Azure Container Registry que contiene la imagen de contenedor del agente hospedado debe ser accesible actualmente a través de su punto de conexión público. La colocación del registro detrás de una red privada (punto de conexión privado con acceso a la red pública deshabilitado) no se admite actualmente para agentes alojados, ya que la plataforma no puede extraer la imagen. Para obtener la lista completa de restricciones de red, consulte Limitaciones.

Requisitos de contenedor

La imagen de contenedor debe cumplir los siguientes requisitos para ejecutarse en la plataforma del agente hospedado.

Importante

La plataforma de hospedaje requiere imágenes de contenedor x86_64 (linux/amd64). Si utiliza Apple Silicon u otras máquinas basadas en ARM, use docker build --platform linux/amd64 . para evitar producir una imagen incompatible de ARM.

Bibliotecas de protocolos

Los agentes hospedados se comunican con la puerta de enlace de Foundry a través de bibliotecas de protocolos. Elija el protocolo que coincida con el patrón de interacción del agente:

Protocolo biblioteca de Python biblioteca de .NET Punto de conexión Ideal para
Respuestas azure-ai-agentserver-responses Azure.AI.AgentServer.Responses /responses Bots de chat conversacionales, streaming, multiturno con historial administrado por la plataforma
Invocaciones azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations Receptores de webhook, procesamiento no conversacional, flujos de trabajo asincrónicos personalizados

Un único contenedor puede exponer ambos protocolos simultáneamente declarando ambos al crear el agente ( en el agent.yaml archivo, la llamada del SDK o la solicitud de API REST) e importando ambas bibliotecas. Utilice las bibliotecas de protocolos en su marco existente, ya sea que se trate de Microsoft Agent Framework, LangChain o código personalizado.

Puntos finales de salud

Las bibliotecas de protocolo exponen automáticamente un /readiness punto de conexión para las comprobaciones de estado de la plataforma. No es necesario implementar esto usted mismo.

Puerto

Los contenedores atienden el tráfico en el puerto 8088 localmente. En un entorno de producción, el gateway de Foundry controla el enrutamiento; el contenedor no necesita exponer un puerto público.

Variables de entorno insertadas en la plataforma

La plataforma del agente hospedado inserta automáticamente variables de entorno en el contenedor en tiempo de ejecución. El código puede leerlos sin declararlos en agent.yaml o environment_variables. El FOUNDRY_* prefijo está reservado para uso de plataforma.

Variable Propósito
FOUNDRY_PROJECT_ENDPOINT Dirección URL del punto de conexión del proyecto de Foundry
FOUNDRY_PROJECT_ARM_ID ID de recurso ARM del proyecto de fundición
FOUNDRY_AGENT_NAME Nombre del agente en ejecución
FOUNDRY_AGENT_VERSION Versión del agente en ejecución
FOUNDRY_AGENT_SESSION_ID Identificador de sesión de la solicitud actual (solo contenedores hospedados)
APPLICATIONINSIGHTS_CONNECTION_STRING Cadena de conexión para Application Insights para telemetría

No vuelva a declarar las variables insertadas en la plataforma; agent.yaml se establecen automáticamente.

Las variables que declaras tú mismo, como MODEL_DEPLOYMENT_NAME o los puntos de conexión MCP del cuadro de herramientas, van en la sección environment_variables de agent.yaml o en la llamada del SDK create_version.

Empaquetar y probar el agente localmente

Antes de realizar la implementación en Foundry, valide que el agente funciona localmente mediante la biblioteca de protocolos. El contenedor provee los mismos puntos de conexión en local que en producción.

Probar el protocolo de respuestas

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

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

Probar el protocolo de invocaciones

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

{
    "message": "Hello!"
}

Implementación mediante la CLI para desarrolladores de Azure o VS Code

La CLI de Azure Developer (azd) y la extensión de VS Code automatizan el ciclo de vida completo de la implementación. Para ver un tutorial paso a paso, consulte inicio rápido: Creación e implementación de un agente hospedado.

Implementación mediante el SDK de Python

Use el SDK cuando quiera administrar implementaciones de agente directamente desde Python código.

Requisitos previos adicionales

  • Python 3.10 o posterior

  • Imagen de contenedor en Azure Container Registry

  • Escritor de repositorios de Container Registry o rol AcrPush en el registro de contenedor (para insertar imágenes)

  • Azure SDK de proyectos de IA versión 2.1.0 o posterior

    pip install "azure-ai-projects>=2.1.0"
    

Compilación e inserción de la imagen de contenedor

  1. Compile la imagen de Docker:

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

    Consulte dockerfiles de ejemplo para Python y C#.

  2. Empujar al Registro de Contenedores de Azure

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

Propina

Use etiquetas de imagen únicas en lugar de :latest para implementaciones reproducibles.

Configuración de permisos de registro de contenedor

Conceda a la identidad administrada del proyecto acceso para obtener imágenes.

  1. En el portal Azure, vaya al recurso del proyecto Foundry.

  2. Seleccione Identidad y copie el identificador de objeto (principal) en Asignado por el sistema.

  3. Asigne el rol Lector del repositorio de Container Registry a esta identidad en el registro de contenedor. Consulte roles y permisos de Azure Container Registry.

Creación de una versión del agente hospedado

La creación de una versión desencadena la plataforma para aprovisionar el agente automáticamente. No hay ningún paso de inicio independiente: la plataforma compila una instantánea de contenedor y hace que el agente esté listo para atender solicitudes.

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}")

Para exponer ambos protocolos, pase ambos en container_protocol_versions:

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

Parámetros clave:

Parámetro Descripción
agent_name Nombre único (alfanumérico con guiones, máximo de 63 caracteres)
image Dirección URL completa de imagen del Azure Container Registry con etiqueta
cpu Asignación de CPU (por ejemplo, "1")
memory Asignación de memoria (por ejemplo, "2Gi")
container_protocol_versions Protocolos que expone el contenedor (responses, invocationso ambos)

Consultar el estado de la versión

Después de crear una versión, sondee hasta que el estado sea active antes de invocar al agente. El aprovisionamiento suele tardar menos de un minuto en función del tamaño de la imagen.

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)

Valores de estado de versión:

Estado Descripción
creating Aprovisionamiento de infraestructura en curso
active El agente está listo para atender solicitudes
failed Error de aprovisionamiento: compruebe el error campo para obtener más información.
deleting La versión se está depurando
deleted La versión se ha eliminado por completo

Invoca al agente

Una vez que la versión alcance el estado active, utilice get_openai_client para crear un cliente de OpenAI vinculado al punto de conexión del agente.

Para el protocolo Respuestas:

# 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)

Para el protocolo de invocaciones, llame directamente al endpoint de invocaciones:

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())

Para obtener ejemplos más completos, consulte los ejemplos del agente hospedado.

Implementación mediante la API REST

Use la API REST para implementaciones directas basadas en HTTP o cuando se integre con herramientas personalizadas.

Antes de empezar, compile e inserte la imagen de contenedor y configure los permisos del registro de contenedor.

Configurar 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)

Creación de un agente

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 creación de un agente también crea la versión 1 y desencadena el aprovisionamiento.

Consultar el estado de la versión

Sondee el punto de conexión de versión hasta que status sea 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

Invoca al agente

Use el punto de conexión dedicado del agente para enviar solicitudes. Configura "stream": true para recibir eventos enviados por el servidor.

Protocolo de respuestas:

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
  }'

Protocolo de invocaciones:

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"
  }'

Creación de una nueva versión

Implemente el código o la configuración actualizados mediante la creación de una nueva versión:

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"
      }
    }
  }'

Limpieza de recursos

Para evitar cargos, limpie los recursos cuando termine. El cómputo del agente se desaprovisiona después de 15 minutos de inactividad, por lo que no hay ningún costo cuando un agente no está sirviendo solicitudes.

limpieza de la CLI para desarrolladores de Azure

azd down

Limpieza del SDK

Elimine una sola versión:

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

O elimine todo el agente y todas sus versiones:

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

Limpieza de la API REST

Elimine una sola versión:

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

O elimine todo el agente:

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

Advertencia

Al eliminar un agente, se quitan todas sus versiones y se finalizan las sesiones activas. Esta acción no se puede deshacer.

Solución de problemas

Los errores de aprovisionamiento surgen en los campos error.code y error.message del objeto de versión. Compruebe el estado de la versión después de la creación para identificar problemas.

Código de error Código HTTP Solución
image_pull_failed 400 Compruebe que el URI de la imagen sea correcto y que la identidad administrada del proyecto tenga Lector de Repositorio de Registro de Contenedor en ACR.
SubscriptionIsNotRegistered 400 Registro del proveedor de suscripciones
InvalidAcrPullCredentials 401 Reparar la identidad administrada o el Control de Acceso Basado en Roles (RBAC) del registro
UnauthorizedAcrPull 403 Proporcionar credenciales o identidades correctas
AcrImageNotFound 404 Corregir el nombre/etiqueta de la imagen o publicar la imagen
RegistryNotFound 400/404 Corrección del registro DNS o de la accesibilidad de la red

Para los errores 5xx, póngase en contacto con el soporte técnico de Microsoft.

Para obtener información detallada sobre los requisitos de RBAC y la solución de problemas de permisos, consulte Referencia de permisos del agente hospedado.

Pasos siguientes