Connecter des agents aux outils OpenAPI

Connectez vos agents Microsoft Foundry aux API externes à l’aide des spécifications OpenAPI 3.0 et 3.1. Le modèle Foundry qui alimente votre agent peut appeler des services externes, récupérer des données en temps réel et étendre ses fonctionnalités au-delà des fonctions intégrées.

Les spécifications OpenAPI définissent un moyen standard de décrire les API HTTP afin de pouvoir intégrer des services existants à vos agents. Microsoft Foundry prend en charge trois méthodes d’authentification : anonymous, API key et managed identity. Pour obtenir de l’aide sur le choix d’une méthode d’authentification, consultez Choisir une méthode d’authentification.

Conseil

Envisagez d’ajouter cet outil à l’aide d’une boîte à outils. À l’aide d’une boîte à outils, vous pouvez réutiliser l’outil entre les agents et les runtimes, ainsi que centraliser la gestion des informations d’identification, le contrôle de version et l’application des stratégies via un point de terminaison MCP géré. Consultez le guide de démarrage rapide de la boîte à outils.

Conditions préalables

Avant de commencer, assurez-vous d’avoir :

  • Un abonnement Azure disposant des autorisations appropriées.

  • Rôle Utilisateur Foundry dans le projet Foundry pour créer et exécuter des agents.

    Important

    Les rôles Foundry RBAC ont été récemment renommés. Foundry User, Foundry Owner, Propriétaire du compteFoundry et Foundry Project Manager ont été précédemment nommés Azure utilisateur IA, Azure propriétaire d’IA, propriétaire Azure compte IA et Azure gestionnaire Project IA. Il se peut que vous voyiez encore les anciens noms à certains endroits pendant le déploiement de ce changement de nom. Les ID de rôle et les autorisations de base ne sont pas modifiés par ce changement de nom.

  • Le rôle de Foundry Project Manager sur le projet Foundry si vous créez une connexion de projet pour une authentification par clé API ou par jeton.

  • Projet Foundry créé avec un point de terminaison configuré.

  • Modèle IA déployé dans votre projet. Vérifiez que le modèle et la région de projet prennent en charge les outils OpenAPI dans l’outil par région et par modèle.

  • Environnement d’agent de base ou standard.

  • Kit de développement logiciel (SDK) installé pour votre langue préférée :

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

Variables d’environnement

Variable Description
FOUNDRY_PROJECT_ENDPOINT URL du point de terminaison de votre projet Foundry (pas le point de terminaison de service OpenAPI externe).
FOUNDRY_MODEL_DEPLOYMENT_NAME Nom de votre modèle déployé.
OPENAPI_PROJECT_CONNECTION_NAME (Pour l’authentification de clé API) Nom de connexion de votre projet pour le service OpenAPI.
  • Fichier de spécification OpenAPI 3.0 ou 3.1 qui répond aux exigences suivantes :
    • Chaque fonction doit avoir un operationId (requis pour l’outil OpenAPI).
    • operationId ne doit contenir que des lettres, -et _.
    • Utilisez des noms descriptifs pour aider les modèles à choisir efficacement la fonction à utiliser.
    • Types de contenu du corps de la requête pris en charge : application/json, application/json-patch+json
  • Pour l’authentification d’identité managée : le rôle de service cible le moins privilégié qui autorise les opérations d’API requises, affecté à l’identité managée du projet Foundry au niveau de l’étendue de ressource cible.
  • Pour l’authentification par clé/jeton d’API : connexion de projet configurée avec votre clé d’API ou votre jeton. Consultez Ajouter une nouvelle connexion à votre projet.

Note

La valeur FOUNDRY_PROJECT_ENDPOINT fait référence à votre point de terminaison de projet Microsoft Foundry, et non au point de terminaison de service OpenAPI externe. Vous trouverez ce point de terminaison dans le portail Microsoft Foundry sous la page Vue d’ensemble de votre projet. Ce point de terminaison est requis pour authentifier le service d’agent et est distinct de tous les points de terminaison OpenAPI définis dans votre fichier de spécification.

Support d'utilisation

Le tableau suivant présente la prise en charge du KIT de développement logiciel (SDK) et de la configuration.

Prise en charge de Microsoft Foundry SDK Python Kit de développement logiciel (SDK) C# Kit de développement logiciel (SDK) JavaScript Kit de développement logiciel (SDK) Java REST API Configuration de l’agent de base Configuration de l’agent standard
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Note

Pour Java, utilisez le package com.azure:azure-ai-agents pour les outils de l’agent OpenAPI. Le com.azure:azure-ai-projects package n’expose actuellement pas les types d’outils de l’agent OpenAPI.

Exécuter le flux anonyme de première réussite

