hermes-jev-skills 深度评测:823 Star 的 Jev 决策引擎,1020 个测试全绿、6 个基准我复现 5 个,README 主图却仍取自真实环境

做开源项目评测这些年,我发现一个规律:README 里最响的那个数字,往往是最没人回头核的那个。

所以这回我换了个做法。hermes-jev-skills 这个仓库,我不看它说自己多好,我把它自带的基准脚本全部重新跑了一遍——真金白银买了 Jev 的 API,6 个能复现的实验里 5 个逐格对上了。它是 9 月 18 日建仓、8 天 823 Star 的小项目,MIT,作者一个人维护。

但也是它自己承认了一件事,我先摆在这:README 里那张主图,今天仍然取自一台真实机器。 这一点它自己在 commit message 和脚本注释里写得很清楚,只是图一直没换。

它想做的事:让一个便宜模型替 agent 做小决定

你的 agent 每轮都在烧前沿模型的 token 做那些根本不是「思考」的事:这一轮该哪个模型答、377 个 skill 里该加载哪个、检索回来的哪几段值得读、转录要压缩时哪些轮次该留下、下一步该点哪个按钮。

这些是决定,不是文章。hermes-jev-skills 的做法是把它们交给 Jev——TypeSafe 的决策模型,它从不写文本,你给它一个状态和几道类型化问题,它回你一个带校准置信度的答案。十项技能分别是:模型路由、搜索、记忆过滤、handoff 压缩、轮次取舍、skill 选择、消息分诊、邮箱分拣、computer use、browser use。

这十项都以 SKILL.md 形式发布,所以不止能在 Hermes 上跑——Claude Code、Codex,或任何读 skill 文件的宿主都行。

架构上最值得记的一点:它把请求数当成一等成本。路由的三个问题和 skill 选择的 stage 1 问题被合并进同一次请求——Jev 按请求计费而不是按问题计费。这一点后面有实测数字。

实测一:6 个基准实验,5 个逐格复现

先说方法,因为这是这篇的核心。仓库里每个 scorecard 都附了能「reproduce every number here」的脚本,我就照着跑。做法是:在沙箱里 clone、装一个只有 PyYAML 的 venv,然后用真实的 Jev API key 跑它自带的标定脚本。不是读文档,是重算。

先说不动用网络就能验的:

项 结果
主测试套件 tests/ 1020 个测试通过(skipped=1),28.6 秒,全离线
dashboard 测试 71 个测试通过,2.25 秒
jevkit 第三方依赖 零(AST 扫描:纯标准库)

那 1020 个测试用的是内置 fake transport——这一点它自己在测试文件里点明了:如果 fake 发出的分布形状是 API 根本产生不了的,那套件就会变成「绿着测校验器的拒绝路径」。这句话说明作者知道「测试全绿」本身可以骗人。

然后是花钱的那部分。下面每个数字都是我这次实跑的输出,和仓库 scorecard 对照:

实验 我测到的 仓库 scorecard 判定
calibrate_choose.py 31 cases · 0 wrong actions 同 逐格命中
calibrate_choose_match.py --runs 3 floor 0.65:right 23 / stalled 1 / wrong 0 right 22-23 / stalled 1 / wrong 0 逐格命中
calibrate_choose_stakes.py --runs 3 18 个 gate family 全为 69/1-1/21/0 同表 全表命中
calibrate_choose_permutations.py solo Brier 0.032 对照值 0.032 命中
calibrate_skill_stage2.py --runs 2 单轮折算:stage1 only right 10 / spurious 4;stage1+2 right 14 / spurious 0 同口径 命中
calibrate_skillpick_permutations.py 结构一致(10/0/4/0) 11/0/3/0 一行不同 部分

几条值得单独讲的。

那个 trap case 每次都出现在同一位置。31 个用例里有一个是 Cancel this dialog without losing my work,而错误答案是 Save。原文写它的置信度在五轮里是 0.45-0.60,每一轮都落在 0.65 地板之下,所以从没被放过。我这次测到 0.40 和 0.44——机制完全一致。这种「错答案稳定地出现在地板以下」不是运气,是校准。

分离性数字也对上了。「这个屏幕上没有正确答案」这一类,我用第二个问题测出的上界是 0.45(原文 0.43-0.45);而正常可答类的下界是 0.78(原文 0.75-0.80)。

