Implementación de un agente hospedado desde el código fuente

En este artículo se muestra cómo implementar un agente Hosted en foundry Agent Service desde Python o .NET código fuente, sin compilar ni insertar una imagen de contenedor. Subes un .zip de tu código (y, opcionalmente, tus dependencias), y Agent Service lo ejecuta tal cual o compila tus dependencias por ti en la nube.

Sugerencia

En la mayoría de los escenarios, implemente con la Azure Developer CLI (azd) o el kit de herramientas de Foundry para VS Code. Estas herramientas se encargan del trabajo pesado por usted: empaquetan su código fuente, lo suben, consultan periódicamente active y configuran automáticamente el control de acceso basado en roles. Para empezar, siga la Guía de inicio rápido: Implemente su primer agente hospedado y elija Código (o Código fuente (carga de archivo ZIP)) cuando se le pida que elija un método de implementación.

Use los procedimientos de SDK y REST de este artículo cuando necesite implementar agentes de código fuente mediante programación, desde el SDK de Python o .NET SDK en sus propias aplicaciones, o directamente a través de la API REST para herramientas personalizadas, automatización independiente del lenguaje o integración con sistemas de entrega continua existentes. En este artículo, se realizarán las siguientes tareas:

  • Elija un modo de resolución de dependencias y empaquete el origen.
  • Cree el agente, espere a que llegue a activee invoquelo.
  • Actualizar, versionar, descargar y transmitir en tiempo real los registros del agente desplegado.

Si necesita control total de la imagen en tiempo de ejecución o ya tiene un Dockerfile en funcionamiento, use la ruta de acceso basada en contenedores: Implementar un agente hospedado.

Si usa un asistente de programación como GitHub Copilot para empaquetar y desplegar código fuente, Microsoft Foundry Skill puede ayudarle a preparar su proyecto y a seguir los pasos necesarios de azd, SDK o REST.

Prerequisites

  • Un proyecto Microsoft Foundry en una región admitida.
  • CLI de Azure versión 2.80 o posterior, con sesión iniciada en el tenant al que pertenece el proyecto.
  • pip desde Python 3.13 o una versión posterior, para empaquetar tu código fuente localmente.

  • La versión azure-ai-projects 2.2.0 o posterior y los paquetes azure-identity.

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

Entornos de ejecución admitidos

El code_configuration.runtime campo de la definición del agente acepta los valores siguientes. Seleccione el entorno de ejecución que coincida con los binarios de su archivo zip: paquetes wheels de Linux x86_64 para Python o la salida TargetFramework de la dotnet publish para .NET.

Language Valores en tiempo de ejecución
Python python_3_13, python_3_14
.NET dotnet_10

Política de compatibilidad de versiones de idioma

El entorno de ejecución del servicio del agente incluye la imagen de contenedor compilada por la plataforma para cada valor de code_configuration.runtime. Para mantener totalmente compatibles los agentes implementados, Foundry alinea la compatibilidad con el lenguaje del agente hospedado con compatibilidad de fin de ciclo de vida para cada idioma. El soporte técnico finaliza en la fecha de finalización del soporte técnico de la comunidad para la versión del idioma. Microsoft puede retirar un valor code_configuration.runtime antes cuando las restricciones de plataforma (como la imagen base subyacente) lo requieran.

Para consultar los calendarios de fin del soporte de upstream, consulte:

Fase de retirada

Después de una fecha de finalización del ciclo de vida del lenguaje, todavía puede crear, actualizar y ejecutar agentes hospedados que usan el valor de tiempo de ejecución retirado. Sin embargo, esos agentes no son aptos para soporte técnico, nuevas características o revisiones de seguridad hasta que los actualice a un entorno de ejecución compatible estableciendo un valor actual code_configuration.runtime y vuelva a implementarlos.

Permisos necesarios

Necesitas el rol Foundry Project Manager en el ámbito del proyecto para implementar un agente hospedado. Este rol concede los permisos del plano de datos para crear y actualizar agentes, además de la capacidad de crear asignaciones de roles para la identidad del agente creada por la plataforma si es necesario. Para obtener un desglose detallado de los permisos implicados, consulte Referencia de permisos del agente hospedado.

