Ansluta agenter till OpenAPI-verktyg

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. Använd anonym autentisering, API-nyckel eller projekthanterad identitetsautentisering. 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 på Foundry-projektet för att skapa en projektanslutning. Den här rollen omfattar anonyma anslutningar, API-nyckelanslutningar och hanterade identitetsanslutningar för projekt.

  • 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.

  • En grundläggande agentmiljö eller standardagentmiljö.

  • Beroenden som är installerade för önskat språk:

    • Python SDK-exempel: azure-ai-projects, azure-identityoch jsonref. I exemplet med direkta svar används openaiockså .
    • C# SDK-exempel: Azure.AI.Projects, Azure.AI.Projects.Agents, Azure.AI.Extensions.OpenAIoch Azure.Identity. I det direkta HTTP-exemplet används Azure.Identity.
    • JavaScript/TypeScript SDK-exempel: @azure/ai-projects och @azure/identity. I det direkta HTTP-exemplet används @azure/identity.
    • Java HTTP-exempel: com.azure:azure-identity och com.fasterxml.jackson.core:jackson-databind.
  • OpenAPI 3.0- eller 3.1-specifikationsfil som uppfyller dessa krav:

    • Varje funktion måste ha en operationId (krävs för OpenAPI-verktyget).
    • operationId få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
  • För projekthanterad identitetsautentisering: en OpenAPI-projektanslutning med authType: "ProjectManagedIdentity" och den minst privilegierade måltjänstrollen som tilldelats projektets hanterade identitet. Ange anslutningens fullständiga resurs-ID till verktyget. Se Skapa en projekthanterad identitetsanslutning.

  • För API-nyckel-/tokenautentisering: en projektanslutning som konfigurerats med din API-nyckel eller token. Se Lägga till en ny anslutning till projektet.

  • För anonym autentisering: en OpenAPI-projektanslutning med authType: "None". Se Skapa en anonym OpenAPI-anslutning.

Miljövariabler

Variabel Beskrivning
FOUNDRY_PROJECT_ENDPOINT Endpointen för Foundry-projektet, till exempel https://<account>.services.ai.azure.com/api/projects/<project>. Använd inte den externa API-slutpunkten.
FOUNDRY_MODEL_DEPLOYMENT_NAME Namn på din driftsatta modell.
OPENAPI_CONNECTION_ID Det fullständiga ARM-resurs-ID:t för OpenAPI-anslutningen för den valda autentiseringsmetoden.
TOOLBOX_CONNECTION_ID För exempel som bifogar en verktygslåda via en projektanslutning anger du det fullständiga resurs-ID:t för den separata anslutningen till verktygslådans MCP-slutpunkt.

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

I det Java-exemplet i den här artikeln används Javas HTTP-klient och Azure Identity för att skicka samma Responses-payload som de andra språken. Det kräver inte typade OpenAPI-verktygsmodeller.

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. Skapa en OpenAPI-projektanslutning även för anonym autentisering och skicka dess fullständiga resurs-ID till verktyget. Anonym autentisering kräver ingen extern API-autentiseringsuppgift. Se Skapa en anonym OpenAPI-anslutning.

  1. Installera SDK-paketet för ditt valda språk från Krav.
  2. Ladda ned weather_openapi.json, och spara filen på sökvägen assets som exemplet använder.
  3. Ange slutpunkts- och modelldistributionsvärden för Foundry-projektet.
  4. Skapa en anonym OpenAPI-anslutning för https://wttr.in och ange OPENAPI_CONNECTION_ID till dess fullständiga resurs-ID.
  5. Kör det anonyma exemplet i det valda språkavsnittet.
  6. 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, bearer-token-autentisering och projekthanterad identitetsautentisering som separata varianter.

Förstå begränsningar

  • OpenAPI-specifikationen måste inkludera operationId för varje åtgärd och operationId kan 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.

Konfigurera OpenAPI-autentisering i Foundry-portalen

När du lägger till ett OpenAPI-verktyg via Verktyg>Anpassad>OpenAPI skapa en projektanslutning för verktyget. Anonym, API-nyckel och hanterad identitetsautentisering kräver alla en anslutning, oavsett om du konfigurerar verktyget via portalen, SDK eller REST API.

