Administración de agentes hospedados

En este artículo se muestra cómo administrar agentes hospedados en el servicio de agente Foundry Agent Service. Después de implementar un agente hospedado, puede ver su estado, crear nuevas versiones, configurar el enrutamiento del tráfico, supervisar los registros y eliminar agentes cuando ya no sean necesarios.

La plataforma administra automáticamente el ciclo de vida del contenedor. Los recursos de computación se aprovisionan cuando llega una solicitud y se desaprovisionan después de un tiempo de inactividad de 15 minutos. No hay operaciones de inicio ni detención manuales.

Requisitos previos

  • CLI de Azure versión 2.80 o posterior, autenticado con az login.
  • SDK de Python: azure-ai-projects>=2.1.0 y azure-identity.

Configurar variables

En los ejemplos de la API REST de este artículo se utiliza az rest para llamar directamente a los endpoints del servicio Foundry Agent. Establezca las siguientes variables antes de ejecutar los comandos:

ACCOUNT_NAME="<your-foundry-account-name>"
PROJECT_NAME="<your-project-name>"
AGENT_NAME="<your-agent-name>"
BASE_URL="https://${ACCOUNT_NAME}.services.ai.azure.com/api/projects/${PROJECT_NAME}"
API_VERSION="v1"
RESOURCE="https://ai.azure.com"

Importante

El --resource parámetro es necesario para todas las llamadas a los az rest puntos de conexión del plano de datos del servicio Foundry Agent. Sin ella, az rest no puede derivar la audiencia de AD Azure correcta de la dirección URL y se produce un error de autenticación.

Visualización de agentes y versiones

Use los siguientes comandos para enumerar agentes e inspeccionar los detalles de la versión.

Enumeración de todos los agentes de un proyecto

az rest --method GET \
    --url "${BASE_URL}/agents?api-version=${API_VERSION}" \
    --resource "${RESOURCE}"
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient

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

for agent in project.agents.list():
    print(agent.name)
azd ai agent show

Nota

azd ai agent show lee el nombre del agente y la versión de la entrada de servicio en la azd configuración del proyecto.

Obtención de los detalles del agente

az rest --method GET \
    --url "${BASE_URL}/agents/${AGENT_NAME}?api-version=${API_VERSION}" \
    --resource "${RESOURCE}"

La respuesta incluye la versión, el estado y la definición más recientes del agente.

agent = project.agents.get(agent_name="my-agent")
print(f"Name: {agent.name}")
print(f"Status: {agent.versions['latest']['status']}")
azd ai agent show

Obtención de una versión específica

az rest --method GET \
    --url "${BASE_URL}/agents/${AGENT_NAME}/versions/1?api-version=${API_VERSION}" \
    --resource "${RESOURCE}"
agent_version = project.agents.get_version(
    agent_name="my-agent", agent_version="1"
)
print(f"Version: {agent_version.version}")
print(f"Status: {agent_version['status']}")

La información de versión se incluye en la salida de azd ai agent show.

Enumerar todas las versiones de un agente

az rest --method GET \
    --url "${BASE_URL}/agents/${AGENT_NAME}/versions?api-version=${API_VERSION}" \
    --resource "${RESOURCE}"
for version in project.agents.list_versions(agent_name="my-agent"):
    print(f"Version: {version.version}, Status: {version['status']}")

La información de versión se incluye en la salida de azd ai agent show.

Creación de una nueva versión

Cree una nueva versión del agente cuando necesite actualizar la imagen de contenedor, cambiar la asignación de recursos o modificar variables de entorno.

az rest --method POST \
    --url "${BASE_URL}/agents/${AGENT_NAME}/versions?api-version=${API_VERSION}" \
    --resource "${RESOURCE}" \
    --body '{
        "definition": {
            "kind": "hosted",
            "image": "myregistry.azurecr.io/my-agent:v2",
            "cpu": "1",
            "memory": "2Gi",
            "container_protocol_versions": [
                {"protocol": "responses", "version": "1.0.0"}
            ]
        }
    }'

Reemplaza responses con invocations si tu agente usa el protocolo Invocaciones, o incluye ambos para exponer ambos protocolos. Para obtener más información sobre la selección de protocolos, consulte Implementación de un agente hospedado.

from azure.ai.projects.models import HostedAgentDefinition, ProtocolVersionRecord

agent = project.agents.create_version(
    agent_name="my-agent",
    definition=HostedAgentDefinition(
        cpu="1",
        memory="2Gi",
        image="myregistry.azurecr.io/my-agent:v2",
        container_protocol_versions=[
            ProtocolVersionRecord(protocol="responses", version="1.0.0"),
        ],
    ),
)
print(f"Created version: {agent.version}")

Reemplaza responses con invocations si tu agente utiliza el protocolo Invocaciones, o pasa ambos para exponer ambos protocolos.

Las nuevas versiones se crean automáticamente cuando se ejecuta azd deploy con código o configuración actualizados.

