跳转到主要内容

SessionConfig

通过 SessionConfig 类可以进行各种设置。 按 Copilot::run(prompt: '...', config: $config) 或 Copilot::start(function (CopilotSession $session) { ... }, config: $config) 的方式使用。 当你只是想指定模型这种无需用到 SessionConfig 类的情况时,也可以用数组指定。Copilot::run(prompt: '...', config: ['model' => 'auto']) 官方 SDK 1.0.26 已移除 remoteSession 选项。SessionConfig 和 ResumeSessionConfig 不再接受该选项。

发现根目录

skillDirectories、agentDirectories、hookDirectories 和 instructionDirectories 是用于技能、自定义代理、文件钩子和自定义指令的仅发现用根目录。 它们不会授予代理通用的文件访问权限。 如需添加常规的文件访问位置,请使用 additionalDirectories。 无论是否启用 enableConfigDiscovery,都可以设置发现根目录。 SDK 会在设置时基于当时有效的 workingDirectory 对相对路径进行一次解析。 之后即使工作目录发生变化,这些根目录也不会随之移动。 省略该键或传入 null 时,默认的发现来源保持不变。 传入 [] 只会清除 SDK 显式设置的根目录。 针对技能、代理、钩子和指令的按来源禁用设置以及 Managed Settings 仍然适用。

工作目录信任

在创建会话时设置 trustWorkingDirectory,即可将工作目录标记为受信任。
  • WorkingDirectoryTrust::Session 仅在当前会话中信任该目录。
  • WorkingDirectoryTrust::User 会持久化信任状态,之后的会话也会信任该目录。
省略时,SDK 不会更改信任状态。 trustWorkingDirectory 仅在创建会话时可用,ResumeSessionConfig 不接受该选项。

Memory 注入模式

Memory 配置目前处于实验阶段。
MemoryConfiguration 用于控制跨会话的 memory。 其中的 mode 选项决定运行时将 memory 注入到哪里:
  • MemoryMode::SystemPrompt(system-prompt)将 memory 注入到 system prompt 中。省略 mode 时为默认值。
  • MemoryMode::UserPrompt(user-prompt)将 memory 注入到生成的用户消息中。

排除 Managed Settings

使用 excludedManagedSettings 列出运行时应从其获取的 Managed Settings 中移除的设置路径。 它不会影响通过 managedSettings 直接注入的设置。 如需在恢复后继续保持排除,请在 ResumeSessionConfig 中再次传入 excludedManagedSettings。
会话恢复时使用 ResumeSessionConfig 类。它与 SessionConfig 几乎相同,只有一点点差异。ResumeSessionConfig 只指定要变更的配置项。其他会沿用新建会话时的配置。 SDK 会在创建和恢复的 RPC 负载中发送相同的会话选项。 其中包括 BYOK 提供商和模型、memory、enableMcpApps、interactiveUser、autopilot、sandboxConfig、excludedManagedSettings、发现根目录,以及 onMcpAuthRequest、onExitPlanModeRequest、onAutoModeSwitchRequest 等处理器。 恢复时,请通过 ResumeSessionConfig 或使用相同键的数组传入这些选项。 闭包和提供商对象不会被持久化,因此每次恢复时都需要重新提供。

Autopilot 自动继续

Autopilot 选项目前处于实验阶段。
使用 autopilot 设置 Autopilot 模式下的自动继续策略。 它不会改变会话模式本身。 新建的 SDK 会话默认启用自动继续,maxContinues 为 5。 将 maxContinues 设置为 0 即可关闭常规的自动继续。
恢复时,请在 ResumeSessionConfig 或数组中传入相同的 autopilot 键。 热恢复(warm resume)时,省略的字段会保留当前值。 运行时重启后(冷恢复,cold resume),请重新传入这些设置。

沙箱配置

沙箱配置目前处于实验阶段。
使用 sandboxConfig 为会话配置 CLI 沙箱。 SDK 会在创建和恢复请求中都转发该配置。 为兼容现有代码,SDK 也接受 sandbox 作为别名。 两者同时设置时,非 null 的 sandboxConfig 优先。
使用 auth 和 credentials,可以让沙箱内的进程使用凭据而不暴露其值:
  • auth 为 git 和 gh 启用凭据注入。
  • credentials.envVars 将环境变量名映射到允许接收其掩码值的 HTTPS 主机(injectHosts)。请勿将凭据值本身写入配置。
也可以使用 Revolution\Copilot\Types\Rpc 命名空间中的 SandboxConfig、SandboxConfigAuth、SandboxCredentialsConfig、SandboxMaskedEnvVar、SandboxConfigUserPolicyExperimental 和 SandboxConfigUserPolicyExperimentalSeatbelt 等类型化对象。 网络的允许和阻止规则取决于 CLI 沙箱的功能和版本。

Canvas 提供商