Commencez par l’API météo anonyme pour vérifier que votre agent peut charger une spécification OpenAPI et appeler une opération. Cette méthode ne nécessite ni identifiants d’API externe ni connexion à un projet Foundry.

  1. Installez le package du Kit de développement logiciel (SDK) pour votre langue sélectionnée à partir des prérequis.
  2. Téléchargez weather_openapi.jsonet enregistrez-le dans le assets chemin d’accès utilisé par l’exemple.
  3. Définissez le point de terminaison de votre projet Foundry et les valeurs de déploiement de modèle.
  4. Exécutez l’exemple anonyme dans votre section de langue sélectionnée.
  5. Vérifiez que la réponse contient la météo actuelle pour Seattle, puis supprimez la version de l’agent créée par l’exemple.

Une fois l’appel anonyme réussi, configurez l’authentification requise par votre API cible. Conservez l’authentification par clé API, l’authentification par jeton du porteur et l’authentification d’identité managée en tant que variantes distinctes.

Comprendre les limitations

  • Votre spécification OpenAPI doit inclure operationId pour chaque opération et operationId peut inclure uniquement des lettres, -et _.
  • Types de contenu du corps de la demande pris en charge : application/json, application/json-patch+json.
  • Pour l’authentification par clé API, utilisez un schéma de sécurité de clé API par outil OpenAPI. Si vous avez besoin de plusieurs schémas de sécurité, créez plusieurs outils OpenAPI.
  • Renouvelez régulièrement les clés API et les jetons du porteur, et immédiatement dès qu’une exposition est suspectée. Mettez à jour la connexion du projet lorsque les informations d’identification changent ; ne placez pas d’informations d’identification dans la spécification OpenAPI ou le code source.

Ajouter des outils OpenAPI à une boîte à outils

Utilisez ce modèle pour exposer n’importe quelle API REST décrite par une spécification OpenAPI. Choisissez le auth.type modèle de sécurité de votre API.

Important

Lorsque vous utilisez l’authentification d’identité managée, attribuez uniquement le rôle RBAC le moins privilégié qui autorise les opérations d’API requises à l’identité managée de votre projet Foundry sur le service cible. Par exemple, affectez lecteur sur la ressource de Azure cible uniquement lorsque l’API a besoin d’un accès en lecture seule Azure Resource Manager. Sans l’affectation requise, l’agent reçoit une 401 Unauthorized réponse lors de l’appel de l’API. Pour connaître les étapes d’installation complètes, consultez Authentifier à l’aide de l’identité managée.

Authentification anonyme :

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

Authentification de connexion de projet :

Utilisez ce modèle lorsque l’API nécessite une clé ou un jeton stocké dans une connexion de projet 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>"
          }
        }
      }
    }
  ]
}

Authentification d’identité managée :

Utilisez ce modèle lorsque l’API cible s’authentifie via Microsoft Entra ID. L’identité managée du projet Foundry appelle l’API pour le compte de l’agent. Vérifiez que l’identité managée a le rôle RBAC requis sur le service cible avant d’utiliser ce modèle.

{
  "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",
      },
    },
  },
];

Créer une boîte à outils OpenAPI avec l’interface CLI Azure développeur

Les outils OpenAPI incorporent directement la spécification sous tools:. L’authentificationconnection_auth basée sur une connexion () fait référence à une connexion de projet ; les outils OpenAPI anonymes n’ont pas besoin de connexion.

Étape 1. (Facultatif) Créer la connexion d’authentification

Ignorez cette étape pour les outils OpenAPI anonymes.

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

Les outils OpenAPI acceptent également les connexions --auth-type oauth2. Pour consulter la liste complète des options azd ai connection create, voir Authentification et configuration de Toolbox MCP.

Étape 2. Définir la boîte à outils

La spécification OpenAPI est incluse sous 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

Pour les API anonymes, remplacez le auth: bloc par :

      auth:
        type: anonymous
        security_scheme:
          type: anonymous

Étape 3. Créer la boîte à outils

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

Avant d’exécuter les exemples de code

  • Téléchargez la spécification tripadvisor_openapi.json maintenue et enregistrez-la dans le chemin d’accès assets utilisé par votre exemple de langage.

Note

  • Vous avez besoin du dernier package sdk. Le sdk .NET est actuellement en préversion. Pour plus d’informations, consultez le guide de démarrage rapide .
  • Si vous utilisez la clé API pour l’authentification, votre ID de connexion doit être au format de /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Important

Pour que l’authentification par clé API fonctionne, votre fichier de spécification OpenAPI doit inclure :

  1. Section securitySchemes avec votre configuration de clé API, telle que le nom d’en-tête et le nom du paramètre.
  2. Section security qui fait référence au schéma de sécurité.
  3. Connexion de projet configurée avec le nom et la valeur de clé correspondants.

