Ligue agentes às ferramentas OpenAPI

Ligue os seus agentes Microsoft Foundry a APIs externas usando as especificações OpenAPI 3.0 e 3.1. O modelo Foundry que alimenta o seu agente pode chamar serviços externos, recuperar dados em tempo real e expandir as suas capacidades para além das funções integradas.

As especificações OpenAPI definem uma forma padrão de descrever APIs HTTP para que possa integrar serviços existentes com os seus agentes. Microsoft Foundry suporta três métodos de autenticação: anonymous, API key e managed identity. Para ajuda na escolha de um método de autenticação, consulte Escolher um método de autenticação.

Dica

Considera adicionar esta ferramenta usando uma caixa de ferramentas. Ao utilizar uma caixa de ferramentas, pode reutilizar a ferramenta entre agentes e runtimes, bem como centralizar a gestão de credenciais, versionamento e aplicação de políticas através de um endpoint MCP gerido. Veja o guia de início rápido da caixa de ferramentas.

Pré-requisitos

Antes de começar, certifique-se de que tem:

  • Uma subscrição do Azure com as permissões corretas.

  • Papel de utilizador do Foundry no projeto Foundry para criar e gerir agentes.

    Importante

    As funções RBAC do Foundry foram recentemente renomeadas. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager foram anteriormente nomeados Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. Poderá ainda ver os nomes anteriores em alguns locais enquanto esta alteração de nome está a ser implementada. Os IDs das funções e as permissões principais não são alterados por esta mudança de nome.

  • Função de Gestor de Projetos do Foundry no projeto Foundry se criar uma ligação ao projeto para autenticação com chave de API ou token.

  • Um projeto Foundry criado com um endpoint configurado.

  • Um modelo de IA implementado no seu projeto. Confirme que tanto o modelo como a região do projeto suportam ferramentas OpenAPI no suporte de ferramentas por região e modelo.

  • Um ambiente básico ou padrão de agente.

  • SDK instalado para a tua língua preferida:

    • Python: pip install azure-ai-projects jsonref
    • C#: Azure.AI.Extensions.OpenAI
    • TypeScript/JavaScript: @azure/ai-projects
    • Java: com.azure:azure-ai-agents

Variáveis ambientais

Variável Descrição
FOUNDRY_PROJECT_ENDPOINT A URL do endpoint do teu projeto Foundry (não o endpoint externo do serviço OpenAPI).
FOUNDRY_MODEL_DEPLOYMENT_NAME O nome do modelo implementado.
OPENAPI_PROJECT_CONNECTION_NAME (Para autenticação da chave API) O nome da sua ligação ao projeto para o serviço OpenAPI.
  • Ficheiro de especificação OpenAPI 3.0 ou 3.1 que cumpra estes requisitos:
    • Cada função deve ter um operationId (necessário para a ferramenta OpenAPI).
    • operationId devem conter apenas letras, -, e _.
    • Use nomes descritivos para ajudar os modelos a decidir eficientemente qual a função a utilizar.
    • Tipos de conteúdo do corpo dos pedidos suportados: application/json, application/json-patch+json
  • Para autenticação com identidade gerida: a função do serviço de destino com o menor nível de privilégios que permita as operações da API necessárias, atribuída à identidade gerida do projeto Foundry no âmbito do recurso de destino.
  • Para autenticação de chave ou token da API: uma ligação de projeto configurada com a sua chave ou token da API. Veja Adicionar uma nova ligação ao seu projeto.

Nota

O valor FOUNDRY_PROJECT_ENDPOINT refere-se ao endpoint do teu projeto Microsoft Foundry, não ao endpoint externo do serviço OpenAPI. Pode encontrar este endpoint no portal Microsoft Foundry, na página de Visão Geral do seu projeto. Este endpoint é necessário para autenticar o serviço agente e é separado de quaisquer endpoints OpenAPI definidos no seu ficheiro de especificação.

Suporte de utilização

A tabela seguinte mostra o suporte para SDK e configuração.

Suporte ao Microsoft Foundry Python SDK C# SDK SDK de JavaScript SDK de Java API REST Configuração básica do agente Configuração padrão do agente
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Nota

Para Java, use o pacote com.azure:azure-ai-agents para ferramentas de agentes OpenAPI. O com.azure:azure-ai-projects pacote atualmente não expõe os tipos de ferramentas de agentes do OpenAPI.

Executar o fluxo anónimo de primeiro êxito

Comece com a API meteorológica anónima para verificar se o seu agente consegue carregar uma especificação OpenAPI e chamar uma operação. Este caminho não requer uma credencial API externa nem uma ligação ao projeto Foundry.

  1. Instala o pacote SDK para a língua selecionada a partir de Pré-requisitos.
  2. Descarrega weather_openapi.json, e guarda no assets caminho usado pela amostra.
  3. Defina o endpoint do seu projeto Foundry e modele os valores de implementação.
  4. Executa a amostra anónima na secção de língua selecionada.
  5. Confirme que a resposta contém as condições meteorológicas atuais em Seattle e, em seguida, elimine a versão do agente criada pelo exemplo.

Depois de a chamada anónima ter sucesso, configure a autenticação exigida pela sua API de destino. Mantenha a autenticação por chave API, autenticação com token de portador e autenticação de identidade gerida como variantes separadas.

