mcpField
J
jev-model-routing

jev-model-routing

github.com/kerpopuleAgent 工作流1.2k39 次安装今天更新
代码仓库

关于 jev-model-routing

jev-model-routing 根据任务难度、专长和风险选择模型及工作量级,适用于使用 Hermes 的用户和其他 Agent。它支持 Hermes 自动路由、直接分类,以及基于检查结果的委派任务分级。

主要功能

  1. 01按任务难度与风险分类
  2. 02按级别和专长配置模型池
  3. 03控制 Hermes 自动路由
  4. 04依据检查结果升级委派任务
  5. 05影子模式与决策日志

适用场景

  1. 01为新的 Hermes 对话轮次选择模型
  2. 02委派任务前确定模型
  3. 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
LaneClaude Code(子 Agent)Hermes Kanban 卡片(默认映射)
smalljev-lane-small:Haiku,低gpt-5.6-luna,中
mediumjev-lane-medium:Sonnet,中gpt-6-sol,中(今日默认)
highjev-lane-high:Opus,中gpt-6-sol,中
escalatejev-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 模式运行一天,查看实际轮次会落在哪个级别,然后在各模型池之间调整模型。阈值应根据自己的跟踪数据调整,切勿凭直觉设定。

评论

支持 Markdown