Skip to main content
这是进阶内容。日常评估只需要快速上手里的一条命令。这里讲的是 harness 内部机制,适合排查问题或理解 profile/task 选择。
本页是 Eval 源码/维护者进阶内容。普通用户不需要 clone Comet 源码、进入 eval/ 目录或手工 运行 pytest;直接使用已安装的 comet eval 和用户级 %USERPROFILE%\\.comet\\eval\\.env / ~/.comet/eval/.env 即可。只有修改内置 harness、使用 --project 或复现底层任务时,才需要拉取源码。
Comet 的 eval harness 随 npm 包按版本分发。普通安装直接运行 comet eval 时,CLI 默认使用当前 @rpamis/comet 包中的 eval/;在 Comet 源码仓库开发或需要自定义 harness 时,可以用 --project <repository-root> 显式选择该仓库的 eval/comet eval 封装了启动路径、任务发现、profile、report config 和 quick smoke,让你不需要手工切目录或拼 pytest 参数。

harness 定位与故障边界

CLI 会先确认 eval 根目录包含 pyproject.toml 和任务入口,再检查 uv。因此错误顺序可以直接帮助定位问题: npm 用户不需要另外 clone Comet 仓库来获得 harness;包版本与 harness 版本保持一致。

harness 目录结构

它封装了什么

comet eval 在内部做这几件事:
  • 固定从 <project>/eval 根目录启动 harness(用 uv run
  • --manifest--skill-path 转换成 pytest 参数
  • 选择默认 profile(generic)和 task;没有 manifest 时按 Skill 快照自动生成并缓存受限任务
  • 按需生成临时 report config(--html 时)
  • 打印一组执行信息,便于定位报告
最终它会根据 --suite 调用:
你不需要记住这条命令,comet eval 会替你组装。

collect 和 run

comet eval 是单入口命令,通过 --collect 区分两个阶段: 两者共用同一套参数构建逻辑(buildEvalArgs),唯一区别是 collect 加 --collect-only,普通执行加 -v--suite local|langsmith|langfuse 选择入口;--report-config--html--quick 用于真实评估路径。

skill-path 模式(默认入口)

传一个本地 Skill 目录或 SKILL.md 时,comet eval 走 skill-path,不需要 comet/eval.yaml
这是评估任意本地 Skill 的默认入口。传目录时会自动发现 manifest;没有 manifest 时普通运行会从 Skill 快照生成并缓存 2–4 个受限任务,--quick 则明确选择 generic-skill-smoke 冒烟任务。--skill-name 会从目录名自动推断,你也可以用 --task 显式指定任务,或用 --profile 覆盖 profile。

manifest 模式(评估 /comet-any 完整包)

--manifest 适合 /comet-any 生成物,或任何带 comet/eval.yaml 的 Skill 包:
manifest 通常由 /comet-any 自动生成(不是手写),包含目标 Skill、profile、推荐任务、预期产物和交互配置。Engine-enabled 生成物默认使用 authoring-skill profile 和 authoring-skill-smoke quick eval。这条路径的结果才是发布 readiness 的有效证据;skill-path 的 generic-skill-smoke 只是早期验证,不作为发布证据。

generated manifest 的 draft hash

manifest 的 metadata.draftHash<current-bundle-hash> 时,CLI 会定位上层 bundle.yaml、计算当前 draft hash,并在系统临时目录写入一份运行时 manifest。Skill source 会解析为稳定绝对路径;评估结束后临时目录会被清理。 原 manifest 和 Bundle 不会被修改。占位值只适用于仍位于 Bundle draft 内的 generated manifest;离开 Bundle 后应使用具体、可验证的 draft hash。

执行信息

comet eval 在运行前会先打印一组执行信息,让你能定位报告和排查问题:
  • Eval root:实际从哪个 eval/ 根目录启动
  • Modecollectrun
  • Target:当前评估的是 manifest 还是本地 Skill 目录
  • Experiment:本次实验 id
  • Profile:本次评估使用的 profile
  • Task:本次评估任务
  • Report path:报告位置
  • Report config:启用 --html 时使用的临时报告配置
run 模式还会额外提示:失败归因会被记录到生成的 eval summary 里,按 harness、workflow、task、model 四个桶分类。

报告在哪里、长什么样

Experiment ID

实际落盘的 experiment id 格式是 <experiment_name>_<YYYYMMDD_HHMMSS>,例如 comet_fix_median_20260620_143000。experiment name 来自第一个参数化测试的 task name(-_)。 报告目录:

summary.md 包含

  1. 头部:Experiment ID、开始/完成时间。
  2. Results 表:每个 treatment 一行,列含 Checks、Turns、Duration、Tools、Tokens、Cost、RubricAvg。
  3. Summary:总运行数、checks 通过 X/Y(百分比)。
  4. Treatment Details:每个 treatment 每次运行的详细 metrics、skills invoked、scripts used、通过和失败的 check 列表。

每次运行的 report.json

字段包括:passedchecks_passed[]checks_failed[]events_summary(duration、turns、tool_calls、tokens、cost、files_created、skills_invoked、failure_attribution)。

一次评估内部:Docker 隔离 + 双 Agent + rubric

理解这一段能帮你判断评估结果是否可信。comet eval ... --html 内部按 treatment × task × reps 跑,每次运行:

小鱼在 Docker 隔离盒外观察被测 Agent、用户模拟 Agent 和 rubric 评估现场

一次真实评估会在隔离环境里运行 Agent 互动,再用校验器和 rubric 记录证据

关键点:
  • 模型在 Docker 容器里运行,和你的工作目录隔离。
  • 双 Agent 循环auto_user 模式):被测 Agent 跑被测 Skill,每个决策点由用户模拟 Agent回复(批准合理方案、选默认、推动前进,永不拒绝、不写代码)。被测 Agent 用 --resume 续接同一会话,最多 max_turns 次外层往返(comet-workflow 通常 12 次、authoring-skill 通常 8 次),命中”完成”提前结束。这里的 max_turns 不是被测 Agent 内部消息数或工具调用数。这让多阶段工作流能自动跑完整条链。完整循环和决策点检测见评分指标与双 Agent 评测
  • rubric 评分在校验器之后跑,把结果作为 [RUBRIC] 信息性检查追加(comet-workflow rubric 永不产生硬失败;generic/authoring 对特定缺失项产生硬失败)。
  • 真正的通过/失败由任务校验器(expected artifacts 存在 + test_scripts 通过)决定,rubric 分和 pass@k 是诊断信息。

