Примечание.
Второй пилот SDK в настоящее время находится в Technical Preview. Функциональность и доступность могут меняться.
Поскольку развертывания Azure часто используют управляемую идентичность (Entra ID) вместо долгоживущих ключей, для использования режима Второй пилот SDKBYOK в . Поскольку SDK не поддерживает нативную аутентификацию Entra ID, вы можете использовать кратковременный токен носителя через поле токена носителя в конфигурации провайдера (bearer_token на Python, bearerToken в Node.js / TypeScript и .NET).
В этом руководстве показано, как использовать DefaultAzureCredential из библиотеки Azure Identity аутентификацию с помощью Azure AI Foundry моделей через Второй пилот SDK.
Принцип работы
Совместимая с OpenAI конечная точка Azure AI Foundry принимает носитель-токены из Entra ID вместо статических API-ключей. Шаблон:
- Используйте
DefaultAzureCredentialдля получения токена дляhttps://cognitiveservices.azure.com/.defaultобласти объёма. - Передайте токен с помощью поля токена носителя в конфигурации провайдера BYOK (
bearer_tokenна Python,bearerTokenв Node.js / TypeScript и .NET). - Обновите токен до истечения срока действия. Токены обычно действительны около одного часа.

Необходимые условия
- Подписка Azure с развернутым ресурсом Azure AI Foundry.
- Установлена библиотека Azure Identity (
azure-identityдля Python,@azure/identityдля Node.jsилиAzure.Identityдля .NET). -
Второй пилот SDK установлен. Дополнительные сведения см. в разделе [AUTOTITLE](/copilot/how-tos/copilot-sdk/sdk-getting-started).
Пример Python
Установка зависимостей
pip install github-copilot-sdk azure-identity
Основное использование
import asyncio
import os
from azure.identity import DefaultAzureCredential
from copilot import CopilotClient, PermissionHandler
COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default"
async def main():
# Get a token using Managed Identity, Azure CLI, or other credential chain
credential = DefaultAzureCredential()
token = credential.get_token(COGNITIVE_SERVICES_SCOPE).token
foundry_url = os.environ["AZURE_AI_FOUNDRY_RESOURCE_URL"]
client = CopilotClient()
await client.start()
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
model="gpt-4.1",
provider={
"type": "openai",
"base_url": f"{foundry_url.rstrip('/')}/openai/v1/",
"bearer_token": token, # Short-lived bearer token
"wire_api": "responses",
},
)
response = await session.send_and_wait({"prompt": "Hello from Managed Identity!"})
print(response.data.content)
await client.stop()
asyncio.run(main())
Замените AZURE_AI_FOUNDRY_RESOURCE_URL на переменную окружения, содержащую URL ресурса Azure AI Foundry (например, https://myresource.openai.azure.com).
Обновление токена для долгосрочных приложений
Жетоны предъявителя истекают примерно через час. Для серверов или долгоработающих агентов обновляйте токен перед созданием каждой сессии:
from azure.identity import DefaultAzureCredential
from copilot import CopilotClient, PermissionHandler
COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default"
class ManagedIdentityCopilotAgent:
"""Copilot agent that refreshes Entra ID tokens for Azure AI Foundry."""
def __init__(self, foundry_url: str, model: str = "gpt-4.1"):
self.foundry_url = foundry_url.rstrip("/")
self.model = model
self.credential = DefaultAzureCredential()
self.client = CopilotClient()
def _get_provider_config(self) -> dict:
"""Build a provider config dict with a fresh bearer token."""
token = self.credential.get_token(COGNITIVE_SERVICES_SCOPE).token
return {
"type": "openai",
"base_url": f"{self.foundry_url}/openai/v1/",
"bearer_token": token,
"wire_api": "responses",
}
async def chat(self, prompt: str) -> str:
"""Send a prompt and return the response text."""
# Fresh token for each session
provider = self._get_provider_config()
session = await self.client.create_session(
on_permission_request=PermissionHandler.approve_all,
model=self.model,
provider=provider,
)
response = await session.send_and_wait({"prompt": prompt})
await session.disconnect()
return response.data.content if response else ""
Node.js / пример TypeScript
import { DefaultAzureCredential } from "@azure/identity";
import { CopilotClient } from "@github/copilot-sdk";
const credential = new DefaultAzureCredential();
const tokenResponse = await credential.getToken(
"https://cognitiveservices.azure.com/.default"
);
const client = new CopilotClient();
const session = await client.createSession({
model: "gpt-4.1",
provider: {
type: "openai",
baseUrl: `${process.env.AZURE_AI_FOUNDRY_RESOURCE_URL}/openai/v1/`,
bearerToken: tokenResponse.token,
wireApi: "responses",
},
});
const response = await session.sendAndWait({ prompt: "Hello!" });
console.log(response?.data.content);
await client.stop();
Пример .NET
using Azure.Identity;
using GitHub.Copilot;
var credential = new DefaultAzureCredential();
var token = await credential.GetTokenAsync(
new Azure.Core.TokenRequestContext(
new[] { "https://cognitiveservices.azure.com/.default" }));
await using var client = new CopilotClient();
var foundryUrl = Environment.GetEnvironmentVariable("AZURE_AI_FOUNDRY_RESOURCE_URL");
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-4.1",
Provider = new ProviderConfig
{
Type = "openai",
BaseUrl = $"{foundryUrl!.TrimEnd('/')}/openai/v1/",
BearerToken = token.Token,
WireApi = "responses",
},
});
var response = await session.SendAndWaitAsync(
new MessageOptions { Prompt = "Hello from Managed Identity!" });
Console.WriteLine(response?.Data.Content);
Конфигурация среды
Требуется следующая переменная среды:
| Variable | Описание | Пример |
|---|---|---|
AZURE_AI_FOUNDRY_RESOURCE_URL | URL ресурса Azure AI Foundry | https://myresource.openai.azure.com |
Не требуется переменная окружения ключа API — аутентификация осуществляется DefaultAzureCredentialс помощью , который автоматически поддерживает:
-
**Управляемая идентичность** (системная или пользовательская) для приложений, размещённых на Azure. -
**Azure CLI** (`az login`) для локальной разработки. -
**Переменные среды** (`AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`) для принципов сервисов. -
**Идентификация рабочей** нагрузки для Kubernetes.
Полная цепочка учетных данных см. документацию DefaultAzureCredential.
Когда следует использовать этот шаблон
| Сценарий | Recommendation |
|---|---|
| Azure-хостируемое приложение с управляемой идентичностью | Используйте этот узор. |
| App with existing Azure AD service principal | Используйте этот узор. |
Местное развитие с az login | Используйте этот узор. |
| Не-Azure среда со статическим API-ключом | Используйте стандартный BYOK. Для получения дополнительной информации смотрите BYOK в github/copilot-sdk репозитории. |
GitHub Copilot Доступна подписка | Используйте GitHub OAuth. Для получения дополнительной информации смотрите [GitHub OAuth](https://github.com/github/copilot-sdk/blob/main/docs/setup/github-oauth.md) в `github/copilot-sdk` репозитории. |
Дополнительные материалы
- Для статической конфигурации ключа API см. BYOK в
github/copilot-sdkрепозитории. - Для развертывания на стороне сервера см. Настройка Copilot SDK для бэкенд-сервисов.
- Документация по библиотеке Azure Identity см. обзор клиентской библиотеки Azure Identity.