Agents verbinden met OpenAPI-hulpprogramma's

Verbind uw Microsoft Foundry-agents met externe API's met behulp van OpenAPI 3.0- en 3.1-specificaties. Het Foundry-model dat uw agent aandrijft, kan externe services aanroepen, realtime gegevens ophalen en de mogelijkheden van de agent uitbreiden buiten de ingebouwde functies.

OpenAPI-specificaties definiëren een standaardmethode voor het beschrijven van HTTP-API's, zodat u bestaande services kunt integreren met uw agents. Microsoft Foundry ondersteunt drie verificatiemethoden: anonymous, API key en managed identity. Zie Een verificatiemethode kiezen voor hulp bij het kiezen van een verificatiemethode.

Tip

Overweeg dit hulpprogramma toe te voegen met behulp van een werkset. Met behulp van een werkset kunt u het hulpprogramma opnieuw gebruiken tussen agents en runtimes, evenals het centraliseren van referentiebeheer, versiebeheer en het afdwingen van beleid via een beheerd MCP-eindpunt. Zie de snelstartgids voor de toolbox.

Voorwaarden

Voordat u begint, moet u ervoor zorgen dat u het volgende hebt:

  • Een Azure-abonnement met de juiste machtigingen.

  • Foundry User-rol voor het Foundry-project om agents te maken en uit te voeren.

    Belangrijk

    De rollen Foundry RBAC zijn onlangs hernoemd. Foundry User, Foundry Owner, Foundry Account Owner en Foundry Project Manager zijn eerder benoemd Azure AI-gebruiker, Azure AI-eigenaar Azure AI-accounteigenaar en Azure AI Project Manager. Het kan zijn dat u op sommige plekken nog steeds de vorige namen ziet terwijl de naamswijziging wordt doorgevoerd. De rol-id's en basismachtigingen worden niet gewijzigd door de naamswijziging.

  • Foundry Project Manager-rol in de Foundry-project als u een project-verbinding maakt voor API-sleutel- of tokenverificatie.

  • Een Foundry-project dat is gemaakt met een eindpunt dat is geconfigureerd.

  • Een AI-model dat in uw project is geïmplementeerd. Controleer of zowel het model als de projectregio OpenAPI-hulpprogramma's in Hulpprogramma-ondersteuning per regio en model ondersteunen.

  • Een basis- of standaardagentomgeving.

  • SDK geïnstalleerd voor uw voorkeurstaal:

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

Omgevingsvariabelen

Variabele Beschrijving
FOUNDRY_PROJECT_ENDPOINT De eindpunt-URL van uw Foundry-project (niet het externe OpenAPI-service-eindpunt).
FOUNDRY_MODEL_DEPLOYMENT_NAME De naam van het geïmplementeerde model.
OPENAPI_PROJECT_CONNECTION_NAME (Voor verificatie van API-sleutels) De naam van de projectverbinding voor de OpenAPI-service.
  • OpenAPI 3.0- of 3.1-specificatiebestand dat voldoet aan deze vereisten:
    • Elke functie moet een operationId (vereist voor het OpenAPI-hulpprogramma) hebben.
    • operationId mag alleen letters bevatten, -en _.
    • Gebruik beschrijvende namen om modellen efficiënt te helpen bepalen welke functie moet worden gebruikt.
    • Ondersteunde inhoudstypen voor de hoofdtekst van de aanvraag: application/json, application/json-patch+json
  • Voor verificatie van beheerde identiteiten: de minst bevoegde doelservicerol die de vereiste API-bewerkingen toestaat, toegewezen aan de beheerde identiteit van het Foundry-project op het doelresourcebereik.
  • Voor API-sleutel-/tokenverificatie: een projectverbinding die is geconfigureerd met uw API-sleutel of token. Zie Een nieuwe verbinding met uw project toevoegen.

Opmerking

De FOUNDRY_PROJECT_ENDPOINT-waarde verwijst naar het eindpunt van uw Microsoft Foundry-project, niet naar het externe OpenAPI-service-eindpunt. U vindt dit eindpunt in de Microsoft Foundry-portal onder de overzichtspagina van uw project. Dit eindpunt is vereist om de agentservice te verifiëren en is gescheiden van alle OpenAPI-eindpunten die zijn gedefinieerd in uw specificatiebestand.

Gebruiksondersteuning

In de volgende tabel ziet u SDK- en installatieondersteuning.

ondersteuning voor Microsoft Foundry Python SDK C#SDK JavaScript SDK Java SDK REST API Basisagent instellen Standaardagent configureren
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Opmerking

Gebruik voor Java het pakket com.azure:azure-ai-agents voor OpenAPI-agenthulpprogramma's. Het com.azure:azure-ai-projects pakket stelt momenteel geen OpenAPI-agenthulpprogrammatypen bloot.

Voer de anonieme flow voor eerste succes uit

