oh-my-pi eval 工具指南:持久化 Python/JS 内核,还能在代码里回调 agent 工具
【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi
oh-my-pi(OMP)是一个将 IDE 深度集成的开源 AI 编程助手(coding agent)。它的eval 工具是区别于其他 AI 编程工具的独特能力:让 AI 在持久化的 Python / JavaScript 内核中分步执行代码,变量状态跨调用永不丢失;更酷的是,你可以直接在代码里回调 agent 的工具、发起一次模型补全、甚至派出子 agent 干脏活。
一、eval 工具是什么?为什么不用python -c?🤔
很多 AI 编程工具跑 Python 的方式是每次都起一个新进程(类似python -c),这意味着每次执行都是一次性环境:上一行定义的变量、导入的库,下一行全忘了。
oh-my-pi 的 eval 工具彻底改变了这一点:
| 特性 | 传统python -c方式 | oh-my-pi eval 持久内核 |
|---|---|---|
| 变量状态 | 每次执行后丢失 | ✅ 跨多次调用持续保留 |
| 执行单元 | 整段脚本一次性跑 | 一次工具调用 = 一个 cell,可增量推进 |
| 结构化输出 | 只有 stdout 文本 | display()捕获 JSON / 图片 / Markdown |
| 与 agent 互通 | 完全隔离 | ✅ 代码内可直接调用 agent 工具、子 agent |
| 取消/超时 | 需自己处理 | 内建超时看门狗与取消信号 |
官方文档明确要求:临时执行代码请走 eval,不要绕道 bash 去调python -c、node -e(见 docs/tools/eval.md)。它的核心理念是"增量式工作":导入 → 定义 → 测试 → 使用,每一步一个 cell,某一步出错就只重跑那一步,前面的成果原样保留在内核里。
二、四语言持久内核:Python、JavaScript、Ruby、Julia
eval 工具内置 4 个语言后端,各自维护独立的持久运行时,互不干扰(重置 Python 不会影响 JS 的状态):
| 代号 | 运行时 | 默认状态 | 持久化方式 |
|---|---|---|---|
py | IPython 风格的 Python 子进程内核 | ✅ 默认开启 | 按会话 ID + 工作目录 + 解释器复用 |
js | Bun worker VM | ✅ 默认开启 | 会话内常驻,支持顶层await |
rb | Ruby 内核 | ⚙️ 需手动开启 | 常驻TOPLEVEL_BINDING |
jl | Julia 内核 | ⚙️ 需手动开启 | 常驻Main命名空间 |
💡 小技巧:每个语言都有
reset开关,可以在下一次调用前只清空该语言的内核,其他语言的变量原封不动。
下面这张图就是一次真实的 eval 执行:模型在持久 Python 内核里运行 matplotlib 代码,图表、警告、结果说明都以富媒体形式直接回传到界面:
Python 后端的实现非常"轻":单个子进程 + NDJSON 行协议,不依赖 Jupyter、不需要额外 pip 安装,Python 3.10+ 即可(内核封装位于packages/coding-agent/src/eval/py/)。它还支持%pip、%timeit、!cmd等 IPython 风格魔法命令,display()能直接回传 pandas 表格、matplotlib/plotly 图形。
三、预置辅助函数:一个"超能力 REPL"
每个内核启动时都会注入一套跨语言的预置助手函数,让代码天然"长在项目上":
display(value)—— 结构化输出,JSON、图片、Markdown 都能直接"画"给模型看read(path)/write(path, content)—— 直接读写项目文件,支持local://协议env(...)/output(...)—— 查环境变量、取回之前工具调用的完整输出tool.<name>(args)—— ⭐ 在代码里直接调用 agent 的任何注册工具completion(...)/agent(...)—— ⭐ 发起一次性模型调用、派出子 agentparallel(thunks)/pipeline(items, ...stages)—— 有界并发池与分阶段流水线log()/phase()/budget—— 记录日志、打阶段标记、查询预算
比如让 AI 批量处理 500 个文件,它会写一个 cell,用parallel在受限线程池里并发处理,保持顺序、隔离失败——这比"模型逐个调用工具"快得多。
四、最大亮点:在代码里回调 agent 工具 🚀
这是 eval 工具最"反直觉"也最强大的部分——代码不再是被动执行的脚本,而是 agent 的指挥台:
1. 调用任何注册工具
tool.grep({"pattern": "TODO", "path": "src"})代码里一行搞定 grep / read / edit 等 31 个内置工具,结果直接作为 Python 对象返回,方便继续用代码处理。
2. 一次性模型补全completion()
无需工具、无历史的一锤子模型调用,支持smol(快)/default(当前)/slow(最强)三档模型,还能传 JSON Schema 直接拿到解析好的结构化对象。适合在循环里做"翻译一批注释""给每条日志打标签"这类批处理。
3. 派出子 agentagent()
在代码里 spawn 一个子 agent 去探索代码库、跑结构化任务,支持isolated请求独立 worktree、schema约束返回结构。多个子 agent 还能用handle=true+pipeline组成无环任务图:上游子 agent 的输出自动喂给下游,失败只影响自己的子树。
4. 预算守卫budget
budget.total/budget.spent()/budget.remaining()让你能在代码里自我节制,避免批量任务失控烧钱。
下面是子 agent 协同工作的现场:多个探索 agent 并行分析packages/下的 agent、ai、coding-agent 等目录:
五、快速上手:安装与开启
bun install -g @oh-my-pi/pi-coding-agent安装后eval.py与eval.js默认开启,无需任何配置。如需 Ruby / Julia,在设置中打开eval.rb/eval.jl(或设置环境变量PI_RB/PI_JL)即可。Python 内核默认按会话复用(python.kernelMode="session"),也可改成每次调用新建内核;超时默认 30 秒,传timeout: 0可禁用看门狗。
六、使用技巧清单 ✅
- 增量推进:把长任务拆成多个小 cell(导入 → 定义 → 测试),失败时只重跑出错那一步
- 别重复导入:上一 cell 的顶层变量会自动存活,重复 import / 声明是浪费
- cell 内并发:需要并行时用 cell 内的
parallel,而不是指望模型连发多次工具调用 - 重图重表:用
display()回传数据,模型看到的是结构化内容而非被截断的终端文本
总结:oh-my-pi 的 eval 工具把"持久内核 + 代码回调 agent"这两件事做成了标配——Python/JS 状态跨调用常驻,代码里能调工具、能调模型、能派子 agent,是 AI 编程助手里真正"把 IDE 和 REPL 焊在一起"的设计。核心实现可参考packages/coding-agent/src/tools/eval.ts与packages/coding-agent/src/eval/,完整文档见docs/tools/eval.md和docs/python-repl.md。
【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考