跳转到主要内容

RPC(Remote Procedure Call)

在官方 SDK 中,近期的新功能都通过基于 api.schema.json 的自动代码生成来支持。Laravel 版参考生成后的其他语言版本,以相同方式实现。

ServerRpc

绑定到 Client 的 RPC 类。

连接、模型、工具与账户

通过 ping() 和 connect() 确认并建立连接,通过 registerExtensionLaunchProvider() 注册扩展的启动提供程序。模型列表、价格单位和内置目录可通过 models() 获取,可用工具列表可通过 tools() 获取。account() 用于处理配额、认证状态、已登录用户列表以及登录与登出,accounts() 用于获取 Microsoft Entra ID 令牌。

MCP、连接器与密钥

mcp() 提供 MCP 配置的列出、添加、更新、删除,以及启用、发现、注册表搜索、安装计划与应用。connectors() 可用于查看连接器功能、账户和目录。服务器端的连接器操作主要是按账户进行列表获取和更新。experimental 的 secrets()->addFilterValues() 会将主机生成的动态密钥注册到 CLI 的脱敏过滤器中。之后 CLI 会在会话日志和导出内容中屏蔽这些值。
此 RPC 不会获取 OAuth 令牌。SDK 不会持久化这些值,也不会将其写入额外的日志。请注册主机已经获取到的值。

Skills、Plugins、Agents、Instructions 与 Extensions

可以从各个分组进行探索、获取可用路径、更改设置和重新加载。commands() 提供内置命令列表,hooks() 提供会话开始前的钩子探索。Skills 和 Plugins 支持启用、禁用和安装管理,Agents 还可以获取内置代理信息。Extensions 用于探索、启用和禁用已持久化的扩展。

目录与安装

通过 catalog() 进行候选搜索、选择和获取 feed,通过 Skills、Plugins、MCP 各 API 确认安装计划、应用、查询状态或取消。计划与应用是独立的操作。实际的安装示例请参考后面的各个部分。

会话、主机与运行环境

sessions() 用于处理已持久化会话的搜索、事件读取、大小确认、删除与清理以及 fork。还可以使用 Workspace 的创建、加载和远程控制。host() 用于启动主机、发布会话、列出、取消发布、处理认证、更改会话接纳策略和销毁。这些主机 RPC 是 SDK 高级 AHP(Agent Host Protocol)主机 API 的基础。runtime() 用于处理运行时的生命周期。

Git、环境、沙箱与策略

可以通过 git() 获取分支、工作目录和 Git remote 信息,通过 gitHubRepository() 和 gitHubOwners() 探索 GitHub 仓库和所有者。environments() 处理 Mission Control 环境,sandbox() 和 sandboxProxyCa() 处理沙箱支持状态和 Proxy CA,contentExclusion() 用于验证排除策略,managedSettings() 和 userSettings() 用于处理设置。

本地模型、HTTP 推理与文件系统

azureMl() 提供本地模型的目录、解析、下载,以及状态确认、取消和删除。llmInference() 是将模型层的 HTTP 请求中继到客户端的实验性 API。sessionFs() 用于注册会话的文件系统/SQLite 回调提供程序。

基本调用示例

SDK 中原有的功能也以自动代码生成版本的形式重新添加。

按功能分类的使用示例

下面汇总了上述功能的代表性调用示例。

Agent Plugin catalog 候选

