注意
Copilot SDK 目前处于公开预览阶段。功能和可用性可能会更改。
自带密钥 (BYOK) 允许你在使用 Copilot SDK 时使用来自模型提供商的自有 API 密钥,绕过 GitHub Copilot 身份验证。这在企业部署、自定义模型托管,或希望直接向模型提供商计费的场景中非常有用。
支持的提供商
| 提供商 | 类型值 | 注意 |
|---|---|---|
| OpenAI | "openai" | OpenAI API 和兼容 OpenAI 的端点 |
| Azure OpenAI / Azure AI Foundry | "azure" 或 "openai" | Azure 托管的模型(参见 Azure 端点类型) |
| Anthropic | "anthropic" | Claude 模型 |
| Ollama | "openai" | 通过兼容 OpenAI 的 API 使用本地模型 |
| Microsoft Foundry Local | "openai" | 在你的设备上本地运行 AI 模型,使用兼容 OpenAI 的 API |
| 其他兼容 OpenAI 的提供商 | "openai" | vLLM、LiteLLM 等类似服务 |
快速入门:Azure AI Foundry
Azure AI Foundry(前称 Azure OpenAI)是企业常用的 BYOK 部署目标。下面的示例展示了完整的 Node.js/TypeScript 设置。
-
使用你的 Azure AI Foundry 端点和 API 密钥创建会话
TypeScript import { CopilotClient } from "@github/copilot-sdk"; const client = new CopilotClient(); const session = await client.createSession({ model: "YOUR-DEPLOYMENT-NAME", provider: { type: "openai", baseUrl: "https://YOUR-RESOURCE.openai.azure.com/openai/v1/", 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();import { CopilotClient } from "@github/copilot-sdk"; const client = new CopilotClient(); const session = await client.createSession({ model: "YOUR-DEPLOYMENT-NAME", provider: { type: "openai", baseUrl: "https://YOUR-RESOURCE.openai.azure.com/openai/v1/", 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();
将 YOUR-RESOURCE 替换为你的 Azure 资源名称,将 YOUR-DEPLOYMENT-NAME 替换为模型部署名称。将 FOUNDRY_API_KEY 环境变量设置为你的 Azure API 密钥。
有关 Python、Go 和 .NET 示例,请参见 BYOK(位于 github/copilot-sdk 仓库)。Java 示例请参见 github/copilot-sdk-java 仓库。
提供商配置参考
ProviderConfig 字段
| 字段 | 类型 | 描述 |
|---|---|---|
type | "openai" | "azure" | "anthropic" | 提供商类型。默认值为 "openai"。 |
baseUrl | string | 必填。 API 端点 URL。 |
apiKey | string | API 密钥。对本地提供商(如 Ollama)为可选项。 |
bearerToken | string | Bearer Token 认证。会覆盖 apiKey。 |
wireApi | "completions" | "responses" | API 格式。默认值为 "completions"。 |
azure.apiVersion | string | Azure API 版本。默认值为 "2024-10-21"。 |
Wire API 格式
wireApi 设置决定使用哪种 OpenAI API 格式
"completions"(默认):Chat Completions API(/chat/completions)。适用于大多数模型。"responses":Responses API。用于支持新版 responses 格式的 GPT-5 系列模型。
类型特定说明
OpenAI(type: "openai")
- 适用于 OpenAI API 以及任何兼容 OpenAI 的端点。
baseUrl必须包含完整路径,例如https://api.openai.com/v1。
Azure(type: "azure")
- 用于原生 Azure OpenAI 端点。
baseUrl只需写主机,例如https://YOUR-RESOURCE.openai.azure.com。- 不要在 URL 中加入
/openai/v1——SDK 会自行构造完整路径。
Anthropic(type: "anthropic")
- 用于直接访问 Anthropic API。
- 使用 Claude 专有的 API 格式。
示例配置
OpenAI 直连
provider: {
type: "openai",
baseUrl: "https://api.openai.com/v1",
apiKey: process.env.OPENAI_API_KEY,
}
provider: {
type: "openai",
baseUrl: "https://api.openai.com/v1",
apiKey: process.env.OPENAI_API_KEY,
}
Azure OpenAI(原生 Azure 端点)
对 *.openai.azure.com 的端点使用 type: "azure"
provider: {
type: "azure",
baseUrl: "https://YOUR-RESOURCE.openai.azure.com", // Just the host
apiKey: process.env.AZURE_OPENAI_KEY,
azure: {
apiVersion: "2024-10-21",
},
}
provider: {
type: "azure",
baseUrl: "https://YOUR-RESOURCE.openai.azure.com", // Just the host
apiKey: process.env.AZURE_OPENAI_KEY,
azure: {
apiVersion: "2024-10-21",
},
}
将 YOUR-RESOURCE 替换为你的 Azure 资源名称。
Azure AI Foundry(兼容 OpenAI 的端点)
对于带有 /openai/v1/ 路径的 Azure AI Foundry 部署,使用 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
}
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(本地)
provider: {
type: "openai",
baseUrl: "https://:11434/v1",
// No apiKey needed for local Ollama
}
provider: {
type: "openai",
baseUrl: "https://:11434/v1",
// No apiKey needed for local Ollama
}
Microsoft Foundry Local
Microsoft Foundry Local 让你在本地运行 AI 模型,并提供兼容 OpenAI 的 API。先通过 Foundry Local CLI 安装,然后将 SDK 指向你的本地端点。
provider: {
type: "openai",
baseUrl: "https://:YOUR-PORT/v1",
// No apiKey needed for local Foundry Local
}
provider: {
type: "openai",
baseUrl: "https://:YOUR-PORT/v1",
// No apiKey needed for local Foundry Local
}
注意
Foundry Local 会在启动时使用动态端口,端口不是固定的。运行 foundry service status 可确认当前服务监听的端口,然后在 baseUrl 中使用该端口。
开始使用 Foundry Local 的步骤
# Windows: Install Foundry Local CLI (requires winget) winget install Microsoft.FoundryLocal # 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
# Windows: Install Foundry Local CLI (requires winget)
winget install Microsoft.FoundryLocal
# 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
macOS / Linux 安装请参考 foundrylocal.ai。
Anthropic
provider: {
type: "anthropic",
baseUrl: "https://api.anthropic.com",
apiKey: process.env.ANTHROPIC_API_KEY,
}
provider: {
type: "anthropic",
baseUrl: "https://api.anthropic.com",
apiKey: process.env.ANTHROPIC_API_KEY,
}
Bearer Token 认证
部分提供商需要使用 Bearer Token 而不是 API 密钥进行认证
provider: {
type: "openai",
baseUrl: "https://YOUR-CUSTOM-ENDPOINT.example.com/v1",
bearerToken: process.env.MY_BEARER_TOKEN, // Sets Authorization header
}
provider: {
type: "openai",
baseUrl: "https://YOUR-CUSTOM-ENDPOINT.example.com/v1",
bearerToken: process.env.MY_BEARER_TOKEN, // Sets Authorization header
}
注意
bearerToken 选项仅接受静态的 Token 字符串。SDK 不会自动刷新该 Token。若 Token 失效,所有请求将失败,你需要使用新 Token 创建会话。
自定义模型列表
使用 BYOK 时,CLI 服务器可能不知道你的提供商支持哪些模型。你可以在客户端层提供自定义的 onListModels 处理函数,使 client.listModels() 返回符合标准 ModelInfo 格式的模型列表。
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 },
},
},
],
});
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 },
},
},
],
});
首次调用后结果会被缓存。该处理函数会完全替代 CLI 的 models.list RPC——不会回退到服务器。
有关 Python、Go 和 .NET 示例,请参见 BYOK(位于 github/copilot-sdk 仓库)。Java 示例请参见 github/copilot-sdk-java 仓库。
限制
身份限制
BYOK 认证仅支持静态凭证。以下身份提供商不受支持:
- Microsoft Entra ID(Azure AD)——不支持 Entra 托管身份或服务主体。
- 第三方身份提供商——不支持 OIDC、SAML 或其他联合身份。
- 托管身份——不支持 Azure 托管身份。
必须使用你自行管理的 API 密钥或静态 Bearer Token。
注意
虽然 Entra ID 会颁发 Bearer Token,但这些 Token 短期有效(通常约一小时),且需要通过 Azure Identity SDK 自动刷新。bearerToken 选项仅接受静态字符串——没有回调机制让 SDK 自动获取新 Token。对于需要长期运行且依赖 Entra 认证的工作负载,你必须自行实现 Token 刷新逻辑并使用更新后的 Token 创建新会话。
功能限制
某些 Copilot 功能在 BYOK 环境下可能表现不同
- 模型可用性:仅限你的提供商支持的模型。
- 速率限制:受限于你的提供商的速率限制,而非 Copilot 本身。
- 使用统计:由你的提供商追踪,而非 GitHub。
- 高级请求:不计入 Copilot 的高级请求配额。
提供商特定限制
| 提供商 | 限制 |
|---|---|
| Azure AI Foundry | 不支持 Entra ID 认证;必须使用 API 密钥。 |
| Ollama | 无 API 密钥;仅本地;模型支持视具体实现而定。 |
| Microsoft Foundry Local | 仅本地;模型可用性取决于设备硬件;不需要 API 密钥。 |
| OpenAI | 受 OpenAI 速率限制和配额约束。 |
故障排除
"未指定模型" 错误
使用 BYOK 时,model 参数是必需的
// 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",
provider: { type: "openai", baseUrl: "..." },
});
Azure 端点类型混淆
针对 Azure OpenAI 端点(*.openai.azure.com),请确保使用正确的提供商类型
// Wrong: using "openai" type with native Azure endpoint
provider: {
type: "openai",
baseUrl: "https://YOUR-RESOURCE.openai.azure.com",
}
// Correct: using "azure" type
provider: {
type: "azure",
baseUrl: "https://YOUR-RESOURCE.openai.azure.com",
}
如果你的 Azure AI Foundry 部署提供了兼容 OpenAI 的端点路径(例如 /openai/v1/),请改用 type: "openai"
// Correct: OpenAI-compatible Azure AI Foundry endpoint
provider: {
type: "openai",
baseUrl: "https://YOUR-RESOURCE.openai.azure.com/openai/v1/",
}
连接被拒绝(Ollama)
确保 Ollama 正在运行并且可访问
# Check Ollama is running curl https://:11434/v1/models # Start Ollama if not running ollama serve
# Check Ollama is running
curl https://:11434/v1/models
# Start Ollama if not running
ollama serve
连接被拒绝(Foundry Local)
Foundry Local 使用的端口是动态的,重启后可能会变化。请确认当前活动端口
foundry service status
foundry service status
将你的 baseUrl 更新为输出中显示的端口。如服务未启动,请先启动模型以启动服务
foundry model run phi-4-mini
foundry model run phi-4-mini
身份验证失败
- 确认你的 API 密钥正确且未过期。
- 检查
baseUrl是否符合提供商要求的格式。 - 对于 Bearer Token,请确保提供完整的 Token,而不是仅仅前缀。