Conversation
…e failures (helsome#113) Add a live preflight (Pi health, model availability, one-token credential probe, LongBridge data source, judge readiness) that reports status only and exits 2 instead of running an unmeasurable suite. Split execution validity from quality: quality metrics aggregate completed runs only; invalid/inconclusive experiments expose no headline composite, cannot gate, and cannot seed a baseline. The CLI now exits 0/1/2/3, and the nightly workflow drops continue-on-error and keeps the real exit code through the tee pipeline with set -o pipefail, while still uploading summary/JSON/log on failure. Verified: bun run typecheck; bun test --isolate (1467 pass, 0 fail); fixture smoke gate PASS (exit 0); live smoke with a real model + get_quote + LongBridge data (validity=valid, exit 0). Closes helsome#113.
helsome
left a comment
There was a problem hiding this comment.
真实 live smoke、Bun/OS/命令与1467 pass/8 skip报告已提供,认可这次不是只跑fixture。缺模型Key属于配置未就绪,不是Runtime代码损坏;本PR按“如实表达环境未就绪/测量是否有效”的改进审,不要求扩成新评测平台。
当前核心 blocker 在 aggregate.ts:isInfrastructureRun 把所有 status=failed/timeout 都算 infra,而 validResults 只保留 completed。这会把“模型已经正常开始、发生工具循环/预算耗尽或任务超时”也剔出质量分母,抹掉真实Agent失败。请按执行事实/明确错误原因区分未开始的配置失败和已执行的任务失败,而不是仅看终态。补两个对照:无Key未开始→不测质量;正常开始后tool_loop/timeout→仍是有效的负向质量结果并计入失败。无需再跑完整真实suite,受控ExperimentService集成+aggregate测试足够。
#116正在负责requested/effective模型接线,这里的CLI provider/model拆分请协调复用,别再扩另一套配置契约。另请补“无可见UI变化”的说明;若 testModel 空回答的新message会显示在设置连接测试界面,附该失败态一张截图即可,不要求视频。
…th requested values (helsome#114) Addresses the two wiring defects from review. 1. `--model provider/model-id` only inferred the provider; the prefixed id still travelled as the model, so applyRequestedConfig called setModel('provider', 'provider/model-id') and the run metadata carried a model id no provider serves. The split now happens once, at the CLI boundary: normalizeModelSelection() returns provider + bare model id (only the first segment is the provider, so `openrouter/anthropic/x` keeps `anthropic/x` as the id). The helper lives in packages/shared/src/evaluation/model-selection.ts so helsome#122 can reuse the same snippet instead of growing a second normalization. 2. Trace metadata no longer falls back to the requested model/provider. The readback-confirmed values are passed only when they exist; a dimension with no runtime readback stays unknown instead of being filled in with the requested label. The request is recorded under its own keys (requestedModel / requestedProvider) in the Langfuse metadata record — deliberately not as `model:` / `provider:` tags, and not as the snapshot's model, so no generation span can claim a model that never ran. Tests: normalizeModelSelection cases (shorthand, multi-slash id, explicit --provider, trailing separator) plus the end-to-end chain CLI input → normalized params → fake runtime control call → run metadata, and a trace assertion that an unapplied request stays `requestedModel` while the confirmed readback lands under `model`.
…elsome#113) Review follow-up: execution validity is derived from execution facts and explicit error codes, not from the terminal status alone. Changes: - aggregate.ts: isInfrastructureRun stays true only for not-started runs (spawn/config/credential rejection) or an explicit runtime/process failure; PI_REQUEST_TIMEOUT / PI_RUNTIME_ERROR and other in-run errors remain quality outcomes. New isQualityRun keeps started tool_loop / timeout / budget-exhausted runs in the quality denominator; summary and execution counts share the same classification. - scripts/eval/run.ts: printSummary reuses isQualityRun/isInfrastructureRun (single source of truth) and the CLI provider/model split delegates to normalizeModelSelection, shared with helsome#116 — no second config contract. - model-selection.ts: provider/model shorthand split extracted as a shared helper (only the first `/` segment is the provider). - core/evaluation.ts: document evaluated / infraFailed semantics. Tests (reviewer-requested contrasts): - not-started config failure (missing key) is excluded from quality aggregates; - a run that started and then hit tool_loop / wall-clock timeout stays a valid negative quality result and counts as a failure. Verification: - bun test --isolate packages/shared/src/evaluation/aggregate.test.ts packages/shared/src/evaluation/experiment-service.test.ts scripts/eval -> 63 pass / 0 fail - bun run typecheck -> all packages exit 0 UI impact: no layout or interaction changes.
Reconcile the review follow-up with the CLI/effective-config work that landed on main (helsome#114/helsome#116, helsome#115/helsome#117). Conflict resolutions: - core/evaluation.ts: keep both `execution` (helsome#113 validity) and `effectiveConfig` (helsome#114 readback). - experiment-service.ts: keep the helsome#113 evaluation gating, the helsome#116 effective-config readback, and the helsome#117 bounded teardown; the helsome#114 config-apply failure path now stamps `execution: 'not-started'` and returns `runtimeUnusable`, so a config failure stays infra-invalid instead of being measured as a zero score. - experiment-service.test.ts: keep both the relay-header test and the helsome#115 teardown suite; update the helsome#114 CONFIG_APPLY_FAILED expectation to the helsome#113 semantics (validity `invalid`, passRate null). - scripts/eval/run.ts: keep the live preflight (helsome#113) and the effective-config summary (helsome#114); a single normalizeModelSelection import, with thinkingLevel from the CLI. Verification: - bun test --isolate -> 1539 pass / 8 skip / 0 fail - bun run typecheck -> all packages exit 0 UI impact: no layout or interaction changes.
|
已按 review 处理(commit 4d1605e):
已解决与 main 的冲突(merge commit b85946d,已推送)。 处理方式:
验证:bun test --isolate -> 1539 pass / 8 skip / 0 fail;bun run typecheck 全部包通过。 |
旧 review 的 aggregate/配置复用 blocker 已由当前 head b85946d 处理,撤销过期阻塞;下面按当前最终 diff 提交新的单一 blocker。
helsome
left a comment
There was a problem hiding this comment.
旧 blocker 已解除:当前 head 已按执行事实区分 not-started 基础设施未就绪与已开始后的 tool_loop/timeout/预算耗尽,相关负向结果会进入质量分母;CLI 也复用了 #116 的 normalizeModelSelection。并且这条分支已经补上 CONFIG_APPLY_FAILED 早退返回的 runtimeUnusable: false,正好修复当前 main 的 TS2741 类型回归。
现在只剩一个新的、具体的 workflow blocker:.github/workflows/eval-nightly.yml 移除了 continue-on-error,而本 PR 自己的 docs/EVALUATION-CI.md 又明确说明 Nightly runner 当前不会安装/认证 LongBridge,因此 preflight 在现有 CI 环境会按设计返回 invalid/exit 2。这样合并后每日 Nightly 会因为一个已知的环境前置条件缺失而永久红灯。缺模型 Key / Provider 凭证 / 数据源配置未就绪应如实显示为“本轮不可测量”,但不应被包装成代码回归。
请做最小调整即可:保留 set -o pipefail、真实 CLI exit code、steps.eval-full.outcome、summary 和 artifact 的可见性,但让这种 report-only Nightly 的已知 env-invalid 状态不把整个 workflow 判为仓库失败。最简单可以恢复 eval step 的 continue-on-error: true;或者等价地捕获 exit code并在 summary 中明确区分 invalid/inconclusive 与 quality regression。同步调整对应 workflow test/docs。无需新评测框架,也无需再跑完整 live suite;focused workflow/pipefail 测试 + typecheck/现有全量报告即可。
另外,testProvider 空回答的新 message 如果确实会显示在设置连接测试界面,请补一张该失败态截图;如果不会进入可见 UI,请在 PR 中明确说明即可。
修复 Live Nightly 的"全部运行失败仍显示成功"与评测有效性缺陷。
原始基线(6405b7b)
Run 35074861257 / artifact 10437259480:86/86 run 失败(1×PI_HEALTH_TIMEOUT + 85×PI_RUNTIME_ERROR: No API key found for the selected model),0 次 tool call;passRate=0 但 composite=0.596(未执行 run 的规则指标幻影满分);Actions conclusion=success。
改动说明
scripts/eval/preflight.ts):逐项检查 Pi runtime 健康、模型可用、one-token 凭证探针、LongBridge 数据源、judge 就绪;只输出状态(敏感信息 redact),失败 exit 2 且不跑任何 case。ExperimentSummary增加validity(valid/invalid/inconclusive)、execution(requested/started/evaluated/infraFailed/skipped)、validityReasons;质量指标只聚合 completed run;无有效 run 时 composite/passRate 为 null;有效负向 case 仍判 fail;invalid/inconclusive 实验拒绝 seed baseline。continue-on-error,set -o pipefail保留真实退出码,失败仍上传 summary/JSON/log。--model provider/id归一化并显式setModel(此前 live 不会把所选模型下发给 Pi);cold-start health timeout 5s→60s;空 answer 凭证探针不再误报 "Connection verified.";judge 支持额外 HTTP header(FINAGENT_JUDGE_HEADERS,供中转使用)。关联 Issue
Closes #113
测试报告
环境
实际执行命令与结果