Valores de estado de versión

Después de crear o actualizar una versión del agente, realice consultas periódicas al punto de conexión de la versión hasta que el estado alcance active:

Estado Descripción
creating La infraestructura está siendo aprovisionada, normalmente en un período de 2 a 5 minutos.
active El agente está listo para atender solicitudes.
failed Error de aprovisionamiento. Compruebe el error campo en la respuesta para obtener más información.
deleting La versión está siendo depurada.
deleted Se ha quitado completamente la versión.

Sondee el estado de la versión después de la creación:

import time

def wait_for_version_active(project, agent_name, agent_version, max_attempts=60):
    for attempt in range(max_attempts):
        time.sleep(10)
        version = project.agents.get_version(
            agent_name=agent_name, agent_version=agent_version
        )
        status = version["status"]
        print(f"Version status: {status} (attempt {attempt + 1})")
        if status == "active":
            return
        if status == "failed":
            raise RuntimeError(f"Version provisioning failed: {dict(version)}")
    raise RuntimeError("Timed out waiting for version to become active")

Eliminación de un agente

Puede eliminar una versión específica o un agente completo con todas sus versiones.

Eliminación de una versión específica

az rest --method DELETE \
    --url "${BASE_URL}/agents/${AGENT_NAME}/versions/1?api-version=${API_VERSION}" \
    --resource "${RESOURCE}"
project.agents.delete_version(agent_name="my-agent", agent_version="1")

Actualmente no se admite como un comando independiente. Use la API REST o el SDK.

Eliminar un agente y todas las versiones

Advertencia

Esta acción elimina permanentemente el agente y todas sus versiones. Las sesiones activas se finalizan. Esta operación no se puede deshacer.

az rest --method DELETE \
    --url "${BASE_URL}/agents/${AGENT_NAME}?api-version=${API_VERSION}" \
    --resource "${RESOURCE}"
project.agents.delete(agent_name="my-agent")

Actualmente no se admite como un comando independiente. Use la API REST o el SDK.

Visualización de registros y supervisión

Acceda a los registros de contenedor para depurar problemas de aprovisionamiento y tiempo de ejecución.

Transmisión de registros desde una sesión de agente específica:

AGENT_VERSION="<version>"
SESSION_ID="<session-id>"

az rest --method GET \
    --url "${BASE_URL}/agents/${AGENT_NAME}/versions/${AGENT_VERSION}/sessions/${SESSION_ID}:logstream?api-version=${API_VERSION}" \
    --resource "${RESOURCE}" \
    --headers "Foundry-Features=HostedAgents=V1Preview" "Accept=text/event-stream"

El punto de conexión de logstream devuelve Eventos Enviados por el Servidor (SSE) con marcos event: log. Cada fotograma contiene una carga útil JSON con los campos timestamp, stream (stdout, stderr o status) y message.

Tiempos de espera:

  • Duración máxima de la conexión: 30 minutos
  • Tiempo de espera de inactividad: 2 minutos

La visualización de registros de contenedor no se admite actualmente a través del SDK de Python. Use la API REST o Azure CLI para desarrolladores.

Supervise un agente en ejecución con información de registro y estado en tiempo real:

azd ai agent monitor

Este comando lee el nombre del agente y la versión desde la entrada de servicio en la configuración de tu proyecto.

Salida de registro de ejemplo

2026-04-09T08:43:48.72656  Connecting to the container 'agent-container'...
2026-04-09T08:43:48.75451  Successfully connected to container: 'agent-container'
2026-04-09T08:43:59.0671054Z stdout F INFO: 127.0.0.1:42588 - "GET /readiness HTTP/1.1" 200 OK

Configurar el enrutamiento de puntos de conexión del agente

Los puntos de conexión del agente controlan cómo se distribuye el tráfico entre las versiones del agente. Use selectores de versiones para enrutar un porcentaje de tráfico a versiones específicas, lo que permite implementaciones controladas o implementaciones graduales.

El enrutamiento de los endpoints se configura mediante la aplicación de parches al objeto del agente. Usa PATCH /agents/{agent_name} con Content-Type: application/merge-patch+json:

az rest --method PATCH \
    --url "${BASE_URL}/agents/${AGENT_NAME}?api-version=${API_VERSION}" \
    --resource "${RESOURCE}" \
    --headers "Content-Type=application/merge-patch+json" "Foundry-Features=AgentEndpoints=V1Preview" \
    --body '{
        "agent_endpoint": {
            "version_selector": {
                "version_selection_rules": [
                    {"agent_version": "1", "traffic_percentage": 100, "type": "FixedRatio"}
                ]
            },
            "protocols": ["responses"]
        }
    }'

Configúrelo protocols en ["invocations"] o ["responses", "invocations"] para que coincida con los protocolos que expone el agente.

Para dividir el tráfico entre dos versiones (por ejemplo, 90/10 para un despliegue canario):

