Connettere gli agenti agli strumenti OpenAPI

Connettete gli agenti Foundry Microsoft alle API esterne utilizzando le specifiche OpenAPI 3.0 e 3.1. Il modello Foundry che alimenta l'agente può chiamare servizi esterni, recuperare dati in tempo reale ed estendere le funzionalità oltre le funzioni predefinite.

Le specifiche OpenAPI definiscono un modo standard per descrivere le API HTTP, in modo da poter integrare i servizi esistenti con gli agenti. Usare l'autenticazione anonima, con chiave API o con identità gestita dal progetto. Per informazioni sulla scelta di un metodo di autenticazione, vedere Scegliere un metodo di autenticazione.

Suggerimento

Prendere in considerazione l'aggiunta di questo strumento usando una casella degli strumenti. Usando una casella degli strumenti, è possibile riutilizzare lo strumento tra agenti e runtime, nonché centralizzare la gestione delle credenziali, il controllo delle versioni e l'imposizione dei criteri tramite un endpoint MCP gestito. Consulta la guida introduttiva di Toolbox.

Prerequisiti

Prima di iniziare, assicurarsi di avere:

  • Una sottoscrizione Azure con le autorizzazioni appropriate.

  • ruolo Foundry User nel progetto Foundry per creare ed eseguire agenti.

    Importante

    I ruoli di Controllo degli accessi in base al ruolo di Foundry sono stati recentemente rinominati. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager erano precedentemente denominati Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. È possibile che i nomi precedenti vengano visualizzati in alcune posizioni durante l'esecuzione della ridenominazione. Gli ID ruolo e le autorizzazioni di base sono invariati dalla ridenominazione.

  • Foundry Project Manager nel progetto Foundry per creare una connessione al progetto. Questo ruolo include connessioni anonime, con chiave API e con identità gestita del progetto.

  • Progetto Foundry creato con un endpoint configurato.

  • Un modello di intelligenza artificiale distribuito nel progetto. Verificare che sia il modello che l'area del progetto supportino gli strumenti OpenAPI nel supporto degli strumenti in base all'area e al modello.

  • Un ambiente agente di base o standard.

  • Dipendenze installate per la lingua preferita:

    • Python SDK esempi: azure-ai-projects, azure-identitye jsonref. Anche l'esempio di risposte dirette usa openai.
    • Esempi di SDK C#: Azure.AI.Projects, Azure.AI.Projects.Agents, Azure.AI.Extensions.OpenAIe Azure.Identity. L'esempio HTTP diretto usa Azure.Identity.
    • Esempi di JavaScript/TypeScript SDK: @azure/ai-projects e @azure/identity. L'esempio HTTP diretto usa @azure/identity.
    • Java esempio HTTP: com.azure:azure-identity e com.fasterxml.jackson.core:jackson-databind.
  • File di specifica OpenAPI 3.0 o 3.1 che soddisfa questi requisiti:

    • Ogni funzione deve avere un oggetto operationId (obbligatorio per lo strumento OpenAPI).
    • operationId deve contenere solo lettere, -e _.
    • Usare nomi descrittivi per consentire ai modelli di decidere in modo efficiente quale funzione usare.
    • Tipi di contenuto del corpo della richiesta supportati: application/json, application/json-patch+json
  • Per l'autenticazione dell'identità gestita del progetto: una connessione di progetto OpenAPI con authType: "ProjectManagedIdentity" e il ruolo del servizio di destinazione con privilegi minimi assegnato all'identità gestita del progetto. Passare l'ID risorsa completo della connessione allo strumento. Vedi Creare una connessione di identità gestita per il progetto.

  • Per l'autenticazione con chiave API/token: una connessione di progetto configurata con la chiave API o il token. Vedere Aggiungere una nuova connessione al progetto.

  • Per l'autenticazione anonima: una connessione di progetto OpenAPI con authType: "None". Vedere Creare una connessione OpenAPI anonima.

Variabili di ambiente

Variabile Descrizione
FOUNDRY_PROJECT_ENDPOINT Endpoint del progetto Foundry, ad esempio https://<account>.services.ai.azure.com/api/projects/<project>. Non usare l'endpoint API esterno.
FOUNDRY_MODEL_DEPLOYMENT_NAME Nome del modello distribuito.
OPENAPI_CONNECTION_ID ID risorsa ARM completo della connessione OpenAPI per il metodo di autenticazione selezionato.
TOOLBOX_CONNECTION_ID Per esempi che collegano una casella degli strumenti tramite una connessione di progetto, specificare l'ID risorsa completo di tale connessione separata all'endpoint MCP della casella degli strumenti.

Nota

Il valore FOUNDRY_PROJECT_ENDPOINT fa riferimento all'endpoint del progetto foundry Microsoft, non all'endpoint del servizio OpenAPI esterno. È possibile trovare questo endpoint nel portale di Microsoft Foundry nella pagina Panoramica del progetto. Questo endpoint è necessario per autenticare il servizio agente ed è separato da qualsiasi endpoint OpenAPI definito nel file di specifica.

Supporto per l'utilizzo

La tabella seguente illustra il supporto dell'SDK e della configurazione.

Supporto Foundry di Microsoft PYTHON SDK SDK di C# JavaScript SDK JAVA SDK REST API Configurazione dell'agente di base Configurazione dell'agente standard
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Nota

L'esempio Java in questo articolo usa il client HTTP di Java e l'identità Azure per inviare lo stesso payload delle risposte degli altri linguaggi. Non richiede modelli di strumenti OpenAPI tipizzati.

Esegui il flusso anonimo del primo successo

Iniziare con l'API meteo anonima per verificare che l'agente possa caricare una specifica OpenAPI e chiamare un'operazione. Crea una connessione al progetto OpenAPI anche per l'autenticazione anonima e passa il relativo ID risorsa completo allo strumento. L'autenticazione anonima non richiede credenziali API esterne. Vedere Creare una connessione OpenAPI anonima.

  1. Installare il pacchetto SDK per la lingua selezionata da Prerequisiti.
  2. Scaricare weather_openapi.jsone salvarlo nel assets percorso usato dall'esempio.
  3. Impostare i valori dell'endpoint del progetto Foundry e della distribuzione del modello.
  4. Creare una connessione OpenAPI anonima per https://wttr.in e impostare su OPENAPI_CONNECTION_ID l'ID risorsa completo.
  5. Eseguire l'esempio anonimo nella sezione della lingua selezionata.
  6. Conferma che la risposta contenga le condizioni meteo attuali per Seattle, quindi elimina la versione dell'agente creata dall'esempio.

Al termine della chiamata anonima, configurare l'autenticazione richiesta dall'API di destinazione. Mantenere l'autenticazione della chiave API, l'autenticazione bearer-token e l'autenticazione dell'identità gestita del progetto come varianti separate.

Informazioni sulle limitazioni

  • La specifica OpenAPI deve includere operationId per ogni operazione, e operationId può includere solo lettere, -, e _.
  • Tipi di contenuto del corpo della richiesta supportati: application/json, application/json-patch+json.
  • Per l'autenticazione con chiave API, usare uno schema di sicurezza della chiave API per ogni strumento OpenAPI. Se sono necessari più schemi di sicurezza, creare più strumenti OpenAPI.
  • Ruotate regolarmente le chiavi API e i token bearer e fatelo immediatamente dopo una sospetta compromissione. Aggiornare la connessione al progetto quando le credenziali cambiano; non inserire le credenziali nella specifica OpenAPI o nel codice sorgente.

