Conexión de agentes a herramientas de OpenAPI

Conecte los agentes de Microsoft Foundry a las API externas mediante especificaciones de OpenAPI 3.0 y 3.1. El modelo foundry que impulsa el agente puede llamar a servicios externos, recuperar datos en tiempo real y ampliar sus funcionalidades más allá de las funciones integradas.

Las especificaciones de OpenAPI definen una manera estándar de describir las API HTTP, por lo que puede integrar los servicios existentes con los agentes. Use la autenticación anónima, con clave de API o con identidad administrada del proyecto. Para obtener ayuda para elegir un método de autenticación, consulte Elegir un método de autenticación.

Sugerencia

Considere la posibilidad de agregar esta herramienta mediante un cuadro de herramientas. Mediante el uso de un cuadro de herramientas, puede reutilizar la herramienta entre agentes y entornos de ejecución, así como centralizar la administración de credenciales, el control de versiones y la aplicación de directivas a través de un punto de conexión de MCP administrado. Consulte el inicio rápido del cuadro de herramientas.

Requisitos previos

Antes de comenzar, asegúrese de que tiene:

  • Una suscripción Azure con los permisos adecuados.

  • Rol de usuario de Foundry en el proyecto Foundry para crear y ejecutar agentes.

    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.

  • Rol de Administrador de proyectos en el proyecto Foundry para crear una conexión de proyecto. Este rol incluye conexiones anónimas, con clave de API y con identidad administrada por proyecto.

  • Un proyecto de Foundry creado con un endpoint configurado.

  • Un modelo de IA implementado en el proyecto. Confirme que tanto el modelo como la región del proyecto admiten herramientas de OpenAPI en la compatibilidad con herramientas por región y modelo.

  • Un entorno de agente básico o estándar.

  • Dependencias instaladas para tu idioma preferido:

    • Python ejemplos del SDK: azure-ai-projects, azure-identityy jsonref. En el ejemplo de respuestas directas también se usa openai.
    • Ejemplos del SDK de C#: Azure.AI.Projects, Azure.AI.Projects.Agents, Azure.AI.Extensions.OpenAIy Azure.Identity. En el ejemplo directo de HTTP se usa Azure.Identity.
    • Ejemplos del SDK de JavaScript y TypeScript: @azure/ai-projects y @azure/identity. En el ejemplo directo de HTTP se usa @azure/identity.
    • Java ejemplo HTTP: com.azure:azure-identity y com.fasterxml.jackson.core:jackson-databind.
  • Archivo de especificación de OpenAPI 3.0 o 3.1 que cumpla estos requisitos:

    • Cada función debe tener una operationId (necesaria para la herramienta OpenAPI).
    • operationId solo debe contener letras, -y _.
    • Use nombres descriptivos para ayudar a los modelos a decidir eficazmente qué función usar.
    • Tipos de contenido de cuerpo de solicitud admitidos: application/json, application/json-patch+json
  • Para la autenticación de identidad administrada del proyecto: una conexión de proyecto de OpenAPI con authType: "ProjectManagedIdentity" y el rol de servicio de destino con privilegios mínimos asignado a la identidad administrada del proyecto. Pase el identificador de recurso completo de la conexión a la herramienta. Consulte Crear una conexión de identidad administrada de proyecto.

  • Para la autenticación mediante clave o token de API: una conexión de proyecto que esté configurada con tu clave de API o tu token. Consulte Agregar una nueva conexión al proyecto.

  • Para la autenticación anónima: una conexión a un proyecto de OpenAPI con authType: "None". Consulte Crear una conexión OpenAPI anónima.

Variables de entorno

Variable Descripción
FOUNDRY_PROJECT_ENDPOINT El punto de conexión del proyecto foundry, como https://<account>.services.ai.azure.com/api/projects/<project>. No use el punto de conexión de API externo.
FOUNDRY_MODEL_DEPLOYMENT_NAME Nombre del modelo implementado.
OPENAPI_CONNECTION_ID Identificador completo del recurso ARM de la conexión OpenAPI para el método de autenticación seleccionado.
TOOLBOX_CONNECTION_ID Para muestras que asocian un cuadro de herramientas a través de una conexión de proyecto, especifique el identificador de recurso completo de esa conexión independiente con el punto de conexión MCP del cuadro de herramientas.

Nota

El valor FOUNDRY_PROJECT_ENDPOINT hace referencia al punto de conexión del proyecto Microsoft Foundry, no al punto de conexión de servicio openAPI externo. Puede encontrar este punto de conexión en el portal de Microsoft Foundry en la página Información general del proyecto. Este punto de conexión es necesario para autenticar el servicio del agente y es independiente de los puntos de conexión de OpenAPI definidos en el archivo de especificación.

Soporte de uso

En la tabla siguiente se muestra la compatibilidad con el SDK y la configuración.

compatibilidad con Microsoft Foundry SDK de Python C# SDK SDK de JavaScript SDK de Java REST API Configuración básica del agente Configuración del agente estándar
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Nota

En el ejemplo de Java de este artículo se usa el cliente HTTP de Java y Azure Identity para enviar la misma carga de respuestas que los otros lenguajes. No requiere modelos de herramientas OpenAPI tipados.

Ejecuta el flujo anónimo del primer éxito

Comience con la API meteorológica anónima para comprobar que el agente puede cargar una especificación de OpenAPI y llamar a una operación. Cree una conexión de proyecto de OpenAPI incluso para la autenticación anónima y pase su identificador de recurso completo a la herramienta. La autenticación anónima no requiere una credencial de API externa. Consulte Crear una conexión OpenAPI anónima.

  1. Instale el paquete del SDK para el idioma seleccionado en Requisitos previos.
  2. Descargue weather_openapi.json, y guárdelo en la ruta assets utilizada por el ejemplo.
  3. Configura los valores del punto de conexión y la implementación del modelo de tu proyecto de Foundry.
  4. Cree una conexión de OpenAPI anónima para https://wttr.iny establezca OPENAPI_CONNECTION_ID en su identificador de recurso completo.
  5. Ejecute el ejemplo anónimo en la sección de idioma seleccionado.
  6. Confirme que la respuesta contiene el tiempo actual de Seattle y, a continuación, elimine la versión del agente creada por el ejemplo.

Una vez que la llamada anónima se realiza correctamente, configure la autenticación requerida por la API de destino. Mantenga la autenticación de clave de API, la autenticación con token de portador y la autenticación de identidad administrada del proyecto como variantes independientes.

Descripción de las limitaciones

  • La especificación de OpenAPI debe incluir operationId para cada operación y operationId solo puede incluir letras, -y _.
  • Tipos de contenido del cuerpo de la solicitud admitidos: application/json, application/json-patch+json.
  • Para la autenticación de clave de API, use un esquema de seguridad de clave de API por herramienta OpenAPI. Si necesita varios esquemas de seguridad, cree varias herramientas de OpenAPI.
  • Rota las claves de API y los tokens de portador con regularidad y de forma inmediata ante cualquier sospecha de exposición. Actualice la conexión del proyecto cuando cambien las credenciales; no coloque credenciales en la especificación o el código fuente de OpenAPI.

Configuración de la autenticación de OpenAPI en el portal de Foundry

Al agregar una herramienta openAPI a través de Herramientas>personalizadas>de OpenAPI, cree una conexión de proyecto para la herramienta. Anónima, clave de API e identidad administrada requieren una conexión, independientemente de si configura la herramienta a través del portal, el SDK o la API REST.

La opción Identidad administrada del portal usa la identidad administrada del proyecto Foundry, no la identidad administrada de la cuenta de Foundry. Las herramientas de OpenAPI en las cajas de herramientas siempre han requerido la identidad administrada del proyecto, independientemente del historial de la suscripción. La identidad administrada de la cuenta solo se admite en suscripciones existentes para las herramientas de OpenAPI asociadas directamente a los agentes de prompt. Migren esas configuraciones a la identidad administrada del proyecto lo antes posible. Consulte Compatibilidad con identidades administradas.

La autenticación anónima significa que la API de destino no requiere credenciales. No significa que puedes omitir la creación de la conexión.

Authentication Configuración de conexión
Anónimo Cree una conexión de proyecto de OpenAPI sin autenticación (authType: "None"). No se requiere ninguna clave de API ni token.
Clave de API Cree una conexión de proyecto que almacene la clave de API. Haga coincidir el nombre de la clave con el encabezado o el parámetro de consulta en el esquema de seguridad de OpenAPI. Consulte Autenticarse con una clave de API.
Identidad administrada (identidad administrada del proyecto) Cree una conexión de proyecto de OpenAPI con authType: "ProjectManagedIdentity", el punto de conexión de api de destino y la audiencia esperada por esa API. Asigne a la identidad administrada del proyecto el rol necesario en el servicio de destino. Esta opción no usa la identidad administrada de la cuenta.

Configurar la autenticación anónima

  1. Abra Tools>Custom>OpenAPI en el proyecto foundry.
  2. En Crear una herramienta OpenAPI, escriba el nombre y la descripción de la herramienta.
  3. Establezca Método de autenticación en Anónimo.
  4. En Conexión, seleccione una conexión anónima existente o seleccione Crear una nueva conexión para crear una.
  5. Escriba el esquema openAPI 3.0+ y seleccione Crear herramienta.

El campo Conexión es necesario incluso cuando se selecciona Anónimo .

Captura de pantalla de la autenticación openAPI anónima con un campo conexión obligatorio y un botón Crear una conexión nueva.

Configuración de la autenticación de identidad administrada

La opción Identidad administrada requiere la identidad administrada del proyecto. Una asignación de roles existente para la identidad administrada de la cuenta no concede acceso a la identidad administrada del proyecto.

  1. En Crear una herramienta OpenAPI, establezca Método de autenticación en Identidad administrada.
  2. En Conexión, seleccione una conexión existente de identidad administrada del proyecto o seleccione Crear una nueva conexión.
  3. En Crear conexión de OpenAPI, escriba un nombre de conexión y establezca Tipo de autenticación en Identidad administrada.
  4. Escriba la dirección URL de destino de la API y la audiencia que espera la API. La audiencia no es el punto de conexión del proyecto Foundry.
  5. Seleccione Crear conexión y seleccione esa conexión en el campo Conexión de la herramienta.
  6. Escriba el Nombre, la Descripción y el esquema OpenAPI 3.0+ de la herramienta y seleccione Crear herramienta.

Asigne a la identidad administrada del proyecto el rol necesario en el servicio de destino antes de llamar a la herramienta.

Captura de pantalla del cuadro de diálogo Crear conexión openAPI que muestra los campos Nombre de conexión, Tipo de autenticación, Dirección URL de destino y Audiencia para la identidad administrada.

Para la configuración de la conexión de identidad administrada del proyecto a través de REST, consulte Creación de una conexión de identidad administrada del proyecto. Al usar esa conexión en el código, pase su identificador de recurso completo con auth.type: "project_connection".

