Skip to content
FunCoding

Search

Search docs, Skills and MCP

SDK 多租户与会话隔离

设置 empty 模式、会话身份、工具清单、runtime 目录和自定义存储。

This page has not been translated into English yet. The original Chinese version is shown below.

共享服务的应用层负责登录、路由与授权;runtime 提供会话级身份和状态。不同 session ID 是必要的标识,不是自动完成访问控制的安全边界。

以 empty 模式开始

多用户或共享场景必须使用 mode: "empty",不要使用默认 mode: "copilot-cli"。后者会带入 CLI 风格能力,可能通过环境工具访问宿主文件系统。

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

const client = new CopilotClient({
    mode: "empty",
    connection: RuntimeConnection.forUri(process.env.COPILOT_RUNTIME_URL!),
});

empty 模式默认禁用可选 CLI 行为。内置 Skills 默认不具备资格,SDK 在 create/resume 后的选项 patch 中发送空 includedBuiltinSkills 与 installedPlugins;需要内置 Skill 时显式允许。应用自己的 Skill 目录仍可按需启用。

每个会话明确工具与身份

通过 availableTools 提供来源限定的允许列表,例如 custom:lookupOrder、custom:createTicket、custom:* 或 mcp:search_docs。允许名称不会自动实现或注册业务工具;应用仍需提供相应能力与业务授权。

给每个会话传 gitHubToken,或优先为短期凭据使用令牌 provider。它影响用户内容排除、模型路由、配额和 Copilot 访问,区别于 runtime 进程的 client 级身份。

应用生成唯一 session ID,并在数据库保存 owner/tenant 元数据。每次 resume、delete 和涉及 session ID 的 UI 操作都检查归属,不凭 ID 字符串前缀直接信任用户。

runtime 目录与空闲清理

baseDirectory 为 SDK 启动的 runtime 设置 COPILOT_HOME,状态位于其 session-state/{sessionId}。不同进程、pod 或租户边界通常使用独立目录;有意共享存储时另行处理并发。

sessionIdleTimeoutSeconds 控制空闲清理。专题建议聊天服务可从 15–30 分钟开始评估,这是调优建议而非默认值。外部 URI 连接忽略 client baseDirectory,进程级目录和 timeout 应配置在 runtime 服务上。

sessionFs

sessionFs 让会话文件 I/O 通过应用提供的存储接口处理,适合短暂磁盘、对象存储或租户路径控制。client 级配置示例字段为 initialCwd、sessionStatePath 和 conventions: "posix",还需在创建或恢复时提供对应语言的会话 provider。

官方已列出 TypeScript、Python、Go、.NET、Rust 的公开接口;Java 在该专题中没有已验证的公开 sessionFs 选项,不补写 Java 样例。

集成标识

runtime 环境变量 GITHUB_COPILOT_INTEGRATION_ID 会成为请求头 Copilot-Integration-Id,默认 copilot-developer-cli。目前不是一等 SDK 配置选项;SDK 启动子进程时通过 env 传递,外部 runtime 则在服务器进程设置。

隔离范围

模型列表缓存、会话状态和会话级 GitHub 身份按 session 隔离;若允许宿主文件工具,宿主文件系统仍由 runtime 进程共享。empty 模式与显式工具注册使共享方式可行,但不等于每个 session 都有独立操作系统进程或沙箱。

需要更强的资源边界、负载分配或协作会话时,阅读扩展与存储。