学习目标:学会使用Monty在你的应用中安全地执行AI生成的Python代码,并理解其核心概念如外部函数调用、状态快照等。
前置知识
Monty是一个Python解释器,你需要理解Python的基本语法、函数定义和类型提示,才能编写和调试在Monty中运行的代码。
项目本身用Rust编写,但作为使用者,你主要通过Python绑定来调用。了解Rust有助于理解项目背景和高级用法,但不是使用它的必要条件。
需要能够使用pip安装包,并运行Python脚本。
学习步骤
环境准备与初体验
30分钟安装Monty
在你的Python环境中,使用pip安装pydantic-monty包。命令:`pip install pydantic-monty`。
建议使用虚拟环境(如venv)来管理依赖,避免污染全局环境。
验证安装
创建一个简单的Python脚本(如test_monty.py),导入`pydanticmonty`模块。如果导入成功,说明安装正确。
如果导入失败,请检查Python版本(建议3.8+)和pip是否正确指向你的虚拟环境。
核心概念与基础运行
1小时运行第一段代码
参考README的第一个代码块,创建一个Monty实例,运行一段简单的Python代码(如`x + 1`),并通过`inputs`参数传入变量值。使用`m.run()`方法执行并打印结果。
重点理解`Monty(code, inputs=['x'])`中`inputs`参数的作用:它定义了代码中需要从外部传入的变量名。
理解外部函数调用
尝试README中关于`fetch(url)`的示例。创建一个模拟的`fetch`函数,在Python主程序中定义它,并通过`externalfunctions`参数让Monty知道可以调用它。使用`m.start()`和`resume()`来控制执行流程。
这是Monty安全性的核心!代码中的`fetch`只是一个声明,实际的函数逻辑在你的主程序中。Monty会在调用时暂停,等待你提供返回值。
高级功能探索
1.5小时体验类型检查
编写一段包含类型提示(如`def greet(name: str) -> str:`)的Python代码。在创建Monty实例时,设置`typecheck=True`。尝试传入错误类型的参数,观察类型检查是否生效。
类型检查在代码执行前进行,有助于提前发现LLM生成代码中的类型错误。
实践状态快照
按照README的“Serialize execution state mid-flight”示例,完整走一遍流程:1. 启动执行到外部函数调用暂停。2. 使用`.dump()`保存状态。3. 使用`.load()`恢复状态。4. 使用`.resume()`继续执行。
这个功能非常强大,允许你将AI Agent的中间状态持久化到数据库或文件中,实现“暂停/继续”或跨进程恢复。
结合AI Agent框架
参考README末尾的“AI Agent Example”,尝试理解`CodeModeToolset`和`Agent`的用法。虽然可能需要安装额外的AI框架(如pydantic-ai),但这一步旨在理解Monty如何集成到AI工作流中。
即使不运行完整示例,也请阅读代码,理解Monty在这里的角色:它提供了一个安全的“沙箱”,让AI生成的工具代码在其中运行。
总结与调试
1小时设计一个小项目
构思一个简单场景:例如,一个AI助手可以帮你计算(但只能使用你提供的`add`, `multiply`函数)或处理字符串。用Monty实现这个安全沙箱。
从最简单的开始,比如只允许一个外部函数。确保你完全控制了代码可以访问的所有资源。
阅读错误信息与调试
故意在Monty运行的代码中制造一些错误:语法错误、调用未授权的外部函数、类型错误等。观察Monty返回的错误信息,学习如何定位问题。
记住,Monty运行的是一个“子集”的Python。如果遇到不支持的语法,需要查阅项目源码或Issue来确认。
推荐资源
项目主页的README文件,包含了安装、核心示例和高级用法,是学习的第一手资料。
查看已有的问题和讨论,可以了解常见的使用难题、已知限制和未来的开发方向。
如果你计划将Monty用于Pydantic AI框架,需要查阅其官方文档来了解`CodeModeToolset`等的详细用法。
常见错误与避坑指南
忘记在`externalfunctions`参数中声明外部函数名
在Monty代码中调用的每一个主机函数,都必须先在创建Monty实例时,在`externalfunctions`列表中进行声明,否则执行会报错。
混淆`inputs`和外部函数调用
`inputs`用于在代码执行前传入简单的数据(如字符串、数字)。复杂的操作或需要访问外部资源的操作,应通过外部函数调用来实现。
试图在Monty中运行不受支持的Python语法或模块
Monty是Python的一个子集。避免使用复杂的语言特性或尝试导入标准库/第三方库。所有“危险”操作都应通过你控制的外部函数提供。
对`start()`和`resume()`的流程理解不清
`m.start()`会执行代码,直到遇到第一个外部函数调用或执行完毕。它返回一个“快照”对象。你必须调用这个快照对象的`.resume(returnvalue=...)`来提供外部函数的返回值,并继续执行。这是一个分步过程。
下一步探索
学完基础后可以继续探索的方向:1. 深入研究Monty的Rust源码,理解其解释器的工作原理和安全性实现。2. 将其集成到更复杂的AI Agent流水线或Web服务中。3. 探索性能极限,测试在大量并发或复杂代码下的表现。4. 关注项目更新,了解其对Python语法支持范围的扩大。
相关项目推荐
rust-lang/rust
让每个人都能构建可靠高效的软件
rustdesk/rustdesk
一款专为自建远程访问需求设计的开源远程桌面应用程序,可作为TeamViewer的替代方案。
denoland/deno
面向 JavaScript 与 TypeScript 的现代化运行时
tauri-apps/tauri
通过 Web 前端构建更小、更快、更安全的桌面与移动应用程序
astral-sh/uv
基于Rust开发的极速Python包和项目管理器
zed-industries/zed
以思维速度编码——Zed 是由 Atom 和 Tree-sitter 的创作者打造的高性能多人协作代码编辑器。