全部文章
博客版本发布工程扩展

录制并回放工作区,精确衡量每一次智能体运行

把同一个任务交给三个命令行智能体,之后回头准确地看到每个智能体做了什么,旁边还有数字。NeuroSquad 0.1.264 可以录制整个工作区、在时间轴上回放,并用两张官方卡片衡量每一次运行。

阅读约 6 分钟0.1.264 带来了什么

在 NeuroSquad 里,一种常见的用法是把同一个任务交给几个命令行智能体,看看谁做得更好:Claude Code、OpenCode 和 Codex 并排运行,各自带一张浏览器卡片,都按同一条笔记工作。它们运行时,画布上一切尽收眼底。结束之后,大部分内容就消失了——终端不断滚动,浏览器卡片翻到别的页面,“谁更快、为什么”只能靠猜。

NeuroSquad 0.1.264 会把这次运行留下来。工作区录制保存工作区显示的一切,并在时间轴上回放。两张官方卡片 运行统计(Run Stats)和智能体脉搏(Agent Pulse) 用精确的数字衡量每个智能体的运行。笔记现在可以把自己发送给所有相连的智能体,Codex CLI 也能使用只支持 Chat Completions 的本地模型服务器。这是一个 Windows 版本;Mac 应用暂时仍是 0.1.230,下一次构建时会获得这些功能。

工作区录制

打开画布工具菜单,选择 开始录制。标题栏会出现一个带计时的红色 录制中 标记,直到你停止录制。从这一刻起,NeuroSquad 会记下每个终端输出的每一个字节、每一次尺寸和状态的变化、带卡片、分组框和箭头的画布、笔记和待办列表的文字、浏览器卡片显示的画面,并大约每秒为屏幕上的其他卡片截一张图。

画布工具 → 录制记录… 列出你录下的内容。回放 会打开一个只读的画布副本,布局和缩放与当时的窗口一致,然后把录制播放出来。终端并不是视频:录下的字节会重新经过同一个终端引擎,所以颜色、光标移动和全屏重绘都与当时完全一样,你可以停在任何时刻阅读文字。

录制播放器停在 7:08 中的 0:39:Task 笔记、显示 OpenCode 正在工作的团队状态、已完成的 Claude Code 终端、OpenCode 终端及其浏览器卡片中的页面、等待中的 Codex、两张 运行统计卡片——Claude Code 已在完成时冻结,OpenCode 正在测量;底部是带标记刻度的时间轴、1× 到 64× 的倍速按钮和纯净视图
回放三个智能体在一个脚本化测试服务器上的运行。时间轴上的刻度是已发送的提示、完成和“需要你的输入”;播放按钮旁的箭头在它们之间跳转。
  • 以 1× 到 64× 播放,拖动时间轴,或在标记之间跳转。←/→ 前后移动 5 秒,空格键播放和暂停。
  • 纯净视图 隐藏所有控件,并以与实时画布相同的大小显示画布,方便录屏。按 Esc 恢复控件。
  • 播放器里没有任何东西是实时的:不会启动智能体,不会向终端输入任何内容,也不会向模型发出任何请求。
  • 录制在进行中写入,每隔几秒刷新到磁盘。因崩溃而中断的录制会标为 已恢复,并可以播放到中断的位置。

最难的部分是让回放值得信赖。屏幕上的终端是按顺序输出到它里面的所有内容、在每一刻当时的尺寸下的结果。因此,一份录制就是一条只追加、有序的日志,记录了到达工作区的所有内容,播放器据此重建每个终端。我们的测试把同样的字节分别送给实时终端和回放引擎,并检查两者得到相同的屏幕。在你按下“开始录制”时已经在运行的终端,会从它当前的屏幕和最近的滚动记录开始——所以文档建议在发送提示之前开始录制。

运行统计与智能体脉搏:一次运行的数字

回放展示发生了什么。要比较几次运行,还需要数字,而且数字必须准确。运行统计是一张新的官方卡片:在它和一个智能体之间画一条箭头,它就会显示这个智能体的运行——提示数、模型请求数、输入、输出和缓存 token、总时长和工作时长,以及费用。智能体完成时,数字会冻结,方便截图;MD 和 JSON 按钮可以把它们复制到报告中。

目录中已有的 智能体脉搏在 1.1 版中新增了 请求 视图:每个相连的智能体是同一时间轴上的一条泳道,每一次模型请求是一根条形,从发送的时刻到回答结束的时刻。长条是慢请求;条形之间的空隙是命令行工具自己干活的时间——运行工具、读取文件、等待你。