Configurare l'autenticazione OpenAPI nel portale foundry

Quando si aggiunge uno strumento OpenAPI tramite Strumenti>Personalizzati>, creare una connessione di progetto per lo strumento. Anonimo, della chiave API e dell'identità gestita richiedono una connessione, indipendentemente dal fatto che lo strumento sia configurato tramite il portale, l'SDK o l'API REST.

L'opzione Identità gestita del portale usa l'identità gestita del progetto Foundry, non l'identità gestita dell'account Foundry. Gli strumenti OpenAPI nelle toolbox hanno sempre richiesto l'identità gestita del progetto, indipendentemente dalla cronologia delle sottoscrizioni. L'identità gestita dell'account è supportata solo per gli strumenti OpenAPI associati direttamente agli agenti prompt nelle sottoscrizioni esistenti. Eseguire la migrazione di tali configurazioni all'identità gestita del progetto il prima possibile. Vedere Supporto delle identità gestite.

L'autenticazione anonima indica che l'API di destinazione non richiede credenziali. Non significa che è possibile ignorare la creazione della connessione.

Autenticazione Configurazione della connessione
Anonimo Creare una connessione al progetto OpenAPI senza autenticazione (authType: "None"). Non è necessaria alcuna chiave API o token.
Chiave API Crea una connessione di progetto che archivia la chiave API. Trovare la corrispondenza tra il nome della chiave e il parametro di intestazione o query nello schema di sicurezza OpenAPI. Vedere Eseguire l'autenticazione con la chiave API.
Identità gestita (identità gestita del progetto) Creare una connessione di progetto OpenAPI con authType: "ProjectManagedIdentity", l'endpoint API di destinazione e l'audience prevista da tale API. Assegnare all'identità gestita del progetto il ruolo richiesto nel servizio di destinazione. Questa opzione non usa l'identità gestita dell'account.

Configurare l'autenticazione anonima

  1. Aprire Strumenti>Personalizzato> nel progetto Foundry.
  2. In Crea uno strumento OpenAPI immettere il nome e la descrizione dello strumento.
  3. Impostare Metodo di autenticazione su Anonimo.
  4. In Connessione selezionare una connessione anonima esistente o selezionare Crea una nuova connessione per crearne una nuova.
  5. Immettere lo schema OpenAPI 3.0+ e selezionare Crea uno strumento.

Il campo Connessione è obbligatorio anche quando è selezionata l'opzione Anonima .

Schermata dell'autenticazione OpenAPI anonima con un campo Connessione obbligatorio e un pulsante Crea una nuova connessione.

Configurare l'autenticazione dell'identità gestita

L'opzione Identità gestita richiede l'identità gestita del progetto. Un'assegnazione di ruolo esistente per l'identità gestita dell'account non concede l'accesso all'identità gestita del progetto.

  1. In Creare uno strumento OpenAPI impostare Metodo di autenticazione su Identità gestita.
  2. In Connessione selezionare una connessione dell'identità gestita del progetto esistente o selezionare Crea una nuova connessione.
  3. In Crea connessione OpenAPI immettere un nome di connessione e impostare Tipo di autenticazione su Identità gestita.
  4. Immettere l'URL di destinazione per l'API e l'audience prevista dall'API. L'audience non è l'endpoint del progetto Foundry.
  5. Selezionare Crea connessione e selezionare tale connessione nel campo Connessione dello strumento.
  6. Immettere Nome, Descrizione e lo schema OpenAPI 3.0+ dello strumento e selezionare Crea strumento.

Assegnare all'identità gestita del progetto il ruolo necessario sul servizio di destinazione prima di chiamare lo strumento.

Screenshot della finestra di dialogo Crea connessione OpenAPI che mostra i campi Nome connessione, Tipo di autenticazione, URL di destinazione e Destinatario per l'identità gestita.

Per la configurazione della connessione identità gestita dal progetto tramite REST, vedere Creare una connessione identità gestita del progetto. Quando si usa tale connessione nel codice, passare il relativo ID risorsa completo con auth.type: "project_connection".

Gli esempi sdk e REST fanno riferimento anche a una connessione di progetto. Creare la connessione prima di eseguirle.

Creare una connessione OpenAPI anonima

Usare i passaggi del portale nella sezione precedente oppure eseguire i comandi Bash seguenti con interfaccia della riga di comando di Azure e curl dopo l'accesso con az login. Sostituire i segnaposto con i dettagli del progetto Foundry. Questa connessione viene authType: "None" usata perché l'API meteo non richiede credenziali.

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

Riferimento: schema della risorsa di connessione del progetto Foundry.

Passa OPENAPI_CONNECTION_ID nel auth.security_scheme.project_connection_id dello strumento, con auth.type: "project_connection". La authTypeconnessione determina che l'API di destinazione viene chiamata in modo anonimo.

Aggiungere strumenti OpenAPI a una casella degli strumenti

Usare questo modello per esporre un'API REST descritta da una specifica OpenAPI. Per l'autenticazione anonima, con chiave API o con identità gestita del progetto, impostare auth.type dello strumento su project_connection. La authType proprietà della connessione determina il modo in cui Foundry esegue l'autenticazione all'API di destinazione.

Per l'autenticazione dell'identità gestita, le toolbox richiedono l'identità gestita del progetto. L'identità gestita dell'account non è supportata nei toolbox, anche per le sottoscrizioni esistenti.

I frammenti di codice seguenti mostrano la configurazione dello strumento, non i programmi completi. Sostituire ogni oggetto vuoto spec con la specifica OpenAPI. Per la creazione della toolbox, usare gli esempi linguistici completi nelle sezioni seguenti.

Importante

Quando si usa l'autenticazione dell'identità gestita, assegnare all'identità gestita del progetto Foundry il ruolo RBAC con privilegi minimi che consenta le operazioni API necessarie nel servizio di destinazione. Ad esempio, assegnare Lettore sulla risorsa Azure di destinazione solo quando l'API richiede l'accesso in sola lettura ad Azure Resource Manager. Senza l'assegnazione richiesta, l'agente riceve una 401 Unauthorized risposta quando si chiama l'API. Per la procedura di configurazione completa, vedere Eseguire l'autenticazione usando l'identità gestita.

Autenticazione anonima:

Creare una connessione OpenAPI con authType: "None" prima e sostituire <OPENAPI_CONNECTION_ID> con il relativo ID risorsa completo.

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

Autenticazione connessione progetto:

Usare questo modello quando l'API richiede una chiave o un token archiviato in una connessione di progetto Foundry.

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

Autenticazione dell'identità gestita del progetto:

Creare una connessione al progetto OpenAPI con authType: "ProjectManagedIdentity"e passare il relativo ID risorsa completo con auth.type: "project_connection". Non usare la configurazione diretta del pubblico managed_identity in una toolbox.

