Подключение агентов к средствам OpenAPI

Подключите Microsoft агенты Foundry к внешним API с помощью спецификаций OpenAPI 3.0 и 3.1. Модель Foundry, обеспечивающая работу вашего агента, может вызывать внешние сервисы, получать данные в режиме реального времени и расширять функционал за пределы встроенных возможностей.

Спецификации OpenAPI определяют стандартный способ описания API HTTP, чтобы можно было интегрировать существующие службы с агентами. Microsoft Foundry поддерживает три метода проверки подлинности: anonymous, API key и managed identity. Сведения о выборе метода проверки подлинности см. в разделе "Выбор метода проверки подлинности".

Поддержка использования

В следующей таблице показана поддержка пакета SDK и настройки.

поддержка Microsoft Foundry пакет SDK Python C# SDK JavaScript SDK пакет SDK Java REST API Базовая настройка агента Настройка стандартного агента
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Примечание

Для Java используйте пакет com.azure:azure-ai-agents для средств агента OpenAPI. В настоящее время пакет com.azure:azure-ai-projects не предоставляет типы инструментов OpenAPI агента.

Необходимые условия

Прежде чем начать, убедитесь, что у вас есть:

  • Подписка Azure с необходимыми разрешениями.
  • Azure роль RBAC: участник или владелец проекта Foundry.
  • Проект Foundry, созданный с настроенной конечной точкой.
  • Модель искусственного интеллекта, развернутая в проекте.
  • Базовая или стандартная среда агента.
  • Пакет SDK, установленный для предпочитаемого языка:
    • Python: azure-ai-projects
    • C#: Azure.AI.Extensions.OpenAI
    • TypeScript/JavaScript: @azure/ai-projects
    • Java: com.azure:azure-ai-agents

Переменные среды

Переменная Описание
FOUNDRY_PROJECT_ENDPOINT URL-адрес конечной точки проекта Foundry (а не внешняя конечная точка службы OpenAPI).
FOUNDRY_MODEL_DEPLOYMENT_NAME Имя развернутой модели.
OPENAPI_PROJECT_CONNECTION_NAME (Для проверки подлинности ключа API) Имя подключения проекта для службы OpenAPI.
  • Файл спецификации OpenAPI 3.0 или 3.1, соответствующий этим требованиям:
    • Каждая функция должна иметь operationId (требуется для средства OpenAPI).
    • operationId должен содержать только буквы, -а также _.
    • Используйте описательные имена, чтобы помочь моделям эффективно решать, какую функцию следует использовать.
    • Поддерживаемые типы контента текста запроса: application/jsonapplication/json-patch+json
  • Для проверки подлинности управляемого удостоверения: роль читателя или выше для ресурсов целевой службы.
  • Для аутентификации с использованием ключа или токена API: подключение проекта, настроенное с использованием вашего ключа или токена API. См. статью "Добавление нового подключения к проекту".

Примечание

Значение FOUNDRY_PROJECT_ENDPOINT ссылается на конечную точку проекта Microsoft Foundry, а не внешнюю конечную точку службы OpenAPI. Эту конечную точку можно найти на портале Microsoft Foundry на странице обзора проекта. Эта конечная точка требуется для проверки подлинности службы агента и отделена от любых конечных точек OpenAPI, определенных в файле спецификации.

Общие сведения об ограничениях

  • Спецификация OpenAPI должна включать operationId для каждой операции, и operationId может включать только буквы, - и _.
  • Поддерживаемые типы контента текста запроса: application/json, application/json-patch+json.
  • Для проверки подлинности ключа API используйте одну схему безопасности ключа API для каждого средства OpenAPI. Если требуется несколько схем безопасности, создайте несколько средств OpenAPI.

Пример кода

Примечание

  • Вам нужен последний пакет SDK. Пакет SDK .NET в настоящее время находится в предварительной версии. Дополнительные сведения см. в кратком руководстве .
  • Если вы используете ключ API для проверки подлинности, идентификатор подключения должен находиться в формате /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Важно

Чтобы проверка подлинности ключа API работала, необходимо включить файл спецификации OpenAPI:

  1. Раздел securitySchemes с конфигурацией ключа API, например имя заголовка и имя параметра.
  2. Раздел security , ссылающийся на схему безопасности.
  3. Подключение проекта, настроенное с соответствующим именем ключа и значением.

Без этих конфигураций ключ API не включается в запросы. Подробные инструкции по настройке см. в разделе "Проверка подлинности с помощью ключа API ".

Вы также можете использовать аутентификацию на основе токенов (например, токен Bearer), сохранив токен в подключении проекта. Для проверки подлинности маркера носителя создайте подключение настраиваемых ключей с набором Authorization ключей и набором значений Bearer <token> (замените <token> фактическим маркером). Bearer Слово, за которым следует пробел, должно быть включено в значение. Дополнительные сведения см. в Настройка подключения Bearer token.

Полный пример

import os
import jsonref
from typing import Any, cast
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    PromptAgentDefinition,
    OpenApiTool,
    OpenApiFunctionDefinition,
    OpenApiAnonymousAuthDetails,
)

# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
OPENAPI_CONNECTION_NAME = "my-openapi-connection"

# Create clients to call Foundry API
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

weather_asset_file_path = os.path.abspath(
    os.path.join(os.path.dirname(__file__), "../assets/weather_openapi.json")
)

with open(weather_asset_file_path, "r") as f:
    openapi_weather = cast(dict[str, Any], jsonref.loads(f.read()))

# Initialize agent OpenAPI tool using the read in OpenAPI spec
weather_tool = OpenApiTool(
    openapi=OpenApiFunctionDefinition(
        name="get_weather",
        spec=openapi_weather,
        description="Retrieve weather information for a location.",
        auth=OpenApiAnonymousAuthDetails(),
    )
)