画布上的工作区:Claude Code、OpenCode 和 Codex 的终端,每个下面有一张浏览器卡片和一张 运行统计卡片——总 token、已用时间、提示数、模型请求数、输入、输出、缓存读取,缓存写入显示为未报告;底部是请求视图下的 智能体脉搏卡片,共 24 个请求,每个智能体一条泳道
每个智能体一张运行统计,三者下方是智能体脉搏。这里的数字来自一个脚本化的测试服务器;缓存写入显示“未报告”,因为该服务器不报告它。

两张卡片都遵循应用中“用量”部分的规则。token 数是从每个命令行工具自己的日志中读取的整数。命令行工具或服务器没有报告的数字显示为 未报告,而不是 0;没有已知价格的模型显示 无价格,而不是 $0。在脚本化服务器上测试时,我们发现 Codex 可能会在真正发送一条粘贴的提示之前,把它显示为几秒钟的“工作中”,这会让卡片冻结在一次空运行上。现在,每一轮都会与真实的模型请求对照:没有请求的一轮不算作提示。

运行统计和智能体脉搏都是自定义卡片,基于任何人都能使用的同一套 Card SDK。SDK 1.2 版新增了 agents.usage 和 agents.timeline:在 查看令牌用量和费用 权限下,它们向卡片提供通过箭头相连的智能体的运行数据和请求时间线。两张卡片都可以从 自定义卡片… → 已验证 安装。另外,所有自定义卡片都有一项改动:如果卡片框架背后的进程崩溃——我们在一台内存耗尽的机器上见过——卡片会自动重新加载,而不再一直是灰色。

会自己发送的笔记

以前,要把同一个任务交给几个智能体,你得依次粘贴到每个终端里。现在笔记的标题栏有一个 发送给已连接的智能体 按钮。它会列出通过箭头与笔记相连的智能体,并在同一时刻把笔记的文字作为一条提示发送给它们。未运行的智能体,或所在工作区已超出预算的智能体会被跳过,并列出名字。

画布在对话框后变暗:将此笔记发送给智能体?笔记将作为一个提示同时发送给这 3 个智能体:Claude Code、OpenCode、Codex;取消和发送给 3 个智能体按钮
Task 笔记连着三个智能体;点一下就发给全部三个。

在你自己的服务器上运行 Codex CLI

很多人在自己的硬件上运行模型:LM Studio、llama.cpp、vLLM、Ollama。这些服务器大多支持 OpenAI 的 Chat Completions API。Codex CLI 只支持较新的 Responses API,并且不再接受 Chat Completions,所以无法使用它们。现在,NeuroSquad 会在你的电脑上于 Codex 和这类服务器之间运行一个小型转换器。无需任何设置:在 设置 → 提供商 中测试提供商时,Codex CLI 会出现在 适用于 列表中。服务器的密钥留在 NeuroSquad 内部,Codex 只拿到一张访问转换器的通行证,token 数以服务器自己的数字为准。

一个位于 127.0.0.1 的本地服务器的“编辑提供方”对话框:说明 Codex 只支持 Responses API,没有该接口的服务器会通过 NeuroSquad 的本地转换器连接;测试结果为已连接,可用模型 1 个,支持 OpenAI API 和 Anthropic API,适用于 Claude Code、Codex CLI、Qwen Code、OpenCode 等
一个没有 Responses API 的本地测试服务器:Codex CLI 出现在可以使用它的命令行工具中。

对自己服务器的第二项改动是上下文窗口。命令行工具并不知道你服务器上的模型有多大的上下文:Claude Code 假定是 200K token,而 OpenCode 从不压缩对话。在窗口更小的服务器上,长会话会直接以错误结束。当服务器的模型列表说明了它提供的窗口大小时——llama.cpp、vLLM 和 LM Studio 都可以——NeuroSquad 现在会把它传给 Claude Code、Codex CLI 和 OpenCode,让它们及时压缩。

修复

  • 刚从模板创建的工作区在第一次打开时,可能丢失布局和所有箭头。第一次打开时添加的一张卡片让画布在保存的布局到达之前就启动了;现在画布会等待布局到达。

网站上的更新

完整的变更列表见 0.1.264 更新日志。NeuroSquad 会自动更新;全新安装请从下载页面开始。