Hermes Jev Skills实测:377个技能挑选压到2.8秒 账单直降


Jev 在 Hermes 中负责模型路由、内存过滤、压缩选择、技能选择、计算机使用、浏览器使用、私钥输入流程以及模型路由仪表板。

Hermes Jev Skills是一套开源工具集,把TypeSafe公司的决策模型Jev嵌入到Hermes、Claude Code、Codex这类智能体里,专门处理模型路由、记忆过滤、上下文压缩、技能挑选、消息分诊、电脑操作、浏览器操作这七类小决策,让昂贵的前沿模型只干真正需要思考和写作的重活。


Hermes Jev Skills到底解决什么麻烦

先说清楚背景。现在市面上流行的智能体,比如Anthropic家的Claude Code、OpenAI家的Codex、Nous Research家的Hermes,每接到用户一句话,都要在内部做一堆小判断:这句话该派给哪个模型回答,从知识库里翻出来的十几段资料哪几段值得读,之前聊过的七十多轮对话里哪些还得留着、哪些可以扔,装在系统里的三百多个技能哪个跟当前这句话对得上。

这些小判断,过去全部由那个动辄一次几美分、响应几秒钟的前沿模型自己做。

问题来了,用一辆法拉利去菜市场买菜,油钱够买十趟菜。每一次让Claude Opus去判断“用户这句话算不算编程问题”,就等于让法拉利跑一趟菜市场。

Hermes Jev Skills的核心思路,是让智能体在动用前沿模型之前,先花0.4秒和一笔小到可以忽略的钱,问一个专门做决策的小模型Jev:这活儿,到底该派谁去干?

Jev不写文章,不生成代码,只做三种事:从选项里挑一个;给一个东西打分;回答是或否。就这么简单。


一个决策0.4秒0.00006美元,凭什么

零知识原则先补一课。TypeSafe AI是一家专门做“结构化决策模型”的公司,产品叫Jev。跟通用大模型不同,Jev的设计目标不是回答开放性问题,而是在给定的一堆选项里做出一个带置信度的判断。

打个比方:让GPT-4回答“这段代码有什么问题”,是让它写一篇小作文;让Jev回答“这段代码属于Python、JavaScript、Rust里的哪一种”,是让它做一道选择题。

同样是消耗算力,选择题的成本天然比作文低两三个数量级。

具体到数字:Jev处理一次模型路由决策,平均0.4秒,花费大约0.00006美元,也就是万分之六美分。作为对比,让Claude Opus回答同样的问题,响应时间通常在3到8秒,费用少说也要几美分。

更关键的是Jev返回的结果里带一个置信度数值。比如返回“这个问题属于coding类别,置信度0.92”。这个0.92意味着Jev自己有九成把握。如果置信度低于阈值,系统就走兜底路径,不冒险。

这个“带置信度的选择题模式”,是Hermes Jev Skills区别于其他智能体优化方案的第一块基石。


七个决策场景一次讲透

Hermes Jev Skills覆盖的七个场景,每一个都对应智能体运行时的一个具体瓶颈,具体清单:

模型路由:每收到一句用户输入,Jev在0.4秒内判断这句话该派给哪个档位的模型(便宜的、中等的、贵的、带视觉的),从用户配置的所有可调用模型里选一个。

记忆过滤:智能体从向量数据库里捞出来一批候选段落(通常几十段),Jev一次性判断哪些段落跟当前问题相关,同时识别哪些段落里藏了恶意的提示词注入。一次请求可以处理最多60段。

上下文压缩:聊天历史堆到七十多轮的时候,Jev在0.95秒内决定哪些轮次原样保留、哪些做摘要、哪些直接丢弃。

技能挑选:用户装了377个技能(skill),Jev在2.8秒内判断当前这句话应该触发哪一个技能,或者一个都不用触发。简单的应答(比如“好的”“收到”)不消耗Jev的调用,本地直接处理。

消息分诊:判断一条新消息的紧急程度、类别、是否必须由真人处理,0.4秒一条。

电脑操作:智能体控制鼠标键盘时,从一张事先写好的“安全动作表”里挑下一步动作,0.4秒一步。

浏览器操作:智能体控制浏览器时,同样从预定义的动作表里挑下一步,0.4秒一步。

留意最后两项:电脑操作和浏览器操作。这里藏着Hermes Jev Skills跟其他智能体框架最不一样的地方。


为什么屏幕截图和网页文本不发出去

对比一个具体竞品:browser-use项目里的Browser Agent。那套方案让智能体控制浏览器时,会把网页的HTML或者屏幕截图发给远端的大模型,大模型根据看到的内容决定下一步点哪里、输入什么。

