comet eval 开箱即用就能评测内置任务和任意本地 Skill——评估自己的 Skill 只需要 comet eval ./your-skill --html 一条命令(见快速上手)。但当你想评测自己的 Skill 在自己的场景下表现如何时,就需要自定义 task 了。这篇文章手把手带你走完一遍:从定义一个 task,到配置评估 profile,再到跑出报告。
本文是进阶自定义内容。如果你只是想评估一个已有的 Skill,不需要读本文——直接用
comet eval ./your-skill —html 即可。本文假设你已经能跑通
comet eval ./your-skill —collect。本页怎么读
自定义 eval 可以分三层理解。大多数场景先完成 Task,再按需要调整 Profile 或 Treatment。
如果只想给本地 Skill 增加稳定验收条件,优先在 Skill 包的
comet/eval.yaml 中声明 inline task,或用 source 引用 Skill 包内的任务;先跑 --collect,再跑 --html。只有需要扩展 Comet 仓库内置 harness 时,才需要创建 task 目录并注册到 index.yaml。Profile、Treatment 和 auto_user 都可以在第一版 task 跑通后再调整。
eval 配置的全景
一个完整的 eval 由三部分拼起来,理解它们的分工是自定义的基础:
Task 决定测什么,Treatment 决定注入什么,Profile 和 Rubric 决定怎么打分
下面分别讲清楚。
定义一个 Task
每个 task 是local/tasks/ 下的一个目录,包含四个文件:
local/tasks/my-task/
task.toml
instruction.md
environment/
Dockerfile
validation/
test_my_task.py
Task 目录约定来自 eval harness(
eval/),不是你的业务仓库。扩展
Comet 仓库内置 harness 时,自定义 task 放在 eval/local/tasks/
下并注册到 eval/local/tasks/index.yaml;普通 Skill
不需要复制这套目录结构,可以使用 inline task 或 package-local task。1. 编写 task.toml
task.toml 是 task 的核心配置,分四块:
[evaluation] 的关键字段
这几个字段直接决定打分结果,值得单独说明:
2. 编写 instruction.md
这是给 agent 的任务指令,支持 {run_id} 等模板变量:
3. 编写验证脚本
验证脚本在 Docker 内运行,结果写入_test_results.json。这是”这次运行到底做对没”的判定来源:
failed 列表为空。pass@k 和 pass^k 都基于这个判定。
4. 编写 Dockerfile
Dockerfile 提供验证所需的运行时和依赖。一个最小例子:5. 注册 task
最后在local/tasks/index.yaml 里登记:
--task my-task 跑它了。
配置 Treatment
Treatment 回答”这次跑注入哪些 Skill”。位于local/treatments/:
选择 Profile
Profile 决定用哪套 rubric 打分。选错了 profile,维度分就没有参考价值:Profile 解析优先级:
—profile 覆盖 > manifest 的
skill.profile > task 的 evaluation.profile >
generic。Comet 类任务(category = “comet”
)会自动推断为 comet-workflow。配置 LLM-as-judge
LLM-as-judge 是可选的质量覆盖层。它不会替代规则型[RUBRIC] 分,也不会直接改变 weighted_score。它会让一个独立的裁判模型读取本次运行产物,追加 [RUBRIC-JUDGE] 分数,帮助你判断规则分没有覆盖到的”产物是否有实质内容”。
适合在这些场景启用:
- 你要评估文档、方案、代码解释、设计稿等难以用脚本完全判断的产物。
- 你已经有基础校验脚本,但想知道产物是不是只有空壳或模板化内容。
- 你要在对比报告里查看规则分和 judge 分之间的差异。
judge 配置和被测 Agent 配置是隔离的。被测 Agent 可以继续使用
ANTHROPIC_MODEL、ANTHROPIC_BASE_URL 和自己的
token;judge 必须显式配置 BENCH_JUDGE_MODEL
,避免同一个配置同时扮演”选手”和”裁判”。1. 在 eval/.env 启用 judge
把 judge 变量写进 Comet 仓库的 eval/.env:
BENCH_LLM_JUDGE=1 是开关;BENCH_JUDGE_MODEL 是必填项。只打开开关但不设置模型时,报告会写入 skipped 状态:
2. 选择 judge 的认证方式
如果你的本机claude CLI 已经能在宿主机上认证,可以只设置 BENCH_JUDGE_MODEL。harness 会在宿主机上调用 claude CLI 运行 judge。
如果你想让 judge 使用独立的 Anthropic 兼容代理,配置专用 endpoint 和 token:
如果同时设置
BENCH_JUDGE_AUTH_TOKEN 和 BENCH_JUDGE_API_KEY,auth token
优先。judge 子进程会清除继承来的主 ANTHROPIC_* provider 变量,再映射
BENCH_JUDGE_*,所以不要指望它自动复用被测 Agent 的 provider 配置。3. 给 generic task 添加自定义 judge 标准
通用 Skill(generic / authoring-skill)默认会让 judge 输出三个维度:
如果你的 task 还有特定质量标准,把它们写进
task.toml 的 [evaluation]:
custom_0、custom_1。它们只影响 [RUBRIC-JUDGE] 覆盖层,不替代你的验证脚本。
comet-workflow profile 使用另一套 judge 维度:artifact_quality、spec_drift、main_flow。它们用于复核工作流产物深度、spec 是否漂移、五阶段主流程是否完整。
4. 运行并确认 judge 生效
先用--collect 确认 task、manifest 和路径都能发现:
Report path 指向的报告,在每次运行的 checks 里查找 [RUBRIC-JUDGE] 行。成功时会看到类似:
多轮交互:auto_user 模式
单轮 task(mode: none)只跑一次,适合”给个指令看结果”的简单场景。但工作流类 Skill 需要在决策点暂停、问用户、拿到回复后继续——单轮测不了。
auto_user 模式解决这个问题:它用两个 Agent 自动交互——一个跑被测 Skill(subject),另一个模拟用户在决策点回复(simulator)。
模拟器的行为由提示词文件控制。默认读 eval/simulator-instruction.md,你可以用 BENCH_SIMULATOR_PROMPT_FILE 指向自己的版本,模拟”更挑剔的用户”或”会要求澄清的用户”:
max_turns 控制循环上限(comet-workflow 通常 12 次外层往返,authoring-skill 通常 8 次外层往返)。它不是被测 Agent 内部消息数或工具调用数;一次外层往返指被测 Agent 到达决策点、用户模拟器回复、被测 Agent 用 --resume 继续。命中”完成”信号(如 archive complete)会提前结束。
一次完整的自定义评估
把上面几步串起来,从零评测自己的 Skill:pass@1和pass^k:能力上限 vs 可靠性下限。详见评分指标。- rubric 各维度分:哪个维度拖了后腿?
- 失败归因(
harness/workflow/task/model):失败是 Skill 的问题,还是 task/环境的问题?
评测 /comet-any 生成的包
/comet-any 生成的 Skill 包自带 comet/eval.yaml manifest,不需要你手写 task.toml。直接用 manifest 跑:
authoring-skill profile、注入推荐任务和质量门禁。manifest 的完整格式见评估系统概览。
下一步
- 评分指标与双 Agent 评测 — 三套 rubric 的维度、权重和 pass@k/pass^k
- 评估系统概览 — manifest 格式、profile 体系和 task 系统
- comet eval 命令 — 命令行参数完整参考