Importante

Recientemente se cambió el nombre de los roles RBAC de Foundry. Foundry User, Foundry Owner, Foundry Account Owner y Foundry Project Manager se llamaban anteriormente Usuario de Azure AI, Propietario de Azure AI, Propietario de la cuenta de Azure AI y Administrador de proyectos de Azure AI. Es posible que siga viendo los nombres anteriores en algunos lugares mientras se implementa el cambio de nombre. El cambio de nombre no modifica los identificadores de rol y los permisos principales.

El agente se ejecuta como una identidad administrada asignada por la plataforma, separada de su identidad de usuario. Esta identidad puede acceder a las inferencias del modelo a través del punto de conexión del proyecto y del almacenamiento de sesiones de forma predeterminada. Para los recursos externos (por ejemplo, su propio Azure Storage), asigne roles de RBAC manualmente al Microsoft Entra ID del agente. Para obtener más información, consulte Acceso del agente más allá de los valores predeterminados.

Ciclo de vida de la implementación

Cada implementación de código fuente sigue la misma secuencia: paquete -> crear o actualizar -> sondear hasta active -> invocar. La ruta del código fuente usa code_configuration en la definición del agente. La ruta de acceso basada en imágenes usa container_configuration en su lugar. Estas dos opciones son mutuamente excluyentes en una sola versión.

Elija la ruta de acceso que se ajuste al flujo de trabajo. Si no está seguro, comience con la CLI del desarrollador de Azure o VS Code, es la ruta recomendada para la mayoría de los clientes.

Ruta Más adecuado para Embalaje
Azure CLI para desarrolladores o VS Code La mayoría de las implementaciones, incluidas las primeras implementaciones y el bucle interno más rápido. El conjunto de herramientas genera y sube el archivo ZIP por ti.
SDK de Python Despliegue programático desde aplicaciones Python o scripts de automatización. Creas el zip; el SDK lo carga.
SDK de .NET Implementación mediante programación desde aplicaciones .NET o mediante automatización. El SDK crea un archivo ZIP de una carpeta.
JavaScript/TypeScript SDK Implementación mediante programación desde aplicaciones Node.js o automatización. Implementa código fuente de Python o .NET; no hay un entorno de ejecución hospedado para Node.js. Creas el zip; el SDK lo carga.
REST API Herramientas personalizadas, automatización independiente del lenguaje y sistemas de CD. Crea el archivo ZIP y envía la solicitud multipart.

Elección de cómo se resuelven las dependencias

Antes de empezar, elija un valor para code_configuration.dependency_resolution. Esta elección afecta al contenido que incluyas en el archivo ZIP.

Value Comportamiento Se utiliza cuando
remote_build El servicio de agente instala las dependencias de requirements.txt (Python) o restaura el archivo del proyecto (.NET) durante el aprovisionamiento. Quieres subir poco y tener el ciclo interno más simple posible. Se recomienda para los usuarios por primera vez.
bundled El archivo ZIP se ejecuta tal cual. Incluye dependencias de Linux precompiladas en packages/ (Python) o en la salida de dotnet publish (.NET). Necesita compilaciones reproducibles, sus dependencias son privadas o solo están disponibles como paquetes wheel, o su proyecto no se restaura correctamente en el servidor.

Para el modo agrupado, consulte Empaquetar el archivo ZIP manualmente para los comandos de compilación local.

Requisitos de firewall para redes virtuales privadas

Si protege el proyecto con una red virtual privada, actualice la directiva de red para permitir conexiones salientes a los siguientes puntos de conexión antes de implementarlo.

Todas las implementaciones de código fuente requieren acceso saliente a:

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

Para la configuración de red, consulte Implementación de un agente hospedado en una red virtual.

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

La Azure Developer CLI (azd) y el Foundry Toolkit para VS Code automatizan el ciclo de vida completo del despliegue del código fuente: empaquetan el código fuente en un archivo ZIP, calculan el SHA-256, lo cargan, consultan periódicamente el estado de active y configuran automáticamente el control de acceso basado en roles. Estas herramientas son la ruta recomendada para la mayoría de los clientes y el bucle interno más rápido.