Portalens alternativ för hanterad identitet använder Foundry-projektets hanterade identitet, inte Foundry-kontots hanterade identitet. OpenAPI-verktyg i verktygslådor har alltid krävt projekthanterad identitet, oavsett prenumerationshistorik. Kontohanterad hanterad identitet stöds endast för OpenAPI-verktyg som är kopplade direkt till promptagenter i befintliga prenumerationer. Migrera dessa konfigurationer till projekthanterad identitetstjänst så snart som möjligt. Se Stöd för hanterad identitet.

Anonym autentisering innebär att mål-API:et inte kräver autentiseringsuppgifter. Det betyder inte att du kan hoppa över att skapa anslutningen.

Authentication Anslutningskonfiguration
Anonym Skapa en OpenAPI-projektanslutning utan autentisering (authType: "None"). Ingen API-nyckel eller token krävs.
API-nyckel Skapa en projektanslutning som lagrar API-nyckeln. Matcha nyckelnamnet mot header- eller frågeparametern i OpenAPI-säkerhetsschemat. Se Autentisera med API-nyckel.
Hanterad identitet (projekthanterad identitet) Skapa en OpenAPI-projektanslutning med authType: "ProjectManagedIdentity", mål-API-slutpunkten och audience som förväntas av API:et. Tilldela projektets hanterade identitet den roll som krävs på måltjänsten. Det här alternativet använder inte kontots hanterade identitet.

Konfigurera anonym autentisering

  1. Öppna Verktyg>Anpassat>OpenAPI i ditt Foundry-projekt.
  2. I Skapa ett OpenAPI-verktyg anger du verktygets namn och beskrivning.
  3. Ställ in Autentiseringsmetod på Anonym.
  4. Under Anslutning väljer du en befintlig anonym anslutning eller väljer Skapa en ny anslutning för att skapa en.
  5. Ange OpenAPI 3.0+-schemat och välj Skapa verktyg.

Fältet Anslutning krävs även när Anonym är valt.

Skärmbild av anonym OpenAPI-autentisering med ett obligatoriskt anslutningsfält och knappen Skapa en ny anslutning.

Konfigurera hanterad identitetsautentisering

Alternativet Hanterad identitet kräver projektets hanterade identitet. En befintlig rolltilldelning för kontots hanterade identitet ger inte åtkomst till projektets hanterade identitet.

  1. I Skapa ett OpenAPI-verktyg ställer du in Autentiseringsmetod på Hanterad identitet.
  2. Under Anslutning väljer du en befintlig projekthanterad identitetsanslutning eller väljer Skapa en ny anslutning.
  3. I Skapa OpenAPI-anslutning anger du ett anslutningsnamn och ställer in Autentiseringstyp på Hanterad identitet.
  4. Ange mål-URL:en för API:et och den Audience som API:et förväntar sig. Audience är inte endpointen för Foundry-projektet.
  5. Välj Skapa anslutning och välj den anslutningen i verktygets Anslutning-fält.
  6. Ange verktygets Namn, Beskrivning och OpenAPI 3.0+-schema och välj Skapa verktyg.

Tilldela projektets hanterade identitet den roll som krävs på måltjänsten innan verktyget anropas.

Skärmbild av dialogrutan Skapa OpenAPI-anslutning som visar obligatoriskt anslutningsnamn, autentiseringstyp, mål-URL och målgruppsfält för hanterad identitet.

Information om hur du konfigurerar en projekthanterad identitetsanslutning via REST finns i Skapa en projekthanterad identitetsanslutning. När du använder den anslutningen i koden skickar du dess fullständiga resurs-ID med auth.type: "project_connection".

SDK- och REST-exemplen refererar också till en projektanslutning. Skapa anslutningen innan du kör dem.

Skapa en anonym OpenAPI-anslutning

Använd portalstegen i föregående avsnitt eller kör följande Bash-kommandon med Azure CLI och curl när du har loggat in med az login. Ersätt platshållarna med din Foundry-projektinformation. Den här anslutningen använder authType: "None" eftersom väder-API:et inte kräver autentiseringsuppgifter.

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