Canvas 支持目前处于实验阶段。
通过 canvases 声明 canvas,并通过 canvasHandler 处理打开和操作请求。 当代理打开 canvas 或调用其某个操作时,运行时会通过反向 RPC 调用你的处理器。 设置 requestCanvasRenderer: true 即可选择作为渲染器参与,运行时会为此连接向模型公开 canvas 代理工具。 该选项默认关闭,以免影响无法显示 canvas 的 SDK 调用方。
相关选项:
  • requestExtensions: true 选择启用扩展接口。运行时会将扩展管理工具接入此连接上的会话。默认关闭。
  • extensionInfo: new ExtensionInfo(source: 'github-app', name: 'my-extension') 为此连接上的 canvas 提供商设置稳定的扩展 ID。运行时会使用 ${source}:${name} 而不是按连接生成的 ID。也可以传入数组。
恢复时,请再次传入 canvases 和 canvasHandler。 canvasHandler 只在 PHP 进程内运行,SDK 只会在 RPC 负载中发送声明的元数据。 ResumeSessionConfig 还接受 openCanvases,即会话停止时处于打开状态的 canvas 快照。 运行时会用它来恢复 canvas 状态,因此无需重新打开。 可以通过 $session->openCanvases() 获取当前打开的 canvas。SDK 会根据 session.canvas.opened 和 session.canvas.closed 事件保持该列表同步。

会话文件系统提供商

技能与文件系统回调

使用 skillProvider 可以从应用自身管理的来源加载技能。 这些回调属于该会话,不会被序列化到 Copilot 运行时。 云端会话不支持自定义技能提供商。
SkillProviderCallOptions::$signal 提供回调的取消令牌。 取消是协作式的,回调需要自行监听该信号并取消未完成的工作。 也可以实现 Revolution\Copilot\Contracts\SkillProvider 来代替回调数组。 sessionFsProvider 使用相同的会话级配置。 文本回调为 readFile(path) 和 writeFile(path, content, mode)。 如需支持二进制文件,请同时提供 readFileBytes(path) 和 writeFileBytes(path, bytes, mode),或实现 SessionFsBinaryProvider。 这些回调接收并返回原始字节,JSON-RPC 传输上的 base64 编码由 SDK 处理。 请将文件系统访问限制在应用打算公开的路径范围内。

使用 sessionFs 委托全部会话状态

设置客户端选项 sessionFs(别名 session_fs),即可将整个 Copilot CLI 会话状态(包括会话状态文件和每个会话的 SQLite 数据库)迁移到你自己的存储中。 设置后,每个会话配置都必须提供 createSessionFsProvider 工厂。 SDK 会在 createSession() 和 resumeSession() 时,在确定会话 ID 之后、向运行时发送请求之前调用该工厂。
使用 Copilot facade 时,请在 config/copilot.php 中设置 session_fs。 initialCwd、sessionStatePath 和 conventions(posix 或 windows)为必填项。 缺少字段或 conventions 值无效时会抛出 InvalidArgumentException。 createSessionFsProvider 是一个 Closure。它同样适用于数组,以及 SessionConfig 和 ResumeSessionConfig 的 fromArray() 与 toArray()。 它返回的提供商可以是对象,也可以是由 callable 组成的数组。每项可选功能都有各自的接口: 如果提供商不满足声明的功能,SDK 会抛出 InvalidArgumentException。 调用提供商不支持的操作会返回 UNKNOWN 错误。 提供商通过抛出异常来表示失败。code 为 ENOENT(或 errno 2)的异常会转换为 ENOENT,其他情况均转换为 UNKNOWN。 可以从 transaction() 中抛出 SessionFsSqliteTransactionFailure 来报告 errorClass(busyOrLocked、fatal 或 postCommitAmbiguous)。 未设置客户端 sessionFs 选项时,SDK 永远不会调用 createSessionFsProvider,现有的 sessionFsProvider(readFile 和 writeFile)仍可正常工作。

面向多租户应用的 empty 模式

将客户端的 mode 设置为 empty,即可默认禁用依赖 Copilot CLI 宿主环境或跨会话状态的功能。 默认值为 copilot-cli,保持现有行为。 在 empty 模式下,必须设置一个持久化目标:base_directory、session_fs 或外部服务器 url。
empty 模式下的每个会话都必须设置 availableTools。 使用 ToolSet 构建带来源限定的工具过滤器(builtin:、custom:、mcp:)。 BuiltInTools::Isolated 只允许限定在单个会话内的内置工具,不允许访问宿主文件系统、环境、网络或其他会话。
工具名称必须匹配 /^[a-zA-Z0-9_-]+$/ 或为通配符 *,否则 ToolSet 会抛出 InvalidArgumentException。 empty 模式会为会话遥测、持久化 MCP OAuth token 存储、embedding 检索与缓存、指令发现、文件钩子、宿主 git 操作、会话存储、技能、memory 以及实验模式应用安全的默认值。 显式设置的会话选项优先于这些默认值。 GitHub 缓存存储既不是 empty 模式的默认值,也不是会话选项。SDK 不再在会话创建或恢复请求中发送 enableGitHubCacheStore,如果数组配置中仍保留该键,也会被忽略。 replace 模式下的 systemMessage 会按原样使用,其他模式会移除 environment_context 段落。 SDK 还会为 CLI 进程设置 COPILOT_DISABLE_KEYTAR=1。 云端执行请参考 Cloud Sessions,Plugin Directory 请参考 Plugin Directories。
最新信息请参考 GitHub 仓库。
最后修改于 2026年10月26日