Compreenda as limitações

  • A sua especificação OpenAPI deve incluir operationId para cada operação, podendo operationId incluir apenas letras, -, e _.
  • Tipos de conteúdo do corpo dos pedidos suportados: application/json, application/json-patch+json.
  • Para autenticação de chave de API, use um esquema de segurança de chave de API para cada ferramenta OpenAPI. Se precisares de múltiplos esquemas de segurança, cria várias ferramentas OpenAPI.
  • Renove regularmente as chaves de API e os tokens bearer, e faça-o imediatamente após qualquer suspeita de comprometimento. Atualize a ligação ao projeto quando as credenciais mudarem; Não coloque credenciais na especificação ou código fonte da OpenAPI.

Adicionar ferramentas OpenAPI a uma caixa de ferramentas

Use este padrão para expor qualquer API REST descrita por uma especificação OpenAPI. Escolha o auth.type modelo que corresponde ao modelo de segurança da sua API.

Importante

Quando usar autenticação de identidade gerida, atribua apenas o papel RBAC menos privilegiado que permita as operações necessárias da API à identidade gerida do seu projeto Foundry no serviço alvo. Por exemplo, atribuir o Reader ao recurso Azure alvo apenas quando a API precisar de acesso apenas de leitura ao Azure Resource Manager. Sem a atribuição necessária, o agente recebe uma 401 Unauthorized resposta ao chamar a API. Para os passos completos de configuração, consulte Autenticar usando identidade gerida.

Autorização anónima:

{
  "description": "REST API via OpenAPI spec",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "anonymous"
        }
      }
    }
  ]
}

Autenticação da ligação ao projeto:

Use este padrão quando a API exigir uma chave ou um token armazenado na ligação do projeto Foundry.

{
  "description": "REST API with connection-based auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "connection",
          "security_scheme": {
            "project_connection_id": "<CONNECTION_NAME>"
          }
        }
      }
    }
  ]
}

Autenticação de identidade gerida:

Use este padrão quando a API de destino se autenticar através do Microsoft Entra ID. A identidade gerida do projeto Foundry chama a API em nome do agente. Certifique-se de que a identidade gerida tem o papel RBAC exigido no serviço alvo antes de usar este padrão.

{
  "description": "REST API with managed identity auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "managed_identity",
          "security_scheme": {
            "audience": "<TARGET_SERVICE_AUDIENCE>"
          }
        }
      }
    }
  ]
}
from azure.ai.projects.models import OpenAPITool

tools = [
    OpenAPITool(
        name="my-api",
        spec={"<paste OpenAPI spec object here>"},
        auth={"type": "anonymous"},
    )
]
BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
ProjectsAgentTool tool = new OpenAPITool(
    new OpenApiFunctionDefinition(
        name: "my-api",
        spec: specBytes,
        openApiAuthentication: new OpenApiAnonymousAuthDetails()
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "REST API via OpenAPI spec"
);
const tools = [
  {
    type: "openapi",
    openapi: {
      name: "my-api",
      spec: { /* paste OpenAPI spec object here */ },
      auth: {
        type: "anonymous",
      },
    },
  },
];

Crie uma caixa de ferramentas OpenAPI com o Azure Developer CLI

As ferramentas OpenAPI incorporam a especificação diretamente em tools:. Autenticação baseada em ligação (connection_auth) refere-se a uma ligação de projeto; ferramentas OpenAPI anónimas não necessitam de ligação.

Passo 1. (Opcional) Criar a ligação de autenticação

Evite este passo para ferramentas anónimas da OpenAPI.

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

As ferramentas OpenAPI também aceitam --auth-type oauth2 ligações. Para o conjunto completo de azd ai connection create flags, veja autenticação e configuração do Toolbox MCP.

Passo 2. Defina a caixa de ferramentas

A especificação OpenAPI está em linha em 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

Para APIs anónimas, substitua o bloco auth: por:

      auth:
        type: anonymous
        security_scheme:
          type: anonymous

Passo 3. Cria a caixa de ferramentas

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

Antes de executares os exemplos de código

  • Descarregue a especificação mantida tripadvisor_openapi.json e guarde-a no assets caminho usado pela sua amostra de linguagem.

Nota

  • Precisas do pacote SDK mais recente. O SDK .NET está atualmente em fase de pré-visualização. Consulte o quickstart para mais detalhes.
  • Se usares a chave API para autenticação, o teu ID de ligação deve estar no formato /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Importante

Para que a autenticação por chave API funcione, o seu ficheiro de especificação OpenAPI deve incluir:

  1. Uma securitySchemes secção com a configuração da tua chave de API, como o nome do cabeçalho e o nome do parâmetro.
  2. Uma security secção que faz referência ao esquema de segurança.
  3. Uma ligação ao projeto configurada com o nome e valor da chave correspondentes.

Sem estas configurações, a chave API não é incluída nos pedidos. Para instruções detalhadas de configuração, consulte a secção Autenticar com chave API .

Também pode usar autenticação baseada em token (por exemplo, um token Bearer) armazenando o token numa ligação de projeto. Para autenticação do token portador, cria uma ligação de chaves personalizadas com a chave definida como Authorization e o valor definido como Bearer <token> (substitua <token> pelo teu token real). A palavra Bearer seguida de um espaço deve ser incluída no valor. Para mais detalhes, consulte Configurar uma ligação de Bearer token.

Exemplo de utilização de Agentes com a ferramenta OpenAPI

Este exemplo demonstra como usar serviços descritos por uma especificação OpenAPI usando um agente. Utiliza o serviço wttr.in para obter o tempo e o seu ficheiro de especificações weather_openapi.json. Selecione Prompt Agents para usar o SDK Azure AI Projects para criar um agente de prompt do lado do servidor, ou Hosted Agents para usar o Microsoft Agent Framework para construir um agente efémero em processo.

Agentes de comando

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,
    OpenApiAnonymousAuthDetails,
)

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