Los ejemplos de SDK y REST también hacen referencia a una conexión de proyecto. Cree la conexión antes de ejecutarlos.

Creación de una conexión de OpenAPI anónima

Use los pasos del portal de la sección anterior o ejecute los siguientes comandos de Bash con CLI de Azure y curl después de iniciar sesión con az login. Reemplace los marcadores de posición por los detalles del proyecto Foundry. Esta conexión usa authType: "None" porque la API meteorológica no requiere credenciales.

SUB="<subscription-id>"
RESOURCE_GROUP="<resource-group>"
ACCOUNT="<foundry-account-name>"
PROJECT_NAME="<foundry-project-name>"
PROJECT="/subscriptions/$SUB/resourceGroups/$RESOURCE_GROUP"
PROJECT="$PROJECT/providers/Microsoft.CognitiveServices"
PROJECT="$PROJECT/accounts/$ACCOUNT/projects/$PROJECT_NAME"
export OPENAPI_CONNECTION_ID="$PROJECT/connections/weather-anonymous"

ARM_TOKEN="$(az account get-access-token \
  --subscription "$SUB" \
  --resource https://management.azure.com \
  --query accessToken -o tsv)"

curl --fail-with-body --request PUT \
  --url "https://management.azure.com$OPENAPI_CONNECTION_ID?api-version=2025-06-01" \
  --header "Authorization: Bearer $ARM_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "properties": {
      "category": "OpenAPI",
      "authType": "None",
      "target": "https://wttr.in",
      "metadata": {
        "type": "openapi"
      }
    }
  }'

Referencia: esquema de recursos de conexión del proyecto Foundry.

Pase OPENAPI_CONNECTION_ID en el auth.security_scheme.project_connection_id de la herramienta, con auth.type: "project_connection". La authType de la conexión determina que la API de destino se llama de forma anónima.

Adición de herramientas de OpenAPI a un cuadro de herramientas

Use este patrón para exponer una API REST descrita por una especificación de OpenAPI. Para la autenticación anónima, con clave de API o con identidad administrada por proyecto, establezca auth.type de la herramienta en project_connection. El authType de la conexión determina cómo se autentica Foundry en la API de destino.

Para la autenticación de identidad administrada, los toolboxes requieren la identidad administrada del proyecto. La identidad administrada de cuenta no se admite en conjuntos de herramientas, incluidas las suscripciones existentes.

Los fragmentos de código siguientes muestran la configuración de herramientas, no los programas completos. Reemplace cada objeto vacío spec por la especificación de OpenAPI. Para la creación del cuadro de herramientas, use las muestras de idioma completas de las secciones siguientes.

Importante

Al usar la autenticación de identidad administrada, asigne a la identidad administrada del proyecto Foundry el rol de RBAC con privilegios mínimos que permite las operaciones de API necesarias en el servicio de destino. Por ejemplo, asigne Lector en el recurso de Azure de destino solo cuando la API necesite acceso de solo lectura a Azure Resource Manager. Sin la asignación necesaria, el agente recibe una 401 Unauthorized respuesta al llamar a la API. Para ver los pasos de configuración completos, consulte Autenticación mediante la identidad administrada.

Autenticación anónima:

Cree una conexión de OpenAPI con authType: "None" primero y reemplace <OPENAPI_CONNECTION_ID> por su identificador de recurso completo.

{
  "description": "REST API via OpenAPI spec",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": {},
        "auth": {
          "type": "project_connection",
          "security_scheme": {
            "project_connection_id": "<OPENAPI_CONNECTION_ID>"
          }
        }
      }
    }
  ]
}

Autenticación de conexión del proyecto:

Use este patrón cuando la API requiera una clave o un token almacenados en una conexión de proyecto Foundry.

{
  "description": "REST API with connection-based auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": {},
        "auth": {
          "type": "project_connection",
          "security_scheme": {
            "project_connection_id": "<OPENAPI_CONNECTION_ID>"
          }
        }
      }
    }
  ]
}

Autenticación de identidad administrada del proyecto:

Cree una conexión de proyecto de OpenAPI con authType: "ProjectManagedIdentity"y pase su identificador de recurso completo con auth.type: "project_connection". No use la configuración de audiencia directa managed_identity en una caja de herramientas.

{
  "description": "REST API with project managed identity auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": {},
        "auth": {
          "type": "project_connection",
          "security_scheme": {
            "project_connection_id": "<OPENAPI_CONNECTION_ID>"
          }
        }
      }
    }
  ]
}
import os
from azure.ai.projects.models import (
    OpenApiFunctionDefinition,
    OpenApiProjectConnectionAuthDetails,
    OpenApiProjectConnectionSecurityScheme,
    OpenApiToolboxTool,
)

tools = [
    OpenApiToolboxTool(
        openapi=OpenApiFunctionDefinition(
            name="my-api",
            spec={},
            auth=OpenApiProjectConnectionAuthDetails(
                security_scheme=OpenApiProjectConnectionSecurityScheme(
                    project_connection_id=os.environ["OPENAPI_CONNECTION_ID"]
                )
            ),
        )
    )
]
using System;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects.Agents;

BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
OpenApiToolboxTool tool = new(
    new OpenApiFunctionDefinition(
        name: "my-api",
        specification: specBytes,
        authentication: new OpenApiProjectConnectionAuthenticationDetails(
            new OpenApiProjectConnectionSecurityScheme(
                Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
                ?? throw new InvalidOperationException(
                    "Set OPENAPI_CONNECTION_ID before running.")))
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
    name: "my-toolbox",
    tools: [tool],
    description: "REST API via OpenAPI spec"
);
const connectionId = process.env.OPENAPI_CONNECTION_ID;
if (!connectionId) {
  throw new Error("Set OPENAPI_CONNECTION_ID before running.");
}

const tools = [
  {
    type: "openapi",
    openapi: {
      name: "my-api",
      spec: { /* paste OpenAPI spec object here */ },
      auth: {
        type: "project_connection",
        security_scheme: {
          project_connection_id: connectionId,
        },
      },
    },
  },
];

Creación de un cuadro de herramientas de OpenAPI con la CLI para desarrolladores de Azure

Las herramientas de OpenAPI insertan la especificación directamente en tools:. La autenticación basada en conexión (connection_auth) hace referencia a una conexión de proyecto. Cree también una conexión para la autenticación anónima.

Paso 1. Crear la conexión de autenticación

Para la autenticación anónima, siga Crear una conexión OpenAPI anónima. Para la autenticación de clave de API, use el siguiente comando:

# API-key auth (passed by the platform on every call)
# Set OPENAPI_AUTHORIZATION_HEADER in your shell without committing its value.
azd ai connection create my-api-conn \
  --kind remote-tool \
  --target https://api.example.com \
  --auth-type custom-keys \
  --custom-key "Authorization=$OPENAPI_AUTHORIZATION_HEADER"

Para consultar el conjunto completo de azd ai connection create indicadores, consulte Autenticación y configuración de Toolbox MCP.

Paso 2. Definición del cuadro de herramientas

La especificación de OpenAPI está insertada en tools[].openapi.spec.

# my-toolbox.yaml
description: OpenAPI toolbox
tools:
  - type: openapi
    name: my-api
    openapi:
      name: my-api
      spec:
        openapi: "3.0.1"
        info:
          title: "My API"
          version: "1.0"
        servers:
          - url: https://api.example.com/v1
        paths:
          /search:
            get:
              operationId: search
              parameters:
                - name: query
                  in: query
                  required: true
                  schema:
                    type: string
              responses:
                "200":
                  description: OK
      auth:
        type: connection_auth
        connection_id: my-api-conn

En el caso de las API anónimas, mantenga la autenticación basada en la conexión. Por ejemplo, para usar la conexión meteorológica creada anteriormente, reemplace la especificación de ejemplo por weather_openapi.json y use este auth: bloque:

      auth:
        type: connection_auth
        connection_id: weather-anonymous

Paso 3. Creación del cuadro de herramientas

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Antes de ejecutar los ejemplos de código

  • Cree la conexión de proyecto de OpenAPI antes de ejecutar cualquier ejemplo, incluidos ejemplos anónimos. Para las muestras meteorológicas, use una conexión anónima destinada a https://wttr.in, y establezca OPENAPI_CONNECTION_ID en su identificador completo de recurso ARM.
  • Descargue la versión mantenida de la especificación tripadvisor_openapi.json y guárdela en la ruta de acceso assets utilizada por el ejemplo de su lenguaje.

Nota

  • Necesita el paquete de SDK más reciente. El SDK de .NET está actualmente en versión preliminar. Consulte el inicio rápido para obtener más información.
  • Utilice el identificador de recurso de conexión completo: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>/connections/<connection>.

Importante

Para que la autenticación de clave de API funcione, el archivo de especificación de OpenAPI debe incluir:

  1. Sección securitySchemes con la configuración de la clave de API, como el nombre del encabezado y el nombre del parámetro.
  2. Sección security que hace referencia al esquema de seguridad.
  3. Una conexión de proyecto configurada con el nombre y el valor de clave coincidentes.

Sin estas configuraciones, la clave de API no se incluye en las solicitudes. Para obtener instrucciones detalladas sobre la configuración, consulte la sección Autenticación con clave de API .

También puede usar la autenticación basada en tokens (por ejemplo, un token de portador) almacenando el token en una conexión de proyecto. Para la autenticación del token de portador, cree una conexión de claves personalizadas con la clave configurada a Authorization y el valor configurado a Bearer <token> (reemplace <token> con el token real). La palabra Bearer seguida de un espacio debe incluirse en el valor . Para más información, consulte Configuración de una conexión de token de portador.

Ejemplo de uso de agentes con la herramienta OpenAPI

En este ejemplo se muestra cómo usar los servicios descritos por una especificación de OpenAPI mediante un agente. Usa el servicio wttr.in para obtener el tiempo y su archivo de especificación weather_openapi.json. Seleccione Prompt Agents para usar el SDK de proyectos de IA de Azure para crear un agente de mensajes del lado servidor o Agentes hospedados para usar el marco del agente de Microsoft para crear un agente efímero en proceso.

Agentes rápidos

import os
import jsonref
from typing import Any, cast
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    PromptAgentDefinition,
    OpenApiTool,
    OpenApiFunctionDefinition,
    OpenApiProjectConnectionAuthDetails,
    OpenApiProjectConnectionSecurityScheme,
)

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

