# BYOK (traiga su propia clave)

BYOK te permite usar el SDK de Copilot con tus propias claves API de proveedores de modelos, sin pasar por la autenticación de GitHub Copilot. Esto es útil para las implementaciones empresariales, el hospedaje de modelos personalizados o cuando quiera facturar directamente con el proveedor de modelos.

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

## Proveedores compatibles

| Provider                       | Tipo de valor                                                                             | Notas                                                                                            |
| ------------------------------ | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| OpenAI                         | `"openai"`                                                                                | Api de OpenAI y puntos de conexión compatibles con OpenAI                                        |
| Microsoft Foundry/Azure OpenAI |                                                                                           |                                                                                                  |
| `"openai"` o `"azure"`         | Use `"openai"` para `"azure"`; use `/openai/v1/` para puntos de conexión nativos de Azure |                                                                                                  |
| Anthropic                      | `"anthropic"`                                                                             | Modelos de Claude                                                                                |
| Ollama                         | `"openai"`                                                                                | Modelos locales a través de la API compatible con OpenAI                                         |
| Microsoft Foundry local        | `"openai"`                                                                                | Ejecución de modelos de IA localmente en el dispositivo a través de la API compatible con OpenAI |
| Otros compatibles con OpenAI   | `"openai"`                                                                                | vLLM, LiteLLM, etc.                                                                              |

## Inicio rápido: Microsoft Foundry

Microsoft Foundry es un destino de implementación BYOK común para empresas. Este es un ejemplo completo:

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
import asyncio
import os
from copilot import CopilotClient
from copilot.session import PermissionHandler

FOUNDRY_MODEL_URL = "https://<resource-name>.openai.azure.com/openai/v1/"
# Set FOUNDRY_API_KEY environment variable

async def main():
    client = CopilotClient()
    await client.start()

    session = await client.create_session(on_permission_request=PermissionHandler.approve_all, model="gpt-5.2-codex", provider={
        "type": "openai",
        "base_url": FOUNDRY_MODEL_URL,
        "wire_api": "responses",  # Use "completions" for older models
        "api_key": os.environ["FOUNDRY_API_KEY"],
    })

    done = asyncio.Event()

    def on_event(event):
        if event.type.value == "assistant.message":
            print(event.data.content)
        elif event.type.value == "session.idle":
            done.set()

    session.on(on_event)
    await session.send("What is 2+2?")
    await done.wait()

    await session.disconnect()
    await client.stop()

asyncio.run(main())
```

</div>

<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient } from "@github/copilot-sdk";

const FOUNDRY_MODEL_URL = "https://<resource-name>.openai.azure.com/openai/v1/";

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-5.2-codex",  // Your deployment name
    provider: {
        type: "openai",
        baseUrl: FOUNDRY_MODEL_URL,
        wireApi: "responses",  // Use "completions" for older models
        apiKey: process.env.FOUNDRY_API_KEY,
    },
});

session.on("assistant.message", (event) => {
    console.log(event.data.content);
});

await session.sendAndWait({ prompt: "What is 2+2?" });
await client.stop();
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
package main

import (
    "context"
    "fmt"
    "os"
    copilot "github.com/github/copilot-sdk/go"
)

func main() {
    ctx := context.Background()
    client := copilot.NewClient(nil)
    if err := client.Start(ctx); err != nil {
        panic(err)
    }
    defer client.Stop()

    session, err := client.CreateSession(ctx, &copilot.SessionConfig{
        Model: "gpt-5.2-codex",  // Your deployment name
        Provider: &copilot.ProviderConfig{
            Type:    "openai",
            BaseURL: "https://<resource-name>.openai.azure.com/openai/v1/",
            WireAPI: "responses",  // Use "completions" for older models
            APIKey:  os.Getenv("FOUNDRY_API_KEY"),
        },
    })
    if err != nil {
        panic(err)
    }

    response, err := session.SendAndWait(ctx, copilot.MessageOptions{
        Prompt: "What is 2+2?",
    })
    if err != nil {
        panic(err)
    }

    if d, ok := response.Data.(*copilot.AssistantMessageData); ok {
        fmt.Println(d.Content)
    }
}
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;

await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(new SessionConfig
{
    Model = "gpt-5.2-codex",  // Your deployment name
    Provider = new ProviderConfig
    {
        Type = "openai",
        BaseUrl = "https://<resource-name>.openai.azure.com/openai/v1/",
        WireApi = "responses",  // Use "completions" for older models
        ApiKey = Environment.GetEnvironmentVariable("FOUNDRY_API_KEY"),
    },
});

var response = await session.SendAndWaitAsync(new MessageOptions
{
    Prompt = "What is 2+2?",
});
Console.WriteLine(response?.Data.Content);
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;

var client = new CopilotClient();
client.start().get();

var session = client.createSession(new SessionConfig()
    .setModel("gpt-5.2-codex")  // Your deployment name
    .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
    .setProvider(new ProviderConfig()
        .setType("openai")
        .setBaseUrl("https://<resource-name>.openai.azure.com/openai/v1/")
        .setWireApi("responses")  // Use "completions" for older models
        .setApiKey(System.getenv("FOUNDRY_API_KEY")))
).get();

var response = session.sendAndWait(new MessageOptions()
    .setPrompt("What is 2+2?")).get();
System.out.println(response.getData().content());

client.stop().get();
```