# Create clients to call Foundry API
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

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="MyAgent",
    definition=PromptAgentDefinition(
        model="gpt-4.1-mini",
        instructions="You are a helpful assistant.",
        tools=[weather_tool],
    ),
)
response = openai.responses.create(
    input="What's the weather in Seattle?",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
print(response.output_text)

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

Este exemplo cria um agente de prompts com uma ferramenta OpenAPI que chama a API meteorológica wttr.in usando autenticação anónima. A ferramenta está diretamente ligada à definição do agente. Quando executas o código:

  1. Carrega a especificação meteorológica OpenAPI a partir de um ficheiro JSON local.
  2. Cria um agente de prompt com a ferramenta meteorológica configurada para acesso anónimo.
  3. Envia um pedido sobre o tempo em Seattle.
  4. O agente utiliza a ferramenta OpenAPI para chamar a API meteorológica e devolve resultados formatados.
  5. Limpa eliminando a versão do agente.

Agentes alojados

Este exemplo utiliza FoundryChatClient do Microsoft Agent Framework e estabelece ligação ao endpoint MCP da toolbox através de FoundryToolbox. Instale versões de pacotes compatíveis com pip install "agent-framework-foundry==1.10.4" "azure-ai-projects>=2.3.0,<2.4.0" azure-identity jsonref, defina a FOUNDRY_PROJECT_ENDPOINT variável de ambiente e inicie sessão com az login. OpenApiToolboxTool é o modelo específico da caixa de ferramentas; Use OpenApiTool apenas ao ligar a ferramenta diretamente a um 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,
    OpenApiAnonymousAuthDetails,
)

PROJECT_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>"


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, "r") 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=OpenApiAnonymousAuthDetails(),
        )
    )

    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.
, timeout=120.0)
    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())

Produção esperada

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

Exemplo de utilização de Agentes com a ferramenta OpenAPI

Este exemplo demonstra como usar serviços descritos por uma especificação OpenAPI usando um agente. Utiliza o serviço wttr.in para obter o tempo e o seu ficheiro de especificações weather_openapi.json. Selecione Prompt Agents para usar o SDK Azure AI Projects para criar um agente de prompt do lado do servidor, ou Hosted Agents para usar o Microsoft Agent Framework para construir um agente efémero em processo.

Agentes de comando

Este exemplo utiliza métodos síncronos da biblioteca cliente Azure AI Projects. Para um exemplo que utiliza métodos assíncronos, veja o sample no SDK do Azure para .NET repositório no GitHub.

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

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()
    {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        var projectEndpoint = "your_project_endpoint";

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

        // Create an Agent with `OpenAPIAgentTool` and anonymous authentication.
        string filePath = GetFile();
        OpenAPIFunctionDefinition toolDefinition = new(
            name: "get_weather",
            spec: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
            auth: new OpenAPIAnonymousAuthenticationDetails()
        );
        toolDefinition.Description = "Retrieve weather information for a location.";
        OpenAPITool openapiTool = new(toolDefinition);

        // Create the agent definition and the agent version.
        DeclarativeAgentDefinition agentDefinition = new(model: "gpt-4.1-mini")
        {
            Instructions = "You are a helpful assistant.",
            Tools = { openapiTool }
        };
        AgentVersion 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);
    }
}

O que este código faz

Este exemplo de C# cria um agente com uma ferramenta OpenAPI que recupera informações meteorológicas de wttr.in usando autenticação anónima. Quando executas o código:

  1. Lê a especificação meteorológica OpenAPI a partir de um ficheiro JSON local.
  2. Cria um agente com a ferramenta meteorológica configurada.
  3. Envia um pedido sobre o tempo em Seattle usando a ferramenta OpenAPI.
  4. O agente liga à API meteorológica e devolve os resultados.
  5. Limpa eliminando o agente.

Entradas necessárias

  • Valor da string inline: projectEndpoint (endpoint do seu projeto Foundry)
  • Ficheiro local: Assets/weather_openapi.json (especificação OpenAPI)

Produção esperada

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

Erros comuns

  • FileNotFoundException: Ficheiro de especificação OpenAPI não encontrado na pasta Assets
  • UnauthorizedAccessException: Credenciais inválidas ou permissões RBAC insuficientes
  • Chave API não injetada: Verifique se a sua especificação OpenAPI inclui tanto securitySchemes (em components) como security secções com nomes de esquemas correspondentes

Agentes alojados

Este exemplo cria a caixa de ferramentas OpenAPI com o Azure AI Projects SDK, e depois utiliza a integração com o Microsoft Agent Framework AddFoundryToolboxes para disponibilizar a ferramenta ao agente alojado. Instale os pacotes do Agent Framework, defina o AZURE_AI_PROJECT_ENDPOINT endpoint do projeto e AZURE_AI_MODEL_DEPLOYMENT_NAME as variáveis de ambiente, e inicie sessão com az login.

using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
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("AZURE_AI_PROJECT_ENDPOINT")
    ?? "https://<account>.services.ai.azure.com/api/projects/<project>";
string deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-5-mini";