Referens: Resursschema för foundry-projektanslutning.

Skicka in OPENAPI_CONNECTION_ID i verktygets auth.security_scheme.project_connection_id, med auth.type: "project_connection". Anslutningens authType innebär att mål-API:et anropas anonymt.

Lägga till OpenAPI-verktyg i en verktygslåda

Använd det här mönstret för att exponera ett REST API som beskrivs av en OpenAPI-specifikation. För anonym, API-nyckel eller projekthanterad identitetsautentisering ställer du in verktygets auth.type till project_connection. Anslutningens authType avgör hur Foundry autentiserar till mål-API:et.

För hanterad identitetsautentisering kräver verktygslådor hanterad identitet för projekt. Kontoadministrerad identitet stöds inte i verktygslådor, inklusive för befintliga prenumerationer.

Följande kodfragment visar verktygskonfiguration, inte fullständiga program. Ersätt varje tomt spec objekt med din OpenAPI-specifikation. Använd de fullständiga språkexemplen i följande avsnitt för att skapa toolboxen.

Viktigt

När du använder hanterad identitetsautentisering tilldelar du Foundry-projektets hanterade identitet den minst privilegierade RBAC-rollen som tillåter nödvändiga API-åtgärder 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:

Skapa en OpenAPI-anslutning med authType: "None" först och ersätt <OPENAPI_CONNECTION_ID> med dess fullständiga resurs-ID.

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

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": {},
        "auth": {
          "type": "project_connection",
          "security_scheme": {
            "project_connection_id": "<OPENAPI_CONNECTION_ID>"
          }
        }
      }
    }
  ]
}

Projektets hanterade identitetsautentisering:

Skapa en OpenAPI-projektanslutning med authType: "ProjectManagedIdentity"och skicka dess fullständiga resurs-ID med auth.type: "project_connection". Använd inte den direkta målgruppskonfigurationen managed_identity i en verktygslåda.

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

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. Skapa även en anslutning för anonym autentisering.

Steg 1. Skapa autentiseringsanslutningen

För anonym autentisering, följ Skapa en anonym OpenAPI-anslutning. Använd följande kommando för API-nyckelautentisering:

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

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

Behåll anslutningsbaserad autentisering för anonyma API:er. Om du till exempel vill använda den väderanslutning som skapades tidigare ersätter du exempelspecifikationen med weather_openapi.json och använder det här auth: blocket:

      auth:
        type: connection_auth
        connection_id: weather-anonymous

Steg 3. Skapa verktygslådan

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

Innan du kör kodexemplen

  • Skapa OpenAPI-projektanslutningen innan du kör något exempel, inklusive anonyma exempel. För väderexemplen använder du en anonym anslutning som pekar på https://wttr.in och anger OPENAPI_CONNECTION_ID till dess fullständiga ARM-resurs-ID.
  • Ladda ned den underhållna specifikationen tripadvisor_openapi.json och spara den i sökvägen assets som 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 .
  • Använd det fullständiga anslutningsresurs-ID:t: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>/connections/<connection>.

Viktigt

För att API-nyckelautentisering ska fungera måste openAPI-specifikationsfilen innehålla:

  1. Ett securitySchemes avsnitt med din API-nyckelkonfiguration, till exempel rubriknamn och parameternamn.
  2. Ett security avsnitt som refererar till säkerhetsschemat.
  3. 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,
    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)

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:

  1. Den läser in OpenAPI-specifikationen för väder från en lokal JSON-fil.
  2. Skapar en promptagent med väderverktyget konfigurerat för anonym åtkomst.
  3. Skickar en fråga om Seattles väder.
  4. Agenten använder OpenAPI-verktyget för att anropa väder-API:et och returnerar formaterade resultat.
  5. 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.15.0" "azure-ai-projects>=2.3.0,<2.8.0" 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,
    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())

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

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:

  1. Den läser väder OpenAPI-specifikationen från en lokal JSON-fil.
  2. Skapar en agent med väderverktyget konfigurerat.
  3. Skickar en begäran som frågar om Seattles väder med hjälp av OpenAPI-verktyget.
  4. Agenten anropar väder-API:et och returnerar resultatet.
  5. Rensar genom att ta bort agenten.