Begin met de anonieme weer-API om te controleren of uw agent een OpenAPI-specificatie kan laden en een bewerking kan aanroepen. Voor dit pad is geen externe API-referentie of een Foundry-projectverbinding vereist.

  1. Installeer het SDK-pakket voor de geselecteerde taal vanuit vereisten.
  2. Download weather_openapi.jsonen sla het op in het assets pad dat door het voorbeeld wordt gebruikt.
  3. Stel uw Foundry-projecteindpunt en modelimplementatiewaarden in.
  4. Voer het anonieme voorbeeld uit in de geselecteerde taalsectie.
  5. Controleer of het antwoord het huidige weer voor Seattle bevat en verwijder vervolgens de agentversie die door het voorbeeld is gemaakt.

Nadat de anonieme aanroep is geslaagd, configureert u de verificatie die is vereist voor uw doel-API. Behoud API-sleutelverificatie, bearer-tokenverificatie en beheerde identiteitsverificatie als afzonderlijke varianten.

Beperkingen begrijpen

  • De OpenAPI-specificatie moet operationId voor elke bewerking bevatten en operationId kan alleen letters, -, en _ bevatten.
  • Ondersteunde inhoudstypen voor de hoofdtekst van de aanvraag: application/json, application/json-patch+json.
  • Voor VERIFICATIE van API-sleutels gebruikt u één API-sleutelbeveiligingsschema per OpenAPI-hulpprogramma. Als u meerdere beveiligingsschema's nodig hebt, maakt u meerdere OpenAPI-hulpprogramma's.
  • Draai API-sleutels en bearertokens regelmatig en onmiddellijk na verdachte blootstelling. Werk de projectverbinding bij wanneer referenties veranderen; plaats geen referenties in de OpenAPI-specificatie of broncode.

OpenAPI-hulpprogramma's toevoegen aan een werkset

Gebruik dit patroon om een REST API beschikbaar te maken die wordt beschreven door een OpenAPI-specificatie. Kies het auth.type beveiligingsmodel van uw API.

Belangrijk

Wanneer u verificatie van beheerde identiteiten gebruikt, wijst u alleen de RBAC-rol met minimale bevoegdheden toe waarmee de vereiste API-bewerkingen worden toegestuurd aan de beheerde identiteit van uw Foundry-project op de doelservice. Wijs bijvoorbeeld Reader alleen toe aan de doel-Azure-resource als de API alleen-leestoegang tot Azure Resource Manager nodig heeft. Zonder de vereiste toewijzing ontvangt de agent een 401 Unauthorized antwoord bij het aanroepen van de API. Zie Verifiëren met behulp van beheerde identiteit voor volledige installatiestappen.

Anonieme authenticatie:

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

Authenticatie van projectverbinding:

Gebruik dit patroon wanneer voor de API een sleutel of token is vereist die is opgeslagen in een Foundry-projectverbinding.

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

Verificatie van beheerde identiteit:

Gebruik dit patroon wanneer de doel-API wordt geverifieerd via Microsoft Entra-id. De beheerde identiteit van het Foundry-project roept de API aan namens de agent. Zorg ervoor dat de beheerde identiteit de vereiste RBAC-rol heeft voor de doelservice voordat u dit patroon gebruikt.

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

Een OpenAPI-werkset maken met de Azure Developer CLI

OpenAPI-hulpprogramma's sluiten de specificatie rechtstreeks onder tools:in. Verificatie op basis van een verbinding (connection_auth) verwijst naar een projectverbinding. Anonieme OpenAPI-hulpprogramma's hebben geen verbinding nodig.

Stap 1. (Optioneel) De verificatieverbinding maken

Sla deze stap over voor anonieme OpenAPI-hulpprogramma's.

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

OpenAPI-tools accepteren ook --auth-type oauth2-verbindingen. Zie Toolbox MCP-authenticatie en -configuratie voor de volledige lijst met azd ai connection create-vlaggen.

Stap 2. Toolbox definiëren

De OpenAPI-specificatie staat inline bij 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

Voor anonieme API's vervangt u het auth: blok door:

      auth:
        type: anonymous
        security_scheme:
          type: anonymous

Stap 3. Maak de werkset

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

Voordat u de codevoorbeelden uitvoert

  • Download de onderhouden tripadvisor_openapi.json specificatie en sla deze op in het assets pad dat wordt gebruikt door uw taalvoorbeeld.

Opmerking

  • U hebt het nieuwste SDK-pakket nodig. De .NET SDK is momenteel in een preview-fase. Zie de quickstart voor meer informatie.
  • Als u een api-sleutel gebruikt voor authenticatie, moet uw verbindings-id in de indeling /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}} zijn.

Belangrijk

Verificatie van API-sleutels werkt alleen als uw OpenAPI-specificatiebestand het volgende bevat:

  1. Een securitySchemes sectie met de configuratie van uw API-sleutel, zoals de headernaam en parameternaam.
  2. Een security sectie die verwijst naar het beveiligingsschema.
  3. Een projectverbinding die is geconfigureerd met de overeenkomende sleutelnaam en -waarde.

Zonder deze configuraties is de API-sleutel niet opgenomen in aanvragen. Zie de sectie Verifiëren met API-sleutel voor gedetailleerde installatie-instructies.