var openAiEndpoint = new Uri(projectEndpoint).GetLeftPart(UriPartial.Authority);
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",
    spec: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
    auth: new OpenAPIAnonymousAuthenticationDetails()
);
toolDefinition.Description = "Retrieve weather information for a location.";
ProjectsAgentTool openapiTool = new OpenAPITool(toolDefinition);
ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
    .GetAgentToolboxes().CreateToolboxVersion(
        toolboxName: "openapi-toolbox",
        tools: [openapiTool],
        description: "Toolbox with the OpenAPI weather tool");

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

Produção esperada

O agente chama a API meteorológica através da ferramenta OpenAPI e devolve as condições atuais para a localização solicitada:

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

Para o exemplo completo, incluindo padrões de API autenticados, veja Agent_Step17_OpenAPITools.


Exemplo de utilização de Agentes com a ferramenta OpenAPI em serviço Web, requerendo autenticação

Neste exemplo, adiciona-se uma ferramenta OpenAPI autenticada a uma caixa de ferramentas, associa-se a caixa de ferramentas como uma ferramenta MCP e utiliza-se o agente num cenário que requer autenticação. Utilizas a especificação do TripAdvisor.

O serviço do TripAdvisor requer autenticação baseada em chaves. Para criar uma ligação, abra o Microsoft Foundry, selecione Gerir no canto superior direito da navegação, selecione detalhes do Project e depois selecione o separador Recursos Conectados. Finalmente, crie uma nova ligação do tipo Chaves personalizadas. Nomeia-o tripadvisor e adiciona um par chave-valor. Adicione uma chave chamada key e insira um valor com a chave do TripAdvisor.

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()
    {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        var projectEndpoint = "your_project_endpoint";

        // 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();
        AIProjectConnection tripadvisorConnection = projectClient.Connections.GetConnection("tripadvisor");
        OpenAPIFunctionDefinition toolDefinition = new(
            name: "tripadvisor",
            spec: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
            auth: new OpenAPIProjectConnectionAuthenticationDetails(new OpenAPIProjectConnectionSecurityScheme(
                projectConnectionId: tripadvisorConnection.Id
            ))
        );
        toolDefinition.Description = "Trip Advisor API to get travel information.";
        ProjectsAgentTool openapiTool = new OpenAPITool(toolDefinition);

        // 1. Add the authenticated OpenAPI tool to a toolbox. Using a toolbox is the
        //    recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
        AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();

        ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
            .GetAgentToolboxes().CreateToolboxVersion(
                toolboxName: "openapi-toolbox",
                tools: [openapiTool],
                description: "Toolbox with the authenticated TripAdvisor OpenAPI tool");

        // 2. The toolbox exposes an MCP-compatible endpoint.
        var toolboxMcpUrl = new Uri(
            $"{projectEndpoint}/toolboxes/{toolboxVersion.Name}" +
            $"/versions/{toolboxVersion.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
        var toolboxConnectionName = "openapi-toolbox-conn";

        // 4. Attach the toolbox to a prompt agent as an MCP tool.
        McpTool toolboxTool = ResponseTool.CreateMcpTool(
            serverLabel: "toolbox",
            serverUri: toolboxMcpUrl,
            toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
                GlobalMcpToolCallApprovalPolicy.NeverRequireApproval));
        toolboxTool.ProjectConnectionId = toolboxConnectionName;

        // Create the agent definition and the agent version.
        DeclarativeAgentDefinition agentDefinition = new(model: "gpt-4.1-mini")
        {
            Instructions = "You are a helpful assistant.",
            Tools = { toolboxTool }
        };
        AgentVersion 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);
    }
}

O que este código faz

Este exemplo de C# demonstra o uso de uma ferramenta OpenAPI com autenticação por chave API através de uma caixa de ferramentas e ligação ao projeto. Quando executas o código:

  1. Carrega a especificação OpenAPI do TripAdvisor a partir de um ficheiro local.
  2. Recupera a tripadvisor ligação ao projeto que contém a tua chave API.
  3. Cria uma versão da caixa de ferramentas que contém a ferramenta TripAdvisor configurada para usar a ligação para autenticação.
  4. Anexa o conjunto de ferramentas ao agente como uma ferramenta MCP.
  5. Envia um pedido de recomendações de hotéis em Paris.
  6. O agente liga à API do TripAdvisor usando a sua chave API armazenada e devolve os resultados.
  7. Limpa eliminando o agente.

Entradas necessárias

  • Valor da string inline: projectEndpoint (endpoint do seu projeto Foundry)
  • Ficheiro local: Assets/tripadvisor_openapi.json
  • Projecto conexão: tripadvisor com chave API válida configurada

Produção 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: ...
...

Erros comuns

  • ConnectionNotFoundException: Nenhuma ligação ao projeto identificada tripadvisor foi encontrada.
  • AuthenticationException: Chave API inválida na ligação ao projeto, ou configuração em falta/incorreta securitySchemes na especificação OpenAPI.
  • Ferramenta não utilizada: ToolChoice = ResponseToolChoice.CreateRequiredChoice() verifica a obrigatoriedade de uso da ferramenta.
  • Chave API não passada para a API: Certifique-se de que a especificação OpenAPI tem as secções securitySchemes e security adequadas configuradas.

Crie um agente Java com capacidades de ferramenta OpenAPI

Esta configuração Java pode referenciar ferramentas MCP, mas o SDK Java ainda não expõe uma API de criação de toolbox.

Dica