Para ver un tutorial paso a paso, consulte inicio rápido: Implementación del primer agente hospedado. Elija Código (o Código fuente (carga de archivo ZIP)) cuando la guía de inicio rápido le pida un método de implementación.

Selección de la implementación de código fuente

Cuando se ejecuta azd ai agent init de forma interactiva, la herramienta le pide que elija un modo de implementación. Seleccione código para implementar desde el código fuente mediante la carga de un archivo ZIP en lugar de crear una imagen de contenedor. La implementación de código es el modo predeterminado para Python y .NET agentes hospedados. Foundry Toolkit for VS Code le pide el método de implementación de la misma manera.

Para seleccionar el despliegue de código fuente de forma no interactiva, por ejemplo, en un pipeline de CI/CD, utilice --deploy-mode code. Este modo requiere --runtime y --entry-point, y acepta un valor --dep-resolution opcional de remote_build (valor predeterminado) o bundled:

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

Después de la inicialización, azd escribe la configuración de implementación de código fuente en el codeConfiguration campo del azure.ai.agent servicio en 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

Ejecute azd up para aprovisionar e implementar. Use --deploy-mode container solo cuando quiera compilar o hacer referencia a una imagen de contenedor en su lugar.

Use las rutas de acceso del SDK o REST en las secciones siguientes cuando necesite implementar mediante programación desde su propia aplicación o integrarla con herramientas existentes.

Implementación desde el código fuente

Seleccione el idioma o la interfaz. Cada pestaña recorre el mismo ciclo de vida: cree el agente, sondee hasta que alcance active, invoque y descargue el código implementado.

Use el SDK de Python para implementar agentes de código fuente desde sus propias aplicaciones o automatización. Compile el archivo ZIP y pase sus bytes y SHA-256 al SDK, que lo carga y expone las mismas operaciones de creación, sondeo, invocación y descarga que la API REST. El despliegue de código requiere la versión 2.2.0 o posterior de azure-ai-projects.

Compilación del archivo ZIP

El SDK de Python sube un archivo ZIP que creas. Use las mismas reglas de diseño y resolución de dependencias descritas en Empaquetar el archivo ZIP manualmente. La carga mínima remote_build es un zip plano con main.py y requirements.txt en la raíz.

Creación del agente

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

Para el protocolo Invocations, establezca la entrada protocol_versions en ProtocolVersionRecord(protocol="invocations", version="1.0.0"). Para el protocolo Invocations (WebSocket), utilice ProtocolVersionRecord(protocol="invocations_ws", version="1.0.0"). Para el modo bundled, establezca dependency_resolution="bundled" e incluya las dependencias precompiladas en el archivo ZIP. Para obtener más información, consulte Compilación de dependencias de Linux localmente.

Sondear por activo

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)

Consulte Sondear si está activo para consultar la lista completa de valores de estado y cómo leer el objeto error en caso de error.

Invoque al agente

Una vez que la versión alcanza active, enlace un cliente de OpenAI al punto de conexión del agente y llámelo. En este ejemplo se usa el protocolo Responses:

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)

Para el protocolo Invocations, llame directamente al punto de conexión invoke con un token de portador, como se muestra en Invocar al agente.

Descargar el archivo ZIP desplegado

Compruebe exactamente lo que se implementa descargando el archivo ZIP y comparando su SHA-256 con el valor que cargó:

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

Para obtener un ejemplo completo de ejecución, consulte los ejemplos de Python hosted-agent.

Empaquetar manualmente el archivo ZIP

Si usa azd, omita esta sección:azd compila el archivo ZIP para usted. Léalo si usa la API REST, si cambia a la resolución agrupada de dependencias o si necesita un control total sobre el contenido que se carga.

El archivo ZIP debe estar plano en la raíz, sin carpeta contenedora de nivel superior.

Seleccione la pestaña del idioma del agente.

