mcpField
J
jev-skill-select

jev-skill-select

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

关于 jev-skill-select

这项技能会根据 Agent 当前回合为可用技能排序,并推荐匹配项;没有合适技能时则不推荐。它支持 Hermes,也可通过命令行或 Python 直接使用;敏感回合会按开放失败方式处理。

主要功能

  1. 01按当前回合为技能排序
  2. 02分批发送目录排序请求
  3. 03最多推荐三个匹配技能
  4. 04在本地跳过简单致谢
  5. 05抑制重复或被拒绝的推荐

适用场景

  1. 01为 Agent 回合选择任务技能
  2. 02在指定文件夹中查找技能
  3. 03避免在 Hermes 中重复推荐
  4. 04对敏感回合不提供推荐

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kerpopule/hermes-jev-skills --skill jev-skill-select

安装后在 Claude Code 中输入/jev-skill-select确认已加载。

详细介绍

使用 Jev 选择技能

两次往返,在连接已预热时约需 0.5 秒(连接池化之前约需 1.2 秒——过去每次调用都会新建一个 TLS 会话)。第一次往返会针对当前轮次为所有技能排序:目录会拆分为每批 120 个技能,并并行发起询问,因此,包含 377 个技能的目录会同时发送四个请求,包含 960 个技能的目录会同时发送八个请求,总耗时取决于最慢的请求。第二次往返只发起一个请求:它会仔细读取排名前五的技能,逐一评估,也可能全部拒绝。墙上时钟计时与计费请求数并不相同,你付费的是请求数:每个到达 Jev 的轮次预计需要 ceil(skills / 120) + 1 个请求。如果目录里没有任何技能与当前轮次足够匹配,该轮次会在第一次请求后结束。闲聊和普通轮次不会返回技能。读取技能文件夹还需额外时间:460 个技能约需 0.15 秒。

如果插件还运行模型路由,两者会共用一个请求。 Jev 按请求而非问题数量收费,因此插件会在同一次调用中提出路由的三个问题和第 1 阶段的一个或多个问题(jevkit/turn.py),然后将答案分别交给各功能自己的阈值处理。两部分也会在连接层面进行池化(client.py 会保留 keep-alive 套接字;每次调用都新建 TLS 会话,曾让一次决策耗时约 520 毫秒中的约 275 毫秒)。在这套环境中,使用 379 个技能的目录针对 2026-09-21/22 的实时 API 测得:预热连接上的单个问题耗时约 180-250 毫秒;完整的 Hermes 轮次(路由 + 技能选择,合并并池化)从 1784 毫秒 → 672 毫秒——请求数从 3 个降至 2 个。决策不会改变——答案相同,阈值相同——上线前的八个实时轮次中,八次返回的等级和技能都相同。/jev merge_requests off 会让它们恢复为单独请求。私有配置、看起来敏感的轮次,或将路由配置为仅处理 features 状态的情况,都不会合并,因此不会传输任何此前未传输的文本。

确认消息不会离开本机。“ok”、“thanks, that worked”、“got it”、“never mind”、“yes go ahead”、单独的“stop”,以及内容只有标点或表情符号的轮次,都会在本地以 0 毫秒作答。这道拦截规则有意设得很窄。真正的问题(纯 next? 延续除外)、无论多简短的指令(“do it”、“stop it”、“do all of them now”)、数字,或拦截规则无法识别的词语,都会发送给 Jev;这也包括所有使用非拉丁文字书写的请求。误判提问只会损失不到一美分;误判跳过则会让功能悄无声息地什么也不做。

这道严格的本地拦截规则也能识别纯社交开场白(how are you doing today)和纯 next? 延续;真正的问题或指令(all working?、next, fix the config)仍会发送给 Jev。像 using-superpowers 这样的仅供选择器使用的元技能会在排序前移除,包括合并后的路由/技能请求,因此不会挤掉任务流程。

关于 Hermes

处理 Blender 工作时,将 jev-blender 作为默认领域入口,然后加载相关的几何/制作技能。这不会启用始终运行的推理,也不会改变模型路由;其代码优先门控会跳过常规调用,并将实际的产物验证保留在本地。

/jev skills on 会让 hermes-jev 插件在每个新回合开始时执行一次此操作。当某项技能明显适用时,会在回合中附上一行建议,注明该技能;除非它显然不适用,否则请使用 skill_view 加载。它会询问 Hermes 本次会话实际加载了哪些文件夹——配置的 skills 文件夹以及每个 skills.external_dirs 文件夹——并遵循 skills.disabled 设置。不会读取项目本地的技能文件夹。

同时启用 /jev routing on 后,阶段 1 的问题会随路由请求一起发送,而不是单独发送(见上文的成本说明);两项回答由负责各自决策的代码读取,日志中唯一新增的内容是一个 merged 行。如果这个共享请求失败,就不会建议技能,路由会在下一个钩子中自行发起请求;这正是两个功能各自单独运行时已有的行为。