在 catalog.search 中请求 agent-plugin-discovery,并在搜索对象的 kinds 中指定 plugin,即可获取 Agent Plugin 候选。若要接收标准格式 application/vnd.github.copilot-plugin 以外的 application/vnd.anthropic.claude-plugin+json 和 application/agent-plugin+json,除了 agent-plugin-discovery 之外,还需请求 agent-plugin-formats。 agent-plugin-confirmed-installation 是返回是否可安装以及用于审查的计划的 capability,同样需要与 agent-plugin-discovery 一起请求。允许后,候选中会包含 installability,其值为 installable、install-data-unavailable、feature-disabled、not-installable-kind 之一。installPlan 仅在 installability 为 installable 时包含。计划是用于确认的数据,此 catalog RPC 不会执行安装。 计划的 sources 按优先顺序包含 materialization、marketplace、repository 候选。Marketplace 会记录名称和仓库,直接的 Repository 会记录仓库和可选路径。仅有 materialization 的计划会省略 pluginName,且 components 为空。名称和实际引入的内容请通过 plugins.planInstall() 返回的审查结果确认。 对于已选择的候选,可以使用 plugins.planInstall() 创建无副作用且经过验证的计划。plugins.applyInstall() 会要求用户明确确认,获得许可后应用计划。应用后的插件以禁用状态注册。 审查中的 mcpServers 显示已验证文件声明的服务器名称、transport,以及远程情况下的 host。这并不是安全性保证,因此请让用户确认内容后再进行明确确认。已安装插件的 description 来自 manifest。verifiedSource 表示 GitHub 仓库和固定的 commit,仅在固定到 commit 的直接安装中存在。iconUrl 是外部的不受信任内容,获取时请勿发送认证信息或 GitHub 凭据。凭据本身不会作为拒绝原因返回。 在安装结果的 network-failure 中,可以查看 CatalogNetworkFailureReason、HTTP statusCode、可选的 retryAfterSeconds 以及可以安全显示的 message。
从 Agent Finder 的 materialisation reference 进行计划时,请使用 catalog.planInstallFromReference()。结果的 outcome->kind 为 plugin-install-planned、skill-install-planned、refused 之一。请将插件的计划传给 plugins.applyInstall(),将技能的计划传给 skills.applyInstall()。

contentExclusion

可以在创建会话之前验证内容排除策略的 JSON。
policiesJson 以未解析的 JSON 字符串形式直接传给 CLI。如果 JSON 解析或模式验证失败,会发生来自 CLI 的 RPC 错误(JsonRpcException)。 这是用于验证策略本身的服务器范围 RPC。若要根据实际的排除策略检查会话工作目录内的路径,请使用会话范围的 contentExclusion()->checkPaths()。

managedSettings(experimental:托管设置)

用于读取托管设置、解析策略、获取模式、验证、合成预览以及丢弃缓存。

Runtime 与 Host 的生命周期(experimental)

host.unpublishSession() 会从所拥有的运行中主机撤回 application publication。即使撤回发布,原始会话历史、worktree 和正在运行的工作也不会被删除或停止。如果已经未发布,unpublished 为 false,application 以外的 publication 会导致错误。
host.dispose() 通过指定 hostId 来销毁主机监听器。
host.setSessionCreationPolicy() 用于切换运行中的主机是否接受新的远程会话。此更改不会断开现有客户端,仅适用于之后的接纳。
在 SDK 启动的 stdio 运行时中,Client::stop() 在断开会话之后、关闭 JSON-RPC 连接和进程之前调用 runtime.shutdown。最多等待 10 秒以完成运行时清理,失败时会将错误包含在返回值中,并继续执行剩余的停止处理。对于 cli_url 等外部运行时连接,为避免终止共享运行时,不会调用此 RPC。 如果 CLI 无法识别对应的请求并返回 id: null 的 JSON-RPC 错误,所有进行中的请求都会以 JsonRpcException 失败。该异常包含已移除引号内的值并限制了长度的诊断消息。连接会保持打开。由于 CLI 可能已经处理了请求,在确认安全之前请勿自动重试。SDK 会在发送前拒绝 CLI 无法读取的、嵌套超过 127 层的发出请求,并将嵌套过深的处理程序响应替换为 JSON-RPC 错误。

SessionRpc

绑定到 Session 的 RPC 类。 还可以使用以前的 SDK 无法实现的计划模式等功能。

模型、模式、名称与计划

通过 model() 可以确认或切换当前模型,并设置 reasoning effort、Auto tier 和允许的模型。mode() 处理模式,name() 处理会话名称,plan() 处理计划正文和 SQLite todo 的读写。

工作区、指令与 LSP

workspaces() 提供文件的列出、读取、写入、移动、删除以及目录操作。可以通过 instructions() 获取、重新加载和探索指令,通过 lsp() 初始化语言服务器配置。

Autopilot 目标