# If you want to use key-based authentication
# IMPORTANT: Your OpenAPI spec must include securitySchemes and security sections
# Example spec structure for API key auth:
# {
#   "components": {
#     "securitySchemes": {
#       "apiKeyHeader": {
#         "type": "apiKey",
#         "name": "x-api-key",  # This must match the key name in your project connection
#         "in": "header"
#       }
#     }
#   },
#   "security": [{"apiKeyHeader": []}]
# }
#
# For Bearer token authentication, use this securitySchemes structure instead:
# {
#   "components": {
#     "securitySchemes": {
#       "bearerAuth": {
#         "type": "apiKey",
#         "name": "Authorization",
#         "in": "header"
#       }
#     }
#   },
#   "security": [{"bearerAuth": []}]
# }
# Then set connection key = "Authorization" and value = "Bearer <token>"
# The word "Bearer" followed by a space MUST be included in the value.

openapi_connection = project.connections.get(OPENAPI_CONNECTION_NAME)
connection_id = openapi_connection.id

openapi_key_auth_tool = {
    "type": "openapi",
    "openapi": {
        "name": "get_weather",
        "spec": openapi_weather,  # Must include securitySchemes and security sections
        "auth": {
            "type": "project_connection",
            "security_scheme": {
                "project_connection_id": connection_id
            }
        },
    }
}

# If you want to use Managed Identity authentication
openapi_mi_auth_tool = {
    "type": "openapi",
    "openapi": {
        "name": "get_weather",
        "description": "Retrieve weather information for a location.",
        "spec": openapi_weather,
        "auth": {
            "type": "managed_identity",
            "security_scheme": {
                "audience": "https://storage.azure.com"  # Resource identifier of the target service
            }
        },
    }
}

agent = project.agents.create_version(
    agent_name="MyAgent",
    definition=PromptAgentDefinition(
        model="gpt-4.1-mini",
        instructions="You are a helpful assistant.",
        tools=[weather_tool],
    ),
)
response = openai.responses.create(
    input="What's the weather in Seattle?",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
print(response.output_text)

# Clean up resources
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)

Что делает этот код

В этом примере создается агент с инструментом OpenAPI, который вызывает API погоды wttr.in с помощью анонимной проверки подлинности. При запуске кода:

  1. Она загружает спецификацию OpenAPI погоды из локального JSON-файла.
  2. Создает агент с средством погоды, настроенным для анонимного доступа.
  3. Отправляет запрос с просьбой о погоде Сиэтла.
  4. Агент использует средство OpenAPI для вызова API погоды и возвращает форматированные результаты.
  5. Очищает, удаляя версию агента.

Обязательные входные данные

  • Строковые значения в верхней части скрипта: PROJECT_ENDPOINTOPENAPI_CONNECTION_NAME
  • Локальный файл: weather_openapi.json (спецификация OpenAPI)

Ожидаемые выходные данные

Agent created (id: asst_abc123, name: MyAgent23, version: 1)
Response created: The weather in Seattle is currently cloudy with a temperature of 52°F (11°C)...

Cleaning up...
Agent deleted

Распространенные ошибки

  • FileNotFoundError: файл спецификации OpenAPI не найден по указанному пути
  • AuthenticationError: недопустимые учетные данные, недостаточно разрешений, или отсутствует securitySchemes в спецификации OpenAPI для аутентификации ключа API
  • Недопустимый operationId формат в спецификации OpenAPI приводит к сбою регистрации средства
  • Ключ API не введен: убедитесь, что спецификация OpenAPI включает оба раздела и то, что имя ключа соответствует подключению к проекту.

Пример использования агентов с инструментом OpenAPI

В этом примере показано, как использовать службы, описанные спецификацией OpenAPI с помощью агента. Она использует службу wttr.in для получения погоды и файла спецификации weather_openapi.json. В этом примере используются синхронные методы клиентской библиотеки Azure AI Projects. Пример использования асинхронных методов см. в образце из репозитория Azure SDK для .NET на GitHub.

using System;
using System.IO;
using System.Runtime.CompilerServices;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;

class OpenAPIDemo
{
    // Utility method to get the OpenAPI specification file from the Assets folder.
    private static string GetFile([CallerFilePath] string pth = "")
    {
        var dirName = Path.GetDirectoryName(pth) ?? "";
        return Path.Combine(dirName, "Assets", "weather_openapi.json");
    }

    public static void Main()
    {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        var projectEndpoint = "your_project_endpoint";

        // Create project client to call Foundry API
        AIProjectClient projectClient = new(
            endpoint: new Uri(projectEndpoint),
            tokenProvider: new DefaultAzureCredential());

        // Create an Agent with `OpenAPIAgentTool` and anonymous authentication.
        string filePath = GetFile();
        OpenAPIFunctionDefinition toolDefinition = new(
            name: "get_weather",
            spec: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
            auth: new OpenAPIAnonymousAuthenticationDetails()
        );
        toolDefinition.Description = "Retrieve weather information for a location.";
        OpenAPITool openapiTool = new(toolDefinition);

        // Create the agent definition and the agent version.
        DeclarativeAgentDefinition agentDefinition = new(model: "gpt-4.1-mini")
        {
            Instructions = "You are a helpful assistant.",
            Tools = { openapiTool }
        };
        AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
            agentName: "myAgent",
            options: new(agentDefinition));

        // Create a response object and ask the question about the weather in Seattle, WA.
        ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
        ResponseResult response = responseClient.CreateResponse(
                userInputText: "Use the OpenAPI tool to print out, what is the weather in Seattle, WA today."
            );
        Console.WriteLine(response.GetOutputText());

        // Finally, delete all the resources created in this sample.
        projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
    }
}

Что делает этот код

В этом примере C# создается агент с инструментом OpenAPI, который извлекает сведения о погоде из wttr.in с помощью анонимной проверки подлинности. При запуске кода:

  1. Он считывает спецификацию погоды OpenAPI из локального JSON-файла.
  2. Создает агент с настроенным инструментом погоды.
  3. Отправляет запрос о погоде Сиэтла с помощью средства OpenAPI.
  4. Агент вызывает API погоды и возвращает результаты.
  5. Удаляет агент, очищая систему.