Obligatoriska indata

  • Miljövariabler: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEoch OPENAPI_CONNECTION_ID.
  • 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 (i components) och security avsnitt med matchande schemanamn

Hostade agenter

Det här exemplet skapar OpenAPI-verktygslådan med Azure AI Projects SDK och använder sedan integreringen med Microsoft Agent Framework AddFoundryToolboxes. Använd ett ASP.NET Core projekt med Azure.AI.AgentServer.Responses och Microsoft.Agents.AI.Foundry.Hosting, utöver C#-beroendena i Krav. Ange FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEoch OPENAPI_CONNECTION_IDoch logga in med 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();

Förväntade utdata

Exemplet startar en HTTP-server. När du skickar en Responses-begäran som frågar om vädret anropar agenten API:et via verktygslådan och returnerar de aktuella väderförhållandena:

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 kopplar du ett autentiserat OpenAPI-verktyg direkt till en promptagent. Du använder TripAdvisor-specifikationen och en API-nyckel som lagras i en projektanslutning.

TripAdvisor-tjänsten kräver API-nyckelautentisering. Skapa projektanslutningen enligt beskrivningen i Autentisera med API-nyckeln och ange OPENAPI_CONNECTION_ID till dess fullständiga resurs-ID. Anslutningens nyckelnamn måste matcha TripAdvisor-specifikationen.

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

Vad den här koden gör

I det här C#-exemplet används ett OpenAPI-verktyg med API-nyckelautentisering via en projektanslutning. När du kör koden:

  1. Den läser in TripAdvisor OpenAPI-specifikationen från en lokal fil.
  2. Den refererar till TripAdvisor-projektanslutningen som innehåller din API-nyckel.
  3. Det bifogar TripAdvisor-verktyget till agenten, som konfigurerats för att använda anslutningen för autentisering.
  4. Skickar en begäran om hotellrekommendationer i Paris.
  5. Agenten anropar TripAdvisor-API:et med hjälp av din lagrade API-nyckel och returnerar resultat.
  6. Rensar genom att ta bort agenten.

Obligatoriska indata

  • Miljövariabler: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEoch OPENAPI_CONNECTION_ID.
  • Lokal fil: Assets/tripadvisor_openapi.json
  • Projektanslutning: tripadvisor med 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 namnet tripadvisor hittades.
  • AuthenticationException: Ogiltig API-nyckel i projektanslutningen eller saknade/felaktiga securitySchemes konfigurationer 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 securitySchemes och security konfigurerade 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?

  1. Skapa en verktygslåda som innehåller OpenAPI-väderverktyget:
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" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

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.

  1. 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
  1. Skapa ett svar som använder verktygslådan genom att koppla den som ett MCP-verktyg.

    Ställ in TOOLBOX_CONNECTION_ID till det fullständiga resurs-ID:t för openapi-toolbox-conn. Den här anslutningen är separat från den anonyma OpenAPI-anslutningen i OPENAPI_CONNECTION_ID. Ersätt <version> med den version som returnerades när du skapade verktygslådan.

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

Använd endast den här varianten när det anonyma flödet har lyckats. Ladda ned tripadvisor_openapi.json från Innan du kör kodexemplen. Konfigurera API-nyckelanslutningen och specifikationens securitySchemes och security poster enligt beskrivningen i Autentisera med API-nyckel. Ställ in OPENAPI_CONNECTION_ID på det fullständiga resurs-ID:t för den anslutningen, inte den anonyma väderanslutningen.

I det här Bash-exemplet används jq för att inkludera specifikationen i samma remote_tool begärandeformat som exemplen på projekthanterade identiteter.

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

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

För projekthanterad identitet, skapa först en OpenAPI-projektanslutning. Ange sedan hela resurs-ID:t i Responses-begäran. Se REST-exemplet i Anropa ett OpenAPI-verktyg med projekthanterad identitet.