Hermes Jev Skills的浏览器操作模块不这么干。

具体机制:开发者在本地先写好一张动作表,比如“点击登录按钮”“在搜索框输入关键词”“下拉页面”,每个动作有一个id。智能体运行时,本地程序识别出当前页面上有哪些可用动作,把这些动作的id和一句简短的标签(比如“登录按钮”这四个字)发给Jev,Jev返回一个id,本地程序执行对应动作。

发出去的东西只有:动作id列表、几个字的标签、当前的操作目标。

屏幕截图不发。网页正文不发。输入框里的内容不发。

这一条设计选择带来一个可以亲手验证的结果:如果操作目标或者动作标签里出现了敏感词(比如信用卡号、密码、身份证号),本地程序会在发送之前直接拒绝调用Jev,整个操作链在本地就断掉。

这套“动作id白名单”机制,是Hermes Jev Skills区别于browser-use的关键差异。前者永远不可能因为Jev收到了截图而泄漏页面内容,因为它根本不发截图。


你的API密钥,智能体自己都看不见

现在说另一个反差点。用过智能体的都知道,装第三方插件的时候,最烦的一步是把API密钥告诉智能体:要么复制到聊天窗口里,要么写进配置文件,反正智能体一定会看到这串密钥。

Hermes Jev Skills的做法是:智能体永远看不见密钥。

具体流程:用户在终端里跑一句jev setup-key,本机会启动一个临时的网页服务,只监听本地端口,生成一个随机的一次性URL。用户在浏览器里打开这个URL,把TypeSafe控制台里申请到的密钥粘贴进去。密钥直接写进操作系统的密钥库(macOS用Keychain,Linux用secret-tool,兜底方案是权限设为0600的本地文件),同时写进Hermes每个profile的.env文件里。

jev setup-key的那个智能体,只看到一行反馈:密钥已存储,已验证,成功。密钥本身,一个字都看不到,连前缀都看不到。

这个临时网页还带一堆防护:拒绝Host头不匹配的请求(防DNS重绑定攻击)、不发送Referrer、不写日志、用完即毁、十分钟没人用自动关闭。

对无头服务器(没有图形界面的机器),提供另一个命令jev setup-key --tty,直接在终端里用隐藏输入的方式接密钥。

这套流程解决的是一个真实的痛点:智能体的对话历史通常会被上传到云端做训练或者调试,如果密钥出现在对话里,等于把家门钥匙贴在公告栏上。


装错模型的第377个技能

再看技能挑选这个场景。Anthropic家推出的Skill机制,让用户可以给Claude Code装一堆专业能力,比如“帮我审阅PR”“帮我写Kubernetes配置”“帮我做SQL优化”。装的技能越多,问题越大:Claude每收到一句用户输入,都要在系统提示词里塞进所有技能的描述,判断这句话该触发哪个技能。

塞进去的描述越多,消耗的token越多,响应越慢,费用越高。

377个技能是什么概念?如果每个技能描述平均200字符,光是描述文本就要占掉将近8万个字符的上下文。这些字符每一轮对话都要重复发送一次。

Hermes Jev Skills的做法:把这377个技能的挑选任务,从Claude手里拿走,交给Jev。Jev在2.8秒内做出判断,返回一个技能名或者“无需触发”。

这里有一个容易忽略的技术细节:为什么每个技能描述被限制在200字符以内?

因为Jev的判断准确率跟输入的信息密度直接相关。超过200字符的描述会被截断,导致Jev看到的信息不完整,两个功能相近的技能可能会被压缩成完全一样的描述,Jev就没法区分了。

Hermes Jev Skills的0.10.0版本修了一个具体的bug:之前有八个技能的描述都超过了200字符,其中两个负责“任务委派”的技能被截断后变成了同一句话,Jev根本没法在两者之间选,只能瞎猜。修复后,所有技能描述都必须在200字符以内,重复的描述被强制改写。

这个细节说明一件事:把决策外包给Jev,不是免费午餐,需要在写技能描述的时候就考虑Jev的输入约束。


一个静默五个月的bug暴露了什么

Hermes Jev Skills的路由系统内部有一个二维的模型池:一维是档位(便宜、中等、贵、超贵),另一维是专长(通用、编程、写作、研究、视觉)。每收到一句用户输入,Jev都会被问一个五选一的问题:这句话属于general、coding、writing、research、vision里的哪一类。

问题来了:0.10.0版本发布之前,有一个内部函数suggest_tiers(),任务是根据Jev的答案挑出对应的模型池。这个函数在某次改版之后,只会输出general和vision两种结果,其他三种被悄悄砍掉了。

