niceeval 0.13.2 → 0.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/bub.cjs +4 -4
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +2 -2
- package/dist/agents/bub.d.mts +2 -2
- package/dist/agents/bub.d.ts +2 -2
- package/dist/agents/claude-code-native.cjs +213 -0
- package/dist/agents/claude-code-native.cjs.map +1 -0
- package/dist/agents/claude-code-native.d.cts +5 -0
- package/dist/agents/claude-code-native.d.mts +5 -0
- package/dist/agents/claude-code-native.d.ts +5 -0
- package/dist/agents/claude-code-native.js +6 -0
- package/dist/agents/claude-code-native.js.map +1 -0
- package/dist/agents/claude-code.cjs +26 -80
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/codex-app-server.cjs +314 -0
- package/dist/agents/codex-app-server.cjs.map +1 -0
- package/dist/agents/codex-app-server.d.cts +9 -0
- package/dist/agents/codex-app-server.d.mts +9 -0
- package/dist/agents/codex-app-server.d.ts +9 -0
- package/dist/agents/codex-app-server.js +6 -0
- package/dist/agents/codex-app-server.js.map +1 -0
- package/dist/agents/codex.cjs +19 -68
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/codex.d.cts +3 -3
- package/dist/agents/codex.d.mts +3 -3
- package/dist/agents/codex.d.ts +3 -3
- package/dist/agents/index.cjs +3 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +1 -0
- package/dist/agents/index.d.mts +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.js +84 -82
- package/dist/agents/index.mjs +84 -82
- package/dist/agents/managed-jsonl.cjs +207 -0
- package/dist/agents/managed-jsonl.cjs.map +1 -0
- package/dist/agents/managed-jsonl.d.cts +39 -0
- package/dist/agents/managed-jsonl.d.mts +39 -0
- package/dist/agents/managed-jsonl.d.ts +39 -0
- package/dist/agents/managed-jsonl.js +6 -0
- package/dist/agents/managed-jsonl.js.map +1 -0
- package/dist/agents/managed-process.cjs +31 -0
- package/dist/agents/managed-process.cjs.map +1 -0
- package/dist/agents/managed-process.d.cts +3 -0
- package/dist/agents/managed-process.d.mts +3 -0
- package/dist/agents/managed-process.d.ts +3 -0
- package/dist/agents/managed-process.js +6 -0
- package/dist/agents/managed-process.js.map +1 -0
- package/dist/agents/omp.cjs +18 -1
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/sdk-streams.cjs +11 -4
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +8 -0
- package/dist/agents/types.d.mts +8 -0
- package/dist/agents/types.d.ts +8 -0
- package/dist/analysis/bindings.cjs +74 -19
- package/dist/analysis/bindings.cjs.map +1 -1
- package/dist/analysis/bindings.d.cts +534 -156
- package/dist/analysis/bindings.d.mts +534 -156
- package/dist/analysis/bindings.d.ts +534 -156
- package/dist/analysis/domain-view.cjs.map +1 -1
- package/dist/analysis/domain-view.d.cts +137 -8
- package/dist/analysis/domain-view.d.mts +137 -8
- package/dist/analysis/domain-view.d.ts +137 -8
- package/dist/analysis/index.cjs.map +1 -1
- package/dist/analysis/index.d.cts +1 -1
- package/dist/analysis/index.d.mts +1 -1
- package/dist/analysis/index.d.ts +1 -1
- package/dist/assertions/api.cjs.map +1 -1
- package/dist/assertions/api.d.cts +62 -0
- package/dist/assertions/api.d.mts +62 -0
- package/dist/assertions/api.d.ts +62 -0
- package/dist/assertions/judge.cjs +56 -5
- package/dist/assertions/judge.cjs.map +1 -1
- package/dist/assertions/match.cjs +66 -42
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +13 -0
- package/dist/assertions/match.d.mts +13 -0
- package/dist/assertions/match.d.ts +13 -0
- package/dist/assertions/record/attachment.cjs +104 -33
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/attachment.d.cts +294 -57
- package/dist/assertions/record/attachment.d.mts +294 -57
- package/dist/assertions/record/attachment.d.ts +294 -57
- package/dist/assertions/record/codec.cjs +91 -17
- package/dist/assertions/record/codec.cjs.map +1 -1
- package/dist/assertions/record/codec.d.cts +280 -52
- package/dist/assertions/record/codec.d.mts +280 -52
- package/dist/assertions/record/codec.d.ts +280 -52
- package/dist/assertions/record/index.js +2 -0
- package/dist/assertions/record/model.cjs +16 -0
- package/dist/assertions/record/model.cjs.map +1 -1
- package/dist/assertions/record/model.d.cts +120 -13
- package/dist/assertions/record/model.d.mts +120 -13
- package/dist/assertions/record/model.d.ts +120 -13
- package/dist/assertions/record/model.js +2 -0
- package/dist/assertions/record/producer.cjs +70 -50
- package/dist/assertions/record/producer.cjs.map +1 -1
- package/dist/assertions/record/producer.d.cts +8 -7
- package/dist/assertions/record/producer.d.mts +8 -7
- package/dist/assertions/record/producer.d.ts +8 -7
- package/dist/assertions/runtime.cjs +49 -7
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/cli/application.cjs +40 -0
- package/dist/cli/application.cjs.map +1 -0
- package/dist/cli/application.d.cts +129 -0
- package/dist/cli/application.d.mts +129 -0
- package/dist/cli/application.d.ts +129 -0
- package/dist/cli/application.js +24 -0
- package/dist/cli/application.js.map +1 -0
- package/dist/cli/bootstrap.cjs +10 -4
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/node-application.cjs +123 -0
- package/dist/cli/node-application.cjs.map +1 -0
- package/dist/cli/node-application.d.cts +14 -0
- package/dist/cli/node-application.d.mts +14 -0
- package/dist/cli/node-application.d.ts +14 -0
- package/dist/cli/node-application.js +26 -0
- package/dist/cli/node-application.js.map +1 -0
- package/dist/cli/program.cjs +2807 -0
- package/dist/cli/program.cjs.map +1 -0
- package/dist/cli/program.d.cts +352 -0
- package/dist/cli/program.d.mts +352 -0
- package/dist/cli/program.d.ts +352 -0
- package/dist/cli/program.js +36 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/project-configuration.cjs +134 -0
- package/dist/cli/project-configuration.cjs.map +1 -0
- package/dist/cli/project-configuration.d.cts +64 -0
- package/dist/cli/project-configuration.d.mts +64 -0
- package/dist/cli/project-configuration.d.ts +64 -0
- package/dist/cli/project-configuration.js +22 -0
- package/dist/cli/project-configuration.js.map +1 -0
- package/dist/cli/record.cjs +20 -4
- package/dist/cli/record.cjs.map +1 -1
- package/dist/cli/record.d.cts +3 -3
- package/dist/cli/record.d.mts +3 -3
- package/dist/cli/record.d.ts +3 -3
- package/dist/cli.cjs +19 -3130
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.cts +2 -148
- package/dist/cli.d.mts +2 -148
- package/dist/cli.d.ts +2 -148
- package/dist/cli.js +22 -30
- package/dist/context/assert-first.cjs +21 -15
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +1 -0
- package/dist/context/assert-first.d.mts +1 -0
- package/dist/context/assert-first.d.ts +1 -0
- package/dist/context/attempt-resources.cjs +13 -0
- package/dist/context/attempt-resources.cjs.map +1 -0
- package/dist/context/attempt-resources.d.cts +3 -0
- package/dist/context/attempt-resources.d.mts +3 -0
- package/dist/context/attempt-resources.d.ts +3 -0
- package/dist/context/attempt-resources.js +8 -0
- package/dist/context/attempt-resources.js.map +1 -0
- package/dist/context/session.cjs +4 -3
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +1 -0
- package/dist/context/session.d.mts +1 -0
- package/dist/context/session.d.ts +1 -0
- package/dist/eval/record/verdict.cjs +3 -2
- package/dist/eval/record/verdict.cjs.map +1 -1
- package/dist/experiment/host/index.cjs +1 -6
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/index.d.cts +1 -0
- package/dist/experiment/host/index.d.mts +1 -0
- package/dist/experiment/host/index.d.ts +1 -0
- package/dist/load-config.cjs +13 -4
- package/dist/load-config.cjs.map +1 -1
- package/dist/load-config.d.cts +4 -3
- package/dist/load-config.d.mts +4 -3
- package/dist/load-config.d.ts +4 -3
- package/dist/load-config.js +4 -2
- package/dist/o11y/parsers/codex.cjs +29 -7
- package/dist/o11y/parsers/codex.cjs.map +1 -1
- package/dist/record/codec/core.d.cts +0 -2
- package/dist/record/codec/core.d.mts +0 -2
- package/dist/record/codec/core.d.ts +0 -2
- package/dist/record/codec/identifiers.cjs +2 -3
- package/dist/record/codec/identifiers.cjs.map +1 -1
- package/dist/record/codec/identifiers.d.cts +1 -2
- package/dist/record/codec/identifiers.d.mts +1 -2
- package/dist/record/codec/identifiers.d.ts +1 -2
- package/dist/record/codec/identifiers.js +10 -12
- package/dist/record/codec/index.js +42 -44
- package/dist/record/definition/attachment.cjs +1 -0
- package/dist/record/definition/attachment.cjs.map +1 -1
- package/dist/record/definition/attachment.d.cts +14 -0
- package/dist/record/definition/attachment.d.mts +14 -0
- package/dist/record/definition/attachment.d.ts +14 -0
- package/dist/record/family/assertions-v1.cjs +104 -0
- package/dist/record/family/assertions-v1.cjs.map +1 -0
- package/dist/record/family/assertions-v1.d.cts +2 -0
- package/dist/record/family/assertions-v1.d.mts +2 -0
- package/dist/record/family/assertions-v1.d.ts +2 -0
- package/dist/record/family/assertions-v1.js +6 -0
- package/dist/record/family/assertions-v1.js.map +1 -0
- package/dist/record/family/assertions.cjs +16 -5
- package/dist/record/family/assertions.cjs.map +1 -1
- package/dist/record/family/assertions.d.cts +510 -56
- package/dist/record/family/assertions.d.mts +510 -56
- package/dist/record/family/assertions.d.ts +510 -56
- package/dist/record/family/assertions.js +14 -10
- package/dist/record/family/catalog.cjs +17 -1
- package/dist/record/family/catalog.cjs.map +1 -1
- package/dist/record/family/catalog.d.cts +1292 -104
- package/dist/record/family/catalog.d.mts +1292 -104
- package/dist/record/family/catalog.d.ts +1292 -104
- package/dist/record/family/catalog.js +22 -20
- package/dist/record/family/index.js +144 -138
- package/dist/record/family/observability-v1.cjs +5 -0
- package/dist/record/family/observability-v1.cjs.map +1 -1
- package/dist/record/family/observability.cjs +1 -1
- package/dist/record/family/observability.cjs.map +1 -1
- package/dist/record/host/runtime.cjs +323 -173
- package/dist/record/host/runtime.cjs.map +1 -1
- package/dist/record/host/types.cjs.map +1 -1
- package/dist/record/host/types.d.cts +9 -7
- package/dist/record/host/types.d.mts +9 -7
- package/dist/record/host/types.d.ts +9 -7
- package/dist/record/model/core.cjs.map +1 -1
- package/dist/record/model/core.d.cts +1 -2
- package/dist/record/model/core.d.mts +1 -2
- package/dist/record/model/core.d.ts +1 -2
- package/dist/record/model/definition.cjs +1 -2
- package/dist/record/model/definition.cjs.map +1 -1
- package/dist/record/model/definition.d.cts +1 -7
- package/dist/record/model/definition.d.mts +1 -7
- package/dist/record/model/definition.d.ts +1 -7
- package/dist/record/model/identifiers.cjs +2 -3
- package/dist/record/model/identifiers.cjs.map +1 -1
- package/dist/record/model/identifiers.d.cts +1 -3
- package/dist/record/model/identifiers.d.mts +1 -3
- package/dist/record/model/identifiers.d.ts +1 -3
- package/dist/record/model/identifiers.js +36 -38
- package/dist/record/model/index.js +60 -62
- package/dist/record/platform/node.cjs +17 -7
- package/dist/record/platform/node.cjs.map +1 -1
- package/dist/record/platform/services.cjs.map +1 -1
- package/dist/record/platform/services.d.cts +8 -3
- package/dist/record/platform/services.d.mts +8 -3
- package/dist/record/platform/services.d.ts +8 -3
- package/dist/record/reader/format.cjs +16 -65
- package/dist/record/reader/format.cjs.map +1 -1
- package/dist/record/reader/format.d.cts +5 -9
- package/dist/record/reader/format.d.mts +5 -9
- package/dist/record/reader/format.d.ts +5 -9
- package/dist/record/reader/index.js +10 -8
- package/dist/record/reader/runtime.cjs +63 -32
- package/dist/record/reader/runtime.cjs.map +1 -1
- package/dist/record/reader/runtime.d.cts +40 -4
- package/dist/record/reader/runtime.d.mts +40 -4
- package/dist/record/reader/runtime.d.ts +40 -4
- package/dist/record/reader/runtime.js +6 -4
- package/dist/report/assets/enhance.js +5 -5
- package/dist/report/assets/styles.css +190 -24
- package/dist/report/built-in/result-components.cjs +8 -5
- package/dist/report/built-in/result-components.cjs.map +1 -1
- package/dist/report/built-in/standard.cjs +3 -0
- package/dist/report/built-in/standard.cjs.map +1 -1
- package/dist/report/built-in/standard.d.cts +2 -0
- package/dist/report/built-in/standard.d.mts +2 -0
- package/dist/report/built-in/standard.d.ts +2 -0
- package/dist/report/client-dist/app.js +53 -0
- package/dist/report/components/attempt-detail/compute.cjs +108 -231
- package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
- package/dist/report/components/attempt-detail/compute.d.cts +11 -45
- package/dist/report/components/attempt-detail/compute.d.mts +11 -45
- package/dist/report/components/attempt-detail/compute.d.ts +11 -45
- package/dist/report/components/attempt-detail/compute.js +2 -4
- package/dist/report/components/attempt-detail/content.cjs +4 -4
- package/dist/report/components/attempt-detail/content.cjs.map +1 -1
- package/dist/report/components/attempt-detail/validate.cjs +47 -4
- package/dist/report/components/attempt-detail/validate.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.cjs +9 -15
- package/dist/report/components/entity-lists/compute.cjs.map +1 -1
- package/dist/report/components/entity-lists/content.cjs +53 -40
- package/dist/report/components/entity-lists/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.cjs +1 -3
- package/dist/report/components/entity-lists/index.cjs.map +1 -1
- package/dist/report/components/experiment-detail/compute.cjs +4 -6
- package/dist/report/components/experiment-detail/compute.cjs.map +1 -1
- package/dist/report/components/summaries/index.cjs +5 -1
- package/dist/report/components/summaries/index.cjs.map +1 -1
- package/dist/report/definition/cell.cjs +14 -7
- package/dist/report/definition/cell.cjs.map +1 -1
- package/dist/report/definition/cell.d.cts +4 -0
- package/dist/report/definition/cell.d.mts +4 -0
- package/dist/report/definition/cell.d.ts +4 -0
- package/dist/report/definition/primitives/assertion-evidence.cjs +96 -0
- package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -0
- package/dist/report/definition/primitives/assertion-evidence.d.cts +11 -0
- package/dist/report/definition/primitives/assertion-evidence.d.mts +11 -0
- package/dist/report/definition/primitives/assertion-evidence.d.ts +11 -0
- package/dist/report/definition/primitives/assertion-evidence.js +6 -0
- package/dist/report/definition/primitives/assertion-evidence.js.map +1 -0
- package/dist/report/definition/primitives/conversation.cjs +7 -0
- package/dist/report/definition/primitives/conversation.cjs.map +1 -1
- package/dist/report/definition/primitives/conversation.d.cts +2 -0
- package/dist/report/definition/primitives/conversation.d.mts +2 -0
- package/dist/report/definition/primitives/conversation.d.ts +2 -0
- package/dist/report/definition/primitives/turn-trace.cjs +53 -3
- package/dist/report/definition/primitives/turn-trace.cjs.map +1 -1
- package/dist/report/definition/primitives.cjs +14 -1
- package/dist/report/definition/primitives.cjs.map +1 -1
- package/dist/report/definition/report.cjs +16 -8
- package/dist/report/definition/report.cjs.map +1 -1
- package/dist/report/definition/report.d.cts +6 -0
- package/dist/report/definition/report.d.mts +6 -0
- package/dist/report/definition/report.d.ts +6 -0
- package/dist/report/definition/table-text.cjs +12 -3
- package/dist/report/definition/table-text.cjs.map +1 -1
- package/dist/report/definition/table-text.d.cts +6 -1
- package/dist/report/definition/table-text.d.mts +6 -1
- package/dist/report/definition/table-text.d.ts +6 -1
- package/dist/report/execution/model.cjs +6 -14
- package/dist/report/execution/model.cjs.map +1 -1
- package/dist/report/execution/model.d.cts +5 -10
- package/dist/report/execution/model.d.mts +5 -10
- package/dist/report/execution/model.d.ts +5 -10
- package/dist/report/execution/model.js +6 -6
- package/dist/report/execution/paths.cjs +0 -11
- package/dist/report/execution/paths.cjs.map +1 -1
- package/dist/report/execution/paths.d.cts +0 -1
- package/dist/report/execution/paths.d.mts +0 -1
- package/dist/report/execution/paths.d.ts +0 -1
- package/dist/report/execution/paths.js +6 -8
- package/dist/report/host/execute.cjs +13 -22
- package/dist/report/host/execute.cjs.map +1 -1
- package/dist/report/host/execute.d.cts +1 -4
- package/dist/report/host/execute.d.mts +1 -4
- package/dist/report/host/execute.d.ts +1 -4
- package/dist/report/host/from-record.cjs +3 -0
- package/dist/report/host/from-record.cjs.map +1 -1
- package/dist/report/host/from-record.d.cts +4 -1
- package/dist/report/host/from-record.d.mts +4 -1
- package/dist/report/host/from-record.d.ts +4 -1
- package/dist/report/host/site-assets.cjs +1 -2
- package/dist/report/host/site-assets.cjs.map +1 -1
- package/dist/report/host/site-assets.d.cts +0 -1
- package/dist/report/host/site-assets.d.mts +0 -1
- package/dist/report/host/site-assets.d.ts +0 -1
- package/dist/report/host/site-assets.js +2 -4
- package/dist/report/host/static.cjs +71 -346
- package/dist/report/host/static.cjs.map +1 -1
- package/dist/report/host/static.d.cts +1 -3
- package/dist/report/host/static.d.mts +1 -3
- package/dist/report/host/static.d.ts +1 -3
- package/dist/report/host/static.js +2 -2
- package/dist/report/host/view-session.cjs.map +1 -1
- package/dist/report/host/view-session.d.cts +1 -1
- package/dist/report/host/view-session.d.mts +1 -1
- package/dist/report/host/view-session.d.ts +1 -1
- package/dist/report/model/locale.cjs +1 -1
- package/dist/report/model/locale.cjs.map +1 -1
- package/dist/report/model/locale.d.cts +1 -1
- package/dist/report/model/locale.d.mts +1 -1
- package/dist/report/model/locale.d.ts +1 -1
- package/dist/report/model/pricing.cjs +2 -2
- package/dist/report/model/pricing.cjs.map +1 -1
- package/dist/report/react/enhance.js +5 -5
- package/dist/report/react/styles.css +190 -24
- package/dist/runner/adoption.cjs +4 -7
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt-resources.cjs +60 -0
- package/dist/runner/attempt-resources.cjs.map +1 -0
- package/dist/runner/attempt-resources.d.cts +13 -0
- package/dist/runner/attempt-resources.d.mts +13 -0
- package/dist/runner/attempt-resources.d.ts +13 -0
- package/dist/runner/attempt-resources.js +6 -0
- package/dist/runner/attempt-resources.js.map +1 -0
- package/dist/runner/attempt.cjs +37 -3
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/feedback/failure.cjs +77 -2
- package/dist/runner/feedback/failure.cjs.map +1 -1
- package/dist/runner/feedback/failure.d.cts +2 -1
- package/dist/runner/feedback/failure.d.mts +2 -1
- package/dist/runner/feedback/failure.d.ts +2 -1
- package/dist/runner/project-current.cjs +2 -13
- package/dist/runner/project-current.cjs.map +1 -1
- package/dist/runner/project-current.d.cts +4 -2
- package/dist/runner/project-current.d.mts +4 -2
- package/dist/runner/project-current.d.ts +4 -2
- package/dist/runner/reporters/braintrust.cjs +7 -7
- package/dist/runner/reporters/braintrust.cjs.map +1 -1
- package/dist/runner/reuse-readback.cjs +3 -4
- package/dist/runner/reuse-readback.cjs.map +1 -1
- package/dist/runner/run.cjs +5 -2
- package/dist/runner/run.cjs.map +1 -1
- package/dist/sandbox/backend.cjs +32 -2
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +12 -1
- package/dist/sandbox/backend.d.mts +12 -1
- package/dist/sandbox/backend.d.ts +12 -1
- package/dist/sandbox/backend.js +28 -22
- package/dist/sandbox/docker.cjs +140 -0
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/docker.d.cts +3 -1
- package/dist/sandbox/docker.d.mts +3 -1
- package/dist/sandbox/docker.d.ts +3 -1
- package/dist/sandbox/e2b.cjs +42 -0
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/e2b.d.cts +2 -0
- package/dist/sandbox/e2b.d.mts +2 -0
- package/dist/sandbox/e2b.d.ts +2 -0
- package/dist/sandbox/local.cjs +64 -0
- package/dist/sandbox/local.cjs.map +1 -1
- package/dist/sandbox/local.d.cts +3 -1
- package/dist/sandbox/local.d.mts +3 -1
- package/dist/sandbox/local.d.ts +3 -1
- package/dist/sandbox/managed-process.cjs +49 -0
- package/dist/sandbox/managed-process.cjs.map +1 -0
- package/dist/sandbox/managed-process.d.cts +11 -0
- package/dist/sandbox/managed-process.d.mts +11 -0
- package/dist/sandbox/managed-process.d.ts +11 -0
- package/dist/sandbox/managed-process.js +6 -0
- package/dist/sandbox/managed-process.js.map +1 -0
- package/dist/sandbox/types.cjs.map +1 -1
- package/dist/sandbox/types.d.cts +24 -0
- package/dist/sandbox/types.d.mts +24 -0
- package/dist/sandbox/types.d.ts +24 -0
- package/dist/sandbox/vercel.cjs +1 -0
- package/dist/sandbox/vercel.cjs.map +1 -1
- package/dist/sandbox/vercel.d.cts +1 -0
- package/dist/sandbox/vercel.d.mts +1 -0
- package/dist/sandbox/vercel.d.ts +1 -0
- package/dist/view/server.cjs +2 -37
- package/dist/view/server.cjs.map +1 -1
- package/dist/view/server.d.cts +0 -3
- package/dist/view/server.d.mts +0 -3
- package/dist/view/server.d.ts +0 -3
- package/docs-site/zh/reference/builtin-agents.mdx +7 -7
- package/docs-site/zh/reference/official-adapters.mdx +4 -4
- package/docs-site/zh/reference/report-components.mdx +2 -2
- package/docs-site/zh/tutorials/configuration.mdx +2 -2
- package/docs-site/zh/tutorials/deploy-report-site.mdx +24 -2
- package/docs-site/zh/tutorials/publish-report.mdx +4 -4
- package/docs-site/zh/tutorials/sandbox-agent.mdx +5 -5
- package/docs-site/zh/tutorials/theming.mdx +2 -2
- package/package.json +4 -6
- package/dist/record/migration/index.cjs +0 -5
- package/dist/record/migration/index.cjs.map +0 -1
- package/dist/record/migration/index.d.cts +0 -11
- package/dist/record/migration/index.d.mts +0 -11
- package/dist/record/migration/index.d.ts +0 -11
- package/dist/record/migration/index.js +0 -6
- package/dist/record/migration/index.js.map +0 -1
- package/dist/report/host/site-runtime.cjs +0 -92
- package/dist/report/host/site-runtime.cjs.map +0 -1
- package/dist/report/host/site-runtime.d.cts +0 -9
- package/dist/report/host/site-runtime.d.mts +0 -9
- package/dist/report/host/site-runtime.d.ts +0 -9
- package/dist/report/host/site-runtime.js +0 -10
- package/dist/report/host/site-runtime.js.map +0 -1
- package/dist/view/client-dist/app.css +0 -2
- package/dist/view/client-dist/app.js +0 -49
- package/dist/view/data.cjs +0 -3
- package/dist/view/data.cjs.map +0 -1
- package/dist/view/data.d.cts +0 -9
- package/dist/view/data.d.mts +0 -9
- package/dist/view/data.d.ts +0 -9
- package/dist/view/data.js +0 -4
- package/dist/view/data.js.map +0 -1
- package/dist/view/index.cjs +0 -24
- package/dist/view/index.cjs.map +0 -1
- package/dist/view/index.d.cts +0 -9
- package/dist/view/index.d.mts +0 -9
- package/dist/view/index.d.ts +0 -9
- package/dist/view/index.js +0 -28
- package/dist/view/index.js.map +0 -1
- package/dist/view/report-view-cache.cjs +0 -200
- package/dist/view/report-view-cache.cjs.map +0 -1
- package/dist/view/report-view-cache.d.cts +0 -67
- package/dist/view/report-view-cache.d.mts +0 -67
- package/dist/view/report-view-cache.d.ts +0 -67
- package/dist/view/report-view-cache.js +0 -8
- package/dist/view/report-view-cache.js.map +0 -1
- package/dist/view/shared/types.cjs +0 -3
- package/dist/view/shared/types.cjs.map +0 -1
- package/dist/view/shared/types.d.cts +0 -51
- package/dist/view/shared/types.d.mts +0 -51
- package/dist/view/shared/types.d.ts +0 -51
- package/dist/view/shared/types.js +0 -4
- package/dist/view/shared/types.js.map +0 -1
- package/dist/view/site.cjs +0 -32
- package/dist/view/site.cjs.map +0 -1
- package/dist/view/site.d.cts +0 -24
- package/dist/view/site.d.mts +0 -24
- package/dist/view/site.d.ts +0 -24
- package/dist/view/site.js +0 -8
- package/dist/view/site.js.map +0 -1
- package/dist/view/styles.css +0 -170
- package/dist/view/template.html +0 -17
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.experimentListContent = experimentListContent;
|
|
4
4
|
exports.attemptListContent = attemptListContent;
|
|
5
5
|
const locale_ts_1 = require("../../model/locale.cjs");
|
|
6
|
-
const format_ts_1 = require("../../model/format.cjs");
|
|
7
6
|
const compute_ts_1 = require("./compute.cjs");
|
|
8
7
|
/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */
|
|
9
8
|
const NO_CURRENT_RESULT = "noCurrentResult";
|
|
@@ -31,7 +30,22 @@ function projectCells(bag, columns) {
|
|
|
31
30
|
return cells;
|
|
32
31
|
}
|
|
33
32
|
function measureCell(value) {
|
|
34
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
kind: "metric",
|
|
35
|
+
metric: value,
|
|
36
|
+
// A complete denominator adds no actionable information to every text
|
|
37
|
+
// cell. Keep partial and exceptional states explicit; the MetricValue
|
|
38
|
+
// itself remains intact for both renderers and machine output.
|
|
39
|
+
showCoverage: value.state !== "available",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function stackCell(...cells) {
|
|
43
|
+
const visible = cells.filter((cell) => cell.kind !== "notApplicable");
|
|
44
|
+
if (visible.length === 0)
|
|
45
|
+
return { kind: "notApplicable" };
|
|
46
|
+
if (visible.length === 1)
|
|
47
|
+
return visible[0];
|
|
48
|
+
return { kind: "stack", cells: visible };
|
|
35
49
|
}
|
|
36
50
|
/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */
|
|
37
51
|
function tallyVerdicts(attempts) {
|
|
@@ -46,6 +60,10 @@ function tallyVerdicts(attempts) {
|
|
|
46
60
|
function verdictCountsCell(attempts) {
|
|
47
61
|
return { kind: "verdict", counts: tallyVerdicts(attempts) };
|
|
48
62
|
}
|
|
63
|
+
function evalVerdictCell(attempts) {
|
|
64
|
+
const only = attempts.length === 1 ? attempts[0]?.verdict : null;
|
|
65
|
+
return only === null || only === undefined ? verdictCountsCell(attempts) : verdictCell(only);
|
|
66
|
+
}
|
|
49
67
|
function verdictCell(verdict) {
|
|
50
68
|
if (verdict === null)
|
|
51
69
|
return { kind: "notApplicable" };
|
|
@@ -68,7 +86,7 @@ function resultCell(attempt) {
|
|
|
68
86
|
: { kind: "summary", text: attempt.failureSummary };
|
|
69
87
|
}
|
|
70
88
|
/**
|
|
71
|
-
* attempt 行的格子原料。层级表取 entity / record / durationMs / costUSD,
|
|
89
|
+
* attempt 行的格子原料。层级表取 entity / record / durationMs / tokens / costUSD,
|
|
72
90
|
* 平铺表取 entity / verdict / result / durationMs / costUSD;
|
|
73
91
|
* 两张表各自裁自这一份,不各写一份构造。
|
|
74
92
|
*/
|
|
@@ -77,9 +95,9 @@ function attemptCells(attempt) {
|
|
|
77
95
|
entity: locatorCell(attempt),
|
|
78
96
|
verdict: verdictCell(attempt.verdict),
|
|
79
97
|
result: resultCell(attempt),
|
|
80
|
-
//
|
|
81
|
-
record: verdictCell(attempt.verdict),
|
|
98
|
+
// locator 已携带这次判定;层级 Result 不重复同一个状态。
|
|
82
99
|
durationMs: measureCell(attempt.durationMs),
|
|
100
|
+
tokens: measureCell(attempt.tokens),
|
|
83
101
|
...(attempt.totalScore === undefined ? {} : { totalScore: { kind: "score", earned: attempt.totalScore } }),
|
|
84
102
|
...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),
|
|
85
103
|
};
|
|
@@ -92,16 +110,10 @@ const HIERARCHY_COLUMNS_PREFIX = [
|
|
|
92
110
|
];
|
|
93
111
|
const HIERARCHY_COLUMNS_SUFFIX = [
|
|
94
112
|
{ key: "tokens", better: "lower", header: HEADER.tokens },
|
|
95
|
-
{ key: "
|
|
113
|
+
{ key: "summary", better: "higher", header: HEADER.result },
|
|
96
114
|
];
|
|
97
|
-
function hierarchyColumns(
|
|
98
|
-
|
|
99
|
-
const primary = [];
|
|
100
|
-
if (composition !== "points")
|
|
101
|
-
primary.push({ key: "passRate", better: "higher", header: HEADER.passRate });
|
|
102
|
-
if (composition !== "pass")
|
|
103
|
-
primary.push({ key: "totalScore", better: "higher", header: HEADER.totalScore });
|
|
104
|
-
return [...HIERARCHY_COLUMNS_PREFIX, ...primary, ...HIERARCHY_COLUMNS_SUFFIX];
|
|
115
|
+
function hierarchyColumns() {
|
|
116
|
+
return [...HIERARCHY_COLUMNS_PREFIX, ...HIERARCHY_COLUMNS_SUFFIX];
|
|
105
117
|
}
|
|
106
118
|
const COST_COLUMN = { key: "costUSD", better: "lower", header: HEADER.costUSD };
|
|
107
119
|
/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */
|
|
@@ -114,10 +126,10 @@ const FLAT_ENTITY_COLUMNS = [
|
|
|
114
126
|
function columnsWithCost(columns, includeCost) {
|
|
115
127
|
if (!includeCost)
|
|
116
128
|
return columns;
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
129
|
+
const resultIndex = columns.findIndex((column) => column.key === "summary");
|
|
130
|
+
if (resultIndex < 0)
|
|
119
131
|
return [...columns, COST_COLUMN];
|
|
120
|
-
return [...columns.slice(0,
|
|
132
|
+
return [...columns.slice(0, resultIndex), COST_COLUMN, ...columns.slice(resultIndex)];
|
|
121
133
|
}
|
|
122
134
|
/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */
|
|
123
135
|
function identityCell(name, metadata) {
|
|
@@ -139,7 +151,7 @@ function groupMetricValue(metrics, key) {
|
|
|
139
151
|
function placeholderRow(experimentId, evalId, label, columns) {
|
|
140
152
|
const bag = {
|
|
141
153
|
entity: textCell(label),
|
|
142
|
-
|
|
154
|
+
summary: {
|
|
143
155
|
kind: "missing",
|
|
144
156
|
code: NO_CURRENT_RESULT,
|
|
145
157
|
detail: `niceeval exp ${experimentId}`,
|
|
@@ -160,11 +172,14 @@ function attemptRow(attempt, columns) {
|
|
|
160
172
|
function evalRow(row, label, view) {
|
|
161
173
|
const bag = {
|
|
162
174
|
entity: textCell(label),
|
|
163
|
-
// 判定构成列:该题 attempts 的计票,与 experiment 行计票同一形态。
|
|
164
|
-
record: verdictCountsCell(row.attempts),
|
|
165
175
|
durationMs: measureCell(row.durationMs),
|
|
166
|
-
|
|
167
|
-
|
|
176
|
+
summary: row.evaluationKind === "pass"
|
|
177
|
+
? (row.attempts.length === 1
|
|
178
|
+
? evalVerdictCell(row.attempts)
|
|
179
|
+
: stackCell(measureCell(row.endToEndPassRate), verdictCountsCell(row.attempts)))
|
|
180
|
+
: stackCell(row.totalScore === undefined
|
|
181
|
+
? { kind: "notApplicable" }
|
|
182
|
+
: { kind: "score", earned: row.totalScore }, evalVerdictCell(row.attempts)),
|
|
168
183
|
...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),
|
|
169
184
|
};
|
|
170
185
|
return {
|
|
@@ -212,25 +227,20 @@ function groupTableRow(node, item, view) {
|
|
|
212
227
|
const evals = evalRows.length;
|
|
213
228
|
const metrics = item.groupMetrics.get(node.prefix);
|
|
214
229
|
const attempts = attemptsUnder(node, item.evalRows);
|
|
230
|
+
const verdicts = evals === 0
|
|
231
|
+
? { kind: "missing", code: GROUP_NO_SAMPLES }
|
|
232
|
+
: verdictCountsCell(attempts);
|
|
233
|
+
const primary = evalRows.every((row) => row.evaluationKind === "pass")
|
|
234
|
+
? groupMetricValue(metrics, "passRate")
|
|
235
|
+
: evalRows.some((row) => row.totalScore !== undefined)
|
|
236
|
+
? { kind: "score", earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0) }
|
|
237
|
+
: { kind: "notApplicable" };
|
|
215
238
|
const bag = {
|
|
216
239
|
entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),
|
|
217
240
|
durationMs: groupMetricValue(metrics, "durationMs"),
|
|
218
|
-
...(evalRows.every((row) => row.evaluationKind === "pass")
|
|
219
|
-
? { passRate: groupMetricValue(metrics, "passRate") }
|
|
220
|
-
: {}),
|
|
221
|
-
...(evalRows.some((row) => row.totalScore !== undefined)
|
|
222
|
-
? {
|
|
223
|
-
totalScore: {
|
|
224
|
-
kind: "score",
|
|
225
|
-
earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0),
|
|
226
|
-
},
|
|
227
|
-
}
|
|
228
|
-
: {}),
|
|
229
241
|
tokens: groupMetricValue(metrics, "tokens"),
|
|
230
242
|
...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),
|
|
231
|
-
|
|
232
|
-
? { kind: "missing", code: GROUP_NO_SAMPLES }
|
|
233
|
-
: verdictCountsCell(attempts),
|
|
243
|
+
summary: stackCell(primary, verdicts),
|
|
234
244
|
};
|
|
235
245
|
return {
|
|
236
246
|
key: `group:${node.prefix}`,
|
|
@@ -265,16 +275,19 @@ function experimentRow(item, view) {
|
|
|
265
275
|
const evalIds = new Set(item.evalRows.map((row) => row.evalId));
|
|
266
276
|
const members = (0, compute_ts_1.experimentEvalLayout)([...new Set([...evalIds, ...item.missingEvalIds])]);
|
|
267
277
|
const attempts = item.evalRows.flatMap((row) => row.attempts);
|
|
278
|
+
const primary = item.evaluationKind === "pass"
|
|
279
|
+
? measureCell(item.endToEndPassRate)
|
|
280
|
+
: item.totalScore === undefined
|
|
281
|
+
? { kind: "notApplicable" }
|
|
282
|
+
: { kind: "score", earned: item.totalScore };
|
|
268
283
|
const bag = {
|
|
269
284
|
entity: textCell(item.experimentId),
|
|
270
285
|
model: item.model === null ? { kind: "notApplicable" } : textCell(item.model),
|
|
271
286
|
agent: item.agent === null ? { kind: "notApplicable" } : textCell(item.agent),
|
|
272
287
|
durationMs: measureCell(item.durationMs),
|
|
273
|
-
...(item.evaluationKind === "pass" ? { passRate: measureCell(item.endToEndPassRate) } : {}),
|
|
274
|
-
...(item.totalScore === undefined ? {} : { totalScore: { kind: "score", earned: item.totalScore } }),
|
|
275
288
|
tokens: measureCell(item.tokens),
|
|
276
289
|
...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),
|
|
277
|
-
|
|
290
|
+
summary: stackCell(primary, verdictCountsCell(attempts)),
|
|
278
291
|
};
|
|
279
292
|
return {
|
|
280
293
|
key: item.experimentId,
|
|
@@ -283,7 +296,7 @@ function experimentRow(item, view) {
|
|
|
283
296
|
};
|
|
284
297
|
}
|
|
285
298
|
function experimentListContent(items) {
|
|
286
|
-
const columns = columnsWithCost(hierarchyColumns(
|
|
299
|
+
const columns = columnsWithCost(hierarchyColumns(), items.some((item) => item.costUSD !== undefined));
|
|
287
300
|
return {
|
|
288
301
|
columns,
|
|
289
302
|
rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: "" })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["content.ts"],"names":[],"mappings":"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","sourcesContent":["// 实体列表 Table Content 投影(docs/feature/reports/library.md)。\n// Experiment 层级在这里从闭合 ExperimentListItem + 组读数投影成 TableContent.subRows;\n// 组件本体是中立 Table 原语,不知道 experiment / Eval / Attempt 语义。\nimport type { Cell, ColumnSpec, TableContent, TableContentRow, } from \"../../definition/cell.ts\";\nimport { localizedMessage } from \"../../model/locale.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport type { MetricValue } from \"../../../analysis/index.ts\";\nimport { experimentListEvaluationKindComposition } from \"../../model/format.ts\";\nimport { experimentEvalLayout, relativeEvalLabel, type AttemptListItem, type ExperimentListEvalRow, type ExperimentListItem, type ExperimentMetrics, type EvalLayoutNode, } from \"./compute.ts\";\n/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */\nconst NO_CURRENT_RESULT = \"noCurrentResult\";\n/** 组内零样本读数格的结构化原因码。 */\nconst GROUP_NO_SAMPLES = \"noSamples\";\n/** 三张实体表共用的列表头。文案单源在 locale 字典,这里只烤成随列走的 LocalizedText。 */\nconst HEADER = {\n entity: localizedMessage(\"experimentList.experiment\"),\n model: localizedMessage(\"table.model\"),\n agent: localizedMessage(\"table.agent\"),\n durationMs: localizedMessage(\"experimentList.avgDuration\"),\n passRate: localizedMessage(\"experimentList.passRate\"),\n totalScore: localizedMessage(\"experimentList.totalScore\"),\n tokens: localizedMessage(\"experimentList.tokens\"),\n costUSD: localizedMessage(\"experimentList.cost\"),\n record: localizedMessage(\"experimentList.result\"),\n verdict: localizedMessage(\"experimentList.status\"),\n result: localizedMessage(\"experimentList.result\"),\n};\n/**\n * 一行的「格子原料」:这一行自己算得出的全部格子,与任何列集无关。\n * 原料裁成行由 `projectCells` 做——列集外的原料丢掉,原料没覆盖的列显式填\n * notApplicable,不靠缺格回落成 \"—\"(memory/cell-key-must-match-column-set.md)。\n */\ntype CellBag = Readonly<globalThis.Record<string, Cell>>;\nfunction projectCells(bag: CellBag, columns: readonly ColumnSpec[]): globalThis.Record<string, Cell> {\n const cells: globalThis.Record<string, Cell> = {};\n for (const column of columns) {\n cells[column.key] = bag[column.key] ?? { kind: \"notApplicable\" };\n }\n return cells;\n}\nfunction measureCell(value: MetricValue): Cell {\n return { kind: \"metric\", metric: value };\n}\n/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */\nfunction tallyVerdicts(attempts: readonly AttemptListItem[]): {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n} {\n const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const attempt of attempts) {\n if (attempt.verdict === null)\n continue;\n counts[attempt.verdict] += 1;\n }\n return counts;\n}\nfunction verdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n return { kind: \"verdict\", counts: tallyVerdicts(attempts) };\n}\nfunction verdictCell(verdict: Verdict | null): Cell {\n if (verdict === null)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", verdict };\n}\nfunction locatorCell(attempt: AttemptListItem): Cell {\n return {\n kind: \"locator\",\n locator: attempt.locator,\n ...(attempt.verdict === null ? {} : { verdict: attempt.verdict }),\n };\n}\nfunction textCell(text: string, detail?: string): Cell {\n return detail ? { kind: \"text\", text, detail } : { kind: \"text\", text };\n}\n/** 失败摘要格:closed 摘录缺失时如实显示 \"—\",不发明文案。 */\nfunction resultCell(attempt: AttemptListItem): Cell {\n return attempt.failureSummary === null\n ? { kind: \"text\", text: \"—\" }\n : { kind: \"summary\", text: attempt.failureSummary };\n}\n/**\n * attempt 行的格子原料。层级表取 entity / record / durationMs / costUSD,\n * 平铺表取 entity / verdict / result / durationMs / costUSD;\n * 两张表各自裁自这一份,不各写一份构造。\n */\nfunction attemptCells(attempt: AttemptListItem): CellBag {\n return {\n entity: locatorCell(attempt),\n verdict: verdictCell(attempt.verdict),\n result: resultCell(attempt),\n // 层级表的判定构成列:该次判定,与 verdict 格同值。\n record: verdictCell(attempt.verdict),\n durationMs: measureCell(attempt.durationMs),\n ...(attempt.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: attempt.totalScore } as const }),\n ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),\n };\n}\nconst HIERARCHY_COLUMNS_PREFIX: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"model\", header: HEADER.model },\n { key: \"agent\", header: HEADER.agent },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nconst HIERARCHY_COLUMNS_SUFFIX: readonly ColumnSpec[] = [\n { key: \"tokens\", better: \"lower\", header: HEADER.tokens },\n { key: \"record\", header: HEADER.record },\n];\nfunction hierarchyColumns(items: readonly ExperimentListItem[]): readonly ColumnSpec[] {\n const composition = experimentListEvaluationKindComposition(items.map((item) => ({ evaluationKind: item.evaluationKind, attempts: item.evalRows.length })));\n const primary: ColumnSpec[] = [];\n if (composition !== \"points\")\n primary.push({ key: \"passRate\", better: \"higher\", header: HEADER.passRate });\n if (composition !== \"pass\")\n primary.push({ key: \"totalScore\", better: \"higher\", header: HEADER.totalScore });\n return [...HIERARCHY_COLUMNS_PREFIX, ...primary, ...HIERARCHY_COLUMNS_SUFFIX];\n}\nconst COST_COLUMN: ColumnSpec = { key: \"costUSD\", better: \"lower\", header: HEADER.costUSD };\n/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */\nconst FLAT_ENTITY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"verdict\", header: HEADER.verdict },\n { key: \"result\", header: HEADER.result },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nfunction columnsWithCost(columns: readonly ColumnSpec[], includeCost: boolean): readonly ColumnSpec[] {\n if (!includeCost)\n return columns;\n const recordIndex = columns.findIndex((column) => column.key === \"record\");\n if (recordIndex < 0)\n return [...columns, COST_COLUMN];\n return [...columns.slice(0, recordIndex), COST_COLUMN, ...columns.slice(recordIndex)];\n}\n/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */\nfunction identityCell(name: string, metadata: string): Cell {\n return textCell(`${name} (${metadata})`);\n}\n/** 组内题数与已知题数:\"3/4 evals\" 只在有缺口时出现。 */\nfunction groupEntityDetail(evals: number, knownEvals: number): string {\n return knownEvals > evals ? `${evals}/${knownEvals} evals` : `${evals} evals`;\n}\n/**\n * 组行读数格:直接用 Analysis-owned 组 MetricValue;组前缀聚合缺失时才是\n * missing(本该有却没跑到),不是 \"—\"(对这一行没有意义)。\n */\nfunction groupMetricValue(metrics: ExperimentMetrics | undefined, key: keyof ExperimentMetrics): Cell {\n const metric = metrics?.[key];\n return metric === undefined ? { kind: \"missing\", code: GROUP_NO_SAMPLES } : measureCell(metric);\n}\n/** 覆盖缺口占位行:code 与补跑命令同行——都是「当前配置下没有结果」这一个事实。 */\nfunction placeholderRow(experimentId: string, evalId: string, label: string, columns: readonly ColumnSpec[]): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n record: {\n kind: \"missing\",\n code: NO_CURRENT_RESULT,\n detail: `niceeval exp ${experimentId}`,\n },\n };\n return {\n key: `${experimentId}:${evalId}:missing`,\n variant: \"placeholder\",\n cells: projectCells(bag, columns),\n };\n}\ninterface HierarchyView {\n readonly columns: readonly ColumnSpec[];\n readonly item: ExperimentListItem;\n readonly labelPrefix: string;\n}\nfunction attemptRow(attempt: AttemptListItem, columns: readonly ColumnSpec[]): TableContentRow {\n return {\n key: attempt.locator,\n cells: projectCells(attemptCells(attempt), columns),\n };\n}\nfunction evalRow(row: ExperimentListEvalRow, label: string, view: HierarchyView): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n // 判定构成列:该题 attempts 的计票,与 experiment 行计票同一形态。\n record: verdictCountsCell(row.attempts),\n durationMs: measureCell(row.durationMs),\n ...(row.evaluationKind === \"pass\" ? { passRate: measureCell(row.endToEndPassRate) } : {}),\n ...(row.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: row.totalScore } as const }),\n ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),\n };\n return {\n key: row.evalId,\n cells: projectCells(bag, view.columns),\n subRows: row.attempts.map((attempt) => attemptRow(attempt, view.columns)),\n };\n}\nfunction leafTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n}>, view: HierarchyView): TableContentRow {\n const label = relativeEvalLabel(node.evalId, view.labelPrefix);\n const row = view.item.evalRows.find((candidate) => candidate.evalId === node.evalId);\n return row === undefined\n ? placeholderRow(view.item.experimentId, node.evalId, label, view.columns)\n : evalRow(row, label, view);\n}\n/** 组行的成员 attempt 列表(用于判定计票)。 */\nfunction attemptsUnder(node: EvalLayoutNode, evalRows: readonly ExperimentListEvalRow[]): readonly AttemptListItem[] {\n const members = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n members.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n return evalRows\n .filter((row) => members.has(row.evalId))\n .flatMap((row) => row.attempts);\n}\nfunction groupTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n}>, item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n evalIds.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n const evalRows = item.evalRows.filter((row) => evalIds.has(row.evalId));\n const knownEvals = evalIds.size;\n const evals = evalRows.length;\n const metrics = item.groupMetrics.get(node.prefix);\n const attempts = attemptsUnder(node, item.evalRows);\n const bag: CellBag = {\n entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),\n durationMs: groupMetricValue(metrics, \"durationMs\"),\n ...(evalRows.every((row) => row.evaluationKind === \"pass\")\n ? { passRate: groupMetricValue(metrics, \"passRate\") }\n : {}),\n ...(evalRows.some((row) => row.totalScore !== undefined)\n ? {\n totalScore: {\n kind: \"score\",\n earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0),\n } as const,\n }\n : {}),\n tokens: groupMetricValue(metrics, \"tokens\"),\n ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),\n record: evals === 0\n ? { kind: \"missing\", code: GROUP_NO_SAMPLES }\n : verdictCountsCell(attempts),\n };\n return {\n key: `group:${node.prefix}`,\n variant: \"group\",\n cells: projectCells(bag, view.columns),\n subRows: groupChildren(node.children, { ...view, labelPrefix: node.prefix }),\n };\n}\n/** 同一层的组行按主读数降序(缺数据沉底,同值按段名收口),叶子恒在组行之后。 */\nfunction groupChildren(nodes: readonly EvalLayoutNode[], view: HierarchyView): TableContentRow[] {\n const groups = nodes\n .filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n }> => node.kind === \"group\")\n .slice()\n .sort((left, right) => {\n const leftPrimary = view.item.groupMetrics.get(left.prefix)?.passRate.value ?? null;\n const rightPrimary = view.item.groupMetrics.get(right.prefix)?.passRate.value ?? null;\n if (leftPrimary === null && rightPrimary === null)\n return left.segment.localeCompare(right.segment);\n if (leftPrimary === null)\n return 1;\n if (rightPrimary === null)\n return -1;\n return rightPrimary - leftPrimary || left.segment.localeCompare(right.segment);\n });\n const leaves = nodes.filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n }> => node.kind === \"leaf\");\n return [\n ...groups.map((node) => groupTableRow(node, view.item, view)),\n ...leaves.map((node) => leafTableRow(node, view)),\n ];\n}\nfunction experimentRow(item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set(item.evalRows.map((row) => row.evalId));\n const members: readonly EvalLayoutNode[] = experimentEvalLayout([...new Set([...evalIds, ...item.missingEvalIds])]);\n const attempts = item.evalRows.flatMap((row) => row.attempts);\n const bag: CellBag = {\n entity: textCell(item.experimentId),\n model: item.model === null ? { kind: \"notApplicable\" } : textCell(item.model),\n agent: item.agent === null ? { kind: \"notApplicable\" } : textCell(item.agent),\n durationMs: measureCell(item.durationMs),\n ...(item.evaluationKind === \"pass\" ? { passRate: measureCell(item.endToEndPassRate) } : {}),\n ...(item.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: item.totalScore } as const }),\n tokens: measureCell(item.tokens),\n ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),\n record: verdictCountsCell(attempts),\n };\n return {\n key: item.experimentId,\n cells: projectCells(bag, view.columns),\n subRows: members.length > 0 ? groupChildren(members, view) : [],\n };\n}\nexport function experimentListContent(items: readonly ExperimentListItem[]): TableContent {\n const columns = columnsWithCost(hierarchyColumns(items), items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: \"\" })),\n };\n}\nexport function attemptListContent(items: readonly AttemptListItem[]): TableContent {\n const columns = columnsWithCost(FLAT_ENTITY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n // 与层级表里的 attempt 行同一份格子原料,只是裁到平铺列集。\n rows: items.map((item) => attemptRow(item, columns)),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["content.ts"],"names":[],"mappings":"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","sourcesContent":["// 实体列表 Table Content 投影(docs/feature/reports/library.md)。\n// Experiment 层级在这里从闭合 ExperimentListItem + 组读数投影成 TableContent.subRows;\n// 组件本体是中立 Table 原语,不知道 experiment / Eval / Attempt 语义。\nimport type { Cell, ColumnSpec, TableContent, TableContentRow, } from \"../../definition/cell.ts\";\nimport { localizedMessage } from \"../../model/locale.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport type { MetricValue } from \"../../../analysis/index.ts\";\nimport { experimentEvalLayout, relativeEvalLabel, type AttemptListItem, type ExperimentListEvalRow, type ExperimentListItem, type ExperimentMetrics, type EvalLayoutNode, } from \"./compute.ts\";\n/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */\nconst NO_CURRENT_RESULT = \"noCurrentResult\";\n/** 组内零样本读数格的结构化原因码。 */\nconst GROUP_NO_SAMPLES = \"noSamples\";\n/** 三张实体表共用的列表头。文案单源在 locale 字典,这里只烤成随列走的 LocalizedText。 */\nconst HEADER = {\n entity: localizedMessage(\"experimentList.experiment\"),\n model: localizedMessage(\"table.model\"),\n agent: localizedMessage(\"table.agent\"),\n durationMs: localizedMessage(\"experimentList.avgDuration\"),\n passRate: localizedMessage(\"experimentList.passRate\"),\n totalScore: localizedMessage(\"experimentList.totalScore\"),\n tokens: localizedMessage(\"experimentList.tokens\"),\n costUSD: localizedMessage(\"experimentList.cost\"),\n record: localizedMessage(\"experimentList.result\"),\n verdict: localizedMessage(\"experimentList.status\"),\n result: localizedMessage(\"experimentList.result\"),\n};\n/**\n * 一行的「格子原料」:这一行自己算得出的全部格子,与任何列集无关。\n * 原料裁成行由 `projectCells` 做——列集外的原料丢掉,原料没覆盖的列显式填\n * notApplicable,不靠缺格回落成 \"—\"(memory/cell-key-must-match-column-set.md)。\n */\ntype CellBag = Readonly<globalThis.Record<string, Cell>>;\nfunction projectCells(bag: CellBag, columns: readonly ColumnSpec[]): globalThis.Record<string, Cell> {\n const cells: globalThis.Record<string, Cell> = {};\n for (const column of columns) {\n cells[column.key] = bag[column.key] ?? { kind: \"notApplicable\" };\n }\n return cells;\n}\nfunction measureCell(value: MetricValue): Cell {\n return {\n kind: \"metric\",\n metric: value,\n // A complete denominator adds no actionable information to every text\n // cell. Keep partial and exceptional states explicit; the MetricValue\n // itself remains intact for both renderers and machine output.\n showCoverage: value.state !== \"available\",\n };\n}\nfunction stackCell(...cells: readonly Cell[]): Cell {\n const visible = cells.filter((cell) => cell.kind !== \"notApplicable\");\n if (visible.length === 0)\n return { kind: \"notApplicable\" };\n if (visible.length === 1)\n return visible[0]!;\n return { kind: \"stack\", cells: visible as [\n Cell,\n ...Cell[]\n ] };\n}\n/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */\nfunction tallyVerdicts(attempts: readonly AttemptListItem[]): {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n} {\n const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const attempt of attempts) {\n if (attempt.verdict === null)\n continue;\n counts[attempt.verdict] += 1;\n }\n return counts;\n}\nfunction verdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n return { kind: \"verdict\", counts: tallyVerdicts(attempts) };\n}\nfunction evalVerdictCell(attempts: readonly AttemptListItem[]): Cell {\n const only = attempts.length === 1 ? attempts[0]?.verdict : null;\n return only === null || only === undefined ? verdictCountsCell(attempts) : verdictCell(only);\n}\nfunction verdictCell(verdict: Verdict | null): Cell {\n if (verdict === null)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", verdict };\n}\nfunction locatorCell(attempt: AttemptListItem): Cell {\n return {\n kind: \"locator\",\n locator: attempt.locator,\n ...(attempt.verdict === null ? {} : { verdict: attempt.verdict }),\n };\n}\nfunction textCell(text: string, detail?: string): Cell {\n return detail ? { kind: \"text\", text, detail } : { kind: \"text\", text };\n}\n/** 失败摘要格:closed 摘录缺失时如实显示 \"—\",不发明文案。 */\nfunction resultCell(attempt: AttemptListItem): Cell {\n return attempt.failureSummary === null\n ? { kind: \"text\", text: \"—\" }\n : { kind: \"summary\", text: attempt.failureSummary };\n}\n/**\n * attempt 行的格子原料。层级表取 entity / record / durationMs / tokens / costUSD,\n * 平铺表取 entity / verdict / result / durationMs / costUSD;\n * 两张表各自裁自这一份,不各写一份构造。\n */\nfunction attemptCells(attempt: AttemptListItem): CellBag {\n return {\n entity: locatorCell(attempt),\n verdict: verdictCell(attempt.verdict),\n result: resultCell(attempt),\n // locator 已携带这次判定;层级 Result 不重复同一个状态。\n durationMs: measureCell(attempt.durationMs),\n tokens: measureCell(attempt.tokens),\n ...(attempt.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: attempt.totalScore } as const }),\n ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),\n };\n}\nconst HIERARCHY_COLUMNS_PREFIX: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"model\", header: HEADER.model },\n { key: \"agent\", header: HEADER.agent },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nconst HIERARCHY_COLUMNS_SUFFIX: readonly ColumnSpec[] = [\n { key: \"tokens\", better: \"lower\", header: HEADER.tokens },\n { key: \"summary\", better: \"higher\", header: HEADER.result },\n];\nfunction hierarchyColumns(): readonly ColumnSpec[] {\n return [...HIERARCHY_COLUMNS_PREFIX, ...HIERARCHY_COLUMNS_SUFFIX];\n}\nconst COST_COLUMN: ColumnSpec = { key: \"costUSD\", better: \"lower\", header: HEADER.costUSD };\n/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */\nconst FLAT_ENTITY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"verdict\", header: HEADER.verdict },\n { key: \"result\", header: HEADER.result },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nfunction columnsWithCost(columns: readonly ColumnSpec[], includeCost: boolean): readonly ColumnSpec[] {\n if (!includeCost)\n return columns;\n const resultIndex = columns.findIndex((column) => column.key === \"summary\");\n if (resultIndex < 0)\n return [...columns, COST_COLUMN];\n return [...columns.slice(0, resultIndex), COST_COLUMN, ...columns.slice(resultIndex)];\n}\n/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */\nfunction identityCell(name: string, metadata: string): Cell {\n return textCell(`${name} (${metadata})`);\n}\n/** 组内题数与已知题数:\"3/4 evals\" 只在有缺口时出现。 */\nfunction groupEntityDetail(evals: number, knownEvals: number): string {\n return knownEvals > evals ? `${evals}/${knownEvals} evals` : `${evals} evals`;\n}\n/**\n * 组行读数格:直接用 Analysis-owned 组 MetricValue;组前缀聚合缺失时才是\n * missing(本该有却没跑到),不是 \"—\"(对这一行没有意义)。\n */\nfunction groupMetricValue(metrics: ExperimentMetrics | undefined, key: keyof ExperimentMetrics): Cell {\n const metric = metrics?.[key];\n return metric === undefined ? { kind: \"missing\", code: GROUP_NO_SAMPLES } : measureCell(metric);\n}\n/** 覆盖缺口占位行:code 与补跑命令同行——都是「当前配置下没有结果」这一个事实。 */\nfunction placeholderRow(experimentId: string, evalId: string, label: string, columns: readonly ColumnSpec[]): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n summary: {\n kind: \"missing\",\n code: NO_CURRENT_RESULT,\n detail: `niceeval exp ${experimentId}`,\n },\n };\n return {\n key: `${experimentId}:${evalId}:missing`,\n variant: \"placeholder\",\n cells: projectCells(bag, columns),\n };\n}\ninterface HierarchyView {\n readonly columns: readonly ColumnSpec[];\n readonly item: ExperimentListItem;\n readonly labelPrefix: string;\n}\nfunction attemptRow(attempt: AttemptListItem, columns: readonly ColumnSpec[]): TableContentRow {\n return {\n key: attempt.locator,\n cells: projectCells(attemptCells(attempt), columns),\n };\n}\nfunction evalRow(row: ExperimentListEvalRow, label: string, view: HierarchyView): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n durationMs: measureCell(row.durationMs),\n summary: row.evaluationKind === \"pass\"\n ? (row.attempts.length === 1\n ? evalVerdictCell(row.attempts)\n : stackCell(measureCell(row.endToEndPassRate), verdictCountsCell(row.attempts)))\n : stackCell(row.totalScore === undefined\n ? { kind: \"notApplicable\" }\n : { kind: \"score\", earned: row.totalScore }, evalVerdictCell(row.attempts)),\n ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),\n };\n return {\n key: row.evalId,\n cells: projectCells(bag, view.columns),\n subRows: row.attempts.map((attempt) => attemptRow(attempt, view.columns)),\n };\n}\nfunction leafTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n}>, view: HierarchyView): TableContentRow {\n const label = relativeEvalLabel(node.evalId, view.labelPrefix);\n const row = view.item.evalRows.find((candidate) => candidate.evalId === node.evalId);\n return row === undefined\n ? placeholderRow(view.item.experimentId, node.evalId, label, view.columns)\n : evalRow(row, label, view);\n}\n/** 组行的成员 attempt 列表(用于判定计票)。 */\nfunction attemptsUnder(node: EvalLayoutNode, evalRows: readonly ExperimentListEvalRow[]): readonly AttemptListItem[] {\n const members = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n members.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n return evalRows\n .filter((row) => members.has(row.evalId))\n .flatMap((row) => row.attempts);\n}\nfunction groupTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n}>, item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n evalIds.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n const evalRows = item.evalRows.filter((row) => evalIds.has(row.evalId));\n const knownEvals = evalIds.size;\n const evals = evalRows.length;\n const metrics = item.groupMetrics.get(node.prefix);\n const attempts = attemptsUnder(node, item.evalRows);\n const verdicts = evals === 0\n ? { kind: \"missing\", code: GROUP_NO_SAMPLES } as const\n : verdictCountsCell(attempts);\n const primary = evalRows.every((row) => row.evaluationKind === \"pass\")\n ? groupMetricValue(metrics, \"passRate\")\n : evalRows.some((row) => row.totalScore !== undefined)\n ? { kind: \"score\", earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0) } as const\n : { kind: \"notApplicable\" } as const;\n const bag: CellBag = {\n entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),\n durationMs: groupMetricValue(metrics, \"durationMs\"),\n tokens: groupMetricValue(metrics, \"tokens\"),\n ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),\n summary: stackCell(primary, verdicts),\n };\n return {\n key: `group:${node.prefix}`,\n variant: \"group\",\n cells: projectCells(bag, view.columns),\n subRows: groupChildren(node.children, { ...view, labelPrefix: node.prefix }),\n };\n}\n/** 同一层的组行按主读数降序(缺数据沉底,同值按段名收口),叶子恒在组行之后。 */\nfunction groupChildren(nodes: readonly EvalLayoutNode[], view: HierarchyView): TableContentRow[] {\n const groups = nodes\n .filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n }> => node.kind === \"group\")\n .slice()\n .sort((left, right) => {\n const leftPrimary = view.item.groupMetrics.get(left.prefix)?.passRate.value ?? null;\n const rightPrimary = view.item.groupMetrics.get(right.prefix)?.passRate.value ?? null;\n if (leftPrimary === null && rightPrimary === null)\n return left.segment.localeCompare(right.segment);\n if (leftPrimary === null)\n return 1;\n if (rightPrimary === null)\n return -1;\n return rightPrimary - leftPrimary || left.segment.localeCompare(right.segment);\n });\n const leaves = nodes.filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n }> => node.kind === \"leaf\");\n return [\n ...groups.map((node) => groupTableRow(node, view.item, view)),\n ...leaves.map((node) => leafTableRow(node, view)),\n ];\n}\nfunction experimentRow(item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set(item.evalRows.map((row) => row.evalId));\n const members: readonly EvalLayoutNode[] = experimentEvalLayout([...new Set([...evalIds, ...item.missingEvalIds])]);\n const attempts = item.evalRows.flatMap((row) => row.attempts);\n const primary = item.evaluationKind === \"pass\"\n ? measureCell(item.endToEndPassRate)\n : item.totalScore === undefined\n ? { kind: \"notApplicable\" } as const\n : { kind: \"score\", earned: item.totalScore } as const;\n const bag: CellBag = {\n entity: textCell(item.experimentId),\n model: item.model === null ? { kind: \"notApplicable\" } : textCell(item.model),\n agent: item.agent === null ? { kind: \"notApplicable\" } : textCell(item.agent),\n durationMs: measureCell(item.durationMs),\n tokens: measureCell(item.tokens),\n ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),\n summary: stackCell(primary, verdictCountsCell(attempts)),\n };\n return {\n key: item.experimentId,\n cells: projectCells(bag, view.columns),\n subRows: members.length > 0 ? groupChildren(members, view) : [],\n };\n}\nexport function experimentListContent(items: readonly ExperimentListItem[]): TableContent {\n const columns = columnsWithCost(hierarchyColumns(), items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: \"\" })),\n };\n}\nexport function attemptListContent(items: readonly AttemptListItem[]): TableContent {\n const columns = columnsWithCost(FLAT_ENTITY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n // 与层级表里的 attempt 行同一份格子原料,只是裁到平铺列集。\n rows: items.map((item) => attemptRow(item, columns)),\n };\n}\n"]}
|
|
@@ -7,7 +7,6 @@ const tree_ts_1 = require("../../definition/tree.cjs");
|
|
|
7
7
|
const primitives_tsx_1 = require("../../definition/primitives.cjs");
|
|
8
8
|
const compute_ts_1 = require("./compute.cjs");
|
|
9
9
|
const content_ts_1 = require("./content.cjs");
|
|
10
|
-
const format_ts_1 = require("../../model/format.cjs");
|
|
11
10
|
var compute_ts_2 = require("./compute.cjs");
|
|
12
11
|
Object.defineProperty(exports, "attemptListData", { enumerable: true, get: function () { return compute_ts_2.attemptListData; } });
|
|
13
12
|
Object.defineProperty(exports, "experimentListData", { enumerable: true, get: function () { return compute_ts_2.experimentListData; } });
|
|
@@ -45,8 +44,7 @@ exports.ExperimentTable = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
|
|
|
45
44
|
}
|
|
46
45
|
const sample = (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison);
|
|
47
46
|
const rows = await (0, compute_ts_1.experimentListData)(sample, ctx.report.pricing);
|
|
48
|
-
const
|
|
49
|
-
const defaultSort = composition === "pass" ? "passRate" : "totalScore";
|
|
47
|
+
const defaultSort = "summary";
|
|
50
48
|
return (0, jsx_runtime_1.jsx)(primitives_tsx_1.TableContentView, { data: (0, content_ts_1.experimentListContent)(rows), sort: props.sort ?? defaultSort, searchable: props.searchable ?? true, locale: props.locale, className: props.className });
|
|
51
49
|
});
|
|
52
50
|
exports.ExperimentTable.displayName = "ExperimentTable";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":";;;;AAIA,iFAA4F;AAC5F,sDAA2D;AAC3D,mEAAyE;AAEzE,6CAAmH;AACnH,6CAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["// 实体列表组合件:FailureList / AttemptList / ExperimentTable。\n// 列表本体是中立 Table 原语(TableContentView);语义全部住在 compute.ts 与\n// content.ts 的投影层,docs/feature/reports/library.md。\nimport type { ExperimentComparisonScope, Sample } from \"../../../analysis/index.ts\";\nimport { sampleForExperimentComparisonScope } from \"../../../analysis/experiment-groups.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { TableContentView, Text } from \"../../definition/primitives.tsx\";\nimport type { ReportLocale } from \"../../model/locale.ts\";\nimport { attemptListData, experimentListData, type AttemptListItem, type ExperimentListItem, } from \"./compute.ts\";\nimport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from \"./compute.ts\";\nexport type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from \"./compute.ts\";\nexport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport interface FailureListProps {\n readonly limit?: number;\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 失败处理台:只列 failed / errored attempt,按 startedAt 新到旧、locator 升序收口。 */\nexport const FailureList = defineComponent<FailureListProps>(async (props, ctx) => {\n const sample = props.input ?? ctx.scope;\n const all = props.rows ?? await attemptListData(sample, ctx.report.pricing);\n const failures = all\n .filter((item) => item.verdict === \"failed\" || item.verdict === \"errored\")\n .sort((left, right) => {\n const leftStarted = left.startedAt ?? Number.NEGATIVE_INFINITY;\n const rightStarted = right.startedAt ?? Number.NEGATIVE_INFINITY;\n if (leftStarted !== rightStarted)\n return leftStarted > rightStarted ? -1 : 1;\n return left.locator < right.locator ? -1 : left.locator > right.locator ? 1 : 0;\n });\n const limit = props.limit ?? 20;\n return <TableContentView data={attemptListContent(failures.slice(0, limit))} locale={props.locale} className={props.className}/>;\n});\nFailureList.displayName = \"FailureList\";\nexport interface AttemptListProps {\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */\nexport const AttemptList = defineComponent<AttemptListProps>(async (props, ctx) => {\n const rows = props.rows ?? await attemptListData(props.input ?? ctx.scope, ctx.report.pricing);\n return <TableContentView data={attemptListContent(rows)} locale={props.locale} className={props.className}/>;\n});\nAttemptList.displayName = \"AttemptList\";\nexport interface ExperimentTableProps {\n readonly comparison: ExperimentComparisonScope;\n /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */\n readonly sort?: string;\n readonly searchable?: boolean;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\nexport const ExperimentTable = defineComponent<ExperimentTableProps>(async (props, ctx) => {\n if (props.comparison.comparison.state === \"non-comparable\") {\n return <Text className={props.className}>\n {props.comparison.comparison.issues.map((issue) => issue.reason).join(\", \")}\n </Text>;\n }\n const sample = sampleForExperimentComparisonScope(props.comparison);\n const rows = await experimentListData(sample, ctx.report.pricing);\n const defaultSort = \"summary\";\n return <TableContentView data={experimentListContent(rows)} sort={props.sort ?? defaultSort} searchable={props.searchable ?? true} locale={props.locale} className={props.className}/>;\n});\nExperimentTable.displayName = \"ExperimentTable\";\n"]}
|
|
@@ -18,23 +18,21 @@ function loadExperimentMetrics(sample, pricing) {
|
|
|
18
18
|
: { passRate: metrics_ts_1.passRate, durationMs: metrics_ts_1.durationMs, tokens: metrics_ts_1.tokens, totalCostUSD: (0, metrics_ts_1.totalCostUSD)(pricing) },
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
/** 一份闭合 evidence entry
|
|
21
|
+
/** 一份闭合 evidence entry 的 typed sealed 断言清单。 */
|
|
22
22
|
function sealedEntriesOf(entry) {
|
|
23
23
|
if (entry?.state !== "available")
|
|
24
24
|
return [];
|
|
25
|
-
return entry.detail.entries
|
|
26
|
-
.map(compute_ts_1.assertionEntryViewOf)
|
|
27
|
-
.filter((sealed) => sealed !== undefined);
|
|
25
|
+
return entry.detail.entries.map(compute_ts_1.assertionEntryViewOf);
|
|
28
26
|
}
|
|
29
27
|
/** sealed score 状态 → 题型:任一 entry 有非 not-scored 的 score 就是计分制。 */
|
|
30
28
|
function evaluationKindOf(entries) {
|
|
31
|
-
return entries.some((entry) => entry.
|
|
29
|
+
return entries.some((entry) => entry.decision.contribution.state !== "not-scored") ? "points" : "pass";
|
|
32
30
|
}
|
|
33
31
|
/** 闭合断言 entries 的本轮挣分合计(纯闭合值求和,无分母语义)。 */
|
|
34
32
|
function earnedTotalOf(entries) {
|
|
35
33
|
let total = 0;
|
|
36
34
|
for (const entry of entries) {
|
|
37
|
-
const score = entry.
|
|
35
|
+
const score = entry.decision.contribution;
|
|
38
36
|
if (score.state === "earned" && score.earned !== undefined)
|
|
39
37
|
total += score.earned;
|
|
40
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sourceRoot":"","sources":["compute.ts"],"names":[],"mappings":"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","sourcesContent":["// Experiment 详情组合件的计算函数(docs/feature/reports/library.md)。\n// `experimentDetailsData(sample, experimentId)` 把固定 Sample 上属于该 experiment 的闭合\n// rows / DomainView 折成六区块共享的一份普通值;六区块只投影这份结果,不各自取数。组件源码\n// 取不到 Record reader、path、AttemptHandle 或 Effect Scope。\nimport { aggregate, attemptEvidenceView, query, type AttemptEvidenceDomainView, type CostMetricValue, type ExperimentId, type JsonValue, type MetricValue, type PricingProfile, type Sample, type SampleSnapshot, } from \"../../../analysis/index.ts\";\nimport type { VerdictState } from \"../../../eval/record/verdict.ts\";\nimport type { AttemptLocator } from \"../../../attempt-locator.ts\";\nimport { experiment } from \"../../model/aggregate.ts\";\nimport { durationMs, passRate, tokens, totalCostUSD } from \"../../model/metrics.ts\";\nimport { experimentListEvaluationKindComposition } from \"../../model/format.ts\";\nimport type { CalloutGroup } from \"../../definition/primitives/callouts-logic.ts\";\nimport type { VerdictCounts } from \"../../definition/cell.ts\";\nimport { assertionEntryViewOf, type SealedAssertionEntryView, } from \"../attempt-detail/compute.ts\";\nexport interface ExperimentIdentityView {\n readonly experimentId: ExperimentId;\n readonly agent: string;\n readonly model?: string;\n readonly reasoningEffort?: string;\n readonly flags?: Readonly<Record<string, JsonValue>>;\n}\n/** 读数摘要:全部是 Analysis 已关闭的 MetricValue,或闭合证据派生的展示值。 */\nexport interface ExperimentMetricsView {\n readonly passRate?: MetricValue;\n /** 计分制合计挣分(闭合断言 entries 的 earned 求和);通过制省略。 */\n readonly totalScore?: number;\n readonly costUSD?: CostMetricValue;\n readonly tokens?: MetricValue;\n readonly durationMs?: MetricValue;\n}\nexport interface ExperimentAttemptView {\n readonly locator: AttemptLocator;\n readonly attemptOrdinal: number;\n readonly verdict: VerdictState | \"unknown\";\n}\nexport interface ExperimentEvalView {\n readonly evalId: string;\n readonly verdict: VerdictState | \"unknown\";\n readonly attempts: readonly ExperimentAttemptView[];\n}\nexport interface ExperimentDetailsView {\n readonly identity: ExperimentIdentityView;\n readonly evaluationKind: \"pass\" | \"points\" | \"mixed\";\n /** 该 experiment 最近一次 selected run 的完成时间(epoch ms);没有 run 时为 null。 */\n readonly lastRunAt: number | null;\n readonly evals: number;\n readonly attempts: number;\n readonly evalVerdicts: VerdictCounts;\n readonly metrics: ExperimentMetricsView;\n /** Eval → Attempt 层级清单,供题目清单表格。 */\n readonly evalsView: readonly ExperimentEvalView[];\n readonly missingEvalIds: readonly string[];\n}\nexport interface ExperimentDetailsData {\n readonly experiment: ExperimentDetailsView;\n readonly catchUpCommand: string | null;\n readonly notices: readonly CalloutGroup[];\n readonly diagnostics: readonly CalloutGroup[];\n}\nexport type ExperimentMetricRow = Awaited<ReturnType<typeof loadExperimentMetrics>>[number];\ntype IncludedSlot = Extract<SampleSnapshot[\"slots\"][number], {\n readonly state: \"included\";\n}>;\ntype NotRecordedSlot = Extract<SampleSnapshot[\"slots\"][number], {\n readonly state: \"not-recorded\";\n}>;\ntype EvidenceEntry = AttemptEvidenceDomainView[\"entries\"][number];\nfunction loadExperimentMetrics(sample: Sample, pricing: PricingProfile | null) {\n return aggregate(sample, {\n by: { experiment },\n values: pricing === null\n ? { passRate, durationMs, tokens }\n : { passRate, durationMs, tokens, totalCostUSD: totalCostUSD(pricing) },\n });\n}\n/** 一份闭合 evidence entry 的可读 sealed 断言清单(DomainView 边界是 JsonValue)。 */\nfunction sealedEntriesOf(entry: EvidenceEntry | undefined): readonly SealedAssertionEntryView[] {\n if (entry?.state !== \"available\")\n return [];\n return entry.detail.entries\n .map(assertionEntryViewOf)\n .filter((sealed): sealed is SealedAssertionEntryView => sealed !== undefined);\n}\n/** sealed score 状态 → 题型:任一 entry 有非 not-scored 的 score 就是计分制。 */\nfunction evaluationKindOf(entries: readonly SealedAssertionEntryView[]): \"pass\" | \"points\" {\n return entries.some((entry) => entry.result.score.state !== \"not-scored\") ? \"points\" : \"pass\";\n}\n/** 闭合断言 entries 的本轮挣分合计(纯闭合值求和,无分母语义)。 */\nfunction earnedTotalOf(entries: readonly SealedAssertionEntryView[]): number {\n let total = 0;\n for (const entry of entries) {\n const score = entry.result.score;\n if (score.state === \"earned\" && score.earned !== undefined)\n total += score.earned;\n }\n return total;\n}\nfunction evidenceEntryOf(evidence: AttemptEvidenceDomainView, locator: AttemptLocator): EvidenceEntry | undefined {\n return evidence.entries.find((entry) => entry.attempt.locator === locator);\n}\nfunction verdictOf(entry: EvidenceEntry | undefined): VerdictState | \"unknown\" {\n return entry?.state === \"available\" ? entry.detail.verdict : \"unknown\";\n}\nfunction experimentSlots(sample: Sample, experimentId: ExperimentId) {\n return sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\" && slot.experimentId === experimentId);\n}\nfunction experimentRuns(sample: Sample, experimentId: ExperimentId) {\n return sample.snapshot.runs.filter((run) => run.experimentId === experimentId);\n}\nfunction identityOf(sample: Sample, experimentId: ExperimentId): ExperimentIdentityView {\n const runWithContext = experimentRuns(sample, experimentId).find((run) => run.context !== null);\n const context = runWithContext?.context;\n const model = context?.execution.model;\n const reasoningEffort = context?.execution.reasoningEffort;\n return {\n experimentId,\n agent: context?.execution.agentId ?? \"unknown\",\n ...(model === null || model === undefined ? {} : { model }),\n ...(reasoningEffort === null || reasoningEffort === undefined ? {} : { reasoningEffort }),\n ...(context === undefined || context === null ? {} : { flags: context.execution.flags }),\n };\n}\nfunction lastRunAtOf(sample: Sample, experimentId: ExperimentId): number | null {\n const runs = experimentRuns(sample, experimentId);\n if (runs.length === 0)\n return null;\n return runs.reduce((latest, run) => (run.completedAt > latest ? run.completedAt : latest), runs[0]!.completedAt);\n}\nfunction evalsViewOf(sample: Sample, experimentId: ExperimentId, evidence: AttemptEvidenceDomainView): ExperimentEvalView[] {\n const slots = experimentSlots(sample, experimentId);\n const byEval = new Map<string, IncludedSlot[]>();\n for (const slot of slots) {\n if (slot.state !== \"included\")\n continue;\n const list = byEval.get(slot.evalId) ?? [];\n list.push(slot);\n byEval.set(slot.evalId, list);\n }\n const rows: ExperimentEvalView[] = [];\n for (const [evalId, members] of [...byEval.entries()].sort(([left], [right]) => compareText(left, right))) {\n // 每个 eval 的判定取最高 attempt 序号的那条 included attempt(closed verdict 是\n // terminal fact,不重跑 fold)。\n const attempts = [...members].sort((left, right) => left.attemptOrdinal - right.attemptOrdinal).map((slot) => ({\n locator: slot.attempt.locator,\n attemptOrdinal: slot.attemptOrdinal,\n verdict: verdictOf(evidenceEntryOf(evidence, slot.attempt.locator)),\n }));\n const evalVerdict = attempts.at(-1)?.verdict ?? \"unknown\";\n rows.push({ evalId, verdict: evalVerdict, attempts });\n }\n return rows;\n}\nfunction evalVerdictsOf(evals: readonly ExperimentEvalView[]): VerdictCounts {\n const counts: Record<VerdictState, number> = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const row of evals) {\n if (row.verdict === \"unknown\")\n continue;\n counts[row.verdict] += 1;\n }\n return counts;\n}\nfunction missingEvalIdsOf(sample: Sample, experimentId: ExperimentId): readonly string[] {\n const ids = new Set<string>();\n for (const slot of experimentSlots(sample, experimentId)) {\n if (slot.state === \"not-recorded\")\n ids.add((slot as NotRecordedSlot).evalId);\n if (slot.state === \"core-invalid\")\n ids.add(slot.evalId);\n }\n return Object.freeze([...ids].sort(compareText));\n}\n/** sample 选择问题 + 实验缺口 → notices;Analysis issues → diagnostics。 */\nfunction noticesOf(sample: Sample, experimentId: ExperimentId, evidence: AttemptEvidenceDomainView): readonly CalloutGroup[] {\n const groups: CalloutGroup[] = [];\n for (const problem of sample.snapshot.selection.problems) {\n groups.push({\n title: \"Sample selection\",\n items: [{ level: \"warning\", message: `${problem.code}: ${problem.runId}` }],\n });\n }\n const missing = missingEvalIdsOf(sample, experimentId);\n if (missing.length > 0) {\n groups.push({\n title: \"Coverage gaps\",\n items: [{ level: \"warning\", message: `${missing.length} eval(s) without an Attempt in this experiment.` }],\n });\n }\n const experimentLocators = new Set(experimentSlots(sample, experimentId)\n .filter((slot): slot is IncludedSlot => slot.state === \"included\")\n .map((slot) => slot.attempt.locator));\n for (const entry of evidence.entries) {\n if (entry.state === \"available\" || !experimentLocators.has(entry.attempt.locator))\n continue;\n groups.push({\n title: \"Closed assertion evidence\",\n items: [{ level: \"warning\", message: `${entry.attempt.locator}: entry state ${entry.state}.` }],\n });\n }\n return groups;\n}\nfunction diagnosticsOf(metrics: readonly ExperimentMetricRow[], evidence: AttemptEvidenceDomainView, experimentId: ExperimentId): readonly CalloutGroup[] {\n const groups: CalloutGroup[] = [];\n const row = metrics.find((entry) => entry.experiment === experimentId);\n const metricIssues = row === undefined\n ? []\n : Object.values(row).flatMap((value) => typeof value === \"object\" && value !== null &&\n \"issues\" in value && Array.isArray((value as {\n issues: unknown;\n }).issues)\n ? (value as {\n issues: readonly {\n code: string;\n message: string;\n }[];\n }).issues\n : []);\n const issues = [...metricIssues, ...evidence.issues];\n if (issues.length === 0)\n return groups;\n groups.push({\n title: \"Analysis issues\",\n items: issues.map((issue) => ({ level: \"warning\" as const, message: `${issue.code}: ${issue.message}` })),\n });\n return groups;\n}\n/**\n * 收窄目标必须恰好属于当前固定 Sample:不在 sample 里按完整用户反馈报错,不静默取第一个\n * experiment——把调用方的收窄 bug 藏成错数据。\n */\nexport async function experimentDetailsData(sample: Sample, experimentId: ExperimentId, pricing: PricingProfile | null = null): Promise<ExperimentDetailsData> {\n const present = sample.snapshot.slots.some((slot) => slot.state !== \"excluded\" && slot.experimentId === experimentId);\n if (!present) {\n throw new Error(`ExperimentDetails received experiment \"${experimentId}\" which is not a member of the fixed Sample. ` +\n \"Pass an experimentId that belongs to the current Sample.\");\n }\n const [metrics, evidence] = await Promise.all([\n loadExperimentMetrics(sample, pricing),\n query(sample, { kind: \"domain-view\", view: attemptEvidenceView }),\n ]);\n const row = metrics.find((entry) => entry.experiment === experimentId);\n const included = experimentSlots(sample, experimentId).filter((slot): slot is IncludedSlot => slot.state === \"included\");\n const evalsView = evalsViewOf(sample, experimentId, evidence);\n const evidenceById = new Map<string, EvidenceEntry>();\n for (const entry of evidence.entries)\n evidenceById.set(entry.attempt.locator, entry);\n const kindByEval = new Map<string, \"pass\" | \"points\">();\n for (const evalEntry of evalsView) {\n for (const attempt of evalEntry.attempts) {\n const entry = evidenceById.get(attempt.locator);\n if (entry?.state === \"available\") {\n kindByEval.set(evalEntry.evalId, evaluationKindOf(sealedEntriesOf(entry)));\n break;\n }\n }\n }\n const evaluationKind = experimentListEvaluationKindComposition(evalsView.map((entry) => ({ evaluationKind: kindByEval.get(entry.evalId) ?? \"pass\", attempts: entry.attempts.length })));\n const scored = evalsView.flatMap((entry) => entry.attempts)\n .map((attempt) => evidenceById.get(attempt.locator))\n .reduce((sum, entry) => sum + earnedTotalOf(sealedEntriesOf(entry)), 0);\n const hasPoints = evalsView.some((entry) => kindByEval.get(entry.evalId) === \"points\");\n const experiment: ExperimentDetailsView = {\n identity: identityOf(sample, experimentId),\n evaluationKind,\n lastRunAt: lastRunAtOf(sample, experimentId),\n evals: evalsView.length,\n attempts: included.length,\n evalVerdicts: evalVerdictsOf(evalsView),\n metrics: {\n ...(row === undefined || evaluationKind === \"points\" ? {} : { passRate: row.passRate }),\n ...(row === undefined ? {} : {\n ...(pricing === null ? {} : { costUSD: (row as unknown as {\n readonly totalCostUSD: CostMetricValue;\n }).totalCostUSD }),\n tokens: row.tokens,\n durationMs: row.durationMs,\n }),\n ...(hasPoints ? { totalScore: scored } : {}),\n },\n evalsView,\n missingEvalIds: missingEvalIdsOf(sample, experimentId),\n };\n return {\n experiment,\n catchUpCommand: experiment.missingEvalIds.length > 0 ? `niceeval exp ${experimentId}` : null,\n notices: noticesOf(sample, experimentId, evidence),\n diagnostics: diagnosticsOf(metrics, evidence, experimentId),\n };\n}\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compute.js","sourceRoot":"","sources":["compute.ts"],"names":[],"mappings":"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","sourcesContent":["// Experiment 详情组合件的计算函数(docs/feature/reports/library.md)。\n// `experimentDetailsData(sample, experimentId)` 把固定 Sample 上属于该 experiment 的闭合\n// rows / DomainView 折成六区块共享的一份普通值;六区块只投影这份结果,不各自取数。组件源码\n// 取不到 Record reader、path、AttemptHandle 或 Effect Scope。\nimport { aggregate, attemptEvidenceView, query, type AttemptEvidenceDomainView, type CostMetricValue, type ExperimentId, type JsonValue, type MetricValue, type PricingProfile, type Sample, type SampleSnapshot, } from \"../../../analysis/index.ts\";\nimport type { VerdictState } from \"../../../eval/record/verdict.ts\";\nimport type { AttemptLocator } from \"../../../attempt-locator.ts\";\nimport { experiment } from \"../../model/aggregate.ts\";\nimport { durationMs, passRate, tokens, totalCostUSD } from \"../../model/metrics.ts\";\nimport { experimentListEvaluationKindComposition } from \"../../model/format.ts\";\nimport type { CalloutGroup } from \"../../definition/primitives/callouts-logic.ts\";\nimport type { VerdictCounts } from \"../../definition/cell.ts\";\nimport { assertionEntryViewOf, type SealedAssertionEntryView, } from \"../attempt-detail/compute.ts\";\nexport interface ExperimentIdentityView {\n readonly experimentId: ExperimentId;\n readonly agent: string;\n readonly model?: string;\n readonly reasoningEffort?: string;\n readonly flags?: Readonly<Record<string, JsonValue>>;\n}\n/** 读数摘要:全部是 Analysis 已关闭的 MetricValue,或闭合证据派生的展示值。 */\nexport interface ExperimentMetricsView {\n readonly passRate?: MetricValue;\n /** 计分制合计挣分(闭合断言 entries 的 earned 求和);通过制省略。 */\n readonly totalScore?: number;\n readonly costUSD?: CostMetricValue;\n readonly tokens?: MetricValue;\n readonly durationMs?: MetricValue;\n}\nexport interface ExperimentAttemptView {\n readonly locator: AttemptLocator;\n readonly attemptOrdinal: number;\n readonly verdict: VerdictState | \"unknown\";\n}\nexport interface ExperimentEvalView {\n readonly evalId: string;\n readonly verdict: VerdictState | \"unknown\";\n readonly attempts: readonly ExperimentAttemptView[];\n}\nexport interface ExperimentDetailsView {\n readonly identity: ExperimentIdentityView;\n readonly evaluationKind: \"pass\" | \"points\" | \"mixed\";\n /** 该 experiment 最近一次 selected run 的完成时间(epoch ms);没有 run 时为 null。 */\n readonly lastRunAt: number | null;\n readonly evals: number;\n readonly attempts: number;\n readonly evalVerdicts: VerdictCounts;\n readonly metrics: ExperimentMetricsView;\n /** Eval → Attempt 层级清单,供题目清单表格。 */\n readonly evalsView: readonly ExperimentEvalView[];\n readonly missingEvalIds: readonly string[];\n}\nexport interface ExperimentDetailsData {\n readonly experiment: ExperimentDetailsView;\n readonly catchUpCommand: string | null;\n readonly notices: readonly CalloutGroup[];\n readonly diagnostics: readonly CalloutGroup[];\n}\nexport type ExperimentMetricRow = Awaited<ReturnType<typeof loadExperimentMetrics>>[number];\ntype IncludedSlot = Extract<SampleSnapshot[\"slots\"][number], {\n readonly state: \"included\";\n}>;\ntype NotRecordedSlot = Extract<SampleSnapshot[\"slots\"][number], {\n readonly state: \"not-recorded\";\n}>;\ntype EvidenceEntry = AttemptEvidenceDomainView[\"entries\"][number];\nfunction loadExperimentMetrics(sample: Sample, pricing: PricingProfile | null) {\n return aggregate(sample, {\n by: { experiment },\n values: pricing === null\n ? { passRate, durationMs, tokens }\n : { passRate, durationMs, tokens, totalCostUSD: totalCostUSD(pricing) },\n });\n}\n/** 一份闭合 evidence entry 的 typed sealed 断言清单。 */\nfunction sealedEntriesOf(entry: EvidenceEntry | undefined): readonly SealedAssertionEntryView[] {\n if (entry?.state !== \"available\")\n return [];\n return entry.detail.entries.map(assertionEntryViewOf);\n}\n/** sealed score 状态 → 题型:任一 entry 有非 not-scored 的 score 就是计分制。 */\nfunction evaluationKindOf(entries: readonly SealedAssertionEntryView[]): \"pass\" | \"points\" {\n return entries.some((entry) => entry.decision.contribution.state !== \"not-scored\") ? \"points\" : \"pass\";\n}\n/** 闭合断言 entries 的本轮挣分合计(纯闭合值求和,无分母语义)。 */\nfunction earnedTotalOf(entries: readonly SealedAssertionEntryView[]): number {\n let total = 0;\n for (const entry of entries) {\n const score = entry.decision.contribution;\n if (score.state === \"earned\" && score.earned !== undefined)\n total += score.earned;\n }\n return total;\n}\nfunction evidenceEntryOf(evidence: AttemptEvidenceDomainView, locator: AttemptLocator): EvidenceEntry | undefined {\n return evidence.entries.find((entry) => entry.attempt.locator === locator);\n}\nfunction verdictOf(entry: EvidenceEntry | undefined): VerdictState | \"unknown\" {\n return entry?.state === \"available\" ? entry.detail.verdict : \"unknown\";\n}\nfunction experimentSlots(sample: Sample, experimentId: ExperimentId) {\n return sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\" && slot.experimentId === experimentId);\n}\nfunction experimentRuns(sample: Sample, experimentId: ExperimentId) {\n return sample.snapshot.runs.filter((run) => run.experimentId === experimentId);\n}\nfunction identityOf(sample: Sample, experimentId: ExperimentId): ExperimentIdentityView {\n const runWithContext = experimentRuns(sample, experimentId).find((run) => run.context !== null);\n const context = runWithContext?.context;\n const model = context?.execution.model;\n const reasoningEffort = context?.execution.reasoningEffort;\n return {\n experimentId,\n agent: context?.execution.agentId ?? \"unknown\",\n ...(model === null || model === undefined ? {} : { model }),\n ...(reasoningEffort === null || reasoningEffort === undefined ? {} : { reasoningEffort }),\n ...(context === undefined || context === null ? {} : { flags: context.execution.flags }),\n };\n}\nfunction lastRunAtOf(sample: Sample, experimentId: ExperimentId): number | null {\n const runs = experimentRuns(sample, experimentId);\n if (runs.length === 0)\n return null;\n return runs.reduce((latest, run) => (run.completedAt > latest ? run.completedAt : latest), runs[0]!.completedAt);\n}\nfunction evalsViewOf(sample: Sample, experimentId: ExperimentId, evidence: AttemptEvidenceDomainView): ExperimentEvalView[] {\n const slots = experimentSlots(sample, experimentId);\n const byEval = new Map<string, IncludedSlot[]>();\n for (const slot of slots) {\n if (slot.state !== \"included\")\n continue;\n const list = byEval.get(slot.evalId) ?? [];\n list.push(slot);\n byEval.set(slot.evalId, list);\n }\n const rows: ExperimentEvalView[] = [];\n for (const [evalId, members] of [...byEval.entries()].sort(([left], [right]) => compareText(left, right))) {\n // 每个 eval 的判定取最高 attempt 序号的那条 included attempt(closed verdict 是\n // terminal fact,不重跑 fold)。\n const attempts = [...members].sort((left, right) => left.attemptOrdinal - right.attemptOrdinal).map((slot) => ({\n locator: slot.attempt.locator,\n attemptOrdinal: slot.attemptOrdinal,\n verdict: verdictOf(evidenceEntryOf(evidence, slot.attempt.locator)),\n }));\n const evalVerdict = attempts.at(-1)?.verdict ?? \"unknown\";\n rows.push({ evalId, verdict: evalVerdict, attempts });\n }\n return rows;\n}\nfunction evalVerdictsOf(evals: readonly ExperimentEvalView[]): VerdictCounts {\n const counts: Record<VerdictState, number> = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const row of evals) {\n if (row.verdict === \"unknown\")\n continue;\n counts[row.verdict] += 1;\n }\n return counts;\n}\nfunction missingEvalIdsOf(sample: Sample, experimentId: ExperimentId): readonly string[] {\n const ids = new Set<string>();\n for (const slot of experimentSlots(sample, experimentId)) {\n if (slot.state === \"not-recorded\")\n ids.add((slot as NotRecordedSlot).evalId);\n if (slot.state === \"core-invalid\")\n ids.add(slot.evalId);\n }\n return Object.freeze([...ids].sort(compareText));\n}\n/** sample 选择问题 + 实验缺口 → notices;Analysis issues → diagnostics。 */\nfunction noticesOf(sample: Sample, experimentId: ExperimentId, evidence: AttemptEvidenceDomainView): readonly CalloutGroup[] {\n const groups: CalloutGroup[] = [];\n for (const problem of sample.snapshot.selection.problems) {\n groups.push({\n title: \"Sample selection\",\n items: [{ level: \"warning\", message: `${problem.code}: ${problem.runId}` }],\n });\n }\n const missing = missingEvalIdsOf(sample, experimentId);\n if (missing.length > 0) {\n groups.push({\n title: \"Coverage gaps\",\n items: [{ level: \"warning\", message: `${missing.length} eval(s) without an Attempt in this experiment.` }],\n });\n }\n const experimentLocators = new Set(experimentSlots(sample, experimentId)\n .filter((slot): slot is IncludedSlot => slot.state === \"included\")\n .map((slot) => slot.attempt.locator));\n for (const entry of evidence.entries) {\n if (entry.state === \"available\" || !experimentLocators.has(entry.attempt.locator))\n continue;\n groups.push({\n title: \"Closed assertion evidence\",\n items: [{ level: \"warning\", message: `${entry.attempt.locator}: entry state ${entry.state}.` }],\n });\n }\n return groups;\n}\nfunction diagnosticsOf(metrics: readonly ExperimentMetricRow[], evidence: AttemptEvidenceDomainView, experimentId: ExperimentId): readonly CalloutGroup[] {\n const groups: CalloutGroup[] = [];\n const row = metrics.find((entry) => entry.experiment === experimentId);\n const metricIssues = row === undefined\n ? []\n : Object.values(row).flatMap((value) => typeof value === \"object\" && value !== null &&\n \"issues\" in value && Array.isArray((value as {\n issues: unknown;\n }).issues)\n ? (value as {\n issues: readonly {\n code: string;\n message: string;\n }[];\n }).issues\n : []);\n const issues = [...metricIssues, ...evidence.issues];\n if (issues.length === 0)\n return groups;\n groups.push({\n title: \"Analysis issues\",\n items: issues.map((issue) => ({ level: \"warning\" as const, message: `${issue.code}: ${issue.message}` })),\n });\n return groups;\n}\n/**\n * 收窄目标必须恰好属于当前固定 Sample:不在 sample 里按完整用户反馈报错,不静默取第一个\n * experiment——把调用方的收窄 bug 藏成错数据。\n */\nexport async function experimentDetailsData(sample: Sample, experimentId: ExperimentId, pricing: PricingProfile | null = null): Promise<ExperimentDetailsData> {\n const present = sample.snapshot.slots.some((slot) => slot.state !== \"excluded\" && slot.experimentId === experimentId);\n if (!present) {\n throw new Error(`ExperimentDetails received experiment \"${experimentId}\" which is not a member of the fixed Sample. ` +\n \"Pass an experimentId that belongs to the current Sample.\");\n }\n const [metrics, evidence] = await Promise.all([\n loadExperimentMetrics(sample, pricing),\n query(sample, { kind: \"domain-view\", view: attemptEvidenceView }),\n ]);\n const row = metrics.find((entry) => entry.experiment === experimentId);\n const included = experimentSlots(sample, experimentId).filter((slot): slot is IncludedSlot => slot.state === \"included\");\n const evalsView = evalsViewOf(sample, experimentId, evidence);\n const evidenceById = new Map<string, EvidenceEntry>();\n for (const entry of evidence.entries)\n evidenceById.set(entry.attempt.locator, entry);\n const kindByEval = new Map<string, \"pass\" | \"points\">();\n for (const evalEntry of evalsView) {\n for (const attempt of evalEntry.attempts) {\n const entry = evidenceById.get(attempt.locator);\n if (entry?.state === \"available\") {\n kindByEval.set(evalEntry.evalId, evaluationKindOf(sealedEntriesOf(entry)));\n break;\n }\n }\n }\n const evaluationKind = experimentListEvaluationKindComposition(evalsView.map((entry) => ({ evaluationKind: kindByEval.get(entry.evalId) ?? \"pass\", attempts: entry.attempts.length })));\n const scored = evalsView.flatMap((entry) => entry.attempts)\n .map((attempt) => evidenceById.get(attempt.locator))\n .reduce((sum, entry) => sum + earnedTotalOf(sealedEntriesOf(entry)), 0);\n const hasPoints = evalsView.some((entry) => kindByEval.get(entry.evalId) === \"points\");\n const experiment: ExperimentDetailsView = {\n identity: identityOf(sample, experimentId),\n evaluationKind,\n lastRunAt: lastRunAtOf(sample, experimentId),\n evals: evalsView.length,\n attempts: included.length,\n evalVerdicts: evalVerdictsOf(evalsView),\n metrics: {\n ...(row === undefined || evaluationKind === \"points\" ? {} : { passRate: row.passRate }),\n ...(row === undefined ? {} : {\n ...(pricing === null ? {} : { costUSD: (row as unknown as {\n readonly totalCostUSD: CostMetricValue;\n }).totalCostUSD }),\n tokens: row.tokens,\n durationMs: row.durationMs,\n }),\n ...(hasPoints ? { totalScore: scored } : {}),\n },\n evalsView,\n missingEvalIds: missingEvalIdsOf(sample, experimentId),\n };\n return {\n experiment,\n catchUpCommand: experiment.missingEvalIds.length > 0 ? `niceeval exp ${experimentId}` : null,\n notices: noticesOf(sample, experimentId, evidence),\n diagnostics: diagnosticsOf(metrics, evidence, experimentId),\n };\n}\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n"]}
|
|
@@ -10,6 +10,7 @@ const format_ts_1 = require("../../model/format.cjs");
|
|
|
10
10
|
const locale_ts_1 = require("../../model/locale.cjs");
|
|
11
11
|
const pricing_ts_1 = require("../../model/pricing.cjs");
|
|
12
12
|
const compute_ts_1 = require("./compute.cjs");
|
|
13
|
+
const compute_ts_2 = require("../entity-lists/compute.cjs");
|
|
13
14
|
var stability_overview_tsx_1 = require("./stability-overview.cjs");
|
|
14
15
|
Object.defineProperty(exports, "StabilityOverview", { enumerable: true, get: function () { return stability_overview_tsx_1.StabilityOverview; } });
|
|
15
16
|
/**
|
|
@@ -42,9 +43,12 @@ exports.ExperimentScatter = (0, tree_ts_1.defineComponent)(async (props, ctx) =>
|
|
|
42
43
|
if (props.comparison.comparison.state === "non-comparable") {
|
|
43
44
|
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: props.comparison.comparison.issues.map((issue) => issue.reason).join(", ") }) }));
|
|
44
45
|
}
|
|
45
|
-
const
|
|
46
|
+
const sample = (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison);
|
|
47
|
+
const experiments = await (0, compute_ts_2.experimentListData)(sample, pricing);
|
|
48
|
+
const data = await (0, compute_ts_1.experimentScatterData)(sample, {
|
|
46
49
|
series: props.series,
|
|
47
50
|
connect: props.connect,
|
|
51
|
+
experiments,
|
|
48
52
|
}, pricing);
|
|
49
53
|
if (data.points.length > 0 && data.points.every((point) => point.costUSD.state === "migration-required")) {
|
|
50
54
|
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: (0, locale_ts_1.localeText)(locale, "costProjection.migrationRequired") }) }));
|