Kontohanterad hanterad identitet stöds endast för OpenAPI-verktyg som är kopplade direkt till promptagenter i befintliga prenumerationer. Det stöds inte i verktygspaneler. Använd hanterad identitet för projekt även för promptagenter. Migrera befintliga konfigurationer så snart som möjligt.

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:

  1. För anonym autentisering skapar du en verktygslåda som innehåller OpenAPI-verktygsdefinitionen och väder-API-specifikationen.
  2. Skapar ett svar som bifogar verktygslådan som ett MCP-verktyg och frågar om Seattles väder.
  3. Visar ytterligare en direkt REST-verktygsdefinition för API-nyckelautentisering via en projektanslutning.
  4. Agenten anropar api:et som valts av verktygskonfigurationen och returnerar resultatet.

Obligatoriska indata

  • Miljövariabler: FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • För anonym autentisering: OPENAPI_CONNECTION_ID, refererar till den anonyma OpenAPI-projektanslutningen, och TOOLBOX_CONNECTION_ID, refererar till verktygslådans MCP-anslutning.
  • För API-nyckelautentisering: OPENAPI_CONNECTION_ID, som refererar till TripAdvisor API-nyckelanslutningen, och tripadvisor_openapi.json.
  • För autentisering med hanterad identitet för projekt: OPENAPI_CONNECTION_ID, enligt exemplet på hanterad identitet för projekt.
  • Infogad OpenAPI-specifikation i begärandetexten.

Förväntade utdata

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

Vanliga fel

  • 401 Unauthorized: Ogiltig eller saknas AGENT_TOKEN, eller API-nyckeln har inte matats in eftersom securitySchemes och security saknas 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.securitySchemes avsnittet 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,
  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;
});

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:

  1. Den läser in OpenAPI-specifikationen för väder från en lokal JSON-fil.
  2. Skapar en verktygslåda som innehåller väderverktyget.
  3. 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.
  4. Bearbetar strömningssvaret och visar deltan när de tas emot.
  5. Det tvingar verktygsanvändningen att använda tool_choice: "required" för att säkerställa att API:et anropas.
  6. Rensar genom att ta bort agenten.

Obligatoriska indata

  • Miljövariabler: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAME, OPENAPI_CONNECTION_IDoch TOOLBOX_CONNECTION_ID.
  • Lokal fil: assets/weather_openapi.json (OpenAPI-specifikation).

Förväntade utdata

Creating a toolbox with the OpenAPI weather tool...
The weather in Seattle is <conditions>. Consider wearing <suggestion>.

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 securitySchemes och security ä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";

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

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:

  1. Den läser in TripAdvisor OpenAPI-specifikationen från en lokal fil.
  2. Den refererar till API-nyckelanslutningen med hjälp av OPENAPI_CONNECTION_ID.
  3. Den skapar en agent med TripAdvisor-verktyget som använder projektanslutningen för API-nyckelautentisering.
  4. Den skickar en streamingförfrågan för TripAdvisor-platsdetaljer.
  5. Det tvingar verktygsanvändningen att använda tool_choice: "required" för att säkerställa att API:et anropas.
  6. Den bearbetar och visar strömningssvaret.
  7. Den rensar genom att ta bort agenten.

Obligatoriska indata

  • Miljövariabler: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEoch OPENAPI_CONNECTION_ID.
  • Lokal fil: ../assets/tripadvisor_openapi.json
  • Projektanslutning konfigurerad med TripAdvisor API-nyckel

Förväntade utdata

Location 293919: <name>, rating: <rating>, review count: <count>.

Vanliga fel

  • Error: OpenAPI specification not found: Kontrollera filsökvägen.
  • Anslutningen hittades inte: Kontrollera att OPENAPI_CONNECTION_ID är det fullständiga resurs-ID:t för API-nyckelanslutningen.
  • AuthenticationException: Ogiltig API-nyckel i projektanslutningen.
  • API-nyckeln matas inte in i begäranden: OpenAPI-specifikationen måste innehålla rätt securitySchemes (under components) och security avsnitt. Nyckelnamnet i securitySchemes må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/json och application/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. Tilldela projektets hanterade identitet endast de roller som måltjänsten kräver.

Innan du lägger till ett OpenAPI-verktyg granskar du OpenAPI-specifikationen, inklusive beskrivningar av API, operationer och parametrar samt de operationer som den exponerar. Den här informationen kan ingå i kontexten som skickas till modellen och påverka hur din agent väljer verktyg och skapar begäranden.

