Skip to main content

BYOK (Bring Your Own Key)

BYOK ermöglicht es Ihnen, das Copilot SDK mit Ihren eigenen API-Schlüsseln von Modellanbietern zu verwenden, um GitHub Copilot Authentifizierung zu umgehen. Dies ist nützlich für Unternehmensbereitstellungen, benutzerdefiniertes Modellhosting oder wenn Sie eine direkte Abrechnung mit Ihrem Modellanbieter wünschen.

Unterstützte Anbieter

ProviderTypwertHinweise
OpenAI"openai"OpenAI-API und openAI-kompatible Endpunkte
Azure OpenAI / Azure AI Foundry
"azure"Azure gehostete Modelle
Anthropic"anthropic"Claude Modelle
Ollama"openai"Lokale Modelle mittels OpenAI-kompatibler API
Microsoft Entwicklungszentrum Local"openai"Lokales Ausführen von KI-Modellen auf Ihrem Gerät über openAI-kompatible API
Andere OpenAI-kompatible Produkte"openai"vLLM, LiteLLM usw.

Schnellstart: Azure AI Foundry

Azure AI Foundry (früher Azure OpenAI) ist ein gängiges BYOK-Bereitstellungsziel für Unternehmen. Hier ist ein vollständiges Beispiel:

Python
import asyncio
import os
from copilot import CopilotClient
from copilot.session import PermissionHandler

FOUNDRY_MODEL_URL = "https://your-resource.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())
TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const FOUNDRY_MODEL_URL = "https://your-resource.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();
Go
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://your-resource.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)
    }
}
.NET
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://your-resource.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);
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://your-resource.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();

Anbieterkonfigurationsreferenz

ProviderConfig-Felder

FeldTypDescription
type
"openai"
|
"azure"
|
"anthropic"
Anbietertyp (Standard: "openai")
baseUrl / base_urlstring
Erforderlich. API-Endpunkt-URL
apiKey / api_keystringAPI-Schlüssel (optional für lokale Anbieter wie Ollama)
bearerToken / bearer_tokenstringBearertokenauthentifizierung (hat Vorrang vor apiKey)
wireApi / wire_api
"completions"
|
"responses"
Wählen Sie "completions" für breite Modellkompatibilität (die Chat Completions API); wählen Sie "responses" für die Verwaltung des Konversationsstatus über mehrere Dialogrunden hinweg, Tool-Namensräume und Reasoning-Unterstützung (die Responses API). Anthropic Modelle verwenden unabhängig von dieser Einstellung immer die Nachrichten-API.
azure.apiVersion / azure.api_versionstringAzure API-Version (Standard: "2024-10-21")

Draht-API-Format

Die wireApi Einstellung bestimmt, welches OpenAI-API-Format verwendet werden soll:

  • "completions" (Standard) – API für Chat-Vervollständigungen (/chat/completions) für umfassende Modellkompatibilität.
  • "responses" - Responses API für die Verwaltung von Multi-Turn-Kontexten, Tool-Namensräumen und die Unterstützung für Reasoning.

Anthropic Modelle verwenden unabhängig von dieser Einstellung immer die Anthropic Nachrichten-API.

Typspezifische Notizen

OpenAI (type: "openai")

  • Funktioniert mit der OpenAI-API und jedem openAI-kompatiblen Endpunkt
  • baseUrl sollte den vollständigen Pfad enthalten (z. B. https://api.openai.com/v1)

Azure (type: "azure")

  • Verwendung für systemeigene Azure OpenAI-Endpunkte
  • baseUrl sollte nur der Host sein (z. B. https://my-resource.openai.azure.com)
  • Fügen Sie /openai/v1 NICHT in die URL ein – das SDK übernimmt die Pfaderstellung

Anthropic (type: "anthropic")

  • Für direkten Anthropic-API-Zugriff
  • Verwendet claudespezifisches API-Format

Beispielkonfigurationen

OpenAI direct

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

Azure OpenAI (nativer Azure-Endpunkt)

Verwenden Sie type: "azure" für Endpunkte bei *.openai.azure.com:

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

Azure AI Foundry

(OpenAI-kompatibler Endpunkt)

Für Azure AI Foundry -Bereitstellungen mit /openai/v1/ Endpunkten, verwenden Sie type: "openai".

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

Ollama (lokal)

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

Microsoft Entwicklungszentrum Local

mit Microsoft Foundry Local können Sie KI-Modelle lokal auf Ihrem eigenen Gerät mit einer openAI-kompatiblen API ausführen. Installieren Sie es über das Foundry Local CLI und richten Sie das SDK dann auf Ihren lokalen Endpunkt aus.

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

Hinweis

Foundry Local startet auf einem dynamischen Port – der Port ist nicht behoben. Verwenden Sie foundry service status, um zu bestätigen, an welchem Port der Dienst derzeit lauscht, und verwenden Sie dann diesen Port in Ihrem baseUrl.

Erste Schritte mit Foundry Local:

# 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

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

Bearertokenauthentifizierung

Einige Anbieter erfordern die Bearertokenauthentifizierung anstelle von API-Schlüsseln:

provider: {
    type: "openai",
    baseUrl: "https://my-custom-endpoint.example.com/v1",
    bearerToken: process.env.MY_BEARER_TOKEN,  // Sets Authorization header
}

Hinweis

Die bearerToken Option akzeptiert nur eine statische Tokenzeichenfolge . Das SDK aktualisiert dieses Token nicht automatisch. Wenn Ihr Token abläuft, schlagen Anforderungen fehl, und Sie müssen eine neue Sitzung mit einem neuen Token erstellen.

Auflistung benutzerdefinierter Modelle

Bei Verwendung von BYOK weiß der CLI-Server möglicherweise nicht, welche Modelle Ihr Anbieter unterstützt. Sie können einen benutzerdefinierten onListModels Handler auf Clientebene bereitstellen, sodass die client.listModels() Modelle Ihres Anbieters im Standardformat ModelInfo zurückgegeben werden. Auf diese Weise können nachgeschaltete Verbraucher verfügbare Modelle ermitteln, ohne die CLI abfragen zu müssen.

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 },
            },
        },
    ],
});
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),
            ),
        )
    ],
)
Go
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: 128000},
                    },
                },
            }, nil
        },
    })
    _ = client
}
.NET
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 }
            }
        }
    })
});
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)))
    )))
);