# Create a client to call Foundry API
with AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
) as project:
    weather_asset_file_path = os.path.abspath(
        os.path.join(os.path.dirname(__file__), "../assets/weather_openapi.json")
    )

    with open(weather_asset_file_path, "r") as f:
        openapi_weather = cast(dict[str, Any], jsonref.loads(f.read()))

    # Initialize agent OpenAPI tool using the read in OpenAPI spec
    weather_tool = OpenApiTool(
        openapi=OpenApiFunctionDefinition(
            name="get_weather",
            spec=openapi_weather,
            description="Retrieve weather information for a location.",
            auth=OpenApiAnonymousAuthDetails(),
        )
    )

    agent = project.agents.create_version(
        agent_name=AGENT_NAME,
        definition=PromptAgentDefinition(
            model="gpt-4.1-mini",
            instructions="You are a helpful assistant.",
            tools=[weather_tool],
        ),
    )

    with project.get_openai_client(agent_name=agent.name) as openai:
        response = openai.responses.create(
            input="What's the weather in Seattle?",
        )
        print(response.output_text)

    # Clean up resources
    project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)

En este ejemplo se crea un agente de solicitud con una herramienta OpenAPI que llama a la API meteorológica wttr.in mediante la autenticación anónima. La herramienta se adjunta directamente a la definición del agente. Al ejecutar el código:

  1. Carga la especificación de OpenAPI meteorológica desde un archivo JSON local.
  2. Crea un agente de aviso con la herramienta meteorológica configurada para el acceso anónimo.
  3. Envía una consulta sobre el tiempo de Seattle.
  4. El agente usa la herramienta OpenAPI para llamar a la API meteorológica y devuelve resultados con formato.
  5. Limpia eliminando la versión del agente.

Agentes hospedados

En este ejemplo se usa FoundryChatClient desde Microsoft Agent Framework y se conecta al punto de conexión mcP del cuadro de herramientas mediante FoundryToolbox. Instale versiones de paquete compatibles con pip install "agent-framework-foundry==1.15.0" "azure-ai-projects>=2.3.0,<2.8.0" jsonref, establezca la FOUNDRY_PROJECT_ENDPOINT variable de entorno e inicie sesión con az login. OpenApiToolboxTool es el modelo específico de la caja de herramientas; utilice OpenApiTool solo cuando adjunte la herramienta directamente a un agente de prompts.

import asyncio
import os
import jsonref
from typing import Any, cast

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox
from azure.identity import AzureCliCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    OpenApiToolboxTool,
    OpenApiFunctionDefinition,
    OpenApiProjectConnectionAuthDetails,
    OpenApiProjectConnectionSecurityScheme,
)

PROJECT_ENDPOINT = os.environ["FOUNDRY_PROJECT_ENDPOINT"]


async def main() -> None:
    credential = AzureCliCredential()

    # 1. Create the OpenAPI tool and add it to a toolbox. Using a toolbox is the
    #    recommended way to give agents tools: curate tools once and reuse the
    #    toolbox across agents. See /azure/foundry/agents/concepts/toolbox-overview
    project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)

    weather_asset_file_path = os.path.abspath(
        os.path.join(os.path.dirname(__file__), "../assets/weather_openapi.json")
    )
    with open(weather_asset_file_path, encoding="utf-8") as f:
        openapi_weather = cast(dict[str, Any], jsonref.loads(f.read()))

    weather_tool = OpenApiToolboxTool(
        openapi=OpenApiFunctionDefinition(
            name="get_weather",
            spec=openapi_weather,
            description="Retrieve weather information for a location.",
            auth=OpenApiProjectConnectionAuthDetails(
                security_scheme=OpenApiProjectConnectionSecurityScheme(
                    project_connection_id=os.environ["OPENAPI_CONNECTION_ID"]
                )
            ),
        )
    )

    toolbox = project.toolboxes.create_version(
        name="openapi-toolbox",
        description="Toolbox with the OpenAPI weather tool",
        tools=[weather_tool],
    )

    # 2. The toolbox exposes an MCP-compatible endpoint.
    TOOLBOX_MCP_URL = (
        f"{PROJECT_ENDPOINT}/toolboxes/{toolbox.name}"
        f"/versions/{toolbox.version}/mcp?api-version=v1"
    )

    # 3. Attach the toolbox to the hosted agent as an MCP tool.
    toolbox_tool = FoundryToolbox(credential, url=TOOLBOX_MCP_URL)

    agent = Agent(
        client=FoundryChatClient(credential=credential),
        instructions="You are a helpful assistant. Use the OpenAPI weather tool to answer questions.",
        tools=[toolbox_tool],
    )

        result = await agent.run("What's the weather in Seattle?")
        print(f"Agent: {result.text}")


if __name__ == "__main__":
    asyncio.run(main())

Salida esperada

Agent: The weather in Seattle is currently cloudy with a temperature of 52°F (11°C)...

Ejemplo de uso de agentes con la herramienta OpenAPI

En este ejemplo se muestra cómo usar los servicios descritos por una especificación de OpenAPI mediante un agente. Usa el servicio wttr.in para obtener el tiempo y su archivo de especificación weather_openapi.json. Seleccione Prompt Agents para usar el SDK de proyectos de IA de Azure para crear un agente de mensajes del lado servidor o Agentes hospedados para usar el marco del agente de Microsoft para crear un agente efímero en proceso.

Agentes rápidos

En este ejemplo se usan métodos sincrónicos de la biblioteca cliente de Azure AI Projects. Para ver un ejemplo que usa métodos asincrónicos, consulte el sample en el SDK de Azure para .NET repositorio en GitHub.

using System;
using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using OpenAI.Responses;

#pragma warning disable AAIP002

class OpenAPIDemo
{
    // Utility method to get the OpenAPI specification file from the Assets folder.
    private static string GetFile([CallerFilePath] string pth = "")
    {
        var dirName = Path.GetDirectoryName(pth) ?? "";
        return Path.Combine(dirName, "Assets", "weather_openapi.json");
    }

    public static void Main()
    {
        var projectEndpoint =
            Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
            ?? throw new InvalidOperationException(
                "Set FOUNDRY_PROJECT_ENDPOINT before running.");
        var deploymentName =
            Environment.GetEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME")
            ?? throw new InvalidOperationException(
                "Set FOUNDRY_MODEL_DEPLOYMENT_NAME before running.");

        // Create project client to call Foundry API
        AIProjectClient projectClient = new(
            endpoint: new Uri(projectEndpoint),
            tokenProvider: new DefaultAzureCredential());

        // The connection specifies anonymous authentication to the weather API.
        string filePath = GetFile();
        OpenApiFunctionDefinition toolDefinition = new(
            name: "get_weather",
            specification: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
            authentication: new OpenApiProjectConnectionAuthenticationDetails(
                new OpenApiProjectConnectionSecurityScheme(
                    Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
                    ?? throw new InvalidOperationException(
                        "Set OPENAPI_CONNECTION_ID before running.")))
        );
        toolDefinition.Description = "Retrieve weather information for a location.";
        OpenApiTool openapiTool = new(toolDefinition);

        // Create the agent definition and the agent version.
        DeclarativeAgentDefinition agentDefinition = new(model: deploymentName)
        {
            Instructions = "You are a helpful assistant.",
            Tools = { openapiTool }
        };
        ProjectsAgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
            agentName: "myAgent",
            options: new(agentDefinition));

        // Create a response object and ask the question about the weather in Seattle, WA.
        ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
        ResponseResult response = responseClient.CreateResponse(
                userInputText: "Use the OpenAPI tool to print out, what is the weather in Seattle, WA today."
            );
        Console.WriteLine(response.GetOutputText());

        // Finally, delete all the resources created in this sample.
        projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
    }
}

Qué hace este código

En este ejemplo de C# se crea un agente con una herramienta OpenAPI que recupera información meteorológica de wttr.in mediante la autenticación anónima. Al ejecutar el código:

  1. Lee la especificación de OpenAPI meteorológica de un archivo JSON local.
  2. Crea un agente con la herramienta de meteorología configurada.
  3. Envía una solicitud que pregunta sobre el tiempo de Seattle mediante la herramienta OpenAPI.
  4. El agente llama a la API weather y devuelve los resultados.
  5. Limpia eliminando el agente.

Entradas necesarias

  • Variables de entorno: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEy OPENAPI_CONNECTION_ID.
  • Archivo local: Assets/weather_openapi.json (especificación openAPI)

Salida esperada

The weather in Seattle, WA today is cloudy with temperatures around 52°F...

Errores comunes

  • FileNotFoundException: no se encuentra el archivo de especificación openAPI en la carpeta Assets
  • UnauthorizedAccessException: credenciales no válidas o permisos de RBAC insuficientes
  • Clave de API no insertada: compruebe que la especificación de OpenAPI incluye securitySchemes (en components) y security secciones con nombres de esquema coincidentes

Agentes hospedados

En este ejemplo se crea el cuadro de herramientas de OpenAPI con el SDK de proyectos de IA de Azure y, a continuación, se usa la integración de Microsoft Agent FrameworkAddFoundryToolboxes. Use un proyecto de ASP.NET Core con Azure.AI.AgentServer.Responses y Microsoft.Agents.AI.Foundry.Hosting, además de las dependencias de C# en Requisitos previos. Establezca FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEy OPENAPI_CONNECTION_ID, e inicie sesión con az login.

using System;
using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.AgentServer.Responses;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using Microsoft.AspNetCore.Builder;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;

string GetFile([CallerFilePath] string pth = "")
{
    var dirName = Path.GetDirectoryName(pth) ?? "";
    return Path.Combine(dirName, "Assets", "weather_openapi.json");
}

string projectEndpoint = Environment.GetEnvironmentVariable(
    "FOUNDRY_PROJECT_ENDPOINT")
    ?? throw new InvalidOperationException("Set FOUNDRY_PROJECT_ENDPOINT.");
string deploymentName = Environment.GetEnvironmentVariable(
    "FOUNDRY_MODEL_DEPLOYMENT_NAME")
    ?? throw new InvalidOperationException("Set FOUNDRY_MODEL_DEPLOYMENT_NAME.");
DefaultAzureCredential credential = new();

// 1. Create the OpenAPI tool and add it to a toolbox. Using a toolbox is the
//    recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
string filePath = GetFile();
OpenApiFunctionDefinition toolDefinition = new(
    name: "get_weather",
    specification: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
    authentication: new OpenApiProjectConnectionAuthenticationDetails(
        new OpenApiProjectConnectionSecurityScheme(
            Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
            ?? throw new InvalidOperationException(
                "Set OPENAPI_CONNECTION_ID before running.")))
);
toolDefinition.Description = "Retrieve weather information for a location.";
OpenApiToolboxTool openapiTool = new(toolDefinition);
ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
    .GetAgentToolboxes().CreateVersion(
        name: "openapi-toolbox",
        tools: [openapiTool],
        description: "Toolbox with the OpenAPI weather tool");
projectClient.AgentAdministrationClient.GetAgentToolboxes()
    .UpdateDefaultVersion(toolboxVersion.Name, toolboxVersion.Version);

