SpadeBox 实战:AI Agent 的沙箱化工具与 JS 运行时
AI Agent 越强大,它调用的工具就越需要谨慎管理。直接给 Agent 一个 bash 工具虽然方便,但也意味着它能读取任意文件、执行任意命令——当 Agent 的决策权逐渐扩大时,这种「自由」就成了隐患。
SpadeBox 提供了一种更克制但更安全的方案:一组沙箱化的工具和轻量级 JS 运行时,让 AI Agent 的文件操作、网络请求、代码执行都在可控范围内进行。
SpadeBox 是什么
SpadeBox 是用 Rust 编写的沙箱化工具集 + JS 运行时,专为 AI Agent 设计。它提供 JavaScript、Python、Rust 三种语言的绑定,也支持通过 MCP 服务器直接集成。
核心工具有 9 个:
| 类别 | 工具 |
|---|---|
| 文件操作 | read_file, write_file, edit_file, move, grep, glob |
| 网络请求 | fetch |
| 代码执行 | js_repl, js_exec |
没有 bash,没有 exec,没有 eval——只有精心设计过的安全原语。
为什么不用 bash
传统的 Agent 工具套件通常包含一个完整的 bash 工具,Agent 可以用它做任何事。这带来了几个问题:
- 上下文膨胀:一次
ls -la的输出可能数千行,消耗大量 Token - 安全隐患:Agent 可能无意中删除文件、读取敏感信息
- 不可控性:
bash的语义边界模糊,很难做细粒度的权限控制
SpadeBox 的设计哲学是:用 JS 引擎替代 bash,提供安全的代码执行环境;用 cap-std(Capability-based Security)做文件系统沙箱;用域名白名单控制网络访问。
快速安装
SpadeBox 已发布到三大包管理器:
npm install @spadebox/spadebox pip install spadebox cargo add spadebox-core
JavaScript 快速上手
在 Node.js 环境中使用 SpadeBox 只需三步:
import { SpadeBox } from "@spadebox/spadebox";
// 1. 创建沙箱实例,启用所需功能
const sb = new SpadeBox()
.enableFiles("/workspace") // 文件操作仅限于 /workspace
.enableHttp() // 启用 HTTP 请求
.allow("api.example.com", ["GET", "POST"]) // 只允许特定域名
.enableJs(); // 启用 JS 执行
// 2. 获取工具列表(传给 LLM)
const tools = sb.tools();
// 3. 处理 Agent 的工具调用
const result = await sb.callTool("read_file", JSON.stringify({
path: "src/main.ts"
}));
.enableFiles("/workspace") 是关键——所有文件操作被限制在这个目录内,Agent 无法读取 /etc/passwd 或 ~/.ssh/id_rsa。
Python 集成
Python 的使用方式几乎一模一样:
from spadebox import SpadeBox
sb = (SpadeBox()
.enable_files("/workspace")
.enable_http()
.allow("api.example.com", ["GET", "POST"])
.enable_js())
tools = sb.tools() # 传给 LLM
result = sb.call_tool("read_file", '{"path": "src/main.rs"}')
如果只用文件工具,可以只调用 .enable_files():
sb = SpadeBox().enable_files("/tmp/my-project")
tools = sb.tools()
MCP 服务器模式
SpadeBox 内置了 MCP 服务器,通过 spadebox-mcp 命令以 MCP 协议暴露工具:
spadebox-mcp --files /workspace spadebox-mcp --allow "api.example.com:GET,POST" --allow "*.cdn.example.com:GET" spadebox-mcp --js spadebox-mcp --files /workspace --allow "api.example.com:GET" --js
MCP 模式让 SpadeBox 可以无缝接入 Claude Code、Codex CLI 等支持 MCP 协议的 Agent 框架,不需要写胶水代码。
密钥管理
SpadeBox 的一个实用特性是 HTTP 密钥管理。你可以为特定域名注册凭据,得到一个安全令牌传给 Agent——Agent 发起请求时,SpadeBox 自动将令牌替换为实际密钥:
sb = (SpadeBox()
.enable_http()
.allow("api.openai.com", ["POST"]))
sb.set_credentials("api.openai.com", "Bearer sk-xxx...")
Agent 拿到的只是令牌引用而非原始密钥——即使 Agent 的日志被泄露,攻击者看到的也只是令牌 ID,真正的密钥安全地存储在 SpadeBox 内部。
默认上下文保护
SpadeBox 的工具都带有默认输出限制,防止 Agent 被大量输出撑爆上下文:
- 文件读取默认截断至 1000 行
grep结果限制匹配数量- HTML 自动转 Markdown,减少原始标签噪音
- 所有工具的输出都有最大字符限制
这些限制可通过配置调整,但默认值已经经过调优,适合多数场景。
适合场景
SpadeBox 最适合以下场景:
- 你正在构建自定义 Agent 框架——不想重新实现一套安全的工具层
- 你担心 Agent 的
bash权限过大——需要更细粒度的控制 - 你需要 JS/TS 或 Python 的 Agent SDK——多语言绑定覆盖主流生态
- 你的 Agent 需要做文件操作和网络请求——但不需要完整的 shell 能力
如果 Agent 必须用到 Docker、数据库或特定系统命令,可以在 SpadeBox 基础上额外补充自定义工具,不需要把整个沙箱推倒重来。
对比 bash 工具方案
| 维度 | bash 工具 | SpadeBox |
|---|---|---|
| 文件系统访问 | 无限制 | 限定目录 |
| 网络访问 | 无限制 | 域名白名单 |
| 代码执行 | 任意命令 | 受限 JS 引擎 |
| 输出控制 | 无限制 | 默认截断 |
| 密钥管理 | 需自行处理 | 内置令牌替换 |
| 上下文保护 | 无 | 自动 HTML→Markdown |
总结
SpadeBox 不追求「全能」——它故意不提供 bash,因为 bash 的灵活性本身就是一个安全隐患。如果你需要的是一组精心设计的、安全的、可配置的 Agent 工具原语,SpadeBox 提供了一个现成的 Rust 实现,覆盖 JS/Python/Rust 三种语言生态。对于正在构建自定义 Agent 的开发者来说,这是比从零造轮子更明智的起点。
项目地址:github.com/CharlyCst/spadebox 文档:spadebox.github.io/docs/about npm:
@spadebox/spadebox· PyPI:spadebox· crates.io:spadebox-core