diseño Python (modo de compilación remota)

El servicio instala dependencias en la nube desde requirements.txt.

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

diseño Python (modo agrupado)

Las dependencias precompiladas de Linux se envían en packages/.

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

Compilación de dependencias de Linux localmente (agrupadas, Python)

Use la etiqueta de plataforma manylinux2014_x86_64 para que pip descargue paquetes wheels de Linux incluso desde Windows o 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: fuerza el uso de paquetes wheels (sin compilaciones desde el código fuente). --python-version debe coincidir con el runtime valor de la definición del agente.

Advertencia

Errores comunes de empaquetado que provocan session_creation_failed o ModuleNotFoundError:

  • Encapsular el origen en una carpeta (my-agent/main.py en lugar de main.py en la raíz).
  • Inclusión de archivos sin procesar .whl en packages/ en lugar de módulos extraídos.
  • Agrupación de archivos binarios de Windows (.pyd, .dll) para un entorno de ejecución de Linux.

Límites

Límite Value
Tamaño máximo de zip (carga de varias partes) 250 MB

Para consultar las combinaciones admitidas de cpu y memory, consulte Tamaños de espacio aislado.

Solución de problemas

Síntoma Causa probable Corregir
401 Unauthorized Falta el token o su alcance es incorrecto Adquiera un token con --resource https://ai.azure.com.
403 Forbidden El llamante no tiene control de acceso basado en roles en el proyecto Concede a Consumidor de agentes de Foundry (solo para invocar) o a Foundry User (también para desarrollar) en el ámbito del proyecto.
409 conflict en Crear (Agent '<name>' already exists) El nombre del agente ya existe Use Update (POST /agents/{name}) o elija un nombre nuevo.
400 bad_request (CPU and Memory must be specified as a valid resource tier) en Crear o actualizar cpu / memory no son uno de los niveles admitidos Establezca cpu y memory en un par válido de tamaños de espacio aislado.
400 bad_request (Agent version is still being provisioned) al invocar Se implementa una nueva versión a mitad de la implementación y se intercambia la versión activa. Sondee la versión status hasta activey vuelva a intentarlo.
424 session_not_ready al invocar Se inició el contenedor, pero /readiness no devolvió HTTP 200 dentro del tiempo de espera. Transmita los registros con :logstream, corrija el sondeo de preparación o el error de inicio y vuelva a implementar.
409 conflict en el agente DELETE (Agent has active sessions) Las sesiones abiertas bloquean la eliminación Espere a que las sesiones queden inactivas o añada &force=true para eliminar las sesiones en cascada.
Versión bloqueada en creating (>10 minutos, compilación remota) Error en la compilación del servidor o no se pudo resolver requirements.txt Cambie a dependency_resolution: bundled y precompile localmente.
Error de implementación en una red virtual privada El firewall bloquea los puntos de conexión de salida necesarios. Permite los puntos de conexión en Requisitos de firewall para redes virtuales privadas y, a continuación, vuelve a implementar.
La versión cambia a failed Error de diseño zip incorrecto, error de sintaxis o (remote_build) un error de restauración o compilación Lea primero el objeto error de la versión: error.code clasifica el fallo y error.message contiene la línea del error subyacente de restauración o compilación (pip para Python, NuGet para .NET), además de un enlace de solución de problemas. Compruebe la estructura de carpetas. Use :logstream solo después de que se inicie el contenedor.
ModuleNotFoundError en tiempo de ejecución packages/ falta, contiene archivos sin procesar .whl, o binarios de Windows Recompile con pip install --target packages/ --platform manylinux2014_x86_64 --only-binary=:all:.
409 AgentNotCodeBased al descargar El agente está basado en imágenes Use el documento de implementación basado en contenedores.

Limpieza de recursos

Si ha generado el proyecto a partir del Inicio rápido con azd, ejecute azd down desde la raíz del proyecto para eliminar todo el entorno que se aprovisionó.

Para eliminar un agente que implementó con el SDK o la API REST, use la ruta de acceso coincidente siguiente.

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

Advertencia

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

Pasos siguientes