U kunt ook verificatie op basis van tokens (bijvoorbeeld een Bearer-token) gebruiken door het token op te slaan in een projectverbinding. Voor bearer-tokenverificatie maakt u een aangepaste sleutelsverbinding met de sleutel die is ingesteld op Authorization en de waarde is ingesteld op Bearer <token> (vervang door <token> uw werkelijke token). Het woord Bearer gevolgd door een spatie moet worden opgenomen in de waarde. Zie Een Bearer-tokenverbinding instellen voor meer informatie.

Voorbeeld van het gebruik van agenten met de OpenAPI-tool

In dit voorbeeld ziet u hoe u services gebruikt die worden beschreven door een OpenAPI-specificatie met behulp van een agent. De service wttr.in wordt gebruikt voor het ophalen van het weer en het specificatiebestand weather_openapi.json. Selecteer Prompt Agents om de Azure AI Projects SDK te gebruiken om een promptagent aan de serverzijde te maken of Hosted Agents om het Microsoft Agent Framework te gebruiken om een tijdelijke, in-process agent te maken.

Agents aansturen

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)

In dit voorbeeld wordt een promptagent gemaakt met een OpenAPI-hulpprogramma waarmee de wttr.in weer-API wordt aangeroepen met behulp van anonieme verificatie. Het hulpprogramma wordt rechtstreeks aan de agentdefinitie gekoppeld. Wanneer u de code uitvoert:

  1. De Weer OpenAPI-specificatie wordt geladen vanuit een lokaal JSON-bestand.
  2. Maakt een prompt-agent met de weertool geconfigureerd voor anonieme toegang.
  3. Hiermee wordt een query verzonden waarin wordt gevraagd naar het weer van Seattle.
  4. De agent gebruikt het OpenAPI-hulpprogramma om de weer-API aan te roepen en retourneert opgemaakte resultaten.
  5. Schoont op door de agentversie te verwijderen.

Gehoste agents

In dit voorbeeld wordt FoundryChatClient gebruikgemaakt van het Microsoft Agent Framework en wordt verbinding gemaakt met het MCP-eindpunt van de werkset met behulp van FoundryToolbox. Installeer compatibele pakketversies met pip install "agent-framework-foundry==1.10.4" "azure-ai-projects>=2.3.0,<2.4.0" azure-identity jsonref, stel de FOUNDRY_PROJECT_ENDPOINT omgevingsvariabele in en meld u aan met az login. OpenApiToolboxTool is het werksetspecifieke model; alleen gebruiken OpenApiTool bij het rechtstreeks koppelen van het hulpprogramma aan een promptagent.

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

Verwachte uitvoer

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

Voorbeeld van het gebruik van agenten met de OpenAPI-tool

In dit voorbeeld ziet u hoe u services gebruikt die worden beschreven door een OpenAPI-specificatie met behulp van een agent. De service wttr.in wordt gebruikt voor het ophalen van het weer en het specificatiebestand weather_openapi.json. Selecteer Prompt Agents om de Azure AI Projects SDK te gebruiken om een promptagent aan de serverzijde te maken of Hosted Agents om het Microsoft Agent Framework te gebruiken om een tijdelijke, in-process agent te maken.

Agents aansturen

In dit voorbeeld worden synchrone methoden van de Azure AI Projects-clientbibliotheek gebruikt. Zie de sample in de Azure SDK voor .NET opslagplaats op GitHub voor een voorbeeld waarin asynchrone methoden worden gebruikt.

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

Wat deze code doet

In dit C#-voorbeeld wordt een agent gemaakt met een OpenAPI-hulpprogramma waarmee weergegevens uit wttr.in worden opgehaald met behulp van anonieme verificatie. Wanneer u de code uitvoert:

  1. Het leest de Weer OpenAPI-specificatie uit een lokaal JSON-bestand.
  2. Hiermee maakt u een agent met de weertool geconfigureerd.
  3. Met de OpenAPI-tool wordt een aanvraag verzonden waarin gevraagd wordt naar het weer in Seattle.
  4. De agent roept de weer-API aan en retourneert de resultaten.
  5. Schoont de agent op door de agent te verwijderen.

Vereiste invoer

  • Inline-tekenreekswaarde: projectEndpoint (het eindpunt van het Foundry-project)
  • Lokaal bestand: Assets/weather_openapi.json (OpenAPI-specificatie)

Verwachte uitvoer

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

Veelvoorkomende fouten

  • FileNotFoundException: Bestand met OpenAPI-specificatie is niet gevonden in de map Assets
  • UnauthorizedAccessException: Ongeldige referentiegegevens of onvoldoende RBAC-machtigingen
  • API-sleutel niet geïnjecteerd: Controleer of de OpenAPI-specificatie zowel securitySchemes (in components) als security secties met overeenkomende schemanamen bevat

Gehoste agents

In dit voorbeeld wordt de OpenAPI-werkset gemaakt met de Azure AI Projects SDK en wordt vervolgens de Microsoft Agent Framework-integratie AddFoundryToolboxes gebruikt om het hulpprogramma beschikbaar te maken voor de gehoste agent. Installeer de Agent Framework-pakketten, stel het projecteindpunt en AZURE_AI_PROJECT_ENDPOINT de AZURE_AI_MODEL_DEPLOYMENT_NAME omgevingsvariabelen in en meld u aan met 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();

