带有状态REPL的代码模式
摘要
作者介绍了 ptc_runner_mcp,这是一个 MCP 服务器,它提供了一个有状态的、沙盒化的 REPL,使用类似 Clojure 的语言,允许 AI 代理进行探索性计算,而不会使上下文窗口过载。
我一直致力于开发 `ptc_runner_mcp`——一个 MCP 服务器,它为 AI 智能体提供一个有状态、沙盒化的 REPL,使用类似 Clojure 的小型语言。在使用 MCP 的过程中,我反复遇到的问题不仅仅是工具发现,更是工具调用之后发生了什么。许多智能体任务本质上是探索性计算任务。如果所有数据都回流到模型上下文中,LLM 就会开始在“脑子里”做计算——这就是错误结果和上下文窗口缩水的根源。`ptc_runner_mcp` 暴露了一个主要工具:`lisp_eval`。在 `lisp_eval` 内部,智能体获得一个类似 REPL 的会话。它可以检查可用的 MCP 服务器/工具,调用它们,将结果存储在会话内存中,定义辅助函数,并在同一状态下继续工作。发现过程也是 REPL 形态的——智能体无需将每个工具的模式预先推入上下文,而是可以使用它已经理解的东西:`(mcp/servers)` `(dir 'github)` `(doc 'github/search_issues)` `(apropos "calendar")`。然后它可以发起一个小的探测调用,了解结果形状,获取真正的数据,并在本地进行计算。例如,它无需将 1000 条记录拉入对话中,而是可以这样操作:
```clojure
(def traces (fetch-all-traces "org-acme" "production"))
(defn cost [t] (Double/parseDouble (get t "total_cost")))
(->> traces
(group-by day)
(map (fn [[day xs]] {:day day :total (reduce + (map cost xs))}))
(sort-by :total))
```
模型看到的是计算的结果(如果太长则会被截断)。在下一轮交互中,它可以继续使用已定义的辅助函数。
我采用这种方式的另一个原因是性能和运维的简洁性。会话运行在 BEAM 上,因此非常轻量。你可以在单台机器上保持大量并发、有状态的 REPL 会话并保持低延迟,而无需管理一个由更笨重的 Python/JS 沙盒组成的池。
相似文章
使用 MCP 进行代码执行:构建更高效的智能体
本文来自 Anthropic,探讨了如何将代码执行与 Model Context Protocol (MCP) 相结合,以提升 AI 智能体的效率。文章分析了工具定义和中间结果导致的 token 过载等挑战,并提出代码执行作为降低延迟和成本的解决方案。
@akshay_pachaar: MCP 与 CLI 之争。在 2025 年的大部分时间里,AI 工程师们对此争论不休。怀疑论者摆出了真实数据:- Playwright MCP …
Anthropic 的“代码模式”(Code Mode)重新定义了 MCP 与 CLI 之争。它让 AI 代理编写代码,通过运行时调用工具,而不是将完整的模式加载到上下文中,从而大幅减少了 token 消耗。这种方法结合了 MCP 的强类型契约与懒加载机制,证明了该协议正在演进,而非走向消亡。
@huntlovell: https://x.com/huntlovell/status/2057166131924988002
Deep Agents 引入了解释器:小型嵌入式运行时,允许智能体在智能体循环内编写和执行代码,实现多步逻辑和中间状态管理,无需完整的沙箱开销。
@hwchase17:代码解释器是一个轻量级的代码执行环境,让你可以:- RLMs - 程序化工具调用 - 更多!w…
Harrison Chase 发布了一个名为 code interpreter 的轻量级代码执行环境,它支持 RLMs 和程序化工具调用,无需启动完整的沙箱,更多用例将陆续公布。
我从零重建了一个Claude Code风格的编程代理——整个代理循环只有6行代码。20章,约5000行代码,无框架,也支持本地模型
一位开发者分享了一个20章的教程,从头重建了一个Claude Code风格的编程代理,展示了整个代理循环(约6行代码),并支持本地模型和多种LLM API。