Sans ces configurations, la clé API n’est pas incluse dans les requêtes. Pour obtenir des instructions d’installation détaillées, consultez la section Authentifier avec la clé API .

Vous pouvez également utiliser l’authentification basée sur les jetons (par exemple, un jeton du porteur) en stockant le jeton dans une connexion de projet. Pour l’authentification par jeton porteur, créez une connexion de clés personnalisées avec la clé définie sur Authorization et la valeur définie sur Bearer <token> (remplacez <token> par votre jeton réel). Le mot Bearer suivi d’un espace doit être inclus dans la valeur. Pour plus d’informations, consultez Connexion avec un jeton Bearer.

Exemple d’utilisation d’agents avec l’outil OpenAPI

Cet exemple montre comment utiliser des services décrits par une spécification OpenAPI à l’aide d’un agent. Il utilise le service wttr.in pour obtenir le temps et son fichier de spécification weather_openapi.json. Sélectionnez Prompt Agents pour utiliser le SDK Azure AI Projects afin de créer un agent de prompt côté serveur, ou Agents hébergés pour utiliser le framework Microsoft Agent afin de créer un agent éphémère dans le processus.

Agents déclencheurs

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)

Cet exemple crée un assistant de requête avec un outil OpenAPI qui appelle l’API Weather wttr.in avec authentification anonyme. L’outil est attaché directement à la définition de l’agent. Lorsque vous exécutez le code :

  1. Il charge la spécification OpenAPI météorologique à partir d’un fichier JSON local.
  2. Crée un assistant de requête avec l’outil Weather configuré pour un accès anonyme.
  3. Envoie une requête demandant la météo de Seattle.
  4. L’agent utilise l’outil OpenAPI pour appeler l’API météo et retourne les résultats mis en forme.
  5. Nettoie en supprimant la version de l’agent.

Agents hébergés

Cet exemple utilise FoundryChatClient du framework Microsoft Agent et se connecte au point de terminaison MCP de la boîte à outils en utilisant FoundryToolbox. Installez les versions de package compatibles avec pip install "agent-framework-foundry==1.10.4" "azure-ai-projects>=2.3.0,<2.4.0" azure-identity jsonref, définissez la variable d’environnement FOUNDRY_PROJECT_ENDPOINT et connectez-vous avec az login. OpenApiToolboxTool est le modèle propre à la boîte à outils ; utilisez OpenApiTool uniquement lorsque vous attachez l’outil directement à un agent de prompt.

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

Sortie attendue

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

Exemple d’utilisation d’agents avec l’outil OpenAPI

Cet exemple montre comment utiliser des services décrits par une spécification OpenAPI à l’aide d’un agent. Il utilise le service wttr.in pour obtenir le temps et son fichier de spécification weather_openapi.json. Sélectionnez Prompt Agents pour utiliser le SDK Azure AI Projects afin de créer un agent de prompt côté serveur, ou Agents hébergés pour utiliser le framework Microsoft Agent afin de créer un agent éphémère dans le processus.

Agents déclencheurs

Cet exemple utilise des méthodes synchrones de la bibliothèque cliente Azure AI Projects. Pour obtenir un exemple qui utilise des méthodes asynchrones, consultez le sample dans le Kit de développement logiciel (SDK) Azure pour .NET référentiel sur 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);
    }
}

Ce que fait ce code

Cet exemple C# crée un agent avec un outil OpenAPI qui récupère les informations météorologiques de wttr.in à l’aide de l’authentification anonyme. Lorsque vous exécutez le code :

  1. Il lit la spécification OpenAPI météorologique à partir d’un fichier JSON local.
  2. Crée un agent avec l’outil météo configuré.
  3. Envoie une demande demandant la météo de Seattle à l’aide de l’outil OpenAPI.
  4. L’agent appelle l’API météo et retourne les résultats.
  5. Nettoie en supprimant de l’agent.

Entrées requises

  • Valeur de chaîne inline : projectEndpoint (point de terminaison de votre projet Foundry)
  • Fichier local : Assets/weather_openapi.json (spécification OpenAPI)

Sortie attendue

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

Erreurs courantes

  • FileNotFoundException: Fichier de spécification OpenAPI introuvable dans le dossier Assets
  • UnauthorizedAccessException: informations d’identification non valides ou autorisations RBAC insuffisantes
  • Clé API non injectée : vérifiez que votre spécification OpenAPI inclut à la fois securitySchemes (en components) et security les sections avec des noms de schéma correspondants

Agents hébergés

