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会持久化信任状态,之后的会话也会信任该目录。
trustWorkingDirectory 仅在创建会话时可用,ResumeSessionConfig 不接受该选项。
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 模式下的自动继续策略。
它不会改变会话模式本身。
新建的 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 提供商
通过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。
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 仓库。