Recomendado: Para a maioria dos agentes, adiciona a ferramenta OpenAPI através de uma caixa de ferramentas e anexa a caixa de ferramentas ao teu agente como uma ferramenta MCP. Crie a caixa de ferramentas usando o exemplo Python, API REST, C# ou TypeScript, ou o portal Foundry, e depois faça referência ao seu endpoint MCP a partir do seu agente Java como um McpTool.

Os exemplos seguintes mostram como chamar uma ferramenta OpenAPI usando a API REST.

Obtenha um token de acesso:

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

Autenticação anónima

Adicione ferramentas OpenAPI através de uma caixa de ferramentas e depois anexe a caixa de ferramentas ao seu agente como uma ferramenta MCP. Para mais informações, veja O que é uma caixa de ferramentas?

  1. Crie uma caixa de ferramentas que contenha a ferramenta meteorológica OpenAPI:
curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions?api-version=v1" \
  -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": "anonymous" },
          "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" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

A caixa de ferramentas expõe um endpoint compatível com MCP em $FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1, onde <version> é a versão devolvida pela chamada anterior.

  1. Crie uma ligação de projeto da ferramenta remota que aponte para o ponto final da caixa de ferramentas, utilizando um token Entra de utilizador para que a identidade do autor da chamada seja transmitida (destinatário 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. Cria uma resposta que use a caixa de ferramentas anexando-a como uma ferramenta MCP.
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": "openapi-toolbox-conn"
      }
    ]
  }'

Autenticação por chave API (ligação ao projeto)

Use esta variante apenas depois de o fluxo anónimo ter sucesso. Configure a ligação ao projeto e a entrada OpenAPI securitySchemes conforme descrito em Autenticar com chave API.

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.",
    "tools": [
      {
        "type": "openapi",
        "openapi": {
          "name": "weather",
          "description": "Tool to get weather data",
          "auth": {
            "type": "project_connection",
            "security_scheme": {
              "project_connection_id": "'$WEATHER_APP_PROJECT_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" }
                  }
                }
              }
            },
            "components": {
              "securitySchemes": {
                "apiKeyHeader": {
                  "type": "apiKey",
                  "name": "x-api-key",
                  "in": "header"
                }
              }
            },
            "security": [
              { "apiKeyHeader": [] }
            ]
          }
        }
      }
    ]
  }'

Para uma API de token portador, mantenha a mesma project_connection forma de pedido, mas use uma ligação configurada conforme descrito em Configurar uma ligação de token portador. O valor da ligação deve começar por Bearer seguido de um espaço.

Autenticação de identidade gerida

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.",
    "tools": [
      {
        "type": "openapi",
        "openapi": {
          "name": "weather",
          "description": "Tool to get weather data",
          "auth": {
            "type": "managed_identity",
            "security_scheme": {
              "audience": "'$MANAGED_IDENTITY_AUDIENCE'"
            }
          },
          "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" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

O que este código faz

Este exemplo de API REST mostra como chamar uma ferramenta OpenAPI com diferentes métodos de autenticação. O pedido:

  1. Para autenticação anónima, cria-se uma caixa de ferramentas que contém a definição da ferramenta OpenAPI e a especificação da API meteorológica.
  2. Cria uma resposta que anexa a caixa de ferramentas como uma ferramenta MCP e pergunta sobre o tempo em Seattle.
  3. Mostra definições adicionais diretas de ferramentas REST para chave API via ligação ao projeto e autenticação de identidade gerida.
  4. O agente utiliza a ferramenta para chamar a API meteorológica e devolve resultados formatados.

Entradas necessárias

  • Variáveis de ambiente: FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • Para autenticação da chave API: WEATHER_APP_PROJECT_CONNECTION_ID.
  • Para autenticação de identidade gerida no contexto de TI: MANAGED_IDENTITY_AUDIENCE.
  • Especificação OpenAPI em linha no corpo da requisição.

Produção esperada

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

Erros comuns

  • 401 Unauthorized: Inválido ou em falta AGENT_TOKEN, ou chave API não injetada porque securitySchemes e security estão em falta na sua especificação OpenAPI
  • 404 Not Found: Nome incorreto do endpoint ou do modelo de implementação
  • 400 Bad Request: Especificação OpenAPI mal formada ou configuração de autenticação inválida
  • Chave API não enviada com pedido: Verifique se a components.securitySchemes secção na sua especificação OpenAPI está devidamente configurada (não vazia) e corresponde ao nome da chave de ligação do seu projeto

Crie um agente com capacidades de ferramenta OpenAPI

O seguinte exemplo de código TypeScript demonstra como criar um agente de IA com capacidades de ferramenta OpenAPI, adicionando a ferramenta OpenAPI a uma caixa de ferramentas e anexando a caixa de ferramentas como uma ferramenta MCP. O agente pode chamar APIs externas definidas pelas especificações OpenAPI. Para uma versão JavaScript deste exemplo, veja o exemplo no repositório SDK do Azure para JavaScript sobre GitHub.

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

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const weatherSpecPath = path.resolve(__dirname, "../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): OpenApiTool {
  const auth: OpenApiAnonymousAuthDetails = { type: "anonymous" };
  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 toolboxConnectionName = "openapi-toolbox-conn";

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  const agent = await project.agents.createVersion("MyOpenApiAgent", {
    kind: "prompt",
    model: "gpt-4.1-mini",
    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: toolboxConnectionName,
      },
    ],
  });

  // 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);
});

O que este código faz