Behandla beskrivningar som tillhandahålls av leverantören som ej betrodda indata. Anslut endast till betrodda API-leverantörer, granska specifikationsändringar och framtvinga behörigheter och godkännandekrav oberoende av modellgenererade beslut.

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.

  1. Uppdatera säkerhetsscheman för OpenAPI-specifikationen. Den har ett securitySchemes avsnitt och ett schema av typen apiKey. Till exempel:

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

    Du behöver vanligtvis bara uppdatera fältet name , vilket motsvarar namnet key på i anslutningen. Om säkerhetsschemana innehåller flera scheman behåller du bara ett av dem.

  2. Uppdatera OpenAPI-specifikationen så att den innehåller ett security avsnitt:

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. 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.

  4. Skapa en anslutning för att lagra din API-nyckel.

  5. Gå till Foundry-portalen och öppna projektet.

  6. 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.

  7. Ange följande information

    • nyckel: name fältet i ditt säkerhetsschema. I det här exemplet bör det vara x-api-key

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

  8. 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:

  1. Uppdatera OpenAPI-specifikationen securitySchemes så att den används Authorization som rubriknamn:

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Lägg till ett security avsnitt som refererar till schemat:

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Skapa en anslutning för anpassade nycklar i ditt Foundry-projekt:

    1. Gå till Foundry-portalen och öppna projektet.
    2. Skapa eller välj en anslutning som lagrar hemligheten. Se Lägga till en ny anslutning till projektet.
    3. Ange följande värden:
      • nyckel: Authorization (måste matcha fältet name i din securitySchemes)
      • värde: Bearer <token> (ersätt <token> med din faktiska token)

    Viktigt

Värdet måste innehålla ordet Bearer följt av ett mellanslag före tecknet. Till exempel: Bearer eyJhbGciOiJSUzI1NiIs.... Om du utelämnar prefixet Bearer och följande blanksteg tar API:et emot en råtoken utan det nödvändiga auktoriseringsschemaprefixet och begäran misslyckas.

  1. När du har skapat anslutningen använder du den med project_connection autentiseringstyp 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.

Stöd för hanterad identitet

För hanterad identitetsautentisering har OpenAPI-verktyg i verktygslådor alltid krävt Foundry-projektets hanterade identitet. Det här kravet gäller för alla prenumerationer.

För OpenAPI-verktyg som är kopplade direkt till promptagenter måste prenumerationer som är nya för OpenAPI-verktyg använda projekthanterad identitet. Befintliga prenumerationer stöder båda identiteterna på den sökvägen, men projekthanterad hanterad identitet rekommenderas. Migrera befintliga konfigurationer för kontohanterad identitet så snart som möjligt.

OpenAPI-verktygssökväg Subscription Identitet med hantering som stöds
Verktyg som är anslutet via en verktygspanel. Alla prenumerationer. Endast Foundry project managed identity, eftersom verktygslådor introducerades. kontohanterad identitet stöds inte.
Verktyg som är direkt kopplat till en prompt agent. Ny prenumeration på OpenAPI-verktyg. Endast Foundry-projekthanterad identitet. kontohanterad identitet stöds inte.
Verktyg som är direkt kopplat till en prompt agent. Befintlig prenumeration som redan har använt OpenAPI-verktyg. Både Foundry-kontots hanterade identitet och Foundry-projektets hanterade identitet stöds. Projekthanterad identitet rekommenderas. Migrera från kontoadministrerad identitet så snart som möjligt.

Tilldela projektets hanterade identitet den minst privilegierade roll som tillåter nödvändiga API-åtgärder på måltjänsten.

De två identiteterna använder olika autentiseringskonfigurationer:

  • Projekthanterad identitet kräver en OpenAPI-anslutning i Foundry-projektet med authType: "ProjectManagedIdentity". Ange anslutningens fullständiga ARM-resurs-ID i auth.security_scheme.project_connection_id, med auth.type: "project_connection".
  • Kontohanterad identitet, som endast stöds för verktyg som är kopplade direkt till promptagenter i befintliga prenumerationer, använder auth.type: "managed_identity" och skickar måltjänstens audience direkt i verktygsdefinitionen. Den här konfigurationen stöds inte i Toolboxes, väljer inte projektets hanterade identitet och är inte alternativet Hanterad identitet i portalen.