提出建议前,还会通过 Hermes 自己的加载器进行核验:如果 skill_view 在本次会话中无法打开某个名称,就绝不会推荐它;推荐的名称也会是加载器实际识别的名称。因此,你不会被引导去使用自己无法获取的流程——当配置中的目录小于 Jev 用于排名的目录时,以及某项技能从未安装在当前机器上时,这一点尤其重要。无法核验就保持静默,因为任何建议都不值得换来一次失败的调用。

另外两条规则可确保建议值得阅读:

  • 本次会话已加载的技能不会再次推荐。
  • 如果 Agent 持续拒绝某项技能的建议,该技能就会停止在此配置中推荐。若该技能最近至少收到 5 次建议,且在 14 天内加载次数少于建议次数的 1/10,则会抑制该技能。不过每 6 小时仍会推荐一次,因此变得有用的技能之后仍可能再次出现。

插件会在提出每项建议时记录下来。配置的 jev/skill-feedback.json 仅保存技能名称、时间以及 Agent 是否加载了该技能。在 jev/state.json 中设置 "skill_feedback": "off",即可关闭第二条规则。

通过重放一个真实周的数据进行测量(1,188 条建议):

  • **之前:**403 条在 5 分钟内被加载(34%)。
  • **启用两条规则后:**771 条建议,395 次加载(51%)。

这意味着移除了 115 条重复建议和 294 条被拒绝的建议,代价是少了 8 次加载。5 分钟内加载只是相关性,并不能证明建议促成了加载。

诊断 fail-open

本地 skill 决策日志条目现在包含一个范围受限的 reason_code:no_skills、sensitive_turn、stage_one_incomplete、已识别的传输/验证代码(例如 timeout 或 invalid_response),或 other。成功记录使用 null。不会记录任意原因文本、提示词或原始异常消息。在更改预算或阈值前,应区分有意的隐私/目录跳过与服务故障。缺少此字段的旧记录无法追溯确认原因;请将其归入未知类别,而不要猜测。fail-open 仍意味着保持静默,而不是对技能作出否定判断。

直接提问(任何 Agent)

jev pick-skill --turn "<the request>"            # searches Hermes, Claude Code, Codex and ./skills folders
jev pick-skill --turn "..." --root ~/my/skills   # or name the folders; repeat --root for each one

--root 会替换默认文件夹,因此请列出所有想要搜索的文件夹。在 Python 中,skillpick.discover_roots(hermes_home) 会返回 Hermes 读取的文件夹(包括共享文件夹),可直接传给 skillpick.discover()。

回复

{"status": "ok", "needs_skill": 0.78, "skills": [{"name": "xlsx", "path": ".../xlsx/SKILL.md", "match": 0.72}], "latency_ms": 1143}

needs_skill(0–1)以及最多三个 {name, path, match},按优先级排序。加载第一个 match 大于或等于 0.5 的技能。空列表表示无需技能即可继续;不要再去寻找其他技能。

另外三种格式的 skills 列表均为空:

回复含义操作
{"status": "ok", "needs_skill": 0.0, "skills": [], "latency_ms": 0, "skipped": "trivial"}已在本地回答;未询问 Jev无需技能即可继续
{"status": "ok", "needs_skill": 0.0, "skills": [], "latency_ms": 663}Jev 对目录进行了排序,但没有合适的技能,因此没有发起第二次请求无需技能即可继续
{"status": "fail_open", "reason": "...", "skills": []}未询问 Jev,或 Jev 未作答:服务中断、未找到技能,或本轮内容看起来包含秘密假设此技能不存在,照常继续。这并不表示“无需技能”

当目录超过 960 个技能的上限时,其中任何一种格式都会出现 skills_dropped。该字段表示有多少个最后找到的技能未参与排序,因此“没有合适技能”并不包含这些技能。它们的名称每个进程只会记录一次。禁用不使用的技能,以重新低于上限。

说明

  • 它只读取每个技能 front matter 中的 name 和 description,且只读取描述的前 200 个字符,因此描述含糊或冗长的技能可能无法被找到。应修改描述,而不是调整阈值。
  • 当两个文件夹中有同名技能时,优先使用最先搜索到的文件夹。在 Hermes 中,该文件夹是配置文件自己的文件夹。
  • 发送前会对本轮内容进行脱敏;如果本轮内容看起来包含秘密,就不会发送,并且你会收到一个带有空列表的 fail_open。
  • 如果任意一个批次失败,整个技能选择就会以开放失败方式结束。部分排序会在正确技能恰好位于丢失的批次时,仍以很高的置信度给出“无技能”的结论。
  • 技能建议仅供参考。阅读已加载的技能后,如果发现它与任务不匹配,就将其弃用并继续。

评论

支持 Markdown