permutation averaging 那条结论被复现了,而且是以它失败的方式。有一种做法是把选项顺序打乱多次、把概率向量平均。我实跑的结果是:在 0.65 地板上,averaging 把那个本该被拒的 trap case 变成了 1 个 wrong action——而单次调用是 0 个。仓库据此没有采纳这个做法。它甚至补了一句更狠的:那个错答案在三次重复里有两次是全体一致答错的,所以「一致性检查」这种安全阀根本拦不住。

唯一没逐格对上的是第 6 个,因为口径不同:那个脚本优先读机器上的 fleet catalog(原文是 459 个 skill 的目录),沙箱里没有,于是回落到仓库自带的 10 个 skill。结构对上了,数字不能逐格比。我把这条明确标出来,不混进「5 个命中」。

实测二:数字能验,但有一处它自己承认的缺口

既然数字这么硬,那篇宣传的缺口在哪?

缺口不在基准,在主图。README 介绍 dashboard 那张截图,caption 写着「profiles, paths and decisions here are a demo home」。但图本身来自一台真实机器。

这是我这次用 git 历史而不是看图确认的:

证据 内容
图的引入 commit 0a15c12(2026-09-19 23:32),此后从未被替换
自陈的那次 commit c5875aa(2026-09-20),标题是 Make the README screenshot reproducible from invented data
该 commit 改了什么 只新增 scripts/demo_home.py、改 caption、改 CHANGELOG——没有动那张图

c5875aa 的 commit message 原话是:「The image was taken from a real machine under a caption calling it demo data, which is how a working fleet’s model strategy got published.」它同期新增的 demo_home.py 注释里写着「that is how the current image ended up showing a real working pool set」。

也就是说:作者发现了这个问题、写了工具来生成假数据、在文档里解释了这件事——然后忘了换图。caption 里那句「the pools are a real working set」直到今天还在。

顺带说,demo_home.py 本身有个小 bug 我顺手复现了:它把 --help 当成输出目录路径(main() 直接取 argv[0],不解析参数),所以 python3 scripts/demo_home.py --help 会在当前目录建出一个名叫 --help/ 的目录树。这不是安全问题,但是这类「脚本没走参数解析」的痕迹。

还有个细节:README 那张表,一半数字买得到一半买不到

这是我觉得最值得记的一条,因为它解释了这个仓库的诚实边界在哪。

README 顶部有一张十项能力的表,每项配一个「Measured」数字。我按「外部人能怎么验」把它们分了三类:

类别 能力 情况
能重跑出数字 choose(两问门、stakes/margin、permutation)、skill 选择 stage 2 evals/choose-match/、evals/skill-pick/、evals/permutation-averaging/ 有 scorecard,我这轮全跑了并对照
有脚本、但要你自己的数据 记忆过滤(evals/context-filter/regret.py)、computer use 的质量(evals/plan-quality/、evals/representative/) 脚本要求「locally held labelled observations」——人类裁决过的真实任务标注,仓库不含语料,也不许用 mock 推断
有 scorecard、但数据明确不公开 handoff 头条那个「58.7% recall alone, 75.0% with one search」 出自 evals/compaction/results/SCORECARD-2026-09-20.md

也就是说:十项能力里,外部人能独立重算出数字的只有三类模型侧决策;涉及真实会话和人工标注的那几项,谁都验不了。这和我上一篇评 laya 是同一件事,只是程度不同——laya 的头条数字连产物文件都没有,这里的第二类至少把脚本和验收口径都写清了(representative/compare.py 甚至会「reject missing arms、duplicates、unknown completion」而不是替你猜测成功),只是语料在你手上。

第三类最值得单说。那个 handoff 数字出自一套实验,输入是 7 个真实工作会话(243 到 614 行、含大量工具调用)加每份 15 道题的考卷。仓库的 README 里写着「Transcripts, exams and capsules stay off this repo」——数据不公开,所以任何人都复现不了,包括买了 key 的我。而这恰好是它全站最响的那个数字。

我特意核对了这段的表意,因为它容易被误读。这张表里 Jev 的表现是分裂的:

对照 结果 说明
Jev 的取舍标记 vs 按 recency 标记 11 胜 4 负 Jev 的判断确实更好
但 Jev 摘出来的 capsule vs plain tail 37.5% vs 48.1% 靠 Jev 写出来的胶囊反而更差

作者自己解释了原因:一个被标为「summarize」的轮次只保留前 400 字符,而七个会话里有五个平均每轮 1,400 到 7,400 字符,任何取舍策略都救不回被裁掉的部分。所以它没有采用 Jev 版 handoff,而是改成整段对话(上限 300,000 字符)+ 1,200 词预算。