Verwachte uitvoer

De agent roept de weer-API aan via het OpenAPI-hulpprogramma en retourneert de huidige voorwaarden voor de aangevraagde locatie:

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

Zie Agent_Step17_OpenAPITools voor het volledige voorbeeld, inclusief geverifieerde API-patronen.


Voorbeeld van het gebruik van agents met het OpenAPI-hulpprogramma in de webservice, waarvoor verificatie is vereist

In dit voorbeeld voegt u een geverifieerd OpenAPI-hulpprogramma toe aan een werkset, koppelt u de werkset als een MCP-hulpprogramma en gebruikt u de agent in een scenario waarvoor verificatie is vereist. U gebruikt de TripAdvisor-specificatie.

Voor de TripAdvisor-service is verificatie op basis van sleutels vereist. Als u een verbinding wilt maken, opent u Microsoft Foundry, selecteert u Beheren in de navigatie rechtsboven, selecteert u Project details en selecteert u vervolgens het tabblad Verbonden resources. Maak ten slotte een nieuwe verbinding van het type Aangepaste sleutels. Geef deze tripadvisor een naam en voeg een sleutelwaardepaar toe. Voeg een sleutel toe met de naam key en voer een waarde in met uw TripAdvisor-sleutel.

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

Wat deze code doet

In dit C#-voorbeeld ziet u hoe u een OpenAPI-hulpprogramma gebruikt met API-sleutelverificatie via een werkset en projectverbinding. Wanneer u de code uitvoert:

  1. De TripAdvisor OpenAPI-specificatie wordt geladen vanuit een lokaal bestand.
  2. Hiermee wordt de tripadvisor projectverbinding opgehaald die uw API-sleutel bevat.
  3. Hiermee maakt u een toolboxversie met de TripAdvisor-tool die zo is geconfigureerd dat deze de verbinding voor authenticatie gebruikt.
  4. Koppelt de toolbox aan de agent als een MCP-tool.
  5. Stuurt een aanvraag voor hotelaanaanveling in Parijs.
  6. De agent roept de TripAdvisor-API aan met behulp van uw opgeslagen API-sleutel en retourneert resultaten.
  7. Schoont de agent op door de agent te verwijderen.

Vereiste invoer

  • Inline-tekenreekswaarde: projectEndpoint (het eindpunt van het Foundry-project)
  • Lokaal bestand: Assets/tripadvisor_openapi.json
  • Project verbinding: tripadvisor met geldige API-sleutel geconfigureerd

Verwachte uitvoer

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

Veelvoorkomende fouten

  • ConnectionNotFoundException: Geen projectverbinding genaamd tripadvisor gevonden.
  • AuthenticationException: Ongeldige API-sleutel in projectverbinding, of ontbrekende/onjuiste securitySchemes-configuratie in de OpenAPI-specificatie.
  • Hulpprogramma niet gebruikt: verifieer of ToolChoice = ResponseToolChoice.CreateRequiredChoice() het gebruik van het hulpprogramma afdwingt.
  • API-sleutel wordt niet doorgegeven aan API: Zorg ervoor dat de secties securitySchemes en security in de OpenAPI-specificatie correct zijn geconfigureerd.

Een Java-agent maken met openAPI-hulpprogrammamogelijkheden

Deze Java-installatie kan verwijzen naar MCP-hulpprogramma's, maar de Java SDK biedt nog geen API voor het maken van werksets.

Tip

Aanbevolen: Voor de meeste agents voegt u het OpenAPI-hulpprogramma toe via een werkset en koppelt u de werkset als een MCP-hulpprogramma aan uw agent. Maak de werkset met behulp van het voorbeeld Python, REST API, C# of TypeScript, of de Foundry-portal, en verwijs vervolgens naar het MCP-eindpunt van uw Java-agent als een McpTool.

In de volgende voorbeelden ziet u hoe u een OpenAPI-hulpprogramma aanroept met behulp van de REST API.

Een toegangstoken ophalen:

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

Anonieme authenticatie

Voeg OpenAPI-hulpprogramma's toe via een werkset en koppel de werkset als een MCP-hulpprogramma aan uw agent. Zie Wat is een werkset? voor meer informatie.

  1. Maak een werkset met het openAPI-weerhulpmiddel:
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" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

De werkset toont een mcP-compatibel eindpunt op $FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1, waarbij <version> de versie is die wordt geretourneerd door de vorige aanroep.

  1. Maak een projectverbinding voor externe hulpprogramma's die verwijst naar het toolbox-eindpunt, met behulp van een Entra-gebruikerstoken zodat de identiteit van de aanroeper wordt doorgestuurd (doelgroep 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. Maak een antwoord dat gebruikmaakt van de werkset door deze als een MCP-hulpprogramma te koppelen.
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"
      }
    ]
  }'

API-sleutelverificatie (projectkoppeling)