{
  "description": "REST API with project managed identity auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": {},
        "auth": {
          "type": "project_connection",
          "security_scheme": {
            "project_connection_id": "<OPENAPI_CONNECTION_ID>"
          }
        }
      }
    }
  ]
}
import os
from azure.ai.projects.models import (
    OpenApiFunctionDefinition,
    OpenApiProjectConnectionAuthDetails,
    OpenApiProjectConnectionSecurityScheme,
    OpenApiToolboxTool,
)

tools = [
    OpenApiToolboxTool(
        openapi=OpenApiFunctionDefinition(
            name="my-api",
            spec={},
            auth=OpenApiProjectConnectionAuthDetails(
                security_scheme=OpenApiProjectConnectionSecurityScheme(
                    project_connection_id=os.environ["OPENAPI_CONNECTION_ID"]
                )
            ),
        )
    )
]
using System;
using Azure.AI.Extensions.OpenAI;
using Azure.AI.Projects.Agents;

BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
OpenApiToolboxTool tool = new(
    new OpenApiFunctionDefinition(
        name: "my-api",
        specification: specBytes,
        authentication: new OpenApiProjectConnectionAuthenticationDetails(
            new OpenApiProjectConnectionSecurityScheme(
                Environment.GetEnvironmentVariable("OPENAPI_CONNECTION_ID")
                ?? throw new InvalidOperationException(
                    "Set OPENAPI_CONNECTION_ID before running.")))
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
    name: "my-toolbox",
    tools: [tool],
    description: "REST API via OpenAPI spec"
);
const connectionId = process.env.OPENAPI_CONNECTION_ID;
if (!connectionId) {
  throw new Error("Set OPENAPI_CONNECTION_ID before running.");
}

const tools = [
  {
    type: "openapi",
    openapi: {
      name: "my-api",
      spec: { /* paste OpenAPI spec object here */ },
      auth: {
        type: "project_connection",
        security_scheme: {
          project_connection_id: connectionId,
        },
      },
    },
  },
];

Creare una casella degli strumenti OpenAPI con l'interfaccia della riga di comando per sviluppatori Azure

Gli strumenti OpenAPI incorporano la specifica direttamente in tools:. L'autenticazione basata sulla connessione (connection_auth) fa riferimento a una connessione di progetto. Creare anche una connessione per l'autenticazione anonima.

Passaggio 1: Crea la connessione auth

Per l'autenticazione anonima, seguire Creare una connessione OpenAPI anonima. Per l'autenticazione della chiave API, usare il comando seguente:

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

Per l'elenco completo dei azd ai connection create flag, consulta Autenticazione e configurazione di Toolbox MCP.

Passaggio 2: Definire la casella degli strumenti

La specifica OpenAPI è in linea sotto 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

Per le API anonime, mantenere l'autenticazione basata sulla connessione. Ad esempio, per usare la connessione meteo creata in precedenza, sostituire la specifica di esempio con weather_openapi.json e usare questo auth: blocco:

      auth:
        type: connection_auth
        connection_id: weather-anonymous

Passaggio 3. Creare la casella degli strumenti

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

Prima di eseguire gli esempi di codice

  • Creare la connessione al progetto OpenAPI prima di eseguire qualsiasi esempio, inclusi esempi anonimi. Per i sample meteo, usare una connessione anonima destinata a https://wttr.in, e impostare OPENAPI_CONNECTION_ID sull'ID risorsa ARM completo.
  • Scaricare la specifica mantenuta tripadvisor_openapi.json e salvarla nel percorso assets usato dall'esempio di linguaggio.

Nota

  • È necessario il pacchetto SDK più recente. L'SDK di .NET è attualmente in anteprima. Per informazioni dettagliate, vedere la guida introduttiva .
  • Usare l'ID della risorsa di connessione completa: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>/connections/<connection>.

Importante

Per il corretto funzionamento dell'autenticazione della chiave API, il file di specifica OpenAPI deve includere:

  1. Sezione securitySchemes con la configurazione della chiave API, ad esempio il nome dell'intestazione e il nome del parametro.
  2. Sezione security che fa riferimento allo schema di sicurezza.
  3. Connessione di progetto configurata con il nome e il valore della chiave corrispondenti.

Senza queste configurazioni, la chiave API non è inclusa nelle richieste. Per istruzioni dettagliate sulla configurazione, vedere la sezione Eseguire l'autenticazione con la chiave API .

È anche possibile usare l'autenticazione basata su token, ad esempio un token di tipo Bearer, memorizzando il token in una connessione di progetto. Per l'autenticazione del token Bearer, creare una connessione con chiavi personalizzate con la chiave impostata su Authorization e il valore impostato su Bearer <token> (sostituire <token> con il token effettivo). La parola Bearer seguita da uno spazio deve essere inclusa nel valore . Per informazioni dettagliate, vedere Configurare una connessione token Bearer.

Esempio di uso degli agenti con lo strumento OpenAPI

Questo esempio illustra come usare i servizi descritti da una specifica OpenAPI usando un agente. Usa il servizio wttr.in per ottenere meteo e il relativo file di specifica weather_openapi.json. Selezionare Prompt Agents per usare Azure AI Projects SDK per creare un agente prompt sul lato server o Hosted Agents per usare Microsoft Agent Framework per creare un agente temporaneo e in-process.

Agenti rapidi

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)

Questo esempio crea un agente prompt con uno strumento OpenAPI che chiama l'API meteo wttr.in usando l'autenticazione anonima. Lo strumento è collegato direttamente alla definizione dell'agente. Quando si esegue il codice:

  1. Carica la specifica OpenAPI per il meteo da un file JSON locale.
  2. Crea un agente di prompt con lo strumento meteo configurato per l'accesso anonimo.
  3. Invia una query che chiede informazioni sul meteo di Seattle.
  4. L'agente usa lo strumento OpenAPI per chiamare l'API meteo e restituisce risultati formattati.
  5. Pulisce eliminando la versione dell'agente.

Agenti ospitati

Questo esempio usa FoundryChatClient del Microsoft Agent Framework e si connette all'endpoint MCP della toolbox tramite FoundryToolbox. Installare le versioni dei pacchetti compatibili con pip install "agent-framework-foundry==1.10.4" "azure-ai-projects>=2.3.0,<2.4.0" jsonref, impostare la FOUNDRY_PROJECT_ENDPOINT variabile di ambiente e accedere con az login. OpenApiToolboxTool è il modello specifico della casella degli strumenti; utilizzare OpenApiTool solo quando si collega lo strumento direttamente a un agente prompt.

import asyncio
import os
import jsonref
from typing import Any, cast

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox
from azure.identity import AzureCliCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    OpenApiToolboxTool,
    OpenApiFunctionDefinition,
    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())

Output previsto

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

Esempio di uso degli agenti con lo strumento OpenAPI

Questo esempio illustra come usare i servizi descritti da una specifica OpenAPI usando un agente. Usa il servizio wttr.in per ottenere meteo e il relativo file di specifica weather_openapi.json. Selezionare Prompt Agents per usare Azure AI Projects SDK per creare un agente prompt sul lato server o Hosted Agents per usare Microsoft Agent Framework per creare un agente temporaneo e in-process.

Agenti rapidi