Cet exemple crée la boîte à outils OpenAPI avec le SDK Azure AI Projects, puis utilise l’intégration Microsoft Agent Framework AddFoundryToolboxes pour rendre l’outil disponible pour l’agent hébergé. Installez les packages Agent Framework, définissez le AZURE_AI_PROJECT_ENDPOINT point de terminaison du projet et AZURE_AI_MODEL_DEPLOYMENT_NAME les variables d’environnement, puis connectez-vous avec 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();

Sortie attendue

L’agent appelle l’API météo via l’outil OpenAPI et retourne les conditions actuelles pour l’emplacement demandé :

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

Pour obtenir l’exemple complet, y compris les modèles d’API authentifiés, consultez Agent_Step17_OpenAPITools.


Exemple d’utilisation d’agents avec l’outil OpenAPI sur le service web, nécessitant une authentification

Dans cet exemple, vous ajoutez un outil OpenAPI authentifié à une boîte à outils, attachez la boîte à outils en tant qu’outil MCP et utilisez l’agent dans un scénario nécessitant une authentification. Vous utilisez la spécification TripAdvisor.

Le service Trip Advisor nécessite une authentification basée sur des clés. Pour créer une connexion, ouvrez Microsoft Foundry, sélectionnez Gérer dans le volet de navigation supérieur droit, sélectionnez Project détails, puis sélectionnez l’onglet Ressources connectées. Enfin, créez une connexion de type de clés personnalisées. Nommez-le tripadvisor et ajoutez une paire clé-valeur. Ajoutez une clé nommée key et entrez une valeur avec votre clé Trip Advisor.

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

Ce que fait ce code

Cet exemple C# illustre l’utilisation d’un outil OpenAPI avec l’authentification par clé API via une boîte à outils et une connexion de projet. Lorsque vous exécutez le code :

  1. Il charge la spécification TripAdvisor OpenAPI à partir d’un fichier local.
  2. Récupère la connexion du projet tripadvisor contenant votre clé API.
  3. Crée une version de la boîte à outils contenant l’outil TripAdvisor configuré pour utiliser la connexion à des fins d’authentification.
  4. Attache la boîte à outils à l’assistant en tant qu’outil MCP.
  5. Envoie une demande de recommandations d’hôtel à Paris.
  6. L’agent appelle l’API Trip Advisor à l’aide de votre clé API stockée et retourne les résultats.
  7. Nettoie en supprimant de l’agent.

Entrées requises

  • Valeur de chaîne inline : projectEndpoint (point de terminaison de votre projet Foundry)
  • Fichier local : Assets/tripadvisor_openapi.json
  • connexion Project : tripadvisor avec une clé API valide configurée

Sortie attendue

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

Erreurs courantes

  • ConnectionNotFoundException: Aucune connexion de projet nommée tripadvisor trouvée.
  • AuthenticationException: clé API non valide dans la connexion de projet, ou configuration manquante/incorrecte securitySchemes dans la spécification OpenAPI.
  • Outil non utilisé : vérifiez que ToolChoice = ResponseToolChoice.CreateRequiredChoice() impose l’utilisation de l’outil.
  • Clé API non transmise à l’API : vérifiez que la spécification OpenAPI a des sections appropriées securitySchemes et security configurées.

Créer un agent Java avec des fonctionnalités d’outil OpenAPI

Cette configuration Java peut référencer les outils MCP, mais le SDK Java n'expose pas encore d'API de création de boîte à outils.

Conseil

Recommandé: Pour la plupart des agents, ajoutez l’outil OpenAPI via une boîte à outils et joignez la boîte à outils à votre agent en tant qu’outil MCP. Créez la boîte à outils à l’aide de l’exemple Python, API REST, C# ou TypeScript, ou du portail Foundry, puis référencez son point de terminaison MCP à partir de votre agent Java en tant que McpTool.

Les exemples suivants montrent comment appeler un outil OpenAPI à l’aide de l’API REST.

Obtenez un jeton d’accès :

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

Authentification anonyme

Ajoutez des outils OpenAPI via une boîte à outils, puis attachez la boîte à outils à votre agent en tant qu’outil MCP. Pour plus d’informations, consultez Qu’est-ce qu’une boîte à outils ?

  1. Créez une boîte à outils qui contient l’outil météo 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" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

La boîte à outils expose un point de terminaison compatible MCP à l’emplacement $FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1<version> est la version retournée par l’appel précédent.

  1. Créez une connexion de projet d’outil distant qui pointe vers le point de terminaison de la boîte à outils, en utilisant un jeton Entra utilisateur afin que l’identité de l’appelant soit transmise (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. Créez une réponse qui utilise la boîte à outils en l’attachant en tant qu’outil 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"
      }
    ]
  }'