Ergebnisse werden nach dem ersten Aufruf wie das Standardverhalten zwischengespeichert. Der Handler ersetzt das RPC der CLI models.list vollständig – es erfolgt kein Fallback auf den Server.

Einschränkungen

Beachten Sie bei der Verwendung von BYOK die folgenden Einschränkungen:

Identitätseinschränkungen

BYOK-Authentifizierung verwendet nur statische Anmeldeinformationen.

Sie müssen einen API-Schlüssel oder statisches Bearertoken verwenden, das Sie selbst verwalten.

Featurebeschränkungen

Einige Copilot Features verhalten sich mit BYOK möglicherweise anders:

  • Modellverfügbarkeit – Es sind nur Modelle verfügbar, die von Ihrem Anbieter unterstützt werden.
  • Ratenbegrenzung – Abhängig von den Ratenlimits Ihres Anbieters, nicht von denen von Copilot
  • Nachverfolgung – Die Nutzung wird von Ihrem Anbieter nachverfolgt, nicht GitHub Copilot
  • Premiumanfragen – werden nicht auf die Kontingente für Copilot-Premiumanfragen angerechnet

Anbieterspezifische Einschränkungen

ProviderEinschränkungen
Azure AI Foundry
Keine Entra ID Authentifizierung; muss API-Schlüssel verwenden
OllamaKein API-Schlüssel; nur lokal; Modellunterstützung variiert
Microsoft Foundry LocalNur lokal; Die Modellverfügbarkeit hängt von der Gerätehardware ab; kein API-Schlüssel erforderlich
OpenAIVorbehaltlich von OpenAI-Tariflimits und -quoten

Troubleshooting

Fehler "Modell nicht angegeben"

Bei Verwendung von BYOK ist der model Parameter erforderlich:

// ❌ 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: "..." },
});

Verwirrung beim Azure-Endpunkttyp

Verwenden Sie für Azure OpenAI-Endpunkte (*.openai.azure.com) den richtigen Typ:

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

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-4.1",
    provider: {
        type: "azure",
        baseUrl: "https://my-resource.openai.azure.com",
    },
});
// ❌ 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",
}

Wenn Ihre Azure AI Foundry -Bereitstellung jedoch einen openAI-kompatiblen Endpunktpfad (z. B. /openai/v1/) bereitstellt, verwenden Sie type: "openai":

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

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-4.1",
    provider: {
        type: "openai",
        baseUrl: "https://your-resource.openai.azure.com/openai/v1/",
    },
});
// ✅ Correct: OpenAI-compatible Azure AI Foundry endpoint
provider: {
    type: "openai",
    baseUrl: "https://your-resource.openai.azure.com/openai/v1/",
}

Verbindung verweigert (Ollama)

Stellen Sie sicher, dass Ollama ausgeführt wird und barrierefrei ist:

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

# Start Ollama if not running
ollama serve

Verbindung verweigert (Foundry Local)

Foundry Local verwendet einen dynamischen Port, der sich zwischen Neustarts ändern kann. Bestätigen Sie den aktiven Port:

# Check the service status and port
foundry service status

Aktualisieren Sie Ihr baseUrl, damit es mit dem in der Ausgabe angezeigten Port übereinstimmt. Wenn der Dienst nicht ausgeführt wird, starten Sie ein Modell, um es zu starten:

foundry model run phi-4-mini

Fehler bei der Authentifizierung.

  1. Überprüfen, ob Der API-Schlüssel korrekt und nicht abgelaufen ist
  2. Überprüfen Sie, ob baseUrl dem von Ihrem Anbieter erwarteten Format entspricht.
  3. Stellen Sie für Bearertoken sicher, dass das vollständige Token bereitgestellt wird (nicht nur ein Präfix)

Nächste Schritte