Questo esempio usa metodi sincroni della libreria client di Azure AI Projects. Per un esempio che usa metodi asincroni, vedere sample nel Azure SDK per .NET repository in 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);
    }
}

Che cosa fa questo codice

Questo esempio C# crea un agente con uno strumento OpenAPI che recupera le informazioni meteo da wttr.in usando l'autenticazione anonima. Quando si esegue il codice:

  1. Legge la specifica OpenAPI del meteo da un file JSON locale.
  2. Crea un agente con lo strumento meteo configurato.
  3. Invia una richiesta che chiede informazioni sul meteo di Seattle usando lo strumento OpenAPI.
  4. L'agente chiama l'API meteo e restituisce i risultati.
  5. Pulisce eliminando l'agente.

Input necessari

  • Variabili di ambiente: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEe OPENAPI_CONNECTION_ID.
  • File locale: Assets/weather_openapi.json (specifica OpenAPI)

Output previsto

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

Errori comuni

  • FileNotFoundException: file di specifica OpenAPI non trovato nella cartella Assets
  • UnauthorizedAccessException: credenziali non valide o autorizzazioni di controllo degli accessi basato sui ruoli insufficienti
  • Chiave API non inserita: verificare che la specifica OpenAPI includa sia securitySchemes che le sezioni components e security con nomi di schemi corrispondenti

Agenti ospitati

Questo esempio crea la toolbox OpenAPI con Azure AI Projects SDK e quindi usa l'integrazione di Microsoft Agent Framework AddFoundryToolboxes. Usare un progetto ASP.NET Core con Azure.AI.AgentServer.Responses e Microsoft.Agents.AI.Foundry.Hosting, oltre alle dipendenze C# in Prerequisiti. Impostare FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEe OPENAPI_CONNECTION_IDe accedere con 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();

Output previsto

L'esempio avvia un server HTTP. Quando si invia una richiesta Responses in merito al meteo, l'agente chiama l'API tramite il toolbox e restituisce le condizioni correnti:

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

Per l'esempio completo, inclusi i modelli api autenticati, vedere Agent_Step17_OpenAPITools.


Esempio di uso degli agenti con lo strumento OpenAPI nel servizio Web, che richiede l'autenticazione

In questo esempio si collega uno strumento OpenAPI autenticato direttamente a un agente prompt. Si usa la specifica TripAdvisor e una chiave API archiviata in una connessione di progetto.

Il servizio TripAdvisor richiede l'autenticazione con chiave API. Creare la connessione al progetto come descritto in Eseguire l'autenticazione con la chiave API e impostare OPENAPI_CONNECTION_ID sull'ID risorsa completo. Il nome della chiave della connessione deve corrispondere alla specifica TripAdvisor.

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

Che cosa fa questo codice

Questo esempio C# usa uno strumento OpenAPI con l'autenticazione della chiave API tramite una connessione di progetto. Quando si esegue il codice:

  1. Carica la specifica OpenAPI di TripAdvisor da un file locale.
  2. Fa riferimento alla connessione del progetto TripAdvisor contenente la chiave API.
  3. Associa lo strumento TripAdvisor all'agente, configurato per l'uso della connessione per l'autenticazione.
  4. Invia una richiesta di consigli per gli hotel a Parigi.
  5. L'agente chiama l'API TripAdvisor usando la chiave API archiviata e restituisce i risultati.
  6. Pulisce eliminando l'agente.

Input necessari

  • Variabili di ambiente: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEe OPENAPI_CONNECTION_ID.
  • File locale: Assets/tripadvisor_openapi.json
  • connessione Project: tripadvisor con chiave API valida configurata

Output previsto

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

Errori comuni

  • ConnectionNotFoundException: nessuna connessione di progetto denominata tripadvisor trovata.
  • AuthenticationException: chiave API non valida nella connessione al progetto o configurazione mancante/errata securitySchemes nella specifica OpenAPI.
  • Strumento non usato: verificare che ToolChoice = ResponseToolChoice.CreateRequiredChoice() imponga l'uso dello strumento.
  • Chiave API non passata all'API: assicurarsi che la specifica OpenAPI abbia configurate correttamente le sezioni securitySchemes e security.

Creare un agente Java con le funzionalità degli strumenti OpenAPI

Questa Java configurazione può fare riferimento agli strumenti MCP, ma Java SDK non espone ancora un'API di creazione della casella degli strumenti.

Suggerimento

Consigliato: Per la maggior parte degli agenti, aggiungere lo strumento OpenAPI tramite una casella degli strumenti e allegare la casella degli strumenti all'agente come strumento MCP. Creare la casella degli strumenti usando l'esempio Python, l'API REST, C# o TypeScript o il portale Foundry e quindi fare riferimento al relativo endpoint MCP dall'agente Java come McpTool.

Gli esempi seguenti illustrano come chiamare uno strumento OpenAPI usando l'API REST.

Ottenere un token di accesso:

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

Autenticazione anonima

Aggiungere strumenti OpenAPI tramite una casella degli strumenti e quindi collegare la casella degli strumenti all'agente come strumento MCP. Per altre informazioni, vedere Che cos'è una casella degli strumenti?

  1. Creare una casella degli strumenti contenente lo strumento meteo OpenAPI:
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" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

La casella degli strumenti espone un endpoint compatibile con MCP in $FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1, dove <version> è la versione restituita dalla chiamata precedente.

  1. Creare una connessione al progetto strumento remoto che punti all'endpoint della casella degli strumenti, usando un token Entra dell'utente in modo che l'identità del chiamante venga trasmessa (audience https://ai.azure.com).
azd ai connection create openapi-toolbox-conn \
  --kind remote-tool \
  --target "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/openapi-toolbox/versions/<version>/mcp?api-version=v1" \
  --auth-type user-entra-token \
  --audience https://ai.azure.com
  1. Creare una risposta che usa la casella degli strumenti collegandola come strumento MCP.

    Impostare TOOLBOX_CONNECTION_ID sull'ID risorsa completo di openapi-toolbox-conn. Questa connessione è separata dalla connessione OpenAPI anonima in OPENAPI_CONNECTION_ID. Sostituire <version> con la versione restituita al momento della creazione della toolbox.

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

Autenticazione della chiave API (connessione di progetto)

Usare questa variante solo dopo che il flusso anonimo ha esito positivo. Scarica tripadvisor_openapi.json da Prima di eseguire gli esempi di codice. Configurare la connessione della chiave API e le voci security e securitySchemes della specifica come descritto in Eseguire l'autenticazione con la chiave API. Impostare OPENAPI_CONNECTION_ID sull'ID risorsa completo di tale connessione, non sulla connessione meteo anonima.

Questo esempio di Bash usa jq per includere la specifica nella stessa remote_tool struttura della richiesta degli esempi di identità gestita del progetto.

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

Per un'API con token bearer, mantieni la stessa project_connection struttura della richiesta, ma utilizza una connessione configurata come descritto in Configurare una connessione con token bearer. Il valore di connessione deve iniziare con Bearer seguito da uno spazio.

Autenticazione dell'identità gestita

Per l'identità gestita del progetto, crea prima di tutto una connessione del progetto OpenAPI. Passare quindi l'ID risorsa completo nella richiesta Responses. Vedere l'esempio REST in Chiamare uno strumento OpenAPI con l'identità gestita del progetto.