</div>

</div>

## Referencia de configuración del proveedor

### Campos ProviderConfig

| Campo                                                                                                                                                                                                                                                                                                                                                                                 | Tipo     | Description                                                                                                                                                                                  |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type`                                                                                                                                                                                                                                                                                                                                                                                |          |                                                                                                                                                                                              |
| `"openai"`                                                                                                                                                                                                                                                                                                                                                                            |          |                                                                                                                                                                                              |
| \|                                                                                                                                                                                                                                                                                                                                                                                    |          |                                                                                                                                                                                              |
| `"azure"`                                                                                                                                                                                                                                                                                                                                                                             |          |                                                                                                                                                                                              |
| \|                                                                                                                                                                                                                                                                                                                                                                                    |          |                                                                                                                                                                                              |
| `"anthropic"`                                                                                                                                                                                                                                                                                                                                                                         |          |                                                                                                                                                                                              |
| Tipo de proveedor (valor predeterminado: `"openai"`)                                                                                                                                                                                                                                                                                                                                  |          |                                                                                                                                                                                              |
| `baseUrl` / `base_url`                                                                                                                                                                                                                                                                                                                                                                | string   |                                                                                                                                                                                              |
| **Obligatorio.** Dirección URL del punto de conexión de API                                                                                                                                                                                                                                                                                                                           |          |                                                                                                                                                                                              |
| `apiKey` / `api_key`                                                                                                                                                                                                                                                                                                                                                                  | string   | Clave de API (opcional para proveedores locales como Ollama)                                                                                                                                 |
| `bearerToken` / `bearer_token`                                                                                                                                                                                                                                                                                                                                                        | string   | Autenticación de token de portador (tiene prioridad sobre apiKey)                                                                                                                            |
| `bearerTokenProvider` / `bearer_token_provider`                                                                                                                                                                                                                                                                                                                                       | callback | Devuelve un token de portador a petición (tiene prioridad sobre `apiKey` y `bearerToken`)                                                                                                    |
| `wireApi` / `wire_api`                                                                                                                                                                                                                                                                                                                                                                |          |                                                                                                                                                                                              |
| `"completions"`                                                                                                                                                                                                                                                                                                                                                                       |          |                                                                                                                                                                                              |
| \|                                                                                                                                                                                                                                                                                                                                                                                    |          |                                                                                                                                                                                              |
| `"responses"`                                                                                                                                                                                                                                                                                                                                                                         |          |                                                                                                                                                                                              |
| Seleccione `"completions"` para una amplia compatibilidad de modelos (la API de finalizaciones de chat); seleccione `"responses"` para la administración del estado en varios turnos, el espacio de nombres de las herramientas y la compatibilidad con razonamiento (la API de respuestas). Anthropic modelos siempre usan la API Messages independientemente de esta configuración. |          |                                                                                                                                                                                              |
| `azure.apiVersion` / `azure.api_version`                                                                                                                                                                                                                                                                                                                                              | string   | Versión de la API de Azure. Cuando se establece, el entorno de ejecución usa la ruta de implementación con versión; cuando se omite, usa la ruta `v1` sin versión de disponibilidad general. |

### Formato de WIRE API

La `wireApi` configuración determina qué formato de API de OpenAI se va a usar:

* **`"completions"`** (valor predeterminado): API de finalizaciones de chat (`/chat/completions`) para una amplia compatibilidad del modelo.
* **`"responses"`** - API de respuestas para la administración del estado en varios turnos, los espacios de nombres para herramientas y el soporte para razonamiento.

Anthropic modelos usan siempre la API de mensajes de Anthropic independientemente de esta configuración.

### Notas específicas del tipo

**OpenAI (`type: "openai"`)**

* Funciona con la API de OpenAI y cualquier punto de conexión compatible con OpenAI
* `baseUrl` debe incluir la ruta de acceso completa (por ejemplo, `https://api.openai.com/v1`)