Gebruik deze variant pas nadat de anonieme stroom is geslaagd. Configureer de projectverbinding en de OpenAPI-vermelding securitySchemes zoals beschreven in Verifiëren met API-sleutel.

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

Gebruik voor een API met bearertoken dezelfde project_connection aanvraagindeling, maar gebruik een verbinding die is geconfigureerd zoals beschreven onder Een verbinding met bearertoken instellen. De verbindingswaarde moet beginnen met Bearer gevolgd door een spatie.

Verificatie van beheerde identiteit

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

Wat deze code doet

In dit REST API-voorbeeld ziet u hoe u een OpenAPI-hulpprogramma aanroept met verschillende verificatiemethoden. De aanvraag:

  1. Voor anonieme authenticatie wordt een toolbox gemaakt met de OpenAPI-tooldefinitie en de weerspecificatie van de API.
  2. Maakt een antwoord dat de toolbox als MCP-hulpprogramma toevoegt en vraagt naar het weer in Seattle.
  3. Toont aanvullende directe REST-hulpprogrammadefinities voor API-sleutel via projectverbinding en verificatie van beheerde identiteiten.
  4. De agent gebruikt het hulpprogramma om de weer-API aan te roepen en retourneert opgemaakte resultaten.

Vereiste invoer

  • Omgevingsvariabelen: FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • Voor verificatie van API-sleutels: WEATHER_APP_PROJECT_CONNECTION_ID.
  • Voor verificatie van beheerde identiteiten: MANAGED_IDENTITY_AUDIENCE.
  • Inline OpenAPI-specificatie in verzoeklichaam.

Verwachte uitvoer

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

Veelvoorkomende fouten

  • 401 Unauthorized: Ongeldig of ontbreekt AGENT_TOKEN, of API-sleutel is niet geïnjecteerd omdat securitySchemes en security ontbreekt in de OpenAPI-specificatie
  • 404 Not Found: Onjuiste naam voor eindpunt- of modelimplementatie
  • 400 Bad Request: Onjuiste OpenAPI-specificatie of ongeldige verificatie-instellingen
  • API-sleutel niet verzonden met aanvraag: controleer of de components.securitySchemes sectie in de OpenAPI-specificatie juist is geconfigureerd (niet leeg) en overeenkomt met de naam van de projectverbindingssleutel

Een agent maken met openAPI-hulpprogrammamogelijkheden

In het volgende Voorbeeld van TypeScript-code ziet u hoe u een AI-agent maakt met de mogelijkheden van het OpenAPI-hulpprogramma door het OpenAPI-hulpprogramma toe te voegen aan een werkset en de werkset als een MCP-hulpprogramma te koppelen. De agent kan externe API's aanroepen die zijn gedefinieerd door OpenAPI-specificaties. Zie de sample in de Azure SDK voor JavaScript-opslagplaats op GitHub voor een JavaScript-versie van dit voorbeeld.

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

Wat deze code doet

In dit TypeScript-voorbeeld wordt een agent gemaakt met een OpenAPI-hulpprogramma voor weergegevens door gebruik te maken van anonieme authenticatie. Wanneer u de code uitvoert:

  1. De Weer OpenAPI-specificatie wordt geladen vanuit een lokaal JSON-bestand.
  2. Maakt een toolboxversie met de weertool.
  3. Koppelt de toolbox als een MCP-tool aan de agent en verzendt vervolgens een streaming-verzoek met een vraag over het weer in Seattle en kledingadvies.
  4. Verwerkt het streaming-antwoord en geeft delta's weer zodra ze binnenkomen.
  5. Het dwingt het gebruik van hulpprogramma's af door tool_choice: "required" te gebruiken om ervoor te zorgen dat de API wordt aangeroepen.
  6. Schoont de agent op door de agent te verwijderen.

Vereiste invoer

  • Inline-tekenreekswaarde: PROJECT_ENDPOINT (het eindpunt van het Foundry-project)
  • Lokaal bestand: ../assets/weather_openapi.json (OpenAPI-specificatie)

Verwachte uitvoer

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!

Veelvoorkomende fouten

  • Error: OpenAPI specification not found: Bestandspad incorrect of bestand ontbreekt
  • AuthenticationError: ongeldige referenties voor Azure
  • API-sleutel werkt niet: als u overschakelt van anonieme naar API-sleutelverificatie, zorg er dan voor dat de OpenAPI-specificatie en securitySchemes en security correct geconfigureerd zijn.

Een agent maken die gebruikmaakt van OpenAPI-hulpprogramma's die zijn geverifieerd met een projectverbinding

In het volgende TypeScript-codevoorbeeld ziet u hoe u een AI-agent maakt die gebruikmaakt van OpenAPI-hulpprogramma's die zijn geverifieerd via een projectverbinding. De agent laadt de TripAdvisor OpenAPI-specificatie van lokale assets en kan de API aanroepen via de geconfigureerde projectverbinding. Zie de sample in de Azure SDK voor JavaScript-opslagplaats op GitHub voor een JavaScript-versie van dit voorbeeld.

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

Wat deze code doet

