后端与接口
在 Node.js/Python/Go/.NET/Java…
当需要把 GitHub Copilot CLI 的 agent 运行时以编程方式嵌入应用到 Node.js/TypeScript、Python、Go、.NET 或 Java 时,使用这条经验避免 SDK 配置、权限、生命周期和过时文档问题。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Node.js/Python/Go/特定
解决思路
- 优先查阅官方文档索引和对应语言 README,不要凭记忆回答 Copilot SDK 问题。
- 把顶层 SDK README 和 `docs/` 作为共享行为的事实来源。
- 当稳定性或破坏性变更重要时,明确提示 SDK 处于 public preview。
- 当运行时可用 `listModels()` 时,避免硬编码模型列表。
- 警惕权限、生命周期方法和事件名相关的过时指导。
- 配置常规认证:常规使用前准备 GitHub Copilot 订阅;BYOK 场景可不依赖 GitHub Copilot 认证。
- Node.js、Python、.NET 可直接使用自动捆绑的 Copilot CLI。
- Go 使用已安装 CLI,或通过 `go tool bundler` 工作流嵌入/捆绑 CLI。
- Java 使用 `github/copilot-sdk-java`,并单独安装 CLI。
- Azure Managed Identity/Entra 认证时,按 BYOK 模式从 `DefaultAzureCredential` 传入短期 bearer token。
- 接受 SDK 默认拒绝权限模型,并在 create/resume 流程中显式提供权限处理器。
- TypeScript 权限处理器使用 `approveAll`。
- Python 权限处理器使用 `PermissionHandler.approve_all`。
- Go 权限处理器使用 `copilot.PermissionHandler.ApproveAll`。
- .NET 权限处理器使用 `PermissionHandler.ApproveAll`。
- Java 权限处理器使用 `PermissionHandler.APPROVE_ALL`。
- 清理会话优先调用 `disconnect()`。
- 不要在新代码中使用已废弃的 `destroy()`。
- 创建会话时传入自己的 `sessionId`,以便可靠恢复会话。
- 恢复 BYOK 会话时重新提供 BYOK provider 配置,因为密钥不会持久化。
- 默认传输使用 stdio,并由 SDK 管理 CLI 进程。
- 需要连接外部 headless CLI 服务器时使用 `cliUrl`。
- 启动外部服务器可用 `copilot --headless --port 4321`。
- 除非用户明确需要固定列表,否则不要硬编码模型支持。
- 优先调用 `client.listModels()` 并参考官方 supported-models 页面。
- 对支持的模型使用 `reasoningEffort`。
- Node.js/TypeScript 安装:`npm install @github/copilot-sdk`。
- Python 安装:`pip install github-copilot-sdk`。
- Go 安装:`go get github.com/github/copilot-sdk/go`。
- .NET 安装:`dotnet add package GitHub.Copilot.SDK`。
- Java 使用 Maven/Gradle 包 `com.github:copilot-sdk-java`。
- 个人工具和开发场景选择 Local CLI 作为最简单路径。
- 桌面/可分发工具选择 Bundled CLI,把 CLI 二进制随应用发布。
- 后端服务选择 headless CLI,并通过 `cliUrl` 连接。
- 扩展和多租户场景评估共享 CLI vs CLI-per-user、共享存储和会话锁。
- Azure 认证是真实需求时,使用 BYOK 短期 bearer token 替代静态 API key。
- 统一快速开始模型:创建/启动 client。
- 统一快速开始模型:创建带权限处理器的 session。
- 统一快速开始模型:如需流式或进度,在 `send()` 前注册事件处理器。
- 统一快速开始模型:用 `send()` 或 `sendAndWait()` 发送请求。
- 统一快速开始模型:等待 `session.idle` 或返回的最终消息。
- 统一快速开始模型:对 session 调用 `disconnect()`,再停止/释放 client。
- TypeScript 示例:`new CopilotClient()` -> `await client.start()` -> `createSession({ model: 'gpt-5', streaming: true, onPermissionRequest: approveAll })` -> 监听 `assistant.message_delta` -> `sendAndWait({ prompt: 'What is 2+2?' })` -> `disconnect()` -> `client.stop()`。
- 客户端生命周期使用 `start()`、`stop()`、`forceStop()`。
- 会话生命周期使用 `createSession()`、`resumeSession()`、`disconnect()`。
- 消息操作使用 `send()`、`sendAndWait()`、`abort()`、`getMessages()`。
- 发现能力使用 `listModels()`、`listSessions()`、`getStatus()`/`ping()`。
- 最终助手输出从 `assistant.message` 获取。
- 流式文本从 `assistant.message_delta` 获取。
- 把 `session.idle` 作为可靠的“回合完成”信号。
- 处理事件系统时覆盖 reasoning、tool progress、permission、elicitation、sub-agent、skill 等事件。
- 需要事件系统细节时查阅 `references/event-system.md`。
- Node.js 自定义工具用 `defineTool(...)`,搭配 Zod 或原始 JSON Schema。
- Python 自定义工具用 `@define_tool`,搭配 Pydantic 模型。
- Go 自定义工具优先用 `DefineTool(...)`。
- .NET 自定义工具用 `AIFunctionFactory.Create(...)`。
- 覆盖内置工具必须显式 opt-in:TypeScript 用 `overridesBuiltInTool: true`。
- 覆盖内置工具必须显式 opt-in:Python 用 `overrides_built_in_tool=True`。
- 覆盖内置工具必须显式 opt-in:Go 用 `OverridesBuiltInTool = true`。
- 覆盖内置工具必须显式 opt-in:.NET 用 `AdditionalProperties["is_override"] = true`。
- 自定义工具可通过 `skipPermission` opt-in 跳过权限。
- 用 `customAgents` 为每个 session 定义子代理。
- 用 `mcpServers` 附加本地或远程 MCP server。
- 用 hooks 提供控制点,如 `onPreToolUse`、`onPostToolUse`、`onUserPromptSubmitted` 及生命周期/错误 hook。
- 用 `skillDirectories` 加载 skills,用 `disabledSkills` 选择性禁用。
- 需要 custom agents、skills、MCP、headless CLI 和配置位置细节时查阅 `references/cli-agents-mcp.md`。
- Session 可发送 file、directory、image 附件。
- 图片输入支持 file 和 blob 附件,并通过模型能力检查 vision。
- 飞行中消息用 `mode: "immediate"` 进行 steering,用 `mode: "enqueue"` 进行 queueing。
- 注册自定义 slash `commands`。
- 用 `onUserInputRequest` 回答用户问题。
- 当连接客户端支持时,通过 elicitation handlers 和 `session.ui` 提供富 UI 提示。
- 通过 `TelemetryConfig` 配置 OpenTelemetry。
- 使用内置 trace context propagation;Node 用显式 `onGetTraceContext` 回调做出站传播。
- 可恢复会话使用稳定 `sessionId`。
- 长运行工作流可能需压缩时使用 `infiniteSessions`。
- 除非配置覆盖,session state 存储在 `~/.copilot/session-state/`。
- SDK 暴露 sessions、models、plans、mode switching、workspace files、custom agents、hooks、MCP、skills、telemetry 等编程接口。
- 多数终端 UX 功能仍仅限 CLI,如大部分 slash-command 工作流、交互式选择器、export/share 命令。
- 把 CLI 工作流转成应用代码前,先查 compatibility guide,不要假设 slash command 有 SDK 等价物。
- 按语言约定调用:TypeScript `createSession()`、`resumeSession()`、`event.data.content`、`event.data.deltaContent`、`skillDirectories`。
- 按语言约定调用:Python `create_session()`、`resume_session()`、`event.data.content`、`event.data.delta_content`、`skill_directories`。
- 按语言约定调用:Go `CreateSession()`、`ResumeSession()`、`*event.Data.Content`、`*event.Data.DeltaContent`、`SkillDirectories`。
- 按语言约定调用:.NET `CreateSessionAsync()`、`ResumeSessionAsync()`、`evt.Data.Content`、`evt.Data.DeltaContent`、`SkillDirectories`。
- 按语言约定调用:Java `createSession()`、`resumeSession()`、`event.getData().content()`、`event.getData().deltaContent()`、`setSkillDirectories(...)`。
- 记住 SDK 是 public preview,旧示例会快速过时。
- 硬编码模型表会过时,优先运行时发现。
- 新代码用 `disconnect()`,不要沿用旧示例中的 `destroy()`。
- 把权限处理器视为真实 session 的必需项。
- `assistant.message` 和 `assistant.message_delta` 使用 `event.data.*`,不是顶层 `event.content`。
- 流式/事件订阅必须在 `send()` 之前附加。
- 会话恢复时若没有调用方提供的 `sessionId`,运维会很别扭。
- 需要当前 starter examples、工具和 resume 模式时查阅 `references/working-examples.md`。
- 需要常见失败、debug logging、认证、权限和传输问题排障时查阅 `references/troubleshooting.md`。
适用边界 · 注意事项
- 不要用于要求稳定 API、不能接受 public preview 破坏性变更的生产关键场景。
- 不要用于必须依赖终端交互式 UX(slash-command 工作流、交互式选择器、export/share)且无法改写为 SDK API 的场景。
- 没有 GitHub Copilot 订阅且未配置 BYOK 或 Azure Managed Identity 等替代认证时不要按常规 SDK 用途接入。