Обязательные входные данные

  • Встроенное строковое значение: projectEndpoint (ваша конечная точка проекта Foundry)
  • Локальный файл: Assets/weather_openapi.json (спецификация OpenAPI)

Ожидаемые выходные данные

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

Распространенные ошибки

  • FileNotFoundException: файл спецификации OpenAPI не найден в папке "Ресурсы"
  • UnauthorizedAccessException: недопустимые учетные данные или недостаточно разрешений RBAC
  • Ключ API не добавлен: убедитесь, что спецификация OpenAPI содержит как securitySchemescomponents), так и security разделы, чтобы имена схем совпадали.

Пример использования агентов с средством OpenAPI в веб-службе, требующий проверки подлинности

В этом примере используются службы со спецификацией OpenAPI с помощью агента в сценарии, требующего проверки подлинности. Вы используете спецификацию TripAdvisor.

Служба TripAdvisor требует проверки подлинности на основе ключей. Чтобы создать подключение на портале Azure, откройте Microsoft Foundry и на левой панели выберите центр Management и выберите Соединяемые ресурсы. Наконец, создайте новое подключение типа пользовательских ключей . Назовите его tripadvisor и добавьте пару "ключ-значение". Добавьте ключ с именем key и введите значение с помощью ключа TripAdvisor.

class OpenAPIConnectedDemo
{
    // Utility method to get the OpenAPI specification file from the Assets folder.
    private static string GetFile([CallerFilePath] string pth = "")
    {
        var dirName = Path.GetDirectoryName(pth) ?? "";
        return Path.Combine(dirName, "Assets", "tripadvisor_openapi.json");
    }

    public static void Main()
    {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        var projectEndpoint = "your_project_endpoint";

        // Create project client to call Foundry API
        AIProjectClient projectClient = new(
            endpoint: new Uri(projectEndpoint),
            tokenProvider: new DefaultAzureCredential());

        // Create an Agent with `OpenAPIAgentTool` and authentication by project connection security scheme.
        string filePath = GetFile();
        AIProjectConnection tripadvisorConnection = projectClient.Connections.GetConnection("tripadvisor");
        OpenAPIFunctionDefinition toolDefinition = new(
            name: "tripadvisor",
            spec: BinaryData.FromBytes(File.ReadAllBytes(filePath)),
            auth: new OpenAPIProjectConnectionAuthenticationDetails(new OpenAPIProjectConnectionSecurityScheme(
                projectConnectionId: tripadvisorConnection.Id
            ))
        );
        toolDefinition.Description = "Trip Advisor API to get travel information.";
        OpenAPITool openapiTool = new(toolDefinition);

        // Create the agent definition and the agent version.
        DeclarativeAgentDefinition agentDefinition = new(model: "gpt-4.1-mini")
        {
            Instructions = "You are a helpful assistant.",
            Tools = { openapiTool }
        };
        AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
            agentName: "myAgent",
            options: new(agentDefinition));

        // Create a response object and ask the question about the 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);
    }
}

Что делает этот код

В этом примере C# демонстрируется использование средства OpenAPI с проверкой подлинности ключа API через подключение к проекту. При запуске кода:

  1. Она загружает спецификацию TripAdvisor OpenAPI из локального файла.
  2. Получает tripadvisor подключение проекта, включающее ваш ключ API.
  3. Создает агент с инструментом TripAdvisor, настроенным на использование соединения для аутентификации.
  4. Отправляет запрос на рекомендации по отелям в Париже.
  5. Агент вызывает API TripAdvisor с помощью сохраненного ключа API и возвращает результаты.
  6. Удаляет агент, очищая систему.

Обязательные входные данные

  • Встроенное строковое значение: projectEndpoint (ваша конечная точка проекта Foundry)
  • Локальный файл: Assets/tripadvisor_openapi.json
  • Подключение к проекту: tripadvisor с валидным ключом API.

Ожидаемые выходные данные

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

Распространенные ошибки

  • ConnectionNotFoundException: не найдено подключение проекта с именем tripadvisor.
  • AuthenticationException: Неверный ключ API в подключении проекта, или отсутствует/неправильная конфигурация securitySchemes в спецификации OpenAPI.
  • Средство не используется: убедитесь, что проверка ToolChoice = ResponseToolChoice.CreateRequiredChoice() принуждает использовать инструмент.
  • Ключ API не передан в API: убедитесь, что спецификация OpenAPI правильно настроена и разделы securitySchemes и security сконфигурированы.

Создание агента Java с помощью возможностей инструментов OpenAPI

В этом Java примере создается агент с инструментом OpenAPI с помощью com.azure:azure-ai-agents и локального файла спецификации OpenAPI. В примере используется анонимная проверка подлинности и вызывается общедоступная конечная точка API.

import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.ConversationsClient;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.*;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.json.JsonProviders;
import com.azure.json.JsonReader;
import com.openai.models.conversations.Conversation;
import com.openai.models.conversations.items.ItemCreateParams;
import com.openai.models.responses.EasyInputMessage;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Map;