In dit TypeScript-voorbeeld ziet u hoe u een OpenAPI-hulpprogramma gebruikt met API-sleutelverificatie via een projectverbinding. Wanneer u de code uitvoert:

  1. De TripAdvisor OpenAPI-specificatie wordt geladen vanuit een lokaal bestand.
  2. Verificatie wordt geconfigureerd met behulp van de TRIPADVISOR_CONNECTION_ID constante.
  3. Er wordt een agent gemaakt met het TripAdvisor-hulpprogramma dat gebruikmaakt van de projectverbinding voor API-sleutelverificatie.
  4. Er wordt een streamingaanvraag verzonden voor locatiegegevens van TripAdvisor.
  5. Het dwingt het gebruik van hulpprogramma's af door tool_choice: "required" te gebruiken om ervoor te zorgen dat de API wordt aangeroepen.
  6. Het verwerkt en geeft het streaming-antwoord weer.
  7. De agent wordt opgeschoond door deze te verwijderen.

Vereiste invoer

  • Inline-tekenreekswaarden: PROJECT_ENDPOINT, TRIPADVISOR_CONNECTION_ID
  • Lokaal bestand: ../assets/tripadvisor_openapi.json
  • Project verbinding geconfigureerd met TripAdvisor-API-sleutel

Verwachte uitvoer

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!

Veelvoorkomende fouten

  • Error: OpenAPI specification not found: Controleer het bestandspad.
  • Er is geen verbinding gevonden: Controleer of TRIPADVISOR_CONNECTION_ID de verbinding juist is en of de verbinding bestaat.
  • AuthenticationException: Ongeldige API-key in projectverbinding.
  • API-sleutel die niet is geïnjecteerd in aanvragen: uw OpenAPI-specificatie moet de juiste securitySchemes (onder components) en security secties bevatten. De sleutelnaam in securitySchemes moet overeenkomen met de sleutel in uw projectverbinding.
  • Content type is not supported: Momenteel worden slechts deze twee inhoudstypen voor de hoofdtekst van de aanvraag ondersteund: application/json en application/json-patch+json. Antwoordinhoudstypen zijn niet beperkt.

Overwegingen voor beveiliging en gegevens

Wanneer u een agent verbindt met een OpenAPI-hulpprogramma, kan de agent aanvraagparameters verzenden die zijn afgeleid van gebruikersinvoer naar de doel-API.

  • Projectverbindingen gebruiken voor geheimen (API-sleutels en tokens). Vermijd het plaatsen van geheimen in een OpenAPI-specificatiebestand of broncode.
  • Controleer welke gegevens de API ontvangt en wat deze retourneert voordat u het hulpprogramma in productie gebruikt.
  • Gebruik toegang met minimale bevoegdheden. Wijs voor beheerde identiteit alleen de rollen toe die de doelservice nodig heeft.

Verifiëren met API-sleutel

Gebruik deze variant voor een API die een sleutel verwacht in een header- of queryparameter. U kunt slechts één API-sleutelbeveiligingsschema per OpenAPI-hulpprogramma gebruiken. Als voor de API meerdere beveiligingsschema's zijn vereist, maakt u meerdere OpenAPI-hulpprogramma's.

  1. Werk uw Beveiligingsschema's voor OpenAPI-specificaties bij. Het heeft een securitySchemes sectie en één schema van het type apiKey. Bijvoorbeeld:

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

    Meestal hoeft u alleen het name veld bij te werken, wat overeenkomt met de naam van key in de verbinding. Als de beveiligingsschema's meerdere schema's bevatten, moet u slechts één van deze schema's behouden.

  2. Werk de OpenAPI-specificatie bij zodat deze een security sectie bevat:

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. Verwijder een parameter in de OpenAPI-specificatie die API-sleutel nodig heeft, omdat de API-sleutel wordt opgeslagen en doorgegeven via een verbinding, zoals verderop in dit artikel wordt beschreven.

  4. Maak een verbinding om uw API-sleutel op te slaan.

  5. Ga naar de Foundry-portal en open uw project.

  6. Maak of selecteer een verbinding waarmee het geheim wordt opgeslagen. Zie Een nieuwe verbinding met uw project toevoegen.

    Opmerking

    Als u de API-sleutel op een later tijdstip opnieuw genereert, moet u de verbinding met de nieuwe sleutel bijwerken.

  7. Voer de volgende gegevens in

    • sleutel: name veld van uw beveiligingsschema. In dit voorbeeld moet dit het geval zijn x-api-key

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

  8. Nadat u een verbinding hebt gemaakt, kunt u deze gebruiken via de SDK of REST API. Gebruik de tabbladen bovenaan dit artikel om codevoorbeelden te bekijken.

Een Bearer-tokenverbinding instellen

Gebruik deze variant voor een API die een bearer-token verwacht in de Authorization header. Er wordt hetzelfde project_connection verificatietype als API-sleutelverificatie gebruikt, maar het OpenAPI-beveiligingsschema en de verbindingswaarden verschillen.

De OpenAPI-specificatie ziet er als volgt uit:

  BearerAuth:
    type: http
    scheme: bearer
    bearerFormat: JWT

