Claude Code 插件评测实战:用原生 Evals 验证行为变化

Claude Code 2.1.269 已原生支持插件评测。本文从创建行为用例、配置确定性 grader、读取 WITH/W/OUT/Δ 报告,到故意制造回归、控制成本并接入 CI,完整演示如何证明插件确实改变了 Claude 的行为,而不只是通过文件校验,并给出最值得优先测试的场景和两类产品机会。

发布于

Claude Code 插件评测实战:用原生 Evals 验证行为变化

现在,你可以通过 Claude Code 插件评测证明某个插件确实改变了 Claude Code 中 Claude 的行为,而不只是验证文件是否合规。原生 claude plugin eval 命令会让启用插件和未启用插件的两组会话处理同一个真实请求,分别评分并展示差异。这样一来,“这个 skill 好像触发了”不再是模糊的主观判断,而会变成一项有时间、轮次和用量预算依据的发布决策。

现在正是采用它的好时机。Claude Code 2.1.269 于 2026 年 9 月 11 日加入了插件 evals。目前,这个搜索主题下排在前列、带日期的教程仍在介绍自建 Python runner。如果你正在维护本地插件,最短路径已经变成原生流程:先初始化一个行为用例,分别对插件组和对照组运行,检查报告,再让 CI 拒绝你刚刚故意制造出的同类回归。

Claude Code 插件评测究竟测什么

插件 eval 本质上是一次针对 Agent 行为的 A/B 测试。可以把它想成两个完全相同的工作间,同时收到同一张任务单:其中一个装有你的插件,另一个没有。Claude Code 会在两边重复执行任务、给结果打分,并报告 WITH、W/OUT 和 Δ;其中 Δ 等于启用插件后的得分减去未启用插件时的得分。

真正值得关注的是这个差值。两组都拿到 1.0 看似很理想,但这也说明,即使没有插件,Claude 本来就能完成任务。正 delta 代表插件带来了可测量的贡献;负 delta 则说明,插件反而让被测行为变差了。

默认情况下,一个用例会分别新建三次启用插件的会话和三次未启用插件的会话。每次会话都有相互隔离的 home、工作目录和 Claude Code 配置。你的个人设置、项目 CLAUDE.md、其他插件、memory 以及个人 MCP server 都不会被带入。隔离让比较更干净,也意味着暗中依赖你本机环境的插件会以合理的方式失败。Anthropic 的插件 eval 文档完整说明了隔离与安全约束。

架构信息图:同一个 prompt 分流到三次启用插件的运行和三次未启用插件的运行,最后汇总为 delta 报告
一个用例拆成两条相互匹配的测试分支,delta 用来单独衡量插件带来的贡献。

先准备一个可正常运行的本地插件

行为 eval 是第二道检查,不是第一道。插件目录中必须有 plugin.json、.claude-plugin/plugin.json,或符合要求的 skills 目录结构。文件或 schema 有问题时,使用 claude plugin validate;要回答“这个 skill 能否在自然请求下触发,并按团队格式输出”之类的问题,则使用 claude plugin eval。

你还需要 Claude Code v2.1.269 或更高版本,以及日常会话所使用的同一套身份验证。Eval 会话、judge grader 和交互式初始化器都会消耗套餐额度或产生 API 费用。如果整套 Claude Code 环境还在搭建阶段,建议先从基础本地工作流开始,再添加发布门禁。

在可信插件的根目录中,先检查版本并创建一个空白用例:

Bash
claude --version
claude plugin eval init --bare release-note

也可以使用交互式命令 claude plugin eval init。它会读取插件,询问什么样的结果才算合格,生成用例和 grader,试跑一次,然后写入整套测试。若想先弄清文件约定,--bare 更合适,因为它只创建文件,不执行任何测试。

从一个容易看懂的行为用例开始

假设这个可用插件里有一个名为 release-notes 的 skill。它的价值不只是写出一段文案,还应该能识别自然语言描述的产品变更请求,并按团队规定的三段式结构输出:Summary、Impact 和 Risk。

把用户的真实请求写进 prompt.md,然后分别为结果和执行机制添加一个确定性 grader。所谓“确定性”,是指 CLI 直接检查 trace 或文本,不会调用 judge 模型。