报告输出配置

报告输出由 ReportOutputConfig 控制,优先级:
  1. --report-config <path>(JSON 或 YAML)
  2. COMET_EVAL_REPORT_CONFIG 环境变量
  3. 默认(只 markdown)
配置格式(顶层或嵌套都接受):
--html 等价于 {"markdown": true, "html": true},会写一个临时文件传给 pytest。

失败归因

报告会帮助区分失败来源。归因逻辑(attribution.py)按这个顺序判断每个失败的 check: 这个归因用于判断下一步应该修 Skill、修 eval 配置,还是重跑环境。详见读取评估报告

环境变量参考

LangSmith suite 额外需要 LANGSMITH_API_KEYLANGSMITH_TRACING=trueTRACE_TO_LANGSMITH=true。用户入口是 comet eval <target> --suite langsmith;不需要手工进入 eval/langsmith/ 执行 pytest。 Langfuse suite 需要 LANGFUSE_PUBLIC_KEYLANGFUSE_SECRET_KEY。用户入口是 comet eval <target> --suite langfuse--collect --suite langfuse 不初始化 SDK、不联网,也不会下载插件。

用 Anthropic 兼容代理认证

ANTHROPIC_API_KEY 未设置时,Docker 内的 claude 改用 Anthropic 兼容代理(BigModel / mimo / OpenRouter 等)认证。需要的变量: 这些变量在自动生成的用户级 .env 模板里都有占位项。普通用户编辑 %USERPROFILE%\\.comet\\eval\\.env / ~/.comet/eval/.env 即可;源码维护者使用 --project 时,才需要在对应源码 checkout 中调试 harness 的 eval/.env

自定义用户模拟器提示词

auto_user 模式评测里,用户模拟 Agent 的指令由一个提示词文件驱动。默认读 eval/simulator-instruction.md
如果你想换一套用户行为(比如更挑剔、会要求澄清更多),把你的版本写到一个文件,再用 BENCH_SIMULATOR_PROMPT_FILE 指向它:
相对路径从 eval/ 解析;文件存在才会被读取。命令行 --simulator-prompt "..." 的优先级最高,会覆盖文件内容。详见评分指标与双 Agent 评测 · 用户模拟 Agent 的指令

不要把 harness 和 runtime check 混淆

comet evalcomet skill check 名字接近,但用途不同:
  • comet eval:评估一个 Skill 包或 comet/eval.yaml,回答”这个 Skill 作为产品能力能不能通过评估”。
  • comet skill check:检查某次 Skill 运行是否缺 artifact 或状态,回答”这次运行是否完整”。
详见 Runtime check

下一步

最后修改于 2026年8月13日