L'identità gestita dell'account è supportata solo per gli strumenti OpenAPI collegati direttamente agli agenti di prompt nelle sottoscrizioni esistenti. Non è supportato nelle toolbox. Usare anche l'identità gestita del progetto per gli agenti prompt. Eseguire la migrazione delle configurazioni esistenti il prima possibile.

Che cosa fa questo codice

Questo esempio di API REST illustra come chiamare uno strumento OpenAPI con metodi di autenticazione diversi. La richiesta:

  1. Per l'autenticazione anonima, crea una casella degli strumenti contenente la definizione dello strumento OpenAPI e la specifica dell'API meteo.
  2. Crea una risposta che collega la casella degli strumenti come strumento MCP e chiede informazioni sul meteo di Seattle.
  3. Mostra una definizione aggiuntiva dello strumento REST diretto per l'autenticazione della chiave API tramite una connessione di progetto.
  4. Agent chiama l'API selezionata dalla configurazione dello strumento e restituisce i risultati.

Input necessari

  • Variabili di ambiente: FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • Per l'autenticazione anonima: OPENAPI_CONNECTION_ID, facendo riferimento alla connessione anonima al progetto OpenAPI e TOOLBOX_CONNECTION_ID facendo riferimento alla connessione MCP della toolbox.
  • Per l'autenticazione della chiave API: OPENAPI_CONNECTION_ID, facendo riferimento alla connessione della chiave API di TripAdvisor e tripadvisor_openapi.json.
  • Per l'autenticazione dell'identità gestita del progetto: OPENAPI_CONNECTION_ID, come illustrato nell'esempio di identità gestita del progetto.
  • Specifica OpenAPI inline nel corpo della richiesta.

Output previsto

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

Errori comuni

  • 401 Unauthorized: chiave API non valida o mancante, o AGENT_TOKEN non inserita perché securitySchemes e security sono mancanti nella specifica OpenAPI
  • 404 Not Found: nome di distribuzione dell'endpoint o del modello non corretto
  • 400 Bad Request: specifica OpenAPI non valida o configurazione dell'autenticazione non valida
  • Chiave API non inviata con richiesta: verificare che la components.securitySchemes sezione nella specifica OpenAPI sia configurata correttamente (non vuota) e corrisponda al nome della chiave di connessione del progetto

Creare un agente con le funzionalità degli strumenti OpenAPI

L'esempio di codice TypeScript seguente illustra come creare un agente di intelligenza artificiale con funzionalità degli strumenti OpenAPI aggiungendo lo strumento OpenAPI a una casella degli strumenti e collegando la casella degli strumenti come strumento MCP. L'agente può chiamare API esterne definite dalle specifiche OpenAPI. Per una versione JavaScript di questo esempio, vedere sample nel repository Azure SDK per JavaScript in 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;
});

Che cosa fa questo codice

Questo esempio TypeScript crea un agente con uno strumento OpenAPI per i dati meteo usando l'autenticazione anonima. Quando si esegue il codice:

  1. Carica la specifica OpenAPI per il meteo da un file JSON locale.
  2. Crea una versione della casella degli strumenti contenente lo strumento meteo.
  3. Collega la toolbox all'agente come strumento MCP, quindi invia una richiesta in streaming in cui chiede informazioni sul meteo di Seattle e su come vestirsi.
  4. Elabora la risposta di streaming e visualizza i delta non appena arrivano.
  5. Forza l'utilizzo degli strumenti usando tool_choice: "required" per assicurarsi che venga chiamata l'API.
  6. Pulisce eliminando l'agente.

Input necessari

  • Variabili di ambiente: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAME, OPENAPI_CONNECTION_IDe TOOLBOX_CONNECTION_ID.
  • File locale: assets/weather_openapi.json (specifica OpenAPI).

Output previsto

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

Errori comuni

  • Error: OpenAPI specification not found: percorso del file non corretto o file mancante
  • AuthenticationError: credenziali di Azure non valide
  • Chiave API non funzionante: se si passa dall'autenticazione anonima alla chiave API, verificare che la specifica OpenAPI sia securitySchemes configurata e security configurata correttamente

Creare un agente che usa gli strumenti OpenAPI autenticati con una connessione al progetto

L'esempio di codice TypeScript seguente illustra come creare un agente di intelligenza artificiale che usa gli strumenti OpenAPI autenticati tramite una connessione al progetto. L'agente carica la specifica OpenAPI di TripAdvisor dagli asset locali e può richiamare l'API tramite la connessione al progetto configurata. Per una versione JavaScript di questo esempio, vedere sample nel repository Azure SDK per JavaScript in 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;
});

Che cosa fa questo codice

Questo esempio di TypeScript illustra l'uso di uno strumento OpenAPI con l'autenticazione della chiave API tramite una connessione di progetto. Quando si esegue il codice:

  1. Carica la specifica OpenAPI di TripAdvisor da un file locale.
  2. Fa riferimento alla connessione della chiave API usando OPENAPI_CONNECTION_ID.
  3. Crea un agente con lo strumento TripAdvisor che usa la connessione di progetto per l'autenticazione della chiave API.
  4. Invia una richiesta streaming per i dettagli della posizione di TripAdvisor.
  5. Forza l'utilizzo degli strumenti usando tool_choice: "required" per assicurarsi che venga chiamata l'API.
  6. Elabora e visualizza la risposta di streaming.
  7. Esegue la pulizia eliminando l'agente.

Input necessari

  • Variabili di ambiente: FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEe OPENAPI_CONNECTION_ID.
  • File locale: ../assets/tripadvisor_openapi.json
  • Connessione del progetto configurata con la chiave API di TripAdvisor

Output previsto

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

Errori comuni

  • Error: OpenAPI specification not found: controllare il percorso del file.
  • Connessione non trovata: verificare che OPENAPI_CONNECTION_ID sia l'ID risorsa completo della connessione della chiave API.
  • AuthenticationException: chiave API non valida nella connessione al progetto.
  • Chiave API non inserita nelle richieste: la specifica OpenAPI deve includere sezioni securitySchemes appropriate (sotto components) e security. Il nome della chiave in securitySchemes deve corrispondere alla chiave nella connessione al progetto.
  • Content type is not supported: attualmente sono supportati solo questi due tipi di contenuto del corpo della richiesta: application/json e application/json-patch+json. I tipi di contenuto della risposta non sono limitati.

Considerazioni sulla sicurezza e i dati

Quando si connette un agente a uno strumento OpenAPI, l'agente può inviare parametri di richiesta derivati dall'input dell'utente all'API di destinazione.

  • Usare le connessioni di progetto per i segreti (chiavi API e token). Evitare di inserire segreti in un file di specifiche OpenAPI o in un codice sorgente.
  • Esaminare i dati ricevuti dall'API e gli elementi restituiti prima di usare lo strumento nell'ambiente di produzione.
  • Usare l'accesso con privilegi minimi. Assegnare all'identità gestita del progetto solo i ruoli richiesti dal servizio di destinazione.

Eseguire l'autenticazione con la chiave API