Text
# evals/release-note/prompt.md
---
name: release-note
tags: [smoke]
runs: 3
max_turns: 8
timeout_seconds: 180
allowed_tools: [Skill]
---

Turn this change into a customer-facing release note: checkout now retries a failed payment once before showing an error.

# evals/release-note/graders/format.md
---
type: regex
target: last_message
pattern: 'Summary[\s\S]*Impact[\s\S]*Risk'
flags: i
---

# evals/release-note/graders/skill-fired.md
---
type: tool_used
tool: Skill
input_match: '"skill"\s*:\s*"(?:[\w-]+:)?release-notes"'
---

请把 release-notes 替换为该 skill 的 SKILL.md 中实际填写的 name。这里的 prompt 有意不点名 skill,也不直接要求三个标题;这样才能检验插件是否会识别任务并主动贡献规定格式。如果 prompt 已经把所有答案都写明,未启用插件的对照组也可能通过,此时 delta 只会告诉你插件的增益很小。

这段 frontmatter 就是当前的原生 schema。在 prompt.md 中,runs、max_turns、timeout_seconds、model、tags 和 allowed_tools 等字段都放在顶层。如果需要 fixture、对话历史或目录,则添加 case.yaml;这个文件必须包含 schema_version: "1.1" 和 name,并把执行字段移到 execution: 下。

运行测试并读懂报告

在插件根目录运行 claude plugin eval .。对于这个单一用例,命令会启动三次启用插件的会话,以及三次 baseline 会话。每次会话结束后,进度行都会显示 grader 结果;最后的摘要会给出 WITH、W/OUT、Δ、RUNS、COST 和 NOTES。

建议按以下顺序阅读:

  1. WITH:启用插件的会话是否满足 grader。
  2. W/OUT:Claude 在没有插件时,有多大概率也能达到同一结果。
  3. Δ:插件贡献了多少。正值有意义,接近零就要继续排查,负值代表回归。
  4. COST:按标价计算的估算值,不一定等于订阅方案下实际收取的金额。
  5. NOTES:指向启用插件分支里权重最高的失败项或运行错误。

只要 suite 至少包含一个用例,就会在带时间戳的结果目录中写出 aggregate-result.json 和一份可独立打开的 report.html。HTML 报告可以逐次查看运行记录、每个 grader 的判定和解释,还能对照 prompt、grader 定义与 Claude 的实际执行。JSON 则提供适合 CI 稳定读取的字段,包括总分、通过的用例数、平均 delta、partial 状态、成本估算、耗时和 Claude Code 版本。

先制造一次回归,再相信这套测试

现在要证明这套测试真的会失败。暂时把 release-notes skill 的描述改成一段模糊文字,不再说明它应该识别的任务。不要修改 eval 用例。重新运行同一条命令,检查新报告,然后恢复原本的描述。

你要观察的是行为层面的失败:Skill grader 不再通过,预期格式变得不稳定,或者启用插件后的优势缩小。不要预设具体分数,因为 Agent 每次运行都会波动。如果在默认的三次运行中,故意破坏后的报告几乎毫无变化,说明这个用例还保护不了插件。可以把请求改得更贴近真实场景、收紧结果 grader,或者补一个不得触发该 skill 的负向用例。

这种故意破坏就像按下烟雾报警器的测试键。只有确认相关故障确实能让面板转红,持续显示绿色才有意义。

增加用例前,先算清循环预算

一个默认用例已经会创建六次 Agent 会话。再加一个 LLM grader,同一用例还会新增十八次 judge 投票,也就是六次会话各投三票。会话本身又可能持续多个轮次,因此,一套看似很小的 suite,实际用量也可能远高于用例数量给人的直觉。

可以用三档预算分别服务三类决策:

阶段命令形式这笔预算买到什么
快速本地循环--case release-note --runs 1 --ablation none --no-publish只运行一次启用插件的会话,不跑 baseline,编辑用例时快速获得信号
确认两个分支都按默认值各运行三次六次会话,以及一个更值得认真参考的 delta
CI 门禁固定 Agent 与 judge 模型,使用 --json、threshold、--no-publish 和 --max-cost-usd可比较的结果、可归档的产物,以及针对估算支出的停止规则

