关于 jev-model-routing
jev-model-routing 根据任务难度、专长和风险选择模型及工作量级,适用于使用 Hermes 的用户和其他 Agent。它支持 Hermes 自动路由、直接分类,以及基于检查结果的委派任务分级。
主要功能
- 01按任务难度与风险分类
- 02按级别和专长配置模型池
- 03控制 Hermes 自动路由
- 04依据检查结果升级委派任务
- 05影子模式与决策日志
适用场景
- 01为新的 Hermes 对话轮次选择模型
- 02委派任务前确定模型
- 03根据测试和差异检查工作周期
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kerpopule/ hermes-jev-skills --skill jev-model-routing安装后在 Claude Code 中输入/jev-model-routing确认已加载。
详细介绍
使用 Jev 进行模型路由
Jev 会读取一轮对话,并在一次约 0.4 秒的请求中回答三个问题:任务有多难、属于哪类工作,以及出错的代价是否高。随后,代码会根据对应的等级和专长遍历你的模型池,并选择第一个符合条件的模型(图像、上下文大小)。你不必凭感觉挑选模型,只需询问。
在 Hermes 中自动运行
启用 hermes-jev 插件后,每个新的用户回合都会在首次调用模型之前路由一次。只有在提供方、端点、主机模型和发出的请求模型均保持不变时,工具循环的后续请求才会沿用该决定。任何不匹配都会使该回合剩余部分的路由失效,包括 A → B → A 的切换,不会再获取一次分类结果。如果首个发出的模型与主机元数据不一致,则保留发出的请求且不进行分类;等效的提供方前缀会经过规范化。下一回合会重置该决定。端点绑定保留在内存中,不会写入遥测数据。各配置文件的开关:
/jev status
/jev routing shadow decide and log, but do not switch (start here)
/jev routing on switch models
/jev routing off
/jev notice on show "[Jev] medium · coding → kimi-k2.7-code · confidence 0.97" on routed replies
插件可以替换模型,但不能替换提供方连接。在 OpenRouter 上,这仍意味着所有供应商(DeepSeek、GLM、Kimi、MiniMax、Grok、Qwen、Gemini、GPT)。如果你自行运行 /model,则以你的选择为准,Jev 不会干预。
对于 Hermes 的 custom 提供方,插件无法推断其后端对应的 models.dev 提供方。现在,插件会保留当前模型,并记录 custom provider needs an explicit provider_aliases.custom,而不是错误地归咎于不相关的模型池。只有当该端点确实提供模型池中的模型时,才在 routing.json 中设置 "provider_aliases": {"custom": "venice"}(将 venice 替换为实际的模型池前缀)。启用路由前,请检查端点和模型池中的每个模型;别名是运维人员作出的声明,不是跨提供方发现机制。此操作不会修改任何正在使用的路由模式。
直接询问(任何 Agent 均可)
在委派任务或启动子 Agent 之前,先询问应使用哪个模型:
jev route --prompt "<the task, in the person's words>" --current "<provider:model you are on>"
使用回复中的 model_id。routed: false 表示留在当前模型;reason 会说明原因。如果对方希望看到路由信息,请转达 notice。
Effort 的传递与证据
保留明确设置的手动 effort,包括 none 和 off。Chat Completions 使用顶层的 reasoning_effort;Responses 仅在 reasoning 对象已启用且未明确设置 effort 时使用 reasoning.effort。绝不启用已禁用的 reasoning,也不对未发生变化的请求发出已应用 effort 的通知。Shadow 模式仅用于观察。可用模型池并不等于当前生效的配置,模型置信度需要根据具体任务进行限定。请参阅模型集群指南和测量与溯源。
Lanes:委派任务及其后的每个步骤
对于交给子 Agent 或工作者的任务,只要能正确完成,就选择最小的模型和最低的工作量。Jev 负责决策;它绝不会编写代码、补丁或设计。
jev lane classify --task "<the work, in the person's words>" # first lane + model/effort
jev lane step --task "..." --lane <lane> --attempt <n> \
--run "<test cmd>" --run "<lint/typecheck cmd>" --scope "<path glob>" # after each cycle
| Lane | Claude Code(子 Agent) | Hermes Kanban 卡片(默认映射) |
|---|---|---|
small | jev-lane-small:Haiku,低 | gpt-5.6-luna,中 |
medium | jev-lane-medium:Sonnet,中 | gpt-6-sol,中(今日默认) |
high | jev-lane-high:Opus,中 | gpt-6-sol,中 |
escalate | jev-lane-escalate:Opus,高 | gpt-6-astra,高 |
jev lane targets --host hermes 会显示当前生效的映射;<hermes root>/jev/lanes.json(或 ~/.config/jev/lanes.json)可以覆盖任意字段。Hermes 映射根据某个团队自己的历史记录校准(参见 docs/lanes.md);使用 jev lane replay-build / replay-report 重新测量你自己的映射。
- 一次请求,问清所有问题。
classify会同时询问 lane、是否具有安全敏感性以及需求是否不明确(可选择other,表示任务应先由人查看)。代码会应用阈值:选择small需要 0.7 的置信度;选择medium的置信度低于 0.5 时会转到high;安全敏感性 ≥ 0.7 时至少选择high。keep_current表示保留当前模型(自己完成,或提出请求)。 - 先看代码。 用户指定的模型、两次失败的尝试,或你自己对安全路径的检查,都可以在不询问 Jev 的情况下作出决定。
- 先做确定性检查。
step会运行你指定的测试、编译器、类型检查器和 linter,并读取git diff。检查失败属于retry(同一 lane 失败两次后则为escalate);超出--scope的文件属于retry;未运行的检查属于verify;在 small/medium lane 上修改安全相关文件则属于escalate。只有剩下的问题才会询问 Jev:是否已实现、是否在范围内、下一步做什么。 - 只根据证据逐级升级,一次升一级。 在最高 lane 选择
escalate会返回person。 - 完成状态必须有依据。 除非检查已运行并通过,且 diff 始终在范围内,否则会拒绝
complete(变为verify,并附带complete_refused)。检查失败时要如实说明;绝不要隐瞒。 - 每项长时间检查的输出只有末尾部分会发送给 Jev。绝不要压缩或过滤 Agent 自己的推理。
- Jev 不可用时:
classify保留当前模型,step返回verify。 - 让
--run执行脚本,而不是单行命令。 它会在 shell 中运行,因此管道和&&都可用,但证据中打印的命令会被截断,读者无法判断哪些检查通过了。使用一个小脚本检查确切的提交和每个退出代码,并为每个关卡打印ok:/FAIL:,能让证据更清晰。确保脚本只读取本轮的结果:同一日志中较早的失败尝试会导致错误的运行被判为失败(或通过)。 - 只读工作:
--no-changes-expected。 对于审查或报告,请明确说明;否则,空 diff 会被看作什么都没做。 - 如果
escalate后仍有待定决策,则返回person。 审查后的事实已得到验证,但仍需负责人作出选择(例如接受风险或选择方案)时,更强的模型也无法替其决定。应将决策交给负责人,而不是将任务再升级一个 lane 重新执行。
在 Hermes 上,jev lane shadow(由 cron 调用)会对新的 Kanban 卡片进行分类,并记录它会如何选择;/jev lanes shadow|on|off 用于切换,且 <hermes root>/jev/LANES_OFF 优先级最高。on 会在派发前设置卡片的模型和工作量;只有当 jev lane shadow-report 显示使用更少 token 且首次尝试成功率相同,并且负责人同意后,才开启此功能。
模型池
jev models list 会显示这台机器可以调用的所有模型(models.dev 目录中,你持有密钥或已登录的提供商对应的模型),以及它们的价格、上下文和能力。模型池位于 ~/.hermes/jev/routing.json(或 ~/.config/jev/routing.json):
{"tiers": {"simple": {"general": ["openrouter:deepseek/deepseek-v4.1-flash"], "coding": ["..."]},
"medium": {"general": ["..."], "coding": ["..."], "research": ["..."], "writing": ["..."], "vision": ["..."]},
"hard": {"general": ["..."], "coding": ["..."]}},
"exclude": ["*:free"], "private_profiles": ["billing"], "mode": "redacted-text"}
jev models suggest --write会根据价格区间生成初稿。然后进行编辑:顺序很重要,优先使用第一个符合条件的模型。- 专长类别包括
general、coding、writing、research和vision。未指定的专长会回退到general。模型池不会降级,只会升级。 - 当用户说出某项任务偏好的模型时,将它放在对应模型池的首位。不要臆造模型 ID:从
jev models list --search <name>中复制。
可依赖的保证
- 难度必须有依据:Je v 返回的各难度等级概率分布中,“较难”或“专家”级别必须有实际概率质量(默认 0.6),而不是根据平均分判断。
- 不确定不等于困难。对于无害轮次的不确定回答会保留当前模型;对于有风险的轮次则选择中等难度。
- 风险词(production、delete、migration、security、payment、legal……)无论提示词多短,都会将难度下限设为中等。但仅凭这些词不会将难度提升到困难级别。
- Jev 判断的是用户的请求:长轮次会主要根据开头和结尾来解读(
ask_chars)。中间的模板文字不会作为评分重点。 - 默认关闭推理强度路由,且只有路由处于
on状态时,才会写入标准的reasoning_effort字段。可通过精确的提供商:模型能力映射启用,例如"effort": {"enabled": true, "levels": ["low", "medium", "high", "high"], "models": {"openrouter:your-verified-model-id": ["low", "medium", "high"]}}。请将示例 ID 替换为已验证支持这些级别的模型;不会假定支持xhigh。请求的级别必须出现在该精确模型的允许列表中;已有的reasoning_effort或extra_body.reasoning始终优先。shadow/off不会修改请求。选择推理强度时会复用路由难度的回答,不会再次调用 Jev;不受支持或格式错误的配置会安全地默认放行。安装不会启用全局推理强度设置或实时路由。 - 模板轮次不会进行路由:任何以
skip_prefixes条目([kanban]、[SESSION HANDOFF……)开头的轮次,或来自skip_session_prefixes会话(cron)的轮次,都会继续使用其配置文件或任务原先配置的模型。 - 大上下文(严格高于
sticky_context_tokens,默认约为 32k):绝不会切换到更便宜的模型,因为重建提示词缓存的成本高于节省的费用。如果任一模型没有目录定价,也会保守地保留当前模型。缓存键会区分是否处于此保护条件的精确一侧,而不只是使用粗略的上下文分桶。 - 选择启用的推理强度路由不能低于已解析的路由级别:中等难度会将难度分桶的下限设为常规,困难难度会设为较难。不确定但保留当前模型的决定也至少会对应常规级别。大上下文情况下保留当前模型会通过
effort_tier保留已解析的下限,不会触发模型切换或升级。调用方显式指定的推理强度以及精确模型能力检查仍然优先。 - 看起来含有机密信息的轮次,以及列在
private_profiles中的任何配置文件,只会向 Jev 发送粗略特征(长度、是否含代码、风险词),绝不会发送文本。这些轮次以及mode: features的配置文件也不会使用下文所述的合并请求。 - 通常,这三个问题会与技能选择的第 1 阶段(
jevkit/turn.py)放在同一个请求中,因为 Jev 按请求而不是按问题收费,且底层连接使用连接池(过去每次调用都新建 TLS 会话,约占一次决策总耗时 520 ms 中的 275 ms)。实时测量数据(2026-09-21/22):连接预热后,单个问题耗时约 180-250 ms;对于同时需要两者的每个轮次,耗时从 1784 ms 降至 672 ms,请求数从 3 个降至 2 个。每项特征仍会通过各自的阈值读取对应答案。/jev merge_requests off会再次将它们分开。 - Jev 不可用、响应过慢(预算为 2.5 秒)或格式错误时:保留当前模型,且不会延迟超过该预算。若回答自相矛盾——例如概率分布未涵盖所有选项、概率总和不为 1、所选选项并非最大值,或分数与其自身分布不符——则会以
invalid_response拒绝,并同样按此处理。
调优
决策日志会写入 <hermes home>/logs/jev-decisions.jsonl,不包含提示词文本。先以 shadow 模式运行一天,查看实际轮次会落在哪个级别,然后在各模型池之间调整模型。阈值应根据自己的跟踪数据调整,切勿凭直觉设定。