开发工具#运行时#安全

Monty:用 Rust 写的 AI 代码沙箱

Monty 是用 Rust 写的 Python 沙箱,专门运行 AI 生成的代码:文件、环境变量和网络默认不存在,只能通过调用方传入的函数和挂载访问宿主。

项目资料

GitHub Ecosystem
仓库地址github.com/pydantic/monty
许可证
MIT
主语言
Rust
星标
8,875
核查时间
2026-11-10

以上快照资料以核查当日为准,可能随版本或运营策略变化。

很多 AI 应用会让模型写一段 Python 再执行它。难点在执行方式:每次都起一个容器,开销大;直接在应用进程里用 exec,代码就拥有应用的权限。Monty 是 Pydantic 开源的 Python 沙箱,用 Rust 实现,专门运行 LLM 生成的代码。GitHub 在 2026 年 11 月 10 日显示 8,875 颗星,最新版本 v1.5.0 于 11 月 5 日发布。

核心功能

  • 默认没有宿主访问:沙箱里没有文件系统、环境变量和网络。项目文档称,在没有挂载和宿主函数的情况下,沙箱读不到文件和环境变量,也打不开套接字、启动不了进程,因为解释器本身就没有这些操作。
  • 宿主函数显式传入:通过 external_lookup 把函数交给沙箱。代码调用它时执行暂停,函数在宿主上运行,结果再交回沙箱。文档也提醒,宿主函数以宿主的完整权限运行,遇到路径或 URL 参数要像校验不可信输入那样校验。
  • 会话保留状态:同一次取出的会话里,多次 feed_run 之间保留变量,前面的命令不需要重放。新取出的会话看不到上一个会话的变量:我们的测试中,它抛出 NameError。
  • 可导出的快照:沙箱状态可以在外部函数调用处或结束时导出为字节,之后再恢复。文档说明 Monty 不对快照做身份认证,恢复前要自行确认来源与完整性。
  • 商业支持版:同一批 worker 以 gRPC 服务和容器镜像的形式提供,并额外提供操作系统层隔离与水平扩展。文档把它列为非免费方案,开源版则是 MIT 许可。

典型使用场景

  • 为 Agent 增加代码执行工具的开发者:模型写一小段 Python 做计算或数据整理,宿主只提供需要的函数。README 的示例就是这样:模型写的代码调用宿主的 nutrition 函数查热量,沙箱只拿到返回值。
  • 已在用 Pydantic AI 的团队:README 说明 Monty 在 Pydantic AI 的 Code Mode 中运行 Agent 写的代码。
  • 每次请求都需要新沙箱的服务:项目对比图中,本地 Docker 为约 195 毫秒,托管沙箱服务为约 1500 毫秒(见下方表格)。

快速上手

README 用 uv add pydantic-monty 安装 Python 包。我们在新建的虚拟环境里用 pip install 安装了同一个包(1.5.0),运行环境为 Python 3.15.2(arm64)。README 的示例输出为 a chocolate bar powers a 10 W bulb for 26.7 hours,与我们的运行结果一致。

from pydantic_monty import Monty

code = """
kcal = nutrition('chocolate bar')['kcal']
hours = kcal * 4184 / (bulb_watts * 3600)
print(f'a chocolate bar powers a {bulb_watts} W bulb for {hours:.1f} hours')
"""

with Monty() as pool:
    with pool.checkout() as session:
        session.feed_run(
            code,
            inputs={'bulb_watts': 10},
            external_lookup={'nutrition': lambda food: {'kcal': 230}},
        )
        #> a chocolate bar powers a 10 W bulb for 26.7 hours

示例里的 nutrition 在宿主上运行,沙箱只看到它的返回值。

性能数据

下表数字取自项目文档的对比页(pydantic.dev/docs/monty/reference/alternatives/),衡量的是取得一个新沙箱并运行 1 + 1 的时间。

方案新沙箱耗时执行位置
OSS Monty(从池中取出)约 0.8 ms本地
Commercial Support(连接池已打开)约 2 ms远程
WASI / wasmtime约 16 ms本地
本地 Docker(运行中的容器,docker exec)约 195 ms本地
托管沙箱服务(已有的 Daytona 沙箱)约 1500 ms远程
Pyodide(Deno 沙箱)约 2700 ms本地

文档的测量说明:除另有说明外,图表数字于 2026 年 9 月 3 日在 Apple M3 Max(macOS 26.5.2)上测得,使用 CPython 3.14.7,每个新沙箱单次采样。OSS Monty 的数字来自 2026 年 9 月 24 日的测量(pydantic-monty 1.0.0b3,池中已有 worker、空闲一秒后取用);文档同时写明,连续取用时约 0.04 毫秒。托管沙箱服务一行经 daytona 0.207.0 SDK 测量,沙箱位于 Daytona 欧洲区域,从伦敦调用。

我们在 Apple M1(macOS 27.2)上用 pydantic-monty 1.5.0(2026 年 11 月 10 日)连续取用并运行 1 + 1,共 400 次,丢弃前 40 次,中位数为 0.07 毫秒,与文档的连续取用数字在同一量级。这只是一台机器、一个版本上的观察,不能直接套用到其他硬件。

小结

适合:要为每个请求提供轻量沙箱、能接受 Python 子集的 Agent 或工具开发者。不适合:需要完整 CPython 及其标准库的场景,需要操作系统级隔离却不愿付费的场景,或者想把不可信代码直接放进应用进程运行的场景。仓库采用 MIT 许可,主要语言为 Rust。

上线前请先读完三条限制。第一,开源版是语言层沙箱,不是容器或虚拟机:文档说明没有容器、没有 seccomp 过滤器,也没有虚拟机,隔离来自解释器本身。第二,开源版与调用方运行在同一台机器上,操作系统级隔离要用商业支持版。第三,它只实现 Python 的一部分,例如文档在解析阶段就拒绝类继承(class Foo(Bar):)。另外,v1.1.0 到 v1.5.0 在 2026 年 10 月 5 日至 11 月 5 日之间发布,升级前应逐个查看版本说明。

项目方要求把安全问题通过仓库的安全公告渠道私下报告,并提到有持续的漏洞赏金计划。如果你需要的是虚拟机级别的隔离,可以对照 App Sandbox:它是 Windows 11 家庭版上的开源虚拟机,并提供给 AI 代理驱动的无界面 API,思路与 Monty 的语言层隔离不同。