**Azure (`type: "azure"`)**

* Usar para puntos de conexión nativos de Azure OpenAI
* `baseUrl` debe ser solo el host (por ejemplo, `https://my-resource.openai.azure.com`)
* No incluir `/openai/v1` en la dirección URL: el SDK controla la construcción de la ruta de acceso.

**Antrópica (`type: "anthropic"`)**

* Para el acceso directo a la API de Anthropic
* Usa el formato de API específico de Claude

## Configuraciones de ejemplo

### OpenAI canal directo

```typescript
provider: {
    type: "openai",
    baseUrl: "https://api.openai.com/v1",
    apiKey: process.env.OPENAI_API_KEY,
}
```

### Azure OpenAI (punto de conexión nativo de Azure)

Use `type: "azure"` para puntos de conexión en `*.openai.azure.com`:

```typescript
provider: {
    type: "azure",
    baseUrl: "https://my-resource.openai.azure.com",  // Just the host
    apiKey: process.env.AZURE_OPENAI_KEY,
    azure: {
        apiVersion: "2024-10-21",
    },
}
```

### Microsoft Foundry (punto de conexión compatible con OpenAI)

Para las implementaciones de Microsoft Foundry con puntos de conexión `/openai/v1/`, use `type: "openai"`:

```typescript
provider: {
    type: "openai",
    baseUrl: "https://<resource-name>.openai.azure.com/openai/v1/",
    apiKey: process.env.FOUNDRY_API_KEY,
    wireApi: "responses",  // For GPT-5 series models
}
```

### Ollama (local)

```typescript
provider: {
    type: "openai",
    baseUrl: "http://localhost:11434/v1",
    // No apiKey needed for local Ollama
}
```

### Microsoft Foundry local

