READING ROOMOUR EXPERIMENT / 002
BEATING / VIBE CODED BY SLEEPY

我 Vibe Coding 出了 JEVia,试着把判断交给 Jev

一次运行里的 8 项判断,被放进了 2 次 Jev 调用。我想从这些具体的决定开始,重新安排 Agent 的工作。

01

代码是聊出来的

我做了一个叫 JEVia 的 agent harness。它在自己电脑上运行,你带上自己的 API Key,选一个工作区,就可以让它处理任务。代码放在 GitHub,采用 MIT 许可。

我没有一行行写它。我把想要的东西讲清楚,让 AI 写代码,再拿任务去试。哪里不符合预期,就回到对话里继续改。JEVia 是这样 Vibe Coding 出来的。

我想动的地方,是 Agent 开始干活之前和干活途中做的那些判断。读完需求,要不要联网?拿到一批材料,够不够回答?准备写文件,这次改动能不能放行?如果每一处都让语言模型组织一段回答,程序还得从回答里找出那个真正要用的决定。

Jev 给了我另一种接口。这个由 TypeSafe 开发的模型接收问题,返回带概率的结构化结果。程序可以直接拿结果和阈值比较,再选择下一步。我把它接进了 JEVia。

JEVia 中文界面,保留产品原色。截图来自仓库的离线模式,不对应下文的真实运行记录。
02

先问完,再开工

一个任务进来,JEVia 会把几道问题合在一次 Jev 调用里。是否需要联网、多步骤计划是否合适,会和输出形式、技能选择一起评估。一次返回多项判断,每一项仍然可以单独检查。

以是否联网为例,返回 P(yes) 0.78,程序设置的阈值是 0.50,这个分支就会去搜索。概率不是保证,阈值也不是模型自己说了算;它们共同决定程序在什么情况下采取行动。

真正需要写内容的步骤,仍然交给语言模型。它也参与计划编译和工具调用。Jev 负责其中适合用结构化问题表达的判断,程序保留执行规则,三者在同一次任务里配合。

多步骤任务还会遇到另一个问题。整理原文和分析取舍,未必需要同样强的模型。Jev 评估步骤需要的能力,本地策略再从配置的模型清单里选择。选“够用就好”,程序找达标的便宜模型;选“用最强的”,生成步骤采用配置中更强的模型。没有模型达标时,默认停下来等待复核。

离线演示中的分流面板。Free / Big 是演示模型,图中的评分和调用数量为预设。
03

8 项判断,2 次 Jev 调用

作者开发记录 / 非基准测试
RUN 018.6s

8 项判断 · 2 次 Jev 调用

$0.000552
RUN 0254.3s

5 步 · 4 次工具调用

$0.0069

我试过让它读取工作区材料,判断三个需求哪个先做。那次记录是 8.6 秒,8 项判断,2 次 Jev 调用,另外有 2 次语言模型调用,费用显示为 $0.000552。

8 项判断没有变成 8 次请求。批量提问把它们放进了 2 次 Jev 调用里。对我来说,这比单看某一次判断有多快更有意思,因为任务的等待时间还包括生成和工具执行。

另一个任务跑了 5 步,调用了 4 次工具,累计 88 项判断。它连续读了三份文件,又写出一份结果,记录用时 54.3 秒,费用为 $0.0069。

这两组数字来自我提供的开发测试记录,不是这篇文章重新测出的结果,也不是跨产品基准。费用面板会区分服务商返回的费用与按价格表估算的费用;显示到很多位小数,不等于每一位都来自最终账单。

04

点开那一行判断

判断面板是我最想让人点开看的地方。一次运行问了哪些问题,返回了什么值,程序采用了什么阈值,都能在这里往回查。

例如,做成应用的概率是 0.11,低于 0.60 的阈值,于是继续生成文字。技能匹配给出 0.85 的置信度,选择了 compare-options。面板把这样的结果和对应问题放在一起,不必从整段运行说明里找线索。

