Secrets
箱子偶爾需要憑證:clone 私有 repo 的 token、log SDK 的 write key、你的測試會打到的某個服務的 API key。Secrets 就是把這些交給箱子、又不放進 repo、prompt 或工具呼叫的方法。
怎麼運作
- 一個 secret 是一組名稱與值,存在控制面,每個帳號自己的。名稱就是環境變數名,用大寫英文、數字與
_,以字母開頭:PSBX_LOG_WRITE_KEY、GITHUB_TOKEN、STRIPE_TEST_KEY。值最多 64 KB。 - 預設什麼都不會進箱子。
sandbox_start的secrets是名稱清單,只有列出的才注入,在箱子被認領的那一刻變成每個sandbox_exec命令的環境變數。sandbox_secrets帶id與names可以再注入到已經在跑的箱子。 - 新箱子從不帶任何租戶資料的快照開起來。認領時才拿到租戶設定與 secrets;箱子停掉時上面的一切都會銷毀。
- 值不會出現在工具回傳、
sandbox_status、用量事件或平台 log 裡。命令把值印出來時,回來的是遮過的:sandbox_exec的輸出與sandbox_procs的 log 結尾,會把 8 個字以上的 secret 值換成****(規則見sandbox_exec)。箱子裡的檔案不改,所以背景命令的 log 檔、或用sandbox_get拿出來的檔案裡是真的值。sandbox_secrets只回名稱。 - 箱子自己沒有任何雲端憑證,連你其他的箱子也只能經你宣告的 link。唯一能拿到雲端權限的方式是它的環境指定了 AWS 角色,由那個角色發給它暫時憑證。
建立與管理
用 REST API,帶 token:API key,或 OAuth access token(key 從哪來):
curl -fsS -X PUT https://api.parallelsandbox.com/v1/secrets/GITHUB_TOKEN \
-H "Authorization: Bearer $PSBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "value": "ghp_..." }'
用既有名稱再建一次就是換值;之後認領的箱子拿到新值。刪除用 DELETE /v1/secrets/{name};GET /v1/secrets 列出名稱。
人也可以在 app.parallelsandbox.com 的設定 → Secrets 新增、換值、刪除,那裡只列名稱與更新時間,值永遠不顯示。token 在人手上時請他走這裡:在 app 填的值不經過你們的對話,也就不會送到 AI 供應商;不要叫人把值貼進對話。
agent 列出有哪些:
sandbox_secrets {}
在箱子裡用
sandbox_start { "name": "私有 repo 測試", "goal": "跑私有 repo 的測試;在箱子裡全部通過就算完成", "services": [{ "name": "web", "port": 8080 }], "secrets": ["GITHUB_TOKEN", "PSBX_LOG_WRITE_KEY"] }
sandbox_exec { "id": "<id>", "cmd": "git clone https://x-access-token:$GITHUB_TOKEN@github.com/your-org/private-repo.git && cd private-repo && git remote set-url origin https://github.com/your-org/private-repo.git", "note": "clone 私有 repo" }
做到一半才發現需要的 secret,可以直接注入跑著的箱子,不用重開;之後的命令都看得到,已經在跑的程序與容器維持它們啟動時的環境:
sandbox_secrets { "id": "<id>", "names": ["STRIPE_TEST_KEY"] }
docker compose 用 compose 檔裡的 ${GITHUB_TOKEN} 或 environment: 裡不帶值的項目把環境變數帶進容器;docker run 用 -e GITHUB_TOKEN。不要用 ARG 把 secret 烤進 image;image 可能被發布成版本、被別的箱子拉走。
建置要用的金鑰(前端的 VITE_GOOGLE_MAPS_API_KEY、NEXT_PUBLIC_*)也一樣:用建置讀的那個名字存成 secret,放進 secrets(或用 sandbox_secrets 注入),在同一個 sandbox_exec 裡建置,它跟其他變數一樣從環境讀 $VITE_GOOGLE_MAPS_API_KEY。不用把含金鑰的 .env 同步進 /work 再留在那裡。建出來的程式碼裡照樣含有這個值(前端金鑰都是這樣),所以只拿你需要的檔案。金鑰在人手上時,請他到 Settings → Secrets 填。
名字不存在時,sandbox_start(與帶 names 的 sandbox_secrets)會以 secrets not found: 名字 (this account has: …) 失敗:錯誤列出帳號有哪些名字,拼錯或大小寫不同一眼就看得出來;值永遠不會出現。
該存什麼
- 供應方有給就用短效 token:GitHub App 的 installation token、STS session、限定範圍的 deploy key。它們會自己過期。
- 像 log SDK 的
psw_...這種可公開的 write key 放在網頁上也可以,但存成 secret 的話 repo 裡就完全沒有租戶專屬的東西。 - 絕對不要把 ParallelSandbox 的 API key 或 token 存成 secret。agent 已經有自己的;箱子不需要。