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 是用於 Skill、自訂 Agent、檔案 Hook 與自訂指示的僅供探索的根目錄。
它們不會授予 Agent 一般的檔案存取權限。
若要新增一般的檔案存取位置,請使用 additionalDirectories。
無論是否啟用 enableConfigDiscovery,都可以設定探索根目錄。
SDK 會在設定時,以當下有效的 workingDirectory 為基準解析一次相對路徑。
即使之後 working directory 變更,這些根目錄也不會跟著移動。
省略該 key 或傳入 null 時,預設的探索來源維持不變。
傳入 [] 只會清除 SDK 明確設定的根目錄。
針對 Skill、Agent、Hook 與指示的個別停用設定與 Managed Settings 仍然適用。
Working directory 信任
建立 Session 時設定trustWorkingDirectory,即可將 working directory 標記為受信任。
WorkingDirectoryTrust::Session僅在目前的 Session 中信任該目錄。WorkingDirectoryTrust::User會持久化信任狀態,之後的 Session 也會信任該目錄。
trustWorkingDirectory 僅在建立 Session 時可用,ResumeSessionConfig 不接受此選項。
Memory 注入模式
MemoryConfiguration 用來控制跨 Session 的 memory。
其中的 mode 選項決定 runtime 將 memory 注入至何處:
MemoryMode::SystemPrompt(system-prompt)會將 memory 注入系統提示。省略mode時為預設值。MemoryMode::UserPrompt(user-prompt)會將 memory 注入產生的使用者訊息。
由應用程式管理的記憶儲存區
將閉包傳給MemoryConfiguration 的 storeMemory,即可在應用程式端接收並儲存執行階段想要儲存的記憶。閉包會接收 StoredMemory(sessionId、subject、fact、citations、reason),以及帶有可用來檢查取消狀態之 signal 的 MemoryStoreCallOptions。
- 使用
storeMemory時,請將enabled設為true。維持false會拋出例外。 storeMemory本身不會包含在 RPC 酬載中,SDK 在建立或恢復工作階段時只會傳送hasMemoryStore: true。- 雲端工作階段無法使用。
- 執行階段將不再回想記憶,
vote_memory也將無法使用。請透過systemMessage等方式在應用程式端補足已儲存記憶的回想。 - 回呼的
signal會在逾時或連線中斷時被取消,之後傳回的結果會被捨棄。
權限模式
指定permissionMode 後,會在建立或恢復工作階段時將權限模式傳給執行階段。省略時維持執行階段的預設值。可以使用 PermissionMode enum 或字串指定,ResumeSessionConfig 也可以同樣指定。雲端工作階段不支援。
PermissionMode::Manual(manual)以一般核准流程處理權限請求。PermissionMode::Assisted(assisted)會為權限請求附加 LLM 的安全性建議。用戶端可以自動核准判定為沒有問題的請求。PermissionMode::AllowAll(allow-all)會自動核准工具、路徑與 URL 的權限請求。
$session->permissionModeResult() 取得。success 表示是否套用成功,mode 是套用後的權限模式。回應中不包含結果時傳回 null。
自動模式的復原
指定autoModeRecovery: true 後,會要求執行階段自動復原進行中的請求。預設值為 false。此功能必須提供 onAutoModeSwitchRequest 處理常式,否則會拋出例外。復原時的重試與倒回由執行階段處理,因此應用程式不需要重新傳送提示詞。
autoModeRecovery 需要在建立與恢復時都指定。若執行階段沒有將 capabilities.ui.autoModeRecovery 回應為 true,工作階段會被分離並拋出例外。不使用此功能時,現有 onAutoModeSwitchRequest 針對後續訊息的切換行為維持不變。
排除 Managed Settings
使用excludedManagedSettings 列出 runtime 應從其取得的 Managed Settings 中移除的設定路徑。
這不會影響透過 managedSettings 直接注入的設定。
若要在恢復後維持排除,請在 ResumeSessionConfig 中再次傳入 excludedManagedSettings。
ResumeSessionConfig 類別。與 SessionConfig 幾乎相同,但略有差異。ResumeSessionConfig 只需指定想變更的項目。其他項目會沿用新 Session 開始時的設定。
SDK 會在建立與恢復的 RPC payload 中送出相同的 Session 選項。
其中包含 BYOK 的 provider 與模型、memory、enableMcpApps、interactiveUser、autopilot、sandboxConfig、excludedManagedSettings、探索根目錄,以及 onMcpAuthRequest、onExitPlanModeRequest、onAutoModeSwitchRequest 等處理器。
恢復時,請透過 ResumeSessionConfig 或使用相同 key 的陣列傳入。
Closure 與 provider 物件不會被持久化,因此每次恢復時都需要重新提供。
Autopilot 自動繼續
使用autopilot 設定 Autopilot 模式的自動繼續政策。
它不會變更 Session 模式本身。
新的 SDK Session 預設啟用自動繼續,maxContinues 為 5。
將 maxContinues 設為 0 即可關閉一般的自動繼續。
ResumeSessionConfig 或陣列中傳入相同的 autopilot key。
warm resume 時,省略的欄位會保留目前的值。
runtime 重新啟動後(cold resume),請重新傳入這些設定。
Sandbox 設定
使用sandboxConfig 為 Session 設定 CLI sandbox。
SDK 會在建立與恢復請求中都轉送此設定。
為了相容既有程式碼,SDK 也接受 sandbox 作為別名。
兩者同時設定時,以非 null 的 sandboxConfig 為優先。
auth 與 credentials,可讓 sandbox 內的程序使用憑證而不暴露其值:
auth會為git與gh啟用憑證注入。credentials.envVars將環境變數名稱對應到允許接收其遮罩值的 HTTPS 主機(injectHosts)。請勿將憑證值本身寫入設定中。
Revolution\Copilot\Types\Rpc 命名空間中的 SandboxConfig、SandboxConfigAuth、SandboxCredentialsConfig、SandboxMaskedEnvVar、SandboxConfigUserPolicyExperimental 與 SandboxConfigUserPolicyExperimentalSeatbelt 等具型別物件。
網路的允許與封鎖規則取決於 CLI sandbox 的功能與版本。
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、Skill、memory 以及實驗模式套用安全的預設值。
明確設定的 Session 選項會優先於這些預設值。
GitHub cache store 既不是 empty 模式的預設值,也不是 Session 選項。SDK 不再於 Session 建立或恢復請求中送出 enableGitHubCacheStore,若陣列設定中仍保留此 key,也會被忽略。
replace 模式的 systemMessage 會原樣使用;其他模式則會移除 environment_context 區塊。
SDK 也會為 CLI 程序設定 COPILOT_DISABLE_KEYTAR=1。
雲端執行請參閱 Cloud Sessions,Plugin Directory 請參閱 Plugin Directories。
最新資訊請參閱 GitHub 儲存庫。