U moet het volgende doen:

  1. Werk uw OpenAPI-specificatie securitySchemes bij om Authorization als de headernaam te gebruiken:

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Voeg een security sectie toe die verwijst naar het schema:

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Maak een verbinding met aangepaste sleutels in uw Foundry-project:

    1. Ga naar de Foundry-portal en open uw project.
    2. Maak of selecteer een verbinding waarmee het geheim wordt opgeslagen. Zie Een nieuwe verbinding met uw project toevoegen.
    3. Voer de volgende waarden in:
      • sleutel: Authorization (moet overeenkomen met het name veld in uw securitySchemes)
      • waarde: Bearer <token> (vervang door <token> uw werkelijke token)

    Belangrijk

De waarde moet het woord Bearer bevatten gevolgd door een spatie voor het token. Bijvoorbeeld: Bearer eyJhbGciOiJSUzI1NiIs.... Als u het Bearer voorvoegsel en de volgende ruimte weglaat, ontvangt de API een onbewerkt token zonder het vereiste autorisatieschemavoorvoegsel en mislukt de aanvraag.

  1. Nadat u de verbinding hebt gemaakt, gebruikt u deze met het project_connection verificatietype in uw code, op dezelfde manier als voor API-sleutelverificatie. De verbindings-id gebruikt dezelfde indeling: /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Verifiëren met behulp van een beheerde identiteit (Microsoft Entra ID)

Microsoft Entra ID is een cloudservice voor identiteits- en toegangsbeheer die uw werknemers kunnen gebruiken voor toegang tot externe resources. Met behulp van Microsoft Entra ID kunt u extra beveiliging toevoegen aan uw API's zonder dat u API-sleutels hoeft te gebruiken. Wanneer u verificatie van beheerde identiteit instelt, wordt de agent geverifieerd via het Foundry-hulpprogramma dat wordt gebruikt.

Belangrijk

Verificatie van beheerde identiteit werkt alleen wanneer de doelservice Microsoft Entra ID tokens accepteert. Als de doel-API gebruikmaakt van een aangepast verificatieschema dat geen ondersteuning biedt voor Microsoft Entra ID, gebruikt u in plaats daarvan API-sleutel of Bearer-token verificatie.

Begrijp de doelgroep-URI

De doelgroep (ook wel resource-identificatie of Application-ID URI genoemd) geeft aan Microsoft Entra ID welke service of API het token bedoeld is om toegang te verlenen. De doelgroepwaarde moet overeenkomen met wat de doelservice verwacht of verificatie mislukt met een 401-fout.

Opmerking

De doelgroep is niet het eindpunt van uw Foundry-project. Dit is de resource-id van de doelservice die door uw OpenAPI-hulpprogramma wordt aanroepen.

De volgende tabel bevat doelgroep-URI's voor algemene Azure-services:

