← 返回 Tony's Lab

Agent Skills Eval

Agent Skills 的测试框架——证明你的 SKILL.md 到底有没有用
📅 2026-07-29 🏷️ TypeScript 🏷️ Agent Skills 🏷️ Eval

agent-skills-eval 是由 darkrishabh 开发的开源项目(MIT 协议), 2026年5月登上 Hacker News。它是一个专门为 Agent Skills 生态设计的测试运行器。

一句话概括:写一个 SKILL.md,放一些 evals,然后让数据告诉你——这个 skill 到底有没有让模型表现更好。

存在的意义

Agent Skills(Anthropic 推出的开放标准)让给 agent 注入领域知识变得很简单——写个 SKILL.md 就行。 但难的是证明它真的有效。没有 eval,只能靠"感觉变好了"这种玄学判断。

agent-skills-eval 填补了这个空白。它跟具体 agent 运行时解耦,任何兼容 OpenAI 的模型都能用。

🔬 核心对比
每个测试用例跑两次——带 skill 和 不带 skill(基线)——让 judge 模型分别评分,用数据说话。

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。

执行分 三个阶段:

  1. 顺序扫描 — 按发现顺序加载 skill,写入 meta.json,顺序稳定
  2. 并发执行 — 扁平化所有 (skill, evalCase) 任务,投入 worker pool
  3. 汇总 — 聚合 pass/fail 统计,生成 benchmark + HTML 报告

三、核心评估流程

同一条 prompt │ ┌─────────────┴─────────────┐ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ with_skill │ │ without_skill │ │ SKILL.md 注入│ │ 基线,无 │ │ system msg │ │ skill 信息 │ └──────┬───────┘ └──────┬───────┘ │ │ ▼ ▼ target model target model │ │ ▼ ▼ output output │ │ └──────────┬───────────────┘ ▼ ┌─────────────────┐ │ judge model │ 对两边分别评分 │ (assertions) │ └────────┬────────┘ ▼ pass / fail 各一边 delta 告诉你 skill 净提升

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 要求:

如果 evals.json 没写 assertions 但写了 expected_output,框架自动推导一条断言:

"The output satisfies this expected output: ..."

五、基准统计

benchmark.json 核心计算 delta(with_skill − without_skill):

With Skill 通过率
78.5%
→
Without Skill 通过率
52.3%
→
Delta
+26.2pp

还统计时长和 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"
💡 Provider 抽象
内置 OpenAICompatibleProvider,支持 OpenAI、Together、Groq、Anthropic(通过兼容层)、本地 Llama。 你也可以实现 Provider 接口对接自己的后端——5 个字段、1 个方法。

生态上下文

来源内容
agentskills.io官方 eval 标准:evals/evals.json 格式、workspace 结构规范
OpenAI 博客Codex skills 的 sysetmatic eval 实操指南(2026.01)
AnthropicAgent 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 断言等话题

发布渠道

npm
agent-skills-eval
GitHub
darkrishabh/agent-skills-eval
文档
darkrishabh.github.io

同类对比:SkillTester.ai

在 Agent Skills 评估领域,除了 agent-skills-eval,另一个值得关注的项目是 SkillTester.ai—— 由北京大学团队(Leye Wang、Zixing Wang、Anjie Xu)开发, 2026年3月发布并有 arXiv 论文的基准测试系统。

一句话:SkillTester 侧重 Utility(效用)+ Security(安全)双维度评分, 附有公开的 Dashboard 网站,可以检索哪些 skill 已经被测试过。

三阶段 Pipeline

SOURCE_DIR (目标 skill) │ ▼ ┌──────────────────┐ │ SampleAgent │ 读取 skill,生成测试任务 │ │ 12 个 functional tasks + 9 个 security probes └────────┬─────────┘ │ ▼ ┌──────────────────┐ │ ExecAgent │ 分两次运行: │ │ baseline/ → 不用 skill │ │ withskill/ → 使用 skill │ │ 产出原始证据(输出、日志、token、耗时) └────────┬─────────┘ │ ▼ ┌──────────────────┐ │ SpecAgent │ 审查结果 + 安全探测 + 代码评分 │ │ 产出 Template.json + benchmark_report.md └────────┬─────────┘ │ ▼ Utility 分数 + Security 分数 + 三级安全状态标签

Benchmark Spec 的严格性

SkillTester 的 Benchmark Spec 比 agent-skills-eval 更形式化:

本身就做成了一个 Skill

SkillTester 把自己也发布成一个 agent skill,安装后 agent 可以在安装第三方 skill 前自动查询:

npx skills add https://skilltester.ai --skill skilltester

两种触发方式:

已有测试结果则返回 benchmark 摘要;否则提示"未测试,稍后再试"。 相当于给 skill 装了个安全扫描器。

Dashboard 网站

skilltester.ai 是一个公开的 SPA Dashboard:

全面对比

维度agent-skills-evalSkillTester
出身 个人项目(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 + 安全双维度
🎯 两者互补
agent-skills-eval 适合日常开发迭代——写 skill 时快速跑一下看效果, CI 集成友好;SkillTester 适合社区级的安全审核和可信度评估—— 安装别人 skill 前先查一下有没有被测过。一个问"我的 skill 有效吗?",一个问"这个 skill 安全吗?"。

同类对比:SkillScore

SkillScore 是由 joeynyc 开发的 CLI 工具(TypeScript,MIT 协议), 定位完全不同——它不做运行时测试、不调用任何 LLM,而是纯静态分析 SKILL.md 的内容质量。

一句话:SkillScore ≈ ESLint for SKILL.md。不需要 API Key,不跑模型, 纯靠规则引擎给 skill 打分(A+ ~ F),适合做提交前的质量门禁。

安装 & 使用

# 全局安装
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 工具格式、时效性信息

等级标准

A+ ~ A-
90-100%
B+ ~ B-
80-89%
C+ ~ C-
70-79%
D+ ~ F
0-69%

技术原理

纯静态分析——不需要网络、不需要 LLM 调用。核心是 TypeScript 规则引擎:

const parser = new SkillParser();   // 解析 SKILL.md → ParsedSkill
const scorer = new SkillScorer();   // 7 维度评分 → SkillScore
const reporter = new TerminalReporter(); // 终端 / JSON / Markdown 输出

所有规则都是确定性的:

全景对比

维度agent-skills-evalSkillTesterSkillScore
本质 运行时对比测试 基准 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 准入
🔗 三剑客互补
SkillScore → 写的质量如何(静态 Linter)
agent-skills-eval → 实际表现如何(运行时 A/B 测试)
SkillTester → 安全性和通用基准如何(社区审核)

理想流水线:SkillScore 预处理门禁 → agent-skills-eval 迭代验证 → SkillTester 发布审计。

Tony's Lab · 2026