Authentification par clé API (connexion de projet)

Utilisez cette variante uniquement une fois le flux anonyme réussi. Configurez la connexion du projet et l’entrée OpenAPI securitySchemes , comme décrit dans Authentifier avec la clé 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": [] }
            ]
          }
        }
      }
    ]
  }'

Pour une API de jeton de porteur, conservez la même project_connection forme de requête, mais utilisez une connexion configurée comme décrit dans Configurer une connexion de jeton du porteur. La valeur de connexion doit commencer par Bearer, suivi d’un espace.

Authentification d’identité managée

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

Ce que fait ce code

Cet exemple d’API REST montre comment appeler un outil OpenAPI avec différentes méthodes d’authentification. La demande :

  1. Pour l’authentification anonyme, crée une boîte à outils contenant la définition de l’outil OpenAPI et la spécification de l’API météo.
  2. Crée une réponse qui attache la boîte à outils en tant qu’outil MCP et demande la météo de Seattle.
  3. Affiche des définitions d’outils REST directes supplémentaires pour la clé API via la connexion de projet et l’authentification d’identité managée.
  4. L’agent utilise l’outil pour appeler l’API météo et retourner des résultats mis en forme.

Entrées requises

  • Variables d’environnement : FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • Pour l’authentification de clé API : WEATHER_APP_PROJECT_CONNECTION_ID.
  • Pour l’authentification d’identité managée : MANAGED_IDENTITY_AUDIENCE.
  • Spécification OpenAPI inline dans le corps de la requête.

Sortie attendue

{
  "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)..."
        }
      ]
    }
  ]
}

Erreurs courantes

  • 401 Unauthorized: non valide ou manquant AGENT_TOKEN, ou clé API non injectée car securitySchemes et security sont manquants dans votre spécification OpenAPI
  • 404 Not Found: nom de modèle ou de point de terminaison incorrect pour le déploiement
  • 400 Bad Request: Spécification OpenAPI incorrecte ou configuration d’authentification non valide
  • Clé API non envoyée avec demande : vérifiez que la components.securitySchemes section de votre spécification OpenAPI est correctement configurée (pas vide) et correspond au nom de la clé de connexion de votre projet.

Créer un agent avec des fonctionnalités d’outil OpenAPI

L’exemple de code TypeScript suivant montre comment créer un agent IA avec des fonctionnalités d’outil OpenAPI en ajoutant l’outil OpenAPI à une boîte à outils et en attachant la boîte à outils en tant qu’outil MCP. L’agent peut appeler des API externes définies par les spécifications OpenAPI. Pour obtenir une version JavaScript de cet exemple, consultez l'sample dans le Kit de développement logiciel (SDK) Azure pour le référentiel JavaScript sur 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);
});

Ce que fait ce code

Cet exemple TypeScript crée un agent avec un outil OpenAPI pour les données météorologiques à l’aide de l’authentification anonyme. Lorsque vous exécutez le code :

  1. Il charge la spécification OpenAPI météorologique à partir d’un fichier JSON local.
  2. Crée une version de boîte à outils contenant l’outil météo.
  3. Associe la boîte à outils à l’agent en tant qu’outil MCP, puis envoie une requête en streaming sur la météo à Seattle et la tenue à prévoir.
  4. Traite la réponse en flux et affiche les deltas au fur et à mesure de leur arrivée.
  5. Il impose l'utilisation de l'outil en utilisant tool_choice: "required" pour garantir que l'API est appelée.
  6. Nettoie en supprimant de l’agent.

Entrées requises

  • Valeur de chaîne inline : PROJECT_ENDPOINT (point de terminaison de votre projet Foundry)
  • Fichier local : ../assets/weather_openapi.json (spécification OpenAPI)

Sortie attendue

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!

Erreurs courantes

  • Error: OpenAPI specification not found: chemin d’accès du fichier incorrect ou fichier manquant
  • AuthenticationError : informations d’identification de Azure non valides
  • Clé API non fonctionnelle : si vous passez de l’authentification anonyme à l’authentification par clé API, vérifiez que votre spécification OpenAPI a securitySchemes et security correctement configurés

Créer un agent qui utilise des outils OpenAPI authentifiés avec une connexion de projet

L’exemple de code TypeScript suivant montre comment créer un agent IA qui utilise des outils OpenAPI authentifiés via une connexion de projet. L’agent charge la spécification Trip Advisor OpenAPI à partir de ressources locales et peut appeler l’API via la connexion de projet configurée. Pour obtenir une version JavaScript de cet exemple, consultez l'sample dans le Kit de développement logiciel (SDK) Azure pour le référentiel JavaScript sur 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);
});

Ce que fait ce code