Usare questa variante per un'API che prevede una chiave in un'intestazione o un parametro di query. È possibile usare un solo schema di sicurezza della chiave API per ogni strumento OpenAPI. Se l'API richiede più schemi di sicurezza, creare più strumenti OpenAPI.

  1. Aggiornare gli schemi di sicurezza delle specifiche OpenAPI. Ha una securitySchemes sezione e uno schema di tipo apiKey. Per esempio:

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

    In genere è sufficiente aggiornare il name campo, che corrisponde al nome di key nella connessione. Se gli schemi di sicurezza includono più schemi, mantenerli solo uno di essi.

  2. Aggiornare la specifica OpenAPI per includere una security sezione:

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. Rimuovere qualsiasi parametro nella specifica OpenAPI che richiede la chiave API, perché la chiave API viene archiviata e passata tramite una connessione, come descritto più avanti in questo articolo.

  4. Creare una connessione per archiviare la chiave API.

  5. Passare al portale Foundry e aprire il progetto.

  6. Creare o selezionare una connessione in cui è archiviato il segreto. Vedere Aggiungere una nuova connessione al progetto.

    Nota

    Se si rigenera la chiave API in un secondo momento, è necessario aggiornare la connessione con la nuova chiave.

  7. Immettere le informazioni seguenti

    • key: name campo del tuo schema di sicurezza. In questo esempio deve essere x-api-key

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

  8. Dopo aver creato una connessione, è possibile usarla tramite l'SDK o l'API REST. Usare le schede nella parte superiore di questo articolo per visualizzare esempi di codice.

Configurare una connessione Bearer Token

Usare questa variante per un'API che prevede un token di connessione nell'intestazione Authorization . Usa lo stesso project_connection tipo di autenticazione dell'autenticazione con chiave API, ma lo schema di sicurezza OpenAPI e i valori di connessione differiscono.

La specifica OpenAPI sarà simile alla seguente:

  BearerAuth:
    type: http
    scheme: bearer
    bearerFormat: JWT

È necessario:

  1. Aggiorna la specifica OpenAPI securitySchemes per usare Authorization come nome dell'intestazione:

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Aggiungere una security sezione che fa riferimento allo schema:

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Creare una connessione chiavi personalizzate nel progetto Foundry:

    1. Passare al portale Foundry e aprire il progetto.
    2. Creare o selezionare una connessione in cui è archiviato il segreto. Vedere Aggiungere una nuova connessione al progetto.
    3. Immettere i valori seguenti:
      • key: Authorization (deve corrispondere al name campo nel tuo securitySchemes)
      • value: Bearer <token> (sostituire <token> con il token effettivo)

    Importante

Il valore deve includere la parola Bearer seguita da uno spazio prima del token. Ad esempio: Bearer eyJhbGciOiJSUzI1NiIs.... Se si omette il Bearer prefisso e lo spazio seguente, l'API riceve un token non elaborato senza il prefisso dello schema di autorizzazione richiesto e la richiesta ha esito negativo.

  1. Dopo aver creato la connessione, usarla con il project_connection tipo di autenticazione nel codice, allo stesso modo per l'autenticazione della chiave API. L'ID connessione usa lo stesso formato: /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Eseguire l'autenticazione usando l'identità gestita (Microsoft Entra ID)

Microsoft Entra ID è un servizio di gestione delle identità e degli accessi basato sul cloud che i dipendenti possono usare per accedere alle risorse esterne. Usando Microsoft Entra ID, è possibile aggiungere sicurezza aggiuntiva alle API senza dover usare le chiavi API. Quando si configura l'autenticazione tramite identità gestita, l'agente esegue l'autenticazione tramite lo strumento Foundry utilizzato.

Importante

L'autenticazione dell'identità gestita funziona solo quando il servizio di destinazione accetta token Microsoft Entra ID. Se l'API di destinazione usa uno schema di autenticazione personalizzato che non supporta Microsoft Entra ID, si utilizza in alternativa l'autenticazione con chiave API o token Bearer.

Supporto delle identità gestite

Per l'autenticazione dell'identità gestita, gli strumenti OpenAPI nelle cassette degli strumenti hanno sempre richiesto l'identità gestita del progetto Foundry. Questo requisito si applica a tutte le sottoscrizioni.

Per gli strumenti OpenAPI collegati direttamente agli agenti prompt, le sottoscrizioni nuove agli strumenti OpenAPI devono usare l'identità gestita del progetto. Le sottoscrizioni esistenti supportano entrambe le identità in tale percorso, ma è consigliabile usare l'identità gestita assegnata al progetto. Eseguire la migrazione delle configurazioni dell'identità gestita dell'account esistenti il prima possibile.

Percorso del tool OpenAPI Abbonamento Identità gestita supportata
Strumento collegato tramite la toolbox. Tutti gli abbonamenti. Solo l'identità gestita del progetto Foundry, poiché sono state introdotte le cassette degli strumenti. L'account con identità gestita non è supportato.
Strumento collegato direttamente a un agente prompt. Nuovo abbonamento agli strumenti OpenAPI. Solo l'identità gestita del progetto Foundry. L’identità gestita dell’account non è supportata.
Strumento collegato direttamente a un agente prompt. Sottoscrizione esistente che ha già usato gli strumenti OpenAPI. L'identità gestita dell'account Foundry e l'identità gestita del progetto Foundry. L'identità gestita del progetto è consigliata. Eseguire la migrazione dall'identità gestita dell'account il prima possibile.

Assegnare all'identità gestita del progetto il ruolo con privilegi minimi che consente le operazioni API necessarie nel servizio di destinazione.

Le due identità usano configurazioni di autenticazione diverse:

  • Identità gestita del progetto richiede una connessione OpenAPI nel project Foundry con authType: "ProjectManagedIdentity". Passare l'ID risorsa ARM completo della connessione in auth.security_scheme.project_connection_id, con auth.type: "project_connection".
  • Identità gestita dell'account, supportata solo per gli strumenti collegati direttamente agli agenti prompt nelle sottoscrizioni esistenti, usa auth.type: "managed_identity" e passa direttamente il audience del servizio di destinazione nella definizione dello strumento. Questa configurazione non è supportata nelle toolbox, non seleziona l'identità gestita del progetto e non è l'opzione Identità gestita del portale.

Eseguire la migrazione dall'identità gestita dell'account a quella del progetto

Questi passaggi di migrazione si applicano agli strumenti OpenAPI collegati direttamente agli agenti prompt nelle sottoscrizioni esistenti. I Toolbox richiedono già l'identità gestita del progetto. Usare l'identità gestita del progetto per le nuove configurazioni ed eseguire la migrazione delle configurazioni di identità gestite dell'account prompt-agent appena possibile:

  1. Assegnare all'identità gestita del progetto Foundry il ruolo con privilegi minimi necessari sul servizio di destinazione. Un'assegnazione di ruolo dell'identità gestita dell'account non si applica all'identità del progetto.
  2. Creare una connessione di progetto OpenAPI con authType: "ProjectManagedIdentity", l'endpoint di destinazione e l'audience prevista dall'API di destinazione.
  3. Sostituire la configurazione diretta managed_identity del gruppo di destinatari dello strumento con auth.type: "project_connection". Passare l'ID risorsa ARM completo della connessione in auth.security_scheme.project_connection_id.
  4. Chiamare lo strumento per verificare che l'identità gestita del progetto possa accedere all'API di destinazione.
  5. Rimuovere l'assegnazione di ruolo del servizio di destinazione dell'identità dell'account solo dopo aver verificato che nessun altro carico di lavoro ne abbia bisogno.

