SkillRanker:让 AI Agent 在数百个 Skill 中动态选择最优下一步
SkillRanker:让 AI Agent 学会在数百个 Skill 中动态选择最优下一步
SkillRanker 解决的是一个真实痛点:当一个 AI Coding Agent 装了几十个、上百个 Skill 时,”该用哪个” 本身变成了瓶颈——Skill 描述相似、上下文变化快、选错则浪费 Token 甚至走错方向。SkillRanker 是一个 Rust 编写的独立 CLI,通过 TypeSafe.ai 的 Jev 模型在运行时实时评估候选 Skill,为 Agent 动态推荐最匹配当前任务的那个。9 月 17 日首发登榜 GitHub Trending,9 月 19 日仍在榜。
功能与设计原则
SkillRanker 的核心是一个技能路由(Skill Routing)引擎,而非另一个 Skill 合集。它的设计原则是:
- 实时上下文感知:输入是 Agent 当前对话、最近请求和工作区信号,而非静态的 Skill 名称列表
- 结构化输出 + 弃权选项:Jev 返回带校准概率的结构化判断,并内置 “None of these” 选项,避免强行推荐
- 可解释可复现:每轮排名结果均可记录、重放和本地校准,开发者能清楚知道为什么推荐了某个 Skill
- Claude Code Hook 集成:提供原生 prompt-hook,直接嵌入 Agent 的决策循环
认可度
- GitHub Star:50(截至 2026-09-19)
- 编程语言:Rust(高性能 CLI,无运行时依赖)
- 创建时间:2026-09-17,首日即进入 GitHub Trending
- 技术支撑:Jev(TypeSafe.ai)——亚秒级带校准概率的结构化判断模型,455ms 响应,16 模型测试中唯一同时满足亚秒级和不确定性承认的模型
- 同类比较:在技能路由方向,SkillRanker 是少数几个将动态排名机制实际落地的开源项目之一
链接
GitHub:https://github.com/Dicklesworthstone/skillranker
原作者
Dicklesworthstone(GitHub Username),是一位专注于 AI Agent 工作流工具的独立开发者,已在 GitHub 上发布 14 个 Claude Code Skill,涵盖 Tmux 多 Agent 编排、CASS 记忆系统、Destructive Command Guard 等多个实用工具链。
介绍
随着 Claude Code、Codex 等 Coding Agent 安装的 Skill 越来越多,一个新问题浮现出来:Skill 选对了是加速,选错了是浪费上下文甚至误导 Agent。传统方案靠 Agent 自己根据 Skill 名称猜测,或者让用户手动指定——前者不够智能,后者打断了 flow。
SkillRanker 把这个问题当作一个独立的推理任务来处理。它维护 Agent 当前可见的 Skill 清单(来自 Claude Code 的 ~/.claude/skills/ 或其他 Harness 的 Skill 注册表),结合对话上下文,调用 Jev 对候选 Skill 进行两轮比较:第一轮广度初筛,第二轮读取富文本摘要注意辨别细微差异。最终输出包含排序结果、置信度评分,以及 “None of these” 弃权标记——这意味着它不会强迫 Agent 选一个不合适的 Skill。
技术栈上,SkillRanker 用 Rust 编写,依赖 Jev 的 HTTP API 做推理,无需本地模型。超过 254 个候选 Skill 时,内置 Quill(FrankenSearch)先做本地预筛选再交 Jev,避免上下文爆炸。
特点
- Jev 驱动:TypeSafe.ai 的 Jev 模型提供带概率校准的结构化判断,避免随机 hallucinated 排序
- 双层比较架构:广度初筛 + 富文本细筛,两轮确保既不全错也不漏掉细微差异
- Claude Code Hook 原生集成:提供
sr hook claude命令,将排名结果直接注入 Agent prompt 循环 - 弃权机制:内置 “None of these” 选项,Skill 不适用时可选择不推荐,防止误导 Agent
- 本地反馈回路:支持本地校准和历史重放,开发者可针对自己的 Skill 库调优推荐策略
- 隐私优先:排名推理在 TypeSafe API 端执行,本地状态不外传;Skill 元数据全部本地管理
- 大规模 Skill 库支持:超过 254 个候选时自动触发 Quill 预筛选,不依赖外部向量库
使用方法
安装(需要 Rust 工具链):
cargo install skillranker
或从源码构建:
git clone https://github.com/Dicklesworthstone/skillranker
cd skillranker
cargo build --release
# 二进制在 target/release/sr
注册 Claude Code Hook(让 Agent 自动调用):
sr hook claude
基本调用流程:
# 离线演示(不需要 API Key)
sr demo --case useful
# 在线排名(需要 TypeSafe API Key)
export TYPESAFE_API_KEY=your_key_here
sr rank --allow-network
配置文件(~/.config/skillranker/config.toml):
typesafe_api_key = "your_key_here" # 必填
model = "jev" # 默认 jev,可选 jev-fast
max_candidates = 254 # 超过此数自动触发 Quill 预筛
使用场景与人群
适用场景:
– 团队维护了大量内部 Skill(10+),Agent 经常选错或选不到合适的
– 需要在 Skill 选型层面做可观测性和可解释性(为什么推荐了这个 Skill)
– 在 CI/CD 流程中希望 Agent 的 Skill 调用决策可被审计和复现
– 大型 Skill 库(100+)的动态路由,避免全量加载导致 Token 浪费
目标用户:
– AI Coding Agent 高级用户(Claude Code / Codex / Cursor)
– AI Engineering 团队(需要规范 Agent 行为、积累 Skill 资产)
– Skill 开发者(需要工具来验证自己的 Skill 在真实任务中是否被正确选中)
输入与输出案例
案例 1:日常 Bug 修复场景
输入(Agent 上下文片段):
“I’m fixing a null pointer exception in the user auth flow. The stack trace shows it happens in refreshToken().”
SkillRanker 排名输出(JSON 结构):
{
"rankings": [
{"skill": "diagnose", "score": 0.91, "reason": "debugging workflow, null pointer context"},
{"skill": "code-review", "score": 0.73, "reason": "auth-related code path"},
{"skill": "tdd", "score": 0.44, "reason": "less relevant to hotfix"},
{"skill": "none_of_these", "score": 0.12, "reason": ""}
],
"selected": "diagnose",
"calibration": "high_confidence",
"latency_ms": 487
}
Agent 最终调用 /diagnose Skill,进入系统性调试工作流,而非直接写代码。
案例 2:新功能实现场景
输入(Agent 上下文片段):
“User wants a new REST endpoint for listing all subscriptions with pagination and filtering by status.”
SkillRanker 排名输出:
{
"rankings": [
{"skill": "api-design", "score": 0.88, "reason": "REST endpoint design, pagination"},
{"skill": "spec-driven", "score": 0.81, "reason": "new feature spec before implementation"},
{"skill": "tdd", "score": 0.65, "reason": "write tests before code"},
{"skill": "improve-codebase", "score": 0.21, "reason": "not a refactor context"}
],
"selected": "api-design",
"calibration": "high_confidence",
"latency_ms": 512
}
Agent 先进入 API 设计 Skill,定义端点规范,再通过 TDD 循环实现。
评论区
登录后可评论。