Este exemplo de TypeScript cria um agente com uma ferramenta OpenAPI para dados meteorológicos usando autenticação anónima. Quando executas o código:

  1. Carrega a especificação meteorológica OpenAPI a partir de um ficheiro JSON local.
  2. Cria uma versão da caixa de ferramentas que contém a ferramenta meteorológica.
  3. Anexa o conjunto de ferramentas ao agente como uma ferramenta MCP e, em seguida, envia um pedido em streaming sobre o tempo em Seattle e o que vestir.
  4. Processa a resposta de streaming e mostra os deltas à medida que chegam.
  5. Força o uso da ferramenta utilizando tool_choice: "required" para garantir que a API é chamada.
  6. Limpa eliminando o agente.

Entradas necessárias

  • Valor da string inline: PROJECT_ENDPOINT (endpoint do seu projeto Foundry)
  • Ficheiro local: ../assets/weather_openapi.json (especificação OpenAPI)

Produção esperada

Loading OpenAPI specifications from assets directory...
Creating agent with OpenAPI tool...
Agent created (id: asst_abc123, name: MyOpenApiAgent, version: 1)

Sending request to OpenAPI-enabled agent with streaming...
Follow-up response created with ID: resp_xyz789
The weather in Seattle is currently...
Tool call completed: get_weather

Follow-up completed!

Cleaning up resources...
Agent deleted

OpenAPI agent sample completed!

Erros comuns

  • Error: OpenAPI specification not found: Caminho do ficheiro incorreto ou ficheiro em falta
  • AuthenticationError: Credenciais de Azure inválidas
  • A chave API não funciona: Se estiver a mudar de autologia anónima para chave API, certifique-se de que a sua especificação OpenAPI está securitySchemes devidamente security configurada

Crie um agente que utilize ferramentas OpenAPI autenticado com uma ligação ao projeto

O seguinte exemplo de código TypeScript demonstra como criar um agente de IA que utiliza ferramentas OpenAPI autenticadas através de uma ligação ao projeto. O agente carrega a especificação OpenAPI do TripAdvisor a partir de ativos locais e pode invocar a API através da ligação ao projeto configurada. Para uma versão JavaScript deste exemplo, veja o exemplo no repositório SDK do Azure para JavaScript sobre 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";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const TRIPADVISOR_CONNECTION_ID = "your-tripadvisor-connection-id";
const tripAdvisorSpecPath = path.resolve(__dirname, "../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: TRIPADVISOR_CONNECTION_ID,
    },
  };

  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: "gpt-4.1-mini",
    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);
});

O que este código faz

Este exemplo de TypeScript demonstra o uso de uma ferramenta OpenAPI com autenticação de chave API através de uma ligação de projeto. Quando executas o código:

  1. Carrega a especificação OpenAPI do TripAdvisor a partir de um ficheiro local.
  2. Configura a autenticação usando a TRIPADVISOR_CONNECTION_ID constante.
  3. Cria um agente com a ferramenta TripAdvisor que utiliza a ligação do projeto para a autenticação da chave API.
  4. Envia um pedido de streaming com detalhes da localização no TripAdvisor.
  5. Força o uso da ferramenta utilizando tool_choice: "required" para garantir que a API é chamada.
  6. Processa e exibe a resposta em streaming.
  7. Faz a limpeza ao apagar o agente.

Entradas necessárias

  • Valores de cadeias em linha: PROJECT_ENDPOINT, TRIPADVISOR_CONNECTION_ID
  • Ficheiro local: ../assets/tripadvisor_openapi.json
  • Ligação ao Project configurada com a chave API do TripAdvisor

Produção esperada

Loading TripAdvisor OpenAPI specification from assets directory...
Creating agent with OpenAPI project-connection tool...
Agent created (id: asst_abc123, name: MyOpenApiConnectionAgent, version: 1)

Sending request to TripAdvisor OpenAPI agent with streaming...
Follow-up response created with ID: resp_xyz789
Location 293919 is the Eiffel Tower in Paris, France. It has a rating of 4.5 stars with over 140,000 reviews...
Tool call completed: get_tripadvisor_location_details

Follow-up completed!

Cleaning up resources...
Agent deleted

TripAdvisor OpenAPI agent sample completed!

Erros comuns

  • Error: OpenAPI specification not found: Verifica o caminho do ficheiro.
  • A ligação não foi encontrada: Verifique se TRIPADVISOR_CONNECTION_ID está correto e se a ligação existe.
  • AuthenticationException: Chave API inválida na ligação ao projeto.
  • Chave API não injetada nos pedidos: A sua especificação OpenAPI deve incluir as secções corretas securitySchemes (em components) e security. O nome-chave em securitySchemes tem de corresponder à chave na sua ligação ao projeto.
  • Content type is not supported: Atualmente, apenas estes dois tipos de conteúdo do corpo solicitado são suportados: application/json e application/json-patch+json. Os tipos de conteúdo de resposta não são restritos.

Questões de segurança e dados

Quando liga um agente a uma ferramenta OpenAPI, o agente pode enviar parâmetros de pedido derivados da entrada do utilizador para a API de destino.

  • Utilize ligações de projetos para informações confidenciais (chaves API e tokens). Evite colocar segredos num ficheiro de especificação OpenAPI ou código-fonte.
  • Revise que dados a API recebe e o que ela devolve antes de usar a ferramenta em produção.
  • Use o acesso com privilégio mínimo. Para identidade gerida, atribui apenas os papéis que o serviço alvo exige.

Autenticar com chave API

