Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anslut dina Microsoft Foundry-agenter till externa API:er med hjälp av OpenAPI 3.0- och 3.1-specifikationer. Foundry-modellen som driver din agent kan anropa externa tjänster, hämta realtidsdata och utöka dess funktioner utöver inbyggda funktioner.
OpenAPI-specifikationer definierar ett standardsätt för att beskriva HTTP-API:er så att du kan integrera befintliga tjänster med dina agenter. Microsoft Foundry stöder tre autentiseringsmetoder: anonymous, API key och managed identity. Hjälp med att välja en autentiseringsmetod finns i Välj en autentiseringsmetod.
Tips
Överväg att lägga till det här verktyget med hjälp av en verktygslåda. Med hjälp av ett verktygspaket kan du återanvända verktyget mellan agenter och körmiljöer samt centralisera hantering av autentiseringsuppgifter, versionshantering och efterlevnad av policyer genom en hanterad MCP-slutpunkt. Se snabbstarten för verktygslådan.
Förutsättningar
Kontrollera att du har:
En Azure prenumeration med rätt behörigheter.
Foundry-användarroll i Foundry-projektet för att skapa och köra agenter.
Viktigt
Foundrys RBAC-roller har nyligen namnändrats. Foundry User, Foundry Owner, Foundry Account Owner och Foundry Project Manager hette tidigare Azure AI-användare, Azure AI-ägare, Azure AI-kontoägare och Azure AI Project Manager. Du kanske fortfarande ser de tidigare namnen på vissa platser medan namnbytet distribueras. Roll-ID:na och kärnbehörigheterna ändras inte av namnbytet.
Foundry Project Manager-rollen i Foundry-projektet om du skapar en projektanslutning för autentisering med API-nyckel eller token.
Ett Foundry-projekt som har skapats med en konfigurerad slutpunkt.
En AI-modell som implementeras i ditt projekt. Bekräfta att både modellen och projektregionen stöder OpenAPI-verktyg i Verktygsstöd per region och modell.
SDK installerat för önskat språk:
- Python:
pip install azure-ai-projects jsonref - C#:
Azure.AI.Extensions.OpenAI - TypeScript/JavaScript:
@azure/ai-projects - Java:
com.azure:azure-ai-agents
- Python:
Miljövariabler
| Variabel | Beskrivning |
|---|---|
FOUNDRY_PROJECT_ENDPOINT |
Slutpunkts-URL:en för Foundry-projektet (inte den externa OpenAPI-tjänstslutpunkten). |
FOUNDRY_MODEL_DEPLOYMENT_NAME |
Namn på din driftsatta modell. |
OPENAPI_PROJECT_CONNECTION_NAME |
(För API-nyckelautentisering) Namnet på projektanslutningen för OpenAPI-tjänsten. |
- OpenAPI 3.0- eller 3.1-specifikationsfil som uppfyller dessa krav:
- Varje funktion måste ha en
operationId(krävs för OpenAPI-verktyget). -
operationIdfår endast innehålla bokstäver,-, och_. - Använd beskrivande namn för att hjälpa modeller att effektivt bestämma vilken funktion som ska användas.
- Innehållstyper för begärandetext som stöds:
application/json,application/json-patch+json
- Varje funktion måste ha en
- För hanterad identitetsautentisering: den minst privilegierade måltjänstrollen som tillåter nödvändiga API-åtgärder, tilldelad till Foundry-projektets hanterade identitet i målresursomfånget.
- För API-nyckel-/tokenautentisering: en projektanslutning som konfigurerats med din API-nyckel eller token. Se Lägga till en ny anslutning till projektet.
Observera
Värdet FOUNDRY_PROJECT_ENDPOINT refererar till projektslutpunkten Microsoft Foundry, inte den externa OpenAPI-tjänstslutpunkten. Du hittar den här slutpunkten i Microsoft Foundry-portalen under projektets översiktssida. Den här slutpunkten krävs för att autentisera agenttjänsten och är separat från alla OpenAPI-slutpunkter som definieras i din specifikationsfil.
Användningsstöd
I följande tabell visas stöd för SDK och installation.
| stöd för Microsoft Foundry | Python SDK | C#-SDK | SDK för JavaScript | Java SDK | REST API | Grundläggande agentkonfiguration | Standardagentkonfiguration |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Observera
För Java använder du com.azure:azure-ai-agents-paketet för OpenAPI-agentverktyg. Paketet com.azure:azure-ai-projects exponerar för närvarande inte OpenAPI-agentverktygstyper.
Kör det anonyma första lyckade flödet
Börja med det anonyma väder-API:et för att kontrollera att din agent kan läsa in en OpenAPI-specifikation och anropa en åtgärd. Den här sökvägen kräver inte någon extern API-autentiseringsuppgift eller en Foundry-projektanslutning.
- Installera SDK-paketet för ditt valda språk från Krav.
- Ladda ned
weather_openapi.json, och spara filen på sökvägenassetssom exemplet använder. - Ange slutpunkts- och modelldistributionsvärden för Foundry-projektet.
- Kör det anonyma exemplet i det valda språkavsnittet.
- Bekräfta att svaret innehåller aktuellt väder för Seattle och ta sedan bort agentversionen som skapades av exemplet.
När det anonyma anropet har slutförts konfigurerar du den autentisering som krävs av mål-API:et. Behåll API-nyckelautentisering, autentisering med ägartoken och hanterad identitetsautentisering som separata varianter.
Förstå begränsningar
- OpenAPI-specifikationen måste inkludera
operationIdför varje åtgärd ochoperationIdkan endast innehålla bokstäver,-, och_. - Innehållstyper för begärandetext som stöds:
application/json,application/json-patch+json. - För API-nyckelautentisering använder du ett API-nyckelsäkerhetsschema per OpenAPI-verktyg. Om du behöver flera säkerhetsscheman skapar du flera OpenAPI-verktyg.
- Rotera API-nycklar och ägartoken regelbundet och omedelbart efter misstänkt exponering. Uppdatera projektanslutningen när autentiseringsuppgifterna ändras. placera inte autentiseringsuppgifter i OpenAPI-specifikationen eller källkoden.
Lägga till OpenAPI-verktyg i en verktygslåda
Använd det här mönstret för att exponera rest-API som beskrivs av en OpenAPI-specifikation. auth.type Välj det som matchar ditt API:s säkerhetsmodell.
Viktigt
När du använder hanterad identitetsautentisering tilldelar du endast den minst privilegierade RBAC-rollen som tillåter nödvändiga API-åtgärder till foundry-projektets hanterade identitet på måltjänsten. Du kan till exempel endast tilldela Läsare på målresursen Azure när API:et behöver skrivskyddad Azure Resource Manager åtkomst. Utan den tilldelning som krävs får agenten ett 401 Unauthorized svar när api:et anropas. Fullständiga installationssteg finns i Autentisera med hjälp av hanterad identitet.
Anonym autentisering:
{
"description": "REST API via OpenAPI spec",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "anonymous"
}
}
}
]
}
Projektanslutningsautentisering:
Använd det här mönstret när API:et kräver en nyckel eller token som lagras i en Foundry-projektanslutning.
{
"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>"
}
}
}
}
]
}
Hanterad identitetsautentisering:
Använd det här mönstret när mål-API:et autentiseras via Microsoft Entra-ID. Foundry-projektets hanterade identitet anropar API:et för agentens räkning. Kontrollera att den hanterade identiteten har den RBAC-roll som krävs för måltjänsten innan du använder det här mönstret.
{
"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",
},
},
},
];
Skapa en OpenAPI-verktygslåda med Azure Developer CLI
OpenAPI-verktyg bäddar in specifikationen direkt under tools:. Anslutningsbaserad autentisering (connection_auth) refererar till en projektanslutning. Anonyma OpenAPI-verktyg behöver ingen anslutning.
Steg 1. (Valfritt) Skapa autentiseringsanslutningen
Hoppa över det här steget för anonyma OpenAPI-verktyg.
# 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-verktyg stöder också --auth-type oauth2-anslutningar. Fullständig uppsättning azd ai connection create flaggor finns i Verktygslåda MCP-autentisering och konfiguration.
Steg 2. Definiera verktygslådan
OpenAPI-specifikationen är infogad under 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
För anonyma API:er ersätter du auth: blocket med:
auth:
type: anonymous
security_scheme:
type: anonymous
Steg 3. Skapa verktygslådan
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Innan du kör kodexemplen
- Ladda ned den underhållna specifikationen
tripadvisor_openapi.jsonoch spara den i sökvägenassetssom används av ditt språks exempel.
Observera
- Du behöver det senaste SDK-paketet. .NET SDK är för närvarande i förhandsversion. Mer information finns i snabbstarten .
- Om du använder API-nyckeln för autentisering bör ditt anslutnings-ID ha formatet
/subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.
Viktigt
För att API-nyckelautentisering ska fungera måste openAPI-specifikationsfilen innehålla:
- Ett
securitySchemesavsnitt med din API-nyckelkonfiguration, till exempel rubriknamn och parameternamn. - Ett
securityavsnitt som refererar till säkerhetsschemat. - En projektanslutning som konfigurerats med matchande nyckelnamn och värde.
Utan dessa konfigurationer ingår inte API-nyckeln i begäranden. Detaljerade installationsinstruktioner finns i avsnittet Autentisera med API-nyckel .
Du kan också använda tokenbaserad autentisering (till exempel en ägartoken) genom att lagra token i en projektanslutning. För autentisering av ägartoken skapar du en anslutning för anpassade nycklar med nyckeln inställd på Authorization och värdet inställt på Bearer <token> (ersätt <token> med din faktiska token). Ordet Bearer följt av ett blanksteg måste inkluderas i värdet. Mer information finns i Konfigurera en anslutning för ägartoken.
Exempel på hur du använder agenter med OpenAPI-verktyget
Det här exemplet visar hur du använder tjänster som beskrivs av en OpenAPI-specifikation med hjälp av en agent. Tjänsten wttr.in används för att hämta väder och dess specifikationsfil weather_openapi.json. Välj Prompt Agents om du vill använda Azure AI Projects SDK för att skapa en agent på serversidan eller Hosted Agents för att använda Microsoft Agent Framework för att skapa en tillfällig agent i processen.
Aktivera agenter
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)
I det här exemplet skapas en promptagent med ett OpenAPI-verktyg som anropar wttr.in väder-API:et med hjälp av anonym autentisering. Verktyget är kopplat direkt till agentdefinitionen. När du kör koden:
- Den läser in OpenAPI-specifikationen för väder från en lokal JSON-fil.
- Skapar en promptagent med väderverktyget konfigurerat för anonym åtkomst.
- Skickar en fråga om Seattles väder.
- Agenten använder OpenAPI-verktyget för att anropa väder-API:et och returnerar formaterade resultat.
- Rensar genom att ta bort agentversionen.
Hostade agenter
Det här exemplet använder FoundryChatClient från Microsoft Agent Framework och ansluter till verktygslådans MCP-slutpunkt med hjälp av FoundryToolbox. Installera kompatibla paketversioner med pip install "agent-framework-foundry==1.10.4" "azure-ai-projects>=2.3.0,<2.4.0" azure-identity jsonref, ange FOUNDRY_PROJECT_ENDPOINT miljövariabeln och logga in med az login.
OpenApiToolboxTool är den verktygslådespecifika modellen. använd OpenApiTool endast när du kopplar verktyget direkt till en 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())
Förväntade utdata
Agent: The weather in Seattle is currently cloudy with a temperature of 52°F (11°C)...
Exempel på hur du använder agenter med OpenAPI-verktyget
Det här exemplet visar hur du använder tjänster som beskrivs av en OpenAPI-specifikation med hjälp av en agent. Tjänsten wttr.in används för att hämta väder och dess specifikationsfil weather_openapi.json. Välj Prompt Agents om du vill använda Azure AI Projects SDK för att skapa en agent på serversidan eller Hosted Agents för att använda Microsoft Agent Framework för att skapa en tillfällig agent i processen.
Aktivera agenter
I det här exemplet används synkrona metoder för klientbiblioteket Azure AI Projects. Ett exempel som använder asynkrona metoder finns i sample i Azure SDKs för .NET lagringsplats på 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);
}
}
Vad den här koden gör
Det här C#-exemplet skapar en agent med ett OpenAPI-verktyg som hämtar väderinformation från wttr.in med hjälp av anonym autentisering. När du kör koden:
- Den läser väder OpenAPI-specifikationen från en lokal JSON-fil.
- Skapar en agent med väderverktyget konfigurerat.
- Skickar en begäran som frågar om Seattles väder med hjälp av OpenAPI-verktyget.
- Agenten anropar väder-API:et och returnerar resultatet.
- Rensar genom att ta bort agenten.
Obligatoriska indata
- Infogat strängvärde:
projectEndpoint(slutpunkten för Foundry-projektet) - Lokal fil:
Assets/weather_openapi.json(OpenAPI-specifikation)
Förväntade utdata
The weather in Seattle, WA today is cloudy with temperatures around 52°F...
Vanliga fel
-
FileNotFoundException: OpenAPI-specifikationsfilen hittades inte i mappen Tillgångar -
UnauthorizedAccessException: Ogiltiga autentiseringsuppgifter eller otillräckliga RBAC-behörigheter -
API-nyckeln har inte matats in: Kontrollera att OpenAPI-specifikationen innehåller både
securitySchemes(icomponents) ochsecurityavsnitt med matchande schemanamn
Hostade agenter
Det här exemplet skapar OpenAPI-verktygslådan med Azure AI Projects SDK och använder sedan Microsoft Agent Framework-integreringen AddFoundryToolboxes för att göra verktyget tillgängligt för den värdbaserade agenten. Installera Agent Framework-paketen AZURE_AI_PROJECT_ENDPOINT , ange projektslutpunkts- och AZURE_AI_MODEL_DEPLOYMENT_NAME miljövariablerna och logga in med 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();
Förväntade utdata
Agenten anropar väder-API:et via OpenAPI-verktyget och returnerar de aktuella villkoren för den begärda platsen:
The current weather in Seattle is <temperature> with <conditions>.
Det fullständiga exemplet, inklusive autentiserade API-mönster, finns i Agent_Step17_OpenAPITools.
Exempel på att använda agenter med OpenAPI-verktyget på webbtjänsten, som kräver autentisering
I det här exemplet lägger du till ett autentiserat OpenAPI-verktyg i en verktygslåda, bifogar verktygslådan som ett MCP-verktyg och använder agenten i ett scenario som kräver autentisering. Du använder TripAdvisor-specifikationen.
TripAdvisor-tjänsten kräver nyckelbaserad autentisering. Om du vill skapa en anslutning öppnar du Microsoft Foundry, väljer Hantera i det övre högra navigeringsfältet, väljer Project information och väljer sedan fliken Anslutna resurser. Skapa slutligen en ny anslutning av typen Anpassade nycklar. Ge det namnet tripadvisor och lägg till ett nyckelvärdepar. Lägg till nyckeln med namnet key och ange ett värde med din TripAdvisor-nyckel.
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);
}
}
Vad den här koden gör
Det här C#-exemplet visar hur du använder ett OpenAPI-verktyg med API-nyckelautentisering via en verktygslåda och projektanslutning. När du kör koden:
- Den läser in TripAdvisor OpenAPI-specifikationen från en lokal fil.
- Hämtar projektanslutningen
tripadvisorsom innehåller din API-nyckel. - Skapar en verktygslådeversion som innehåller verktyget TripAdvisor som konfigurerats för att använda anslutningen för autentisering.
- Kopplar verktygslådan till agenten som ett MCP-verktyg.
- Skickar en begäran om hotellrekommendationer i Paris.
- Agenten anropar TripAdvisor-API:et med hjälp av din lagrade API-nyckel och returnerar resultat.
- Rensar genom att ta bort agenten.
Obligatoriska indata
- Infogat strängvärde:
projectEndpoint(slutpunkten för Foundry-projektet) - Lokal fil:
Assets/tripadvisor_openapi.json - Projektanslutning:
tripadvisormed giltig API-nyckel konfigurerad.
Förväntade utdata
Here are 5 top hotels in Paris, France:
1. Hotel Name - Rating: 4.5/5, Location: ...
2. Hotel Name - Rating: 4.4/5, Location: ...
...
Vanliga fel
-
ConnectionNotFoundException: Ingen projektanslutning med namnettripadvisorhittades. -
AuthenticationException: Ogiltig API-nyckel i projektanslutningen eller saknade/felaktigasecuritySchemeskonfigurationer i OpenAPI-specifikationen. - Verktyget används inte: Verifiering av
ToolChoice = ResponseToolChoice.CreateRequiredChoice()tvingar användningen av verktyget. -
API-nyckeln skickas inte till API: Kontrollera att OpenAPI-specifikationen har rätt
securitySchemesochsecuritykonfigurerade avsnitt.
Skapa en Java agent med OpenAPI-verktygsfunktioner
Den här Java konfigurationen kan referera till MCP-verktyg, men Java SDK visar ännu inte ett API för att skapa verktygslådan.
Tips
Rekommenderas: För de flesta agenter lägger du till OpenAPI-verktyget via en verktygslåda och kopplar verktygslådan till din agent som ett MCP-verktyg. Skapa verktygslådan med hjälp av exemplet Python, REST API, C#eller TypeScript eller Foundry-portalen och referera sedan till dess MCP-slutpunkt från din Java agent som en McpTool.
I följande exempel visas hur du anropar ett OpenAPI-verktyg med hjälp av REST-API:et.
Hämta en åtkomsttoken:
AGENT_TOKEN=$(az account get-access-token --scope https://ai.azure.com/.default --query accessToken -o tsv)
Anonym autentisering
Lägg till OpenAPI-verktyg via en verktygslåda och koppla sedan verktygslådan till din agent som ett MCP-verktyg. Mer information finns i Vad är en verktygslåda?
- Skapa en verktygslåda som innehåller OpenAPI-väderverktyget:
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" }
}
}
}
}
}
}
}
]
}'
Verktygslådan exponerar en MCP-kompatibel ändpunkt på $FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1, där <version> är den version som returnerades av föregående anrop.
- Skapa en projektanslutning för fjärrverktyg som pekar på toolbox-slutpunkten, med hjälp av en Entra-användartoken så att anroparens identitet vidarebefordras (målgrupp
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
- Skapa ett svar som använder verktygslådan genom att koppla den som ett MCP-verktyg.
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-nyckelautentisering (projektanslutning)
Använd endast den här varianten när det anonyma flödet har lyckats. Konfigurera projektanslutningen och OpenAPI-posten securitySchemes enligt beskrivningen i Autentisera med API-nyckel.
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": [] }
]
}
}
}
]
}'
För ett API för ägartoken behåller du samma project_connection form för begäran, men använder en anslutning som konfigurerats enligt beskrivningen i Konfigurera en anslutning för ägartoken. Anslutningsvärdet måste börja med Bearer följt av ett blanksteg.
Hanterad identitetsautentisering
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" }
}
}
}
}
}
}
}
]
}'
Vad den här koden gör
Det här REST API-exemplet visar hur du anropar ett OpenAPI-verktyg med olika autentiseringsmetoder. Begäran:
- För anonym autentisering skapar du en verktygslåda som innehåller OpenAPI-verktygsdefinitionen och väder-API-specifikationen.
- Skapar ett svar som bifogar verktygslådan som ett MCP-verktyg och frågar om Seattles väder.
- Visar ytterligare direkta REST-verktygsdefinitioner för API-nyckel via projektanslutning och hanterad identitetsautentisering.
- Agenten använder verktyget för att anropa väder-API:et och returnerar formaterade resultat.
Obligatoriska indata
- Miljövariabler:
FOUNDRY_PROJECT_ENDPOINT,AGENT_TOKEN,FOUNDRY_MODEL_DEPLOYMENT_NAME. - För API-nyckelautentisering:
WEATHER_APP_PROJECT_CONNECTION_ID. - För hanterad identitetsautentisering:
MANAGED_IDENTITY_AUDIENCE. - Infogad OpenAPI-specifikation i begärandetexten.
Förväntade utdata
{
"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)..."
}
]
}
]
}
Vanliga fel
-
401 Unauthorized: Ogiltig eller saknasAGENT_TOKEN, eller API-nyckeln har inte matats in eftersomsecuritySchemesochsecuritysaknas i OpenAPI-specifikationen -
404 Not Found: Felaktigt namn på slutpunkts- eller modelldistribution -
400 Bad Request: Felaktig OpenAPI-specifikation eller ogiltig autentiseringskonfiguration -
API-nyckeln skickas inte med begäran: Kontrollera att
components.securitySchemesavsnittet i OpenAPI-specifikationen är korrekt konfigurerat (inte tomt) och matchar namnet på projektanslutningsnyckeln
Skapa en agent med OpenAPI-verktygsfunktioner
Följande TypeScript-kodexempel visar hur du skapar en AI-agent med OpenAPI-verktygsfunktioner genom att lägga till OpenAPI-verktyget i en verktygslåda och bifoga verktygslådan som ett MCP-verktyg. Agenten kan anropa externa API:er som definierats av OpenAPI-specifikationer. En JavaScript-version av det här exemplet finns i sample i Azure SDKs för JavaScript-lagringsplatsen på 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);
});
Vad den här koden gör
Det här TypeScript-exemplet skapar en agent med ett OpenAPI-verktyg för väderdata med hjälp av anonym autentisering. När du kör koden:
- Den läser in OpenAPI-specifikationen för väder från en lokal JSON-fil.
- Skapar en verktygslåda som innehåller väderverktyget.
- Kopplar verktygslådan till agenten som ett MCP-verktyg och skickar sedan en begäran om strömmande svar med en fråga om vädret i Seattle och vad man bör ha på sig.
- Bearbetar strömningssvaret och visar deltan när de tas emot.
- Det tvingar verktygsanvändningen att använda
tool_choice: "required"för att säkerställa att API:et anropas. - Rensar genom att ta bort agenten.
Obligatoriska indata
- Infogat strängvärde:
PROJECT_ENDPOINT(slutpunkten för Foundry-projektet) - Lokal fil:
../assets/weather_openapi.json(OpenAPI-specifikation)
Förväntade utdata
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!
Vanliga fel
-
Error: OpenAPI specification not found: Filsökvägen är felaktig eller så saknas filen -
AuthenticationError: Ogiltiga Azure autentiseringsuppgifter -
API-nyckeln fungerar inte: Om du byter från anonym till API-nyckelautentisering kontrollerar du att OpenAPI-specifikationen har
securitySchemesochsecurityär korrekt konfigurerad
Skapa en agent som använder OpenAPI-verktyg autentiserade med en projektanslutning
Följande TypeScript-kodexempel visar hur du skapar en AI-agent som använder OpenAPI-verktyg som autentiseras via en projektanslutning. Agenten läser in TripAdvisor OpenAPI-specifikationen från lokala tillgångar och kan anropa API:et via den konfigurerade projektanslutningen. En JavaScript-version av det här exemplet finns i sample i Azure SDKs för JavaScript-lagringsplatsen på 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);
});
Vad den här koden gör
Det här TypeScript-exemplet visar hur du använder ett OpenAPI-verktyg med API-nyckelautentisering via en projektanslutning. När du kör koden:
- Den läser in TripAdvisor OpenAPI-specifikationen från en lokal fil.
- Den konfigurerar autentisering med hjälp av konstanten
TRIPADVISOR_CONNECTION_ID. - Den skapar en agent med TripAdvisor-verktyget som använder projektanslutningen för API-nyckelautentisering.
- Den skickar en streamingförfrågan för TripAdvisor-platsdetaljer.
- Det tvingar verktygsanvändningen att använda
tool_choice: "required"för att säkerställa att API:et anropas. - Den bearbetar och visar strömningssvaret.
- Den rensar genom att ta bort agenten.
Obligatoriska indata
- Infogade strängvärden:
PROJECT_ENDPOINT,TRIPADVISOR_CONNECTION_ID - Lokal fil:
../assets/tripadvisor_openapi.json - Projektanslutning konfigurerad med TripAdvisor API-nyckel
Förväntade utdata
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!
Vanliga fel
-
Error: OpenAPI specification not found: Kontrollera filsökvägen. - Det går inte att hitta anslutningen: Kontrollera
TRIPADVISOR_CONNECTION_IDatt den är korrekt och att anslutningen finns. -
AuthenticationException: Ogiltig API-nyckel i projektanslutningen. -
API-nyckeln matas inte in i begäranden: OpenAPI-specifikationen måste innehålla rätt
securitySchemes(undercomponents) ochsecurityavsnitt. Nyckelnamnet isecuritySchemesmåste matcha nyckeln i projektanslutningen. -
Content type is not supported: För närvarande stöds endast dessa två innehållstyper för begärandetext:application/jsonochapplication/json-patch+json. Svarsinnehållstyper är inte begränsade.
Säkerhets- och dataöverväganden
När du ansluter en agent till ett OpenAPI-verktyg kan agenten skicka parametrar för begäran som härleds från användarindata till mål-API:et.
- Använd projektanslutningar för hemligheter (API-nycklar och token). Undvik att placera hemligheter i en OpenAPI-specifikationsfil eller källkod.
- Granska vilka data API:et tar emot och vad det returnerar innan du använder verktyget i produktion.
- Använd åtkomst med lägsta behörighet. För hanterad identitet tilldelar du endast de roller som måltjänsten kräver.
Autentisera med API-nyckel
Använd den här varianten för ett API som förväntar sig en nyckel i en rubrik eller frågeparameter. Du kan bara använda ett API-nyckelsäkerhetsschema per OpenAPI-verktyg. Om API:et kräver flera säkerhetsscheman skapar du flera OpenAPI-verktyg.
Uppdatera säkerhetsscheman för OpenAPI-specifikationen. Den har ett
securitySchemesavsnitt och ett schema av typenapiKey. Till exempel:"securitySchemes": { "apiKeyHeader": { "type": "apiKey", "name": "x-api-key", "in": "header" } }Du behöver vanligtvis bara uppdatera fältet
name, vilket motsvarar namnetkeypå i anslutningen. Om säkerhetsschemana innehåller flera scheman behåller du bara ett av dem.Uppdatera OpenAPI-specifikationen så att den innehåller ett
securityavsnitt:"security": [ { "apiKeyHeader": [] } ]Ta bort alla parametrar i OpenAPI-specifikationen som behöver API-nyckel eftersom API-nyckeln lagras och skickas via en anslutning, enligt beskrivningen senare i den här artikeln.
Skapa en anslutning för att lagra din API-nyckel.
Gå till Foundry-portalen och öppna projektet.
Skapa eller välj en anslutning som lagrar hemligheten. Se Lägga till en ny anslutning till projektet.
Observera
Om du återskapar API-nyckeln vid ett senare tillfälle måste du uppdatera anslutningen med den nya nyckeln.
Ange följande information
nyckel:
namefältet i ditt säkerhetsschema. I det här exemplet bör det varax-api-key"securitySchemes": { "apiKeyHeader": { "type": "apiKey", "name": "x-api-key", "in": "header" } }värde: YOUR_API_KEY
När du har skapat en anslutning kan du använda den via SDK eller REST API. Använd flikarna överst i den här artikeln om du vill se kodexempel.
Konfigurera en anslutning för en Bearer-token
Använd den här varianten för ett API som förväntar sig en bearer-token i sidhuvudet Authorization. Den använder samma project_connection autentiseringstyp som API-nyckelautentisering, men OpenAPI-säkerhetsschemat och anslutningsvärdena skiljer sig åt.
OpenAPI-specifikationen ser ut så här:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
Du måste:
Uppdatera OpenAPI-specifikationen
securitySchemesså att den användsAuthorizationsom rubriknamn:"securitySchemes": { "bearerAuth": { "type": "apiKey", "name": "Authorization", "in": "header" } }Lägg till ett
securityavsnitt som refererar till schemat:"security": [ { "bearerAuth": [] } ]Skapa en anslutning för anpassade nycklar i ditt Foundry-projekt:
- Gå till Foundry-portalen och öppna projektet.
- Skapa eller välj en anslutning som lagrar hemligheten. Se Lägga till en ny anslutning till projektet.
- Ange följande värden:
-
nyckel:
Authorization(måste matcha fältetnamei dinsecuritySchemes) -
värde:
Bearer <token>(ersätt<token>med din faktiska token)
-
nyckel:
Viktigt
Värdet måste innehålla ordet
Bearerföljt av ett mellanslag före tecknet. Till exempel:Bearer eyJhbGciOiJSUzI1NiIs.... Om du utelämnar prefixetBeareroch följande blanksteg tar API:et emot en råtoken utan det nödvändiga auktoriseringsschemaprefixet och begäran misslyckas.
- När du har skapat anslutningen använder du den med
project_connectionautentiseringstyp i koden, på samma sätt som du skulle för API-nyckelautentisering. Anslutnings-ID:t använder samma format:/subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.
Autentisera med hjälp av hanterad identitet (Microsoft Entra ID)
Microsoft Entra ID är en molnbaserad tjänst för identitets- och åtkomsthantering som dina anställda kan använda för att komma åt externa resurser. Med hjälp av Microsoft Entra ID kan du lägga till extra säkerhet i dina API:er utan att behöva använda API-nycklar. När du konfigurerar hanterad identitetsautentisering autentiserar agenten via det Foundry-verktyg som används.
Viktigt
Hanterad identitetsautentisering fungerar bara när måltjänsten accepterar Microsoft Entra ID token. Om mål-API:et använder ett anpassat autentiseringsschema som inte stöder Microsoft Entra ID använder du API-nyckel eller Bearer-token autentisering i stället.
Förstå målgruppens URI
audience (kallas ibland resource identifier eller Application ID URI) anger Microsoft Entra ID vilken tjänst eller API token är avsedd att komma åt. Målgruppsvärdet måste matcha vad måltjänsten förväntar sig, eller så misslyckas autentiseringen med ett 401-fel.
Observera
Målgruppen är inte slutpunkten för Foundry-projektet. Det är resursidentifieraren för måltjänsten som ditt OpenAPI-verktyg anropar.
I följande tabell visas målgrupps-URI:er för vanliga Azure tjänster:
| Målsättningstjänst | Målgrupps-URI |
|---|---|
| Azure Storage | https://storage.azure.com |
| Azure Key Vault | https://vault.azure.net |
| Azure AI-sökning | https://search.azure.com |
| Azure Logic Apps | https://logic.azure.com |
| Azure API Management (hanteringsplan) | https://management.azure.com |
| API som skyddas av en Microsoft Entra appregistrering (inklusive APIM med OAuth) |
Program-ID-URI:n från din appregistrering (till exempel api://<client-id>) |
Tips
Om du använder Azure API Management för att skydda ett anpassat API med en OAuth 2.0-valideringsprincip är målgruppen Application ID URI från appregistreringen som skyddar API:et – inte https://management.azure.com. Hanteringsplanen gäller endast för åtgärder i Azure Resource Manager på själva APIM-resursen.
Mer information om hur agenter autentiserar med Microsoft Entra ID finns i Agent-identitet och autentisering.
Hitta och verifiera din målgrupp
Använd följande steg för att fastställa och verifiera rätt målgruppsvärde:
- För Azure tjänster: Kontrollera tjänstens dokumentation för dess Microsoft Entra ID resursidentifierare. De flesta Azure tjänster listar målgruppens URI i sin autentiseringsdokumentation.
- För API:er som skyddas av en Microsoft Entra appregistrering: I Azure portalen gå till Microsoft Entra ID>App registrations> välj din app >Expose an API. Program-ID-URI:n överst på sidan är ditt målgruppsvärde.
-
Verifiera en tokens målgrupp: Avkoda åtkomsttoken vid https://jwt.ms och kontrollera anspråket
aud. Värdetaudmåste matcha målgruppen som måltjänsten förväntar sig.
Konfigurera hanterad identitetsautentisering
Så här konfigurerar du autentisering med hjälp av hanterad identitet:
- Kontrollera att foundry-resursen har systemtilldelad hanterad identitet aktiverad.
Skapa en resurs för den tjänst som du vill ansluta till via OpenAPI-specifikationen.
Tilldela rätt åtkomst till resursen.
Välj den minst privilegierade dataplans- eller programrollen som beviljar åtgärderna i din OpenAPI-specifikation. Enbart Azure Resource Manager-åtkomst som Reader ger inte åtkomst till dataplanet. Välj sedan Nästa.
Välj Hanterad identitet och välj sedan medlemmar.
I listrutan hanterad identitet söker du efter Foundry-konto och väljer sedan Foundry-kontot för din agent.
Välj Slutför.
När du är klar med installationen kan du fortsätta med verktyget via Foundry Portal, SDK eller REST API. Använd flikarna överst i den här artikeln för att se kodexempel.
Felsöka vanliga fel
| Symptom | Sannolik orsak | Upplösning |
|---|---|---|
| API-nyckeln ingår inte i begäranden. | OpenAPI-specifikationen saknar securitySchemes eller security avsnitt. |
Kontrollera att OpenAPI-specifikationen innehåller både components.securitySchemes och ett avsnitt på den översta nivån security . Kontrollera att schemat name matchar nyckelnamnet i projektanslutningen. |
| Agenten anropar inte OpenAPI-verktyget. | Verktygsalternativet är inte inställt eller operationId inte beskrivande. |
Använd tool_choice="required" för att framtvinga verktygsanrop. Se till att operationId värdena är beskrivande så att modellen kan välja rätt åtgärd. |
| Autentiseringen misslyckas för hanterad identitet. | Hanterad identitet är inte aktiverad eller saknar rolltilldelning. | Aktivera systemtilldelad hanterad identitet på din Foundry-resurs. Tilldela måltjänstens minst privilegierade dataplans- eller programroll för åtgärderna i din OpenAPI-specifikation. |
| Hanterad identitet returnerar 401 trots att rollen har tilldelats. | Målgrupps-URI matchar inte vad måltjänsten förväntar sig. | Kontrollera att målgrupps-URI:n matchar måltjänstens resursidentifierare. Information om Azure tjänster finns i tjänstdokumentationen. För Microsoft Entra-skyddade API:er använder du program-ID-URI:n från din appregistrering. Avkoda token vid https://jwt.ms och bekräfta att anspråket aud matchar. Se Förstå målgruppens URI. |
| Hanterad identitetstoken avvisas av mål-API:et. | Måltjänsten accepterar inte Microsoft Entra ID token. | Bekräfta att måltjänsten stöder Microsoft Entra ID autentisering. Om den inte gör det använder du API-nyckel eller autentisering med ägartoken i stället. |
| Begäran misslyckas med 400 Felaktig begäran. | OpenAPI-specifikationen matchar inte det faktiska API:et. | Verifiera OpenAPI-specifikationen mot det faktiska API:et. Kontrollera parameternamn, typer och obligatoriska fält. |
| Begäran misslyckas med felkod 401: Obehörig | API-nyckeln eller token är ogiltig eller har upphört att gälla. | Återskapa API-nyckeln/token och uppdatera projektanslutningen. Kontrollera att anslutnings-ID:t är korrekt. |
| Verktyget returnerar oväntat svarsformat. | Svarsschemat har inte definierats i OpenAPI-specifikationen. | Lägg till svarsscheman i OpenAPI-specifikationen för bättre modelltolkning. |
operationId valideringsfel. |
Ogiltiga tecken i operationId. |
Använd endast bokstäver, -och _ i operationId värden. Ta bort siffror och specialtecken. |
| Anslutning ej hittad. | Anslutningsnamn eller ID matchar inte. | Kontrollera OPENAPI_PROJECT_CONNECTION_NAME att det matchar anslutningsnamnet i ditt Foundry-projekt. |
| Ägartoken har inte skickats korrekt. | Anslutningsvärdet saknar prefixet Bearer och efterföljande blanksteg. |
Ange anslutningsvärdet till Bearer <token> (med ordet Bearer och ett blanksteg före token). Kontrollera att OpenAPI-specifikationen securitySchemes använder "name": "Authorization". |
Välj en autentiseringsmetod
Följande tabell hjälper dig att välja rätt autentiseringsmetod för ditt OpenAPI-verktyg:
| Autentiseringsmetod | Bäst för | Konfigurationskomplexitet |
|---|---|---|
| Anonym | Offentliga API:er utan autentisering | Låg |
| API-nyckel | Api:er som inte Microsoft med nyckelbaserad åtkomst | Medel |
| Hanterad identitet | Azure tjänster och Microsoft Entra ID-skyddade API:er. Kräver att måltjänsten accepterar Microsoft Entra ID token och stöder Azure RBAC eller Microsoft Entra-baserad åtkomstkontroll. | Medelhög |