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 已經有自己的;箱子不需要。