[Microsoft Foundry Local](https://foundrylocal.ai) permite ejecutar modelos de INTELIGENCIA ARTIFICIAL localmente en su propio dispositivo con una API compatible con OpenAI. Instálelo a través de la CLI local de Foundry y, a continuación, apunte el SDK en el punto de conexión local:

```typescript
provider: {
    type: "openai",
    baseUrl: "http://localhost:<PORT>/v1",
    // No apiKey needed for local Foundry Local
}
```

> \[!NOTE]
> Foundry Local se inicia en un **puerto dinámico**; el puerto no es fijo. Use `foundry service status` para confirmar el puerto en el que el servicio está escuchando actualmente y, a continuación, use ese puerto en `baseUrl`.

Para empezar a trabajar con Foundry Local:

```bash
# Windows: Install Foundry Local CLI (requires winget)
winget install Microsoft.FoundryLocal

# macOS / Linux: see https://foundrylocal.ai for installation instructions
# List available models
foundry model list

# Run a model (starts the local server automatically)
foundry model run phi-4-mini

# Check the port the service is running on
foundry service status
```

### Anthropic

```typescript
provider: {
    type: "anthropic",
    baseUrl: "https://api.anthropic.com",
    apiKey: process.env.ANTHROPIC_API_KEY,
}
```

### Autenticación por token de portador

Algunos proveedores requieren autenticación de token de portador en lugar de claves de API. Proporcione un token estático con `bearerToken` o un `bearerTokenProvider` callback que el tiempo de ejecución del SDK de GitHub Copilot invoque antes de las solicitudes salientes al proveedor. El callback o la biblioteca de identidades que este envuelve administra el almacenamiento en caché y la actualización de los tokens.

Use `bearerToken` cuando la aplicación ya tenga un token:

```typescript
provider: {
    type: "openai",
    baseUrl: "https://<resource-name>.openai.azure.com/openai/v1/",
    bearerToken: process.env.MY_BEARER_TOKEN,  // Sets Authorization header
}
```

> \[!NOTE]
> La `bearerToken` opción solo acepta una **cadena de token estática** . El SDK no actualiza este token automáticamente. Si el token expira, se producirá un error en las solicitudes y deberá crear una nueva sesión con un token nuevo.

Utilice `bearerTokenProvider` para obtener tokens bajo demanda:

<!-- docs-validate: skip -->

```typescript
provider: {
    type: "openai",
    baseUrl: "https://my-custom-endpoint.example.com/v1",
    bearerTokenProvider: async () => {
        return await acquireBearerToken();
    },
}
```

Para obtener más información sobre cómo adquirir y actualizar tokens de portador de Microsoft Entra, consulte [Identidad administrada de Azure con BYOK](/es/copilot/how-tos/copilot-sdk/setup/azure-managed-identity).

## Lista de modelos personalizados

Al usar BYOK, es posible que el servidor de la CLI no sepa qué modelos admite el proveedor. Puede proporcionar un controlador personalizado `onListModels` en el nivel de cliente para que `client.listModels()` devuelva los modelos del proveedor en el formato estándar `ModelInfo` . Esto permite a los consumidores de nivel inferior detectar modelos disponibles sin consultar la CLI.

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient } from "@github/copilot-sdk";
import type { ModelInfo } from "@github/copilot-sdk";

const client = new CopilotClient({
    onListModels: () => [
        {
            id: "my-custom-model",
            name: "My Custom Model",
            capabilities: {
                supports: { vision: false, reasoningEffort: false },
                limits: { max_context_window_tokens: 128000 },
            },
        },
    ],
});
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient
from copilot.client import ModelInfo, ModelCapabilities, ModelSupports, ModelLimits

client = CopilotClient(
    on_list_models=lambda: [
        ModelInfo(
            id="my-custom-model",
            name="My Custom Model",
            capabilities=ModelCapabilities(
                supports=ModelSupports(vision=False, reasoning_effort=False),
                limits=ModelLimits(max_context_window_tokens=128000),
            ),
        )
    ],
)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
package main

import (
    "context"
    copilot "github.com/github/copilot-sdk/go"
)

func main() {
    client := copilot.NewClient(&copilot.ClientOptions{
        OnListModels: func(ctx context.Context) ([]copilot.ModelInfo, error) {
            return []copilot.ModelInfo{
                {
                    ID:   "my-custom-model",
                    Name: "My Custom Model",
                    Capabilities: copilot.ModelCapabilities{
                        Supports: copilot.ModelSupports{Vision: false, ReasoningEffort: false},
                        Limits:   copilot.ModelLimits{MaxContextWindowTokens: copilot.Int(128000)},
                    },
                },
            }, nil
        },
    })
    _ = client
}
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
using GitHub.Copilot;

