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

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

Saturday, September 12, 2026Omid Saffari
Claude Code 插件评测实战:用原生 Evals 验证行为变化

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

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

Claude Code 插件评测究竟测什么

插件 eval 本质上是一次针对 Agent 行为的 A/B 测试。可以把它想成两个完全相同的工作间,同时收到同一张任务单:其中一个装有你的插件,另一个没有。Claude Code 会在两边重复执行任务、给结果打分,并报告 WITHW/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 中,runsmax_turnstimeout_secondsmodeltagsallowed_tools 等字段都放在顶层。如果需要 fixture、对话历史或目录,则添加 case.yaml;这个文件必须包含 schema_version: "1.1"name,并把执行字段移到 execution: 下。

运行测试并读懂报告

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

建议按以下顺序阅读:

  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可比较的结果、可归档的产物,以及针对估算支出的停止规则

单次运行的循环天生噪声较大。可以用它发现明显错误,但在接受变更前,仍应按默认值运行三次进行确认。频繁检查时优先使用 regextool_usedtool_orderfile_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.jsonreport.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_turnstimeout_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 .,并在摘要与报告中比较 WITHW/OUTΔ

Claude Code evals 是什么?

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

Claude Code skill evals 如何工作?

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

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

最近更新
2026年9月12日
分类
Build

在 Google 中优先显示本站

将 omidsaffari.com 添加为 Google 搜索的优先来源

把 omidsaffari.com 设为优先来源,Google 会在 Top Stories、AI Overviews 和 AI Mode 中为您优先展示。

Cloudflare 语音代理延迟排查:用 turnmetrics 找到真正卡点

Cloudflare 语音代理延迟排查:用 turnmetrics 找到真正卡点

Cloudflare 的 turnmetrics 能把每轮语音与文本交互拆成可定位的阶段,并标记 completed、no_output 等结果。本文详解如何读取重叠 timing、设计受控测试,并判断延迟来自转写、模型、TTS 还是浏览器播放,避免凭感觉更换供应商或购买超出需求的语音 QA 工具。2026年9月12日Build
SRT字幕烧录实战:用 Rendi 自动生成带字幕 MP4

SRT字幕烧录实战:用 Rendi 自动生成带字幕 MP4

用 Rendi 把审核通过的 SRT字幕永久烧录进 MP4。本文从 FFmpeg API 提交、字幕样式和异步任务状态讲到输出验收与字节计费,解释硬字幕与可选字幕轨该怎么选,并给出可直接运行的 Node.js 示例、轮询与 webhook 做法,以及批量处理前的必做检查,适合把字幕渲染接入自动化流程的内容团队与机构。2026年9月11日Build
OpenAI Agent SDK 与 Agents API 怎么选:控制权、成本与迁移

OpenAI Agent SDK 与 Agents API 怎么选:控制权、成本与迁移

OpenAI Agent SDK 和托管式 Agents API 到底该选哪个?本文从会话归属、运行时控制、沙箱成本、数据驻留、故障恢复与迁移工作量逐项比较,并用统一的成本模型拆解两条路线。你将看清精简平台团队、受监管企业和已有成熟基础设施的开发者分别适合哪一种方案,以及什么时候不该迁移。2026年9月11日Build
Rendi 定价详解(2026):先算处理字节,再选套餐

Rendi 定价详解(2026):先算处理字节,再选套餐

全面拆解 Rendi 定价:Free 与 $25 起的 Pro 套餐如何按输入加输出字节计费,存储、命令时长和 vCPU 又怎样限制选档;并用同一工作负载对比 Very Good FFmpeg 与 RenderIO,帮你找出自动化视频管线真正需要的最低套餐,避免只看视频时长或标价而多花钱。2026年9月11日Build
Codex CLI 工作树实战:隔离并行开发,安全带回成果

Codex CLI 工作树实战:隔离并行开发,安全带回成果

Codex CLI 0.154.0 新增实验性工作树能力,可从已提交的 HEAD 创建独立检出并绑定会话。本文详解 --worktree 与 /worktree 的配置、隔离边界、审查和恢复流程,以及如何测试、提交、cherry-pick 并清理工作树,让依赖升级、缺陷修复和重构任务在不干扰主工作区的情况下并行推进。2026年9月10日Build
Claude Code 推理强度上限:团队策略与实测方法

Claude Code 推理强度上限:团队策略与实测方法

Claude Code 2.1.267 新增 maxEffortLevel,可在用户、项目或托管设置中为推理强度设定硬上限。本文讲清最低上限优先规则、按模型例外与验证方法,并用同一任务对照质量、token 消耗和成本,帮助平台团队稳妥落地可执行的 effort 策略,避免配置看似生效却被更低作用域覆盖。2026年9月10日Build
agent-browser 浏览器录屏:FPS 怎么选,证据才有用

agent-browser 浏览器录屏:FPS 怎么选,证据才有用

agent-browser v0.37.0 浏览器录屏支持可调 FPS:常规流程用 30 fps,细微动态用 60 fps,长时运行用 1 到 15 fps。本文讲清 ffmpeg 检查、录制命令、帧计数差异、CI 证据留存与成本边界,帮助团队生成可复核的视频证据,同时保留断言、日志和截图。2026年9月8日Build
UltaHost VPS 续费价格全解析:月付 $6.89 起,长期套餐值不值?

UltaHost VPS 续费价格全解析:月付 $6.89 起,长期套餐值不值?

UltaHost VPS 续费价格从月付 $6.89 起,长期套餐月均更低却可能无法退款,Plesk 与 cPanel 还会增加月费。本文拆解各套餐现金成本、2026 年 8 月调价、管理服务边界,并对比 Hostinger 与 DigitalOcean,帮你判断月付还是预付更划算。2026年9月7日Build
订阅通讯

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

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