// Create the hosted agent and register the toolbox integration.
AIAgent agent = projectClient.AsAIAgent(
    model: deploymentName,
    instructions: "You are a helpful assistant with access to the toolbox tools.",
    name: "hosted-toolbox-agent");

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.Services.AddFoundryToolboxes(credential, toolboxVersion.Name);

var app = builder.Build();
app.MapFoundryResponses();
app.Run();

Salida esperada

El ejemplo inicia un servidor HTTP. Cuando envía una solicitud de Responses que pregunta sobre el tiempo, el agente llama a la API a través de la caja de herramientas y devuelve las condiciones actuales:

The current weather in Seattle is <temperature> with <conditions>.

Para obtener el ejemplo completo, incluidos los patrones de API autenticados, consulte Agent_Step17_OpenAPITools.


Ejemplo de uso de agentes con la herramienta OpenAPI en el servicio web, lo que requiere autenticación

En este ejemplo, adjunta una herramienta OpenAPI autenticada directamente a un agente de prompts. Usa la especificación de TripAdvisor y una clave de API almacenada en una conexión de proyecto.

El servicio TripAdvisor requiere autenticación de clave de API. Cree la conexión del proyecto como se describe en Autenticarse con una clave de API y establezca OPENAPI_CONNECTION_ID en su identificador de recurso completo. El nombre de clave de la conexión debe coincidir con la especificación de TripAdvisor.

using System;
using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using OpenAI.Responses;

#pragma warning disable AAIP002

class OpenAPIConnectedDemo
{
    // Utility method to get the OpenAPI specification file from the Assets folder.
    private static string GetFile([CallerFilePath] string pth = "")
    {
        var dirName = Path.GetDirectoryName(pth) ?? "";
        return Path.Combine(dirName, "Assets", "tripadvisor_openapi.json");
    }

    public static void Main()
    {
        var projectEndpoint =
            Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
            ?? throw new InvalidOperationException(
                "Set FOUNDRY_PROJECT_ENDPOINT before running.");
        var deploymentName =
            Environment.GetEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME")
            ?? throw new InvalidOperationException(
                "Set FOUNDRY_MODEL_DEPLOYMENT_NAME before running.");

        // Create project client to call Foundry API
        AIProjectClient projectClient = new(
            endpoint: new Uri(projectEndpoint),
            tokenProvider: new DefaultAzureCredential());

        // Create an OpenAPI tool with authentication by project connection security scheme.
        string filePath = GetFile();
        var connectionId =
            Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
            ?? throw new InvalidOperationException(
                "Set OPENAPI_CONNECTION_ID to the TripAdvisor connection ID.");
        OpenApiFunctionDefinition toolDefinition = new(
            name: "tripadvisor",
            specification: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
            authentication: new OpenApiProjectConnectionAuthenticationDetails(new OpenApiProjectConnectionSecurityScheme(
                projectConnectionId: connectionId
            ))
        );
        toolDefinition.Description = "Trip Advisor API to get travel information.";
        OpenApiTool openapiTool = new(toolDefinition);

        // Create the agent definition and the agent version.
        DeclarativeAgentDefinition agentDefinition = new(model: deploymentName)
        {
            Instructions = "You are a helpful assistant.",
            Tools = { openapiTool }
        };
        ProjectsAgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
            agentName: "myAgent",
            options: new(agentDefinition));

        // Create a response object and ask the question about the hotels in France.
        // Test the Web service access before you run production scenarios.
        // It can be done by setting:
        // ToolChoice = ResponseToolChoice.CreateRequiredChoice()`
        // in the ResponseCreationOptions. This setting will
        // force Agent to use tool and will trigger the error if it is not accessible.
        ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
        CreateResponseOptions responseOptions = new()
        {
            ToolChoice = ResponseToolChoice.CreateRequiredChoice(),
            InputItems =
            {
                ResponseItem.CreateUserMessageItem("Recommend me 5 top hotels in paris, France."),
            }
        };
        ResponseResult response = responseClient.CreateResponse(
            options: responseOptions
        );
        Console.WriteLine(response.GetOutputText());

        // Finally, delete all the resources we have created in this sample.
        projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
    }
}

Qué hace este código

En este ejemplo de C# se usa una herramienta OpenAPI con autenticación de clave de API a través de una conexión de proyecto. Al ejecutar el código:

  1. Carga la especificación de OpenAPI de TripAdvisor desde un archivo local.
  2. Hace referencia a la conexión del proyecto de TripAdvisor que contiene la clave de API.
  3. Asocia la herramienta TripAdvisor al agente, configurado para usar la conexión para la autenticación.
  4. Envía una solicitud de recomendaciones de hotel en París.
  5. El agente llama a la API de TripAdvisor mediante la clave de API almacenada y devuelve resultados.
  6. Limpia eliminando el agente.

Entradas necesarias

  • Variables de entorno: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEy OPENAPI_CONNECTION_ID.
  • Archivo local: Assets/tripadvisor_openapi.json
  • Conexión del proyecto: tripadvisor con la clave de API válida configurada

Salida esperada

Here are 5 top hotels in Paris, France:
1. Hotel Name - Rating: 4.5/5, Location: ...
2. Hotel Name - Rating: 4.4/5, Location: ...
...

Errores comunes

  • ConnectionNotFoundException: No se encontró ninguna conexión de proyecto llamada tripadvisor.
  • AuthenticationException: clave de API no válida en la conexión del proyecto o configuración incorrecta securitySchemes o que falta en la especificación de OpenAPI.
  • Herramienta no utilizada: verifique que ToolChoice = ResponseToolChoice.CreateRequiredChoice() fuerza el uso de la herramienta.
  • La clave de API no se ha pasado a la API: asegúrese de que la especificación de OpenAPI tiene bien configuradas las secciones securitySchemes y security.

Creación de un agente de Java con funcionalidades de la herramienta OpenAPI

Esta Java configuración puede hacer referencia a herramientas de MCP, pero el SDK de Java aún no expone una API de creación de cuadros de herramientas.

Sugerencia

Recomendado: Para la mayoría de los agentes, agregue la herramienta OpenAPI a través de un cuadro de herramientas y adjunte el cuadro de herramientas al agente como una herramienta MCP. Cree el cuadro de herramientas mediante el ejemplo de Python, API REST, C#o TypeScript o el portal foundry y, a continuación, haga referencia a su punto de conexión de MCP desde el agente de Java como .McpTool

En los ejemplos siguientes se muestra cómo llamar a una herramienta OpenAPI mediante la API REST.

Obtención de un token de acceso:

AGENT_TOKEN=$(az account get-access-token --scope https://ai.azure.com/.default --query accessToken -o tsv)

Autenticación anónima

Agregue herramientas de OpenAPI a través de un cuadro de herramientas y, a continuación, adjunte el cuadro de herramientas al agente como una herramienta MCP. Para obtener más información, consulte ¿Qué es un cuadro de herramientas?

  1. Cree un cuadro de herramientas que contenga la herramienta meteorológica openAPI:
curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions?api-version=v1" \
  --header "Foundry-Features: Toolboxes=V1Preview" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "description": "Toolbox with the OpenAPI weather tool",
    "tools": [
      {
        "type": "openapi",
        "openapi": {
          "name": "weather",
          "description": "Tool to get weather data",
          "auth": {
            "type": "project_connection",
            "security_scheme": {
              "project_connection_id": "'$OPENAPI_CONNECTION_ID'"
            }
          },
          "spec": {
            "openapi": "3.1.0",
            "info": {
              "title": "get weather data",
              "description": "Retrieves current weather data for a location.",
              "version": "v1.0.0"
            },
            "servers": [{ "url": "https://wttr.in" }],
            "paths": {
              "/{location}": {
                "get": {
                  "description": "Get weather information for a specific location",
                  "operationId": "GetCurrentWeather",
                  "parameters": [
                    {
                      "name": "location",
                      "in": "path",
                      "description": "City or location to retrieve the weather for",
                      "required": true,
                      "schema": { "type": "string" }
                    },
                    {
                      "name": "format",
                      "in": "query",
                      "description": "Format in which to return data. Always use 3.",
                      "required": true,
                      "schema": { "type": "integer", "default": 3 }
                    }
                  ],
                  "responses": {
                    "200": {
                      "description": "Successful response",
                      "content": {
                        "text/plain": {
                          "schema": { "type": "string" }
                        }
                      }
                    },
                    "404": { "description": "Location not found" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

El cuadro de herramientas expone un punto de conexión compatible con MCP en $FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1, donde <version> es la versión devuelta por la llamada anterior.

  1. Crea una conexión de proyecto de herramienta remota que apunte al punto de conexión de la caja de herramientas, utilizando un token de usuario de Entra para que se transmita la identidad del solicitante (audience https://ai.azure.com).
azd ai connection create openapi-toolbox-conn \
  --kind remote-tool \
  --target "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1" \
  --auth-type user-entra-token \
  --audience https://ai.azure.com
  1. Cree una respuesta que use el cuadro de herramientas adjuntandola como una herramienta MCP.

    Establezca TOOLBOX_CONNECTION_ID en el identificador de recurso completo de openapi-toolbox-conn. Esta conexión es independiente de la conexión anónima de OpenAPI en OPENAPI_CONNECTION_ID. Sustituya <version> por la versión devuelta al crear el cuadro de herramientas.

curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  --header "Authorization: Bearer $AGENT_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
    "input": "Use the OpenAPI tool to get the weather in Seattle, WA today.",
    "tool_choice": "required",
    "tools": [
      {
        "type": "mcp",
        "server_label": "toolbox",
        "server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1",
        "require_approval": "never",
        "project_connection_id": "'$TOOLBOX_CONNECTION_ID'",
        "headers": {
          "Foundry-Features": "Toolboxes=V1Preview"
        }
      }
    ]
  }'

Autenticación de clave de API (conexión de proyecto)

Use esta variante solo después de que el flujo anónimo se realice correctamente. Descargue tripadvisor_openapi.json desde Antes de ejecutar los ejemplos de código. Configure la conexión de la clave de API y las entradas security y securitySchemes de la especificación, tal y como se describe en Autenticación con clave de API. Establezca OPENAPI_CONNECTION_ID en el identificador de recurso completo de esa conexión, no en la conexión meteorológica anónima.

En este ejemplo de Bash se usa jq para incluir la especificación en el mismo remote_tool formato de solicitud que los ejemplos de identidad administrada del proyecto.

jq -n \
  --arg model "$FOUNDRY_MODEL_DEPLOYMENT_NAME" \
  --arg connection_id "$OPENAPI_CONNECTION_ID" \
  --slurpfile spec tripadvisor_openapi.json \
  '{
    model: $model,
    input: "Recommend five top hotels in the United States.",
    tools: [
      {
        type: "remote_tool",
        tool_arguments: [
          {
            name: "openapi",
            arguments: {
              name: "tripadvisor",
              description: "TripAdvisor travel information.",
              auth: {
                type: "project_connection",
                security_scheme: {
                  project_connection_id: $connection_id
                }
              },
              spec: $spec[0]
            }
          }
        ]
      }
    ],
    tool_choice: "required"
  }' > openapi-api-key-request.json

curl --fail-with-body --request POST \
  --url "${FOUNDRY_PROJECT_ENDPOINT%/}/openai/v1/responses" \
  --header "Authorization: Bearer $AGENT_TOKEN" \
  --header "Content-Type: application/json" \
  --data @openapi-api-key-request.json

Para una API de token de portador, mantenga la misma project_connection forma de solicitud, pero use una conexión configurada como se describe en Configuración de una conexión de token de portador. El valor de conexión debe comenzar con Bearer seguido de un espacio.

Autenticación de identidad administrada

En el caso de la identidad administrada del proyecto, cree primero una conexión de proyecto de OpenAPI. A continuación, pase su ID de recurso completo en la solicitud de respuestas. Consulte el ejemplo de REST en Llamada a una herramienta OpenAPI con la identidad administrada del proyecto.

La identidad administrada de la cuenta solo se admite en suscripciones existentes para las herramientas de OpenAPI asociadas directamente a los agentes de prompt. No se admite en cajas de herramientas. Use también la identidad administrada del proyecto para los agentes de prompt. Migre las configuraciones existentes lo antes posible.

Qué hace este código

En este ejemplo de API REST se muestra cómo llamar a una herramienta OpenAPI con distintos métodos de autenticación. La solicitud:

  1. Para la autenticación anónima, crea un cuadro de herramientas que contiene la definición de la herramienta OpenAPI y la especificación de la API meteorológica.
  2. Crea una respuesta que adjunta el cuadro de herramientas como una herramienta MCP y pregunta sobre el tiempo de Seattle.
  3. Muestra una definición adicional de la herramienta REST directa para la autenticación de clave de API a través de una conexión de proyecto.
  4. El agente llama a la API seleccionada por la configuración de la herramienta y devuelve los resultados.

Entradas necesarias

  • Variables de entorno: FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • Para la autenticación anónima: OPENAPI_CONNECTION_ID, que hace referencia a la conexión anónima del proyecto OpenAPI y TOOLBOX_CONNECTION_ID, que hace referencia a la conexión MCP de Toolbox.
  • Para la autenticación de la clave de API: OPENAPI_CONNECTION_ID, que hace referencia a la conexión de la clave de API de TripAdvisor y tripadvisor_openapi.json.
  • Para la autenticación de identidad administrada del proyecto: OPENAPI_CONNECTION_ID, como se muestra en el ejemplo de identidad administrada del proyecto.
  • Especificación de OpenAPI insertada en el cuerpo de la solicitud.

Salida esperada

{
  "id": "resp_abc123",
  "object": "response",
  "output": [
    {
      "type": "message",
      "content": [
        {
          "type": "output_text",
          "text": "The weather in Seattle, WA today is cloudy with a temperature of 52°F (11°C)..."
        }
      ]
    }
  ]
}

Errores comunes

  • 401 Unauthorized: no es válido o falta AGENT_TOKENla clave de API o no se inserta porque securitySchemes y security faltan en la especificación de OpenAPI.
  • 404 Not Found: punto de conexión incorrecto o nombre de implementación del modelo
  • 400 Bad Request: especificación openAPI con formato incorrecto o configuración de autenticación no válida
  • Clave de API no enviada con solicitud: compruebe que la sección de la especificación de OpenAPI está configurada correctamente (no vacía) y coincide con el components.securitySchemes nombre de la clave de conexión del proyecto.

Creación de un agente con funcionalidades de la herramienta OpenAPI

En el siguiente ejemplo de código de TypeScript se muestra cómo crear un agente de IA con funcionalidades de herramientas de OpenAPI agregando la herramienta OpenAPI a un cuadro de herramientas y adjuntando el cuadro de herramientas como una herramienta MCP. El agente puede llamar a las API externas definidas por las especificaciones de OpenAPI. Para obtener una versión de JavaScript de este ejemplo, vea el sample en el repositorio SDK de Azure para JavaScript en GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import {
  AIProjectClient,
  OpenApiToolboxTool,
  OpenApiFunctionDefinition,
  OpenApiProjectConnectionAuthDetails,
} from "@azure/ai-projects";
import * as fs from "fs";
import * as path from "path";

function requiredEnv(name: string): string {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Set ${name} before running.`);
  }
  return value;
}
const PROJECT_ENDPOINT = requiredEnv("FOUNDRY_PROJECT_ENDPOINT");
const deploymentName = requiredEnv("FOUNDRY_MODEL_DEPLOYMENT_NAME");
const weatherSpecPath = path.resolve("assets", "weather_openapi.json");

function loadOpenApiSpec(specPath: string): unknown {
  if (!fs.existsSync(specPath)) {
    throw new Error(`OpenAPI specification not found at: ${specPath}`);
  }

  try {
    const data = fs.readFileSync(specPath, "utf-8");
    return JSON.parse(data);
  } catch (error) {
    throw new Error(`Failed to read or parse OpenAPI specification at ${specPath}: ${error}`);
  }
}

function createWeatherTool(spec: unknown): OpenApiToolboxTool {
  const connectionId = process.env.OPENAPI_CONNECTION_ID;
  if (!connectionId) {
    throw new Error("Set OPENAPI_CONNECTION_ID before running.");
  }
  const auth: OpenApiProjectConnectionAuthDetails = {
    type: "project_connection",
    security_scheme: {
      project_connection_id: connectionId,
    },
  };
  const definition: OpenApiFunctionDefinition = {
    name: "get_weather",
    description: "Retrieve weather information for a location using wttr.in",
    spec,
    auth,
  };

  return {
    type: "openapi",
    openapi: definition,
  };
}

export async function main(): Promise<void> {
  const weatherSpec = loadOpenApiSpec(weatherSpecPath);

  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  const weatherTool = createWeatherTool(weatherSpec);

  console.log("Creating a toolbox with the OpenAPI weather tool...");

  // 1. Add the OpenAPI tool to a toolbox. Using a toolbox is the recommended
  //    way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
  const toolbox = await project.toolboxes.createVersion(
    "openapi-toolbox",
    [weatherTool],
    { description: "Toolbox with the OpenAPI weather tool" },
  );

  // 2. The toolbox exposes an MCP-compatible endpoint.
  const toolboxMcpUrl =
    `${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
    `/versions/${toolbox.version}/mcp?api-version=v1`;

  // 3. Create a remote-tool project connection that points at the toolbox endpoint.
  //    Use a user Entra token so the caller's identity is passed through
  //    (audience https://ai.azure.com). Create the connection once, for example
  //    with the Azure Developer CLI:
  //
  //    azd ai connection create openapi-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionId = process.env.TOOLBOX_CONNECTION_ID;
  if (!toolboxConnectionId) {
    throw new Error("Set TOOLBOX_CONNECTION_ID to the toolbox connection ID.");
  }

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  const agent = await project.agents.createVersion("MyOpenApiAgent", {
    kind: "prompt",
    model: deploymentName,
    instructions:
      "You are a helpful assistant that can call external APIs defined by OpenAPI specs to answer user questions.",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "never",
        project_connection_id: toolboxConnectionId,
        headers: {
          "Foundry-Features": "Toolboxes=V1Preview",
        },
      },
    ],
  });

  // Send a request and stream the response
  const streamResponse = await openai.responses.create(
    {
      input:
        "What's the weather in Seattle and how should I plan my outfit for the day based on the forecast?",
      stream: true,
    },
    {
      body: {
        agent_reference: { name: agent.name, type: "agent_reference" },
        tool_choice: "required",
      },
    },
  );

  // Process the streaming response
  for await (const event of streamResponse) {
    if (event.type === "response.output_text.delta") {
      process.stdout.write(event.delta);
    } else if (event.type === "response.output_text.done") {
      console.log("\n");
    }
  }

  // Clean up resources
  await project.agents.deleteVersion(agent.name, agent.version);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exitCode = 1;
});

Qué hace este código

En este ejemplo de TypeScript se crea un agente con una herramienta OpenAPI para los datos meteorológicos mediante la autenticación anónima. Al ejecutar el código:

  1. Carga la especificación de OpenAPI meteorológica desde un archivo JSON local.
  2. Crea una versión de la caja de herramientas que contenga la herramienta meteorológica.
  3. Adjunta la caja de herramientas al agente como una herramienta MCP y, a continuación, envía una solicitud en streaming en la que se pregunta por el tiempo en Seattle y qué ponerse.
  4. Procesa la respuesta de streaming y muestra deltas a medida que llegan.
  5. Fuerza el uso de la herramienta utilizando tool_choice: "required" para garantizar que se llame a la API.
  6. Limpia eliminando el agente.

Entradas necesarias

  • Variables de entorno: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAME, OPENAPI_CONNECTION_IDy TOOLBOX_CONNECTION_ID.
  • Archivo local: assets/weather_openapi.json (especificación openAPI).

Salida esperada

Creating a toolbox with the OpenAPI weather tool...
The weather in Seattle is <conditions>. Consider wearing <suggestion>.

Errores comunes

  • Error: OpenAPI specification not found: Ruta de acceso del archivo incorrecta o archivo faltante
  • AuthenticationError: credenciales de Azure no válidas
  • Clave de API que no funciona: si cambia de autenticación anónima a clave de API, asegúrese de que la especificación de OpenAPI tenga securitySchemes y security configure correctamente.

Creación de un agente que use herramientas de OpenAPI autenticadas con una conexión de proyecto

En el siguiente ejemplo de código de TypeScript se muestra cómo crear un agente de IA que use herramientas de OpenAPI autenticadas a través de una conexión de proyecto. El agente carga la especificación de OpenAPI de TripAdvisor desde recursos locales y puede invocar la API a través de la conexión de proyecto configurada. Para obtener una versión de JavaScript de este ejemplo, vea el sample en el repositorio SDK de Azure para JavaScript en GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import {
  AIProjectClient,
  OpenApiTool,
  OpenApiFunctionDefinition,
  OpenApiProjectConnectionAuthDetails,
} from "@azure/ai-projects";
import * as fs from "fs";
import * as path from "path";

function requiredEnv(name: string): string {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Set ${name} before running.`);
  }
  return value;
}
const PROJECT_ENDPOINT = requiredEnv("FOUNDRY_PROJECT_ENDPOINT");
const deploymentName = requiredEnv("FOUNDRY_MODEL_DEPLOYMENT_NAME");
const connectionId = requiredEnv("OPENAPI_CONNECTION_ID");
const tripAdvisorSpecPath = path.resolve("assets", "tripadvisor_openapi.json");

function loadOpenApiSpec(specPath: string): unknown {
  if (!fs.existsSync(specPath)) {
    throw new Error(`OpenAPI specification not found at: ${specPath}`);
  }

  try {
    const data = fs.readFileSync(specPath, "utf-8");
    return JSON.parse(data);
  } catch (error) {
    throw new Error(`Failed to read or parse OpenAPI specification at ${specPath}: ${error}`);
  }
}

function createTripAdvisorTool(spec: unknown): OpenApiTool {
  const auth: OpenApiProjectConnectionAuthDetails = {
    type: "project_connection",
    security_scheme: {
      project_connection_id: connectionId,
    },
  };

  const definition: OpenApiFunctionDefinition = {
    name: "get_tripadvisor_location_details",
    description:
      "Fetch TripAdvisor location details, reviews, or photos using the Content API via project connection auth.",
    spec,
    auth,
  };

  return {
    type: "openapi",
    openapi: definition,
  };
}

export async function main(): Promise<void> {
  const tripAdvisorSpec = loadOpenApiSpec(tripAdvisorSpecPath);

  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  // Create an agent with the OpenAPI project-connection tool
  const agent = await project.agents.createVersion("MyOpenApiConnectionAgent", {
    kind: "prompt",
    model: deploymentName,
    instructions:
      "You are a travel assistant that consults the TripAdvisor Content API via project connection to answer user questions about locations.",
    tools: [createTripAdvisorTool(tripAdvisorSpec)],
  });

  // Send a request and stream the response
  const streamResponse = await openai.responses.create(
    {
      input:
        "Provide a quick overview of the TripAdvisor location 293919 including its name, rating, and review count.",
      stream: true,
    },
    {
      body: {
        agent_reference: { name: agent.name, type: "agent_reference" },
        tool_choice: "required",
      },
    },
  );

  // Process the streaming response
  for await (const event of streamResponse) {
    if (event.type === "response.output_text.delta") {
      process.stdout.write(event.delta);
    } else if (event.type === "response.output_text.done") {
      console.log("\n");
    }
  }

  // Clean up resources
  await project.agents.deleteVersion(agent.name, agent.version);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exitCode = 1;
});

Qué hace este código

En este ejemplo de TypeScript se muestra el uso de una herramienta OpenAPI con autenticación de clave de API a través de una conexión de proyecto. Al ejecutar el código:

  1. Carga la especificación de OpenAPI de TripAdvisor desde un archivo local.
  2. Hace referencia a la conexión de clave de API mediante OPENAPI_CONNECTION_ID.
  3. Crea un agente con la herramienta TripAdvisor que usa la conexión del proyecto para la autenticación de clave de API.
  4. Envía una solicitud de transmisión para obtener los detalles de la ubicación de TripAdvisor.
  5. Fuerza el uso de la herramienta utilizando tool_choice: "required" para garantizar que se llame a la API.
  6. Procesa y muestra la respuesta en streaming.
  7. Limpia eliminando el agente.

Entradas necesarias

  • Variables de entorno: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEy OPENAPI_CONNECTION_ID.
  • Archivo local: ../assets/tripadvisor_openapi.json
  • Conexión del proyecto configurada con la clave de API de TripAdvisor

Salida esperada

Location 293919: <name>, rating: <rating>, review count: <count>.

Errores comunes

  • Error: OpenAPI specification not found: compruebe la ruta de acceso del archivo.
  • Conexión no encontrada: compruebe que OPENAPI_CONNECTION_ID es el identificador de recurso completo de la conexión de la clave de API.
  • AuthenticationException: clave de API no válida en la conexión del proyecto.
  • Clave de API no insertada en solicitudes: la especificación de OpenAPI debe incluir secciones adecuadas securitySchemes (en components) y security. El nombre de clave de securitySchemes debe coincidir con la clave de la conexión del proyecto.
  • Content type is not supported: actualmente, solo se admiten estos dos tipos de contenido de cuerpo de solicitud: application/json y application/json-patch+json. Los tipos de contenido de respuesta no están restringidos.

Consideraciones sobre seguridad y datos

Al conectar un agente a una herramienta OpenAPI, el agente puede enviar parámetros de solicitud derivados de la entrada del usuario a la API de destino.

  • Use conexiones de proyecto para secretos (claves de API y tokens). Evite colocar secretos en un archivo de especificación de OpenAPI o código fuente.
  • Revise los datos que recibe la API y lo que devuelve antes de usar la herramienta en producción.
  • Use el acceso con privilegios mínimos. Asigne a la identidad administrada del proyecto solo los roles que requiere el servicio de destino.

Autenticación con clave de API

Use esta variante para una API que espera una clave en un encabezado o parámetro de consulta. Solo puede usar un esquema de seguridad de clave de API por herramienta OpenAPI. Si la API requiere varios esquemas de seguridad, cree varias herramientas de OpenAPI.

  1. Actualice los esquemas de seguridad de las especificaciones de OpenAPI. Tiene una securitySchemes sección y uno esquema de tipo apiKey. Por ejemplo:

     "securitySchemes": {
         "apiKeyHeader": {
                 "type": "apiKey",
                 "name": "x-api-key",
                 "in": "header"
             }
     }
    

    Normalmente, solo es necesario actualizar el name campo , que corresponde al nombre de key en la conexión. Si los esquemas de seguridad incluyen varios esquemas, mantenga solo uno de ellos.

  2. Actualice la especificación de OpenAPI para incluir una security sección:

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. Quite cualquier parámetro de la especificación de OpenAPI que necesite clave de API, ya que la clave de API se almacena y pasa a través de una conexión, como se describe más adelante en este artículo.

  4. Cree una conexión para almacenar la clave de API.

  5. Vaya al portal de Foundry y abra el proyecto.

  6. Cree o seleccione una conexión que almacene el secreto. Consulte Agregar una nueva conexión al proyecto.

    Nota

    Si vuelve a generar la clave de API en una fecha posterior, debe actualizar la conexión con la nueva clave.

  7. Escriba la siguiente información.

    • clave: campo name del esquema de seguridad. En este ejemplo, debe ser x-api-key

             "securitySchemes": {
                "apiKeyHeader": {
                          "type": "apiKey",
                          "name": "x-api-key",
                          "in": "header"
                      }
              }
      
    • valor: YOUR_API_KEY

  8. Después de crear una conexión, puede usarla a través del SDK o la API REST. Use las pestañas de la parte superior de este artículo para ver ejemplos de código.

Configurar una conexión de token de portador

Use esta variante para una API que espera un token de portador en el Authorization encabezado. Usa el mismo tipo de autenticación project_connection que la autenticación mediante clave de API, pero el esquema de seguridad de OpenAPI y los valores de conexión son diferentes.

La especificación de OpenAPI tendrá este aspecto:

  BearerAuth:
    type: http
    scheme: bearer
    bearerFormat: JWT

Debe hacer lo siguiente:

  1. Actualice la especificación securitySchemes de OpenAPI para usarla Authorization como nombre de encabezado:

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Agregue una security sección que haga referencia al esquema:

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Cree una conexión de claves personalizadas en el proyecto de Foundry.

    1. Vaya al portal de Foundry y abra el proyecto.
    2. Cree o seleccione una conexión que almacene el secreto. Consulte Agregar una nueva conexión al proyecto.
    3. Escriba los valores siguientes:
      • key: Authorization (debe coincidir con el name campo de su securitySchemes)
      • value: Bearer <token> (reemplace <token> por su token correspondiente)

    Importante

El valor debe incluir la palabra Bearer seguida de un espacio antes del token. Por ejemplo: Bearer eyJhbGciOiJSUzI1NiIs.... Si omite el prefijo Bearer y el espacio siguiente, la API recibe un token en bruto sin el prefijo requerido del esquema de autorización, y la solicitud falla.

  1. Después de crear la conexión, úsela con el tipo de autenticación project_connection en su código, de la misma manera que lo haría para la autenticación de clave API. El identificador de conexión usa el mismo formato: /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Autenticación mediante la identidad administrada (Microsoft Entra ID)

Microsoft Entra ID es un servicio de administración de acceso e identidades basado en la nube que los empleados pueden usar para acceder a recursos externos. Con Microsoft Entra ID, puede agregar seguridad adicional a las API sin necesidad de usar claves de API. Al configurar la autenticación de identidad administrada, el agente se autentica a través de la herramienta Foundry que usa.

Importante

La autenticación de identidad administrada solo funciona cuando el servicio de destino acepta tokens Microsoft Entra ID. Si la API de destino usa un esquema de autenticación personalizado que no admite Microsoft Entra ID, use clave API o token Bearer en su lugar.

Soporte para identidades administradas

Para la autenticación de identidad administrada, las herramientas de OpenAPI de los cuadros de herramientas siempre han requerido la identidad administrada del proyecto Foundry. Este requisito se aplica a todas las suscripciones.

Para las herramientas de OpenAPI asociadas directamente a los agentes de prompt, las suscripciones nuevas a las herramientas de OpenAPI deben usar la identidad administrada del proyecto. Las suscripciones existentes admiten ambas identidades en esa ruta de acceso, pero se recomienda la identidad administrada del proyecto. Migre las configuraciones existentes de identidad administrada por la cuenta lo antes posible.

Ruta de acceso de la herramienta OpenAPI Subscription Identidad administrada compatible
Herramienta adjunta a través de una caja de herramientas. Todas las suscripciones. Solo la identidad administrada del proyecto Foundry desde que se introdujeron las cajas de herramientas. No se admite la identidad administrada de la cuenta.
Herramienta asociada directamente a un agente de prompt. Nueva suscripción a las herramientas de OpenAPI. Solo para la identidad administrada del proyecto Foundry. No se admite la identidad administrada de la cuenta.
Herramienta asociada directamente a un agente de prompt. Suscripción existente que ya ha usado herramientas de OpenAPI. Tanto la identidad administrada de la cuenta de Foundry como la identidad administrada del proyecto de Foundry. Se recomienda la identidad administrada del proyecto; migre de la identidad administrada de la cuenta lo antes posible.

Asigne a la identidad administrada del proyecto el rol con privilegios mínimos que permite las operaciones de API necesarias en el servicio de destino.

Las dos identidades usan configuraciones de autenticación diferentes:

  • La identidad administrada del proyecto requiere una conexión OpenAPI en el proyecto de Foundry con authType: "ProjectManagedIdentity". Pase el identificador completo del recurso ARM de esa conexión en auth.security_scheme.project_connection_id, con auth.type: "project_connection".
  • Identidad administrada por la cuenta, compatible solo con herramientas asociadas directamente a agentes de prompt en suscripciones existentes, usa auth.type: "managed_identity" y pasa directamente el audience del servicio de destino en la definición de la herramienta. Esta configuración no se admite en barras de herramientas, no selecciona la identidad administrada del proyecto y no es la opción Identidad administrada del portal.

Migrar de la identidad administrada de cuenta a la identidad administrada de proyecto

Estos pasos de migración se aplican a las herramientas de OpenAPI asociadas directamente a los agentes de prompt de las suscripciones existentes. Las cajas de herramientas ya requieren la identidad administrada por el proyecto. Use la identidad administrada del proyecto para las nuevas configuraciones y migre lo antes posible las configuraciones existentes de identidad administrada de la cuenta de prompt-agent:

  1. Asigne a la identidad administrada del proyecto Foundry el rol con privilegios mínimos necesarios en el servicio de destino. Una asignación de roles de identidad administrada de cuenta no se aplica a la identidad del proyecto.
  2. Cree una conexión de proyecto de OpenAPI con authType: "ProjectManagedIdentity", el punto de conexión de destino y la audiencia esperada por la API de destino.
  3. Reemplace la configuración de audiencia directa managed_identity de la herramienta por auth.type: "project_connection". Pase el identificador de recurso ARM completo de la conexión en auth.security_scheme.project_connection_id.
  4. Llame a la herramienta para comprobar que la identidad administrada del proyecto puede acceder a la API de destino.
  5. Quite la asignación del rol del servicio de destino de la identidad de la cuenta solo después de confirmar que ninguna otra carga de trabajo la necesite.

Comprender el URI de audiencia

El audience (a veces denominado resource identifier o Application ID URI) indica Microsoft Entra ID a qué servicio o API está destinado el token. El valor de audiencia debe coincidir con lo que espera el servicio de destino o se produce un error de autenticación 401.

Nota

El público no es el punto de conexión del proyecto Foundry. Es el identificador de recurso del servicio de destino al que llama la herramienta OpenAPI.

En la tabla siguiente se enumeran los URI de audiencia para los servicios comunes de Azure:

Servicio de destino URI de audiencia
Azure Storage https://storage.azure.com
Azure Key Vault https://vault.azure.net
Búsqueda de Azure AI https://search.azure.com
Traductor de Azure https://cognitiveservices.azure.com
Azure Logic Apps Audiencia configurada para la autorización de Microsoft Entra ID del flujo de trabajo. Consulte Proteja el acceso a las aplicaciones lógicas.
Azure API Management (plano de administración) https://management.azure.com
API protegida por un registro de aplicación de Microsoft Entra (incluido APIM con OAuth) El URI del identificador de aplicación del registro de la aplicación (por ejemplo, api://<client-id>)

Sugerencia

Si usa Azure API Management para proteger una API personalizada con una directiva de validación de OAuth 2.0, el público es el URI de id. de aplicación del registro de aplicaciones que protege la API, no https://management.azure.com. El público del plano de administración solo se aplica a las operaciones de Azure Resource Manager en el propio recurso de APIM.

Para obtener más información sobre cómo los agentes se autentican con Microsoft Entra ID, consulte Agent identity and authentication.

Búsqueda y comprobación de la audiencia

Siga estos pasos para determinar y comprobar el valor de audiencia correcto:

  • Para servicios de Azure: compruebe la documentación del servicio para ver su identificador de recursos de Microsoft Entra ID. La mayoría de los servicios Azure enumeran el URI de audiencia en su documentación de autenticación.
  • Para APIs protegidas por un registro de aplicación de Microsoft Entra: en el portal de Azure, vaya a Microsoft Entra ID>Registros de aplicaciones> seleccione su aplicación >Exponer una API. El URI del identificador de aplicación de la parte superior de la página es el valor de audiencia.
  • Para verificar el público de un token: descodifique el token de acceso en https://jwt.ms y compruebe la reclamación aud. El aud valor debe coincidir con la audiencia que espera el servicio de destino.

Configurar la autenticación de identidades administradas

Para configurar la autenticación de identidad administrada del proyecto:

  1. Use la identidad administrada del proyecto Foundry para las nuevas configuraciones. Asegúrese de que la identidad administrada del proyecto está habilitada. La identidad administrada de la cuenta es una opción heredada solo para las herramientas asociadas directamente a los agentes de prompt en suscripciones existentes; migre esas configuraciones lo antes posible.
  2. Cree o identifique el servicio de destino al que llama la herramienta OpenAPI.
  3. Asigne el acceso necesario a la identidad administrada del proyecto Foundry sobre el recurso de destino.
    1. Seleccione Access Control para el recurso.

    2. Seleccione Agregar y agregue la asignación de roles en la parte superior de la pantalla.

      Captura de pantalla del portal de Azure que muestra la acción Agregar asignación de roles.

    3. Seleccione el rol del plano de datos o de la aplicación con el menor nivel de privilegios que permita realizar las operaciones definidas en su especificación OpenAPI. El acceso de Lector de Azure Resource Manager por sí solo no concede acceso al plano de datos. A continuación, seleccione Siguiente.

    4. Seleccione Identidad administrada y, a continuación, seleccione Miembros.

    5. Seleccione la identidad administrada del proyecto Foundry.

    6. Seleccione Finalizar.

  4. Cree una conexión de identidad administrada por proyecto y pase su identificador de recurso completo en la definición de la herramienta.

Crear una conexión de identidad administrada de proyecto

Cree la conexión en el mismo proyecto Foundry que envía la solicitud de respuestas. La conexión almacena el punto de conexión de destino y la audiencia, no una clave de API ni un token de acceso.

En el ejemplo de Bash siguiente se usa CLI de Azure y curl para crear una conexión openAPI para Azure Translator en Foundry Tools. Inicie sesión primero con az login. Reemplace los marcadores de posición por su suscripción, grupo de recursos, cuenta de Foundry, proyecto y recurso Translator.

SUB="<subscription-id>"
RESOURCE_GROUP="<resource-group>"
ACCOUNT="<foundry-account-name>"
PROJECT_NAME="<foundry-project-name>"
CONNECTION_NAME="translator-project-mi"
TRANSLATOR_ENDPOINT="https://<translator-resource>.cognitiveservices.azure.com"

PROJECT="/subscriptions/$SUB/resourceGroups/$RESOURCE_GROUP"
PROJECT="$PROJECT/providers/Microsoft.CognitiveServices"
PROJECT="$PROJECT/accounts/$ACCOUNT/projects/$PROJECT_NAME"
export OPENAPI_CONNECTION_ID="$PROJECT/connections/$CONNECTION_NAME"

ARM_TOKEN="$(az account get-access-token \
  --subscription "$SUB" \
  --resource https://management.azure.com \
  --query accessToken -o tsv)"

curl --fail-with-body --request PUT \
  --url "https://management.azure.com$OPENAPI_CONNECTION_ID?api-version=2025-06-01" \
  --header "Authorization: Bearer $ARM_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "properties": {
      "category": "OpenAPI",
      "authType": "ProjectManagedIdentity",
      "target": "'"$TRANSLATOR_ENDPOINT"'/",
      "audience": "https://cognitiveservices.azure.com",
      "metadata": {
        "type": "openapi"
      }
    }
  }'

Referencia: esquema de recursos de conexión del proyecto Foundry.

Mantenga OPENAPI_CONNECTION_ID para los ejemplos de idioma. Utilice el identificador de recurso de conexión completo, no solo el nombre de la conexión. La audiencia pertenece a la conexión; no pase la audiencia de una identidad administrada de cuenta en lugar del identificador de conexión.

Llamada a una herramienta OpenAPI con identidad administrada del proyecto

Estos ejemplos llaman a Azure Translator a través de la conexión que creó. Envían una especificación OpenAPI integrada en un payload remote_tool al endpoint Responses.

Antes de ejecutar un ejemplo:

  • Asigne a la identidad administrada del proyecto el rol de servicio de destino necesario para la traducción.
  • Cree la conexión de OpenAPI con authType: "ProjectManagedIdentity" como se describe en Crear una conexión de identidad administrada del proyecto.
  • Establezca FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEy OPENAPI_CONNECTION_ID. La conexión debe pertenecer a este proyecto.
  • Guarde la especificación siguiente como translator_openapi.json en el directorio donde se ejecuta el ejemplo. Reemplace <translator-resource> por el recurso usado en la target de la conexión.
{
  "openapi": "3.0.1",
  "info": {
    "title": "Azure Translator Service",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://<translator-resource>.cognitiveservices.azure.com/translator/text/v3.0/"
    }
  ],
  "paths": {
    "/translate": {
      "post": {
        "operationId": "Translator_Translate",
        "description": "Translate text into one or more languages.",
        "parameters": [
          {
            "name": "api-version",
            "in": "query",
            "required": true,
            "schema": { "type": "string", "default": "3.0" }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "text": { "type": "string" }
                  },
                  "required": ["text"]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Translation response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "translations": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "text": { "type": "string" },
                            "to": { "type": "string" }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Referencia: operación translate de Translator.

La entidad que realiza la llamada se autentica en Foundry con una credencial de identidad de Azure. Foundry resuelve la autenticación con Translator desde la conexión del proyecto y usa la identidad administrada del proyecto.

Instale las dependencias con pip install openai azure-identity.

import json
import os

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import OpenAI


def main() -> None:
    with open("translator_openapi.json", encoding="utf-8") as spec_file:
        spec = json.load(spec_file)

    tool = {
        "type": "remote_tool",
        "tool_arguments": [
            {
                "name": "openapi",
                "arguments": {
                    "name": "language",
                    "description": "Azure Translator API for text translation.",
                    "default_params": ["api-version"],
                    "auth": {
                        "type": "project_connection",
                        "security_scheme": {
                            "project_connection_id": os.environ[
                                "OPENAPI_CONNECTION_ID"
                            ],
                        },
                    },
                    "spec": spec,
                },
            }
        ],
    }

    with DefaultAzureCredential() as credential:
        token_provider = get_bearer_token_provider(
            credential, "https://ai.azure.com/.default"
        )
        with OpenAI(
            base_url=(
                os.environ["FOUNDRY_PROJECT_ENDPOINT"].rstrip("/")
                + "/openai/v1/"
            ),
            api_key=token_provider,
        ) as client:
            response = client.responses.create(
                model=os.environ["FOUNDRY_MODEL_DEPLOYMENT_NAME"],
                input="Translate 'Hello, how are you?' to Spanish.",
                extra_body={
                    "tools": [tool],
                    "tool_choice": "required",
                },
            )
            print(response.output_text)


if __name__ == "__main__":
    main()

Referencia: proveedor de tokens de Azure Identity.

El argumento extra_body pasa la carga útil específica del servicio remote_tool sin necesidad de un modelo tipado de herramienta OpenAPI en el SDK de OpenAI.

Use .NET 8 o posterior e instale la biblioteca de credenciales con dotnet add package Azure.Identity. En este ejemplo se envía la carga útil de la herramienta específica del servicio con HttpClient.

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using Azure.Core;
using Azure.Identity;

static string RequiredEnvironmentVariable(string name) =>
    Environment.GetEnvironmentVariable(name)
    ?? throw new InvalidOperationException($"Set {name} before running.");

string endpoint = RequiredEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
string model = RequiredEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME");
string connectionId = RequiredEnvironmentVariable("OPENAPI_CONNECTION_ID");
JsonElement spec = JsonSerializer.Deserialize<JsonElement>(
    File.ReadAllText("translator_openapi.json"));

var tool = new
{
    type = "remote_tool",
    tool_arguments = new[]
    {
        new
        {
            name = "openapi",
            arguments = new
            {
                name = "language",
                description = "Azure Translator API for text translation.",
                default_params = new[] { "api-version" },
                auth = new
                {
                    type = "project_connection",
                    security_scheme = new
                    {
                        project_connection_id = connectionId
                    }
                },
                spec
            }
        }
    }
};

var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
    new TokenRequestContext(new[] { "https://ai.azure.com/.default" }));
using var client = new HttpClient();
using var request = new HttpRequestMessage(
    HttpMethod.Post, $"{endpoint.TrimEnd('/')}/openai/v1/responses");
request.Headers.Authorization =
    new AuthenticationHeaderValue("Bearer", token.Token);
request.Content = JsonContent.Create(new
{
    model,
    input = "Translate 'Hello, how are you?' to Spanish.",
    tools = new[] { tool },
    tool_choice = "required"
});
using HttpResponseMessage response = await client.SendAsync(request);
string responseBody = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
    throw new HttpRequestException(
        $"HTTP {(int)response.StatusCode}: {responseBody}");
}
Console.WriteLine(responseBody);

Referencia: DefaultAzureCredential, HttpClient.

Utilice Node.js 20 o posterior e instale la biblioteca de credenciales con npm install @azure/identity. Guarde este ejemplo de JavaScript como openapi-project-mi.mjs.

import { readFile } from "node:fs/promises";
import { DefaultAzureCredential } from "@azure/identity";

function requiredEnvironmentVariable(name) {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Set ${name} before running.`);
  }
  return value;
}

const endpoint = requiredEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
const model = requiredEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME");
const connectionId = requiredEnvironmentVariable("OPENAPI_CONNECTION_ID");
const spec = JSON.parse(
  await readFile("translator_openapi.json", "utf8"),
);

const tool = {
  type: "remote_tool",
  tool_arguments: [
    {
      name: "openapi",
      arguments: {
        name: "language",
        description: "Azure Translator API for text translation.",
        default_params: ["api-version"],
        auth: {
          type: "project_connection",
          security_scheme: {
            project_connection_id: connectionId,
          },
        },
        spec,
      },
    },
  ],
};

const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");
const response = await fetch(
  `${endpoint.replace(/\/$/, "")}/openai/v1/responses`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${token.token}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model,
      input: "Translate 'Hello, how are you?' to Spanish.",
      tools: [tool],
      tool_choice: "required",
    }),
  },
);
const responseBody = await response.text();
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${responseBody}`);
}
console.log(responseBody);

Referencia: DefaultAzureCredential.

Utilice Java 11 o una versión posterior. Agregue com.azure:azure-identity y com.fasterxml.jackson.core:jackson-databind a las dependencias de Maven. En este ejemplo se envía la carga útil de la herramienta específica del servicio con el cliente HTTP de Java.

import com.azure.core.credential.AccessToken;
import com.azure.core.credential.TokenRequestContext;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class OpenApiProjectMi {
    private static String requiredEnvironmentVariable(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) {
            throw new IllegalStateException("Set " + name + " before running.");
        }
        return value;
    }

    public static void main(String[] args) throws Exception {
        String endpoint = requiredEnvironmentVariable(
            "FOUNDRY_PROJECT_ENDPOINT");
        String model = requiredEnvironmentVariable(
            "FOUNDRY_MODEL_DEPLOYMENT_NAME");
        String connectionId = requiredEnvironmentVariable(
            "OPENAPI_CONNECTION_ID");
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> spec = mapper.readValue(
            new File("translator_openapi.json"),
            new TypeReference<Map<String, Object>>() { });

        Map<String, Object> tool = Map.of(
            "type", "remote_tool",
            "tool_arguments", List.of(Map.of(
                "name", "openapi",
                "arguments", Map.of(
                    "name", "language",
                    "description",
                        "Azure Translator API for text translation.",
                    "default_params", List.of("api-version"),
                    "auth", Map.of(
                        "type", "project_connection",
                        "security_scheme", Map.of(
                            "project_connection_id", connectionId)),
                    "spec", spec))));
        Map<String, Object> body = Map.of(
            "model", model,
            "input", "Translate 'Hello, how are you?' to Spanish.",
            "tools", List.of(tool),
            "tool_choice", "required");

        var credential = new DefaultAzureCredentialBuilder().build();
        AccessToken token = Objects.requireNonNull(credential.getToken(
            new TokenRequestContext()
                .addScopes("https://ai.azure.com/.default")).block());
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(endpoint.replaceAll("/$", "")
                + "/openai/v1/responses"))
            .header("Authorization", "Bearer " + token.getToken())
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(
                mapper.writeValueAsString(body)))
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request, HttpResponse.BodyHandlers.ofString());
        if (response.statusCode() < 200 || response.statusCode() >= 300) {
            throw new IllegalStateException(
                "HTTP " + response.statusCode() + ": " + response.body());
        }
        System.out.println(response.body());
    }
}

Referencia: DefaultAzureCredentialBuilder.

Use Bash, CLI de Azure, curl y jq para compilar la solicitud desde translator_openapi.json. El token de llamada tiene como destino Foundry, no Azure Resource Manager ni Translator.

AGENT_TOKEN="$(az account get-access-token \
  --resource https://ai.azure.com \
  --query accessToken -o tsv)"

jq -n \
  --arg model "$FOUNDRY_MODEL_DEPLOYMENT_NAME" \
  --arg connection_id "$OPENAPI_CONNECTION_ID" \
  --slurpfile spec translator_openapi.json \
  '{
    model: $model,
    input: "Translate '\''Hello, how are you?'\'' to Spanish.",
    tools: [
      {
        type: "remote_tool",
        tool_arguments: [
          {
            name: "openapi",
            arguments: {
              name: "language",
              description: "Azure Translator API for text translation.",
              default_params: ["api-version"],
              auth: {
                type: "project_connection",
                security_scheme: {
                  project_connection_id: $connection_id
                }
              },
              spec: $spec[0]
            }
          }
        ]
      }
    ],
    tool_choice: "required"
  }' > openapi-project-mi-request.json

curl --fail-with-body --request POST \
  --url "${FOUNDRY_PROJECT_ENDPOINT%/}/openai/v1/responses" \
  --header "Authorization: Bearer $AGENT_TOKEN" \
  --header "Content-Type: application/json" \
  --data @openapi-project-mi-request.json

Referencia: CLI de Azure tokens de acceso.

La respuesta contiene una traducción al español de "Hello, how are you?" El ejemplo de Python imprime el texto de la respuesta. Los ejemplos HTTP imprimen la respuesta JSON completa, incluida la salida de la herramienta y el mensaje del asistente.

Solución de errores comunes

Síntoma Causa probable Resolución
La clave de API no se incluye en las solicitudes. Faltan especificaciones de OpenAPI o secciones securitySchemes o security Compruebe que la especificación de OpenAPI incluye tanto components.securitySchemes como una sección de nivel superior security. Asegúrese de que el esquema name coincide con el nombre de clave en la conexión del proyecto.
El agente no llama a la herramienta OpenAPI. Opción de herramienta no establecida o operationId no descriptiva. Use tool_choice="required" para forzar la invocación de herramientas. Asegúrese operationId de que los valores son descriptivos para que el modelo pueda elegir la operación correcta.
La autenticación de la identidad administrada del proyecto falla. La identidad administrada del proyecto no está habilitada o falta su asignación de roles. Compruebe que la identidad administrada del proyecto Foundry está habilitada y tiene el rol de la aplicación o del plano de datos con privilegios mínimos del servicio de destino para las operaciones de la especificación de OpenAPI.
No se usa la identidad administrada de Project. La herramienta usa la configuración de audiencia directa managed_identity en lugar de una conexión de proyecto. Cree una conexión de OpenAPI con authType: "ProjectManagedIdentity". Establezca el auth.type de la herramienta en project_connection y auth.security_scheme.project_connection_id en el identificador de recurso de conexión completo.
La identidad administrada del proyecto devuelve 401 aunque el rol esté asignado. El URI de audiencia de la conexión no coincide con lo que espera el servicio de destino. Compruebe el URI de audiencia en la conexión ProjectManagedIdentity comparándolo con la documentación del servicio de destino. Para las API protegidas por Microsoft Entra ID, use el URI de identificador de aplicación del registro de la aplicación. Consulte Descripción del URI de audiencia.
El token de identidad administrada de Project fue rechazado por la API de destino. El servicio de destino no acepta tokens de Microsoft Entra ID. Confirme que el servicio de destino admite la autenticación Microsoft Entra ID. Si no es así, use una clave de API u otro método de autenticación compatible con el servicio de destino.
Se produce un error en la solicitud con 400 Solicitud incorrecta. La especificación de OpenAPI no coincide con la API real. Valide la especificación de OpenAPI con la API real. Compruebe los nombres de parámetros, los tipos y los campos obligatorios.
Error de solicitud con 401 No autorizado. Clave de API o token no válido o expirado. Vuelva a generar la clave o el token de API y actualice la conexión del proyecto. Compruebe que el identificador de conexión es correcto.
La herramienta devuelve un formato de respuesta inesperado. Esquema de respuesta no definido en la especificación de OpenAPI. Agregue esquemas de respuesta a la especificación de OpenAPI para mejorar la comprensión del modelo.
operationId error de validación. Caracteres no válidos en operationId. Utilice solo letras, - y _ en valores de operationId. Quite números y caracteres especiales.
Error: conexión no encontrada. El identificador de recurso de conexión es incorrecto o pertenece a otro proyecto. Compruebe que OPENAPI_CONNECTION_ID es el identificador completo del recurso ARM de la conexión en el proyecto Foundry que envía la solicitud.
El token de portador no se ha enviado correctamente. Al valor de conexión le faltan el prefijo Bearer y el espacio a continuación. Establezca el valor de conexión en Bearer <token> (con la palabra Bearer y un espacio antes del token). Compruebe que la especificación securitySchemes de OpenAPI usa "name": "Authorization".

Elección de un método de autenticación

La tabla siguiente le ayuda a elegir el método de autenticación adecuado para la herramienta OpenAPI:

Método de autenticación Más adecuado para Complejidad de la instalación
Anónimo API públicas sin autenticación. Requiere una conexión de proyecto de OpenAPI con authType: "None". Bajo
Clave de API API que no son de Microsoft con acceso basado en claves Medio
Identidad administrada (identidad administrada del proyecto) Servicios de Azure y las API protegidas por Microsoft Entra ID. Requiere una ProjectManagedIdentity conexión y el rol de servicio de destino necesario asignado a la identidad administrada del proyecto. Medio-Alto