Migrera från konto till hanterad identitet för projekt

De här migreringsstegen gäller för OpenAPI-verktyg som är kopplade direkt till promptagenter i befintliga prenumerationer. Verktygslådor kräver redan hanterad identitet för projekt. Använd projekthanterad managed identity för nya konfigurationer och migrera befintliga konfigurationer för prompt-agent-kontots managed identity så snart som möjligt:

  1. Tilldela Foundry-projektets hanterade identitet den minst privilegierade roll som krävs för måltjänsten. En rolltilldelning för kontohanterad hanterad identitet gäller inte för projektets identitet.
  2. Skapa en OpenAPI-projektanslutning med authType: "ProjectManagedIdentity", målslutpunkt och audience-värdet som förväntas av mål-API:et.
  3. Ersätt verktygets direkta managed_identity målgruppskonfiguration med auth.type: "project_connection". Skicka anslutningens fullständiga ARM-resurs-ID i auth.security_scheme.project_connection_id.
  4. Anropa verktyget för att kontrollera att projektets hanterade identitet kan komma åt mål-API:et.
  5. Ta bort kontoidentitetens måltjänstrolltilldelning först när du har bekräftat att ingen annan arbetsbelastning behöver den.

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 Translator (översättare) https://cognitiveservices.azure.com
Azure Logic Apps Målgruppen har konfigurerats för arbetsflödets Microsoft Entra ID-auktorisering. Se Säker åtkomst till logikappar.
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ärdet aud måste matcha målgruppen som måltjänsten förväntar sig.

Konfigurera hanterad identitetsautentisering

Så här konfigurerar du autentisering med projekthanterad hanterad identitet:

  1. Använd Foundry-projektets hanterade identitet för nya konfigurationer. Se till att projektets hanterade identitet är aktiverad. kontohanterad identitet är bara ett äldre alternativ för verktyg som är kopplade direkt till promptagenter i befintliga prenumerationer. migrera dessa konfigurationer så snart som möjligt.
  2. Skapa eller identifiera den måltjänst som ditt OpenAPI-verktyg anropar.
  3. Tilldela nödvändig åtkomst till Foundry-projektets hanterade identitet för målresursen.
    1. Välj Access Control för resursen.

    2. Välj Lägg till och lägg sedan till rolltilldelning överst på skärmen.

      Skärmbild av Azure-portalen som visar åtgärden Lägg till rolltilldelning.

    3. 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.

    4. Välj Hanterad identitet och välj sedan medlemmar.

    5. Välj Foundry-projektets hanterade identitet.

    6. Välj Slutför.

  4. Skapa en anslutning för projekthanterad identitet och skicka dess fullständiga resurs-ID i verktygsdefinitionen.

Skapa en anslutning för hanterad identitet för projekt

Skapa anslutningen i samma Foundry-projekt som skickar Responses-begäran. Anslutningen lagrar målslutpunkten och målgruppen, inte en API-nyckel eller åtkomsttoken.

I följande Bash-exempel används Azure CLI och curl för att skapa en OpenAPI-anslutning för Azure Translator i Foundry Tools. Logga in med az login först. Ersätt platshållarna med din prenumeration, resursgrupp, Foundry-konto, projekt och Translator-resurs.

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

Referens: Resursschema för foundry-projektanslutning.

Behåll OPENAPI_CONNECTION_ID för språkexemplen. Använd det fullständiga anslutningsresurs-ID:t, inte bara anslutningsnamnet. Målgruppen hör hemma i anslutningen. Skicka inte en målgrupp för kontohanterad identitet i stället för anslutnings-ID:t.

Anropa ett OpenAPI-verktyg med projekthanterad identitet

De här exemplen anropar Azure Translator via den anslutning som du skapade. De skickar en infogad OpenAPI-specifikation i en remote_tool nyttolast till Responses-slutpunkten.