这是整个仓库最诚实的一处:它测出自家核心功能没有更好的方案,就没上。表里那些「looked obviously right、measured、not shipped」的两行实验也一样。

还有一处:它把「不省事」也写进文档了

三条我觉得值得抄的工程习惯。

一、fail-open 不是口号,是实测。我在沙箱里故意不给 key 跑:jev doctor 仍然退出码 0;jev mail 把消息标成 unsorted、not_sent_to_jev: 1,而不是崩掉。README 的说法是「No key, timeout, rate limit, malformed reply, low confidence: routing keeps your current model, memory returns the original list, compaction drops nothing」——每一条都有对应的测试。

二、有安全护栏不依赖 Jev 答对。比如「风险词(production / delete / migration / security / payment / legal)永不被路由到最便宜的档」、「大上下文不在会话中途切更便宜的模型」、「转录轮次只在有把握时才丢」。这类护栏的意义是:决策模型错了,损失有上界。

三、隐私边界写得很具体,包括它做不到的部分。README 里有一整节「What leaves your machine」,逐项列出每个功能发出去什么:路由发的是被脱敏的用户这一轮(邮箱、手机、token 遮蔽,上限 2,500 字符),绝不含历史、工具结果、文件、记忆;而且它明说了一个不完美处——默认模式下路由发的是这一轮本身,「the agent has no say in that, because routing happens before it acts」,要彻底不出机器得配 private_profiles。邮箱那条更细:邮件是先解码再筛查(quoted-printable、percent-encoding、HTML entity、base64),因为「a newsletter footer carries your own address percent-encoded in the unsubscribe link」——纯文本脱敏器两个都看不见。

放到同类里看

这一篇要横着比,最自然的坐标是我昨天刚评完的 laya——同样是「决策不用生成」这条路线,同样有 Jev 作为对比对象,同样把「自家模型接近随机」这种难看的数字写在主文档里。

但两者的证据链是镜像的。laya 的 6 张基准表我离线复算逐格命中,而它全站主打的 0.766 准确率在仓库 14 个结果 JSON 里找不到任何支撑文件——那个数字出自一个保存输出数为 0 的 notebook。hermes-jev-skills 反过来:它最响的那批数字(路由、skill 选择、choose 校准)我买了 key 就重跑出来了;它的缺口在一张图,而那张图是它自己公开承认过的。

第二个坐标是评测方法论本身,和我写过的 addyosmani/agent-skills 复测 是同一个问题:自带评测的项目,它的分数该不该信。那次是 25 个技能自评 100% 全绿、我只对上 24%;这次是 6 个基准我复现 5 个,缺口在配图。一个稳定的规律正在形成——看它的评测脚本能不能被你重跑,比看它的分数高低有用得多。

如果你要一句话判断这个项目值不值得看:它的方法论比它的代码更值钱。 把「looked obviously right、measured、not shipped」写进 CHANGELOG、把自己输掉的对照表留在文档里、把「测试全绿可以骗人」写在测试文件顶部——这些习惯,比它那 823 个星更能说明这东西靠不靠得住。

适合谁:跑多 profile agent fleet、模型账单肉疼的团队(路由 + 合并请求直接省钱);要自托管、不想把工具结果发给第三方做决策的场景(它的隐私边界写得很细);任何想学「怎么诚实地做自评基准」的开发者。

不适合谁:只想开箱即用的人——它要 Jev 的 key,而 TypeSafe 目前不接受新注册(README 明写),得走 OpenCode Zen 免费层或 OpenRouter 才能起步。不用 Hermes 的人也能用那十个 SKILL.md,但 dashboard 和插件接缝是给 Hermes 做的。以及:它的 README 主图目前还不可信于「demo」二字——这事作者知道,只是还没换。

结论

工程纪律一流,数字经得起重算,缺口是它自己认下的那张图。

我买的 Jev key 花的钱不到一毛(几个 scorecard 自陈总额 under $0.05),换回来的是 5 个基准的逐格复现。在这个「自评数字满天飞」的赛道里,能做到这一点的项目是少数。

但它提醒了我一件更重要的事:连一个连自己输掉的实验都写进文档的作者,也会忘了换掉一张图。所以我的做法还是那句——别信 README 里最响的数字,去把它的脚本跑一遍。跑得出来,那个数字就是你的;跑不出来,它只是个声明。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

发表评论