var client = new CopilotClient(new CopilotClientOptions
{
    OnListModels = (ct) => Task.FromResult<IList<ModelInfo>>(new List<ModelInfo>
    {
        new()
        {
            Id = "my-custom-model",
            Name = "My Custom Model",
            Capabilities = new ModelCapabilities
            {
                Supports = new ModelSupports { Vision = false, ReasoningEffort = false },
                Limits = new ModelLimits { MaxContextWindowTokens = 128000 }
            }
        }
    })
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;
import java.util.List;
import java.util.concurrent.CompletableFuture;

var client = new CopilotClient(new CopilotClientOptions()
    .setOnListModels(() -> CompletableFuture.completedFuture(List.of(
        new ModelInfo()
            .setId("my-custom-model")
            .setName("My Custom Model")
            .setCapabilities(new ModelCapabilities()
                .setSupports(new ModelSupports().setVision(false).setReasoningEffort(false))
                .setLimits(new ModelLimits().setMaxContextWindowTokens(128000)))
    )))
);
```

</div>

</div>

Los resultados se almacenan en caché después de la primera llamada, al igual que el comportamiento predeterminado. El controlador reemplaza completamente la RPC de `models.list` la CLI; no ocurre ningún mecanismo de respaldo al servidor.

## Limitaciones

### Limitaciones de características

Algunas características de Copilot pueden comportarse de forma diferente con BYOK:

* **Disponibilidad del modelo** : solo están disponibles los modelos admitidos por el proveedor.
* **Limitación de tasa** - Sujeto a los límites de tasa de tu proveedor, no a los de Copilot
* **Usage tracking**: el proveedor realiza un seguimiento del uso, no GitHub Copilot
* **Solicitudes premium** - No cuentan para las cuotas de solicitudes premium de Copilot

### Limitaciones específicas del proveedor

| Provider                                           | Limitaciones                                                                                                       |
| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| [Microsoft Foundry Local](https://foundrylocal.ai) | Solo local; la disponibilidad del modelo depende del hardware del dispositivo; no se requiere ninguna clave de API |
| Ollama                                             | Sin clave de API; solo local; La compatibilidad del modelo varía                                                   |
| OpenAI                                             | Sujeto a límites y cuotas de tasa de OpenAI                                                                        |

## Solución de problemas

### Error "No se ha especificado el modelo"

Cuando se usa BYOK, se `model` el \*\*\*\* parámetro :

```typescript
// ❌ Error: Model required with custom provider
const session = await client.createSession({
    provider: { type: "openai", baseUrl: "..." },
});

// ✅ Correct: Model specified
const session = await client.createSession({
    model: "gpt-4",  // Required!
    provider: { type: "openai", baseUrl: "..." },
});
```

### Confusión del tipo de punto de conexión de Azure

Para los puntos de conexión de Azure OpenAI (`*.openai.azure.com`), use el tipo correcto:

```typescript
// ❌ Wrong: Using "openai" type with native Azure endpoint
provider: {
    type: "openai",  // This won't work correctly
    baseUrl: "https://my-resource.openai.azure.com",
}

// ✅ Correct: Using "azure" type
provider: {
    type: "azure",
    baseUrl: "https://my-resource.openai.azure.com",
}
```

Sin embargo, si la implementación de Microsoft Foundry proporciona una ruta de acceso de un punto de conexión compatible con OpenAI (por ejemplo, `/openai/v1/`), use `type: "openai"`:

```typescript
// ✅ Correct: OpenAI-compatible Microsoft Foundry endpoint
provider: {
    type: "openai",
    baseUrl: "https://your-resource.openai.azure.com/openai/v1/",
}
```

### Conexión rechazada (Ollama)

Asegúrese de que Ollama está en ejecución y accesible:

```bash
# Check Ollama is running
curl http://localhost:11434/v1/models

# Start Ollama if not running
ollama serve
```

### Conexión rechazada (Fundición Local)

Foundry Local usa un puerto dinámico que puede cambiar entre reinicios. Confirme el puerto activo:

```bash
# Check the service status and port
foundry service status
```

Actualiza tu `baseUrl` para que coincida con el puerto que se muestra en la salida. Si el servicio no se está ejecutando, inicie un modelo para iniciarlo:

```bash
foundry model run phi-4-mini
```

### Error de autenticación

1. Compruebe que la clave de API es correcta y no ha expirado
2. Compruebe que coincide con el `baseUrl` formato esperado del proveedor
3. Para los tokens de portador, asegúrese de que se proporciona el token completo (no solo un prefijo).

## Pasos siguientes

* [Autenticación](/es/copilot/how-tos/copilot-sdk/auth) : obtenga información sobre todos los métodos de autenticación.
* [Crea tu primera aplicación con tecnología Copilot](/es/copilot/how-tos/copilot-sdk/getting-started): compile la primera aplicación con tecnología de Copilot