Skip to main content

Identidad administrada de Azure con BYOK

El SDK de Copilot BYOK (bring your own key) acepta claves de API estáticas, pero las implementaciones de Azure suelen usar Managed Identity (Entra ID) en lugar de claves de larga duración. Dado que el SDK no admite de forma nativa la autenticación de Entra ID, puede usar un token de portador de corta duración mediante el campo de configuración del proveedor bearer_token.

En esta guía se muestra cómo usar DefaultAzureCredential desde la biblioteca Azure Identity para autenticarse con modelos de Fundición de IA de Azure a través del SDK de Copilot.

Cómo funciona

El punto de conexión compatible con OpenAI de Fundición de IA de Azure acepta tokens de portador de Entra ID en lugar de claves de API estáticas. El patrón es:

  1. Uso DefaultAzureCredential para obtener un token para el https://cognitiveservices.azure.com/.default ámbito
  2. Pase el token como bearer_token en la configuración del proveedor BYOK
  3. Actualice el token antes de que expire (los tokens suelen ser válidos durante aproximadamente 1 hora)

Diagrama: diagrama de secuencia que muestra el proceso descrito.

ejemplo de Python

Prerequisites

pip install github-copilot-sdk azure-identity

Uso básico

import asyncio
import os

from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig

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=ProviderConfig(
            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("Hello from Managed Identity!")
    print(response.data.content)

    await client.stop()

asyncio.run(main())

Actualización de tokens para aplicaciones de ejecución prolongada

Los tokens de portador expiran (normalmente después de aproximadamente 1 hora). En el caso de los servidores o agentes de ejecución prolongada, actualice el token antes de crear cada sesión:

from azure.identity import DefaultAzureCredential
from copilot import CopilotClient
from copilot.session import PermissionHandler, ProviderConfig

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) -> ProviderConfig:
        """Build a ProviderConfig with a fresh bearer token."""
        token = self.credential.get_token(COGNITIVE_SERVICES_SCOPE).token
        return ProviderConfig(
            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
        session = await self.client.create_session(
            on_permission_request=PermissionHandler.approve_all,
            model=self.model,
            provider=self._get_provider_config(),
        )

        response = await session.send_and_wait(prompt)
        await session.disconnect()

        return response.data.content if response else ""

ejemplo de 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();

ejemplo de .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);

Configuración de entorno

VariableDescriptionExample
AZURE_AI_FOUNDRY_RESOURCE_URLDirección URL del recurso de Fundición de IA de Azurehttps://myresource.openai.azure.com

No se necesita ninguna variable de entorno de clave de API: la autenticación se controla mediante DefaultAzureCredential, que admite automáticamente:

  • Managed Identity (asignada por el sistema o asignada por el usuario): para aplicaciones hospedadas Azure
  • CLI de Azure (az login): para el desarrollo local
  • Variables de entorno (AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET): para entidades de servicio
  • Identidad de carga de trabajo: para Kubernetes

Consulte la documentación de DefaultAzureCredential para obtener la cadena de credenciales completa.

Cuándo usar este patrón

EscenarioRecomendación
Aplicación hospedada en Azure con identidad administrada
✅ Usa este patrón
Aplicación con una entidad de servicio de Azure AD existente
✅ Utiliza este patrón
Desarrollo local con az login
✅ Use este patrón
Entorno que no es de Azure con clave de API estáticaUse BYOK (bring your own key)
GitHub Copilot suscripción disponibleUse Configuración de OAuth de GitHub

Consulte también