某些判断低于配置的置信度要求时,会进入复核。默认的弃权阈值是 0.55;系统可以把未确定的部分交给语言模型处理。不是把整项任务重新做一遍,已经接受的判断仍然保留。

数字也可能错。它的用处是把错误留在一个可以检查的位置。如果不该联网却去搜了,可以先查联网那一项,再看是模型的判断偏了,还是阈值设得不合适。改动之后,可以用同一个任务重新跑,比较这一处有没有变化。

05

它开始读写文件以后

需要工具的任务会进入循环。语言模型发出工具调用,程序执行后把结果交回去,让模型决定下一步。一次模型请求和它发出的这一轮工具调用算一步;模型不再请求工具,这一轮就结束。

它可以读写工作区文件,也能精确替换原文中的一段。较复杂的任务可以维护待办清单,把一件独立工作委派给另一个模型。提问工具会真的停下来等用户回答。运行 Python 或后台命令需要额外开启执行权限。

在我提供的那次测试里,write_file 获得的放行概率是 0.70。Jev 同意之后,文件路径仍然要过程序的检查,不能写到工作区之外。网页访问也有独立的地址检查。模型判断不能取消这些限制。

权限由用户设置。只读任务不会因为模型想写文件就获得写入能力;打开“每次改动都问我”,有副作用的动作还要等你确认。命令执行默认关闭,开启后是在本机真的执行,不应把它当作隔离沙箱。

计划模式让程序在动手前先展示计划。觉得范围太大,可以让它改成两部分,再检查一次。MCP 接入使用 stdio 上的 JSON-RPC,服务器由用户在工作区配置,模型不能自行添加;接入的工具调用也会经过判断流程。

06

把自己的做事方法放进去

技能是 Markdown 文件。研究简报该怎么组织,比较方案时先看什么,可以写进文件里,再从界面导入。md 文件和 zip 都支持,安装后能看到名称与简介,也可以在任务里直接指定。

联网任务会先筛选来源和段落,再检查交给写作模型的材料是否足够。搜索结果里出现过答案,不代表最后保留的材料仍然包含答案。这个检查放在筛选之后,缺少判断或请求失败时记为未知。

有些任务适合交付一张表单或一个小看板。组件路径让 Jev 从预设组件里选择结构,语言模型填充内容;需要自定义逻辑时,也可以生成完整页面。页面在受限 iframe 中预览,文件保存到工作区。

运行记录采用追加方式保存。上下文太长时,早先的对话可以压成摘要,原记录仍然保留以便导出检查。一次回答漏掉了什么,可以回头查看压缩之前的材料。

技能管理界面,内置技能和导入入口。离线模式截图。
07

下载之后,拿自己的任务试

JEVia 使用 Python 3.9 或更新版本的标准库,前端是原生 ES modules,不需要安装第三方 Python 包。下载仓库后运行 python3 app.py,再打开 http://127.0.0.1:8765,配置自己的密钥与工作区。界面支持中英文。

随当前介绍提供的工程记录包含 429 项 Python 测试和 24 项前端测试,MCP 测试会启动服务器进程检查通信。这些检查不能替代不同用户的真实任务,我仍然想看到它在哪些情况下会失败。

密钥保存在本地配置或浏览器中,调用模型时会发送给你配置的对应服务商。定时任务还会把运行所需配置和密钥写入工作区;本地运行不等于数据完全离线。

欢迎从 GitHub 下载体验。如果它选错了模型,或者在某一步停住,可以到 Issues 留下复现方式和当时的运行记录,记得删掉密钥与私人材料。想聊一个还没成形的功能,也可以在 X 上找我。

我是 Beating 主编 Sleepy。JEVia 还在改,欢迎来捉虫,也欢迎直接告诉我你希望它怎么工作。

资料与截图依据 · 产品文档 · 离线演示