Cet exemple TypeScript illustre l’utilisation d’un outil OpenAPI avec l’authentification par clé API via une connexion de projet. Lorsque vous exécutez le code :

  1. Il charge la spécification TripAdvisor OpenAPI à partir d’un fichier local.
  2. Il configure l’authentification à l’aide de la TRIPADVISOR_CONNECTION_ID constante.
  3. Il crée un agent avec l’outil TripAdvisor qui utilise la connexion de projet pour l’authentification par API clé.
  4. Il envoie une demande de streaming pour les détails de l’emplacement TripAdvisor.
  5. Il impose l'utilisation de l'outil en utilisant tool_choice: "required" pour garantir que l'API est appelée.
  6. Il traite et affiche la réponse de diffusion en continu.
  7. Il effectue un nettoyage en supprimant l’agent.

Entrées requises

  • Valeurs de chaîne en ligne : PROJECT_ENDPOINT, TRIPADVISOR_CONNECTION_ID
  • Fichier local : ../assets/tripadvisor_openapi.json
  • Connexion du projet configurée avec la clé API TripAdvisor

Sortie attendue

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!

Erreurs courantes

  • Error: OpenAPI specification not found: vérifiez le chemin du fichier.
  • Connexion introuvable : vérifiez TRIPADVISOR_CONNECTION_ID que la connexion est correcte et qu’elle existe.
  • AuthenticationException: clé API non valide dans la connexion de projet.
  • Clé API non injectée dans les requêtes : votre spécification OpenAPI doit inclure correctement les sections sous securitySchemes, components, et security. Le nom de clé dans securitySchemes doit correspondre à la clé dans votre connexion de projet.
  • Content type is not supported: Actuellement, seuls ces deux types de contenu de corps de requête sont pris en charge : application/json et application/json-patch+json. Les types de contenu de réponse ne sont pas limités.

Considérations relatives à la sécurité et aux données

Lorsque vous connectez un agent à un outil OpenAPI, l’agent peut envoyer des paramètres de requête dérivés de l’entrée utilisateur à l’API cible.

  • Utilisez des connexions de projet pour les secrets (clés API et jetons). Évitez de placer des secrets dans un fichier de spécification OpenAPI ou du code source.
  • Passez en revue les données reçues par l’API et ce qu’elle retourne avant d’utiliser l’outil en production.
  • Utilisez l’accès avec des privilèges minimum. Pour l’identité managée, affectez uniquement les rôles dont le service cible a besoin.

S’authentifier avec la clé API

Utilisez cette variante pour une API qui attend une clé dans un paramètre d’en-tête ou de requête. Vous ne pouvez utiliser qu’un seul schéma de sécurité de clé API par outil OpenAPI. Si l’API nécessite plusieurs schémas de sécurité, créez plusieurs outils OpenAPI.

  1. Mettez à jour vos schémas de sécurité de spécification OpenAPI. Il a une securitySchemes section et un schéma de type apiKey. Par exemple :

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

    Vous devez généralement mettre à jour le champ name, qui correspond au nom de key dans la connexion. Si les schémas de sécurité incluent plusieurs schémas, ne conservez qu’un seul d’entre eux.

  2. Mettez à jour votre spécification OpenAPI pour inclure une security section :

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. Supprimez n’importe quel paramètre dans la spécification OpenAPI nécessitant une clé API, car la clé API est stockée et transmise via une connexion, comme décrit plus loin dans cet article.

  4. Créez une connexion pour stocker votre clé API.

  5. Accédez au portail Foundry et ouvrez votre projet.

  6. Créez ou sélectionnez une connexion qui stocke le secret. Consultez Ajouter une nouvelle connexion à votre projet.

    Note

    Si vous régénérez la clé API à une date ultérieure, vous devez mettre à jour la connexion avec la nouvelle clé.

  7. Entrez les informations suivantes

    • clé : name champ de votre schéma de sécurité. Dans cet exemple, il doit être x-api-key

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

  8. Après avoir créé une connexion, vous pouvez l’utiliser via le Kit de développement logiciel (SDK) ou l’API REST. Utilisez les onglets en haut de cet article pour afficher des exemples de code.

Configurer une connexion de jeton porteur

Utilisez cette variante pour une API qui attend un jeton de porteur dans l’en-tête Authorization. Il utilise le même project_connection type d’authentification que l’authentification par clé API, mais le schéma de sécurité OpenAPI et les valeurs de connexion diffèrent.

Votre spécification OpenAPI se présente comme suit :

  BearerAuth:
    type: http
    scheme: bearer
    bearerFormat: JWT

