Skip to main content

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 設定的列出、新增、更新、刪除,以及啟用、偵測、registry 搜尋、安裝計畫與套用。connectors() 可確認連接器功能、帳戶與目錄。伺服器端的連接器操作主要是以帳戶為單位的列表取得與更新。

Skills、Plugins、Agents、Instructions、Extensions

可從各群組進行探索、取得可用路徑、變更設定與重新載入。commands() 提供內建指令列表,hooks() 提供工作階段開始前的 hook 探索。Skills 與 Plugins 支援啟用/停用與安裝管理,Agents 也可取得內建代理程式資訊。Extensions 用於探索、啟用、停用已持久化的擴充功能。

目錄與安裝

使用 catalog() 進行候選搜尋、選擇與 feed 取得,並透過 Skills、Plugins、MCP 各 API 確認安裝計畫、套用、查詢狀態或取消。計畫與套用是不同的操作。實際的安裝範例請參閱後半部的各個項目。

工作階段、主機、執行環境

sessions() 處理已持久化工作階段的搜尋、事件讀取、大小確認、刪除與整理,以及 fork。也可以建立、載入 Workspace 以及進行遠端控制。host() 負責主機的啟動、工作階段的發布、列出、取消發布與銷毀,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 來銷毀主機監聽器。
在 SDK 啟動的 stdio 執行環境中,Client::stop() 會在中斷工作階段之後、關閉 JSON-RPC 連線與程序之前呼叫 runtime.shutdown。最多等待 10 秒讓執行環境完成清理,失敗時會將錯誤包含在回傳值中,並繼續其餘的停止處理。對於 cli_url 等外部執行環境的連線,為避免終止共用的執行環境,不會呼叫此 RPC。

SessionRpc

與 Session 綁定的 RPC 類別。 也可以使用以前的 SDK 無法使用的計畫模式等功能。

模型、模式、名稱、計畫

可使用 model() 確認或切換目前的模型,並設定 reasoning effort、Auto tier 與允許的模型。mode() 處理模式,name() 處理工作階段名稱,plan() 處理計畫本文與 SQLite todo 的讀寫。

工作區、指示、LSP

workspaces() 提供檔案的列出、讀取、寫入、移動、刪除以及目錄操作。可使用 instructions() 取得、重新載入與探索指示,使用 lsp() 初始化語言伺服器設定。

代理程式、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() 會在 1 個回合中執行多則訊息,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 closure 註冊並執行為工作流程的高階 API,在此次同步中並未加入。這些新的 RPC 群組依賴 CLI 的版本且屬於實驗性質,請僅在支援的 CLI 中使用。

SessionFS 回呼型別

為 Session 範圍的檔案系統操作定義的回呼型別(Request/Result)。這些是 Copilot CLI 對 Client 進行回呼時的請求/回應型別。 SessionFsStatResult / SessionFsReaddirResult / SessionFsReaddirWithTypesResult 具有失敗時使用的選用 error(SessionFsError)。

SessionFs 處理器

除了 sessionFs.readFile / readFileBytes / writeFile / writeFileBytes 之外,Client 還會將 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月19日