agent-skills-eval 是由 darkrishabh 开发的开源项目(MIT 协议), 2026年5月登上 Hacker News。它是一个专门为 Agent Skills 生态设计的测试运行器。
存在的意义
Agent Skills(Anthropic 推出的开放标准)让给 agent 注入领域知识变得很简单——写个 SKILL.md 就行。 但难的是证明它真的有效。没有 eval,只能靠"感觉变好了"这种玄学判断。
agent-skills-eval 填补了这个空白。它跟具体 agent 运行时解耦,任何兼容 OpenAI 的模型都能用。
Quickstart
npx agent-skills-eval ./skills \ --target gpt-4o-mini \ --judge gpt-4o-mini \ --baseline \ --strict
指向一个 skills 目录,给一个 target 模型和一个 judge 模型,产出完整的产物目录和静态 HTML 报告。
核心技术原理
一、Skill 装载
递归扫描目录找到所有包含 SKILL.md 的文件夹。解析 YAML frontmatter:
--- name: csv-analyzer description: Analyze CSV files. license: MIT ---
frontmatter 之后的 Markdown body 就是 skill 的指令内容。还自动加载 references/*.md(参考文档)、scripts/*(脚本)。
--strict 模式下还会校验 name 格式(小写连字符)、description 长度等。
二、运行调度
使用固定大小并发池(默认 4)。每个并发任务同时占用 2 个 provider 调用(target + judge),
所以实际 API 并发为 2 × concurrency。
执行分 三个阶段:
- 顺序扫描 — 按发现顺序加载 skill,写入 meta.json,顺序稳定
- 并发执行 — 扁平化所有 (skill, evalCase) 任务,投入 worker pool
- 汇总 — 聚合 pass/fail 统计,生成 benchmark + HTML 报告
三、核心评估流程
1. 构造 system message — 将 skill 包装为 XML 标签结构:
<skill name="csv-analyzer"> <description>Analyze CSV files.</description> <instructions>(SKILL.md body)</instructions> </skill>
with_skill 模式下注入这段 XML 作为 system message;
without_skill 模式 system 为 undefined,完全没有 skill 上下文。
2. 调用 target model — 通过 Provider 抽象层发送请求。 如果 provider 不支持 system role 或附件,自动降级拼接为纯文本 prompt。
3. 记录产物 — 每次运行写入完整文件:
eval-xxx/with_skill/ ├── outputs/response.txt # 模型原始输出 ├── timing.json # token 数 + 耗时 ├── grading.json # 评分结果 ├── prompts.json # 完整 prompt 记录 └── tool_calls.json # [可选] 结构化工具调用
四、评分引擎(双架构)
第一层:确定性工具断言
完全在本地计算,零 LLM 开销。操作结构化 toolCalls 数据,支持 6 种类型:
| 类型 | 作用 |
|---|---|
tool-called | 检查某工具是否被调用过 |
tool-not-called | 检查某工具是否未被调用 |
tool-arg-equals | 工具参数精确匹配 |
tool-arg-contains | 工具参数包含子串 |
tool-arg-matches | 工具参数正则匹配 |
tool-call-count | 调用次数范围检查 |
通过冒号路径(dot-notation)遍历参数对象实现,纯确定性逻辑。
第二层:LLM-as-Judge
对自由文本 assertions 调用 judge model 评分。Judge prompt 要求:
- 每个 PASS 必须附具体证据(quote 或引用)
- 不给予"怀疑的利"——模糊就是 FAIL
- 严格 JSON 格式输出
- 如果 judge 返回格式错误,有一次自动重试机会
如果 evals.json 没写 assertions 但写了 expected_output,框架自动推导一条断言:
"The output satisfies this expected output: ..."
五、基准统计
benchmark.json 核心计算 delta(with_skill − without_skill):
还统计时长和 token 消耗的 delta,让你看到 skill 的成本效益比。
完整产物结构
agent-skills-workspace/
└── iteration-1/
├── meta.json # 运行元数据
├── benchmark.json # 汇总 pass/fail + delta
├── eval-basic/
│ ├── with_skill/
│ │ ├── outputs/
│ │ ├── timing.json
│ │ └── grading.json
│ └── without_skill/
│ └── ...
└── report/
└── index.html # 可视化报告,可独立发布
配置方式
支持 YAML 配置文件和 TypeScript SDK:
# agent-skills-eval.yaml root: ./skills workspace: ./agent-skills-workspace baseline: true target: gpt-4o-mini judge: gpt-4o-mini concurrency: 4 strict: true report: title: "My Skills Report"
OpenAICompatibleProvider,支持 OpenAI、Together、Groq、Anthropic(通过兼容层)、本地 Llama。
你也可以实现 Provider 接口对接自己的后端——5 个字段、1 个方法。
生态上下文
| 来源 | 内容 |
|---|---|
| agentskills.io | 官方 eval 标准:evals/evals.json 格式、workspace 结构规范 |
| OpenAI 博客 | Codex skills 的 sysetmatic eval 实操指南(2026.01) |
| Anthropic | Agent eval 基础架构概念:task、trial、grader、transcript、outcome(2026.01) |
| Langfuse 实践 | 用 Langfuse Datasets + Tracing 评估 Langfuse skill 的完整案例 |
| arXiv 综述 | 《Agent Skill Evaluation and Evolution》系统综述(2026.06) |
| HN 讨论 | 37 条讨论,涉及 skill 被忽略、自省循环、tool-call 断言等话题 |
发布渠道
同类对比:SkillTester.ai
在 Agent Skills 评估领域,除了 agent-skills-eval,另一个值得关注的项目是 SkillTester.ai—— 由北京大学团队(Leye Wang、Zixing Wang、Anjie Xu)开发, 2026年3月发布并有 arXiv 论文的基准测试系统。
三阶段 Pipeline
Benchmark Spec 的严格性
SkillTester 的 Benchmark Spec 比 agent-skills-eval 更形式化:
- Functional IDs 固定编号:
C_01–C_08(常见)+H_01–H_04(困难),恰好 12 个 - Security probes 固定 9 个
- 每个任务必须有
TaskDescription.md+WorkSpace/+Grader/ - Outcome.Rubric 必须 恰好 10 条成功标准,带稳定 ID
- 评分走 Code Grader(代码实现),一对一映射到 rubric ID,不是 LLM judge
- SpecAgent 还负责执行独立的安全探测套件
本身就做成了一个 Skill
SkillTester 把自己也发布成一个 agent skill,安装后 agent 可以在安装第三方 skill 前自动查询:
npx skills add https://skilltester.ai --skill skilltester
两种触发方式:
- 安装时自动触发 — 用户准备安装第三方 skill 时自动查安全
- 显式触发 — 用户说 "Check this skill https://..."
已有测试结果则返回 benchmark 摘要;否则提示"未测试,稍后再试"。 相当于给 skill 装了个安全扫描器。
Dashboard 网站
skilltester.ai 是一个公开的 SPA Dashboard:
- 浏览所有已测 skill 的列表
- 按来源、测试状态、安全状态(Pass / Cautious / Risky)筛选
- URL 查询:输入 skill 的下载 URL 查是否已测
- 排序维度:Most Viewed、Utility First、Security First
全面对比
| 维度 | agent-skills-eval | SkillTester |
|---|---|---|
| 出身 | 个人项目(darkrishabh) | 学术背景(北大团队 + arXiv 论文) |
| 评分维度 | assertions 通过率 + delta | Utility 分数 + Security 分数 + 三级安全标签 |
| 评分方式 | LLM-as-Judge(有重试机制) | Code Grader(确定性代码评分) |
| 架构 | 单步:target → judge | 三阶段 Pipeline:Sample → Exec → Spec |
| 安全测试 | 无专门安全维度 | 9 个独立安全探测 + 安全评分 |
| 测试规模 | 用户自定,灵活 | 严格固定:12 tasks + 9 probes |
| 交付形式 | CLI / TypeScript SDK | Dashboard 网站 + 可自跑 Pipeline |
| 安装方式 | npm install agent-skills-eval |
npx skills add https://skilltester.ai |
| 使用场景 | 开发者自测自己的 skill | 社区基准 + 安装前安全检查 |
| 杀手功能 | with/without 对比 + 静态 HTML 报告 | 公开 Dashboard + 安全双维度 |
同类对比:SkillScore
SkillScore 是由 joeynyc 开发的 CLI 工具(TypeScript,MIT 协议), 定位完全不同——它不做运行时测试、不调用任何 LLM,而是纯静态分析 SKILL.md 的内容质量。
安装 & 使用
# 全局安装 npm install -g skillscore # 本地 skill 目录 skillscore ./my-skill/ # GitHub 远程 skillscore https://github.com/user/repo/skill-path skillscore -g FrancyJGLisboa/agent-skill-creator # 输出格式 skillscore ./my-skill/ --json skillscore ./my-skill/ --markdown --output report.md # 批量对比 skillscore ./skill1 ./skill2 ./skill3 --batch
7 维度评分体系(v2.0 Anthropic-Aligned)
| 维度 | 权重 | 检查内容 |
|---|---|---|
| Identity & Metadata | 20% | YAML frontmatter 格式、name 小写连字符、description 不模糊 |
| Conciseness | 15% | body ≤500 行、渐进式披露、不解释 Claude 已懂的基础知识 |
| Clarity & Instructions | 15% | 编号步骤、术语一致、代码示例、命令式 + 弹性指导混合 |
| Routing & Scope | 15% | WHAT+WHEN 描述、负路由示例、领域词汇、第三人称 |
| Robustness | 10% | 代码块错误处理(try/catch)、依赖验证步骤(--version) |
| Safety & Security | 15% | 相邻代码的密钥+网络泄露检测、危险命令确认、权限提升 |
| Portability & Standards | 10% | Windows 路径、硬编码绝对路径、MCP 工具格式、时效性信息 |
等级标准
技术原理
纯静态分析——不需要网络、不需要 LLM 调用。核心是 TypeScript 规则引擎:
const parser = new SkillParser(); // 解析 SKILL.md → ParsedSkill const scorer = new SkillScorer(); // 7 维度评分 → SkillScore const reporter = new TerminalReporter(); // 终端 / JSON / Markdown 输出
所有规则都是确定性的:
- 正则匹配 — YAML frontmatter、name 格式、
sudo检测 - 行级扫描 — 500 行限制、相邻代码行模式(密钥 + 网络请求在 5 行内 = 泄露风险)
- 关键词检测 —
try/catch、--version、command -v、硬编码路径 - 语义标记 — 第三人称检测、时间敏感词("as of"、具体日期、pinned 版本)
全景对比
| 维度 | agent-skills-eval | SkillTester | SkillScore |
|---|---|---|---|
| 本质 | 运行时对比测试 | 基准 Pipeline | 静态分析 Linter |
| 需要 LLM? | ✅ target + judge | ✅ agent 执行 | ❌ 完全不需要 |
| 测什么 | 模型带 skill 后表现 | Utility + 安全 | SKILL.md 写得规不规范 |
| 评分方式 | LLM-as-Judge | Code Grader | 规则引擎 |
| 安装 | npm install agent-skills-eval |
npx skills add ... |
npm install -g skillscore |
| 适合时机 | 开发迭代 | 社区安全审核 | 提交前门禁 / CI 准入 |
agent-skills-eval → 实际表现如何(运行时 A/B 测试)
SkillTester → 安全性和通用基准如何(社区审核)
理想流水线:SkillScore 预处理门禁 → agent-skills-eval 迭代验证 → SkillTester 发布审计。
Tony's Lab · 2026