@tangle-network/agent-eval 0.200.1 → 0.202.0
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/CHANGELOG.md +9 -0
- package/dist/adapters/http.d.ts +8 -9
- package/dist/adapters/http.d.ts.map +1 -1
- package/dist/adapters/http.js +2 -2
- package/dist/adapters/http.js.map +1 -1
- package/dist/agent-profile-DDfIjdyS.d.ts.map +1 -1
- package/dist/analyst/index.d.ts +76 -76
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +6 -6
- package/dist/{analyze-runs-DFbp2gB8.js → analyze-runs-BrIibNd0.js} +47 -42
- package/dist/{analyze-runs-DFbp2gB8.js.map → analyze-runs-BrIibNd0.js.map} +1 -1
- package/dist/{ast-CP9ae9B0.js → ast-DJ6Bc7ab.js} +5 -4
- package/dist/{ast-CP9ae9B0.js.map → ast-DJ6Bc7ab.js.map} +1 -1
- package/dist/authenticity/index.d.ts +14 -15
- package/dist/authenticity/index.d.ts.map +1 -1
- package/dist/{baseline-BC-eBZ7U.js → baseline-CVKsfWTg.js} +2 -2
- package/dist/{baseline-BC-eBZ7U.js.map → baseline-CVKsfWTg.js.map} +1 -1
- package/dist/{benchmark-BeQJyrRC.js → benchmark-BywPeAUo.js} +4 -3
- package/dist/{benchmark-BeQJyrRC.js.map → benchmark-BywPeAUo.js.map} +1 -1
- package/dist/{benchmark-command-EBmuMUBo.js → benchmark-command-DFs_i62N.js} +24 -23
- package/dist/{benchmark-command-EBmuMUBo.js.map → benchmark-command-DFs_i62N.js.map} +1 -1
- package/dist/benchmarks/index.d.ts +13 -13
- package/dist/benchmarks/index.d.ts.map +1 -1
- package/dist/benchmarks/index.js +3 -3
- package/dist/{bounded-process-BBZob7vl.js → bounded-process-Cj9YjXbE.js} +3 -3
- package/dist/{bounded-process-BBZob7vl.js.map → bounded-process-Cj9YjXbE.js.map} +1 -1
- package/dist/builder-eval/index.d.ts +16 -17
- package/dist/builder-eval/index.d.ts.map +1 -1
- package/dist/builder-eval/index.js +12 -10
- package/dist/builder-eval/index.js.map +1 -1
- package/dist/campaign/index.d.ts +2 -2
- package/dist/campaign/index.js +12 -12
- package/dist/{campaign-L391bmir.js → campaign-XXmOU0R0.js} +265 -27
- package/dist/campaign-XXmOU0R0.js.map +1 -0
- package/dist/{campaign-evidence-jL_U7Ikv.js → campaign-evidence-Dt_rWPk2.js} +4 -4
- package/dist/{campaign-evidence-jL_U7Ikv.js.map → campaign-evidence-Dt_rWPk2.js.map} +1 -1
- package/dist/{chat-client-CJORSG_J.js → chat-client-DUhWNQQS.js} +5 -4
- package/dist/{chat-client-CJORSG_J.js.map → chat-client-DUhWNQQS.js.map} +1 -1
- package/dist/{chat-json-call-DnlDjpco.js → chat-json-call-Dx_sHzqm.js} +2 -2
- package/dist/{chat-json-call-DnlDjpco.js.map → chat-json-call-Dx_sHzqm.js.map} +1 -1
- package/dist/{claim-V9Zqbq0J.js → claim-BXcZw-jo.js} +2 -2
- package/dist/{claim-V9Zqbq0J.js.map → claim-BXcZw-jo.js.map} +1 -1
- package/dist/cli.js +12 -11
- package/dist/cli.js.map +1 -1
- package/dist/contract/index.d.ts +3 -3
- package/dist/contract/index.js +22 -19
- package/dist/contract/index.js.map +1 -1
- package/dist/{default-registry-xMLX160E.js → default-registry-D4qXx2aG.js} +2 -2
- package/dist/{default-registry-xMLX160E.js.map → default-registry-D4qXx2aG.js.map} +1 -1
- package/dist/{define-agent-eval-7q_UwsTt.js → define-agent-eval-CJN9dTQw.js} +10 -9
- package/dist/{define-agent-eval-7q_UwsTt.js.map → define-agent-eval-CJN9dTQw.js.map} +1 -1
- package/dist/{define-agent-eval-1YuvJpOs.d.ts → define-agent-eval-DQXLPqWc.d.ts} +2 -2
- package/dist/define-agent-eval-DQXLPqWc.d.ts.map +1 -0
- package/dist/{descriptive-1V17A-qa.js → descriptive-D9LUFk1-.js} +2 -2
- package/dist/{descriptive-1V17A-qa.js.map → descriptive-D9LUFk1-.js.map} +1 -1
- package/dist/diagnosis/index.d.ts +7 -7
- package/dist/diagnosis/index.d.ts.map +1 -1
- package/dist/diagnosis/index.js +2 -2
- package/dist/diagnosis/index.js.map +1 -1
- package/dist/{dspy-rlm-engine-B5T43BkZ.js → dspy-rlm-engine-US8YsYGq.js} +5 -5
- package/dist/{dspy-rlm-engine-B5T43BkZ.js.map → dspy-rlm-engine-US8YsYGq.js.map} +1 -1
- package/dist/{eval-campaign-GapmPHIA.js → eval-campaign-ha_aWtk7.js} +14 -12
- package/dist/{eval-campaign-GapmPHIA.js.map → eval-campaign-ha_aWtk7.js.map} +1 -1
- package/dist/evaluation.d.ts +9 -10
- package/dist/evaluation.d.ts.map +1 -1
- package/dist/experiment/index.d.ts +29 -29
- package/dist/experiment/index.d.ts.map +1 -1
- package/dist/experiment/index.js +13 -12
- package/dist/experiment/index.js.map +1 -1
- package/dist/{exporters-DEcXbvgO.js → exporters-Coiv-qO2.js} +2 -2
- package/dist/{exporters-DEcXbvgO.js.map → exporters-Coiv-qO2.js.map} +1 -1
- package/dist/{external-optimizer-process-CEXcCKqd.js → external-optimizer-process-KLcw0Vnc.js} +2 -2
- package/dist/{external-optimizer-process-CEXcCKqd.js.map → external-optimizer-process-KLcw0Vnc.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-laM1-UDV.js → external-optimizer-subprocess-CkyUUV7h.js} +4 -4
- package/dist/{external-optimizer-subprocess-laM1-UDV.js.map → external-optimizer-subprocess-CkyUUV7h.js.map} +1 -1
- package/dist/fuzz.d.ts +15 -15
- package/dist/fuzz.d.ts.map +1 -1
- package/dist/{hf-dataset-CRqtSjnR.js → hf-dataset-kjIfIK_e.js} +3 -3
- package/dist/{hf-dataset-CRqtSjnR.js.map → hf-dataset-kjIfIK_e.js.map} +1 -1
- package/dist/hosted/index.d.ts +8 -8
- package/dist/hosted/index.d.ts.map +1 -1
- package/dist/hosted/index.js +1 -1
- package/dist/{index-EkRNsLr4.d.ts → index-D1ZX28rV.d.ts} +3 -3
- package/dist/{index-EkRNsLr4.d.ts.map → index-D1ZX28rV.d.ts.map} +1 -1
- package/dist/{index-D4pC7Tvd2.d.ts → index-D4pC7Tvd.d.ts} +1 -1
- package/dist/index-D4pC7Tvd.d.ts.map +1 -0
- package/dist/{index-DNgf5gyG2.d.ts → index-DNgf5gyG.d.ts} +1 -1
- package/dist/index-DNgf5gyG.d.ts.map +1 -0
- package/dist/{index-DKmrHA02.d.ts → index-giYkbitB.d.ts} +47 -2
- package/dist/index-giYkbitB.d.ts.map +1 -0
- package/dist/index.d.ts +126 -126
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -42
- package/dist/index.js.map +1 -1
- package/dist/{integrity-BFP4kjGj.js → integrity-BvnVARVl.js} +30 -29
- package/dist/{integrity-BFP4kjGj.js.map → integrity-BvnVARVl.js.map} +1 -1
- package/dist/{integrity-BvHANvnp.js → integrity-uwK7XC-8.js} +2 -2
- package/dist/{integrity-BvHANvnp.js.map → integrity-uwK7XC-8.js.map} +1 -1
- package/dist/{internal-BMFSR8Ns.js → internal-BOe3zmjQ.js} +2 -2
- package/dist/{internal-BMFSR8Ns.js.map → internal-BOe3zmjQ.js.map} +1 -1
- package/dist/{jev-review-Cu9xtIu4.js → jev-review-DZEjDzlF.js} +7 -5
- package/dist/{jev-review-Cu9xtIu4.js.map → jev-review-DZEjDzlF.js.map} +1 -1
- package/dist/jev.d.ts +10 -10
- package/dist/jev.d.ts.map +1 -1
- package/dist/jev.js +2 -2
- package/dist/{judge-calibration-DYmaBtJr.js → judge-calibration-C5zgtiJT.js} +2 -2
- package/dist/{judge-calibration-DYmaBtJr.js.map → judge-calibration-C5zgtiJT.js.map} +1 -1
- package/dist/kind-factory-CdPPHtGZ.js.map +1 -1
- package/dist/{llm-client-c_bKHTXz.js → llm-client-Bhqoglar.js} +6 -4
- package/dist/{llm-client-c_bKHTXz.js.map → llm-client-Bhqoglar.js.map} +1 -1
- package/dist/{llm-judge-CL6f3utD.js → llm-judge-C-0P1WiT.js} +26 -21
- package/dist/{llm-judge-CL6f3utD.js.map → llm-judge-C-0P1WiT.js.map} +1 -1
- package/dist/matrix/index.d.ts +1 -1
- package/dist/matrix/index.js +1 -1
- package/dist/{matrix-_NLSWsKM.d.ts → matrix--IZKROxD.d.ts} +2 -2
- package/dist/{matrix-_NLSWsKM.d.ts.map → matrix--IZKROxD.d.ts.map} +1 -1
- package/dist/{matrix-pWinRMPl.js → matrix-DnlHn5x1.js} +8 -6
- package/dist/{matrix-pWinRMPl.js.map → matrix-DnlHn5x1.js.map} +1 -1
- package/dist/meta-eval/index.d.ts +102 -59
- package/dist/meta-eval/index.d.ts.map +1 -1
- package/dist/meta-eval/index.js +89 -25
- package/dist/meta-eval/index.js.map +1 -1
- package/dist/{mint-iCD-W43s.js → mint-vlRckJEX.js} +2 -2
- package/dist/{mint-iCD-W43s.js.map → mint-vlRckJEX.js.map} +1 -1
- package/dist/multishot/golden/index.d.ts +23 -23
- package/dist/multishot/golden/index.d.ts.map +1 -1
- package/dist/multishot/golden/index.js +1 -1
- package/dist/multishot/index.d.ts +9 -9
- package/dist/multishot/index.d.ts.map +1 -1
- package/dist/multishot/index.js +1 -1
- package/dist/openapi.json +1 -1
- package/dist/{otel-spans-CQmSxtcS.js → otel-spans-C8YIJWy1.js} +9 -4
- package/dist/{otel-spans-CQmSxtcS.js.map → otel-spans-C8YIJWy1.js.map} +1 -1
- package/dist/{outcome-store-BXlkwMPR.js → outcome-store-DUcMj-3D.js} +2 -2
- package/dist/{outcome-store-BXlkwMPR.js.map → outcome-store-DUcMj-3D.js.map} +1 -1
- package/dist/package-version-D7lQHt_-.js.map +1 -1
- package/dist/{paired-arms-DKZFVPt8.js → paired-arms-DpS_h8ON.js} +8 -5
- package/dist/{paired-arms-DKZFVPt8.js.map → paired-arms-DpS_h8ON.js.map} +1 -1
- package/dist/{paired-binary-fzkwENI4.js → paired-binary-OMBVRtc-.js} +2 -2
- package/dist/{paired-binary-fzkwENI4.js.map → paired-binary-OMBVRtc-.js.map} +1 -1
- package/dist/{paired-promotion-decision-D5B1Cxc2.js → paired-promotion-decision-DhrmjdV8.js} +5 -4
- package/dist/{paired-promotion-decision-D5B1Cxc2.js.map → paired-promotion-decision-DhrmjdV8.js.map} +1 -1
- package/dist/{paired-tests-C8iCsioC.js → paired-tests-Ccr16gcW.js} +3 -3
- package/dist/{paired-tests-C8iCsioC.js.map → paired-tests-Ccr16gcW.js.map} +1 -1
- package/dist/pipelines/index.d.ts +19 -19
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +5 -4
- package/dist/pipelines/index.js.map +1 -1
- package/dist/{power-and-mde-K_CmO3dc.js → power-and-mde-bie6i965.js} +9 -6
- package/dist/{power-and-mde-K_CmO3dc.js.map → power-and-mde-bie6i965.js.map} +1 -1
- package/dist/{produced-state-DZMW8cuF.js → produced-state-CR2tAPLf.js} +8 -5
- package/dist/{produced-state-DZMW8cuF.js.map → produced-state-CR2tAPLf.js.map} +1 -1
- package/dist/{promotion-policy-C6FAJvmZ.js → promotion-policy-BI1RxzwD.js} +4 -4
- package/dist/{promotion-policy-C6FAJvmZ.js.map → promotion-policy-BI1RxzwD.js.map} +1 -1
- package/dist/{raw-provider-sink-CXuOhLvT.js → raw-provider-sink-rB2DYxr6.js} +2 -2
- package/dist/{raw-provider-sink-CXuOhLvT.js.map → raw-provider-sink-rB2DYxr6.js.map} +1 -1
- package/dist/{release-confidence-XQm_xjhR.js → release-confidence-CiFg1EPq.js} +3 -2
- package/dist/{release-confidence-XQm_xjhR.js.map → release-confidence-CiFg1EPq.js.map} +1 -1
- package/dist/{report-command-DKJ_yAIj.js → report-command-DzPpFgjB.js} +20 -18
- package/dist/{report-command-DKJ_yAIj.js.map → report-command-DzPpFgjB.js.map} +1 -1
- package/dist/reporting.js +5 -5
- package/dist/{reward-hacking-D0XwhVWE.js → reward-hacking-C-a__ShZ.js} +5 -3
- package/dist/{reward-hacking-D0XwhVWE.js.map → reward-hacking-C-a__ShZ.js.map} +1 -1
- package/dist/rl.d.ts +186 -186
- package/dist/rl.d.ts.map +1 -1
- package/dist/rl.js +21 -17
- package/dist/rl.js.map +1 -1
- package/dist/rollout/index.d.ts +1 -1
- package/dist/rollout/index.js +5 -5
- package/dist/{rollout-B-XBReTC.js → rollout-BUQixCoc.js} +5 -5
- package/dist/{rollout-B-XBReTC.js.map → rollout-BUQixCoc.js.map} +1 -1
- package/dist/{rubric-predictive-validity-CCK-1B7w.js → rubric-predictive-validity-B0Pg-3I5.js} +3 -3
- package/dist/{rubric-predictive-validity-CCK-1B7w.js.map → rubric-predictive-validity-B0Pg-3I5.js.map} +1 -1
- package/dist/{run-record-tNnlQIrD.js → run-record-BB290Y9A.js} +5 -3
- package/dist/{run-record-tNnlQIrD.js.map → run-record-BB290Y9A.js.map} +1 -1
- package/dist/{schema-C1aaAxTf.js → schema-DAMp77zB.js} +24 -20
- package/dist/{schema-C1aaAxTf.js.map → schema-DAMp77zB.js.map} +1 -1
- package/dist/search/index.d.ts +34 -34
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +2 -2
- package/dist/{search-kernel-AVgIjXaI.js → search-kernel-Dpniloks.js} +33 -26
- package/dist/{search-kernel-AVgIjXaI.js.map → search-kernel-Dpniloks.js.map} +1 -1
- package/dist/{search-ledger-CL0-mXQ8.js → search-ledger-CXQPwdWz.js} +4 -3
- package/dist/{search-ledger-CL0-mXQ8.js.map → search-ledger-CXQPwdWz.js.map} +1 -1
- package/dist/{search-shipper-Cs6K4km9.js → search-shipper-DhhofkDX.js} +3 -6
- package/dist/{search-shipper-Cs6K4km9.js.map → search-shipper-DhhofkDX.js.map} +1 -1
- package/dist/{search-summary-DvWk0hb3.js → search-summary-C1nAHgkB.js} +4 -4
- package/dist/{search-summary-DvWk0hb3.js.map → search-summary-C1nAHgkB.js.map} +1 -1
- package/dist/{semantic-concept-judge-2SE_kXGF.js → semantic-concept-judge-BcjYg37z.js} +4 -4
- package/dist/{semantic-concept-judge-2SE_kXGF.js.map → semantic-concept-judge-BcjYg37z.js.map} +1 -1
- package/dist/{sequential-Yz3OSskl.js → sequential-DWn_np6P.js} +2 -3
- package/dist/{sequential-Yz3OSskl.js.map → sequential-DWn_np6P.js.map} +1 -1
- package/dist/{server-D56r1lhp.js → server-B4jMhqQn.js} +2 -2
- package/dist/{server-D56r1lhp.js.map → server-B4jMhqQn.js.map} +1 -1
- package/dist/{skillopt-optimization-method-B2syNik0.js → skillopt-optimization-method-Bls9t-G_.js} +9 -9
- package/dist/{skillopt-optimization-method-B2syNik0.js.map → skillopt-optimization-method-Bls9t-G_.js.map} +1 -1
- package/dist/{statistical-heldout-BAFDCo07.js → statistical-heldout-CNLOvRq_.js} +3 -3
- package/dist/{statistical-heldout-BAFDCo07.js.map → statistical-heldout-CNLOvRq_.js.map} +1 -1
- package/dist/statistical-heldout-HswMvzbP.d.ts.map +1 -1
- package/dist/{store-DNe_Uv1Q.js → store-BhNuLdJw.js} +3 -5
- package/dist/{store-DNe_Uv1Q.js.map → store-BhNuLdJw.js.map} +1 -1
- package/dist/store-C4avFjIi.d.ts.map +1 -1
- package/dist/{store-otlp-BPowgPm6.js → store-otlp-yd9lDziN.js} +2 -2
- package/dist/{store-otlp-BPowgPm6.js.map → store-otlp-yd9lDziN.js.map} +1 -1
- package/dist/{store-tool-spans-BaGakFc2.js → store-tool-spans-Biio4_Nw.js} +4 -4
- package/dist/{store-tool-spans-BaGakFc2.js.map → store-tool-spans-Biio4_Nw.js.map} +1 -1
- package/dist/storyboard/index.d.ts +20 -21
- package/dist/storyboard/index.d.ts.map +1 -1
- package/dist/{student-t-BA-Uy51p.js → student-t-BBZYka0E.js} +4 -3
- package/dist/{student-t-BA-Uy51p.js.map → student-t-BBZYka0E.js.map} +1 -1
- package/dist/{summary-report-BeYnvddy.js → summary-report-DLzptLSA.js} +8 -7
- package/dist/{summary-report-BeYnvddy.js.map → summary-report-DLzptLSA.js.map} +1 -1
- package/dist/supervisor-run/index.d.ts +25 -25
- package/dist/supervisor-run/index.d.ts.map +1 -1
- package/dist/supervisor-run/index.js +2 -2
- package/dist/{tool-waste-CJDfxH45.js → tool-waste-B-u3rzCz.js} +11 -6
- package/dist/{tool-waste-CJDfxH45.js.map → tool-waste-B-u3rzCz.js.map} +1 -1
- package/dist/trace-repair/index.d.ts +96 -96
- package/dist/trace-repair/index.d.ts.map +1 -1
- package/dist/trace-repair/index.js +1 -1
- package/dist/trace-repair/index.js.map +1 -1
- package/dist/traces.d.ts +29 -29
- package/dist/traces.d.ts.map +1 -1
- package/dist/traces.js +9 -7
- package/dist/traces.js.map +1 -1
- package/dist/trajectory-replay/index.d.ts +35 -35
- package/dist/trajectory-replay/index.d.ts.map +1 -1
- package/dist/trajectory-replay/index.js +5 -5
- package/dist/trajectory-replay/index.js.map +1 -1
- package/dist/{tree-Ki_gW7z8.js → tree-D48IJUK0.js} +39 -31
- package/dist/{tree-Ki_gW7z8.js.map → tree-D48IJUK0.js.map} +1 -1
- package/dist/wire/index.d.ts +48 -48
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +1 -1
- package/docs/evaluator-construction.md +71 -0
- package/package.json +18 -36
- package/dist/campaign-L391bmir.js.map +0 -1
- package/dist/define-agent-eval-1YuvJpOs.d.ts.map +0 -1
- package/dist/index-D4pC7Tvd2.d.ts.map +0 -1
- package/dist/index-DKmrHA02.d.ts.map +0 -1
- package/dist/index-DNgf5gyG2.d.ts.map +0 -1
package/dist/matrix/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { p as CostProvenance } from "../cost-ledger-DbQdN3nO.js";
|
|
2
2
|
import { t as DefaultVerdict } from "../verdict-E4eRNf7-.js";
|
|
3
|
-
import { a as MatrixCell, c as CellSpend, i as MatrixAxis, l as readCellSpend, n as AxisSummary, o as MatrixResult, r as CellResult, s as RunAgentMatrixOptions, t as runAgentMatrix, u as withCellSpend } from "../index-
|
|
3
|
+
import { a as MatrixCell, c as CellSpend, i as MatrixAxis, l as readCellSpend, n as AxisSummary, o as MatrixResult, r as CellResult, s as RunAgentMatrixOptions, t as runAgentMatrix, u as withCellSpend } from "../index-DNgf5gyG.js";
|
|
4
4
|
export { type AxisSummary, type CellResult, type CellSpend, type CostProvenance, type DefaultVerdict, type MatrixAxis, type MatrixCell, type MatrixResult, type RunAgentMatrixOptions, readCellSpend, runAgentMatrix, withCellSpend };
|
package/dist/matrix/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as readCellSpend, r as withCellSpend, t as runAgentMatrix } from "../matrix-
|
|
1
|
+
import { n as readCellSpend, r as withCellSpend, t as runAgentMatrix } from "../matrix-DnlHn5x1.js";
|
|
2
2
|
export { readCellSpend, runAgentMatrix, withCellSpend };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { p as CostProvenance } from "./cost-ledger-DbQdN3nO.js";
|
|
2
2
|
import { w as JudgeScore } from "./types-DfvQOe91.js";
|
|
3
|
-
import { o as MatrixResult } from "./index-
|
|
3
|
+
import { o as MatrixResult } from "./index-DNgf5gyG.js";
|
|
4
4
|
import { AgentProfile } from "@tangle-network/agent-interface";
|
|
5
5
|
//#region src/multishot/types.d.ts
|
|
6
6
|
interface MultishotMessage {
|
|
@@ -398,4 +398,4 @@ interface RunMultishotMatrixResult {
|
|
|
398
398
|
declare function runMultishotMatrix<TPersona extends MultishotPersona>(opts: RunMultishotMatrixOptions<TPersona>): Promise<RunMultishotMatrixResult>;
|
|
399
399
|
//#endregion
|
|
400
400
|
export { MultishotToolExecutor as A, MultishotFatalToolError as C, MultishotShape as D, MultishotResult as E, assertMultishotShotResult as F, MultishotTransportRequest as M, MultishotTransportResponse as N, MultishotShotResultError as O, MultishotTransportToolCall as P, MultishotDriverEmptyError as S, MultishotPersona as T, JudgeRunResult as _, MultishotCellOutput as a, runJudge as b, RunMultishotMatrixResult as c, MultishotShot as d, RunMultishotOptions as f, JudgeDimension as g, JudgeConfig as h, ConversationJudgeInput as i, MultishotTransport as j, MultishotToolDefinition as k, computeCellComposite as l, DEFAULT_JUDGE_MODEL as m, CellCompositeInput as n, MultishotJudges as o, runMultishot as p, CellCompositeScore as r, RunMultishotMatrixOptions as s, ArtifactJudgeInput as t, runMultishotMatrix as u, renderDimensions as v, MultishotMessage as w, MultishotArtifact as x, renderJsonFooter as y };
|
|
401
|
-
//# sourceMappingURL=matrix
|
|
401
|
+
//# sourceMappingURL=matrix--IZKROxD.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix
|
|
1
|
+
{"version":3,"file":"matrix--IZKROxD.d.ts","names":[],"sources":["../src/multishot/types.ts","../src/multishot/judges.ts","../src/multishot/multishot.ts","../src/multishot/matrix.ts"],"mappings":";;;;;UAIiB;EACf;EACA;EACA;EACA,YAAY;IAAQ;IAAY;IAAc,MAAM;;;UAGrC;EACf;EACA;EACA;IAAc;IAAc,MAAM;;EAClC;;UAGe;EACf,YAAY;EACZ,WAAW;EACX;EACA;;;EAGA;;;;;;;;EAQA,iBAAiB;;UAGF;EACf;EACA;IACE;IACA;IACA,YAAY;;;;;;UAOC;EACf;EACA,UAAU,MAAM;EAChB,QAAQ;EACR;EACA;EACA,SAAS;;UAGM;EACf;EACA;EACA;IAAY;IAAc;;;UAGX;EACf;IAAW;IAAyB,aAAa;;EACjD;IAAU;IAAwB;;;;EAGlC;;;;EAIA;;;;;;;;KASU,sBACV,KAAK,8BACF,QAAQ;KAED,yBACV,MAAM,yBACN;;EAEE,WAAW;EACX,SAAS;MAER;EAAU;EAAiB;;UAEf;;EAEf;;GAEC;;;;;;;;UASc,eAAe,iBAAiB;;EAE/C,eAAe,SAAS;;;EAGxB,2BAA2B,SAAS;;cAGzB,kCAAkC;WACjB;EAA5B,YAA4B;;cAMjB,gCAAgC;EAC3C,YAAY;;cAMD,iCAAiC;EAC5C,YAAY;;;;;;;;;;;;;;;;;;;iBAyBE,0BAA0B,yBAAyB,SAAS;;;cCvI/D;UAEI;;EAEf;;EAEA;;UAGe,YAAY;;EAE3B;;;EAGA,WAAW;;EAEX;;EAEA,YAAY;;EAEZ;;;EAGA,cAAc,OAAO;;EAErB;;UAGe;;EAEf,OAAO;;EAEP,MAAM;;iBAGc,SAAS,QAC7B,OAAO,YAAY,SACnB,OAAO,SACN,QAAQ;;;iBAsIK,iBAAiB,eAAe;;iBAKhC,iBAAiB,eAAe;;;UCxK/B,oBAAoB,iBAAiB;EACpD,SAAS;EACT,SAAS;;;EAGT,QAAQ,eAAe;;EAEvB,QAAQ;;EAER,gBAAgB,eAAe;;;;EAI/B,mBAAmB;EACnB;EACA;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;EAGA,gBAAgB;;;;EAIhB,iBAAiB;;;EAGjB,gBAAgB;EAChB,SAAS;;;;;;;;;;;KAYC,cAAc,iBAAiB,qBACzC,MAAM,oBAAoB,cACvB,QAAQ;;;;;;;;;;;;;;;;;iBA2BS,aAAa,iBAAiB,kBAClD,MAAM,oBAAoB,YACzB,QAAQ;;;UClFM,uBAAuB,iBAAiB;EACvD,YAAY;EACZ,SAAS;;UAGM,mBAAmB,iBAAiB;EACnD,UAAU;EACV,SAAS;;UAGM,gBAAgB,iBAAiB;;EAEhD,cAAc,YAAY,uBAAuB;;EAEjD,aAAa,YAAY,mBAAmB;;EAE5C,iBAAiB,YAAY,mBAAmB;;EAEhD;;EAEA;;UAGe;EACf;EACA,cAAc;EACd;IACE,aAAa,MAAM;MAAe;MAAc;;IAChD;;EAEF;IACE,aAAa,MAAM;MAAe;MAAc;;IAChD;;;UAIa,0BAA0B,iBAAiB;;EAE1D,UAAU;IAAQ;IAAY,OAAO;;;EAErC,UAAU;;;EAGV,QAAQ,eAAe;;EAEvB,QAAQ,gBAAgB;;EAExB,QAAQ;;EAER,gBAAgB,eAAe;;EAE/B,mBAAmB;;EAEnB;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;EAIA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;EAIA,gBAAgB;;EAEhB,iBAAiB;;;EAGjB,gBAAgB;;;;;;;;;;;;;;;EAehB,UAAU,cAAc;;;;;UAMT;EACf;EACA;EACA;;UAoBe;EACf,cAAc;;EAEd,cAAc,cAAc;;EAE5B,iBAAiB,cAAc;;;;;;;iBAQjB,qBAAqB,OAAO;EAC1C;EACA;EACA;EACA;;UAuBe;EACf,QAAQ,aAAa;;iBAGD,mBAAmB,iBAAiB,kBACxD,MAAM,0BAA0B,YAC/B,QAAQ"}
|
|
@@ -368,11 +368,13 @@ async function runAgentMatrix(opts) {
|
|
|
368
368
|
}
|
|
369
369
|
if (inFlight === 0) resolveAll?.();
|
|
370
370
|
};
|
|
371
|
-
if (opts.signal)
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
371
|
+
if (opts.signal) {
|
|
372
|
+
if (opts.signal.aborted) {
|
|
373
|
+
cellsUnscheduled = planned.length;
|
|
374
|
+
cursor = planned.length;
|
|
375
|
+
resolveAll?.();
|
|
376
|
+
} else opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
377
|
+
}
|
|
376
378
|
if (planned.length === 0) resolveAll?.();
|
|
377
379
|
else pump();
|
|
378
380
|
await done;
|
|
@@ -409,4 +411,4 @@ async function runAgentMatrix(opts) {
|
|
|
409
411
|
//#endregion
|
|
410
412
|
export { readCellSpend as n, withCellSpend as r, runAgentMatrix as t };
|
|
411
413
|
|
|
412
|
-
//# sourceMappingURL=matrix-
|
|
414
|
+
//# sourceMappingURL=matrix-DnlHn5x1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix-pWinRMPl.js","names":[],"sources":["../src/matrix/cell-spend.ts","../src/matrix/aggregation.ts","../src/matrix/runner.ts"],"sourcesContent":["/**\n * Spend carrier for a cell that fails after it has already spent money.\n *\n * `runCell` reports what a cell cost by returning a `CellResult`. A throw\n * carries no result, so the runner cannot know what the cell spent before it\n * failed: the cumulative sum the cost ceiling reads, and `totalCostUsd`, both\n * miss that money. A throw that carries a `CellSpend` closes the gap — the\n * runner bills the failed cell for the spend the carrier declares, and records\n * a cell that declared nothing as `uncaptured` instead of a zero that reads\n * like \"this cell spent nothing\".\n *\n * The carrier is read structurally, never by `instanceof`, so a throw that\n * crosses a package or realm boundary still bills.\n */\n\n/** Property key the carrier occupies on a thrown object. Stable across\n * versions — two copies of this package must agree on it. */\nconst CELL_SPEND_KEY = '__agentEvalCellSpend'\n\n/** Money and wall time a cell consumed before it threw. */\nexport interface CellSpend {\n /** KNOWN subtotal in USD. When `kind` is `uncaptured` the cell spent this\n * much AND an unknown amount more, so the value must not be read as the\n * cell's total. */\n costUsd: number\n /** Wall time the cell consumed before the throw, in milliseconds. */\n durationMs: number\n /** `observed` = provider-reported amounts, `estimated` = computed from token\n * prices, `uncaptured` = `costUsd` is a subtotal and part of the spend\n * could not be measured. */\n kind: 'observed' | 'estimated' | 'uncaptured'\n}\n\n/**\n * Return `error` carrying `spend`, for a throw site inside `runCell`:\n * `throw withCellSpend(err, { costUsd, durationMs, kind })`.\n *\n * A value that cannot hold the carrier — a thrown string or number, or a\n * frozen, sealed, or otherwise non-extensible object — is wrapped in an\n * `Error` that keeps the original as `cause`, so the spend is never dropped.\n * A later call overwrites an earlier carrier — the outer frame knows more\n * than the inner one.\n *\n * Throws `TypeError` on a non-finite or negative amount. A poisoned amount\n * would reach `cumulativeCost` and disable the cost ceiling for the whole run,\n * because `NaN >= ceiling` is false.\n */\nexport function withCellSpend(error: unknown, spend: CellSpend): unknown {\n assertAmount(spend.costUsd, 'costUsd')\n assertAmount(spend.durationMs, 'durationMs')\n if (spend.kind !== 'observed' && spend.kind !== 'estimated' && spend.kind !== 'uncaptured') {\n throw new TypeError(\n `withCellSpend: kind must be observed, estimated or uncaptured, received ${String(spend.kind)}`,\n )\n }\n const carrier: CellSpend = {\n costUsd: spend.costUsd,\n durationMs: spend.durationMs,\n kind: spend.kind,\n }\n if (typeof error === 'object' && error !== null && attach(error, carrier)) return error\n // A primitive cannot hold a property, and a frozen or sealed object refuses\n // one. Carry the spend on a fresh Error that keeps the original as `cause`\n // rather than lose it — a dropped carrier bills the cell as uncaptured,\n // which is the under-billing this module exists to prevent.\n const wrapper = new Error(`cell failed: ${messageOf(error)}`, { cause: error })\n attach(wrapper, carrier)\n return wrapper\n}\n\n/** True when the carrier landed. `defineProperty` throws on a non-extensible\n * target, so the caller must be able to fall back. */\nfunction attach(target: object, carrier: CellSpend): boolean {\n try {\n Object.defineProperty(target, CELL_SPEND_KEY, {\n value: carrier,\n enumerable: false,\n configurable: true,\n writable: true,\n })\n return true\n } catch {\n return false\n }\n}\n\nfunction messageOf(error: unknown): string {\n if (error instanceof Error) return error.message\n return String(error)\n}\n\n/** Read the spend a thrown value carries. `undefined` when the value carries\n * none, or carries one that does not satisfy `CellSpend` — the runner records\n * both as `uncaptured`. */\nexport function readCellSpend(error: unknown): CellSpend | undefined {\n if (typeof error !== 'object' || error === null) return undefined\n const raw = (error as Record<string, unknown>)[CELL_SPEND_KEY]\n if (typeof raw !== 'object' || raw === null) return undefined\n const candidate = raw as Record<string, unknown>\n if (!isAmount(candidate.costUsd) || !isAmount(candidate.durationMs)) return undefined\n const kind = candidate.kind\n if (kind !== 'observed' && kind !== 'estimated' && kind !== 'uncaptured') return undefined\n return { costUsd: candidate.costUsd, durationMs: candidate.durationMs, kind }\n}\n\n/** A number the matrix can add to a running cost or duration: finite and not\n * negative. Anything else would poison a sum the cost ceiling reads. */\nexport function isAmount(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n}\n\nfunction assertAmount(value: number, field: string): void {\n if (!isAmount(value)) {\n throw new TypeError(\n `withCellSpend: ${field} must be a finite number >= 0, received ${String(value)}`,\n )\n }\n}\n","/**\n * Per-axis aggregation of cell runs into `AxisSummary` rows.\n *\n * Pure: consumes the final `cells: [{cell, runs}]` array and returns the\n * `byAxis` table. Error runs contribute 0 to passRate and meanScore. Cost and\n * duration always count — the budget was spent regardless. A run whose cost is\n * a subtotal rather than a total raises `costUncapturedCells` for its bucket,\n * so a per-axis cost row says when it under-counts.\n */\n\nimport type { AxisSummary, CellResult, MatrixAxis, MatrixCell, MatrixResult } from './types'\n\ninterface Row<Output> {\n cell: MatrixCell\n result: CellResult<Output>\n}\n\nfunction flattenRuns<Output>(cells: MatrixResult<Output>['cells']): Row<Output>[] {\n const rows: Row<Output>[] = []\n for (const { cell, runs } of cells) {\n for (const result of runs) rows.push({ cell, result })\n }\n return rows\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0\n if (sorted.length === 1) return sorted[0] as number\n const pos = (sorted.length - 1) * q\n const lo = Math.floor(pos)\n const hi = Math.ceil(pos)\n if (lo === hi) return sorted[lo] as number\n const frac = pos - lo\n return (sorted[lo] as number) * (1 - frac) + (sorted[hi] as number) * frac\n}\n\nexport function summariseRows<Output>(\n rows: Row<Output>[],\n axisName: string,\n axisValue: string,\n): AxisSummary {\n if (rows.length === 0) {\n return {\n axisName,\n axisValue,\n cells: 0,\n passRate: 0,\n meanScore: 0,\n p50Score: 0,\n p90Score: 0,\n totalCostUsd: 0,\n costUncapturedCells: 0,\n meanDurationMs: 0,\n }\n }\n let pass = 0\n let scoreSum = 0\n let costSum = 0\n let durSum = 0\n let costUncapturedCells = 0\n const scores: number[] = []\n for (const { result } of rows) {\n const errored = result.error !== undefined\n const score = errored ? 0 : result.verdict.score\n const valid = !errored && result.verdict.valid\n if (valid) pass++\n scoreSum += score\n scores.push(score)\n costSum += result.costUsd\n durSum += result.durationMs\n if (result.costProvenance?.kind === 'uncaptured') costUncapturedCells++\n }\n scores.sort((a, b) => a - b)\n return {\n axisName,\n axisValue,\n cells: rows.length,\n passRate: pass / rows.length,\n meanScore: scoreSum / rows.length,\n p50Score: quantile(scores, 0.5),\n p90Score: quantile(scores, 0.9),\n totalCostUsd: costSum,\n costUncapturedCells,\n meanDurationMs: durSum / rows.length,\n }\n}\n\nfunction bucketBy<Output>(\n rows: Row<Output>[],\n axisName: string,\n labelFor: (id: string) => string,\n): Record<string, AxisSummary> {\n const buckets = new Map<string, Row<Output>[]>()\n for (const row of rows) {\n const slot = row.cell.axes[axisName]\n if (!slot) continue\n const id = slot.id\n let arr = buckets.get(id)\n if (!arr) {\n arr = []\n buckets.set(id, arr)\n }\n arr.push(row)\n }\n const out: Record<string, AxisSummary> = {}\n // Sorted keys for deterministic JSON serialisation.\n for (const id of [...buckets.keys()].sort()) {\n out[id] = summariseRows(buckets.get(id) as Row<Output>[], axisName, labelFor(id))\n }\n return out\n}\n\nexport function buildByAxis<Output>(\n cells: MatrixResult<Output>['cells'],\n axes: MatrixAxis<unknown>[],\n aggregateBy: string[],\n): Record<string, Record<string, AxisSummary>> {\n const rows = flattenRuns(cells)\n const byName = new Map(axes.map((a) => [a.name, a]))\n const byAxis: Record<string, Record<string, AxisSummary>> = {}\n for (const name of aggregateBy) {\n const axis = byName.get(name)\n const labelFor = (id: string): string => {\n if (!axis?.label) return id\n const found = axis.values.find((v) => v.id === id)\n if (!found) return id\n return axis.label(found.value, id)\n }\n byAxis[name] = bucketBy(rows, name, labelFor)\n }\n return byAxis\n}\n","/**\n * N-axis cartesian runner.\n *\n * Expansion order: cartesian over `axes` in declared order, then `reps` as the\n * inner-most dim → `ordinal = (cartIdx * reps) + rep`. The returned\n * `cells[]` is sorted by `ordinal` so concurrent execution does not reorder\n * the output.\n *\n * Scheduling is a sliding window of in-flight promises capped at\n * `maxConcurrency`. The window stops admitting new cells when the cost\n * ceiling trips or the abort signal fires; in-flight cells finish.\n */\n\nimport { buildByAxis } from './aggregation'\nimport { isAmount, readCellSpend } from './cell-spend'\nimport type {\n CellResult,\n CostProvenance,\n MatrixAxis,\n MatrixCell,\n MatrixResult,\n RunAgentMatrixOptions,\n} from './types'\n\ninterface BaseCell {\n axes: Record<string, { id: string; value: unknown }>\n}\n\nfunction cartesian(axes: MatrixAxis<unknown>[]): BaseCell[] {\n // Empty axes (`values=[]`) collapse the whole product to zero cells. An\n // empty `axes` array yields a single empty-axes cell — degenerate but\n // valid (caller is iterating only reps).\n if (axes.length === 0) return [{ axes: {} }]\n for (const a of axes) if (a.values.length === 0) return []\n const out: BaseCell[] = []\n const idx = new Array(axes.length).fill(0)\n while (true) {\n const slot: Record<string, { id: string; value: unknown }> = {}\n for (let i = 0; i < axes.length; i++) {\n const axis = axes[i] as MatrixAxis<unknown>\n const v = axis.values[idx[i] as number] as { id: string; value: unknown }\n slot[axis.name] = { id: v.id, value: v.value }\n }\n out.push({ axes: slot })\n // Increment like an odometer, left-most axis is fastest.\n let i = 0\n while (i < axes.length) {\n const next = (idx[i] as number) + 1\n const axis = axes[i] as MatrixAxis<unknown>\n if (next < axis.values.length) {\n idx[i] = next\n break\n }\n idx[i] = 0\n i++\n }\n if (i === axes.length) break\n }\n return out\n}\n\nfunction makeMatrixId(): string {\n // Stable id-like string: time + 8 random hex chars. Avoids node:crypto\n // import to keep the matrix dep-free.\n const t = Date.now().toString(36)\n let r = ''\n for (let i = 0; i < 8; i++) r += Math.floor(Math.random() * 16).toString(16)\n return `mtx_${t}_${r}`\n}\n\n/** Fresh per result — a shared object would let one consumer's mutation reach\n * every other cell in the run. */\nfunction uncaptured(): CostProvenance {\n return { kind: 'uncaptured', usd: null }\n}\n\nfunction makeErrorResult<Output>(err: unknown): CellResult<Output> {\n const e = err as { message?: string; name?: string }\n const spend = readCellSpend(err)\n return {\n output: undefined as unknown as Output,\n verdict: { valid: false, score: 0 },\n costUsd: spend?.costUsd ?? 0,\n durationMs: spend?.durationMs ?? 0,\n costProvenance:\n spend === undefined || spend.kind === 'uncaptured'\n ? uncaptured()\n : { kind: spend.kind, usd: spend.costUsd },\n error: {\n message: typeof e?.message === 'string' ? e.message : String(err),\n kind: typeof e?.name === 'string' ? e.name : 'Error',\n },\n }\n}\n\n/** Make a result safe to sum.\n *\n * A `costUsd` that cannot be summed fails the cell: `NaN` in `cumulativeCost`\n * makes `>= costCeiling` false forever, so one bad cell would disable the\n * ceiling for every cell after it.\n *\n * A bad `durationMs` reaches only `meanDurationMs`, never the ceiling, so it\n * cannot justify throwing away a real verdict and a real cost. It is reported\n * as 0 and warned about, and the rest of the result stands. A wall clock that\n * steps back mid-cell makes `Date.now() - startedAt` negative, so this is a\n * reachable state, not only a caller bug. */\nfunction billableResult<Output>(\n result: CellResult<Output>,\n onBadDuration: (reported: unknown) => void,\n): CellResult<Output> {\n if (!isAmount(result.costUsd)) {\n return makeErrorResult<Output>(\n new RangeError(\n `runCell reported costUsd=${String(result.costUsd)}; a cell cost must be a finite number >= 0 so the cost ceiling stays enforceable`,\n ),\n )\n }\n if (isAmount(result.durationMs)) return result\n onBadDuration(result.durationMs)\n return { ...result, durationMs: 0 }\n}\n\nexport async function runAgentMatrix<Output>(\n opts: RunAgentMatrixOptions<Output>,\n): Promise<MatrixResult<Output>> {\n const startedAt = Date.now()\n const reps = Math.max(1, opts.reps ?? 1)\n const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 4)\n const costCeiling = opts.costCeiling ?? Number.POSITIVE_INFINITY\n const aggregateBy = opts.aggregateBy ?? opts.axes.map((a) => a.name)\n if (opts.maxCellCostUsd !== undefined && !isAmount(opts.maxCellCostUsd)) {\n throw new RangeError(\n `runAgentMatrix: maxCellCostUsd must be a finite number >= 0, received ${String(opts.maxCellCostUsd)}`,\n )\n }\n\n const base = cartesian(opts.axes)\n const filtered = opts.filter\n ? base.filter((c) => (opts.filter as (b: BaseCell) => boolean)(c))\n : base\n const filteredOut = base.length - filtered.length\n\n const planned: MatrixCell[] = []\n for (let i = 0; i < filtered.length; i++) {\n for (let r = 0; r < reps; r++) {\n planned.push({\n axes: (filtered[i] as BaseCell).axes,\n rep: r,\n ordinal: i * reps + r,\n })\n }\n }\n\n const cellRecords: Array<{ cell: MatrixCell; runs: CellResult<Output>[] }> = []\n // What the ceiling reads. It runs ahead of the reported total whenever a\n // cell's cost is a subtotal and `maxCellCostUsd` bounds what it could have\n // been — a budget must assume the worst about spend it cannot see.\n let cumulativeCost = 0\n let costCeilingReached = false\n let runsExecuted = 0\n let cellsUnscheduled = 0\n let costUncapturedCells = 0\n let badDurationCells = 0\n\n const aborted = (): boolean => opts.signal?.aborted === true\n\n // Per-run abort controller forwards the external signal so cell executors\n // see cancellation. We don't expose it on `MatrixCell` — the signature on\n // `runCell` per the public API is `(cell) => Promise<...>`. Executors that\n // need cancellation use the external signal directly via closure.\n\n let inFlight = 0\n let cursor = 0\n let resolveAll: (() => void) | undefined\n const done = new Promise<void>((res) => {\n resolveAll = res\n })\n\n const pump = (): void => {\n while (inFlight < maxConcurrency && cursor < planned.length) {\n if (aborted() || costCeilingReached) {\n // Drain remaining as unscheduled.\n const left = planned.length - cursor\n cellsUnscheduled += left\n cursor = planned.length\n break\n }\n const cell = planned[cursor++] as MatrixCell\n inFlight++\n // Lazily allocate the record so cells appear in `cells[]` in any\n // arrival order; we sort by ordinal at the end.\n const record = { cell, runs: [] as CellResult<Output>[] }\n cellRecords.push(record)\n const promise: Promise<CellResult<Output>> = (async () => {\n try {\n return await opts.runCell(cell)\n } catch (err) {\n return makeErrorResult<Output>(err)\n }\n })()\n promise.then((settled) => {\n const result = billableResult(settled, (reported) => {\n badDurationCells++\n if (badDurationCells === 1) {\n // eslint-disable-next-line no-console\n console.warn(\n `[matrix] a cell reported durationMs=${String(reported)}; recorded as 0 — meanDurationMs under-reports this run`,\n )\n }\n })\n record.runs.push(result)\n runsExecuted++\n const uncapturedCost = result.costProvenance?.kind === 'uncaptured'\n cumulativeCost +=\n uncapturedCost && opts.maxCellCostUsd !== undefined\n ? Math.max(result.costUsd, opts.maxCellCostUsd)\n : result.costUsd\n if (uncapturedCost) {\n costUncapturedCells++\n if (costUncapturedCells === 1) {\n // eslint-disable-next-line no-console\n console.warn(\n \"[matrix] a cell's cost is a subtotal, not a total — totalCostUsd and the cost ceiling under-count this run\",\n )\n }\n }\n if (cumulativeCost >= costCeiling && !costCeilingReached) {\n costCeilingReached = true\n // eslint-disable-next-line no-console\n console.warn('[matrix] cost ceiling reached')\n }\n try {\n opts.onCellComplete?.(cell, result)\n } catch {\n // onCellComplete is observational — swallow throws so a noisy\n // callback can't tank the run.\n }\n inFlight--\n if (cursor < planned.length) {\n pump()\n } else if (inFlight === 0) {\n resolveAll?.()\n }\n })\n }\n if (cursor >= planned.length && inFlight === 0) resolveAll?.()\n }\n\n const onAbort = (): void => {\n // External abort: stop scheduling. In-flight cells finish; their\n // executors observe `opts.signal.aborted` directly via closure.\n if (cursor < planned.length) {\n cellsUnscheduled += planned.length - cursor\n cursor = planned.length\n }\n if (inFlight === 0) resolveAll?.()\n }\n if (opts.signal) {\n if (opts.signal.aborted) {\n cellsUnscheduled = planned.length\n cursor = planned.length\n resolveAll?.()\n } else {\n opts.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n if (planned.length === 0) {\n resolveAll?.()\n } else {\n pump()\n }\n\n await done\n if (opts.signal) opts.signal.removeEventListener('abort', onAbort)\n\n cellRecords.sort((a, b) => a.cell.ordinal - b.cell.ordinal)\n\n let pass = 0\n let scoreSum = 0\n let totalCost = 0\n let runCount = 0\n for (const { runs } of cellRecords) {\n for (const r of runs) {\n runCount++\n const errored = r.error !== undefined\n if (!errored && r.verdict.valid) pass++\n scoreSum += errored ? 0 : r.verdict.score\n totalCost += r.costUsd\n }\n }\n\n const byAxis = buildByAxis(cellRecords, opts.axes, aggregateBy)\n\n return {\n cells: cellRecords,\n byAxis,\n summary: {\n totalCells: planned.length,\n runsExecuted,\n cellsSkipped: cellsUnscheduled + filteredOut * reps,\n overallPassRate: runCount === 0 ? 0 : pass / runCount,\n overallMeanScore: runCount === 0 ? 0 : scoreSum / runCount,\n totalCostUsd: totalCost,\n costUncapturedCells,\n ceilingChargedUsd: cumulativeCost,\n durationMs: Date.now() - startedAt,\n },\n matrixId: makeMatrixId(),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"matrix-DnlHn5x1.js","names":[],"sources":["../src/matrix/cell-spend.ts","../src/matrix/aggregation.ts","../src/matrix/runner.ts"],"sourcesContent":["/**\n * Spend carrier for a cell that fails after it has already spent money.\n *\n * `runCell` reports what a cell cost by returning a `CellResult`. A throw\n * carries no result, so the runner cannot know what the cell spent before it\n * failed: the cumulative sum the cost ceiling reads, and `totalCostUsd`, both\n * miss that money. A throw that carries a `CellSpend` closes the gap — the\n * runner bills the failed cell for the spend the carrier declares, and records\n * a cell that declared nothing as `uncaptured` instead of a zero that reads\n * like \"this cell spent nothing\".\n *\n * The carrier is read structurally, never by `instanceof`, so a throw that\n * crosses a package or realm boundary still bills.\n */\n\n/** Property key the carrier occupies on a thrown object. Stable across\n * versions — two copies of this package must agree on it. */\nconst CELL_SPEND_KEY = '__agentEvalCellSpend'\n\n/** Money and wall time a cell consumed before it threw. */\nexport interface CellSpend {\n /** KNOWN subtotal in USD. When `kind` is `uncaptured` the cell spent this\n * much AND an unknown amount more, so the value must not be read as the\n * cell's total. */\n costUsd: number\n /** Wall time the cell consumed before the throw, in milliseconds. */\n durationMs: number\n /** `observed` = provider-reported amounts, `estimated` = computed from token\n * prices, `uncaptured` = `costUsd` is a subtotal and part of the spend\n * could not be measured. */\n kind: 'observed' | 'estimated' | 'uncaptured'\n}\n\n/**\n * Return `error` carrying `spend`, for a throw site inside `runCell`:\n * `throw withCellSpend(err, { costUsd, durationMs, kind })`.\n *\n * A value that cannot hold the carrier — a thrown string or number, or a\n * frozen, sealed, or otherwise non-extensible object — is wrapped in an\n * `Error` that keeps the original as `cause`, so the spend is never dropped.\n * A later call overwrites an earlier carrier — the outer frame knows more\n * than the inner one.\n *\n * Throws `TypeError` on a non-finite or negative amount. A poisoned amount\n * would reach `cumulativeCost` and disable the cost ceiling for the whole run,\n * because `NaN >= ceiling` is false.\n */\nexport function withCellSpend(error: unknown, spend: CellSpend): unknown {\n assertAmount(spend.costUsd, 'costUsd')\n assertAmount(spend.durationMs, 'durationMs')\n if (spend.kind !== 'observed' && spend.kind !== 'estimated' && spend.kind !== 'uncaptured') {\n throw new TypeError(\n `withCellSpend: kind must be observed, estimated or uncaptured, received ${String(spend.kind)}`,\n )\n }\n const carrier: CellSpend = {\n costUsd: spend.costUsd,\n durationMs: spend.durationMs,\n kind: spend.kind,\n }\n if (typeof error === 'object' && error !== null && attach(error, carrier)) return error\n // A primitive cannot hold a property, and a frozen or sealed object refuses\n // one. Carry the spend on a fresh Error that keeps the original as `cause`\n // rather than lose it — a dropped carrier bills the cell as uncaptured,\n // which is the under-billing this module exists to prevent.\n const wrapper = new Error(`cell failed: ${messageOf(error)}`, { cause: error })\n attach(wrapper, carrier)\n return wrapper\n}\n\n/** True when the carrier landed. `defineProperty` throws on a non-extensible\n * target, so the caller must be able to fall back. */\nfunction attach(target: object, carrier: CellSpend): boolean {\n try {\n Object.defineProperty(target, CELL_SPEND_KEY, {\n value: carrier,\n enumerable: false,\n configurable: true,\n writable: true,\n })\n return true\n } catch {\n return false\n }\n}\n\nfunction messageOf(error: unknown): string {\n if (error instanceof Error) return error.message\n return String(error)\n}\n\n/** Read the spend a thrown value carries. `undefined` when the value carries\n * none, or carries one that does not satisfy `CellSpend` — the runner records\n * both as `uncaptured`. */\nexport function readCellSpend(error: unknown): CellSpend | undefined {\n if (typeof error !== 'object' || error === null) return undefined\n const raw = (error as Record<string, unknown>)[CELL_SPEND_KEY]\n if (typeof raw !== 'object' || raw === null) return undefined\n const candidate = raw as Record<string, unknown>\n if (!isAmount(candidate.costUsd) || !isAmount(candidate.durationMs)) return undefined\n const kind = candidate.kind\n if (kind !== 'observed' && kind !== 'estimated' && kind !== 'uncaptured') return undefined\n return { costUsd: candidate.costUsd, durationMs: candidate.durationMs, kind }\n}\n\n/** A number the matrix can add to a running cost or duration: finite and not\n * negative. Anything else would poison a sum the cost ceiling reads. */\nexport function isAmount(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n}\n\nfunction assertAmount(value: number, field: string): void {\n if (!isAmount(value)) {\n throw new TypeError(\n `withCellSpend: ${field} must be a finite number >= 0, received ${String(value)}`,\n )\n }\n}\n","/**\n * Per-axis aggregation of cell runs into `AxisSummary` rows.\n *\n * Pure: consumes the final `cells: [{cell, runs}]` array and returns the\n * `byAxis` table. Error runs contribute 0 to passRate and meanScore. Cost and\n * duration always count — the budget was spent regardless. A run whose cost is\n * a subtotal rather than a total raises `costUncapturedCells` for its bucket,\n * so a per-axis cost row says when it under-counts.\n */\n\nimport type { AxisSummary, CellResult, MatrixAxis, MatrixCell, MatrixResult } from './types'\n\ninterface Row<Output> {\n cell: MatrixCell\n result: CellResult<Output>\n}\n\nfunction flattenRuns<Output>(cells: MatrixResult<Output>['cells']): Row<Output>[] {\n const rows: Row<Output>[] = []\n for (const { cell, runs } of cells) {\n for (const result of runs) rows.push({ cell, result })\n }\n return rows\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0\n if (sorted.length === 1) return sorted[0] as number\n const pos = (sorted.length - 1) * q\n const lo = Math.floor(pos)\n const hi = Math.ceil(pos)\n if (lo === hi) return sorted[lo] as number\n const frac = pos - lo\n return (sorted[lo] as number) * (1 - frac) + (sorted[hi] as number) * frac\n}\n\nexport function summariseRows<Output>(\n rows: Row<Output>[],\n axisName: string,\n axisValue: string,\n): AxisSummary {\n if (rows.length === 0) {\n return {\n axisName,\n axisValue,\n cells: 0,\n passRate: 0,\n meanScore: 0,\n p50Score: 0,\n p90Score: 0,\n totalCostUsd: 0,\n costUncapturedCells: 0,\n meanDurationMs: 0,\n }\n }\n let pass = 0\n let scoreSum = 0\n let costSum = 0\n let durSum = 0\n let costUncapturedCells = 0\n const scores: number[] = []\n for (const { result } of rows) {\n const errored = result.error !== undefined\n const score = errored ? 0 : result.verdict.score\n const valid = !errored && result.verdict.valid\n if (valid) pass++\n scoreSum += score\n scores.push(score)\n costSum += result.costUsd\n durSum += result.durationMs\n if (result.costProvenance?.kind === 'uncaptured') costUncapturedCells++\n }\n scores.sort((a, b) => a - b)\n return {\n axisName,\n axisValue,\n cells: rows.length,\n passRate: pass / rows.length,\n meanScore: scoreSum / rows.length,\n p50Score: quantile(scores, 0.5),\n p90Score: quantile(scores, 0.9),\n totalCostUsd: costSum,\n costUncapturedCells,\n meanDurationMs: durSum / rows.length,\n }\n}\n\nfunction bucketBy<Output>(\n rows: Row<Output>[],\n axisName: string,\n labelFor: (id: string) => string,\n): Record<string, AxisSummary> {\n const buckets = new Map<string, Row<Output>[]>()\n for (const row of rows) {\n const slot = row.cell.axes[axisName]\n if (!slot) continue\n const id = slot.id\n let arr = buckets.get(id)\n if (!arr) {\n arr = []\n buckets.set(id, arr)\n }\n arr.push(row)\n }\n const out: Record<string, AxisSummary> = {}\n // Sorted keys for deterministic JSON serialisation.\n for (const id of [...buckets.keys()].sort()) {\n out[id] = summariseRows(buckets.get(id) as Row<Output>[], axisName, labelFor(id))\n }\n return out\n}\n\nexport function buildByAxis<Output>(\n cells: MatrixResult<Output>['cells'],\n axes: MatrixAxis<unknown>[],\n aggregateBy: string[],\n): Record<string, Record<string, AxisSummary>> {\n const rows = flattenRuns(cells)\n const byName = new Map(axes.map((a) => [a.name, a]))\n const byAxis: Record<string, Record<string, AxisSummary>> = {}\n for (const name of aggregateBy) {\n const axis = byName.get(name)\n const labelFor = (id: string): string => {\n if (!axis?.label) return id\n const found = axis.values.find((v) => v.id === id)\n if (!found) return id\n return axis.label(found.value, id)\n }\n byAxis[name] = bucketBy(rows, name, labelFor)\n }\n return byAxis\n}\n","/**\n * N-axis cartesian runner.\n *\n * Expansion order: cartesian over `axes` in declared order, then `reps` as the\n * inner-most dim → `ordinal = (cartIdx * reps) + rep`. The returned\n * `cells[]` is sorted by `ordinal` so concurrent execution does not reorder\n * the output.\n *\n * Scheduling is a sliding window of in-flight promises capped at\n * `maxConcurrency`. The window stops admitting new cells when the cost\n * ceiling trips or the abort signal fires; in-flight cells finish.\n */\n\nimport { buildByAxis } from './aggregation'\nimport { isAmount, readCellSpend } from './cell-spend'\nimport type {\n CellResult,\n CostProvenance,\n MatrixAxis,\n MatrixCell,\n MatrixResult,\n RunAgentMatrixOptions,\n} from './types'\n\ninterface BaseCell {\n axes: Record<string, { id: string; value: unknown }>\n}\n\nfunction cartesian(axes: MatrixAxis<unknown>[]): BaseCell[] {\n // Empty axes (`values=[]`) collapse the whole product to zero cells. An\n // empty `axes` array yields a single empty-axes cell — degenerate but\n // valid (caller is iterating only reps).\n if (axes.length === 0) return [{ axes: {} }]\n for (const a of axes) if (a.values.length === 0) return []\n const out: BaseCell[] = []\n const idx = new Array(axes.length).fill(0)\n while (true) {\n const slot: Record<string, { id: string; value: unknown }> = {}\n for (let i = 0; i < axes.length; i++) {\n const axis = axes[i] as MatrixAxis<unknown>\n const v = axis.values[idx[i] as number] as { id: string; value: unknown }\n slot[axis.name] = { id: v.id, value: v.value }\n }\n out.push({ axes: slot })\n // Increment like an odometer, left-most axis is fastest.\n let i = 0\n while (i < axes.length) {\n const next = (idx[i] as number) + 1\n const axis = axes[i] as MatrixAxis<unknown>\n if (next < axis.values.length) {\n idx[i] = next\n break\n }\n idx[i] = 0\n i++\n }\n if (i === axes.length) break\n }\n return out\n}\n\nfunction makeMatrixId(): string {\n // Stable id-like string: time + 8 random hex chars. Avoids node:crypto\n // import to keep the matrix dep-free.\n const t = Date.now().toString(36)\n let r = ''\n for (let i = 0; i < 8; i++) r += Math.floor(Math.random() * 16).toString(16)\n return `mtx_${t}_${r}`\n}\n\n/** Fresh per result — a shared object would let one consumer's mutation reach\n * every other cell in the run. */\nfunction uncaptured(): CostProvenance {\n return { kind: 'uncaptured', usd: null }\n}\n\nfunction makeErrorResult<Output>(err: unknown): CellResult<Output> {\n const e = err as { message?: string; name?: string }\n const spend = readCellSpend(err)\n return {\n output: undefined as unknown as Output,\n verdict: { valid: false, score: 0 },\n costUsd: spend?.costUsd ?? 0,\n durationMs: spend?.durationMs ?? 0,\n costProvenance:\n spend === undefined || spend.kind === 'uncaptured'\n ? uncaptured()\n : { kind: spend.kind, usd: spend.costUsd },\n error: {\n message: typeof e?.message === 'string' ? e.message : String(err),\n kind: typeof e?.name === 'string' ? e.name : 'Error',\n },\n }\n}\n\n/** Make a result safe to sum.\n *\n * A `costUsd` that cannot be summed fails the cell: `NaN` in `cumulativeCost`\n * makes `>= costCeiling` false forever, so one bad cell would disable the\n * ceiling for every cell after it.\n *\n * A bad `durationMs` reaches only `meanDurationMs`, never the ceiling, so it\n * cannot justify throwing away a real verdict and a real cost. It is reported\n * as 0 and warned about, and the rest of the result stands. A wall clock that\n * steps back mid-cell makes `Date.now() - startedAt` negative, so this is a\n * reachable state, not only a caller bug. */\nfunction billableResult<Output>(\n result: CellResult<Output>,\n onBadDuration: (reported: unknown) => void,\n): CellResult<Output> {\n if (!isAmount(result.costUsd)) {\n return makeErrorResult<Output>(\n new RangeError(\n `runCell reported costUsd=${String(result.costUsd)}; a cell cost must be a finite number >= 0 so the cost ceiling stays enforceable`,\n ),\n )\n }\n if (isAmount(result.durationMs)) return result\n onBadDuration(result.durationMs)\n return { ...result, durationMs: 0 }\n}\n\nexport async function runAgentMatrix<Output>(\n opts: RunAgentMatrixOptions<Output>,\n): Promise<MatrixResult<Output>> {\n const startedAt = Date.now()\n const reps = Math.max(1, opts.reps ?? 1)\n const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 4)\n const costCeiling = opts.costCeiling ?? Number.POSITIVE_INFINITY\n const aggregateBy = opts.aggregateBy ?? opts.axes.map((a) => a.name)\n if (opts.maxCellCostUsd !== undefined && !isAmount(opts.maxCellCostUsd)) {\n throw new RangeError(\n `runAgentMatrix: maxCellCostUsd must be a finite number >= 0, received ${String(opts.maxCellCostUsd)}`,\n )\n }\n\n const base = cartesian(opts.axes)\n const filtered = opts.filter\n ? base.filter((c) => (opts.filter as (b: BaseCell) => boolean)(c))\n : base\n const filteredOut = base.length - filtered.length\n\n const planned: MatrixCell[] = []\n for (let i = 0; i < filtered.length; i++) {\n for (let r = 0; r < reps; r++) {\n planned.push({\n axes: (filtered[i] as BaseCell).axes,\n rep: r,\n ordinal: i * reps + r,\n })\n }\n }\n\n const cellRecords: Array<{ cell: MatrixCell; runs: CellResult<Output>[] }> = []\n // What the ceiling reads. It runs ahead of the reported total whenever a\n // cell's cost is a subtotal and `maxCellCostUsd` bounds what it could have\n // been — a budget must assume the worst about spend it cannot see.\n let cumulativeCost = 0\n let costCeilingReached = false\n let runsExecuted = 0\n let cellsUnscheduled = 0\n let costUncapturedCells = 0\n let badDurationCells = 0\n\n const aborted = (): boolean => opts.signal?.aborted === true\n\n // Per-run abort controller forwards the external signal so cell executors\n // see cancellation. We don't expose it on `MatrixCell` — the signature on\n // `runCell` per the public API is `(cell) => Promise<...>`. Executors that\n // need cancellation use the external signal directly via closure.\n\n let inFlight = 0\n let cursor = 0\n let resolveAll: (() => void) | undefined\n const done = new Promise<void>((res) => {\n resolveAll = res\n })\n\n const pump = (): void => {\n while (inFlight < maxConcurrency && cursor < planned.length) {\n if (aborted() || costCeilingReached) {\n // Drain remaining as unscheduled.\n const left = planned.length - cursor\n cellsUnscheduled += left\n cursor = planned.length\n break\n }\n const cell = planned[cursor++] as MatrixCell\n inFlight++\n // Lazily allocate the record so cells appear in `cells[]` in any\n // arrival order; we sort by ordinal at the end.\n const record = { cell, runs: [] as CellResult<Output>[] }\n cellRecords.push(record)\n const promise: Promise<CellResult<Output>> = (async () => {\n try {\n return await opts.runCell(cell)\n } catch (err) {\n return makeErrorResult<Output>(err)\n }\n })()\n promise.then((settled) => {\n const result = billableResult(settled, (reported) => {\n badDurationCells++\n if (badDurationCells === 1) {\n // eslint-disable-next-line no-console\n console.warn(\n `[matrix] a cell reported durationMs=${String(reported)}; recorded as 0 — meanDurationMs under-reports this run`,\n )\n }\n })\n record.runs.push(result)\n runsExecuted++\n const uncapturedCost = result.costProvenance?.kind === 'uncaptured'\n cumulativeCost +=\n uncapturedCost && opts.maxCellCostUsd !== undefined\n ? Math.max(result.costUsd, opts.maxCellCostUsd)\n : result.costUsd\n if (uncapturedCost) {\n costUncapturedCells++\n if (costUncapturedCells === 1) {\n // eslint-disable-next-line no-console\n console.warn(\n \"[matrix] a cell's cost is a subtotal, not a total — totalCostUsd and the cost ceiling under-count this run\",\n )\n }\n }\n if (cumulativeCost >= costCeiling && !costCeilingReached) {\n costCeilingReached = true\n // eslint-disable-next-line no-console\n console.warn('[matrix] cost ceiling reached')\n }\n try {\n opts.onCellComplete?.(cell, result)\n } catch {\n // onCellComplete is observational — swallow throws so a noisy\n // callback can't tank the run.\n }\n inFlight--\n if (cursor < planned.length) {\n pump()\n } else if (inFlight === 0) {\n resolveAll?.()\n }\n })\n }\n if (cursor >= planned.length && inFlight === 0) resolveAll?.()\n }\n\n const onAbort = (): void => {\n // External abort: stop scheduling. In-flight cells finish; their\n // executors observe `opts.signal.aborted` directly via closure.\n if (cursor < planned.length) {\n cellsUnscheduled += planned.length - cursor\n cursor = planned.length\n }\n if (inFlight === 0) resolveAll?.()\n }\n if (opts.signal) {\n if (opts.signal.aborted) {\n cellsUnscheduled = planned.length\n cursor = planned.length\n resolveAll?.()\n } else {\n opts.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n if (planned.length === 0) {\n resolveAll?.()\n } else {\n pump()\n }\n\n await done\n if (opts.signal) opts.signal.removeEventListener('abort', onAbort)\n\n cellRecords.sort((a, b) => a.cell.ordinal - b.cell.ordinal)\n\n let pass = 0\n let scoreSum = 0\n let totalCost = 0\n let runCount = 0\n for (const { runs } of cellRecords) {\n for (const r of runs) {\n runCount++\n const errored = r.error !== undefined\n if (!errored && r.verdict.valid) pass++\n scoreSum += errored ? 0 : r.verdict.score\n totalCost += r.costUsd\n }\n }\n\n const byAxis = buildByAxis(cellRecords, opts.axes, aggregateBy)\n\n return {\n cells: cellRecords,\n byAxis,\n summary: {\n totalCells: planned.length,\n runsExecuted,\n cellsSkipped: cellsUnscheduled + filteredOut * reps,\n overallPassRate: runCount === 0 ? 0 : pass / runCount,\n overallMeanScore: runCount === 0 ? 0 : scoreSum / runCount,\n totalCostUsd: totalCost,\n costUncapturedCells,\n ceilingChargedUsd: cumulativeCost,\n durationMs: Date.now() - startedAt,\n },\n matrixId: makeMatrixId(),\n }\n}\n"],"mappings":"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"}
|