Comprendere l'URI del gruppo di destinatari

Il audience (talvolta chiamato identificatore risorsa o URI ID applicazione) indica a Microsoft Entra ID quale servizio o API il token è destinato ad accedere. Il valore del gruppo di destinatari deve corrispondere a quello previsto dal servizio di destinazione oppure l'autenticazione ha esito negativo con un errore 401.

Nota

I destinatari non sono dati dall'endpoint del progetto Foundry. Si tratta dell'identificatore di risorsa del servizio di destinazione chiamato dallo strumento OpenAPI.

La tabella seguente elenca gli URI del gruppo di destinatari per i servizi di Azure comuni:

Servizio di destinazione URI destinatario
Archiviazione di Azure https://storage.azure.com
Azure Key Vault https://vault.azure.net
Azure AI Search https://search.azure.com
Traduttore Azure https://cognitiveservices.azure.com
App per la logica di Azure Pubblico configurato per l'autorizzazione Microsoft Entra ID del flusso di lavoro. Vedere Accesso sicuro a Logic Apps.
Gestione API di Azure (piano di gestione) https://management.azure.com
API protetta da una registrazione di applicazione Microsoft Entra (incluso APIM con OAuth) URI ID dell'applicazione dalla registrazione dell'app (ad esempio, api://<client-id>)

Suggerimento

Se si usa Gestione API di Azure per proteggere un'API personalizzata con criteri di convalida OAuth 2.0, il gruppo di destinatari è URI ID applicazione dalla registrazione dell'app che protegge l'API, non https://management.azure.com. I destinatari del piano di gestione si applicano solo alle operazioni di Azure Resource Manager nella risorsa APIM stessa.

Per altre informazioni su come gli agenti eseguono l'autenticazione con Microsoft Entra ID, vedere Agent identity and authentication.For more information about how agents authenticate with Microsoft Entra ID, see Agent identity and authentication.

Trovare e verificare il pubblico

Usare la procedura seguente per determinare e verificare il valore corretto del gruppo di destinatari:

  • Per i servizi di Azure: consulta la documentazione del servizio per ottenere l'identificatore di risorsa Microsoft Entra ID. La maggior parte dei servizi Azure elenca l'URI del gruppo di destinatari nella documentazione di autenticazione.
  • Per le API protette da una registrazione dell'app Microsoft Entra: nel portale di Azure, passare a Microsoft Entra ID>Registrazioni delle app>, selezionare l'app >Esporre un'API. L'URI ID dell'applicazione nella parte superiore della pagina è il valore dei destinatari.
  • Per verificare il gruppo di destinatari di un token: decodificare il token di accesso in https://jwt.ms e controllare l'attestazione aud . Il aud valore deve corrispondere al gruppo di destinatari previsto dal servizio di destinazione.

Configurare l'autenticazione dell'identità gestita

Per configurare l'autenticazione dell'identità gestita del progetto:

  1. Usare l'identità gestita del progetto Foundry per le nuove configurazioni. Assicurarsi che l'identità gestita del progetto sia abilitata. L'identità gestita dall'account è un'opzione legacy solo per gli strumenti collegati direttamente agli agenti prompt nelle sottoscrizioni esistenti; eseguire la migrazione di tali configurazioni il prima possibile.
  2. Creare o identificare il servizio di destinazione che lo strumento OpenAPI chiama.
  3. Assegnare l'accesso necessario all'identità gestita del progetto Foundry alla risorsa di destinazione.
    1. Selezionare Controllo di accesso per la risorsa.

    2. Selezionare Aggiungi e quindi aggiungere un'assegnazione di ruolo nella parte superiore della schermata.

      Screenshot del portale di Azure che mostra l'azione Aggiungi assegnazione di ruolo.

    3. Seleziona il ruolo con privilegi minimi del piano dati o dell'applicazione che consenta le operazioni definite nella specifica OpenAPI. L'accesso Reader di Azure Resource Manager da solo non concede l'accesso al piano dati. Quindi selezionare Avanti.

    4. Selezionare Identità gestita e quindi selezionare membri.

    5. Selezionare l'identità gestita del progetto Foundry.

    6. Selezionare Fine.

  4. Crea una connessione dell'identità gestita del progetto e passa il relativo ID risorsa completo nella definizione dello strumento.

Creare una connessione all'identità gestita del progetto

Creare la connessione nello stesso progetto Foundry che invia la richiesta Responses. La connessione archivia l'endpoint di destinazione e il gruppo di destinatari, non una chiave API o un token di accesso.

L'esempio Bash seguente usa interfaccia della riga di comando di Azure e curl per creare una connessione OpenAPI per Traduttore di Azure in Foundry Tools. Accedi con az login prima. Sostituire i segnaposto con la sottoscrizione, il gruppo di risorse, l'account Foundry, il progetto e la risorsa Translator.

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

Riferimento: schema della risorsa di connessione del progetto Foundry.

Conservare OPENAPI_CONNECTION_ID per gli esempi di lingua. Usare l'ID completo della risorsa di connessione, non solo il nome della connessione. L'audience appartiene alla connessione; non passare un'audience dell'identità gestita dell'account al posto dell'ID della connessione.

Chiamare uno strumento OpenAPI con l'identità gestita del progetto

Questi esempi chiamano Traduttore di Azure tramite la connessione creata. Inviano una specifica OpenAPI inline in un payload remote_tool all'endpoint Responses.

Prima di eseguire un esempio:

  • Assegnare all'identità gestita del progetto il ruolo del servizio di destinazione necessario per la traduzione.
  • Creare la connessione OpenAPI con authType: "ProjectManagedIdentity" come descritto in Creare una connessione a identità gestita del progetto.
  • Impostare FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL_DEPLOYMENT_NAMEe OPENAPI_CONNECTION_ID. La connessione deve appartenere a questo progetto.
  • Salva la specifica seguente come translator_openapi.json nella directory in cui si esegue l'esempio. Sostituire <translator-resource> con la risorsa usata nel target della connessione.
{
  "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" }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Riferimento: operazione translate di Translator.

Il chiamante esegue l'autenticazione a Foundry con una credenziale di identità Azure. Foundry risolve l'autenticazione per Translator dalla connessione al progetto e usa l'identità gestita del progetto.

Installare le dipendenze con 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()

Riferimento: provider di token Azure Identity.

L'argomento extra_body passa il payload specifico remote_tool del servizio senza richiedere un modello di strumento OpenAPI tipizzato in OpenAI SDK.

Usare .NET 8 o versione successiva e installare la libreria delle credenziali con dotnet add package Azure.Identity. In questo esempio viene inviato il payload dello strumento specifico del servizio con 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);

Riferimento: DefaultAzureCredential, HttpClient.

Usare Node.js 20 o versione successiva e installare la libreria delle credenziali con npm install @azure/identity. Salvare questo esempio JavaScript come 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);