public class OpenApiAgentJavaSample {
    public static void main(String[] args) throws Exception {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        String projectEndpoint = "your_project_endpoint";

        AgentsClientBuilder builder = new AgentsClientBuilder()
            .endpoint(projectEndpoint)
            .credential(new DefaultAzureCredentialBuilder().build());

        AgentsClient agentsClient = builder.buildAgentsClient();
        ResponsesClient responsesClient = builder.buildResponsesClient();
        ConversationsClient conversationsClient = builder.buildConversationsClient();

        Map<String, BinaryData> spec = OpenApiFunctionDefinition.readSpecFromFile(
            Paths.get("openapi_spec.json"));

        OpenApiFunctionDefinition toolDefinition = new OpenApiFunctionDefinition(
            "httpbin_get",
            spec,
            new OpenApiAnonymousAuthDetails())
            .setDescription("Get request metadata from an OpenAPI endpoint.");

        PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-4.1-mini")
            .setInstructions("Use the OpenAPI tool for HTTP request metadata.")
            .setTools(Arrays.asList(new OpenApiTool(toolDefinition)));

        AgentVersionDetails agentVersion = agentsClient.createAgentVersion("openapiValidationAgentJava", agentDefinition);
        System.out.println("Agent: " + agentVersion.getName() + ", version: " + agentVersion.getVersion());

        Conversation conversation = conversationsClient.getConversationService().create();
        conversationsClient.getConversationService().items().create(
            ItemCreateParams.builder()
                .conversationId(conversation.id())
                .addItem(EasyInputMessage.builder()
                    .role(EasyInputMessage.Role.USER)
                    .content("Use the OpenAPI tool and summarize the returned URL and origin in one sentence.")
                    .build())
                .build());

        try {
            AgentReference agentReference = new AgentReference(agentVersion.getName()).setVersion(agentVersion.getVersion());
            ResponseCreateParams.Builder options = ResponseCreateParams.builder().maxOutputTokens(300L);
            Response response = responsesClient.createAzureResponse(
                new AzureCreateResponseOptions().setAgentReference(agentReference),
                options.conversation(conversation.id()));

            String text = response.output().stream()
                .filter(item -> item.isMessage())
                .map(item -> item.asMessage().content()
                    .get(item.asMessage().content().size() - 1)
                    .asOutputText()
                    .text())
                .reduce((first, second) -> second)
                .orElse("<no message output>");

            System.out.println("Status: " + response.status().map(Object::toString).orElse("unknown"));
            System.out.println("Response: " + text);
        } finally {
            agentsClient.deleteAgentVersion(agentVersion.getName(), agentVersion.getVersion());
            System.out.println("Agent deleted");
        }
    }
}

Что делает этот код

В этом примере на Java создается агент с помощью инструмента OpenAPI и выполняется ответ в рамках разговора.

  1. Загружает спецификацию OpenAPI из openapi_spec.json.
  2. Создаёт версию агента OpenApiTool.
  3. Создает беседу и добавляет сообщение пользователя.
  4. Создает ответ, передавая AgentReference и идентификатор разговора.
  5. Очищает, удаляя версию агента.

Обязательные входные данные

  • Встроенное строковое значение: projectEndpoint (ваша конечная точка проекта Foundry)
  • Локальный файл: openapi_spec.json (спецификация OpenAPI 3.0 или 3.1)

Ожидаемые выходные данные

Agent: openapiValidationAgentJava, version: 1
Status: completed
Response: The API response reports URL ... and origin ...
Agent deleted

Распространенные ошибки

  • Invalid OpenAPI specification: Разобрать JSON OpenAPI в объект перед передачей в OpenApiFunctionDefinition.
  • Invalid conversation id: Создайте беседу и передайте conversation.id()createAzureResponse через ResponseCreateParams.builder().conversation().
  • AuthenticationFailedException: убедитесь, что DefaultAzureCredential вы можете получить токен для вашей учетной записи входа.

В следующих примерах показано, как вызвать средство OpenAPI с помощью REST API.

Получение токена доступа:

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

Анонимная проверка подлинности

curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  --header "Authorization: Bearer $AGENT_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
    "input": "Use the OpenAPI tool to get the weather in Seattle, WA today.",
    "tools": [
      {
        "type": "openapi",
        "openapi": {
          "name": "weather",
          "description": "Tool to get weather data",
          "auth": { "type": "anonymous" },
          "spec": {
            "openapi": "3.1.0",
            "info": {
              "title": "get weather data",
              "description": "Retrieves current weather data for a location.",
              "version": "v1.0.0"
            },
            "servers": [{ "url": "https://wttr.in" }],
            "paths": {
              "/{location}": {
                "get": {
                  "description": "Get weather information for a specific location",
                  "operationId": "GetCurrentWeather",
                  "parameters": [
                    {
                      "name": "location",
                      "in": "path",
                      "description": "City or location to retrieve the weather for",
                      "required": true,
                      "schema": { "type": "string" }
                    },
                    {
                      "name": "format",
                      "in": "query",
                      "description": "Format in which to return data. Always use 3.",
                      "required": true,
                      "schema": { "type": "integer", "default": 3 }
                    }
                  ],
                  "responses": {
                    "200": {
                      "description": "Successful response",
                      "content": {
                        "text/plain": {
                          "schema": { "type": "string" }
                        }
                      }
                    },
                    "404": { "description": "Location not found" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

Проверка подлинности ключа API (подключение к проекту)

curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  --header "Authorization: Bearer $AGENT_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
    "input": "Use the OpenAPI tool to get the weather in Seattle, WA today.",
    "tools": [
      {
        "type": "openapi",
        "openapi": {
          "name": "weather",
          "description": "Tool to get weather data",
          "auth": {
            "type": "project_connection",
            "security_scheme": {
              "project_connection_id": "'$WEATHER_APP_PROJECT_CONNECTION_ID'"
            }
          },
          "spec": {
            "openapi": "3.1.0",
            "info": {
              "title": "get weather data",
              "description": "Retrieves current weather data for a location.",
              "version": "v1.0.0"
            },
            "servers": [{ "url": "https://wttr.in" }],
            "paths": {
              "/{location}": {
                "get": {
                  "description": "Get weather information for a specific location",
                  "operationId": "GetCurrentWeather",
                  "parameters": [
                    {
                      "name": "location",
                      "in": "path",
                      "description": "City or location to retrieve the weather for",
                      "required": true,
                      "schema": { "type": "string" }
                    },
                    {
                      "name": "format",
                      "in": "query",
                      "description": "Format in which to return data. Always use 3.",
                      "required": true,
                      "schema": { "type": "integer", "default": 3 }
                    }
                  ],
                  "responses": {
                    "200": {
                      "description": "Successful response",
                      "content": {
                        "text/plain": {
                          "schema": { "type": "string" }
                        }
                      }
                    },
                    "404": { "description": "Location not found" }
                  }
                }
              }
            },
            "components": {
              "securitySchemes": {
                "apiKeyHeader": {
                  "type": "apiKey",
                  "name": "x-api-key",
                  "in": "header"
                }
              }
            },
            "security": [
              { "apiKeyHeader": [] }
            ]
          }
        }
      }
    ]
  }'

Проверка подлинности удостоверения с управлением

curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  --header "Authorization: Bearer $AGENT_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
    "input": "Use the OpenAPI tool to get the weather in Seattle, WA today.",
    "tools": [
      {
        "type": "openapi",
        "openapi": {
          "name": "weather",
          "description": "Tool to get weather data",
          "auth": {
            "type": "managed_identity",
            "security_scheme": {
              "audience": "'$MANAGED_IDENTITY_AUDIENCE'"
            }
          },
          "spec": {
            "openapi": "3.1.0",
            "info": {
              "title": "get weather data",
              "description": "Retrieves current weather data for a location.",
              "version": "v1.0.0"
            },
            "servers": [{ "url": "https://wttr.in" }],
            "paths": {
              "/{location}": {
                "get": {
                  "description": "Get weather information for a specific location",
                  "operationId": "GetCurrentWeather",
                  "parameters": [
                    {
                      "name": "location",
                      "in": "path",
                      "description": "City or location to retrieve the weather for",
                      "required": true,
                      "schema": { "type": "string" }
                    },
                    {
                      "name": "format",
                      "in": "query",
                      "description": "Format in which to return data. Always use 3.",
                      "required": true,
                      "schema": { "type": "integer", "default": 3 }
                    }
                  ],
                  "responses": {
                    "200": {
                      "description": "Successful response",
                      "content": {
                        "text/plain": {
                          "schema": { "type": "string" }
                        }
                      }
                    },
                    "404": { "description": "Location not found" }
                  }
                }
              }
            }
          }
        }
      }
    ]
  }'

Что делает этот код

В этом примере REST API показано, как вызвать средство OpenAPI с различными методами проверки подлинности. Запрос:

  1. Отправляет запрос агенту с просьбой о погоде Сиэтла.
  2. Включает определение средства OpenAPI в соответствие со спецификацией API погоды.
  3. Показывает три варианта проверки подлинности (анонимный, ключ API через подключение проекта, управляемое удостоверение) в качестве закомментированных альтернатив.
  4. Агент использует средство для вызова API погоды и возвращает форматированные результаты.

Обязательные входные данные

  • Переменные среды: FOUNDRY_PROJECT_ENDPOINT, AGENT_TOKEN, FOUNDRY_MODEL_DEPLOYMENT_NAME.
  • Для проверки подлинности ключа API: WEATHER_APP_PROJECT_CONNECTION_ID
  • Для проверки подлинности управляемой идентификации: MANAGED_IDENTITY_AUDIENCE
  • Встроенная спецификация OpenAPI в тексте запроса.

Ожидаемые выходные данные

{
  "id": "resp_abc123",
  "object": "response",
  "output": [
    {
      "type": "message",
      "content": [
        {
          "type": "text",
          "text": "The weather in Seattle, WA today is cloudy with a temperature of 52°F (11°C)..."
        }
      ]
    }
  ]
}

Распространенные ошибки

  • 401 Unauthorized: недопустимый или отсутствующий AGENT_TOKEN, или ключ API не внедрён, так как securitySchemes и security отсутствуют в спецификации OpenAPI.
  • 404 Not Found: неправильное имя конечной точки или развертывания модели
  • 400 Bad Request: неправильно сформированная спецификация OpenAPI или недопустимая конфигурация проверки подлинности
  • Ключ API не отправлен с запросомcomponents.securitySchemes: убедитесь, что раздел в спецификации OpenAPI правильно настроен (не пуст) и соответствует имени ключа подключения проекта.

Создание агента с помощью возможностей инструментов OpenAPI

В следующем примере кода TypeScript показано, как создать агент ИИ с возможностями средства OpenAPI, используя OpenApiTool и клиент синхронных проектов Azure AI. Агент может вызывать внешние API, определенные спецификациями OpenAPI. Версию JavaScript этого примера см. в sample в репозитории JavaScript Azure SDK на GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import {
  AIProjectClient,
  OpenApiTool,
  OpenApiFunctionDefinition,
  OpenApiAnonymousAuthDetails,
} from "@azure/ai-projects";
import * as fs from "fs";
import * as path from "path";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const weatherSpecPath = path.resolve(__dirname, "../assets", "weather_openapi.json");

function loadOpenApiSpec(specPath: string): unknown {
  if (!fs.existsSync(specPath)) {
    throw new Error(`OpenAPI specification not found at: ${specPath}`);
  }

  try {
    const data = fs.readFileSync(specPath, "utf-8");
    return JSON.parse(data);
  } catch (error) {
    throw new Error(`Failed to read or parse OpenAPI specification at ${specPath}: ${error}`);
  }
}

function createWeatherTool(spec: unknown): OpenApiTool {
  const auth: OpenApiAnonymousAuthDetails = { type: "anonymous" };
  const definition: OpenApiFunctionDefinition = {
    name: "get_weather",
    description: "Retrieve weather information for a location using wttr.in",
    spec,
    auth,
  };

  return {
    type: "openapi",
    openapi: definition,
  };
}

export async function main(): Promise<void> {
  const weatherSpec = loadOpenApiSpec(weatherSpecPath);

  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  // Create an agent with the OpenAPI weather tool
  const agent = await project.agents.createVersion("MyOpenApiAgent", {
    kind: "prompt",
    model: "gpt-4.1-mini",
    instructions:
      "You are a helpful assistant that can call external APIs defined by OpenAPI specs to answer user questions.",
    tools: [createWeatherTool(weatherSpec)],
  });

  // 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: { 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);
});

Что делает этот код

В этом примере TypeScript создается агент с инструментом OpenAPI для данных о погоде с помощью анонимной проверки подлинности. При запуске кода:

  1. Она загружает спецификацию OpenAPI погоды из локального JSON-файла.
  2. Создает агент с настроенным инструментом погоды.
  3. Отправляет запрос потоковой передачи, спрашивая о погоде в Сиэтле и планировании одежды.
  4. Обрабатывает потоковый ответ и отображает изменения по мере поступления.
  5. Он принудительно использует средство, tool_choice: "required" чтобы убедиться, что API вызывается.
  6. Удаляет агент, очищая систему.

Обязательные входные данные

  • Встроенное строковое значение: PROJECT_ENDPOINT (ваша конечная точка проекта Foundry)
  • Локальный файл: ../assets/weather_openapi.json (спецификация OpenAPI)

Ожидаемые выходные данные

Loading OpenAPI specifications from assets directory...
Creating agent with OpenAPI tool...
Agent created (id: asst_abc123, name: MyOpenApiAgent, version: 1)

Sending request to OpenAPI-enabled agent with streaming...
Follow-up response created with ID: resp_xyz789
The weather in Seattle is currently...
Tool call completed: get_weather

Follow-up completed!

Cleaning up resources...
Agent deleted

OpenAPI agent sample completed!

Распространенные ошибки

  • Error: OpenAPI specification not found: неправильный путь к файлу или отсутствующий файл
  • AuthenticationError: недопустимые учетные данные Azure
  • Ключ API не работает: если вы переключаетесь с анонимной аутентификации на авторизацию с использованием ключа API, убедитесь, что спецификация OpenAPI и securitySchemes и security настроены правильно.

Создание агента, использующего средства OpenAPI, прошедший проверку подлинности с подключением к проекту

В следующем примере кода TypeScript показано, как создать агент ИИ, использующий средства OpenAPI, прошедшие проверку подлинности через подключение к проекту. Агент загружает спецификацию TripAdvisor OpenAPI из локальных ресурсов и может вызывать API с помощью настроенного подключения проекта. Версию JavaScript этого примера см. в sample в репозитории JavaScript Azure SDK на GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import {
  AIProjectClient,
  OpenApiTool,
  OpenApiFunctionDefinition,
  OpenApiProjectConnectionAuthDetails,
} from "@azure/ai-projects";
import * as fs from "fs";
import * as path from "path";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const TRIPADVISOR_CONNECTION_ID = "your-tripadvisor-connection-id";
const tripAdvisorSpecPath = path.resolve(__dirname, "../assets", "tripadvisor_openapi.json");

function loadOpenApiSpec(specPath: string): unknown {
  if (!fs.existsSync(specPath)) {
    throw new Error(`OpenAPI specification not found at: ${specPath}`);
  }

  try {
    const data = fs.readFileSync(specPath, "utf-8");
    return JSON.parse(data);
  } catch (error) {
    throw new Error(`Failed to read or parse OpenAPI specification at ${specPath}: ${error}`);
  }
}

function createTripAdvisorTool(spec: unknown): OpenApiTool {
  const auth: OpenApiProjectConnectionAuthDetails = {
    type: "project_connection",
    security_scheme: {
      project_connection_id: TRIPADVISOR_CONNECTION_ID,
    },
  };

  const definition: OpenApiFunctionDefinition = {
    name: "get_tripadvisor_location_details",
    description:
      "Fetch TripAdvisor location details, reviews, or photos using the Content API via project connection auth.",
    spec,
    auth,
  };

  return {
    type: "openapi",
    openapi: definition,
  };
}

export async function main(): Promise<void> {
  const tripAdvisorSpec = loadOpenApiSpec(tripAdvisorSpecPath);

  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  // Create an agent with the OpenAPI project-connection tool
  const agent = await project.agents.createVersion("MyOpenApiConnectionAgent", {
    kind: "prompt",
    model: "gpt-4.1-mini",
    instructions:
      "You are a travel assistant that consults the TripAdvisor Content API via project connection to answer user questions about locations.",
    tools: [createTripAdvisorTool(tripAdvisorSpec)],
  });

  // Send a request and stream the response
  const streamResponse = await openai.responses.create(
    {
      input:
        "Provide a quick overview of the TripAdvisor location 293919 including its name, rating, and review count.",
      stream: true,
    },
    {
      body: {
        agent: { 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);
});

Что делает этот код

В этом примере TypeScript демонстрируется использование средства OpenAPI с проверкой подлинности ключа API через подключение к проекту. При запуске кода:

  1. Она загружает спецификацию TripAdvisor OpenAPI из локального файла.
  2. Он настраивает проверку подлинности с помощью TRIPADVISOR_CONNECTION_ID константы.
  3. Он создает агента, используя инструмент TripAdvisor, который применяет подключение проекта для аутентификации с помощью API-ключа.
  4. Он отправляет потоковый запрос для получения сведений о местоположениях на TripAdvisor.
  5. Он принудительно использует средство, tool_choice: "required" чтобы убедиться, что API вызывается.
  6. Он обрабатывает и отображает ответ потоковой передачи.
  7. Она очищается путем удаления агента.

Обязательные входные данные

  • Встроенные строковые значения: PROJECT_ENDPOINT, TRIPADVISOR_CONNECTION_ID
  • Локальный файл: ../assets/tripadvisor_openapi.json
  • Параметры подключения проекта с использованием ключа API TripAdvisor.

Ожидаемые выходные данные

Loading TripAdvisor OpenAPI specification from assets directory...
Creating agent with OpenAPI project-connection tool...
Agent created (id: asst_abc123, name: MyOpenApiConnectionAgent, version: 1)

Sending request to TripAdvisor OpenAPI agent with streaming...
Follow-up response created with ID: resp_xyz789
Location 293919 is the Eiffel Tower in Paris, France. It has a rating of 4.5 stars with over 140,000 reviews...
Tool call completed: get_tripadvisor_location_details

Follow-up completed!

Cleaning up resources...
Agent deleted

TripAdvisor OpenAPI agent sample completed!

Распространенные ошибки

  • Error: OpenAPI specification not found: проверьте путь к файлу.
  • Соединение не найдено: проверьте, что TRIPADVISOR_CONNECTION_ID верно и соединение существует.
  • AuthenticationException: некорректный ключ API в подключении проекта.
  • Ключ API не интегрирован в запросы: спецификация OpenAPI должна содержать правильные разделы securitySchemes (под components) и security. Имя ключа в securitySchemes должно соответствовать ключу в подключении вашего проекта.
  • Content type is not supported: в настоящее время поддерживаются только два типа контента текста запроса: application/json и application/json-patch+json. Типы контента ответа не ограничены.

Вопросы безопасности и данных

При подключении агента к средству OpenAPI агент может отправлять параметры запроса, производные от входных данных пользователя в целевой API.

  • Используйте подключения проекта для секретов (ключи и токены API). Избегайте размещения секретов в файле спецификации OpenAPI или исходном коде.
  • Убедитесь, какие данные получает API и что оно возвращает, прежде чем использовать инструмент в рабочей среде.
  • Используйте доступ с минимальными привилегиями. Для управляемого удостоверения назначьте только роли, необходимые целевой службе.

Проверка подлинности с помощью ключа API

С помощью аутентификации с использованием ключа API, можно проверить спецификацию OpenAPI различными методами, такими как ключ API или токен типа Bearer. Для каждой спецификации OpenAPI можно использовать только одну схему безопасности ключа API. Если требуется несколько схем безопасности, создайте несколько средств спецификаций OpenAPI.

  1. Обновите схемы безопасности спецификаций OpenAPI. Он содержит securitySchemes раздел и одну схему типа apiKey. Например:

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

    Обычно нужно только обновить name поле, соответствующее имени key в соединении. Если схемы безопасности включают несколько схем, сохраните только одну из них.

  2. Обновите спецификацию OpenAPI, чтобы включить security раздел:

    "security": [
         {  
         "apiKeyHeader": []  
         }  
     ]
    
  3. Удалите любой параметр в спецификации OpenAPI, требующей ключа API, так как ключ API хранится и передается через подключение, как описано далее в этой статье.

  4. Создайте подключение для хранения ключа API.

  5. Перейдите на портал Foundry и откройте проект.

  6. Создайте или выберите соединение, которое хранит секрет. См. статью "Добавление нового подключения к проекту".

    Примечание

    При повторном создании ключа API на более позднюю дату необходимо обновить подключение с новым ключом.

  7. Введите следующие сведения

    • ключ: name поле вашей схемы безопасности. В этом примере должно быть x-api-key

             "securitySchemes": {
                "apiKeyHeader": {
                          "type": "apiKey",
                          "name": "x-api-key",
                          "in": "header"
                      }
              }
      
    • значение: YOUR_API_KEY

  8. После создания подключения его можно использовать с помощью пакета SDK или REST API. Используйте вкладки в верхней части этой статьи, чтобы просмотреть примеры кода.

Настройка подключения Bearer-токена

Вы можете использовать аутентификацию на основе токенов (например, токен Bearer) с тем же project_connection типом аутентификации, который используется для ключей API. Ключевое различие заключается в настройке спецификации OpenAPI и подключения к проекту.

Спецификация OpenAPI будет выглядеть следующим образом:

  BearerAuth:
    type: http
    scheme: bearer
    bearerFormat: JWT

Вам нужно:

  1. Обновите спецификацию OpenAPI securitySchemes, чтобы использовать Authorization в качестве имени заголовка:

    "securitySchemes": {
        "bearerAuth": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
    
  2. Добавьте раздел, ссылающийся на security схему:

    "security": [
        {
            "bearerAuth": []
        }
    ]
    
  3. Создайте подключение настраиваемых ключей в проекте Foundry.

    1. Перейдите на портал Foundry и откройте проект.
    2. Создайте или выберите соединение, которое хранит секрет. См. статью "Добавление нового подключения к проекту".
    3. Введите следующие значения:
      • ключ: Authorization (должно соответствовать полю name в вашем securitySchemes)
      • значение: Bearer <token> (замените <token> текущим токеном)

    Важно

    Значение должно содержать слово Bearer , за которым следует пробел перед маркером. Например: Bearer eyJhbGciOiJSUzI1NiIs.... Если опущено Bearer , API получает необработанный маркер без префикса требуемой схемы авторизации, и запрос завершается ошибкой.

  4. После того, как вы создадите подключение, используйте его с типом project_connection аутентификации в коде так же, как и для аутентификации ключа API. Идентификатор подключения использует тот же формат: /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}.

Проверка подлинности с помощью управляемого удостоверения (Microsoft Entra ID)

Microsoft Entra ID — это облачная служба управления удостоверениями и доступом, которую сотрудники могут использовать для доступа к внешним ресурсам. Используя Microsoft Entra ID, вы можете добавить дополнительную безопасность в API без необходимости использовать ключи API. При настройке проверки подлинности с помощью управляемого удостоверения агент аутентифицируется через инструмент Foundry, который он использует.

Важно

Аутентификация управляемого удостоверения работает только в том случае, если целевая служба принимает токены Microsoft Entra ID. Если целевой API использует пользовательскую схему проверки подлинности, которая не поддерживает Microsoft Entra ID, используйте API-ключ или токен Bearer для аутентификации.

Общие сведения о URI аудитории

Идентификатор получателя (иногда называемый идентификатором ресурса или URI идентификатора приложения) сообщает Microsoft Entra ID, к какой службе или API предназначен маркер для доступа. Значение аудитории должно соответствовать тому, что ожидает целевая служба, иначе произойдет ошибка 401.

Примечание

Аудитория не является конечной точкой проекта Foundry. Это идентификатор ресурса целевой службы, вызываемой средством OpenAPI.

В следующей таблице перечислены URI аудитории для распространенных служб Azure:

Целевая служба URI аудитории
служба хранилища Azure https://storage.azure.com
Azure Key Vault https://vault.azure.net
Поиск с использованием ИИ Azure https://search.azure.com
Azure Logic Apps https://logic.azure.com
Azure API Management (уровень управления) https://management.azure.com
API, защищенный регистрацией приложения Microsoft Entra (включая APIM с OAuth) URI идентификатора приложения из регистрации приложения (например, api://<client-id>)

Совет

Если вы используете Azure API Management для защиты пользовательского API с помощью политики проверки OAuth 2.0, аудитория — это URI идентификатора Application от регистрации приложения, которая используется для защиты API, а не https://management.azure.com. Аудитория управляющей плоскости применяется только к операциям Azure Resource Manager на самом ресурсе APIM.

Для получения дополнительных сведений о том, как агенты проходят проверку подлинности с помощью Microsoft Entra ID, см. в разделе Удостоверение и проверка подлинности агента.

Поиск и проверка аудитории

Чтобы определить и проверить правильное значение аудитории, выполните следующие действия.

  • Для служб Azure: ознакомьтесь с документацией службы для получения идентификатора ресурса Microsoft Entra ID. Большинство служб Azure перечисляют универсальный код ресурса (URI) аудитории в документации по проверке подлинности.
  • Для API, защищенных регистрацией приложения Microsoft Entra: на портале Azure перейдите в раздел Microsoft Entra ID>Регистрация приложений>, выберите приложение >Экспонирование API. URI идентификатора приложения в верхней части страницы — это значение аудитории.
  • Чтобы проверить аудиторию токена: декодируйте токен https://jwt.ms доступа и проверьте утверждение aud. Значение aud должно соответствовать аудитории, ожидаемой целевой службой.

Настройка проверки подлинности управляемого удостоверения

Чтобы настроить проверку подлинности с помощью управляемого удостоверения, выполните следующее:

  1. Убедитесь, что для ресурса Foundry включена управляемая удостоверяющая личность, назначаемая системой.

    Снимок экрана, показывающий селектор управляемого удостоверения на портале Azure.

  2. Создайте ресурс для службы, к которой вы хотите подключиться через спецификацию OpenAPI.

  3. Назначьте правильный доступ к ресурсу.

    1. Выберите контроль доступа для ресурса.

    2. Выберите "Добавить " и добавьте назначение ролей в верхней части экрана.

      Скриншот с элементом выбора назначения ролей на портале Azure.

    3. Выберите нужное назначение роли, обычно требуется по крайней мере роль ЧИТАТЕЛЯ . Затем нажмите кнопку "Далее".

    4. Выберите управляемое удостоверение и выберите участников.

    5. В раскрывающемся меню управляемого удостоверения найдите учетную запись Foundry, а затем выберите ту, которая связана с вашим агентом.

    6. Нажмите кнопку "Готово".

  4. Завершив настройку, вы можете продолжить работу с помощью средства с помощью портала Foundry, пакета SDK или REST API. Используйте вкладки в верхней части этой статьи, чтобы просмотреть примеры кода.

Устранение распространенных ошибок

Симптом Вероятно, причина Разрешение
Ключ API не включен в запросы. Спецификация OpenAPI отсутствует в разделах securitySchemes или security. Убедитесь, что спецификация OpenAPI включает оба components.securitySchemes раздела и раздел верхнего уровня security . Убедитесь, что схема name совпадает с именем ключа в соединении проекта.
Агент не вызывает средство OpenAPI. Выбор средства не задан или operationId не является описательным. Используйте tool_choice="required" для принудительного вызова инструмента. Убедитесь, что operationId значения являются описательными, поэтому модель может выбрать правильную операцию.
Аутентификация не удается для управляемого удостоверения. Управляемая личность не включена или отсутствует назначение роли. Включите назначаемую системой управляемую идентичность для ресурса Foundry. Назначьте требуемую роль (Читатель или выше) целевой службе.
Управляемое удостоверение возвращает значение 401, даже если роль назначена. URI аудитории не соответствует тому, что ожидает целевая служба. Убедитесь, что URI аудитории соответствует идентификатору ресурса целевой службы. Сведения о службах Azure см. в документации по службе. Для защищённых API Microsoft Entra используйте URI идентификатора приложения из регистрации приложения. Декодировать маркер https://jwt.ms и подтвердить, что утверждение aud совпадает. См. Понимание URI аудитории.
Маркер токена управляемой удостоверенности был отклонен целевой API. Целевая служба не принимает токены Microsoft Entra ID. Убедитесь, что целевая служба поддерживает проверку подлинности Microsoft Entra ID. Если это не так, используйте вместо этого ключ API или проверку подлинности маркера носителя.
Запрос завершился с ошибкой 400 Bad Request. Спецификация OpenAPI не соответствует фактическому API. Проверьте спецификацию OpenAPI на основе фактического API. Проверьте имена параметров, типы и обязательные поля.
Запрос отклоняется с ошибкой 401 неавторизованный доступ. Ключ API или токен недопустим или истек. Повторно создайте ключ или токен API и обновите подключение проекта. Проверьте правильность идентификатора подключения.
Инструмент возвращает неожиданный формат отклика. Схема ответа не определена в спецификации OpenAPI. Добавьте схемы ответов в спецификацию OpenAPI, чтобы лучше понять модель.
operationId Ошибка проверки. Недопустимые символы в operationId. Используйте только буквы, -, и _ в значениях operationId. Удалите числа и специальные символы.
Ошибка: соединение не найдено. Несоответствие имени подключения или идентификатора. Убедитесь, что OPENAPI_PROJECT_CONNECTION_NAME совпадает с именем подключения в вашем проекте Foundry.
Маркер носителя не отправлен правильно. Отсутствует значение соединения префикса Bearer . Задайте значение Bearer <token> соединения (с словом Bearer и пробелом перед маркером). Проверьте, что спецификация OpenAPI securitySchemes используется "name": "Authorization".

Выбор метода проверки подлинности

В следующей таблице показано, как выбрать правильный метод проверки подлинности для средства OpenAPI:

Метод проверки подлинности Лучше всего для Сложность настройки
Анонимные Общедоступные API без проверки подлинности Низкий
Ключ API Сторонние API (не Microsoft) с доступом на основе ключей Средний
Управляемая идентичность Службы Azure и защищенные Microsoft Entra ID API. Требуется, чтобы целевая служба принимала маркеры Microsoft Entra ID и поддерживала Azure RBAC или управление доступом на основе Microsoft Entra. Средне-высокий