autopilotObjective()->getState() 以类型化对象返回会话当前的 Autopilot 目标状态。没有目标时,state 为 null。此 API 与确认工作区中是否保存了目标的 workspaces()->autopilotObjectiveExists() 不同。

代理、Fleet 与后台任务

通过 agent() 列出、选择和重新加载代理,通过 fleet() 启动 Fleet。tasks() 处理后台代理和客户端所有任务的注册、进度获取与更新、迁移、发送消息、取消和删除。

MCP、Plugins、Extensions 与 Workflow

mcp() 处理服务器的列出、启动、停止、重新加载,工具、提示、资源,OAuth、sampling 以及动态标头的更新。plugins() 和 extensions() 管理会话内的状态,customizations() 用于重新加载自定义项。可以通过 workflow() 执行和查询工作流,通过 diagnostics() 和 connectors() 获取诊断信息和连接器。

Tools、Permissions、Commands 与 UI

tools() 和 permissions() 处理对通过事件到达的待处理请求的响应和设置。commands() 提供命令列表、执行和事件响应,ui() 提供对用户输入、elicitation、计划批准等请求的响应。completions() 用于获取输入候选。

Accounts、认证与 Providers

accounts() 处理通过 enumerate() 列举账户/提供程序/登录账户,get()、set(),以及通过 begin()、advance()、cancel() 进行的交互式登录。gitHubAuth() 处理会话的认证状态和凭据,provider() 和 providers() 处理模型连接目标和提供程序适配器,connectors() 处理会话的连接器连接。

历史、队列、日志与使用量

history() 提供对话的压缩、中断、交接摘要和截断,queue() 提供待处理项的插入、移动、编辑、删除和立即发送。通过 log()、eventLog()、usage()、quota()、limitPrediction() 处理日志、事件、使用量和上限信息。schedule() 可用于查看和停止已计划的提示。

生命周期、远程与主机集成

sendMessages() 在一个回合中执行多条消息,suspend() 和 shutdown() 用于停止会话。interruptMainTurn() 单独控制主回合,cancelAllBackgroundAgents() 单独控制后台代理。remote() 和 visibility() 处理远程发布和共享状态,sandbox() 处理会话的沙箱,managedSettings() 处理会话范围的托管设置,contentExclusion() 处理路径判定,metadata() 处理客户端所有的元数据,canvas() 处理 Canvas 集成。

debug (experimental)

通过 debug()->collectLogs() 可以将会话的事件日志、进程日志和 shell 日志收集到 .tgz 归档或目录中。日志默认会对机密信息进行脱敏。可以通过 additionalEntries 添加文件或目录,redaction 可指定为 plain-text、events-jsonl、none。指定 none 时不会进行脱敏,因此请注意所添加的内容。
指定 DebugCollectLogsDestination::directory('/tmp/copilot-debug') 可以输出到暂存目录。include 可以单独指定要收集的日志和引用路径,并可从结果的 entries 和 skippedEntries 确认收集内容。目标位置和附加条目的路径是 CLI 服务器端的路径。在通过 stdio 启动 CLI 的标准配置中与应用位于同一主机,但如果通过 TCP 连接到其他主机上的 CLI 服务器,请指定服务器端的路径,而不是调用方机器上的路径。

contentExclusion (experimental)

可以确认会话工作目录内的本地绝对路径是否属于内容排除策略的对象。请在读取或附加文件内容之前调用。
checkPaths() 仅接受绝对路径,且路径必须位于会话的工作目录内。checks 按与输入相同的顺序返回,重复的路径也会原样保留。当路径、文件系统不受支持或策略评估不可用时,会返回 available: false 和空的 checks。此时 isExcluded() 始终返回 true,因此请将所有路径视为排除对象。即使 available: true,结果中不存在的路径也会按安全优先原则判定为排除对象。

MCP Apps (experimental)

可以通过 $session->rpc()->mcp()->apps() 调用 MCP Apps 用的 RPC。在 listTools() 和 callTool() 中,调用方 MCP 服务器名称 originServerName 为必需。callTool() 的结果以自由格式的 MCP 结果返回。
readResource() 返回 HTML 等资源数据。SDK 不进行浏览器渲染或 iframe 操作,因此渲染所获取的内容是调用方应用程序的责任。

