Claude Code 是 Anthropic 的終端 AI 編程 Agent,可在沙箱內讀代碼、改檔案、執行命令。本文聚焦真實任務情境:複製倉庫、串連 MCP、擴充 Skill、擷取結構化輸出與會話恢複。鏡像地址、構建 Template、建立沙箱與基礎運行見 Claude Code 模板。
首次使用請先完成通過 SDK 使用雲沙箱中的前置準備、API Key 建立和 SDK 配置。
前置條件
已完成 SDK 接入(E2B API Key、
api_url、domain)已按 Claude Code 模板 構建出狀態為
ready的模板,並建立沙箱、初始化~/.claude.json已準備模型 API Key,建立沙箱時通過
envs注入 — 鏡像內不預置中國站:百鍊控制台 擷取 API Key(
sk-開頭)國際站:Anthropic Console 擷取
ANTHROPIC_API_KEY
使用情境
以下樣本假設已完成 Template 構建,sandbox 已建立且已初始化 ~/.claude.json。
複製倉庫並執行任務
sandbox.git.clone(
"https://github.com/your-org/your-repo.git",
path="/home/user/repo",
username="x-access-token",
password="<your-github-token>",
depth=1,
)
result = sandbox.commands.run(
'cd /home/user/repo && claude --dangerously-skip-permissions < /dev/null '
'-p "Add error handling to all API endpoints"',
on_stdout=lambda data: print(data, end=""),
timeout=0,
)
diff = sandbox.commands.run("cd /home/user/repo && git diff")
print(diff.stdout)擷取結構化 JSON 輸出
import json
result = sandbox.commands.run(
'claude --dangerously-skip-permissions --output-format json < /dev/null '
'-p "List all files and describe each" 2>&1',
timeout=0,
)
for line in reversed(result.stdout.strip().split("\n")):
if line.startswith("{"):
response = json.loads(line)
break
else:
raise RuntimeError("no JSON in output")
print(response.get("result") or response)流式 JSONL 輸出
import json
def handle_event(data):
for line in data.strip().split("\n"):
if line.startswith("{"):
event = json.loads(line)
if event["type"] == "assistant":
usage = event.get("message", {}).get("usage", {})
print(f"[assistant] tokens: {usage.get('output_tokens')}")
elif event["type"] == "result":
print(f"[done] {event['subtype']} in {event['duration_ms']}ms")
sandbox.commands.run(
'claude --dangerously-skip-permissions --verbose --output-format stream-json < /dev/null '
'-p "Find and fix all TODO comments" 2>&1',
on_stdout=handle_event,
timeout=0,
)恢複會話
import json
initial = sandbox.commands.run(
'claude --dangerously-skip-permissions --output-format json < /dev/null '
'-p "Analyze the codebase and create a refactoring plan" 2>&1',
timeout=0,
)
for line in reversed(initial.stdout.strip().split("\n")):
if line.startswith("{"):
session_id = json.loads(line)["session_id"]
break
else:
raise RuntimeError("no session_id in output")
sandbox.commands.run(
f'claude --dangerously-skip-permissions --resume {session_id} < /dev/null '
f'-p "Now implement step 1 of the plan"',
on_stdout=lambda data: print(data, end=""),
timeout=0,
)自訂系統提示詞
sandbox.files.write("/home/user/repo/CLAUDE.md", """
You are working on a Go microservice.
Always use structured logging with slog.
Follow the project's error handling conventions in pkg/errors.
""")
sandbox.commands.run(
'cd /home/user/repo && claude --dangerously-skip-permissions < /dev/null '
'-p "Add a /healthz endpoint"',
timeout=0,
)串連 MCP 工具
Claude Code 原生支援 MCP。可通過 claude mcp add 手動註冊 MCP Server,沙箱具備出站網路。
stdio 本地進程(推薦):
sandbox.commands.run(
"claude mcp add --transport stdio fs -- "
"npx -y @modelcontextprotocol/server-filesystem /home/user",
timeout=180,
)
result = sandbox.commands.run(
'claude --dangerously-skip-permissions < /dev/null '
'-p "Use the fs MCP tool to list /home/user and summarize top-level entries."',
timeout=0,
)HTTP 遠程 Server:
sandbox.commands.run(
"claude mcp add --transport http deepwiki https://mcp.deepwiki.com/mcp",
)
result = sandbox.commands.run(
'claude --dangerously-skip-permissions < /dev/null '
'-p "Use deepwiki MCP: what tools are available?"',
timeout=0,
)MCP 支援範圍與限制見 Claude Code 模板中的“MCP 與 Skill 能力約定”。
使用 Skill 擴充能力
鏡像不預裝自訂 Skill。Skill 是 Claude Code 的檔案系統約定:放入帶 SKILL.md 的目錄即可。詳情見 Extend Claude with skills。
| 範圍 | 路徑 |
| 個人(本沙箱內全域) | /home/user/.claude/skills/<name>/SKILL.md |
| 專案 | <專案>/.claude/skills/<name>/SKILL.md |
觸發方式:在 -p 提示詞中寫 /skill-name 顯式調用,或描述匹配任務由模型自動載入。Claude Code 還內建 /debug、/code-review 等 bundled skill,無需額外安裝。
運行時寫入個人 Skill:
sandbox.files.write(
"/home/user/.claude/skills/summarize-changes/SKILL.md",
"""---
description: Summarizes uncommitted changes and flags risks. Use when reviewing diffs or writing commit messages.
---
## Instructions
1. Run `git diff HEAD` and summarize changes in 2–3 bullets.
2. List risks such as missing error handling or hardcoded values.
3. If the diff is empty, say there are no uncommitted changes.
""",
)
result = sandbox.commands.run(
'claude --dangerously-skip-permissions < /dev/null '
'-p "/summarize-changes"',
timeout=0,
)
print(result.stdout)專案內 Skill(隨倉庫 / 工作目錄生效):
sandbox.files.write(
"/home/user/repo/.claude/skills/api-conventions/SKILL.md",
"""---
description: API design conventions for this codebase. Use when adding or changing HTTP endpoints.
---
When writing API endpoints:
- Use RESTful naming
- Return consistent error formats
- Include request validation
""",
)
sandbox.commands.run(
'cd /home/user/repo && claude --dangerously-skip-permissions < /dev/null '
'-p "/api-conventions Add a /healthz endpoint"',
timeout=0,
)從本機上傳多檔案 Skill 目錄:
若 Skill 含 scripts/、references/ 等附屬檔案,用 files.write_files 一次批量寫入,不必逐檔案調用 files.write:
from pathlib import Path
def upload_skill_dir(sandbox, local_dir: str, remote_root: str) -> None:
local = Path(local_dir).resolve()
entries = []
for path in local.rglob("*"):
if path.is_file():
rel = path.relative_to(local).as_posix()
entries.append({
"path": f"{remote_root.rstrip('/')}/{rel}",
"data": path.read_bytes(),
})
sandbox.files.write_files(entries)
# 本機目錄結構樣本:
# ./my-skills/echo-marker/SKILL.md
# ./my-skills/echo-marker/scripts/marker.txt
upload_skill_dir(
sandbox,
"./my-skills/echo-marker",
"/home/user/.claude/skills/echo-marker",
)
result = sandbox.commands.run(
'claude --dangerously-skip-permissions < /dev/null '
'-p "/echo-marker"',
timeout=0,
)
print(result.stdout)專案範圍同理,把 remote_root 換成 /home/user/repo/.claude/skills/<name>。也可複製已含 .claude/skills/ 的倉庫後直接使用。
關於 Template.copy:暫不支援
Template.build時用.copy("local-dir", "/home/user/.claude/skills/...")預置檔案。自訂 Skill 請用上方運行時files.write/files.write_files。
計費說明
Sandbox 按 CPU、記憶體規格與運行時間長度計費;模型 API 呼叫費用由模型服務單獨結算。詳見 計費概述。
常見問題
| 現象 | 處理 |
| 報配置損壞 | echo '{}' > /home/user/.claude.json |
| Agent 無響應 | 確認 已注入模型 Key;中國站用百鍊 配置確認 envs 已注入 ANTHROPIC_API_KEY |
| 構建失敗 | 確認 FROM_IMAGE 與地區匹配 |
| name 'TEMPLATE_NAME' is not defined | 控制台擷取模板名稱並替換 TEMPLATE_NAME |
| 其他 SDK / 構建問題 | 見範本管理員 |
參考
Claude Code 模板(鏡像地址、構建 Template、建立沙箱與基礎運行、環境概覽、MCP/Skill 能力約定)