单次运行的循环天生噪声较大。可以用它发现明显错误,但在接受变更前,仍应按默认值运行三次进行确认。频繁检查时优先使用 regex、tool_used、tool_order 和 file_exists,因为这些 grader 不会增加 judge 调用。只有在质量无法用稳定规则表达时,才值得为简短结果使用 LLM grader。

成本参数还需要特别说明。--max-cost-usd 会在每次运行开始前,按 CLI 的标价估算值限制支出。已经开始的运行仍会完成,因此最终报告的估算值可能超过上限。触及上限会留下 partial 结果,并以退出码 2 结束。它是一道护栏,不是预付钱包。

架构预算信息图:一次运行的快速循环、三加三的 baseline 确认,以及 20 美元的 CI 上限
分层购买可信度:一次运行用于编辑,三加三用于确认,最后在 CI 中设置清晰可见的上限。

把回归检查交给 CI

确认故意制造的回归能被发现、恢复后的插件可以通过后,就把同一套 suite 纳入版本控制。Anthropic 的 CI 示例会固定 Agent 与 judge 模型,把结果写入 results.json,使用 0.8 的 threshold,把报告留在本地,并设置 $20 的估算成本上限。示例还传入了 --trust-plugin;只有当检出的插件和 suite 都是你本来就愿意运行的代码时,这样做才合适。

完整的交接命令是 claude plugin eval . --trust-plugin --json results.json --threshold 0.8 --model claude-sonnet-5 --judge-model claude-haiku-4-5 --no-publish --max-cost-usd 20。安装 Claude Code 并完成身份验证后,把这条命令放进 CI job,再归档两个结果文件。

命令的退出状态足以充当构建门禁。退出码 0 表示所有用例都已加载并达到 threshold;退出码 1 既可能代表得分低于 threshold,也涵盖若干设置错误;退出码 2 则表示成本上限造成了 partial 运行,或首次凭证校验被拒绝。即使失败,也要归档 results.json 和 report.html,这样作者才能分清是插件回归、运行超时,还是预算中止。

固定模型很重要,否则一次模型更新也可能看起来像插件回归。推理支出同样要分开管理:应当把测试质量和 effort 拆成两条轨道,避免成本变化混进行为得分。

架构 CI 信息图:把 eval JSON 报告分流到通过、失败和 partial 三条退出通道
CI 不应只保留红绿状态,还要保留原因:通过、回归和预算导致的 partial 中止是三种不同结果。

最值得优先测试的七类插件行为

收益最高的是那些向其他人分发插件的团队。私人助手尚可容忍手动检查;但对于 marketplace 或组织级插件,一条薄弱的描述、一次错误的工具授权或一项输出变化,都会持续转化为支持成本。

排名适用团队精确的行为测试为什么值得做
1marketplace 插件维护者同时使用本应触发 skill 的自然请求,以及相近但不应触发的请求在所有用户受到影响前,同时发现 skill 不可见和过度触发这两类问题
2代码审查插件团队检查输出是否包含规定的审查部分,并验证 review skill 确实触发在允许措辞变化的同时保护产品约定
3发布工程团队固定当前模型,修改插件,再比较相同用例及 delta区分插件回归与模型变化,减少主观的发布争论
4安全插件作者添加一个负向用例,禁止 skill 在无害的维护请求上触发避免成本高昂或干扰性强的扫描因错误任务而启动
5基于 MCP 的工作流插件用 suite mock 替代外部工具响应,并检查由此产生的工具调用路径无需每次接触线上服务,也能覆盖失败和边界场景
6文档生成插件负责人检查预期文件是否存在,再用 regex 验证稳定内容发现被友好最终回复掩盖的静默输出约定破坏
7维护多个内部插件的平台团队每次变更都运行带 tag 的小型 smoke 集,发布前再跑更深的用例把日常预算集中在最可能阻塞同事的行为上

先从两项“一旦消失,用户最容易察觉”的行为开始。十个模糊用例,不如一个能复现缺陷的触发测试加一个结果测试。

围绕原生插件 eval,最值得做的两类产品

1. 最有机会的是拉取请求 delta 门禁

可以做一款轻量 CI 产品:运行原生命令,读取 aggregate-result.json,然后在拉取请求中发布一条 review,集中展示得分变化、delta、成本、失败的 grader,以及已归档报告的链接。插件团队和 marketplace 维护者愿意付费的是决策层,而不是又一套 evaluator。