后果:Jev每次判断“这是编程问题”,suggest_tiers()去找编程模型池,找不到,就默默地回退到general池。

没有报错,没有警告,日志里显示“Jev判断:coding,置信度0.94”,看起来一切正常。

实际情况是:每一轮对话都花钱问Jev一个问题,然后把答案扔进垃圾桶,从来没有一次真正影响过模型选择。

这个bug静默存在的时间,从代码提交历史看,至少有几个月。发现之后,0.10.0版本加了三个东西补救:一个叫route.dead_axis()的检测函数,用来发现哪些维度的答案被丢弃了;一个叫jev doctor的诊断命令,会主动警告用户“你花钱问了coding,但根本没有coding池”;一个升级过的dashboard,把模型池的二维网格画出来,空的池子显示为可见的缺口。

这个bug的教训跟Hermes Jev Skills的产品定位直接相关:整个产品的卖点是“花小钱买一个决策,然后执行”。如果决策买回来被扔掉,就等于纯烧钱还得到一份看起来很自信的日志。

对比其他智能体优化工具(比如ZCode的模型路由方案),后者通常只有一层选择(选哪个模型),出错了立刻就能看出来。Hermes Jev Skills的二维模型池设计更灵活,但也更容易出现“决策买了没用”这种隐形故障。


Shadow模式:先看它怎么判断,再决定要不要听

有一个使用建议藏在文档里,很多人不会注意。Hermes Jev Skills的路由功能有三档开关:off(关闭)、shadow(影子模式)、on(开启)。

推荐的启用顺序是:先跑shadow模式。

shadow模式下,Jev照常做判断,日志照常记录,但是不会真的切换模型。用户当前在用哪个模型,就继续用哪个模型。

这样跑一段时间之后,用户可以对比:Jev建议派给便宜模型的那些对话,如果真的派过去,回答质量会不会掉?Jev建议派给贵模型的那些对话,是不是真的必须用贵模型?

判断的依据是用户自己的真实业务数据,不是Jev开发商给出的benchmark。

跑够样本之后,再切到on模式,让Jev真的影响模型选择。

这个渐进式启用的设计,跟一个更深层的问题有关:Jev的判断准确率不是恒定的,跟用户的业务领域直接相关。一个专门做法律咨询的智能体,跟一个专门做代码审查的智能体,Jev在同样的置信度阈值下,判断准确率可能差很多。

shadow模式的存在,让用户可以在不承担任何风险的前提下,先摸清Jev在自己业务场景下的实际表现。


除了置信度,还有六层兜底

再补一个反差点。承诺“0.4秒决策”“万分之一美分”听起来很美,但如果Jev宕机了怎么办?限流了怎么办?返回的置信度只有0.3怎么办?

Hermes Jev Skills的应对策略叫“完全失败开放(fail-open)”,具体规则:

Jev返回超时:路由继续用当前模型,记忆过滤返回原始列表,压缩不丢弃任何一轮,技能挑选不推荐任何技能,电脑操作返回reobserve(重新观察)。

Jev返回低置信度:同上,走兜底路径。

没有API密钥:所有Jev相关功能自动禁用,其他部分正常工作。

返回格式异常:走兜底路径。

Jev整体宕机:最多损失2.5秒的时间预算(这是路由决策的超时上限),然后走兜底路径,绝不阻塞用户的对话。

除了这些通用兜底,还有几条不依赖Jev的硬安全线:出现风险词(production、delete、migration、security、payment、legal等)的对话,永远不会被路由到最便宜的模型档位;上下文很长的对话,中途不会被切换到更便宜的模型;对话轮次只有在Jev给出高置信度判断时才会被丢弃;电脑操作时,Jev能返回的动作id必须来自开发者预先写好的动作表,不可能凭空冒出一个动作。

这套六层兜底的意义是:Jev的价值是“大部分时候能省钱”,不是“任何时候都不能出错”。承认Jev会出错,然后设计出错时的应对方案,比宣传“我们的准确率是99%”要靠谱得多。


上传的1000字符里都有什么

跟决策外包直接相关的一个问题:外包给Jev的这些判断,需要上传什么数据?

Hermes Jev Skills文档里把这件事列得很细,具体清单:

模型路由场景:上传的是用户当前这一句话,做过脱敏处理(邮箱、电话、令牌、长十六进制字符串会被打码),字符数上限3000。历史对话、工具调用结果、文件内容、记忆库内容,一样都不发。看起来像藏了密钥的对话,或者用户在配置里标记为private_profiles的profile,只发送粗粒度的特征:长度、是否包含代码、是否出现风险词。