Vous devez :

  1. Mettez à jour votre spécification securitySchemes OpenAPI pour l’utiliser Authorization comme nom d’en-tête :

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Ajoutez une security section qui référence le schéma :

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Créez une connexion de clés personnalisées dans votre projet Foundry :

    1. Accédez au portail Foundry et ouvrez votre projet.
    2. Créez ou sélectionnez une connexion qui stocke le secret. Consultez Ajouter une nouvelle connexion à votre projet.
    3. Entrez les valeurs suivantes :
      • clé : Authorization (doit correspondre au name champ dans votre securitySchemes)
      • valeur : Bearer <token> (remplacez <token> par votre jeton réel)

    Important

La valeur doit inclure le mot Bearer suivi d’un espace avant le jeton. Par exemple : Bearer eyJhbGciOiJSUzI1NiIs.... Si vous omettez le préfixe et l’espace Bearer suivant, l’API reçoit un jeton brut sans le préfixe de schéma d’autorisation requis et la requête échoue.

  1. Après avoir créé la connexion, utilisez-la avec le project_connection type d’authentification dans votre code, de la même façon que pour l’authentification par clé API. L’ID de connexion utilise le même format : /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

S’authentifier à l’aide de l’identité managée (Microsoft Entra ID)

Microsoft Entra ID est un service de gestion des identités et des accès cloud que vos employés peuvent utiliser pour accéder aux ressources externes. En utilisant Microsoft Entra ID, vous pouvez ajouter une sécurité supplémentaire à vos API sans avoir à utiliser de clés API. Lorsque vous configurez l’authentification d’identité managée, l’agent s’authentifie via l’outil Foundry qu’il utilise.

Important

L’authentification d’identité managée fonctionne uniquement lorsque le service cible accepte des jetons Microsoft Entra ID. Si l'API cible utilise un schéma d'authentification personnalisé qui ne prend pas en charge Microsoft Entra ID, utilisez l'authentification par clé API ou token Bearer à la place.

Comprendre l’URI de l’audience

L’identificateur audience (parfois appelé identificateur resource ou URI d’ID d’application) indique Microsoft Entra ID quel service ou API le jeton est destiné à accéder. La valeur d’audience doit correspondre à ce que le service cible attend, ou l’authentification échoue avec une erreur 401.

Note

L’audience n’est pas le point de terminaison de votre projet Foundry. Il s’agit de l’identificateur de ressource du service cible que votre outil OpenAPI appelle.

Le tableau suivant répertorie les URI d’audience pour les services Azure courants :

Service cible URI d’audience
stockage Azure https://storage.azure.com
Azure Key Vault https://vault.azure.net
Recherche Azure AI https://search.azure.com
Azure Logic Apps https://logic.azure.com
Gestion des API Azure (plan de gestion) https://management.azure.com
API protégée par une inscription d’application Microsoft Entra (y compris APIM avec OAuth) URI d'ID d'application de l'enregistrement de votre application (par exemple, api://<client-id>)

Conseil

Si vous utilisez Gestion des API Azure pour protéger une API personnalisée avec une stratégie de validation OAuth 2.0, l’audience est l’URI de l’ID d’application de l’inscription d’application qui protège l’API , et non https://management.azure.com. L’audience du plan de gestion s’applique uniquement aux opérations de Azure Resource Manager sur la ressource APIM elle-même.

Pour plus d’informations sur la façon dont les agents s’authentifient avec Microsoft Entra ID, consultez Identité et authentificationagent.

Rechercher et vérifier votre audience

Procédez comme suit pour déterminer et vérifier la valeur d’audience correcte :

  • For Azure services : consultez la documentation du service pour connaître son identificateur de ressource Microsoft Entra ID. La plupart des services Azure répertorient l’URI d’audience dans leur documentation d’authentification.
  • Pour les API protégées par une inscription d'application Microsoft Entra : dans le portail Azure, accédez à Microsoft Entra ID>inscriptions d'applications> sélectionnez votre application >Exposer une API. L’URI d’ID d’application en haut de la page correspond à votre valeur d’audience.
  • Pour vérifier le public cible d’un jeton : décoder le jeton d’accès et https://jwt.ms vérifier l’aud affirmation. La aud valeur doit correspondre à l’audience attendue par votre service cible.

Configurer l’authentification d’identité managée

Pour configurer l’authentification à l’aide de Managed Identity :

  1. Vérifiez que votre ressource Foundry a activé l’identité managée affectée par le système.