Innan du kör ett exempel:

  • Tilldela projektets hanterade identitet den måltjänstroll som krävs för översättning.
  • Skapa OpenAPI-anslutningen med authType: "ProjectManagedIdentity" enligt beskrivningen i Skapa en projekthanterad identitetskoppling.
  • Ange FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEoch OPENAPI_CONNECTION_ID. Anslutningen måste tillhöra det här projektet.
  • Spara följande specifikation som translator_openapi.json i katalogen där du kör exemplet. Ersätt <translator-resource> med resursen som används i anslutningens target.
{
  "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" }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Referens: Translator-översättningsåtgärd.

Anroparen autentiserar till Foundry med autentiseringsuppgifter för Azure Identity. Foundry fastställer autentisering mot Translator från projektanslutningen och använder projektets hanterade identitet.

Installera beroendena med 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()

Referens: Azure Identity-tokenprovider.

Argumentet extra_body vidarebefordrar den tjänstspecifika remote_tool nyttolasten utan att det krävs någon typ av OpenAPI-verktygsmodell i OpenAI SDK.

Använd .NET 8 eller senare och installera biblioteket för autentiseringsuppgifter med dotnet add package Azure.Identity. I det här exemplet skickas nyttolasten för det tjänstspecifika verktyget med 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);

Referens: DefaultAzureCredential, HttpClient.

Använd Node.js 20 eller senare och installera inloggningsbiblioteket med npm install @azure/identity. Spara det här JavaScript-exemplet som 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);

Referens: DefaultAzureCredential.

Använd Java 11 eller senare. Lägg till com.azure:azure-identity och com.fasterxml.jackson.core:jackson-databind till dina Maven-beroenden. I det här exemplet skickas nyttolasten för det tjänstspecifika verktyget med Java HTTP-klienten.

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

Referens: DefaultAzureCredentialBuilder.

Använd Bash, Azure CLI, curl och jq för att skapa begäran från translator_openapi.json. Anropartoken riktar sig mot Foundry, inte Azure Resource Manager eller 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

Referens: Azure CLI åtkomsttoken.

Svaret innehåller en spansk översättning av "Hola, ¿cómo estás?" Det Python-exemplet skriver ut svarets text. HTTP-exemplen skriver ut det fullständiga JSON-svaret, inklusive verktygets utdata och assistentmeddelande.

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 projekthanterad hanterad identitet. Projects hanterade identitet är inte aktiverad eller så saknas dess rolltilldelning. Kontrollera att Foundry-projektets hanterade identitet är aktiverad och har måltjänstens minst privilegierade dataplan eller programroll för åtgärderna i din OpenAPI-specifikation.
Projekthanterad identitet används inte. Verktyget använder den direkta managed_identity målgruppskonfigurationen i stället för en projektanslutning. Skapa en OpenAPI-anslutning med authType: "ProjectManagedIdentity". Ställ in verktygets auth.type på project_connection och auth.security_scheme.project_connection_id på det fullständiga anslutningsresurs-ID:t.
Projekthanterad identitet returnerar 401 trots att rollen har tilldelats. Anslutningens målgrupps-URI matchar inte vad måltjänsten förväntar sig. Verifiera målgruppens URI i ProjectManagedIdentity anslutningen mot måltjänstens dokumentation. För Microsoft Entra ID-skyddade API:er använder du program-ID-URI:n från din appregistrering. Se Förstå målgruppens URI.
Projektets hanterade identitetstoken avvisades 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 en API-nyckel eller en annan autentiseringsmetod som stöds av måltjänsten.
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. Anslutningsresurs-ID är felaktigt eller tillhör ett annat projekt. Kontrollera att OPENAPI_CONNECTION_ID är det fullständiga ARM-resurs-ID:t för anslutningen i Foundry-projektet som skickar begäran.
Ä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. Kräver en OpenAPI-projektanslutning med authType: "None". Låg
API-nyckel Api:er som inte Microsoft med nyckelbaserad åtkomst Medel
Hanterad identitet (projekthanterad identitet) Azure tjänster och Microsoft Entra ID-skyddade API:er. Kräver en ProjectManagedIdentity anslutning och den nödvändiga måltjänstrollen som tilldelats projektets hanterade identitet. Medelhög