记忆过滤场景:上传的是用户的查询语句,加上每个候选段落的前900字符,做过脱敏。段落在存储层的id、路径、来源信息被替换成P0P1这样的占位符,永远不上传。看起来像凭证的段落直接不发。

上下文压缩场景:每一轮对话上传前700字符,做过脱敏。看起来敏感的整轮对话直接跳过。

技能挑选场景:上传用户当前对话(脱敏)加上所有技能的名字和描述。

电脑和浏览器操作场景:上传操作目标、短元素标签、动作描述。截图、页面文本、输入框内容,一样都不发。

日志里存的是决策元数据(档位、模型、置信度、延迟),不存对话原文。

对比browser-use项目:那套方案的浏览器智能体,每次决策都要把网页DOM或者屏幕截图发到云端大模型。Hermes Jev Skills永远不发这些东西,因为Jev根本不需要看,它只需要从预定义的动作id里挑一个。

这个差异是Hermes Jev Skills区别于browser-use的第二个具体机制:所有需要“看”的工作都在本地完成,只把最终选项发给Jev。


一个0.9.1版本承认的错误

Hermes Jev Skills的CHANGELOG里有一段罕见的坦白,跟脱敏机制有关。

早期版本的脱敏规则里,电话号码识别用的是一个宽松的正则,会把类似“x8505550134”“ext8505550134”“Phone8505550134”这种带前缀的号码都识别出来打码。

后来发现这个规则有个副作用:像“1Z999AA10123456784”这种UPS快递单号,因为前后有数字和字母的组合,会被误认为电话号码,直接被脱敏,导致用户查询快递状态的时候,Jev收到的信息里快递单号变成了[REDACTED]

0.8.0版本做了一次修复:把电话号码的识别规则收紧,要求前面不能是字母,避免误伤快递单号。

0.9.1版本发现前一次修复太激进了:新规则把“x8505550134”“Phone8505550134”这些真的电话号码全部漏掉不脱敏了。用户查一个包含电话号的对话,电话号会原样发到Jev。

原本要修的是“少发一点信息”(避免误脱敏),结果修成了“多发一些信息”(漏脱敏),拿数据丢失换成了隐私泄漏。

0.9.1的修复方案:把快递单号先单独识别出来放到一边,让原来的电话号规则原样跑,最后再合并。同时给两个方向都写了测试用例:既测试快递单号不被误脱敏,也测试各种电话号格式都必须被脱敏。

这段CHANGELOG的价值不在于承认了一个bug,而在于说明了一件事:脱敏这种“事关隐私”的功能,任何一次修改都必须双向测试,只测试自己想到的方向,一定会漏。


jev models list看到的每一个模型

最后一个具体功能,跟前面所有场景都相关。

用户装完Hermes Jev Skills之后,可以跑几个命令:


jev models list              # 这台机器能调用的每个模型:价格、上下文、视觉、推理
jev models providers         # 你持有密钥或登录态的提供商
jev models suggest --write   # 根据价格档位生成初版模型池;然后自己微调

第一个命令列出这台机器上所有可调用的模型。数据来源是models.dev这个公开的模型目录,Hermes Jev Skills会根据用户的环境变量里设置了哪些API密钥名、Hermes的.env文件里配置了哪些密钥、Hermes持有哪些提供商的登录态,把用户实际能调用的模型筛出来。

注意:只读密钥的名字,不读密钥的值。

第二个命令列出用户持有的提供商。

第三个命令根据价格档位,自动生成一份初版模型池配置,写进~/.hermes/jev/routing.json。这份配置是所有profile的默认值。单独的profile可以在~/.hermes/profiles//jev/routing.json里覆盖默认值。

这个自动生成的模型池,就是Jev做路由决策时挑选的候选池。

跟前面0.10.0版本修的那个bug连起来看:如果自动生成的模型池里,coding专长的那一维是空的,Jev再怎么准确判断“这是编程问题”都没用,suggest_tiers()会去空池子里找,找不到就回退。所以jev doctor这个诊断命令的价值就在于:帮用户看出模型池的哪些格子是空的,避免花冤枉钱问Jev一个用不上的问题。

现在Hermes Jev Skills的0.10.0版本还有一个未解的细节:route.dead_axis()这个检测函数目前只在启动时和运行jev doctor时被调用,如果用户中途修改了routing.json但没重新启动智能体,那些新增的空维度Jev照样会问、照样浪费钱,直到下一次诊断才能发现。这个热更新场景的检测缺口,代码仓库里目前还没有对应的测试用例。