Riferimento: DefaultAzureCredential.

Usare Java 11 o versione successiva. Aggiungere com.azure:azure-identity e com.fasterxml.jackson.core:jackson-databind alle dipendenze Maven. Questo esempio invia il payload dello strumento specifico del servizio con il client HTTP di Java.

import com.azure.core.credential.AccessToken;
import com.azure.core.credential.TokenRequestContext;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class OpenApiProjectMi {
    private static String requiredEnvironmentVariable(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) {
            throw new IllegalStateException("Set " + name + " before running.");
        }
        return value;
    }

    public static void main(String[] args) throws Exception {
        String endpoint = requiredEnvironmentVariable(
            "FOUNDRY_PROJECT_ENDPOINT");
        String model = requiredEnvironmentVariable(
            "FOUNDRY_MODEL_DEPLOYMENT_NAME");
        String connectionId = requiredEnvironmentVariable(
            "OPENAPI_CONNECTION_ID");
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> spec = mapper.readValue(
            new File("translator_openapi.json"),
            new TypeReference<Map<String, Object>>() { });

        Map<String, Object> tool = Map.of(
            "type", "remote_tool",
            "tool_arguments", List.of(Map.of(
                "name", "openapi",
                "arguments", Map.of(
                    "name", "language",
                    "description",
                        "Azure Translator API for text translation.",
                    "default_params", List.of("api-version"),
                    "auth", Map.of(
                        "type", "project_connection",
                        "security_scheme", Map.of(
                            "project_connection_id", connectionId)),
                    "spec", spec))));
        Map<String, Object> body = Map.of(
            "model", model,
            "input", "Translate 'Hello, how are you?' to Spanish.",
            "tools", List.of(tool),
            "tool_choice", "required");

        var credential = new DefaultAzureCredentialBuilder().build();
        AccessToken token = Objects.requireNonNull(credential.getToken(
            new TokenRequestContext()
                .addScopes("https://ai.azure.com/.default")).block());
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(endpoint.replaceAll("/$", "")
                + "/openai/v1/responses"))
            .header("Authorization", "Bearer " + token.getToken())
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(
                mapper.writeValueAsString(body)))
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request, HttpResponse.BodyHandlers.ofString());
        if (response.statusCode() < 200 || response.statusCode() >= 300) {
            throw new IllegalStateException(
                "HTTP " + response.statusCode() + ": " + response.body());
        }
        System.out.println(response.body());
    }
}

Riferimento: DefaultAzureCredentialBuilder.

Usare Bash, interfaccia della riga di comando di Azure, curl e jq per creare la richiesta da translator_openapi.json. Il token del chiamante è destinato a Foundry, non Azure Resource Manager o 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

Riferimento: interfaccia della riga di comando di Azure token di accesso.

La risposta contiene una traduzione spagnola di "Hello, how are you?" L'esempio di Python stampa il testo della risposta. Gli esempi HTTP stampano la risposta JSON completa, inclusi l'output dello strumento e il messaggio di assistente.

Risolvere gli errori comuni

Sintomo Probabile causa Risoluzione
La chiave API non è inclusa nelle richieste. La specifica OpenAPI è mancante delle sezioni securitySchemes o security. Verificare che la specifica OpenAPI includa sia components.securitySchemes che una sezione di primo livello security . Verificare che lo schema name corrisponda al nome della chiave nella connessione al progetto.
Agent non chiama lo strumento OpenAPI. Scelta dello strumento non impostata o operationId non descrittiva. Usare tool_choice="required" per forzare la chiamata allo strumento. Verificare che operationId i valori siano descrittivi in modo che il modello possa scegliere l'operazione corretta.
L'autenticazione ha esito negativo per l'identità gestita del progetto. L'identità gestita del progetto non è abilitata o manca l'assegnazione del ruolo. Verificare che l'identità gestita del progetto Foundry sia abilitata e abbia il ruolo del piano dati o dell'applicazione con il privilegio minimo necessario del servizio di destinazione per le operazioni nella specifica OpenAPI.
L'identità gestita del progetto non viene usata. Lo strumento usa la configurazione diretta del pubblico managed_identity anziché una connessione di progetto. Creare una connessione OpenAPI con authType: "ProjectManagedIdentity". Impostare il auth.type dello strumento su project_connection e auth.security_scheme.project_connection_id sull'ID della risorsa di connessione completo.
L'identità gestita del progetto restituisce 401 anche se il ruolo è assegnato. L'URI audience della connessione non corrisponde a quello previsto dal servizio di destinazione. Verificare l'URI audience nella ProjectManagedIdentity connessione rispetto alla documentazione del servizio di destinazione. Per le API protette da Microsoft Entra ID, usare l'Application ID URI dalla registrazione dell'app. Vedere Informazioni sull'URI del gruppo di destinatari.
Token dell'identità gestita del progetto rifiutato dall'API di destinazione. Il servizio di destinazione non accetta token Microsoft Entra ID. Verificare che il servizio di destinazione supporti l'autenticazione Microsoft Entra ID. In caso contrario, usare una chiave API o un altro metodo di autenticazione supportato dal servizio di destinazione.
La richiesta ha esito negativo con 400 richiesta non valida. La specifica OpenAPI non corrisponde all'API effettiva. Convalidare la specifica OpenAPI rispetto all'API effettiva. Controllare i nomi dei parametri, i tipi e i campi obbligatori.
La richiesta fallisce con il codice di errore "401 Non autorizzato". Chiave API o token non valido o scaduto. Rigenerare la chiave API/token e aggiornare la connessione al progetto. Verificare che l'ID connessione sia corretto.
Lo strumento restituisce un formato di risposta imprevisto. Schema di risposta non definito nella specifica OpenAPI. Aggiungere schemi di risposta alla specifica OpenAPI per una migliore comprensione del modello.
operationId errore di convalida. Caratteri non validi in operationId. Usare solo lettere, -, e _ nei valori operationId. Rimuovere numeri e caratteri speciali.
Errore: connessione non trovata. L'ID risorsa di connessione non è corretto o appartiene a un altro progetto. Verificare che OPENAPI_CONNECTION_ID sia l'ID risorsa ARM completo della connessione nel progetto Foundry che invia la richiesta.
Token di connessione non inviato correttamente. Nel valore di connessione mancano il prefisso Bearer e lo spazio successivo. Impostare il valore di connessione su Bearer <token> (con la parola Bearer e uno spazio prima del token). Verificare che la OpenAPI specifica securitySchemes usi "name": "Authorization".

Scegliere un metodo di autenticazione

La tabella seguente consente di scegliere il metodo di autenticazione appropriato per lo strumento OpenAPI:

Metodo di autenticazione Migliore per Complessità della configurazione
Anonimo API pubbliche senza autenticazione. Richiede una connessione al progetto OpenAPI con authType: "None". Basso
Chiave API API non Microsoft con accesso basato su chiave Medio
Identità gestita (identità gestita del progetto) Azure servizi e API protette da Microsoft Entra ID. Richiede una ProjectManagedIdentity connessione e il ruolo del servizio di destinazione richiesto assegnato all'identità gestita del progetto. Medio-Alto