Capture d’écran du portail Azure montrant les paramètres d’identité managée affectée par le système.

  1. Créez une ressource pour le service auquel vous souhaitez vous connecter via la spécification OpenAPI.

  2. Attribuez un accès approprié à la ressource.

    1. Sélectionnez Access Control pour votre ressource.

    2. Sélectionnez Ajouter , puis ajoutez une attribution de rôle en haut de l’écran.

      Capture d’écran du portail Azure montrant l’action Ajouter une attribution de rôle.

  3. Sélectionnez le rôle de plan de données ou d’application le moins privilégié qui accorde les opérations dans votre spécification OpenAPI. Le seul accès Reader à Azure Resource Manager ne confère pas d’accès au plan de données. Ensuite, sélectionnez Suivant.

  4. Sélectionnez Identité managée , puis sélectionnez membres.

  5. Dans le menu déroulant identité managée, recherchez Le compte Foundry , puis sélectionnez le compte Foundry de votre agent.

  6. Sélectionnez Terminer.

  7. Une fois l’installation terminée, vous pouvez continuer à l’aide de l’outil via le portail Foundry, le SDK ou l’API REST. Utilisez les onglets en haut de cet article pour afficher des exemples de code.

Résoudre les erreurs courantes

Symptôme Cause probable Résolution
La clé API n’est pas incluse dans les requêtes. Les sections securitySchemes ou security de la spécification OpenAPI sont manquantes. Vérifiez que votre spécification OpenAPI inclut à la fois components.securitySchemes et une section de niveau security supérieur. Vérifiez que le schéma name correspond au nom de clé dans la connexion de votre projet.
L’agent n’appelle pas l’outil OpenAPI. Le choix de l’outil n’est pas défini ou operationId non descriptif. Utilisez tool_choice="required" pour forcer l'appel de l'outil. Vérifiez que les operationId valeurs sont descriptives afin que le modèle puisse choisir l’opération appropriée.
L’authentification échoue pour l’identité managée. Identité managée non activée ou attribution de rôle manquante. Activez l’identité managée affectée par le système sur votre ressource Foundry. Attribuez le rôle d’application ou de plan de données le moins privilégié du service cible pour les opérations de votre spécification OpenAPI.
L’identité managée retourne 401 même si le rôle est attribué. L’URI d’audience ne correspond pas à ce que le service cible attend. Vérifiez que l’URI d’audience correspond à l’identificateur de ressource du service cible. Pour Azure services, consultez la documentation du service. Pour les API protégées par Microsoft Entra, utilisez l’URI d’ID d’application de votre inscription d’application. Décodez le jeton à https://jwt.ms et confirmez que la revendication aud correspond. Consultez Comprendre l’URI de l’audience.
Jeton d’identité managée rejeté par l’API cible. Le service cible n'accepte pas les jetons Microsoft Entra ID. Vérifiez que le service cible prend en charge l’authentification Microsoft Entra ID. Si ce n’est pas le cas, utilisez plutôt la clé API ou l’authentification par jeton du porteur.
La requête échoue avec le code 400 Requête Incorrecte. Les spécifications OpenAPI ne correspondent pas à l’API réelle. Validez votre spécification OpenAPI par rapport à l’API réelle. Vérifiez les noms, les types et les champs obligatoires des paramètres.
La demande échoue avec erreur 401 Non autorisée. Clé API ou jeton non valide ou expiré. Régénérez la clé/le jeton d’API et mettez à jour votre connexion de projet. Vérifiez que l’ID de connexion est correct.
L’outil retourne un format de réponse inattendu. Schéma de réponse non défini dans la spécification OpenAPI. Ajoutez des schémas de réponse à votre spécification OpenAPI pour une meilleure compréhension du modèle.
operationId erreur de validation. Caractères non valides dans operationId. Utilisez uniquement des lettres, - et _ dans operationId valeurs. Supprimez des nombres et des caractères spéciaux.
Erreur : Connexion introuvable Nom de connexion ou incompatibilité d’ID. Vérifiez que OPENAPI_PROJECT_CONNECTION_NAME correspond au nom de la connexion dans votre projet Foundry.
Jeton porteur non envoyé correctement. Il manque à la valeur de connexion le préfixe Bearer et l’espace qui suit. Définissez la valeur Bearer <token> de connexion sur (avec le mot Bearer et un espace avant le jeton). Vérifiez que la spécification securitySchemes OpenAPI utilise "name": "Authorization".

Choisir une méthode d’authentification

Le tableau suivant vous aide à choisir la méthode d’authentification appropriée pour votre outil OpenAPI :

Méthode d’authentification Idéal pour Complexité de l’installation
Anonyme API publiques sans authentification Faible
Clé API API non Microsoft avec accès basé sur des clés Moyen
Identité managée Azure services et API protégées par Microsoft Entra ID. Nécessite que le service cible accepte les jetons Microsoft Entra ID et prenne en charge le contrôle d'accès basé sur Azure RBAC ou le contrôle d'accès basé sur Microsoft Entra. Moyen-Haut