按功能分类的使用示例

下面汇总了上述功能的代表性调用示例。

remote(experimental:远程会话支持)

详情请参考 Remote Sessions。

sandbox(experimental:沙箱控制)

在权限处理程序中,当存在 $request['sandboxPathGrant'] 时,使用目标待处理请求的 requestId 进行调用。由于此 RPC 本身会响应权限请求,成功时请返回 PermissionDecision::noResult(),以免发送常规响应。

metadata(experimental:会话信息)

Session canvas

Canvas RPC 通过 $session->rpc()->canvas() 调用。list() 在 CanvasList 的 canvases 中返回列表,listOpen() 在 CanvasListOpenResult 的 openCanvases 中返回列表。open() 返回 OpenCanvasInstance, action 调用返回 CanvasActionInvokeResult。close() 没有返回值。
Canvas provider 的 reverse-RPC(canvas.open / canvas.close / canvas.action.invoke)由 SessionConfig / ResumeSessionConfig 的 canvasHandler 处理。Canvas 的渲染是主机 UI 的责任。

workflow

Copilot CLI 1.0.89 系列中新增的工作流、连接器、诊断等实验性 RPC API 也可以通过 SessionRpc 使用。这些可变协议 payload 以 JSON 兼容的数组传递,响应也以数组形式返回。每次调用都会自动添加当前的 sessionId。
workflow() 调用 CLI 提供的低级 RPC。像 Node.js SDK 那样将 PHP 闭包注册为工作流并执行的高级 API,在此次同步中并未添加。这些新的 RPC 分组依赖于 CLI 版本且属于实验性功能,请仅在支持的 CLI 中使用。

SessionFS 回调类型

定义了用于会话范围文件系统操作的回调类型(Request/Result)。这些是 Copilot CLI 回调客户端时使用的请求/响应类型。 SessionFsStatResult / SessionFsReaddirResult / SessionFsReaddirWithTypesResult 带有失败时使用的可选 error(SessionFsError)。

SessionFs 处理程序

Client 除了 sessionFs.readFile / readFileBytes / writeFile / writeFileBytes 之外,还会将 appendFile、exists、stat、mkdir、readdir、readdirWithTypes、rm、rename、sqliteQuery、sqliteTransaction、sqliteExists 各请求分派给 Session 的提供程序。文件操作失败时以 ENOENT(ENOENT 或 errno 2)/ UNKNOWN 的 error 返回。exists 在发生异常时返回 false,stat 在失败时返回零值加 error。提供程序不支持的操作会产生 UNKNOWN 错误(SQLite 相关为 JSON-RPC 错误)。sqliteQuery/sqliteExists 的异常为 JSON-RPC 错误,sqliteTransaction 的失败以结果中的 error(带 errorClass)返回。 提供程序端的接口(SessionFsFilesystemProvider、SessionFsSqliteCapableProvider、SessionFsSqliteProvider、SessionFsSqliteTransactionProvider)作为独立接口添加,以免破坏原有的 SessionFsProvider(2 个方法)。

SQLite 回调类型

要启用 SQLite 支持,请在 SessionFsSetProviderRequest 的 capabilities 中传入 SessionFsSetProviderCapabilities(sqlite: true)。
通常不直接调用此 RPC,而是指定 Client 选项 sessionFs(或 config/copilot.php 中的 session_fs),Client::start() 会仅发送一次 sessionFs.setProvider。会话需要 createSessionFsProvider(请参考 SessionConfig)。 SessionFsSqliteQueryType enum(src/Enums/)表示查询类型:
  • Exec:DDL/多条语句(无结果)
  • Query:SELECT(返回行)
  • Run:INSERT/UPDATE/DELETE(返回 rowsAffected)
这些类型类位于 src/Types/Rpc/。

以数组形式指定参数

参数和返回值都使用专用类,但参数也可以用数组指定。

测试

由于无法使用 Copilot::fake() 的 mock,请使用 Copilot::expects('client') 或 Copilot::expects('start') 进行 mock。
最新信息请参考 GitHub 仓库。
最后修改于 2026年10月26日