SessionConfig
透過SessionConfig 類別可進行各種設定。
使用方式如 Copilot::run(prompt: '...', config: $config) 或 Copilot::start(function (CopilotSession $session) { ... }, config: $config)。
若只是想單純指定模型等,無需使用 SessionConfig 類別時,也可以以陣列形式指定,例如:Copilot::run(prompt: '...', config: ['model' => 'auto'])。
探索根目錄
skillDirectories、agentDirectories、hookDirectories 與 instructionDirectories 是用於 Skill、自訂 Agent、檔案 Hook 與自訂指示的僅供探索的根目錄。
它們不會授予 Agent 一般的檔案存取權限。
若要新增一般的檔案存取位置,請使用 additionalDirectories。
無論是否啟用 enableConfigDiscovery,都可以設定探索根目錄。
SDK 會在設定時,以當下有效的 workingDirectory 為基準解析一次相對路徑。
即使之後 working directory 變更,這些根目錄也不會跟著移動。
省略該 key 或傳入 null 時,預設的探索來源維持不變。
傳入 [] 只會清除 SDK 明確設定的根目錄。
針對 Skill、Agent、Hook 與指示的個別停用設定與 Managed Settings 仍然適用。
在 Session 恢復時使用 ResumeSessionConfig 類別。與 SessionConfig 幾乎相同,但略有差異。ResumeSessionConfig 只需指定想變更的項目。其他項目會沿用新 Session 開始時的設定。
SDK 會在建立與恢復的 RPC payload 中送出相同的 Session 選項。
其中包含 BYOK 的 provider 與模型、memory、enableMcpApps、interactiveUser、enableGitHubCacheStore、探索根目錄,以及 onMcpAuthRequest、onExitPlanModeRequest、onAutoModeSwitchRequest 等處理器。
恢復時,請透過 ResumeSessionConfig 或使用相同 key 的陣列傳入。
Closure 與 provider 物件不會被持久化,因此每次恢復時都需要重新提供。
Canvas provider
使用canvases 宣告 Canvas,並以 canvasHandler 處理開啟與動作請求。
當 Agent 開啟 Canvas 或呼叫其動作時,runtime 會透過 reverse RPC 呼叫你的處理器。
設定 requestCanvasRenderer: true 以選擇作為 renderer,runtime 便會在此連線上向模型公開 Canvas 的 Agent 工具。
此選項預設為關閉,讓無法顯示 Canvas 的 SDK 呼叫端保持乾淨。
requestExtensions: true會選擇啟用 extension 介面。runtime 會將 extension 管理工具接入此連線上的 Session。預設為關閉。extensionInfo: new ExtensionInfo(source: 'github-app', name: 'my-extension')會為此連線上的 Canvas provider 設定穩定的 extension ID。runtime 會使用${source}:${name},而非每個連線各自的 ID。也可以傳入陣列。
canvases 與 canvasHandler。
canvasHandler 僅在 PHP 程序內執行,SDK 只會在 RPC payload 中送出宣告的 metadata。
ResumeSessionConfig 也接受 openCanvases,即 Session 停止時已開啟之 Canvas 的快照。
runtime 會以此重建 Canvas 狀態,因此不需要重新開啟。
可透過 $session->openCanvases() 取得目前開啟的 Canvas。SDK 會依據 session.canvas.opened 與 session.canvas.closed 事件保持此清單同步。
Session 檔案系統 provider
Skill 與檔案系統 callback
使用skillProvider 從應用程式自有的來源載入 Skill。
這些 callback 屬於該 Session,不會被序列化至 Copilot runtime。
Cloud Session 不支援自訂 Skill provider。
SkillProviderCallOptions::$signal 提供 callback 的取消 token。
取消採協作式,你的 callback 應自行監看 signal 並取消進行中的工作。
也可以實作 Revolution\Copilot\Contracts\SkillProvider 來取代 callback 陣列。
sessionFsProvider 使用相同的 Session 範圍設定。
文字 callback 為 readFile(path) 與 writeFile(path, content, mode)。
若要支援二進位檔案,請同時提供 readFileBytes(path) 與 writeFileBytes(path, bytes, mode),或實作 SessionFsBinaryProvider。
這些 callback 接收與回傳的都是原始 byte,JSON-RPC 傳輸上的 base64 編碼由 SDK 處理。
請將檔案系統存取限制在應用程式打算公開的路徑內。
使用 sessionFs 委派所有 Session 狀態
設定 client 選項 sessionFs(別名 session_fs),即可將 Copilot CLI 的整個 Session 狀態(包含 session-state 檔案與每個 Session 的 SQLite 資料庫)移至你自己的儲存空間。
設定後,每個 Session 設定都必須提供 createSessionFsProvider factory。
SDK 會在 createSession() 與 resumeSession() 時,於得知 Session ID 之後、將請求送至 runtime 之前呼叫此 factory。
Copilot facade 時,請在 config/copilot.php 中設定 session_fs。
initialCwd、sessionStatePath 與 conventions(posix 或 windows)為必填。
缺少欄位或 conventions 值無效時,會拋出 InvalidArgumentException。
createSessionFsProvider 是 Closure,在 SessionConfig 與 ResumeSessionConfig 的陣列、fromArray() 與 toArray() 中同樣可用。
它回傳的 provider 可以是物件或 callable 陣列。每項選用能力各有對應的介面:
若 provider 不符合宣告的能力,SDK 會拋出
InvalidArgumentException。
呼叫 provider 不支援的操作時,會回傳 UNKNOWN 錯誤。
provider 透過拋出例外來表示失敗。code 為 ENOENT(或 errno 2)的例外會轉為 ENOENT,其他則轉為 UNKNOWN。
從 transaction() 拋出 SessionFsSqliteTransactionFailure 即可回報 errorClass(busyOrLocked、fatal 或 postCommitAmbiguous)。
未設定 client 的 sessionFs 選項時,SDK 不會呼叫 createSessionFsProvider,既有的 sessionFsProvider(readFile 與 writeFile)仍可照常運作。
多租戶應用程式的 empty 模式
將 client 的mode 設為 empty,即可預設停用依賴 Copilot CLI 主機環境或跨 Session 狀態的功能。
預設值為 copilot-cli,會維持既有行為。
在 empty 模式下,必須設定一個持久化目標:base_directory、session_fs 或外部伺服器的 url。
availableTools。
使用 ToolSet 建立帶有來源前綴的工具篩選條件(builtin:、custom:、mcp:)。
BuiltInTools::Isolated 只允許侷限於單一 Session 的內建工具,不可存取主機檔案系統、環境變數、網路或跨 Session 資源。
/^[a-zA-Z0-9_-]+$/ 或為萬用字元 *,否則 ToolSet 會拋出 InvalidArgumentException。
empty 模式會對 Session 遙測、持久化的 MCP OAuth Token 儲存、embedding 檢索與快取、指示探索、檔案 Hook、主機 git 操作、session store、GitHub cache store、Skill、memory 以及實驗模式套用安全的預設值。
明確設定的 Session 選項會優先於這些預設值。
replace 模式的 systemMessage 會原樣使用;其他模式則會移除 environment_context 區塊。
SDK 也會為 CLI 程序設定 COPILOT_DISABLE_KEYTAR=1。
GitHub cache store
設定enableGitHubCacheStore: true 以請求唯讀的 GitHub cache store。
只有在 CLI 的 GITHUB_CACHE_STORE feature flag 啟用時,才會註冊 github_sql 工具。
最新資訊請參閱 GitHub 儲存庫。