Use esta variante para uma API que espere uma chave num cabeçalho ou parâmetro de consulta. Só pode usar um esquema de segurança de chave API por ferramenta OpenAPI. Se a API exigir múltiplos esquemas de segurança, crie múltiplas ferramentas OpenAPI.

  1. Atualize os esquemas de segurança da especificação OpenAPI. Tem uma securitySchemes secção e um esquema de tipo apiKey. Por exemplo:

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

    Normalmente só precisas de atualizar o name campo, que corresponde ao nome de key na ligação. Se os esquemas de segurança incluírem múltiplos esquemas, mantenha apenas um deles.

  2. Atualize a sua especificação OpenAPI para incluir uma security secção:

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. Remova qualquer parâmetro na especificação OpenAPI que necessite de chave API, porque a chave API é armazenada e passada através de uma ligação, conforme descrito mais adiante neste artigo.

  4. Cria uma ligação para guardar a tua chave API.

  5. Vai ao portal da Foundry e abre o teu projeto.

  6. Cria ou seleciona uma ligação que armazene o segredo. Veja Adicionar uma nova ligação ao seu projeto.

    Nota

    Se regenerares a chave API numa data posterior, precisas de atualizar a ligação com a nova chave.

  7. Introduza a seguinte informação

    • Chave: name campo do seu esquema de segurança. Neste exemplo, deveria ser x-api-key

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

  8. Depois de criar uma ligação, pode usá-la através do SDK ou da API REST. Use os separadores no topo deste artigo para ver exemplos de código.

Configurar uma conexão de Bearer token

Use esta variante para uma API que espera um token bearer no cabeçalho Authorization. Utiliza o mesmo tipo de autenticação project_connection da autenticação com chave de API, mas o esquema de segurança do OpenAPI e os valores de conexão são diferentes.

A sua especificação OpenAPI será a seguinte:

  BearerAuth:
    type: http
    scheme: bearer
    bearerFormat: JWT

Precisa de:

  1. Atualize a sua especificação securitySchemes OpenAPI para usar Authorization como nome do cabeçalho:

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Adicione uma security secção que faça referência ao esquema:

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Crie uma ligação de chaves personalizadas no seu projeto Foundry:

    1. Vai ao portal da Foundry e abre o teu projeto.
    2. Cria ou seleciona uma ligação que armazene o segredo. Veja Adicionar uma nova ligação ao seu projeto.
    3. Introduza os seguintes valores:
      • Chave: Authorization (Deve corresponder ao name campo no teu securitySchemes)
      • Valor: Bearer <token> (substitui <token> pelo teu token real)

    Importante

O valor deve incluir a palavra Bearer seguida de um espaço antes do token. Por exemplo: Bearer eyJhbGciOiJSUzI1NiIs.... Se omitir o Bearer prefixo e o espaço seguinte, a API recebe um token bruto sem o prefixo exigido do esquema de autorização, e o pedido falha.

  1. Depois de criares a ligação, usa-a com o project_connection tipo de autenticação no teu código, da mesma forma que farias para a autenticação por chave API. O ID da ligação usa o mesmo formato: /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Autenticar usando identidade gerida (Microsoft Entra ID)

Microsoft Entra ID é um serviço de gestão de identidade e acessos baseado na cloud que os seus colaboradores podem usar para aceder a recursos externos. Ao usar o Microsoft Entra ID, pode adicionar segurança extra às suas APIs sem precisar de usar chaves de API. Quando configuras autenticação de identidade gerida, o agente autentica-se através da ferramenta Foundry que utiliza.

Importante

A autenticação de identidade gerida só funciona quando o serviço alvo aceita tokens Microsoft Entra ID. Se a API de destino utilizar um esquema de autenticação personalizado que não suporte o Microsoft Entra ID, use a autenticação com chave API ou token Bearer.

Compreender o URI do público

O audience (por vezes chamado de identificador de recurso ou ID de aplicação URI) indica ao Microsoft Entra ID a que serviço ou API o token pretende aceder. O valor da audiência deve corresponder ao que o serviço alvo espera, caso contrário a autenticação falha com um erro 401.

Nota

O público não é o endpoint do teu projeto Foundry. É o identificador de recurso do serviço-alvo que a sua ferramenta OpenAPI chama.

A tabela seguinte lista URIs de audiência para serviços comuns do Azure:

