Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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. Gebruik anonieme verificatie, API-sleutel of authenticatie met een door het project beheerde identiteit. 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 het Foundry-project om een verbinding met een project tot stand te brengen. Deze rol omvat anonieme, API-sleutel- en verbindingen met door projecten beheerde identiteiten.
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.
Afhankelijkheden die zijn geïnstalleerd voor uw voorkeurstaal:
- Python SDK-voorbeelden:
azure-ai-projects,azure-identityenjsonref. In het voorbeeld directe antwoorden wordt ook gebruikgemaakt vanopenai. - Voorbeelden van C#SDK:
Azure.AI.Projects,Azure.AI.Projects.Agents,Azure.AI.Extensions.OpenAIenAzure.Identity. In het directe HTTP-voorbeeld wordt gebruikgemaakt vanAzure.Identity. - Voorbeelden van JavaScript/TypeScript SDK:
@azure/ai-projectsen@azure/identity. In het directe HTTP-voorbeeld wordt gebruikgemaakt van@azure/identity. - Java HTTP-voorbeeld:
com.azure:azure-identityencom.fasterxml.jackson.core:jackson-databind.
- Python SDK-voorbeelden:
OpenAPI 3.0- of 3.1-specificatiebestand dat aan deze vereisten voldoet:
- Elke functie moet een
operationId(vereist voor het OpenAPI-hulpprogramma) hebben. -
operationIdmag 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
- Elke functie moet een
Voor authenticatie met projectbeheerde identiteit: een OpenAPI-projectverbinding met
authType: "ProjectManagedIdentity"en de rol met de minste bevoegdheden voor de doelservice die is toegewezen aan de beheerde identiteit van het project. Geef de volledige resource-id van de verbinding door aan het hulpprogramma. Zie Een verbinding voor beheerde identiteit van een project maken.Voor API-sleutel-/tokenverificatie: een projectverbinding die is geconfigureerd met uw API-sleutel of token. Zie Een nieuwe verbinding met uw project toevoegen.
Voor anonieme authenticatie: een OpenAPI-projectverbinding met
authType: "None". Zie Een anonieme OpenAPI-verbinding maken.
Omgevingsvariabelen
| Variabele | Beschrijving |
|---|---|
FOUNDRY_PROJECT_ENDPOINT |
Uw Foundry-projecteindpunt, zoals https://<account>.services.ai.azure.com/api/projects/<project>. Gebruik het externe API-eindpunt niet. |
FOUNDRY_MODEL_DEPLOYMENT_NAME |
De naam van het geïmplementeerde model. |
OPENAPI_CONNECTION_ID |
De volledige ARM-resource-id van de OpenAPI-verbinding voor de geselecteerde verificatiemethode. |
TOOLBOX_CONNECTION_ID |
Voor voorbeelden die een toolbox koppelen via een projectverbinding, gebruik de volledige resource-id van die afzonderlijke verbinding met het MCP-eindpunt van de toolbox. |
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
In het Java voorbeeld in dit artikel wordt gebruikgemaakt van de HTTP-client van Java en Azure Identity om dezelfde Responses-payload te verzenden als de andere talen. Hiervoor zijn geen getypeerde OpenAPI-hulpprogrammamodellen vereist.
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. Maak een OpenAPI-projectverbinding, zelfs voor anonieme verificatie en geef de volledige resource-id door aan het hulpprogramma. Anonieme authenticatie vereist geen externe API-inloggegevens. Zie Een anonieme OpenAPI-verbinding maken.
- Installeer het SDK-pakket voor de geselecteerde taal vanuit vereisten.
- Download
weather_openapi.jsonen sla het op in hetassetspad dat door het voorbeeld wordt gebruikt. - Stel uw Foundry-projecteindpunt en modelimplementatiewaarden in.
- Maak een anonieme OpenAPI-verbinding voor
https://wttr.inen stelOPENAPI_CONNECTION_IDin op de volledige resource-id. - Voer het anonieme voorbeeld uit in de geselecteerde taalsectie.
- 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-sleutelauthenticatie, bearer-tokenverificatie en authenticatie met door het project beheerde identiteit als afzonderlijke varianten.
Beperkingen begrijpen
- De OpenAPI-specificatie moet
operationIdvoor elke bewerking bevatten enoperationIdkan 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-verificatie configureren in de Foundry-portal
Wanneer u een OpenAPI-hulpprogramma toevoegt via Hulpprogramma's>Aangepast>, maakt u een projectverbinding voor het hulpprogramma. Anoniem, API-sleutel en beheerde identiteit vereisen allemaal een verbinding, ongeacht of u het hulpprogramma configureert via de portal, SDK of REST API.
De optie Beheerde identiteit van de portal maakt gebruik van de beheerde identiteit van het Foundry-project, niet van de beheerde identiteit van het Foundry-account. OpenAPI-hulpprogramma's in toolboxes hebben altijd een projectbeheerde identiteit vereist, ongeacht de abonnementsgeschiedenis. Door account beheerde identiteit wordt alleen ondersteund voor OpenAPI-hulpprogramma's die rechtstreeks aan promptagents in bestaande abonnementen zijn gekoppeld. Migreer deze configuraties zo snel mogelijk naar de door project beheerde identiteit. Zie ondersteuning voor beheerde identiteiten.
Anonieme authenticatie betekent dat de doel-API geen inloggegevens vereist. Het betekent niet dat u het maken van de verbinding kunt overslaan.
| Authentication | Verbindingsconfiguratie |
|---|---|
| Anonieme | Maak een OpenAPI-projectverbinding zonder authenticatie (authType: "None"). Er is geen API-sleutel of -token vereist. |
| API-sleutel | Maak een projectverbinding waarin de API-sleutel wordt opgeslagen. Koppel de sleutelnaam aan de header- of queryparameter in het OpenAPI-beveiligingsschema. Zie Authenticeren met API-sleutel. |
| Managed Identity (door project beheerde Managed Identity) | Maak een OpenAPI-projectverbinding met authType: "ProjectManagedIdentity", het doel-API-eindpunt en de audience die door die API wordt verwacht. Wijs de beheerde identiteit van het project de vereiste rol toe op de doelservice. Met deze optie wordt de beheerde identiteit van het account niet gebruikt. |
Anonieme authenticatie configureren
- Open Tools>Custom>OpenAPI in uw Foundry-project.
- Voer in Een OpenAPI-hulpprogramma maken de naam en beschrijving van het hulpprogramma in.
- Stel de verificatiemethode in op Anoniem.
- Selecteer onder Verbinding een bestaande anonieme verbinding of selecteer Een nieuwe verbinding maken om er een te maken.
- Voer het OpenAPI 3.0+-schema in en selecteer Tool maken.
Het veld Verbinding is vereist, zelfs wanneer Anoniem is geselecteerd.
Verificatie van beheerde identiteit configureren
Voor de optie Beheerde identiteit is de beheerde identiteit van het project vereist. Een bestaande roltoewijzing voor de beheerde identiteit van het account verleent geen toegang tot de beheerde identiteit van het project.
- Stel in Een OpenAPI-hulpprogramma maken de verificatiemethode in op Beheerde identiteit.
- Selecteer onder Verbinding een bestaande door het project beheerde identiteitsverbinding of selecteer Een nieuwe verbinding maken.
- Voer in OpenAPI-verbinding maken een verbindingsnaam in en stel het verificatietype in op beheerde identiteit.
- Voer de doel-URL in voor de API en de audience die de API verwacht. De audience is niet uw Foundry-projecteindpunt.
- Selecteer Verbinding maken en selecteer die verbinding in het veld Verbinding van het hulpprogramma.
- Voer de Naam, Beschrijving en het OpenAPI 3.0+-schema van het hulpprogramma in en selecteer Hulpprogramma maken.
Wijs de beheerde identiteit van het project de vereiste rol toe aan de doelservice voordat u het hulpprogramma aanroept.
Voor het instellen van de verbinding met een door een project beheerde identiteit via REST, zie Een door een project beheerde identiteitsverbinding maken. Wanneer u die verbinding in code gebruikt, geeft u de volledige resource-id door met auth.type: "project_connection".
De SDK- en REST-voorbeelden verwijzen ook naar een projectkoppeling. Maak de verbinding voordat u verdergaat.
Een anonieme OpenAPI-verbinding maken
Gebruik de portalstappen in de vorige sectie of voer de volgende Bash-opdrachten uit met Azure CLI en curl nadat u zich hebt aangemeld met az login. Vervang de tijdelijke aanduidingen door de details van uw Foundry-project. Deze verbinding maakt gebruik van authType: "None" omdat voor de weer-API geen inloggegevens zijn vereist.
SUB="<subscription-id>"
RESOURCE_GROUP="<resource-group>"
ACCOUNT="<foundry-account-name>"
PROJECT_NAME="<foundry-project-name>"
PROJECT="/subscriptions/$SUB/resourceGroups/$RESOURCE_GROUP"
PROJECT="$PROJECT/providers/Microsoft.CognitiveServices"
PROJECT="$PROJECT/accounts/$ACCOUNT/projects/$PROJECT_NAME"
export OPENAPI_CONNECTION_ID="$PROJECT/connections/weather-anonymous"
ARM_TOKEN="$(az account get-access-token \
--subscription "$SUB" \
--resource https://management.azure.com \
--query accessToken -o tsv)"
curl --fail-with-body --request PUT \
--url "https://management.azure.com$OPENAPI_CONNECTION_ID?api-version=2025-06-01" \
--header "Authorization: Bearer $ARM_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"properties": {
"category": "OpenAPI",
"authType": "None",
"target": "https://wttr.in",
"metadata": {
"type": "openapi"
}
}
}'
Referentie: Resourceschema voor Foundry-projectverbindingen.
Voer OPENAPI_CONNECTION_ID in in de auth.security_scheme.project_connection_id van de tool, met auth.type: "project_connection". De authType van de verbinding bepaalt dat de doel-API anoniem wordt aangeroepen.
OpenAPI-hulpprogramma's toevoegen aan een werkset
Gebruik dit patroon om een REST API beschikbaar te maken die wordt beschreven door een OpenAPI-specificatie. Voor anonieme, API-sleutel- of door het project beheerde identiteitsauthenticatie stelt u de auth.type van het hulpprogramma in op project_connection. De eigenschap van de verbinding authType bepaalt hoe Foundry zich authenticeert bij de doel-API.
Voor verificatie van beheerde identiteiten vereisen toolboxen projectbeheerde identiteit. Door account beheerde identiteit wordt niet ondersteund in toolboxes, ook niet voor bestaande abonnementen.
In de volgende codefragmenten ziet u de configuratie van hulpprogramma's, maar geen volledige programma's. Vervang elk leeg spec object door uw OpenAPI-specificatie. Voor het maken van toolboxen gebruikt u de volledige taalvoorbeelden in de volgende secties.
Belangrijk
Wanneer u verificatie voor beheerde identiteiten gebruikt, wijst u de beheerde identiteit van het Foundry-project de minst bevoegde RBAC-rol toe die de vereiste API-bewerkingen op de doelservice toestaat. 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:
Maak eerst een OpenAPI-verbinding met authType: "None" en vervang <OPENAPI_CONNECTION_ID> door de volledige resource-id ervan.
{
"description": "REST API via OpenAPI spec",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": {},
"auth": {
"type": "project_connection",
"security_scheme": {
"project_connection_id": "<OPENAPI_CONNECTION_ID>"
}
}
}
}
]
}
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": {},
"auth": {
"type": "project_connection",
"security_scheme": {
"project_connection_id": "<OPENAPI_CONNECTION_ID>"
}
}
}
}
]
}
Projectauthenticatie met beheerde identiteit:
Maak een OpenAPI-projectverbinding met authType: "ProjectManagedIdentity"en geef de volledige resource-id door met auth.type: "project_connection". Gebruik de configuratie van de directe managed_identity doelgroep niet in een toolbox.
{
"description": "REST API with project managed identity auth",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": {},
"auth": {
"type": "project_connection",
"security_scheme": {
"project_connection_id": "<OPENAPI_CONNECTION_ID>"
}
}
}
}
]
}
import os
from azure.ai.projects.models import (
OpenApiFunctionDefinition,
OpenApiProjectConnectionAuthDetails,
OpenApiProjectConnectionSecurityScheme,
OpenApiToolboxTool,
)
tools = [
OpenApiToolboxTool(
openapi=OpenApiFunctionDefinition(
name="my-api",
spec={},
auth=OpenApiProjectConnectionAuthDetails(
security_scheme=OpenApiProjectConnectionSecurityScheme(
project_connection_id=os.environ["OPENAPI_CONNECTION_ID"]
)
),
)
)
]
using System;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects.Agents;
BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
OpenApiToolboxTool tool = new(
new OpenApiFunctionDefinition(
name: "my-api",
specification: specBytes,
authentication: new OpenApiProjectConnectionAuthenticationDetails(
new OpenApiProjectConnectionSecurityScheme(
Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
?? throw new InvalidOperationException(
"Set OPENAPI_CONNECTION_ID before running.")))
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
name: "my-toolbox",
tools: [tool],
description: "REST API via OpenAPI spec"
);
const connectionId = process.env.OPENAPI_CONNECTION_ID;
if (!connectionId) {
throw new Error("Set OPENAPI_CONNECTION_ID before running.");
}
const tools = [
{
type: "openapi",
openapi: {
name: "my-api",
spec: { /* paste OpenAPI spec object here */ },
auth: {
type: "project_connection",
security_scheme: {
project_connection_id: connectionId,
},
},
},
},
];
Een OpenAPI-werkset maken met de Azure Developer CLI
OpenAPI-hulpprogramma's sluiten de specificatie rechtstreeks onder tools:in. Authenticatie op basis van een verbinding (connection_auth) verwijst naar een projectverbinding. Maak ook een verbinding voor anonieme authenticatie.
Stap 1. De authenticatieverbinding maken
Voor anonieme authenticatie volgt u Een anonieme OpenAPI-verbinding maken. Gebruik de volgende opdracht voor verificatie van API-sleutels:
# 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"
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 moet u verbindingsgebaseerde authenticatie behouden. Als u bijvoorbeeld de eerder gemaakte weerverbinding wilt gebruiken, vervangt u de voorbeeldspecificatie door weather_openapi.json en gebruikt u dit auth: blok:
auth:
type: connection_auth
connection_id: weather-anonymous
Stap 3. Maak de werkset
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Voordat u de codevoorbeelden uitvoert
- Maak de OpenAPI-projectverbinding voordat u een voorbeeld uitvoert, inclusief anonieme voorbeelden. Gebruik voor de weersvoorbeelden een anonieme verbinding die is gericht op
https://wttr.in, en stelOPENAPI_CONNECTION_IDin op de volledige ARM-resource-id. - Download de onderhouden
tripadvisor_openapi.jsonspecificatie en sla deze op in hetassetspad 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.
- Gebruik de volledige verbindingsresource-id:
/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>/connections/<connection>.
Belangrijk
Verificatie van API-sleutels werkt alleen als uw OpenAPI-specificatiebestand het volgende bevat:
- Een
securitySchemessectie met de configuratie van uw API-sleutel, zoals de headernaam en parameternaam. - Een
securitysectie die verwijst naar het beveiligingsschema. - 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,
OpenApiProjectConnectionAuthDetails,
OpenApiProjectConnectionSecurityScheme,
)
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
AGENT_NAME = "MyAgent"
# Create a client to call Foundry API
with AIProjectClient(
endpoint=PROJECT_ENDPOINT,
credential=DefaultAzureCredential(),
) as project:
weather_asset_file_path = os.path.abspath(
os.path.join(os.path.dirname(__file__), "../assets/weather_openapi.json")
)
with open(weather_asset_file_path, "r") as f:
openapi_weather = cast(dict[str, Any], jsonref.loads(f.read()))
# Initialize agent OpenAPI tool using the read in OpenAPI spec
weather_tool = OpenApiTool(
openapi=OpenApiFunctionDefinition(
name="get_weather",
spec=openapi_weather,
description="Retrieve weather information for a location.",
auth=OpenApiAnonymousAuthDetails(),
)
)
agent = project.agents.create_version(
agent_name=AGENT_NAME,
definition=PromptAgentDefinition(
model="gpt-4.1-mini",
instructions="You are a helpful assistant.",
tools=[weather_tool],
),
)
with project.get_openai_client(agent_name=agent.name) as openai:
response = openai.responses.create(
input="What's the weather in Seattle?",
)
print(response.output_text)
# Clean up resources
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
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:
- De Weer OpenAPI-specificatie wordt geladen vanuit een lokaal JSON-bestand.
- Maakt een prompt-agent met de weertool geconfigureerd voor anonieme toegang.
- Hiermee wordt een query verzonden waarin wordt gevraagd naar het weer van Seattle.
- De agent gebruikt het OpenAPI-hulpprogramma om de weer-API aan te roepen en retourneert opgemaakte resultaten.
- 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.15.0" "azure-ai-projects>=2.3.0,<2.8.0" 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,
OpenApiProjectConnectionAuthDetails,
OpenApiProjectConnectionSecurityScheme,
)
PROJECT_ENDPOINT = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
async def main() -> None:
credential = AzureCliCredential()
# 1. Create the OpenAPI tool and add it to a toolbox. Using a toolbox is the
# recommended way to give agents tools: curate tools once and reuse the
# toolbox across agents. See /azure/foundry/agents/concepts/toolbox-overview
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)
weather_asset_file_path = os.path.abspath(
os.path.join(os.path.dirname(__file__), "../assets/weather_openapi.json")
)
with open(weather_asset_file_path, encoding="utf-8") as f:
openapi_weather = cast(dict[str, Any], jsonref.loads(f.read()))
weather_tool = OpenApiToolboxTool(
openapi=OpenApiFunctionDefinition(
name="get_weather",
spec=openapi_weather,
description="Retrieve weather information for a location.",
auth=OpenApiProjectConnectionAuthDetails(
security_scheme=OpenApiProjectConnectionSecurityScheme(
project_connection_id=os.environ["OPENAPI_CONNECTION_ID"]
)
),
)
)
toolbox = project.toolboxes.create_version(
name="openapi-toolbox",
description="Toolbox with the OpenAPI weather tool",
tools=[weather_tool],
)
# 2. The toolbox exposes an MCP-compatible endpoint.
TOOLBOX_MCP_URL = (
f"{PROJECT_ENDPOINT}/toolboxes/{toolbox.name}"
f"/versions/{toolbox.version}/mcp?api-version=v1"
)
# 3. Attach the toolbox to the hosted agent as an MCP tool.
toolbox_tool = FoundryToolbox(credential, url=TOOLBOX_MCP_URL)
agent = Agent(
client=FoundryChatClient(credential=credential),
instructions="You are a helpful assistant. Use the OpenAPI weather tool to answer questions.",
tools=[toolbox_tool],
)
result = await agent.run("What's the weather in Seattle?")
print(f"Agent: {result.text}")
if __name__ == "__main__":
asyncio.run(main())
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.AI.Projects.Agents;
using Azure.Identity;
using OpenAI.Responses;
#pragma warning disable AAIP002
class OpenAPIDemo
{
// Utility method to get the OpenAPI specification file from the Assets folder.
private static string GetFile([CallerFilePath] string pth = "")
{
var dirName = Path.GetDirectoryName(pth) ?? "";
return Path.Combine(dirName, "Assets", "weather_openapi.json");
}
public static void Main()
{
var projectEndpoint =
Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
?? throw new InvalidOperationException(
"Set FOUNDRY_PROJECT_ENDPOINT before running.");
var deploymentName =
Environment.GetEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME")
?? throw new InvalidOperationException(
"Set FOUNDRY_MODEL_DEPLOYMENT_NAME before running.");
// Create project client to call Foundry API
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// The connection specifies anonymous authentication to the weather API.
string filePath = GetFile();
OpenApiFunctionDefinition toolDefinition = new(
name: "get_weather",
specification: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
authentication: new OpenApiProjectConnectionAuthenticationDetails(
new OpenApiProjectConnectionSecurityScheme(
Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
?? throw new InvalidOperationException(
"Set OPENAPI_CONNECTION_ID before running.")))
);
toolDefinition.Description = "Retrieve weather information for a location.";
OpenApiTool openapiTool = new(toolDefinition);
// Create the agent definition and the agent version.
DeclarativeAgentDefinition agentDefinition = new(model: deploymentName)
{
Instructions = "You are a helpful assistant.",
Tools = { openapiTool }
};
ProjectsAgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "myAgent",
options: new(agentDefinition));
// Create a response object and ask the question about the weather in Seattle, WA.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
ResponseResult response = responseClient.CreateResponse(
userInputText: "Use the OpenAPI tool to print out, what is the weather in Seattle, WA today."
);
Console.WriteLine(response.GetOutputText());
// Finally, delete all the resources created in this sample.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
}
}
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:
- Het leest de Weer OpenAPI-specificatie uit een lokaal JSON-bestand.
- Hiermee maakt u een agent met de weertool geconfigureerd.
- Met de OpenAPI-tool wordt een aanvraag verzonden waarin gevraagd wordt naar het weer in Seattle.
- De agent roept de weer-API aan en retourneert de resultaten.
- Schoont de agent op door de agent te verwijderen.
Vereiste invoer
- Omgevingsvariabelen:
FOUNDRY_PROJECT_ENDPOINT,FOUNDRY_MODEL_DEPLOYMENT_NAMEenOPENAPI_CONNECTION_ID. - 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(incomponents) alssecuritysecties 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. Gebruik een ASP.NET Core-project met Azure.AI.AgentServer.Responses enMicrosoft.Agents.AI.Foundry.Hosting, naast de C#-afhankelijkheden in Vereisten. Stel FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAME en OPENAPI_CONNECTION_ID, en meld u aan met az login.
using System;
using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.AgentServer.Responses;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using Microsoft.AspNetCore.Builder;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;
string GetFile([CallerFilePath] string pth = "")
{
var dirName = Path.GetDirectoryName(pth) ?? "";
return Path.Combine(dirName, "Assets", "weather_openapi.json");
}
string projectEndpoint = Environment.GetEnvironmentVariable(
"FOUNDRY_PROJECT_ENDPOINT")
?? throw new InvalidOperationException("Set FOUNDRY_PROJECT_ENDPOINT.");
string deploymentName = Environment.GetEnvironmentVariable(
"FOUNDRY_MODEL_DEPLOYMENT_NAME")
?? throw new InvalidOperationException("Set FOUNDRY_MODEL_DEPLOYMENT_NAME.");
DefaultAzureCredential credential = new();
// 1. Create the OpenAPI tool and add it to a toolbox. Using a toolbox is the
// recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
string filePath = GetFile();
OpenApiFunctionDefinition toolDefinition = new(
name: "get_weather",
specification: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
authentication: new OpenApiProjectConnectionAuthenticationDetails(
new OpenApiProjectConnectionSecurityScheme(
Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
?? throw new InvalidOperationException(
"Set OPENAPI_CONNECTION_ID before running.")))
);
toolDefinition.Description = "Retrieve weather information for a location.";
OpenApiToolboxTool openapiTool = new(toolDefinition);
ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
.GetAgentToolboxes().CreateVersion(
name: "openapi-toolbox",
tools: [openapiTool],
description: "Toolbox with the OpenAPI weather tool");
projectClient.AgentAdministrationClient.GetAgentToolboxes()
.UpdateDefaultVersion(toolboxVersion.Name, toolboxVersion.Version);
// Create the hosted agent and register the toolbox integration.
AIAgent agent = projectClient.AsAIAgent(
model: deploymentName,
instructions: "You are a helpful assistant with access to the toolbox tools.",
name: "hosted-toolbox-agent");
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.Services.AddFoundryToolboxes(credential, toolboxVersion.Name);
var app = builder.Build();
app.MapFoundryResponses();
app.Run();
Verwachte uitvoer
Het voorbeeld start een HTTP-server. Wanneer u een Responses-aanvraag verzendt waarin naar het weer wordt gevraagd, roept de agent de API aan via de toolbox en retourneert de huidige omstandigheden:
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 koppelt u een geauthenticeerd OpenAPI-hulpprogramma rechtstreeks aan een promptagent. U gebruikt de TripAdvisor-specificatie en een API-sleutel die is opgeslagen in een projectverbinding.
De TripAdvisor-service vereist API-sleutelverificatie. Maak de projectverbinding zoals beschreven in Verifiëren met API-sleutel en stel OPENAPI_CONNECTION_ID in op de volledige resource-id. De sleutelnaam van de verbinding moet overeenkomen met de TripAdvisor-specificatie.
using System;
using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using OpenAI.Responses;
#pragma warning disable AAIP002
class OpenAPIConnectedDemo
{
// Utility method to get the OpenAPI specification file from the Assets folder.
private static string GetFile([CallerFilePath] string pth = "")
{
var dirName = Path.GetDirectoryName(pth) ?? "";
return Path.Combine(dirName, "Assets", "tripadvisor_openapi.json");
}
public static void Main()
{
var projectEndpoint =
Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
?? throw new InvalidOperationException(
"Set FOUNDRY_PROJECT_ENDPOINT before running.");
var deploymentName =
Environment.GetEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME")
?? throw new InvalidOperationException(
"Set FOUNDRY_MODEL_DEPLOYMENT_NAME before running.");
// Create project client to call Foundry API
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// Create an OpenAPI tool with authentication by project connection security scheme.
string filePath = GetFile();
var connectionId =
Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
?? throw new InvalidOperationException(
"Set OPENAPI_CONNECTION_ID to the TripAdvisor connection ID.");
OpenApiFunctionDefinition toolDefinition = new(
name: "tripadvisor",
specification: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
authentication: new OpenApiProjectConnectionAuthenticationDetails(new OpenApiProjectConnectionSecurityScheme(
projectConnectionId: connectionId
))
);
toolDefinition.Description = "Trip Advisor API to get travel information.";
OpenApiTool openapiTool = new(toolDefinition);
// Create the agent definition and the agent version.
DeclarativeAgentDefinition agentDefinition = new(model: deploymentName)
{
Instructions = "You are a helpful assistant.",
Tools = { openapiTool }
};
ProjectsAgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "myAgent",
options: new(agentDefinition));
// Create a response object and ask the question about the hotels in France.
// Test the Web service access before you run production scenarios.
// It can be done by setting:
// ToolChoice = ResponseToolChoice.CreateRequiredChoice()`
// in the ResponseCreationOptions. This setting will
// force Agent to use tool and will trigger the error if it is not accessible.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
CreateResponseOptions responseOptions = new()
{
ToolChoice = ResponseToolChoice.CreateRequiredChoice(),
InputItems =
{
ResponseItem.CreateUserMessageItem("Recommend me 5 top hotels in paris, France."),
}
};
ResponseResult response = responseClient.CreateResponse(
options: responseOptions
);
Console.WriteLine(response.GetOutputText());
// Finally, delete all the resources we have created in this sample.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
}
}
Wat deze code doet
In dit C#-voorbeeld wordt een OpenAPI-hulpprogramma met API-sleutelverificatie gebruikt via een projectverbinding. Wanneer u de code uitvoert:
- De TripAdvisor OpenAPI-specificatie wordt geladen vanuit een lokaal bestand.
- Het verwijst naar de TripAdvisor-projectverbinding die uw API-sleutel bevat.
- Het koppelt het TripAdvisor-hulpprogramma aan de agent, geconfigureerd voor het gebruik van de verbinding voor verificatie.
- Stuurt een aanvraag voor hotelaanaanveling in Parijs.
- De agent roept de TripAdvisor-API aan met behulp van uw opgeslagen API-sleutel en retourneert resultaten.
- Schoont de agent op door de agent te verwijderen.
Vereiste invoer
- Omgevingsvariabelen:
FOUNDRY_PROJECT_ENDPOINT,FOUNDRY_MODEL_DEPLOYMENT_NAMEenOPENAPI_CONNECTION_ID. - Lokaal bestand:
Assets/tripadvisor_openapi.json - Project verbinding:
tripadvisormet 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 genaamdtripadvisorgevonden. -
AuthenticationException: Ongeldige API-sleutel in projectverbinding, of ontbrekende/onjuistesecuritySchemes-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
securitySchemesensecurityin 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.
- Maak een werkset met het openAPI-weerhulpmiddel:
curl --request POST \
--url "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions?api-version=v1" \
--header "Foundry-Features: Toolboxes=V1Preview" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"description": "Toolbox with the OpenAPI weather tool",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "weather",
"description": "Tool to get weather data",
"auth": {
"type": "project_connection",
"security_scheme": {
"project_connection_id": "'$OPENAPI_CONNECTION_ID'"
}
},
"spec": {
"openapi": "3.1.0",
"info": {
"title": "get weather data",
"description": "Retrieves current weather data for a location.",
"version": "v1.0.0"
},
"servers": [{ "url": "https://wttr.in" }],
"paths": {
"/{location}": {
"get": {
"description": "Get weather information for a specific location",
"operationId": "GetCurrentWeather",
"parameters": [
{
"name": "location",
"in": "path",
"description": "City or location to retrieve the weather for",
"required": true,
"schema": { "type": "string" }
},
{
"name": "format",
"in": "query",
"description": "Format in which to return data. Always use 3.",
"required": true,
"schema": { "type": "integer", "default": 3 }
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"text/plain": {
"schema": { "type": "string" }
}
}
},
"404": { "description": "Location not found" }
}
}
}
}
}
}
}
]
}'
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.
- 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
Maak een antwoord dat gebruikmaakt van de werkset door deze als een MCP-hulpprogramma te koppelen.
Stel
TOOLBOX_CONNECTION_IDin op de volledige resource-id vanopenapi-toolbox-conn. Deze verbinding is gescheiden van de anonieme OpenAPI-verbinding inOPENAPI_CONNECTION_ID. Vervang<version>door de versie die is geretourneerd toen u de toolbox maakte.
curl --request POST \
--url "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
--header "Authorization: Bearer $AGENT_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
"input": "Use the OpenAPI tool to get the weather in Seattle, WA today.",
"tool_choice": "required",
"tools": [
{
"type": "mcp",
"server_label": "toolbox",
"server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1",
"require_approval": "never",
"project_connection_id": "'$TOOLBOX_CONNECTION_ID'",
"headers": {
"Foundry-Features": "Toolboxes=V1Preview"
}
}
]
}'
API-sleutelverificatie (projectkoppeling)
Gebruik deze variant pas nadat de anonieme stroom is geslaagd. Download tripadvisor_openapi.json via Voordat u de codevoorbeelden uitvoert. Configureer de API-sleutelverbinding en de securitySchemes- en security-vermeldingen van de specificatie zoals beschreven in Verifiëren met API-sleutel. Stel OPENAPI_CONNECTION_ID in op de volledige resource-id van die verbinding, niet op de anonieme weerverbinding.
In dit Bash-voorbeeld wordt jq gebruikt om de specificatie op te nemen in dezelfde remote_tool aanvraagshape als de voorbeelden van door het project beheerde identiteiten.
jq -n \
--arg model "$FOUNDRY_MODEL_DEPLOYMENT_NAME" \
--arg connection_id "$OPENAPI_CONNECTION_ID" \
--slurpfile spec tripadvisor_openapi.json \
'{
model: $model,
input: "Recommend five top hotels in the United States.",
tools: [
{
type: "remote_tool",
tool_arguments: [
{
name: "openapi",
arguments: {
name: "tripadvisor",
description: "TripAdvisor travel information.",
auth: {
type: "project_connection",
security_scheme: {
project_connection_id: $connection_id
}
},
spec: $spec[0]
}
}
]
}
],
tool_choice: "required"
}' > openapi-api-key-request.json
curl --fail-with-body --request POST \
--url "${FOUNDRY_PROJECT_ENDPOINT%/}/openai/v1/responses" \
--header "Authorization: Bearer $AGENT_TOKEN" \
--header "Content-Type: application/json" \
--data @openapi-api-key-request.json
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
Voor een door project beheerde identiteit, maakt u eerst een OpenAPI-projectverbinding. Geef vervolgens de volledige resource-id door in de Responses-request. Zie het REST-voorbeeld in Een OpenAPI-hulpprogramma aanroepen met een door project beheerde identiteit.
Door account beheerde identiteit wordt alleen ondersteund voor OpenAPI-hulpprogramma's die rechtstreeks aan promptagents in bestaande abonnementen zijn gekoppeld. Het wordt niet ondersteund in toolboxen. Gebruik ook een projectbeheerde identiteit voor promptagenten. Bestaande configuraties zo snel mogelijk migreren.
Wat deze code doet
In dit REST API-voorbeeld ziet u hoe u een OpenAPI-hulpprogramma aanroept met verschillende verificatiemethoden. De aanvraag:
- Voor anonieme authenticatie wordt een toolbox gemaakt met de OpenAPI-tooldefinitie en de weerspecificatie van de API.
- Maakt een antwoord dat de toolbox als MCP-hulpprogramma toevoegt en vraagt naar het weer in Seattle.
- Toont een extra directe REST-hulpprogrammadefinitie voor API-sleutelverificatie via een projectverbinding.
- De agent roept de API aan die is geselecteerd door de configuratie van het hulpprogramma en retourneert de resultaten.
Vereiste invoer
- Omgevingsvariabelen:
FOUNDRY_PROJECT_ENDPOINT,AGENT_TOKEN,FOUNDRY_MODEL_DEPLOYMENT_NAME. - Voor anonieme authenticatie:
OPENAPI_CONNECTION_ID, die verwijst naar de anonieme OpenAPI-projectverbinding, enTOOLBOX_CONNECTION_ID, die verwijst naar de MCP-verbinding van de werkset. - Voor API-sleutelauthenticatie:
OPENAPI_CONNECTION_ID, waarmee wordt verwezen naar de TripAdvisor-API-sleutelverbinding, entripadvisor_openapi.json. - Voor verificatie van door een project beheerde identiteit:
OPENAPI_CONNECTION_ID, zoals wordt weergegeven in het voorbeeld van de door een project beheerde identiteit. - Inline OpenAPI-specificatie in verzoeklichaam.
Verwachte uitvoer
{
"id": "resp_abc123",
"object": "response",
"output": [
{
"type": "message",
"content": [
{
"type": "output_text",
"text": "The weather in Seattle, WA today is cloudy with a temperature of 52°F (11°C)..."
}
]
}
]
}
Veelvoorkomende fouten
-
401 Unauthorized: Ongeldig of ontbreektAGENT_TOKEN, of API-sleutel is niet geïnjecteerd omdatsecuritySchemesensecurityontbreekt 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.securitySchemessectie 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,
OpenApiToolboxTool,
OpenApiFunctionDefinition,
OpenApiProjectConnectionAuthDetails,
} from "@azure/ai-projects";
import * as fs from "fs";
import * as path from "path";
function requiredEnv(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(`Set ${name} before running.`);
}
return value;
}
const PROJECT_ENDPOINT = requiredEnv("FOUNDRY_PROJECT_ENDPOINT");
const deploymentName = requiredEnv("FOUNDRY_MODEL_DEPLOYMENT_NAME");
const weatherSpecPath = path.resolve("assets", "weather_openapi.json");
function loadOpenApiSpec(specPath: string): unknown {
if (!fs.existsSync(specPath)) {
throw new Error(`OpenAPI specification not found at: ${specPath}`);
}
try {
const data = fs.readFileSync(specPath, "utf-8");
return JSON.parse(data);
} catch (error) {
throw new Error(`Failed to read or parse OpenAPI specification at ${specPath}: ${error}`);
}
}
function createWeatherTool(spec: unknown): OpenApiToolboxTool {
const connectionId = process.env.OPENAPI_CONNECTION_ID;
if (!connectionId) {
throw new Error("Set OPENAPI_CONNECTION_ID before running.");
}
const auth: OpenApiProjectConnectionAuthDetails = {
type: "project_connection",
security_scheme: {
project_connection_id: connectionId,
},
};
const definition: OpenApiFunctionDefinition = {
name: "get_weather",
description: "Retrieve weather information for a location using wttr.in",
spec,
auth,
};
return {
type: "openapi",
openapi: definition,
};
}
export async function main(): Promise<void> {
const weatherSpec = loadOpenApiSpec(weatherSpecPath);
// Create clients to call Foundry API
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
const weatherTool = createWeatherTool(weatherSpec);
console.log("Creating a toolbox with the OpenAPI weather tool...");
// 1. Add the OpenAPI tool to a toolbox. Using a toolbox is the recommended
// way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
const toolbox = await project.toolboxes.createVersion(
"openapi-toolbox",
[weatherTool],
{ description: "Toolbox with the OpenAPI weather tool" },
);
// 2. The toolbox exposes an MCP-compatible endpoint.
const toolboxMcpUrl =
`${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
`/versions/${toolbox.version}/mcp?api-version=v1`;
// 3. Create a remote-tool project connection that points at the toolbox endpoint.
// Use a user Entra token so the caller's identity is passed through
// (audience https://ai.azure.com). Create the connection once, for example
// with the Azure Developer CLI:
//
// azd ai connection create openapi-toolbox-conn \
// --kind remote-tool \
// --target "<toolboxMcpUrl>" \
// --auth-type user-entra-token \
// --audience https://ai.azure.com
const toolboxConnectionId = process.env.TOOLBOX_CONNECTION_ID;
if (!toolboxConnectionId) {
throw new Error("Set TOOLBOX_CONNECTION_ID to the toolbox connection ID.");
}
// 4. Attach the toolbox to a prompt agent as an MCP tool.
const agent = await project.agents.createVersion("MyOpenApiAgent", {
kind: "prompt",
model: deploymentName,
instructions:
"You are a helpful assistant that can call external APIs defined by OpenAPI specs to answer user questions.",
tools: [
{
type: "mcp",
server_label: "toolbox",
server_url: toolboxMcpUrl,
require_approval: "never",
project_connection_id: toolboxConnectionId,
headers: {
"Foundry-Features": "Toolboxes=V1Preview",
},
},
],
});
// Send a request and stream the response
const streamResponse = await openai.responses.create(
{
input:
"What's the weather in Seattle and how should I plan my outfit for the day based on the forecast?",
stream: true,
},
{
body: {
agent_reference: { name: agent.name, type: "agent_reference" },
tool_choice: "required",
},
},
);
// Process the streaming response
for await (const event of streamResponse) {
if (event.type === "response.output_text.delta") {
process.stdout.write(event.delta);
} else if (event.type === "response.output_text.done") {
console.log("\n");
}
}
// Clean up resources
await project.agents.deleteVersion(agent.name, agent.version);
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
process.exitCode = 1;
});
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:
- De Weer OpenAPI-specificatie wordt geladen vanuit een lokaal JSON-bestand.
- Maakt een toolboxversie met de weertool.
- 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.
- Verwerkt het streaming-antwoord en geeft delta's weer zodra ze binnenkomen.
- Het dwingt het gebruik van hulpprogramma's af door
tool_choice: "required"te gebruiken om ervoor te zorgen dat de API wordt aangeroepen. - Schoont de agent op door de agent te verwijderen.
Vereiste invoer
- Omgevingsvariabelen:
FOUNDRY_PROJECT_ENDPOINT,FOUNDRY_MODEL_DEPLOYMENT_NAME,OPENAPI_CONNECTION_IDenTOOLBOX_CONNECTION_ID. - Lokaal bestand:
assets/weather_openapi.json(OpenAPI-specificatie).
Verwachte uitvoer
Creating a toolbox with the OpenAPI weather tool...
The weather in Seattle is <conditions>. Consider wearing <suggestion>.
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
securitySchemesensecuritycorrect 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";
function requiredEnv(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(`Set ${name} before running.`);
}
return value;
}
const PROJECT_ENDPOINT = requiredEnv("FOUNDRY_PROJECT_ENDPOINT");
const deploymentName = requiredEnv("FOUNDRY_MODEL_DEPLOYMENT_NAME");
const connectionId = requiredEnv("OPENAPI_CONNECTION_ID");
const tripAdvisorSpecPath = path.resolve("assets", "tripadvisor_openapi.json");
function loadOpenApiSpec(specPath: string): unknown {
if (!fs.existsSync(specPath)) {
throw new Error(`OpenAPI specification not found at: ${specPath}`);
}
try {
const data = fs.readFileSync(specPath, "utf-8");
return JSON.parse(data);
} catch (error) {
throw new Error(`Failed to read or parse OpenAPI specification at ${specPath}: ${error}`);
}
}
function createTripAdvisorTool(spec: unknown): OpenApiTool {
const auth: OpenApiProjectConnectionAuthDetails = {
type: "project_connection",
security_scheme: {
project_connection_id: connectionId,
},
};
const definition: OpenApiFunctionDefinition = {
name: "get_tripadvisor_location_details",
description:
"Fetch TripAdvisor location details, reviews, or photos using the Content API via project connection auth.",
spec,
auth,
};
return {
type: "openapi",
openapi: definition,
};
}
export async function main(): Promise<void> {
const tripAdvisorSpec = loadOpenApiSpec(tripAdvisorSpecPath);
// Create clients to call Foundry API
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
// Create an agent with the OpenAPI project-connection tool
const agent = await project.agents.createVersion("MyOpenApiConnectionAgent", {
kind: "prompt",
model: deploymentName,
instructions:
"You are a travel assistant that consults the TripAdvisor Content API via project connection to answer user questions about locations.",
tools: [createTripAdvisorTool(tripAdvisorSpec)],
});
// Send a request and stream the response
const streamResponse = await openai.responses.create(
{
input:
"Provide a quick overview of the TripAdvisor location 293919 including its name, rating, and review count.",
stream: true,
},
{
body: {
agent_reference: { name: agent.name, type: "agent_reference" },
tool_choice: "required",
},
},
);
// Process the streaming response
for await (const event of streamResponse) {
if (event.type === "response.output_text.delta") {
process.stdout.write(event.delta);
} else if (event.type === "response.output_text.done") {
console.log("\n");
}
}
// Clean up resources
await project.agents.deleteVersion(agent.name, agent.version);
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
process.exitCode = 1;
});
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:
- De TripAdvisor OpenAPI-specificatie wordt geladen vanuit een lokaal bestand.
- Er wordt verwezen naar de API-sleutelverbinding met behulp van
OPENAPI_CONNECTION_ID. - Er wordt een agent gemaakt met het TripAdvisor-hulpprogramma dat gebruikmaakt van de projectverbinding voor API-sleutelverificatie.
- Er wordt een streamingaanvraag verzonden voor locatiegegevens van TripAdvisor.
- Het dwingt het gebruik van hulpprogramma's af door
tool_choice: "required"te gebruiken om ervoor te zorgen dat de API wordt aangeroepen. - Het verwerkt en geeft het streaming-antwoord weer.
- De agent wordt opgeschoond door deze te verwijderen.
Vereiste invoer
- Omgevingsvariabelen:
FOUNDRY_PROJECT_ENDPOINT,FOUNDRY_MODEL_DEPLOYMENT_NAMEenOPENAPI_CONNECTION_ID. - Lokaal bestand:
../assets/tripadvisor_openapi.json - Project verbinding geconfigureerd met TripAdvisor-API-sleutel
Verwachte uitvoer
Location 293919: <name>, rating: <rating>, review count: <count>.
Veelvoorkomende fouten
-
Error: OpenAPI specification not found: Controleer het bestandspad. - Verbinding niet gevonden: Controleer of
OPENAPI_CONNECTION_IDde volledige resource-id van de API-sleutelverbinding is. -
AuthenticationException: Ongeldige API-key in projectverbinding. -
API-sleutel die niet is geïnjecteerd in aanvragen: uw OpenAPI-specificatie moet de juiste
securitySchemes(ondercomponents) ensecuritysecties bevatten. De sleutelnaam insecuritySchemesmoet 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/jsonenapplication/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 de beheerde identiteit van het project alleen toe aan de rollen 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.
Werk uw Beveiligingsschema's voor OpenAPI-specificaties bij. Het heeft een
securitySchemessectie en één schema van het typeapiKey. Bijvoorbeeld:"securitySchemes": { "apiKeyHeader": { "type": "apiKey", "name": "x-api-key", "in": "header" } }Meestal hoeft u alleen het
nameveld bij te werken, wat overeenkomt met de naam vankeyin de verbinding. Als de beveiligingsschema's meerdere schema's bevatten, moet u slechts één van deze schema's behouden.Werk de OpenAPI-specificatie bij zodat deze een
securitysectie bevat:"security": [ { "apiKeyHeader": [] } ]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.
Maak een verbinding om uw API-sleutel op te slaan.
Ga naar de Foundry-portal en open uw project.
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.
Voer de volgende gegevens in
sleutel:
nameveld van uw beveiligingsschema. In dit voorbeeld moet dit het geval zijnx-api-key"securitySchemes": { "apiKeyHeader": { "type": "apiKey", "name": "x-api-key", "in": "header" } }waarde: YOUR_API_KEY
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:
Werk uw OpenAPI-specificatie
securitySchemesbij omAuthorizationals de headernaam te gebruiken:"securitySchemes": { "bearerAuth": { "type": "apiKey", "name": "Authorization", "in": "header" } }Voeg een
securitysectie toe die verwijst naar het schema:"security": [ { "bearerAuth": [] } ]Maak een verbinding met aangepaste sleutels in uw Foundry-project:
- Ga naar de Foundry-portal en open uw project.
- Maak of selecteer een verbinding waarmee het geheim wordt opgeslagen. Zie Een nieuwe verbinding met uw project toevoegen.
- Voer de volgende waarden in:
-
sleutel:
Authorization(moet overeenkomen met hetnameveld in uwsecuritySchemes) -
waarde:
Bearer <token>(vervang door<token>uw werkelijke token)
-
sleutel:
Belangrijk
De waarde moet het woord
Bearerbevatten gevolgd door een spatie voor het token. Bijvoorbeeld:Bearer eyJhbGciOiJSUzI1NiIs.... Als u hetBearervoorvoegsel en de volgende ruimte weglaat, ontvangt de API een onbewerkt token zonder het vereiste autorisatieschemavoorvoegsel en mislukt de aanvraag.
- Nadat u de verbinding hebt gemaakt, gebruikt u deze met het
project_connectionverificatietype 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.
Ondersteuning voor beheerde identiteit
Voor verificatie met beheerde identiteit hebben OpenAPI-hulpprogramma's in werksetvakken altijd de beheerde identiteit van het Foundry-project vereist. Deze vereiste is van toepassing op alle abonnementen.
Voor OpenAPI-hulpprogramma's die rechtstreeks aan promptagents zijn gekoppeld, moeten abonnementen die OpenAPI-hulpprogramma's voor het eerst gebruiken, gebruikmaken van een door het project beheerde identiteit. Bestaande abonnementen ondersteunen beide identiteiten op dat pad, maar projectbeheerde identiteit wordt aanbevolen. Migreer bestaande accountconfiguraties van beheerde identiteiten zo snel mogelijk.
| pad van het OpenAPI-hulpprogramma | Subscription | Ondersteunde beheerde identiteit |
|---|---|---|
| Gereedschap bevestigd via een toolbox. | Alle abonnementen. | Alleen de beheerde identiteit van het Foundry-project, sinds werkseten zijn geïntroduceerd. Door account beheerde identiteit wordt niet ondersteund. |
| Tool dat rechtstreeks aan een prompt-agent is gekoppeld. | Nieuw abonnement op OpenAPI-hulpprogramma's. | Alleen de beheerde identiteit van het Foundry-project. Door account beheerde identiteit wordt niet ondersteund. |
| Tool dat rechtstreeks aan een prompt-agent is gekoppeld. | Bestaand abonnement waarmee al OpenAPI-hulpprogramma's zijn gebruikt. | Zowel de beheerde identiteit van het Foundry-account als de beheerde identiteit van het Foundry-project worden ondersteund. Door projecten beheerde identiteit wordt aanbevolen; migreer zo snel mogelijk weg van de beheerde identiteit van het account. |
Wijs de beheerde identiteit van het project toe aan de minst bevoegde rol waarmee de vereiste API-bewerkingen op de doelservice zijn toegestaan.
De twee identiteiten maken gebruik van verschillende verificatieconfiguraties:
-
Door project beheerde identiteit vereist een OpenAPI-verbinding in het Foundry-project met
authType: "ProjectManagedIdentity". Geef de volledige ARM-resource-id door inauth.security_scheme.project_connection_id, metauth.type: "project_connection". -
Door account beheerde identiteit, die alleen wordt ondersteund voor hulpprogramma's die rechtstreeks zijn gekoppeld aan promptagents in bestaande abonnementen, gebruikt
auth.type: "managed_identity"en geeft deaudiencevan de doelservice rechtstreeks door in de definitie van het hulpprogramma. Deze configuratie wordt niet ondersteund in toolboxen, selecteert niet de beheerde identiteit van het project en is niet de optie Beheerde identiteit van de portal.
Migreren van account naar door projecten beheerde identiteit
Deze migratiestappen zijn van toepassing op OpenAPI-hulpprogramma's die rechtstreeks aan promptagents in bestaande abonnementen zijn gekoppeld. Toolboxes vereisen al een door het project beheerde identiteit. Gebruik de door het project beheerde identiteit voor nieuwe configuraties en migreer zo snel mogelijk bestaande configuraties voor beheerde identiteit van het prompt-agent-account:
- Ken de beheerde identiteit van het Foundry-project de minst bevoorrechte rol toe die is vereist voor de doelservice. Een roltoewijzing van een door account beheerde identiteit is niet van toepassing op de identiteit van het project.
-
Maak een OpenAPI-projectverbinding met
authType: "ProjectManagedIdentity", het doeleindpunt en de audience die door de doel-API wordt verwacht. - Vervang de directe
managed_identitydoelgroepconfiguratie van het hulpprogramma doorauth.type: "project_connection". Geef de volledige ARM-resource-id van de verbinding door inauth.security_scheme.project_connection_id. - Roep het hulpprogramma aan om te controleren of de beheerde identiteit van het project toegang heeft tot de doel-API.
- Verwijder de doelserviceroltoewijzing van de accountidentiteit pas nadat u hebt bevestigd dat geen andere workload deze nodig heeft.
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 Translator van Microsoft | https://cognitiveservices.azure.com |
| Azure Logic Apps | De doelgroep die is geconfigureerd voor de Microsoft Entra ID-autorisatie voor de werkstroom. Zie Beveiligde toegang tot logische apps. |
| 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
audclaim. Deaudwaarde moet overeenkomen met de doelgroep die uw doelservice verwacht.
Verificatie van beheerde identiteit instellen
Authenticatie van door het project beheerde identiteit instellen:
- Gebruik de beheerde identiteit van het Foundry-project voor nieuwe configuraties. Zorg ervoor dat de beheerde identiteit van het project is ingeschakeld. Door account beheerde identiteit is alleen een verouderde optie voor hulpprogramma's die rechtstreeks zijn gekoppeld aan promptagenten in bestaande abonnementen; migreer deze configuraties zo snel mogelijk.
- Maak of identificeer de doelservice die door uw OpenAPI-hulpprogramma wordt aangeroepen.
- Wijs de vereiste toegang toe aan de beheerde identiteit van het Foundry-project op de doelresource.
Selecteer Access Control voor uw resource.
Selecteer Toevoegen en voeg vervolgens roltoewijzing toe boven aan het scherm.
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.
Selecteer Beheerde identiteit en selecteer vervolgens leden selecteren.
Selecteer de beheerde identiteit van het Foundry-project.
Selecteer Voltooien.
- Maak een managed identity-verbinding voor een project en geef de volledige resource-id door in de definitie van het hulpprogramma.
Een verbinding met beheerde identiteit voor een project maken
Maak de verbinding in hetzelfde Foundry-project dat de Responses-aanvraag verzendt. De verbinding slaat het doelendpoint en de audience op, niet een API-sleutel of toegangstoken.
In het volgende Bash-voorbeeld wordt Azure CLI en curl gebruikt om een OpenAPI-verbinding te maken voor Azure Translator in Foundry Tools. Meld u eerst aan met az login . Vervang de tijdelijke aanduidingen door uw abonnement, resourcegroep, Foundry-account, project en Translator-resource.
SUB="<subscription-id>"
RESOURCE_GROUP="<resource-group>"
ACCOUNT="<foundry-account-name>"
PROJECT_NAME="<foundry-project-name>"
CONNECTION_NAME="translator-project-mi"
TRANSLATOR_ENDPOINT="https://<translator-resource>.cognitiveservices.azure.com"
PROJECT="/subscriptions/$SUB/resourceGroups/$RESOURCE_GROUP"
PROJECT="$PROJECT/providers/Microsoft.CognitiveServices"
PROJECT="$PROJECT/accounts/$ACCOUNT/projects/$PROJECT_NAME"
export OPENAPI_CONNECTION_ID="$PROJECT/connections/$CONNECTION_NAME"
ARM_TOKEN="$(az account get-access-token \
--subscription "$SUB" \
--resource https://management.azure.com \
--query accessToken -o tsv)"
curl --fail-with-body --request PUT \
--url "https://management.azure.com$OPENAPI_CONNECTION_ID?api-version=2025-06-01" \
--header "Authorization: Bearer $ARM_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"properties": {
"category": "OpenAPI",
"authType": "ProjectManagedIdentity",
"target": "'"$TRANSLATOR_ENDPOINT"'/",
"audience": "https://cognitiveservices.azure.com",
"metadata": {
"type": "openapi"
}
}
}'
Referentie: Resourceschema voor Foundry-projectverbindingen.
Bewaar OPENAPI_CONNECTION_ID voor de taalvoorbeelden. Gebruik de volledige resource-id van de verbinding, niet alleen de naam van de verbinding. De audience behoort tot de verbinding; geef geen audience van een door een account beheerde identiteit door in plaats van de connection-ID.
Een OpenAPI-hulpprogramma aanroepen met een door het project beheerde identiteit
Deze voorbeelden roepen Azure Translator aan via de verbinding die u hebt gemaakt. Ze verzenden een inline OpenAPI-specificatie in een remote_tool payload naar het endpoint Responses.
Voordat u een voorbeeld uitvoert:
- Wijs aan de beheerde identiteit van het project de doelservicerol toe die is vereist voor vertaling.
- Maak de OpenAPI-verbinding met
authType: "ProjectManagedIdentity"zoals beschreven in Een verbinding met een door een project beheerde identiteit maken. - Instellen
FOUNDRY_PROJECT_ENDPOINT,FOUNDRY_MODEL_DEPLOYMENT_NAME, enOPENAPI_CONNECTION_ID. De verbinding moet deel uitmaken van dit project. - Sla de volgende specificatie op als
translator_openapi.jsonin de map waarin u het voorbeeld uitvoert. Vervang<translator-resource>door de resource die wordt gebruikt in detargetvan de verbinding.
{
"openapi": "3.0.1",
"info": {
"title": "Azure Translator Service",
"version": "1.0.0"
},
"servers": [
{
"url": "https://<translator-resource>.cognitiveservices.azure.com/translator/text/v3.0/"
}
],
"paths": {
"/translate": {
"post": {
"operationId": "Translator_Translate",
"description": "Translate text into one or more languages.",
"parameters": [
{
"name": "api-version",
"in": "query",
"required": true,
"schema": { "type": "string", "default": "3.0" }
},
{
"name": "to",
"in": "query",
"required": true,
"schema": { "type": "string" }
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": { "type": "string" }
},
"required": ["text"]
}
}
}
}
},
"responses": {
"200": {
"description": "Translation response.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"properties": {
"translations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": { "type": "string" },
"to": { "type": "string" }
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Referentie: Translator-translatebewerking.
De beller authenticeert zich bij Foundry met een Azure Identity-aanmeldingsgegeven. Foundry verzorgt de verificatie voor Translator via de projectverbinding en maakt gebruik van de beheerde identiteit van het project.
Installeer de afhankelijkheden met pip install openai azure-identity.
import json
import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import OpenAI
def main() -> None:
with open("translator_openapi.json", encoding="utf-8") as spec_file:
spec = json.load(spec_file)
tool = {
"type": "remote_tool",
"tool_arguments": [
{
"name": "openapi",
"arguments": {
"name": "language",
"description": "Azure Translator API for text translation.",
"default_params": ["api-version"],
"auth": {
"type": "project_connection",
"security_scheme": {
"project_connection_id": os.environ[
"OPENAPI_CONNECTION_ID"
],
},
},
"spec": spec,
},
}
],
}
with DefaultAzureCredential() as credential:
token_provider = get_bearer_token_provider(
credential, "https://ai.azure.com/.default"
)
with OpenAI(
base_url=(
os.environ["FOUNDRY_PROJECT_ENDPOINT"].rstrip("/")
+ "/openai/v1/"
),
api_key=token_provider,
) as client:
response = client.responses.create(
model=os.environ["FOUNDRY_MODEL_DEPLOYMENT_NAME"],
input="Translate 'Hello, how are you?' to Spanish.",
extra_body={
"tools": [tool],
"tool_choice": "required",
},
)
print(response.output_text)
if __name__ == "__main__":
main()
Referentie: Azure Identity-tokenprovider.
Het extra_body argument geeft de servicespecifieke remote_tool payload door zonder een getypt OpenAPI-hulpprogrammamodel in de OpenAI SDK te vereisen.
Gebruik .NET 8 of hoger en installeer de referentiegegevensbibliotheek met dotnet add package Azure.Identity. In dit voorbeeld wordt de servicespecifieke payload van het hulpprogramma verzonden met HttpClient.
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using Azure.Core;
using Azure.Identity;
static string RequiredEnvironmentVariable(string name) =>
Environment.GetEnvironmentVariable(name)
?? throw new InvalidOperationException($"Set {name} before running.");
string endpoint = RequiredEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
string model = RequiredEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME");
string connectionId = RequiredEnvironmentVariable("OPENAPI_CONNECTION_ID");
JsonElement spec = JsonSerializer.Deserialize<JsonElement>(
File.ReadAllText("translator_openapi.json"));
var tool = new
{
type = "remote_tool",
tool_arguments = new[]
{
new
{
name = "openapi",
arguments = new
{
name = "language",
description = "Azure Translator API for text translation.",
default_params = new[] { "api-version" },
auth = new
{
type = "project_connection",
security_scheme = new
{
project_connection_id = connectionId
}
},
spec
}
}
}
};
var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext(new[] { "https://ai.azure.com/.default" }));
using var client = new HttpClient();
using var request = new HttpRequestMessage(
HttpMethod.Post, $"{endpoint.TrimEnd('/')}/openai/v1/responses");
request.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", token.Token);
request.Content = JsonContent.Create(new
{
model,
input = "Translate 'Hello, how are you?' to Spanish.",
tools = new[] { tool },
tool_choice = "required"
});
using HttpResponseMessage response = await client.SendAsync(request);
string responseBody = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(
$"HTTP {(int)response.StatusCode}: {responseBody}");
}
Console.WriteLine(responseBody);
Referentie: DefaultAzureCredential, HttpClient.
Gebruik Node.js 20 of hoger en installeer de credentialbibliotheek met npm install @azure/identity. Sla dit JavaScript-voorbeeld op als openapi-project-mi.mjs.
import { readFile } from "node:fs/promises";
import { DefaultAzureCredential } from "@azure/identity";
function requiredEnvironmentVariable(name) {
const value = process.env[name];
if (!value) {
throw new Error(`Set ${name} before running.`);
}
return value;
}
const endpoint = requiredEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
const model = requiredEnvironmentVariable("FOUNDRY_MODEL_DEPLOYMENT_NAME");
const connectionId = requiredEnvironmentVariable("OPENAPI_CONNECTION_ID");
const spec = JSON.parse(
await readFile("translator_openapi.json", "utf8"),
);
const tool = {
type: "remote_tool",
tool_arguments: [
{
name: "openapi",
arguments: {
name: "language",
description: "Azure Translator API for text translation.",
default_params: ["api-version"],
auth: {
type: "project_connection",
security_scheme: {
project_connection_id: connectionId,
},
},
spec,
},
},
],
};
const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");
const response = await fetch(
`${endpoint.replace(/\/$/, "")}/openai/v1/responses`,
{
method: "POST",
headers: {
Authorization: `Bearer ${token.token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model,
input: "Translate 'Hello, how are you?' to Spanish.",
tools: [tool],
tool_choice: "required",
}),
},
);
const responseBody = await response.text();
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${responseBody}`);
}
console.log(responseBody);
Referentie: DefaultAzureCredential.
Gebruik Java 11 of hoger. Voeg com.azure:azure-identity en com.fasterxml.jackson.core:jackson-databind aan uw Maven-afhankelijkheden toe. In dit voorbeeld wordt de servicespecifieke payload van het hulpprogramma verzonden met de HTTP-client van Java.
import com.azure.core.credential.AccessToken;
import com.azure.core.credential.TokenRequestContext;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class OpenApiProjectMi {
private static String requiredEnvironmentVariable(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalStateException("Set " + name + " before running.");
}
return value;
}
public static void main(String[] args) throws Exception {
String endpoint = requiredEnvironmentVariable(
"FOUNDRY_PROJECT_ENDPOINT");
String model = requiredEnvironmentVariable(
"FOUNDRY_MODEL_DEPLOYMENT_NAME");
String connectionId = requiredEnvironmentVariable(
"OPENAPI_CONNECTION_ID");
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> spec = mapper.readValue(
new File("translator_openapi.json"),
new TypeReference<Map<String, Object>>() { });
Map<String, Object> tool = Map.of(
"type", "remote_tool",
"tool_arguments", List.of(Map.of(
"name", "openapi",
"arguments", Map.of(
"name", "language",
"description",
"Azure Translator API for text translation.",
"default_params", List.of("api-version"),
"auth", Map.of(
"type", "project_connection",
"security_scheme", Map.of(
"project_connection_id", connectionId)),
"spec", spec))));
Map<String, Object> body = Map.of(
"model", model,
"input", "Translate 'Hello, how are you?' to Spanish.",
"tools", List.of(tool),
"tool_choice", "required");
var credential = new DefaultAzureCredentialBuilder().build();
AccessToken token = Objects.requireNonNull(credential.getToken(
new TokenRequestContext()
.addScopes("https://ai.azure.com/.default")).block());
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(endpoint.replaceAll("/$", "")
+ "/openai/v1/responses"))
.header("Authorization", "Bearer " + token.getToken())
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(
mapper.writeValueAsString(body)))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() < 200 || response.statusCode() >= 300) {
throw new IllegalStateException(
"HTTP " + response.statusCode() + ": " + response.body());
}
System.out.println(response.body());
}
}
Referentie: DefaultAzureCredentialBuilder.
Gebruik Bash, Azure CLI, curl en jq om de aanvraag vanuit translator_openapi.jsonte bouwen. Het aanroepertoken is gericht op Foundry, niet op Azure Resource Manager of Translator.
AGENT_TOKEN="$(az account get-access-token \
--resource https://ai.azure.com \
--query accessToken -o tsv)"
jq -n \
--arg model "$FOUNDRY_MODEL_DEPLOYMENT_NAME" \
--arg connection_id "$OPENAPI_CONNECTION_ID" \
--slurpfile spec translator_openapi.json \
'{
model: $model,
input: "Translate '\''Hello, how are you?'\'' to Spanish.",
tools: [
{
type: "remote_tool",
tool_arguments: [
{
name: "openapi",
arguments: {
name: "language",
description: "Azure Translator API for text translation.",
default_params: ["api-version"],
auth: {
type: "project_connection",
security_scheme: {
project_connection_id: $connection_id
}
},
spec: $spec[0]
}
}
]
}
],
tool_choice: "required"
}' > openapi-project-mi-request.json
curl --fail-with-body --request POST \
--url "${FOUNDRY_PROJECT_ENDPOINT%/}/openai/v1/responses" \
--header "Authorization: Bearer $AGENT_TOKEN" \
--header "Content-Type: application/json" \
--data @openapi-project-mi-request.json
Naslaginformatie: Azure CLI toegangstokens.
Het antwoord bevat een Spaanse vertaling van "Hello, how are you?" In het Python-voorbeeld wordt de tekst van het antwoord afgedrukt. De HTTP-voorbeelden drukken het volledige JSON-antwoord af, inclusief de tooluitvoer en het assistentbericht.
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. |
| Authenticatie mislukt voor door het project beheerde managed identity. | Project-beheerde identiteit is niet ingeschakeld of de roltoewijzing ontbreekt. | Controleer of de beheerde identiteit van het Foundry-project is ingeschakeld en de minst bevoegde gegevenslaag- of toepassingsrol voor de bewerkingen in uw OpenAPI-specificatie voor de doelservice heeft. |
| Managed identity van Project wordt niet gebruikt. | De tool gebruikt de directe managed_identity doelgroepconfiguratie in plaats van een projectverbinding. |
Maak een OpenAPI-verbinding met authType: "ProjectManagedIdentity". Stel auth.type van het hulpprogramma in op project_connection en auth.security_scheme.project_connection_id op de volledige resource-id van de verbinding. |
| Project managed identity retourneert 401, ook al is de rol toegewezen. | De audience-URI van de verbinding komt niet overeen met wat de doelservice verwacht. | Controleer de audience-URI in de ProjectManagedIdentity verbinding aan de hand van de documentatie van de doelservice. Gebruik voor Microsoft Entra ID beveiligde API's de URI van de toepassings-id van uw app-registratie. Zie Inzicht in de doelgroep-URI. |
| Het identiteitstoken voor de door Project beheerde identiteit is geweigerd door de doel-API. | De doelgerichte service accepteert geen Microsoft Entra ID tokens. | Controleer of de doelservice ondersteuning biedt voor Microsoft Entra ID verificatie. Als dat niet werkt, gebruikt u een API-sleutel of een andere verificatiemethode die wordt ondersteund door de doelservice. |
| 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. | De verbindingsresource-id is onjuist of behoort tot een ander project. | Controleer of OPENAPI_CONNECTION_ID de volledige ARM-resource-id van de verbinding in het Foundry-project is waarmee de aanvraag wordt verzonden. |
| 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. Vereist een OpenAPI-projectverbinding met authType: "None". |
Laag |
| API-sleutel | Niet-Microsoft API's met toegang op basis van sleutels | Medium |
| Managed Identity (door project beheerde Managed Identity) | Azure-services en Microsoft Entra ID-beveiligde API's. Vereist een ProjectManagedIdentity verbinding en de vereiste doelservicerol die is toegewezen aan de beheerde identiteit van het project. |
Middelmatig Hoog |