Doeldienst Doelgroep-URI
Azure Storage https://storage.azure.com
Azure Key Vault https://vault.azure.net
Azure AI Zoeken https://search.azure.com
Azure Logic Apps https://logic.azure.com
Azure API Management (beheervlak) https://management.azure.com
API die wordt beveiligd door een Microsoft Entra-app-registratie (inclusief APIM met OAuth) De URI van de toepassings-id van uw app-registratie (bijvoorbeeld api://<client-id>)

Tip

Als u Azure API Management gebruikt om een aangepaste API te beveiligen met een OAuth 2.0-validatiebeleid, is de doelgroep de -id-URI van de app-registratie die de API beveiligt, niet https://management.azure.com. De doelgroep van het beheervlak is alleen van toepassing op Azure Resource Manager bewerkingen op de APIM-resource zelf.

Zie Agent identity and authentication voor meer informatie over de verificatie van agents met Microsoft Entra ID.

Uw doelgroep zoeken en verifiëren

Gebruik de volgende stappen om de juiste doelgroepwaarde te bepalen en te controleren:

  • Voor Azure-services: raadpleeg de documentatie van de service voor de bronidentificator van Microsoft Entra ID. De meeste Azure services vermelden de doelgroep-URI in hun verificatiedocumentatie.
  • Voor API's die worden beveiligd door een Microsoft Entra app-registratie: In de Azure-portal, ga naar Microsoft Entra ID>App-registraties> selecteer uw app > Expose an API. De URI van de toepassings-id boven aan de pagina is de waarde van uw doelgroep.
  • Om de doelgroep van een token te verifiëren: decodeer het toegangstoken bij https://jwt.ms en controleer de aud claim. De aud waarde moet overeenkomen met de doelgroep die uw doelservice verwacht.

Verificatie van beheerde identiteit instellen

Verificatie instellen met beheerde identiteit:

  1. Zorg ervoor dat de door het systeem toegewezen beheerde identiteit is ingeschakeld voor uw Foundry-resource.

Schermopname van de Azure-portal met door het systeem toegewezen beheerde identiteitsinstellingen.

  1. Maak een resource voor de service waarmee u verbinding wilt maken via openAPI-specificatie.

  2. Wijs de juiste toegang tot de resource toe.

    1. Selecteer Access Control voor uw resource.

    2. Selecteer Toevoegen en voeg vervolgens roltoewijzing toe boven aan het scherm.

      Schermopname van de Azure-portal met de actie Roltoewijzing toevoegen.

  3. Selecteer de minst bevoegde gegevenslaag of toepassingsrol die de bewerkingen in uw OpenAPI-specificatie verleent. Azure Resource Manager Reader-toegang alleen geeft geen toegang tot het gegevensvlak. Selecteer Volgende.

  4. Selecteer Beheerde identiteit en selecteer vervolgens leden selecteren.

  5. Zoek in de vervolgkeuzelijst beheerde identiteit naar Foundry Account en selecteer vervolgens het Foundry-account van uw agent.

  6. Selecteer Voltooien.

  7. Wanneer u de installatie hebt voltooid, kunt u doorgaan met het hulpprogramma via de Foundry-portal, SDK of REST API. Gebruik de tabbladen bovenaan dit artikel om codevoorbeelden te bekijken.

Veelvoorkomende fouten oplossen

Symptoom Waarschijnlijke oorzaak Resolutie
API-sleutel is niet opgenomen in aanvragen. OpenAPI-specificatie ontbreekt de securitySchemes- of security-gedeelten. Controleer of de OpenAPI-specificatie zowel components.securitySchemes als een sectie op het hoogste niveau security bevat. Zorg ervoor dat het schema name overeenkomt met de sleutelnaam in uw projectverbinding.
Agent roept het OpenAPI-hulpprogramma niet aan. De keuze van het hulpprogramma is niet ingesteld of operationId niet beschrijvend. Gebruik tool_choice="required" om het starten van hulpmiddelen af te dwingen. Zorg ervoor dat operationId waarden beschrijvend zijn, zodat het model de juiste bewerking kan kiezen.
Verificatie mislukt voor beheerde identiteit. Beheerde identiteit is niet ingeschakeld of de roltoewijzing ontbreekt. Schakel door het systeem toegewezen beheerde identiteit in op uw Foundry-resource. Wijs de minst bevoegde gegevenslaag of toepassingsrol van de doelservice toe voor de bewerkingen in uw OpenAPI-specificatie.
Beheerde identiteit geeft 401 terug, ook al is de rol toegewezen. De doelgroep-URI komt niet overeen met wat de doelservice verwacht. Controleer of de doelgroep-URI overeenkomt met de resource-id van de doelservice. Raadpleeg de servicedocumentatie voor Azure services. Gebruik voor Microsoft Entra-beschermde API's de URI voor de App-ID van uw appregistratie. Decodeer het token bij https://jwt.ms en bevestig dat de aud claim overeenkomt. Zie Inzicht in de doelgroep-URI.
Doel-API weigerde token van beheerde identiteit. De doelgerichte service accepteert geen Microsoft Entra ID tokens. Controleer of de doelservice ondersteuning biedt voor Microsoft Entra ID verificatie. Als dat niet werkt, gebruik dan in plaats daarvan API-sleutel- of Bearer-tokenverificatie.
Verzoek mislukt met 400 Bad Request. De OpenAPI-specificatie komt niet overeen met de werkelijke API. Valideer uw OpenAPI-specificatie op basis van de werkelijke API. Controleer parameternamen, typen en vereiste velden.
Aanvraag mislukt met 401 Niet geautoriseerd. API-sleutel of token is ongeldig of verlopen. Genereer de API-sleutel/het token opnieuw en werk de projectverbinding bij. Controleer of de verbindings-id juist is.
Het hulpprogramma retourneert een onverwachte antwoordindeling. Antwoordschema niet gedefinieerd in OpenAPI-specificatie. Voeg antwoordschema's toe aan uw OpenAPI-specificatie voor betere modelkennis.
operationId validatiefout. Ongeldige tekens in operationId. Gebruik alleen letters, -en _ in operationId waarden. Verwijder getallen en speciale tekens.
Fout: verbinding niet gevonden. Verbindingsnaam of id komt niet overeen. Controleer of OPENAPI_PROJECT_CONNECTION_NAME deze overeenkomt met de verbindingsnaam in uw Foundry-project.
Bearer-token is niet correct verzonden. De verbindingswaarde mist het voorvoegsel Bearer en de daaropvolgende spatie. Stel de verbindingswaarde in op Bearer <token> (met het woord Bearer en een spatie voor het token). Controleer of de OpenAPI-specificatie securitySchemes gebruikmaakt "name": "Authorization"van .

Een verificatiemethode kiezen

De volgende tabel helpt u bij het kiezen van de juiste verificatiemethode voor uw OpenAPI-hulpprogramma:

Verificatiemethode Het beste voor Complexiteit van installatie
Anonieme Openbare API's zonder verificatie Laag
API-sleutel Niet-Microsoft API's met toegang op basis van sleutels Medium
Beheerde identiteit Azure-services en Microsoft Entra ID-beveiligde API's. Vereist dat de doelservice Microsoft Entra ID tokens accepteert en ondersteuning biedt voor Azure RBAC of op Microsoft Entra gebaseerd toegangsbeheer. Middelmatig Hoog