这个需求仍处于早期,但商业信号很明确。claude code evals 在美国每月约有 50 次搜索,同比上涨 600%,CPC 为 $17.61。更广义的评估平台也证明了市场确实存在质量预算:Braintrust 的 Pro 方案定价为每月 $249。这是品类价格锚点,并不等于插件封装层的定价建议。

最小可售版本可以是一项 GitHub Action 加一条拉取请求评论。它接收插件路径、threshold、固定模型和估算成本上限,上传原生 JSON 与 HTML,并区分退出码 1 和代表 partial 的退出码 2。需要警惕的是平台风险:Anthropic 完全可能加入第一方拉取请求报告。真正具备防御力的部分,是跨仓库策略、历史对比和审批规则,而不是给原生报告换一层更漂亮的界面。

2. 精选 eval 套件可以服务 skill 作者

还可以为代码审查、changelog 编写、事故分诊和安全工具选择等常见插件任务,销售持续维护的用例包。一个 pack 就是普通的 evals/ 目录,其中包含真实的正向与负向 prompt,以及确定性 grader;团队可以基于它调整,而不必从零发明质量标准。

精准关键词 claude code skill evals 在美国每月约有 10 次搜索。这个量很小,因此它更适合做专注的附加产品,而非独立的风险投资型市场。MVP 应该只针对一个高价值插件品类,提供一套出色的 pack:随 Claude Code 版本维护,并附上一份简短的校准指南。挑战同样清楚:claude plugin eval init 已经能提出并试跑用例。只有当 pack 的领域场景和失败标准优于通用生成时,它才有胜算。

这条命令解决不了什么

原生 eval 无法证明一个插件在所有情况下都足够好。它只能证明:在你选定的 prompt、环境、模型、工具授权和 grader 条件下,插件表现如何。薄弱的 prompt 会制造讨喜的高分;regex 可能奖励正确的标题,却忽略错误的内容;LLM judge 本身会波动,而且每个 grader、每次运行都要增加三次投票。

隔离也是一项必须正视的约束。每次运行都会从干净环境开始,因此项目文件、用户设置、hook 和个人 server 都不存在。这非常利于复现,却会让忘记声明 fixture 的用例无法运行。只读工具集之外的工具,需要通过命令行显式授权。真实的插件 MCP server 还要额外 opt-in 和授权;hook 与真实 server 可能在 Agent sandbox 之外执行,因此更适合放在隔离 runner 中。

最后,不要把 max_turns 或 timeout_seconds 压缩到正常任务也会撞上上限。运行一旦超时或达到轮次限制,就会被记作错误,通常还会拉低分数。先为目标任务留出足够空间,再用估算成本上限控制整套 suite。

如何用 evals 测试 Claude Code 插件?

在 Claude Code v2.1.269 或更高版本中,进入一个可正常运行的插件根目录,执行 claude plugin eval init 生成 suite,或用 claude plugin eval init --bare <name> 创建空白用例。把真实 prompt 和 grader 放到 evals/ 下,再运行 claude plugin eval .,并在摘要与报告中比较 WITH、W/OUT 和 Δ。

Claude Code evals 是什么?

它们是一组重复执行、相互隔离的 Claude Code 会话,结果由确定性 grader 或模型 judge 评分。插件 eval 默认还会加入未启用插件的对照组,因此,你衡量的是插件是否改善了结果,而不只是 Claude 最终有没有完成任务。

Claude Code skill evals 如何工作?

先用用户日常会说的话写 prompt,再同时检查结果,以及 Skill 工具是否调用了目标 skill。如果 skill 触发但结果失败,说明它的指令需要改进;如果没有插件也能取得同样结果,这个 skill 在该用例中的可测量增益可能很小。

下周一,一位插件维护者可以先添加一个触发用例,故意让它失败,再恢复插件,并在 CI 中为这项检查设置上限。如果你希望在团队的所有插件中搭建这套发布体系,我可以帮你设计生产级门禁。

发布日期
分类
Build
Gumloop 评测:AI 工作流、价格与人工审批怎么选

Gumloop 评测:AI 工作流、价格与人工审批怎么选

