全部產品
Search
文件中心

Function Compute:使用 Claude Code Sandbox

更新時間:Oct 24, 2026

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 注入 — 鏡像內不預置

使用情境

以下樣本假設已完成 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 能力約定)