Serviço alvo URI de Audiência
Armazenamento do Azure https://storage.azure.com
Azure Key Vault https://vault.azure.net
Pesquisa de IA do Azure https://search.azure.com
Azure Logic Apps https://logic.azure.com
API Management do Azure (plano de gestão) https://management.azure.com
API protegida por um registo de aplicação Microsoft Entra (incluindo APIM com OAuth) O URI do ID da aplicação do registo da sua aplicação (por exemplo, api://<client-id>)

Dica

Se usar API Management do Azure para proteger uma API personalizada com uma política de validação OAuth 2.0, o público é o ID da aplicação URI do registo da aplicação que protege a API — não https://management.azure.com. A audiência do plano de gestão aplica-se apenas às operações do Azure Resource Manager no próprio recurso APIM.

Para mais informações sobre como os agentes se autenticam com Microsoft Entra ID, consulte Identidade e autenticação do agente.

Encontre e verifique o seu público

Use os seguintes passos para determinar e verificar o valor correto para o público:

  • Para os serviços do Azure: Verifique a documentação do serviço para o identificador de recurso do Microsoft Entra ID. A maioria dos serviços do Azure lista o URI da audiência na sua documentação de autenticação.
  • Para APIs protegidas por registo de aplicação da Microsoft Entra: No portal Azure, vá a Microsoft Entra ID>Registos de aplicação> selecione a sua aplicação >Expor uma API. O URI do ID da aplicação no topo da página é o valor do teu público.
  • Para verificar o público de um token: Descodifique o token de acesso em https://jwt.ms e verifique a aud declaração. O aud valor deve corresponder ao público que o seu serviço-alvo espera.

Configurar autenticação de identidade gerida

Para configurar a autenticação usando Identidade Gerida:

  1. Certifique-se de que o seu recurso Foundry tem a identidade gerida atribuída ao sistema ativada.

Captura de ecrã do portal Azure a mostrar as definições de identidade gerida atribuídas ao sistema.

  1. Cria um recurso para o serviço ao qual queres ligar-te através da especificação OpenAPI.

  2. Atribui o acesso adequado ao recurso.

    1. Selecione Controlo de Acesso para o seu recurso.

    2. Selecione Adicionar e depois adicione atribuição de função no topo do ecrã.

      Captura de ecrã do portal do Azure a mostrar a ação Adicionar atribuição de funções.

  3. Selecione o plano de dados ou a função de aplicação menos privilegiada que conceda as operações na sua especificação OpenAPI. Azure Resource Manager O acesso ao leitor sozinho não concede acesso ao plano de dados. Depois seleciona Próximo.

  4. Selecione Identidade Gerida e depois selecione membros.

  5. No menu suspenso de identidade gerida, pesquise por Conta Foundry e depois selecione a conta Foundry do seu agente.

  6. Selecionar Acabamento.

  7. Quando terminares a configuração, podes continuar usando a ferramenta através do portal Foundry, SDK ou API REST. Use os separadores no topo deste artigo para ver exemplos de código.

Resolução de erros comuns

Sintoma Causa provável Resolução
A chave API não está incluída nos pedidos. Especificação OpenAPI em falta nas secções securitySchemes ou security. Verifica se a especificação OpenAPI inclui ambos components.securitySchemes e uma secção de nível superior security. Garanta que o esquema name corresponde ao nome-chave na ligação ao seu projeto.
O Agente não chama a ferramenta OpenAPI. A escolha da ferramenta não está definida ou operationId não é descritiva. Usar tool_choice="required" para forçar a invocação da ferramenta. Garantir que operationId os valores são descritivos para que o modelo possa escolher a operação certa.
A autenticação falha para a identidade gerida. Identidade gerida não ativada ou ausente de atribuição de papel. Ative a identidade gerida atribuída ao sistema no seu recurso Foundry. Atribua ao serviço de destino a função do plano de dados ou da aplicação com o menor nível de privilégios para as operações da sua especificação OpenAPI.
A identidade gerida devolve o 401 mesmo que a função esteja atribuída. O URI da audiência não corresponde ao que o serviço alvo espera. Verifique se o URI da audiência corresponde ao identificador de recurso do serviço alvo. Para serviços Azure, consulte a documentação do serviço. Para APIs protegidas pela Microsoft Entra, utilize o URI do ID da sua aplicação registada. Descifra o token em https://jwt.ms e confirma que a aud reivindicação corresponde. Veja: Compreender o URI do público.
Token de identidade gerida rejeitado pela API alvo. O serviço Target não aceita tokens Microsoft Entra ID. Confirme que o serviço alvo suporta autenticação Microsoft Entra ID. Se não for o caso, use a autenticação por chave API ou token de portador.
A requisição falhou com erro 400 de Requisição Inválida. A especificação da OpenAPI não corresponde à API real. Valida a especificação da tua OpenAPI com a API real. Verifique nomes de parâmetros, tipos e campos obrigatórios.
Pedido falhado com 401 Não Autorizado. Chave API ou token inválidos ou expirados. Regenera a chave/token da API e atualiza a ligação ao teu projeto. Verifica se o ID da ligação está correto.
A ferramenta devolve um formato de resposta inesperada. Esquema de resposta não definido na especificação OpenAPI. Adiciona esquemas de resposta à tua especificação OpenAPI para uma melhor compreensão do modelo.
operationId Erro de validação. Caracteres inválidos em operationId. Utilize apenas letras, -, e _ nos valores de operationId. Remove números e caracteres especiais.
Erro de conexão não encontrada. Discrepância no nome da ligação ou ID. Verifica se OPENAPI_PROJECT_CONNECTION_NAME corresponde ao nome da ligação no teu projeto Foundry.
Ficha de portador não enviada corretamente. O valor de ligação não inclui o prefixo Bearer e o espaço a seguir. Defina o valor da ligação para Bearer <token> (com a palavra Bearer e um espaço antes do token). Verifique se a especificação securitySchemes da OpenAPI utiliza "name": "Authorization".

Escolha um método de autenticação

A tabela seguinte ajuda-o a escolher o método de autenticação correto para a sua ferramenta OpenAPI:

Método de autenticação Melhor para Complexidade de configuração
Anónimo APIs públicas sem autenticação Baixo
chave de API APIs não-Microsoft com acesso baseado em chaves Média
Identidade gerida Serviços Azure e APIs protegidas pelo Microsoft Entra ID. Requer que o serviço alvo aceite tokens Microsoft Entra ID e suporte controlo de acesso baseado em Azure RBAC ou Microsoft Entra. Médio-Alto