Gumloop 适合哪些 AI 自动化场景?本文解读销售线索调研、网页抓取、文档与邮件处理,给出 Google Sheets、Slack 和 Gmail 配置方案,说明人工审批、触发遗漏与任务恢复的边界,按公开费率核算积分和 BYOK 成本,对比 n8n、Zapier 与定制软件的维护责任,帮助负责人判断是否值得采用。2026年10月22日Build
合成数据(synthetic data)生成:从大模型训练到软件测试

合成数据(synthetic data)生成:从大模型训练到软件测试

合成数据怎么生成,才能真正用于大模型评测、微调和软件测试?本文以客服工单分类为例,讲清种子样例、来源隔离、覆盖设计、筛选、去重与人工审核,并比较批处理 API、Distilabel、Faker 和 SDV 的用途,梳理输出训练条款与隐私检查,帮助你判断生成的数据是否有用,而不只看样例数量。2026年10月22日Build
DPO 与 RLHF 详解:人类反馈如何训练模型,小公司该怎么选

DPO 与 RLHF 详解:人类反馈如何训练模型,小公司该怎么选

RLHF 如何把人类偏好变成模型行为?DPO、AI 反馈和可验证奖励又各自改变了什么?本文用客服退款案例讲清训练机制、偏好数据与评估方法,并梳理 Together AI、Fireworks AI 和 OpenAI 的托管微调路径、使用资格与服务期限,帮助小公司判断何时该用检索、SFT 或偏好训练,以及怎样验证改进。2026年10月22日Build
大模型路由怎么做:选型、成本核算与效果评测

大模型路由怎么做:选型、成本核算与效果评测

大模型路由如何降低成本,又守住回答质量?本文以客服工单为例,说明规则路由、自动路由与训练型路由器的区别,对比 OpenRouter、LiteLLM、Vercel AI Gateway 和 Microsoft Foundry,并给出包含重试开销的成本公式、独立留出集评测方法及逐步上线流程,帮助你判断何时值得采用。2026年10月21日Build
语义缓存怎么用:大模型回答何时可以复用?

语义缓存怎么用:大模型回答何时可以复用?

语义缓存能减少大模型的重复调用,但相似问题并不一定能共用答案。本文拆解向量生成、近邻检索、阈值检查与答案返回的完整流程,用耳机退货示例说明错误命中的风险,并对比精确缓存、提示词缓存及 Kong、Redis、GPTCache 的实现方式,讲清用户隔离、有效期、版本失效和成本核算,帮助你判断何时值得复用回答。2026年10月21日Build
Pydantic AI vs LangChain:Python 智能体框架怎么选?

Pydantic AI vs LangChain:Python 智能体框架怎么选?

Pydantic AI vs LangChain 怎么选?用同一套客服工单分流代码,对比结构化输出、工具调用、系统集成与可恢复工作流,梳理 Logfire 和 LangSmith 的追踪、评估与人工审核方式,说明切换框架时应保留哪些代码、如何处理持久化状态,以及什么情况下根本不需要智能体框架。2026年10月21日Build
Zed vs Cursor 2026:编辑体验、团队协作与 Cursor 价格对比

Zed vs Cursor 2026:编辑体验、团队协作与 Cursor 价格对比

Zed 和 Cursor 怎么选?从编辑手感、跨文件修改、云端 Agent、模型选择到实时结对,逐项比较两款编辑器。拆解 Cursor 价格与 Zed 的个人、五人团队月费,说明如何在 Zed 中保留 Cursor Agent,以及 MCP、历史记录和迁移兼容性有哪些限制,帮助你先完成一次真实项目修改,再决定是否迁移。2026年10月21日Build
LLM inference 详解:大模型推理流程、延迟优化与部署选型

LLM inference 详解:大模型推理流程、延迟优化与部署选型

大模型响应慢,究竟慢在读取提示词,还是生成回答?本文拆解 LLM inference 的预填充与解码阶段,用公开 API 示例说明首 token 延迟、生成速度和总耗时的区别,梳理 KV 缓存、批处理、量化与推测解码的适用边界,帮助你判断何时继续使用托管 API,何时评估推理服务商或自建 GPU。2026年10月21日Build
订阅通讯

每周日,一封信。写运转中的系统,不写热评。

每周一期。无垃圾邮件。随时退订。