az rest --method PATCH \
    --url "${BASE_URL}/agents/${AGENT_NAME}?api-version=${API_VERSION}" \
    --resource "${RESOURCE}" \
    --headers "Content-Type=application/merge-patch+json" "Foundry-Features=AgentEndpoints=V1Preview" \
    --body '{
        "agent_endpoint": {
            "version_selector": {
                "version_selection_rules": [
                    {"agent_version": "1", "traffic_percentage": 90, "type": "FixedRatio"},
                    {"agent_version": "2", "traffic_percentage": 10, "type": "FixedRatio"}
                ]
            },
            "protocols": ["responses"]
        }
    }'
from azure.ai.projects.models import (
    AgentEndpoint,
    AgentEndpointProtocol,
    FixedRatioVersionSelectionRule,
    VersionSelector,
)

endpoint_config = AgentEndpoint(
    version_selector=VersionSelector(
        version_selection_rules=[
            FixedRatioVersionSelectionRule(
                agent_version="1", traffic_percentage=100
            ),
        ]
    ),
    protocols=[AgentEndpointProtocol.RESPONSES],
)

project.beta.agents.patch_agent_details(
    agent_name="my-agent",
    agent_endpoint=endpoint_config,
)

El enrutamiento de puntos de conexión se configura automáticamente durante azd deploy. Para personalizar la distribución del tráfico, use la API REST o el SDK.

Recuperación de la identidad del agente para las asignaciones de roles

Cada agente hospedado tiene una identidad de instancia: una entidad de servicio de Microsoft Entra ID que el agente usa en tiempo de ejecución para autenticarse en recursos posteriores. Para conceder al agente acceso a servicios como Azure Storage o Azure Cosmos DB, necesita el ID principal de la identidad para poder crear asignaciones de roles de RBAC.

Para más información sobre cómo funcionan las identidades del agente, consulte Conceptos de identidad del agente.

Extraiga el identificador principal de identidad del agente

Use el --query parámetro para extraer directamente instance_identity.principal_id de los detalles del agente:

AGENT_IDENTITY=$(az rest --method GET \
    --url "${BASE_URL}/agents/${AGENT_NAME}?api-version=${API_VERSION}" \
    --resource "${RESOURCE}" \
    --query "instance_identity.principal_id" \
    --output tsv)

echo "Agent identity principal ID: ${AGENT_IDENTITY}"
agent = project.agents.get(agent_name="my-agent")
agent_identity = agent.instance_identity["principal_id"]
print(f"Agent identity principal ID: {agent_identity}")

Utilice la API REST o el SDK de Python para obtener el ID de entidad de identidad del agente.

Asignación de roles a la identidad del agente

Después de tener el ID principal, asigne roles de RBAC a la identidad del agente en el alcance de recurso adecuado. Use --assignee-object-id con --assignee-principal-type ServicePrincipal para evitar problemas de búsqueda en Microsoft Graph con los principales de servicio de identidad del agente.

La identidad del agente funciona con cualquier recurso de Azure que admita RBAC. En los ejemplos siguientes se muestran dos escenarios comunes: conceder acceso al proyecto Foundry y conceder acceso a una cuenta de almacenamiento.

Asigne un rol en el proyecto Foundry (por ejemplo, para permitir que el agente use recursos del proyecto):

az role assignment create \
    --assignee-object-id "$AGENT_IDENTITY" \
    --assignee-principal-type ServicePrincipal \
    --role "Azure AI Developer" \
    --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/projects/<project-name>"

Asigne un rol en una cuenta de almacenamiento (por ejemplo, para permitir que el agente lea y escriba blobs):

az role assignment create \
    --assignee-object-id "$AGENT_IDENTITY" \
    --assignee-principal-type ServicePrincipal \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"

Las asignaciones de roles son una operación de Azure Resource Manager. Use los comandos CLI de Azure que se muestran en la pestaña REST con el valor de agent_identity del paso anterior o use el SDK de Azure Administración de autorización para crear asignaciones de roles mediante programación.

Use el CLI de Azure directamente para crear asignaciones de roles. Recupere el identificador principal de identidad del agente mediante la API REST o Python SDK y, a continuación, ejecute az role assignment create como se indica en la pestaña REST.

Comprobación de las asignaciones de roles

Enumere los roles asignados a la identidad del agente en el proyecto Foundry:

az role assignment list \
    --assignee "$AGENT_IDENTITY" \
    --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/projects/<project-name>" \
    --output table

Enumere los roles asignados a la identidad del agente en una cuenta de almacenamiento:

az role assignment list \
    --assignee "$AGENT_IDENTITY" \
    --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>" \
    --output table

Use los comandos CLI de Azure que se muestran en la pestaña REST para comprobar las asignaciones de roles.

Use el CLI de Azure directamente para comprobar las asignaciones de roles como se muestra en la pestaña REST.

Pasos siguientes