@tangle-network/agent-eval 0.216.0 → 0.217.1
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 +141 -57
- package/README.md +2 -2
- package/dist/adapters/http.d.ts +3 -3
- package/dist/{agent-profile-CIA2Atnt.d.ts → agent-profile-DTt8uGP9.d.ts} +5 -18
- package/dist/agent-profile-DTt8uGP9.d.ts.map +1 -0
- package/dist/{agent-profile-cell-BYc0bxsL.js → agent-profile-cell-B1V1gUZs.js} +4 -53
- package/dist/agent-profile-cell-B1V1gUZs.js.map +1 -0
- package/dist/{agent-profile-cell-BNp-Js9F.d.ts → agent-profile-cell-BcpFbNd5.d.ts} +2 -22
- package/dist/agent-profile-cell-BcpFbNd5.d.ts.map +1 -0
- package/dist/{agreement-irr-DsTURxdr.js → agreement-irr-BhAqjluA.js} +5 -5
- package/dist/agreement-irr-BhAqjluA.js.map +1 -0
- package/dist/analyst/index.d.ts +37 -170
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +17 -192
- package/dist/analyst/index.js.map +1 -1
- package/dist/{analyze-runs-3xpby3p2.js → analyze-runs-DqPJaJ4X.js} +763 -555
- package/dist/analyze-runs-DqPJaJ4X.js.map +1 -0
- package/dist/{analyze-runs-CSDAh8A7.d.ts → analyze-runs-DyeNcenW.d.ts} +18 -16
- package/dist/analyze-runs-DyeNcenW.d.ts.map +1 -0
- package/dist/authenticity/index.d.ts +0 -23
- package/dist/authenticity/index.d.ts.map +1 -1
- package/dist/authenticity/index.js +1 -34
- package/dist/authenticity/index.js.map +1 -1
- package/dist/{benchmark-command-CByl9dxG.js → benchmark-command-xQK8nOI6.js} +591 -109
- package/dist/benchmark-command-xQK8nOI6.js.map +1 -0
- package/dist/benchmarks/index.d.ts +5 -6
- package/dist/benchmarks/index.d.ts.map +1 -1
- package/dist/benchmarks/index.js +4 -4
- package/dist/benchmarks/index.js.map +1 -1
- package/dist/builder-eval/index.d.ts +3 -3
- package/dist/builder-eval/index.js +2 -2
- package/dist/builder-eval/index.js.map +1 -1
- package/dist/campaign/index.d.ts +8 -8
- package/dist/campaign/index.js +15 -15
- package/dist/{campaign-BQ-Jujuj.js → campaign-CJGkxAQ6.js} +256 -765
- package/dist/campaign-CJGkxAQ6.js.map +1 -0
- package/dist/{campaign-evidence-OcUciD-N.js → campaign-evidence-CQYw8_0H.js} +10 -18
- package/dist/{campaign-evidence-OcUciD-N.js.map → campaign-evidence-CQYw8_0H.js.map} +1 -1
- package/dist/{canonical-BsZVgBhW.js → canonical-Dq2hOQ8L.js} +2 -2
- package/dist/{canonical-BsZVgBhW.js.map → canonical-Dq2hOQ8L.js.map} +1 -1
- package/dist/cell-spend-DEWR3nj-.js +90 -0
- package/dist/cell-spend-DEWR3nj-.js.map +1 -0
- package/dist/{chat-client-DthPOYGd.js → chat-client-ldqxYYTN.js} +2 -2
- package/dist/{chat-client-DthPOYGd.js.map → chat-client-ldqxYYTN.js.map} +1 -1
- package/dist/{chat-json-call-BrKsyspg.js → chat-json-call-DavzexSp.js} +3 -2
- package/dist/chat-json-call-DavzexSp.js.map +1 -0
- package/dist/{claim-BXcZw-jo.js → claim-BPVuyHuy.js} +4 -4
- package/dist/claim-BPVuyHuy.js.map +1 -0
- package/dist/cli.js +113 -12
- package/dist/cli.js.map +1 -1
- package/dist/{client-BzL9niqi.d.ts → client-hwo3cJjR.d.ts} +3 -16
- package/dist/client-hwo3cJjR.d.ts.map +1 -0
- package/dist/{cluster-bootstrap-B3JywQQn.js → cluster-bootstrap-DEwwhl0C.js} +3 -3
- package/dist/{cluster-bootstrap-B3JywQQn.js.map → cluster-bootstrap-DEwwhl0C.js.map} +1 -1
- package/dist/{produced-state-ZCtDBxAE.js → completion-verifier-B_jw6C9p.js} +9 -64
- package/dist/completion-verifier-B_jw6C9p.js.map +1 -0
- package/dist/contract/index.d.ts +13 -13
- package/dist/contract/index.js +1041 -1473
- package/dist/contract/index.js.map +1 -1
- package/dist/{cost-ledger-D2FnJPBF.js → cost-ledger-D0352Z4d.js} +832 -817
- package/dist/cost-ledger-D0352Z4d.js.map +1 -0
- package/dist/{cost-ledger-CO7UyEcQ.d.ts → cost-ledger-Jk62OBfF.d.ts} +12 -47
- package/dist/cost-ledger-Jk62OBfF.d.ts.map +1 -0
- package/dist/dataset-DQqhOCPt.d.ts.map +1 -1
- package/dist/{default-registry-Cn1LQ2Ve.js → default-registry-ClYjq3QE.js} +8 -11
- package/dist/default-registry-ClYjq3QE.js.map +1 -0
- package/dist/{default-registry-BrWh62zf.d.ts → default-registry-DXgLmoDI.d.ts} +7 -50
- package/dist/default-registry-DXgLmoDI.d.ts.map +1 -0
- package/dist/{define-agent-eval-Ch3MWX6k.js → define-agent-eval-BDxNlP3D.js} +10 -10
- package/dist/define-agent-eval-BDxNlP3D.js.map +1 -0
- package/dist/{define-agent-eval-CEWkX5wZ.d.ts → define-agent-eval-BIkH_gAR.d.ts} +9 -9
- package/dist/define-agent-eval-BIkH_gAR.d.ts.map +1 -0
- package/dist/{descriptive-CnU8Yq29.js → descriptive-CVNy48rR.js} +2 -2
- package/dist/{descriptive-CnU8Yq29.js.map → descriptive-CVNy48rR.js.map} +1 -1
- package/dist/diagnosis/index.d.ts +4 -14
- package/dist/diagnosis/index.d.ts.map +1 -1
- package/dist/diagnosis/index.js +67 -28
- package/dist/diagnosis/index.js.map +1 -1
- package/dist/{dspy-rlm-engine-D-KX_e64.js → dspy-rlm-engine-DhdCr1Dc.js} +5 -10
- package/dist/dspy-rlm-engine-DhdCr1Dc.js.map +1 -0
- package/dist/{emitter-HcCmFQl_.d.ts → emitter-DABYYTcH.d.ts} +5 -5
- package/dist/emitter-DABYYTcH.d.ts.map +1 -0
- package/dist/emitter-DbMXUIVP.js.map +1 -1
- package/dist/{engine-C_zNWfM8.d.ts → engine-BvZ0R-36.d.ts} +18 -22
- package/dist/engine-BvZ0R-36.d.ts.map +1 -0
- package/dist/{equal-terms-Blx9Zk5I.js → equal-terms-DbPGcVtI.js} +2 -2
- package/dist/equal-terms-DbPGcVtI.js.map +1 -0
- package/dist/{errors-Dngq5h35.js → errors-BcOs5MKW.js} +6 -8
- package/dist/{errors-Dngq5h35.js.map → errors-BcOs5MKW.js.map} +1 -1
- package/dist/{eval-campaign-4byTtqrf.js → eval-campaign-BLEfBGbA.js} +6 -6
- package/dist/{eval-campaign-4byTtqrf.js.map → eval-campaign-BLEfBGbA.js.map} +1 -1
- package/dist/{evaluation-Cn2dRZIz.d.ts → evaluation-jTjC_QQD.d.ts} +8 -8
- package/dist/evaluation-jTjC_QQD.d.ts.map +1 -0
- package/dist/evaluation.d.ts +2 -2
- package/dist/evaluation.js +1 -1
- package/dist/evaluation.js.map +1 -1
- package/dist/{exact-types-CD0lf5Qd.d.ts → exact-types-CflbJ9f3.d.ts} +2 -2
- package/dist/{exact-types-CD0lf5Qd.d.ts.map → exact-types-CflbJ9f3.d.ts.map} +1 -1
- package/dist/{exec-ChJ6d5if.js → exec-CpbtOXVt.js} +2 -24
- package/dist/{exec-ChJ6d5if.js.map → exec-CpbtOXVt.js.map} +1 -1
- package/dist/execution-tracks-CpgFPpS5.js.map +1 -1
- package/dist/experiment/index.d.ts +331 -33
- package/dist/experiment/index.d.ts.map +1 -1
- package/dist/experiment/index.js +303 -101
- package/dist/experiment/index.js.map +1 -1
- package/dist/{exporters-X4xwla8A.js → exporters-Cl6IeNAu.js} +3 -3
- package/dist/exporters-Cl6IeNAu.js.map +1 -0
- package/dist/{exporters-ChTnR90l.d.ts → exporters-Dk3oEbK_.d.ts} +2 -4
- package/dist/{exporters-ChTnR90l.d.ts.map → exporters-Dk3oEbK_.d.ts.map} +1 -1
- package/dist/{external-optimizer-process-nnsY5D_4.js → external-optimizer-process-KVFGvYX1.js} +4 -3
- package/dist/external-optimizer-process-KVFGvYX1.js.map +1 -0
- package/dist/{external-optimizer-subprocess-DcerlZSG.js → external-optimizer-subprocess-XIHBOSKt.js} +551 -553
- package/dist/external-optimizer-subprocess-XIHBOSKt.js.map +1 -0
- package/dist/{extract-usage-BrnzRJ6H.js → extract-usage-BZLU01kR.js} +2 -23
- package/dist/{extract-usage-BrnzRJ6H.js.map → extract-usage-BZLU01kR.js.map} +1 -1
- package/dist/{failure-cluster-CbgEDcFJ.d.ts → failure-cluster-DN0t63Z0.d.ts} +4 -43
- package/dist/failure-cluster-DN0t63Z0.d.ts.map +1 -0
- package/dist/{failure-taxonomy-CjabTATj.js → failure-taxonomy-Bx5oWqaW.js} +2 -19
- package/dist/{failure-taxonomy-CjabTATj.js.map → failure-taxonomy-Bx5oWqaW.js.map} +1 -1
- package/dist/{feedback-trajectory-DkaDj0dj.d.ts → feedback-trajectory-BWmhRBGu.d.ts} +8 -13
- package/dist/feedback-trajectory-BWmhRBGu.d.ts.map +1 -0
- package/dist/{semantic-concept-judge-zQBG9hHU.js → findings-store-BMVQtEsm.js} +13 -255
- package/dist/findings-store-BMVQtEsm.js.map +1 -0
- package/dist/fuzz.d.ts +20 -63
- package/dist/fuzz.d.ts.map +1 -1
- package/dist/fuzz.js +62 -108
- package/dist/fuzz.js.map +1 -1
- package/dist/{hf-dataset-BR2yhuNn.js → hf-dataset-D9f7-oX7.js} +4 -24
- package/dist/hf-dataset-D9f7-oX7.js.map +1 -0
- package/dist/hosted/index.d.ts +2 -2
- package/dist/hosted/index.js +2 -2
- package/dist/{index-DHKEAv3s.d.ts → index-9jJ2fKSX.d.ts} +2 -64
- package/dist/index-9jJ2fKSX.d.ts.map +1 -0
- package/dist/{index-oQ4aHziK.d.ts → index-BLGqZ81N.d.ts} +11 -16
- package/dist/{index-oQ4aHziK.d.ts.map → index-BLGqZ81N.d.ts.map} +1 -1
- package/dist/{index-DlH0Y9gI.d.ts → index-BiT6RtNH.d.ts} +31 -43
- package/dist/index-BiT6RtNH.d.ts.map +1 -0
- package/dist/{index-Ch9VxCpK.d.ts → index-CX-GAUpw.d.ts} +4 -8
- package/dist/index-CX-GAUpw.d.ts.map +1 -0
- package/dist/{index-CPJJr98o.d.ts → index-CiRwLv2R.d.ts} +5 -68
- package/dist/index-CiRwLv2R.d.ts.map +1 -0
- package/dist/{index-NvGBiO8H.d.ts → index-ZuWx52WG.d.ts} +266 -495
- package/dist/index-ZuWx52WG.d.ts.map +1 -0
- package/dist/index.d.ts +2256 -2165
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +514 -1192
- package/dist/index.js.map +1 -1
- package/dist/{integrity-BV1ZDf42.js → integrity-DOd9Q86O.js} +7 -12
- package/dist/integrity-DOd9Q86O.js.map +1 -0
- package/dist/{integrity-BvnVARVl.js → integrity-W4CADcFc.js} +3 -7
- package/dist/{integrity-BvnVARVl.js.map → integrity-W4CADcFc.js.map} +1 -1
- package/dist/{integrity-CCAxGVK6.d.ts → integrity-_qgZLA5p.d.ts} +4 -6
- package/dist/{integrity-CCAxGVK6.d.ts.map → integrity-_qgZLA5p.d.ts.map} +1 -1
- package/dist/{internal-CRHwS9iz.js → internal-BTK91Bqt.js} +3 -3
- package/dist/{internal-CRHwS9iz.js.map → internal-BTK91Bqt.js.map} +1 -1
- package/dist/interval-Dq9gt7jx.js +219 -0
- package/dist/interval-Dq9gt7jx.js.map +1 -0
- package/dist/interval-ohuOJurX.d.ts +47 -0
- package/dist/interval-ohuOJurX.d.ts.map +1 -0
- package/dist/{journal-DvKCvjty.js → journal-CR4QikYp.js} +110 -110
- package/dist/journal-CR4QikYp.js.map +1 -0
- package/dist/json-BhdsJaOQ.js +111 -0
- package/dist/json-BhdsJaOQ.js.map +1 -0
- package/dist/{judge-calibration-N44V04Se.js → judge-calibration-BkXMIWA4.js} +3 -3
- package/dist/{judge-calibration-N44V04Se.js.map → judge-calibration-BkXMIWA4.js.map} +1 -1
- package/dist/{judge-gate-B1qYnkpi.js → judge-gate-Co5tuh57.js} +4 -27
- package/dist/judge-gate-Co5tuh57.js.map +1 -0
- package/dist/{judge-gate-DNcUrRFA.d.ts → judge-gate-DsL0yFcb.d.ts} +9 -10
- package/dist/judge-gate-DsL0yFcb.d.ts.map +1 -0
- package/dist/{kind-factory-CbZ-6tvu.js → kind-factory-Gy4fXixd.js} +88 -17
- package/dist/kind-factory-Gy4fXixd.js.map +1 -0
- package/dist/ledger-core/index.d.ts +2 -2
- package/dist/ledger-core/index.js +4 -4
- package/dist/{ledger-core-B2hahzrt.js → ledger-core-DrJhbms9.js} +5 -84
- package/dist/ledger-core-DrJhbms9.js.map +1 -0
- package/dist/{llm-client-DQveoxSM.js → llm-client-BshCREn6.js} +90 -219
- package/dist/llm-client-BshCREn6.js.map +1 -0
- package/dist/{llm-judge-PXV7Xljl.js → llm-judge-C8jMTNNG.js} +501 -931
- package/dist/llm-judge-C8jMTNNG.js.map +1 -0
- package/dist/matrix/index.d.ts +4 -4
- package/dist/matrix/index.js +3 -2
- package/dist/{matrix-_BV9-Lk5.js → matrix-B8l-Nsxd.js} +7 -96
- package/dist/matrix-B8l-Nsxd.js.map +1 -0
- package/dist/{matrix-CHMiebFx.d.ts → matrix-DHe-dwVJ.d.ts} +10 -19
- package/dist/matrix-DHe-dwVJ.d.ts.map +1 -0
- package/dist/{paired-tests-jbwPdSz5.js → mean-BbA_JCzW.js} +45 -5
- package/dist/mean-BbA_JCzW.js.map +1 -0
- package/dist/meta-eval/index.d.ts +6 -6
- package/dist/meta-eval/index.js +10 -10
- package/dist/meta-eval/index.js.map +1 -1
- package/dist/metrics-BKaPBtIG.js.map +1 -1
- package/dist/mint-BRZXuwRi.d.ts +81 -0
- package/dist/mint-BRZXuwRi.d.ts.map +1 -0
- package/dist/{mint-Csor1BLJ.js → mint-zszyYlpA.js} +4 -4
- package/dist/{mint-Csor1BLJ.js.map → mint-zszyYlpA.js.map} +1 -1
- package/dist/{multi-layer-verifier-BUaQ4C17.d.ts → multi-layer-verifier-DEgMUk6v.d.ts} +2 -2
- package/dist/{multi-layer-verifier-BUaQ4C17.d.ts.map → multi-layer-verifier-DEgMUk6v.d.ts.map} +1 -1
- package/dist/{multiplicity-D9cjmStq.js → multiplicity-Sg0U7h8j.js} +2 -2
- package/dist/{multiplicity-D9cjmStq.js.map → multiplicity-Sg0U7h8j.js.map} +1 -1
- package/dist/multishot/golden/index.d.ts +1 -23
- package/dist/multishot/golden/index.d.ts.map +1 -1
- package/dist/multishot/golden/index.js +5 -8
- package/dist/multishot/golden/index.js.map +1 -1
- package/dist/multishot/index.d.ts +3 -12
- package/dist/multishot/index.d.ts.map +1 -1
- package/dist/multishot/index.js +4 -3
- package/dist/multishot/index.js.map +1 -1
- package/dist/nonnegative-number-DvdMxg_f.js +9 -0
- package/dist/nonnegative-number-DvdMxg_f.js.map +1 -0
- package/dist/openapi.json +114 -10
- package/dist/{otel-spans-C8YIJWy1.js → otel-spans-CdN909k1.js} +3 -3
- package/dist/{otel-spans-C8YIJWy1.js.map → otel-spans-CdN909k1.js.map} +1 -1
- package/dist/{paired-arms-DzKn0TfY.js → paired-arms-Ct4LTKc1.js} +32 -9
- package/dist/paired-arms-Ct4LTKc1.js.map +1 -0
- package/dist/{paired-binary-Q36bhn2R.js → paired-binary-B_nejA44.js} +3 -36
- package/dist/paired-binary-B_nejA44.js.map +1 -0
- package/dist/{paired-promotion-decision-DPKz8ZnF.d.ts → paired-promotion-decision-CQMJ5xGN.d.ts} +2 -34
- package/dist/paired-promotion-decision-CQMJ5xGN.d.ts.map +1 -0
- package/dist/{paired-promotion-decision-BN6IQTiu.js → paired-promotion-decision-D0SHb-ZL.js} +3 -3
- package/dist/{paired-promotion-decision-BN6IQTiu.js.map → paired-promotion-decision-D0SHb-ZL.js.map} +1 -1
- package/dist/{search-kernel-BztlERLv.js → pareto-BzsxidFD.js} +883 -861
- package/dist/pareto-BzsxidFD.js.map +1 -0
- package/dist/pipelines/index.d.ts +16 -19
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +4 -68
- package/dist/pipelines/index.js.map +1 -1
- package/dist/{power-and-mde-fK5Qocwo.js → power-and-mde-N5nU4_Ly.js} +3 -3
- package/dist/{power-and-mde-fK5Qocwo.js.map → power-and-mde-N5nU4_Ly.js.map} +1 -1
- package/dist/predicate-FdKmElA_.js +38 -0
- package/dist/predicate-FdKmElA_.js.map +1 -0
- package/dist/{prime-protocol-DcAK9pC8.js → prime-protocol-BFgGrEMP.js} +3 -3
- package/dist/prime-protocol-BFgGrEMP.js.map +1 -0
- package/dist/{prime-protocol-CEE4BR9N.d.ts → prime-protocol-BWG2DQIk.d.ts} +4 -22
- package/dist/prime-protocol-BWG2DQIk.d.ts.map +1 -0
- package/dist/profile-cell.d.ts +2 -2
- package/dist/profile-cell.js +2 -2
- package/dist/{release-confidence-BK2QCB5M.d.ts → promotion-gate-DaY95yU6.d.ts} +105 -106
- package/dist/promotion-gate-DaY95yU6.d.ts.map +1 -0
- package/dist/{promotion-policy-CWW35UWq.js → promotion-policy-6A8osGr_.js} +4 -4
- package/dist/{promotion-policy-CWW35UWq.js.map → promotion-policy-6A8osGr_.js.map} +1 -1
- package/dist/{proposal-findings-BZiMTzAF.js → proposal-findings-BbWidvUk.js} +3 -3
- package/dist/proposal-findings-BbWidvUk.js.map +1 -0
- package/dist/{query-B1D1qp2Z.js → query-B_RZ36an.js} +5 -5
- package/dist/query-B_RZ36an.js.map +1 -0
- package/dist/{query-DK1nWcmp.d.ts → query-Cmv_U8vf.d.ts} +4 -24
- package/dist/{query-DK1nWcmp.d.ts.map → query-Cmv_U8vf.d.ts.map} +1 -1
- package/dist/{random-Dn5fPWkt.js → random-DDDcC7YU.js} +2 -2
- package/dist/{random-Dn5fPWkt.js.map → random-DDDcC7YU.js.map} +1 -1
- package/dist/{raw-provider-sink-rB2DYxr6.js → raw-provider-sink-75w4FWBj.js} +2 -2
- package/dist/{raw-provider-sink-rB2DYxr6.js.map → raw-provider-sink-75w4FWBj.js.map} +1 -1
- package/dist/{redact-Cveoq6fJ.d.ts → redact-DXdlFb_U.d.ts} +4 -21
- package/dist/redact-DXdlFb_U.d.ts.map +1 -0
- package/dist/{redact-Dk1ZdJEm.js → redact-mtkTiJVk.js} +92 -98
- package/dist/redact-mtkTiJVk.js.map +1 -0
- package/dist/{registry-JYfPxcVz.d.ts → registry-ssNoHzwD.d.ts} +5 -5
- package/dist/{registry-JYfPxcVz.d.ts.map → registry-ssNoHzwD.d.ts.map} +1 -1
- package/dist/{release-confidence-Dbe9AS_X.js → release-confidence-CYIFH-fp.js} +6 -11
- package/dist/release-confidence-CYIFH-fp.js.map +1 -0
- package/dist/{report-command-y8H6RSX8.js → render-C-w2EZ6p.js} +331 -554
- package/dist/render-C-w2EZ6p.js.map +1 -0
- package/dist/reporting-html-Kvlc8oMt.js +100 -0
- package/dist/reporting-html-Kvlc8oMt.js.map +1 -0
- package/dist/reporting.d.ts +6 -6
- package/dist/reporting.js +8 -8
- package/dist/{researcher-f6mZhh58.d.ts → researcher-0ABVIdGa.d.ts} +9 -9
- package/dist/{researcher-f6mZhh58.d.ts.map → researcher-0ABVIdGa.d.ts.map} +1 -1
- package/dist/reward-DrZ71vnf.d.ts +55 -0
- package/dist/reward-DrZ71vnf.d.ts.map +1 -0
- package/dist/{reward-hacking-BFcQgkux.js → reward-hacking-ByuETaIb.js} +3 -3
- package/dist/{reward-hacking-BFcQgkux.js.map → reward-hacking-ByuETaIb.js.map} +1 -1
- package/dist/{reward-hacking-DHA7c1l8.d.ts → reward-hacking-E52wq86n.d.ts} +5 -18
- package/dist/reward-hacking-E52wq86n.d.ts.map +1 -0
- package/dist/reward-nw2xZGZG.js.map +1 -1
- package/dist/rl.d.ts +117 -295
- package/dist/rl.d.ts.map +1 -1
- package/dist/rl.js +27 -747
- package/dist/rl.js.map +1 -1
- package/dist/rollout/index.d.ts +5 -4
- package/dist/rollout/index.js +7 -8
- package/dist/{rollout-D9bKKBnZ.js → rollout-D6C50mfA.js} +88 -13
- package/dist/rollout-D6C50mfA.js.map +1 -0
- package/dist/round-decimal-COrKglMh.js +10 -0
- package/dist/round-decimal-COrKglMh.js.map +1 -0
- package/dist/{rubric-predictive-validity-BsgkBfT0.js → rubric-predictive-validity-D3_oI72N.js} +3 -3
- package/dist/{rubric-predictive-validity-BsgkBfT0.js.map → rubric-predictive-validity-D3_oI72N.js.map} +1 -1
- package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts → rubric-predictive-validity-DiwT8PbL.d.ts} +2 -2
- package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts.map → rubric-predictive-validity-DiwT8PbL.d.ts.map} +1 -1
- package/dist/{run-record-D1Hw-Jml.d.ts → run-record-CaxbLq6Y.d.ts} +5 -11
- package/dist/run-record-CaxbLq6Y.d.ts.map +1 -0
- package/dist/{run-record-ES07wfz9.js → run-record-CysKLB93.js} +3 -5
- package/dist/run-record-CysKLB93.js.map +1 -0
- package/dist/{run-record-DlTZ_lqe.js → run-record-DhEJgoPz.js} +4 -4
- package/dist/{run-record-DlTZ_lqe.js.map → run-record-DhEJgoPz.js.map} +1 -1
- package/dist/sandbox-harness-BlSOu4LX.d.ts.map +1 -1
- package/dist/{schema-CSf6qWgZ.js → schema-Bt2vLFm3.js} +2 -14
- package/dist/schema-Bt2vLFm3.js.map +1 -0
- package/dist/schema-C-ziyJD7.d.ts.map +1 -1
- package/dist/{schema-2g7trUwH.d.ts → schema-D6EVKzTB.d.ts} +4 -5
- package/dist/schema-D6EVKzTB.d.ts.map +1 -0
- package/dist/{schema-BuiujZ-g.js → schema-DxcKTzbi.js} +2 -2
- package/dist/schema-DxcKTzbi.js.map +1 -0
- package/dist/search/index.d.ts +39 -53
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/{search-kernel-CpcKH5Ih.d.ts → search-kernel-DxqjBxA-.d.ts} +18 -31
- package/dist/search-kernel-DxqjBxA-.d.ts.map +1 -0
- package/dist/{search-ledger-d7V8o9Lk.js → search-ledger-TUvB5gWH.js} +189 -199
- package/dist/search-ledger-TUvB5gWH.js.map +1 -0
- package/dist/{search-ledger-file-BqOo-bVo.js → search-ledger-file-UKCO2r8a.js} +4 -4
- package/dist/search-ledger-file-UKCO2r8a.js.map +1 -0
- package/dist/search-ledger-types-p2xKfiDJ.d.ts.map +1 -1
- package/dist/{search-shipper-er4pK5_Y.js → search-shipper-Cw2z3-td.js} +4 -4
- package/dist/search-shipper-Cw2z3-td.js.map +1 -0
- package/dist/{search-summary-CBvz3u_S.js → search-summary-DQIvJsSB.js} +5 -5
- package/dist/{search-summary-CBvz3u_S.js.map → search-summary-DQIvJsSB.js.map} +1 -1
- package/dist/{sequential-CzK5DarL.js → sequential-BVv1sjsw.js} +2 -32
- package/dist/{sequential-CzK5DarL.js.map → sequential-BVv1sjsw.js.map} +1 -1
- package/dist/{sequential-D-1PPCmM.js → sequential-CimQrbjv.js} +5 -5
- package/dist/sequential-CimQrbjv.js.map +1 -0
- package/dist/{sequential-BhsrMupG.d.ts → sequential-KwGspfeR.d.ts} +2 -9
- package/dist/{sequential-BhsrMupG.d.ts.map → sequential-KwGspfeR.d.ts.map} +1 -1
- package/dist/{sequential-eprocess-D1jKoihe.js → sequential-eprocess-DodI6RoF.js} +2 -2
- package/dist/{sequential-eprocess-D1jKoihe.js.map → sequential-eprocess-DodI6RoF.js.map} +1 -1
- package/dist/{server-DbcC7xMl.js → server-DoVbqqtJ.js} +101 -101
- package/dist/server-DoVbqqtJ.js.map +1 -0
- package/dist/{single-run-lock-fVu3MZWH.js → single-run-lock-U58yf8N6.js} +2 -2
- package/dist/{single-run-lock-fVu3MZWH.js.map → single-run-lock-U58yf8N6.js.map} +1 -1
- package/dist/{skillopt-optimization-method-CCtzralq.js → skillopt-optimization-method-kyL94-ri.js} +428 -91
- package/dist/skillopt-optimization-method-kyL94-ri.js.map +1 -0
- package/dist/{spans-D9_ehFuk.d.ts → spans-CVngGij3.d.ts} +2 -2
- package/dist/{spans-D9_ehFuk.d.ts.map → spans-CVngGij3.d.ts.map} +1 -1
- package/dist/{statistical-heldout-1Gbmex7v.js → statistical-heldout-Bksv92Th.js} +3 -3
- package/dist/statistical-heldout-Bksv92Th.js.map +1 -0
- package/dist/{statistical-heldout-BeR4bOdg.d.ts → statistical-heldout-C9AbgREN.d.ts} +8 -67
- package/dist/statistical-heldout-C9AbgREN.d.ts.map +1 -0
- package/dist/{steps-Bg5-KVx1.d.ts → steps-DlepJPwD.d.ts} +2 -56
- package/dist/steps-DlepJPwD.d.ts.map +1 -0
- package/dist/{store-C4avFjIi.d.ts → store-B3nWRy3B.d.ts} +2 -2
- package/dist/{store-C4avFjIi.d.ts.map → store-B3nWRy3B.d.ts.map} +1 -1
- package/dist/{store-otlp-DtB4Slsr.js → store-otlp-BteDAbHK.js} +135 -132
- package/dist/store-otlp-BteDAbHK.js.map +1 -0
- package/dist/{store-tool-spans-fZIigrpP.js → store-tool-spans-D5l_OfTJ.js} +9 -9
- package/dist/store-tool-spans-D5l_OfTJ.js.map +1 -0
- package/dist/{store-tool-spans-DR1SrCLK.d.ts → store-tool-spans-DZS0HWVf.d.ts} +157 -165
- package/dist/store-tool-spans-DZS0HWVf.d.ts.map +1 -0
- package/dist/storyboard/index.d.ts +4 -11
- package/dist/storyboard/index.d.ts.map +1 -1
- package/dist/storyboard/index.js +21 -19
- package/dist/storyboard/index.js.map +1 -1
- package/dist/{summary-report-DtdRucM0.js → summary-report-BsXJoYX5.js} +588 -598
- package/dist/summary-report-BsXJoYX5.js.map +1 -0
- package/dist/{summary-report-C-CtItCN.d.ts → summary-report-DM7tlml1.d.ts} +16 -20
- package/dist/summary-report-DM7tlml1.d.ts.map +1 -0
- package/dist/supervisor-run/index.d.ts +189 -153
- package/dist/supervisor-run/index.d.ts.map +1 -1
- package/dist/supervisor-run/index.js +58 -450
- package/dist/supervisor-run/index.js.map +1 -1
- package/dist/{systemone-CpTLAlqb.d.ts → systemone-Bp_Ac0p1.d.ts} +6 -6
- package/dist/{systemone-CpTLAlqb.d.ts.map → systemone-Bp_Ac0p1.d.ts.map} +1 -1
- package/dist/systemone-protocol.js +1 -1
- package/dist/{systemone-review-B_yo1xsd.d.ts → systemone-review-CwE6JGIp.d.ts} +2 -2
- package/dist/{systemone-review-B_yo1xsd.d.ts.map → systemone-review-CwE6JGIp.d.ts.map} +1 -1
- package/dist/{systemone-review-BZWfrtq1.js → systemone-review-DzdOJ8I6.js} +3 -3
- package/dist/{systemone-review-BZWfrtq1.js.map → systemone-review-DzdOJ8I6.js.map} +1 -1
- package/dist/systemone.d.ts +5 -5
- package/dist/systemone.js +5 -5
- package/dist/systemone.js.map +1 -1
- package/dist/{task-failure-attributes-DngaLdE4.js → task-failure-attributes-BMsblaDh.js} +3 -3
- package/dist/task-failure-attributes-BMsblaDh.js.map +1 -0
- package/dist/{terminal-record-BHocwFw1.js → terminal-record-78g6E4vh.js} +17 -13
- package/dist/terminal-record-78g6E4vh.js.map +1 -0
- package/dist/{tool-groups-mcxOXVlb.d.ts → tool-groups-DyNz2JZ_.d.ts} +3 -3
- package/dist/tool-groups-DyNz2JZ_.d.ts.map +1 -0
- package/dist/{tool-waste-Wi4g6Ekb.d.ts → tool-waste-CkjzWmeY.d.ts} +53 -56
- package/dist/tool-waste-CkjzWmeY.d.ts.map +1 -0
- package/dist/{tool-waste-D52PqU9Q.js → tool-waste-DLsjS_p-.js} +5 -5
- package/dist/{tool-waste-D52PqU9Q.js.map → tool-waste-DLsjS_p-.js.map} +1 -1
- package/dist/{trace-questions-DG7nqLQ7.d.ts → trace-questions-xxwgsuMi.d.ts} +5 -10
- package/dist/{trace-questions-DG7nqLQ7.d.ts.map → trace-questions-xxwgsuMi.d.ts.map} +1 -1
- package/dist/trace-repair/index.d.ts +15 -212
- package/dist/trace-repair/index.d.ts.map +1 -1
- package/dist/trace-repair/index.js +865 -987
- package/dist/trace-repair/index.js.map +1 -1
- package/dist/traces.d.ts +76 -86
- package/dist/traces.d.ts.map +1 -1
- package/dist/traces.js +13 -13
- package/dist/traces.js.map +1 -1
- package/dist/trajectory-replay/index.d.ts +3 -117
- package/dist/trajectory-replay/index.d.ts.map +1 -1
- package/dist/trajectory-replay/index.js +98 -56
- package/dist/trajectory-replay/index.js.map +1 -1
- package/dist/{tree-rXLW3M_4.js → tree-BGRglkKd.js} +2355 -2414
- package/dist/tree-BGRglkKd.js.map +1 -0
- package/dist/{types-B3jzCp0p.js → types-BXgASBCL.js} +2 -2
- package/dist/{types-B3jzCp0p.js.map → types-BXgASBCL.js.map} +1 -1
- package/dist/{types-oKRhQAde.d.ts → types-CW8ewATZ.d.ts} +5 -114
- package/dist/types-CW8ewATZ.d.ts.map +1 -0
- package/dist/{types-BqkVmHfv.d.ts → types-CmXY0PQf.d.ts} +2 -4
- package/dist/types-CmXY0PQf.d.ts.map +1 -0
- package/dist/{types-DBZ7keha.d.ts → types-D-mgRzlh.d.ts} +9 -72
- package/dist/types-D-mgRzlh.d.ts.map +1 -0
- package/dist/{types-B4C5nFw6.d.ts → types-D8GhJoHk.d.ts} +79 -75
- package/dist/types-D8GhJoHk.d.ts.map +1 -0
- package/dist/{types-IXD2HJzu.js → types-DqFMNTgK.js} +2 -4
- package/dist/types-DqFMNTgK.js.map +1 -0
- package/dist/{types-CfZMIzB_.d.ts → types-DtMbFw6U.d.ts} +3 -3
- package/dist/{types-CfZMIzB_.d.ts.map → types-DtMbFw6U.d.ts.map} +1 -1
- package/dist/{verdict-DhPoXApk.js → verdict-BGQmxQ8A.js} +3 -3
- package/dist/verdict-BGQmxQ8A.js.map +1 -0
- package/dist/{verdict-E4eRNf7-.d.ts → verdict-C24NELtN.d.ts} +2 -15
- package/dist/{verdict-E4eRNf7-.d.ts.map → verdict-C24NELtN.d.ts.map} +1 -1
- package/dist/{verdict-cache-BQEsVy9n.js → verdict-cache-CL_7tePD.js} +2 -2
- package/dist/verdict-cache-CL_7tePD.js.map +1 -0
- package/dist/wire/index.d.ts +32 -411
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +2 -2
- package/docs/changes/jev-evidence-review.md +1 -1
- package/docs/changes/jev-product-adoption.md +1 -1
- package/docs/changes/jev-recorded-evidence.md +1 -1
- package/docs/design/mlbenchmarks-book-review.md +1 -1
- package/docs/design/mlbenchmarks-review/probes.mts +23 -31
- package/docs/design/statistics-decisions.md +17 -17
- package/docs/design.md +1 -1
- package/docs/evaluation-integrity.md +1 -1
- package/docs/experiment.md +1 -1
- package/docs/proofs/campaign-attempt-retention-20261001/README.md +2 -2
- package/docs/public-api.md +138 -529
- package/docs/rollout.md +1 -1
- package/docs/trace-repair-admission.md +1 -1
- package/docs/wire-protocol.md +1 -1
- package/package.json +1 -1
- package/dist/active-curriculum-B_Lc9kfO.js +0 -61
- package/dist/active-curriculum-B_Lc9kfO.js.map +0 -1
- package/dist/agent-profile-CIA2Atnt.d.ts.map +0 -1
- package/dist/agent-profile-cell-BNp-Js9F.d.ts.map +0 -1
- package/dist/agent-profile-cell-BYc0bxsL.js.map +0 -1
- package/dist/agreement-irr-DsTURxdr.js.map +0 -1
- package/dist/analyze-runs-3xpby3p2.js.map +0 -1
- package/dist/analyze-runs-CSDAh8A7.d.ts.map +0 -1
- package/dist/ast-DJ6Bc7ab.js +0 -558
- package/dist/ast-DJ6Bc7ab.js.map +0 -1
- package/dist/ast-hI-vjW6J.d.ts +0 -457
- package/dist/ast-hI-vjW6J.d.ts.map +0 -1
- package/dist/baseline-Dm8966du.js +0 -259
- package/dist/baseline-Dm8966du.js.map +0 -1
- package/dist/benchmark-BywPeAUo.js +0 -562
- package/dist/benchmark-BywPeAUo.js.map +0 -1
- package/dist/benchmark-command-CByl9dxG.js.map +0 -1
- package/dist/campaign-BQ-Jujuj.js.map +0 -1
- package/dist/chat-json-call-BrKsyspg.js.map +0 -1
- package/dist/claim-BXcZw-jo.js.map +0 -1
- package/dist/claude-jsonl-dZir12m6.js +0 -86
- package/dist/claude-jsonl-dZir12m6.js.map +0 -1
- package/dist/client-BzL9niqi.d.ts.map +0 -1
- package/dist/cost-ledger-CO7UyEcQ.d.ts.map +0 -1
- package/dist/cost-ledger-D2FnJPBF.js.map +0 -1
- package/dist/counterfactual-CPaWN99-.d.ts +0 -60
- package/dist/counterfactual-CPaWN99-.d.ts.map +0 -1
- package/dist/counterfactual-DtMWvn7D.js +0 -98
- package/dist/counterfactual-DtMWvn7D.js.map +0 -1
- package/dist/default-registry-BrWh62zf.d.ts.map +0 -1
- package/dist/default-registry-Cn1LQ2Ve.js.map +0 -1
- package/dist/define-agent-eval-CEWkX5wZ.d.ts.map +0 -1
- package/dist/define-agent-eval-Ch3MWX6k.js.map +0 -1
- package/dist/dspy-rlm-engine-D-KX_e64.js.map +0 -1
- package/dist/effect-sizes-DiH8MGOH.js +0 -82
- package/dist/effect-sizes-DiH8MGOH.js.map +0 -1
- package/dist/emitter-HcCmFQl_.d.ts.map +0 -1
- package/dist/engine-C_zNWfM8.d.ts.map +0 -1
- package/dist/equal-terms-Blx9Zk5I.js.map +0 -1
- package/dist/evaluation-Cn2dRZIz.d.ts.map +0 -1
- package/dist/exporters-X4xwla8A.js.map +0 -1
- package/dist/external-optimizer-process-nnsY5D_4.js.map +0 -1
- package/dist/external-optimizer-subprocess-DcerlZSG.js.map +0 -1
- package/dist/failure-cluster-CbgEDcFJ.d.ts.map +0 -1
- package/dist/feedback-trajectory-DkaDj0dj.d.ts.map +0 -1
- package/dist/hf-dataset-BR2yhuNn.js.map +0 -1
- package/dist/index-CPJJr98o.d.ts.map +0 -1
- package/dist/index-Ch9VxCpK.d.ts.map +0 -1
- package/dist/index-DHKEAv3s.d.ts.map +0 -1
- package/dist/index-DlH0Y9gI.d.ts.map +0 -1
- package/dist/index-NvGBiO8H.d.ts.map +0 -1
- package/dist/integrity-BV1ZDf42.js.map +0 -1
- package/dist/journal-DvKCvjty.js.map +0 -1
- package/dist/judge-gate-B1qYnkpi.js.map +0 -1
- package/dist/judge-gate-DNcUrRFA.d.ts.map +0 -1
- package/dist/kind-factory-CbZ-6tvu.js.map +0 -1
- package/dist/ledger-core-B2hahzrt.js.map +0 -1
- package/dist/llm-client-DQveoxSM.js.map +0 -1
- package/dist/llm-judge-PXV7Xljl.js.map +0 -1
- package/dist/matrix-CHMiebFx.d.ts.map +0 -1
- package/dist/matrix-_BV9-Lk5.js.map +0 -1
- package/dist/mint-DCGoBYhB.d.ts +0 -155
- package/dist/mint-DCGoBYhB.d.ts.map +0 -1
- package/dist/normal-DsJZtrJc.js +0 -25
- package/dist/normal-DsJZtrJc.js.map +0 -1
- package/dist/paired-arms-DzKn0TfY.js.map +0 -1
- package/dist/paired-binary-Q36bhn2R.js.map +0 -1
- package/dist/paired-promotion-decision-DPKz8ZnF.d.ts.map +0 -1
- package/dist/paired-tests-jbwPdSz5.js.map +0 -1
- package/dist/prime-protocol-CEE4BR9N.d.ts.map +0 -1
- package/dist/prime-protocol-DcAK9pC8.js.map +0 -1
- package/dist/produced-state-ZCtDBxAE.js.map +0 -1
- package/dist/proposal-findings-BZiMTzAF.js.map +0 -1
- package/dist/query-B1D1qp2Z.js.map +0 -1
- package/dist/redact-Cveoq6fJ.d.ts.map +0 -1
- package/dist/redact-Dk1ZdJEm.js.map +0 -1
- package/dist/release-confidence-BK2QCB5M.d.ts.map +0 -1
- package/dist/release-confidence-Dbe9AS_X.js.map +0 -1
- package/dist/report-command-y8H6RSX8.js.map +0 -1
- package/dist/reward-hacking-DHA7c1l8.d.ts.map +0 -1
- package/dist/rollout-D9bKKBnZ.js.map +0 -1
- package/dist/run-record-D1Hw-Jml.d.ts.map +0 -1
- package/dist/run-record-ES07wfz9.js.map +0 -1
- package/dist/schema-2g7trUwH.d.ts.map +0 -1
- package/dist/schema-BuiujZ-g.js.map +0 -1
- package/dist/schema-CSf6qWgZ.js.map +0 -1
- package/dist/search-kernel-BztlERLv.js.map +0 -1
- package/dist/search-kernel-CpcKH5Ih.d.ts.map +0 -1
- package/dist/search-ledger-d7V8o9Lk.js.map +0 -1
- package/dist/search-ledger-file-BqOo-bVo.js.map +0 -1
- package/dist/search-shipper-er4pK5_Y.js.map +0 -1
- package/dist/semantic-concept-judge-zQBG9hHU.js.map +0 -1
- package/dist/sequential-D-1PPCmM.js.map +0 -1
- package/dist/server-DbcC7xMl.js.map +0 -1
- package/dist/skillopt-optimization-method-CCtzralq.js.map +0 -1
- package/dist/statistical-heldout-1Gbmex7v.js.map +0 -1
- package/dist/statistical-heldout-BeR4bOdg.d.ts.map +0 -1
- package/dist/steps-Bg5-KVx1.d.ts.map +0 -1
- package/dist/store-otlp-DtB4Slsr.js.map +0 -1
- package/dist/store-tool-spans-DR1SrCLK.d.ts.map +0 -1
- package/dist/store-tool-spans-fZIigrpP.js.map +0 -1
- package/dist/student-t-BQeKJx2N.js +0 -39
- package/dist/student-t-BQeKJx2N.js.map +0 -1
- package/dist/summary-report-C-CtItCN.d.ts.map +0 -1
- package/dist/summary-report-DtdRucM0.js.map +0 -1
- package/dist/task-failure-attributes-DngaLdE4.js.map +0 -1
- package/dist/terminal-record-BHocwFw1.js.map +0 -1
- package/dist/tool-groups-mcxOXVlb.d.ts.map +0 -1
- package/dist/tool-waste-Wi4g6Ekb.d.ts.map +0 -1
- package/dist/trajectory-Y1fmdlw7.d.ts +0 -24
- package/dist/trajectory-Y1fmdlw7.d.ts.map +0 -1
- package/dist/tree-rXLW3M_4.js.map +0 -1
- package/dist/types-B4C5nFw6.d.ts.map +0 -1
- package/dist/types-BqkVmHfv.d.ts.map +0 -1
- package/dist/types-DBZ7keha.d.ts.map +0 -1
- package/dist/types-IXD2HJzu.js.map +0 -1
- package/dist/types-oKRhQAde.d.ts.map +0 -1
- package/dist/usage-receipt-Cx3xNeyB.js +0 -76
- package/dist/usage-receipt-Cx3xNeyB.js.map +0 -1
- package/dist/verdict-DhPoXApk.js.map +0 -1
- package/dist/verdict-cache-BQEsVy9n.js.map +0 -1
- package/docs/design/self-improvement-evidence-audit.md +0 -263
package/dist/{external-optimizer-subprocess-DcerlZSG.js → external-optimizer-subprocess-XIHBOSKt.js}
RENAMED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { c as errorMessage } from "./errors-BcOs5MKW.js";
|
|
2
|
+
import { t as canonicalJson } from "./verdict-cache-CL_7tePD.js";
|
|
3
|
+
import { c as costForTokenPricing, t as CostLedger } from "./cost-ledger-D0352Z4d.js";
|
|
4
|
+
import { t as deepFreezeCanonicalJson } from "./deep-freeze-CurcOQg3.js";
|
|
5
|
+
import { n as appendSearchLedgerLine, r as tryWithSearchLedgerFileLock } from "./search-ledger-file-UKCO2r8a.js";
|
|
6
|
+
import { n as FINDING_SCOPE_FIELDS, t as ANALYST_SEVERITIES } from "./types-DqFMNTgK.js";
|
|
7
|
+
import { n as isRecord } from "./json-BhdsJaOQ.js";
|
|
8
|
+
import { c as ModelSubstitutionError, d as assertServedModelPolicy, u as assertServedModel } from "./llm-client-BshCREn6.js";
|
|
9
|
+
import { t as isNonnegativeFiniteNumber } from "./nonnegative-number-DvdMxg_f.js";
|
|
6
10
|
import { createRequire } from "node:module";
|
|
7
11
|
import { randomBytes } from "node:crypto";
|
|
8
12
|
import { z } from "zod";
|
|
@@ -482,10 +486,68 @@ function isCredentialKey(key) {
|
|
|
482
486
|
"token"
|
|
483
487
|
].includes(segment));
|
|
484
488
|
}
|
|
485
|
-
function
|
|
486
|
-
|
|
489
|
+
function freezeJsonSnapshot(value, label) {
|
|
490
|
+
assertJsonValue(value, label);
|
|
491
|
+
return deepFreezeCanonicalJson(JSON.parse(canonicalJson(value)));
|
|
492
|
+
}
|
|
493
|
+
//#endregion
|
|
494
|
+
//#region src/campaign/external-optimizer-http.ts
|
|
495
|
+
function listenLocal(server) {
|
|
496
|
+
return new Promise((resolvePromise, reject) => {
|
|
497
|
+
server.once("error", reject);
|
|
498
|
+
server.listen(0, "127.0.0.1", () => {
|
|
499
|
+
server.off("error", reject);
|
|
500
|
+
const address = server.address();
|
|
501
|
+
if (!address || typeof address === "string") {
|
|
502
|
+
reject(/* @__PURE__ */ new Error("external optimizer callback did not bind a TCP port"));
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
resolvePromise(address.port);
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
function closeServer(server) {
|
|
510
|
+
return new Promise((resolvePromise, reject) => {
|
|
511
|
+
server.close((error) => error ? reject(error) : resolvePromise());
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
function sendJson(response, status, body) {
|
|
515
|
+
response.writeHead(status, { "content-type": "application/json; charset=utf-8" });
|
|
516
|
+
response.end(JSON.stringify(body));
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Send a JSON body only while the response can still take one.
|
|
520
|
+
*
|
|
521
|
+
* A handler that lost its client — the request was aborted, or the response
|
|
522
|
+
* already ended — must not write again; Node throws `ERR_STREAM_WRITE_AFTER_END`
|
|
523
|
+
* and the throw escapes into the server's error path rather than the caller's.
|
|
524
|
+
*/
|
|
525
|
+
function sendJsonIfOpen(response, status, body) {
|
|
526
|
+
if (response.destroyed || response.writableEnded) return;
|
|
527
|
+
sendJson(response, status, body);
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Wait until every in-flight handler has settled.
|
|
531
|
+
*
|
|
532
|
+
* Re-reads the set on each pass: a handler that is still running can register
|
|
533
|
+
* another, so awaiting one snapshot would return while work is outstanding and
|
|
534
|
+
* the caller would close the server under it.
|
|
535
|
+
*/
|
|
536
|
+
async function waitForActiveHandlers(activeHandlers) {
|
|
537
|
+
while (activeHandlers.size > 0) await Promise.allSettled([...activeHandlers]);
|
|
487
538
|
}
|
|
488
539
|
//#endregion
|
|
540
|
+
//#region src/campaign/external-optimizer-model-contract.ts
|
|
541
|
+
var RequestBodyTooLargeError = class extends Error {};
|
|
542
|
+
var ProviderResponseTooLargeError = class extends Error {
|
|
543
|
+
constructor() {
|
|
544
|
+
super("optimizer model response exceeds maxResponseBytes");
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
var MissingModelExecutionError = class extends Error {};
|
|
548
|
+
var ModelExecutionPersistenceError = class extends Error {};
|
|
549
|
+
var OwnerModelContractError = class extends Error {};
|
|
550
|
+
//#endregion
|
|
489
551
|
//#region src/campaign/external-optimizer-anthropic.ts
|
|
490
552
|
/**
|
|
491
553
|
* Translate between the Anthropic Messages API and the canonical owner-call
|
|
@@ -953,349 +1015,126 @@ function refuse(message) {
|
|
|
953
1015
|
return new AnthropicRequestRefusal(400, "invalid_request_error", message);
|
|
954
1016
|
}
|
|
955
1017
|
//#endregion
|
|
956
|
-
//#region src/campaign/external-optimizer-
|
|
957
|
-
function
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
return;
|
|
966
|
-
}
|
|
967
|
-
resolvePromise(address.port);
|
|
968
|
-
});
|
|
969
|
-
});
|
|
970
|
-
}
|
|
971
|
-
function closeServer(server) {
|
|
972
|
-
return new Promise((resolvePromise, reject) => {
|
|
973
|
-
server.close((error) => error ? reject(error) : resolvePromise());
|
|
974
|
-
});
|
|
1018
|
+
//#region src/campaign/external-optimizer-model-response.ts
|
|
1019
|
+
function encodeAnthropicResponseBody(args) {
|
|
1020
|
+
const message = encodeAnthropicMessage(args.response, args.callId);
|
|
1021
|
+
const body = new TextEncoder().encode(args.stream ? renderAnthropicSseStream(message) : JSON.stringify(message));
|
|
1022
|
+
if (body.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
|
|
1023
|
+
return {
|
|
1024
|
+
contentType: args.stream ? "text/event-stream; charset=utf-8" : "application/json",
|
|
1025
|
+
body
|
|
1026
|
+
};
|
|
975
1027
|
}
|
|
976
|
-
function
|
|
977
|
-
|
|
978
|
-
response.
|
|
1028
|
+
function encodeCanonicalModelResponse(args) {
|
|
1029
|
+
const usage = encodeProtocolUsage(args.path, args.response, args.receipt);
|
|
1030
|
+
const finishReason = args.response.finishReason === void 0 ? "stop" : args.response.finishReason;
|
|
1031
|
+
const body = args.path === "/v1/chat/completions" ? {
|
|
1032
|
+
id: `chatcmpl-${args.callId}`,
|
|
1033
|
+
object: "chat.completion",
|
|
1034
|
+
created: 0,
|
|
1035
|
+
model: args.response.model,
|
|
1036
|
+
choices: [{
|
|
1037
|
+
index: 0,
|
|
1038
|
+
message: {
|
|
1039
|
+
role: "assistant",
|
|
1040
|
+
content: args.response.content
|
|
1041
|
+
},
|
|
1042
|
+
finish_reason: finishReason
|
|
1043
|
+
}],
|
|
1044
|
+
...usage ? { usage } : {}
|
|
1045
|
+
} : {
|
|
1046
|
+
id: `resp-${args.callId}`,
|
|
1047
|
+
object: "response",
|
|
1048
|
+
created_at: 0,
|
|
1049
|
+
model: args.response.model,
|
|
1050
|
+
status: finishReason === "length" ? "incomplete" : "completed",
|
|
1051
|
+
error: null,
|
|
1052
|
+
incomplete_details: finishReason === "length" ? { reason: "max_output_tokens" } : null,
|
|
1053
|
+
output: [{
|
|
1054
|
+
id: `msg-${args.callId}`,
|
|
1055
|
+
type: "message",
|
|
1056
|
+
status: finishReason === "length" ? "incomplete" : "completed",
|
|
1057
|
+
role: "assistant",
|
|
1058
|
+
content: [{
|
|
1059
|
+
type: "output_text",
|
|
1060
|
+
text: args.response.content,
|
|
1061
|
+
annotations: []
|
|
1062
|
+
}]
|
|
1063
|
+
}],
|
|
1064
|
+
output_text: args.response.content,
|
|
1065
|
+
...usage ? { usage } : {}
|
|
1066
|
+
};
|
|
1067
|
+
const encoded = new TextEncoder().encode(JSON.stringify(body));
|
|
1068
|
+
if (encoded.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
|
|
1069
|
+
return encoded;
|
|
979
1070
|
}
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
* A handler that lost its client — the request was aborted, or the response
|
|
984
|
-
* already ended — must not write again; Node throws `ERR_STREAM_WRITE_AFTER_END`
|
|
985
|
-
* and the throw escapes into the server's error path rather than the caller's.
|
|
986
|
-
*/
|
|
987
|
-
function sendJsonIfOpen(response, status, body) {
|
|
988
|
-
if (response.destroyed || response.writableEnded) return;
|
|
989
|
-
sendJson(response, status, body);
|
|
1071
|
+
function endpointFormat(path) {
|
|
1072
|
+
if (path === "/v1/messages") return "anthropic-messages";
|
|
1073
|
+
return path === "/v1/responses" ? "responses" : "chat-completions";
|
|
990
1074
|
}
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1075
|
+
function encodeProtocolUsage(path, response, receipt) {
|
|
1076
|
+
if (response.usage.captured === false) return void 0;
|
|
1077
|
+
const inputDetails = {
|
|
1078
|
+
...receipt.cachedTokens === void 0 ? {} : { cached_tokens: receipt.cachedTokens },
|
|
1079
|
+
...receipt.cacheWriteTokens === void 0 ? {} : path === "/v1/chat/completions" ? { cache_creation_tokens: receipt.cacheWriteTokens } : { cache_write_tokens: receipt.cacheWriteTokens }
|
|
1080
|
+
};
|
|
1081
|
+
const outputDetails = { ...receipt.reasoningTokens === void 0 ? {} : { reasoning_tokens: receipt.reasoningTokens } };
|
|
1082
|
+
return path === "/v1/chat/completions" ? {
|
|
1083
|
+
prompt_tokens: response.usage.promptTokens,
|
|
1084
|
+
completion_tokens: response.usage.completionTokens,
|
|
1085
|
+
total_tokens: response.usage.totalTokens,
|
|
1086
|
+
...Object.keys(inputDetails).length > 0 ? { prompt_tokens_details: inputDetails } : {},
|
|
1087
|
+
...Object.keys(outputDetails).length > 0 ? { completion_tokens_details: outputDetails } : {},
|
|
1088
|
+
...receipt.actualCostUsd === void 0 ? {} : { cost: receipt.actualCostUsd }
|
|
1089
|
+
} : {
|
|
1090
|
+
input_tokens: response.usage.promptTokens,
|
|
1091
|
+
output_tokens: response.usage.completionTokens,
|
|
1092
|
+
total_tokens: response.usage.totalTokens,
|
|
1093
|
+
...Object.keys(inputDetails).length > 0 ? { input_tokens_details: inputDetails } : {},
|
|
1094
|
+
...Object.keys(outputDetails).length > 0 ? { output_tokens_details: outputDetails } : {},
|
|
1095
|
+
...receipt.actualCostUsd === void 0 ? {} : { cost: receipt.actualCostUsd }
|
|
1096
|
+
};
|
|
1000
1097
|
}
|
|
1001
1098
|
//#endregion
|
|
1002
|
-
//#region src/campaign/external-optimizer-model-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
let
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
if (!accepting) {
|
|
1042
|
-
sendJsonIfOpen(response, 503, { error: "external optimizer model proxy is closing" });
|
|
1043
|
-
return;
|
|
1044
|
-
}
|
|
1045
|
-
const controller = new AbortController();
|
|
1046
|
-
const abortRequest = () => {
|
|
1047
|
-
request.destroy();
|
|
1048
|
-
response.destroy();
|
|
1049
|
-
};
|
|
1050
|
-
activeControllers.add(controller);
|
|
1051
|
-
controller.signal.addEventListener("abort", abortRequest, { once: true });
|
|
1052
|
-
let handler;
|
|
1053
|
-
handler = handleModelProxyRequest({
|
|
1054
|
-
request,
|
|
1055
|
-
response,
|
|
1056
|
-
controller,
|
|
1057
|
-
token,
|
|
1058
|
-
args,
|
|
1059
|
-
nextReservation: (maximumCostUsd, wire) => {
|
|
1060
|
-
if (totalRequestCount >= args.budget.maxRequests) return {
|
|
1061
|
-
accepted: false,
|
|
1062
|
-
reason: "optimizer model request limit reached"
|
|
1063
|
-
};
|
|
1064
|
-
if (args.budget.maxCostUsd !== void 0 && maximumCostUsd !== void 0 && committedForBudget + reservedForBudget + maximumCostUsd > args.budget.maxCostUsd + Number.EPSILON) return {
|
|
1065
|
-
accepted: false,
|
|
1066
|
-
reason: "optimizer model cost limit reached"
|
|
1067
|
-
};
|
|
1068
|
-
requestCount += 1;
|
|
1069
|
-
wireCounts[wire].requestAttempts += 1;
|
|
1070
|
-
totalRequestCount += 1;
|
|
1071
|
-
reservedForBudget += maximumCostUsd ?? 0;
|
|
1072
|
-
return { accepted: true };
|
|
1073
|
-
},
|
|
1074
|
-
settleReservation: (maximumCostUsd, chargedCostUsd) => {
|
|
1075
|
-
reservedForBudget = Math.max(0, reservedForBudget - (maximumCostUsd ?? 0));
|
|
1076
|
-
committedForBudget += chargedCostUsd ?? 0;
|
|
1077
|
-
},
|
|
1078
|
-
recordSuccessfulCompletion: (wire) => {
|
|
1079
|
-
successfulCompletionCount += 1;
|
|
1080
|
-
wireCounts[wire].successfulCompletions += 1;
|
|
1081
|
-
},
|
|
1082
|
-
recordExecutionReceipt: (observation) => {
|
|
1083
|
-
try {
|
|
1084
|
-
args.recordExecution({
|
|
1085
|
-
...observation,
|
|
1086
|
-
sequence: executionSequence + 1
|
|
1087
|
-
});
|
|
1088
|
-
} catch (error) {
|
|
1089
|
-
throw new ModelExecutionPersistenceError(`optimizer model execution evidence was not persisted: ${toErrorMessage(error)}`);
|
|
1090
|
-
}
|
|
1091
|
-
executionSequence += 1;
|
|
1092
|
-
executionRecordCount += 1;
|
|
1093
|
-
},
|
|
1094
|
-
recordModelCallInvocation: () => {
|
|
1095
|
-
modelCallInvocations += 1;
|
|
1096
|
-
},
|
|
1097
|
-
recordFailure: (error) => {
|
|
1098
|
-
failures.push(error);
|
|
1099
|
-
}
|
|
1100
|
-
}).finally(() => {
|
|
1101
|
-
controller.signal.removeEventListener("abort", abortRequest);
|
|
1102
|
-
activeControllers.delete(controller);
|
|
1103
|
-
activeHandlers.delete(handler);
|
|
1104
|
-
});
|
|
1105
|
-
activeHandlers.add(handler);
|
|
1106
|
-
handler.catch(() => void 0);
|
|
1107
|
-
});
|
|
1108
|
-
const port = await listenLocal(server);
|
|
1109
|
-
const close = () => {
|
|
1110
|
-
closePromise ??= closeModelProxy();
|
|
1111
|
-
return closePromise;
|
|
1112
|
-
};
|
|
1113
|
-
const onAbort = () => {
|
|
1114
|
-
for (const controller of activeControllers) controller.abort(args.signal?.reason);
|
|
1115
|
-
close().catch(() => void 0);
|
|
1116
|
-
};
|
|
1117
|
-
args.signal?.addEventListener("abort", onAbort, { once: true });
|
|
1118
|
-
if (args.signal?.aborted) onAbort();
|
|
1119
|
-
const assertExecutionComplete = () => {
|
|
1120
|
-
if (executionRecordCount !== modelCallInvocations) throw new Error(`external optimizer model callback returned ${executionRecordCount} execution records for ${modelCallInvocations} invoked calls`);
|
|
1121
|
-
};
|
|
1122
|
-
return {
|
|
1123
|
-
baseUrl: `http://127.0.0.1:${port}/v1`,
|
|
1124
|
-
apiKey: token,
|
|
1125
|
-
requestAttempts: () => requestCount,
|
|
1126
|
-
successfulCompletions: () => successfulCompletionCount,
|
|
1127
|
-
wireUsage: () => ({
|
|
1128
|
-
openai: { ...wireCounts.openai },
|
|
1129
|
-
anthropic: { ...wireCounts.anthropic }
|
|
1130
|
-
}),
|
|
1131
|
-
assertExecutionComplete,
|
|
1132
|
-
failures: () => [...failures],
|
|
1133
|
-
close
|
|
1134
|
-
};
|
|
1135
|
-
async function closeModelProxy() {
|
|
1136
|
-
args.signal?.removeEventListener("abort", onAbort);
|
|
1137
|
-
accepting = false;
|
|
1138
|
-
const closingServer = closeServer(server);
|
|
1139
|
-
server.closeIdleConnections?.();
|
|
1140
|
-
const [serverResult] = await Promise.allSettled([closingServer, waitForActiveHandlers(activeHandlers)]);
|
|
1141
|
-
if (activeControllers.size !== 0 || activeHandlers.size !== 0) throw new Error("external optimizer model proxy closed with active request work");
|
|
1142
|
-
let executionError;
|
|
1143
|
-
try {
|
|
1144
|
-
assertExecutionComplete();
|
|
1145
|
-
} catch (error) {
|
|
1146
|
-
executionError = error;
|
|
1147
|
-
}
|
|
1148
|
-
if (serverResult?.status === "rejected" && executionError !== void 0) throw new AggregateError([serverResult.reason, executionError], "external optimizer model proxy close and execution evidence both failed");
|
|
1149
|
-
if (serverResult?.status === "rejected") throw serverResult.reason;
|
|
1150
|
-
if (executionError !== void 0) throw executionError;
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
async function handleModelProxyRequest(args) {
|
|
1154
|
-
const { controller, request, response } = args;
|
|
1155
|
-
let wire = "openai";
|
|
1156
|
-
const respondError = (status, message, errorType) => {
|
|
1157
|
-
if (wire === "anthropic") {
|
|
1158
|
-
const mapped = status === 429 ? 402 : status;
|
|
1159
|
-
sendJsonIfOpen(response, mapped, anthropicErrorEnvelope(errorType ?? anthropicErrorTypeForStatus(mapped), message));
|
|
1160
|
-
return;
|
|
1161
|
-
}
|
|
1162
|
-
sendJsonIfOpen(response, status, { error: message });
|
|
1163
|
-
};
|
|
1164
|
-
try {
|
|
1165
|
-
const path = request.url ? new URL(request.url, "http://127.0.0.1").pathname : "";
|
|
1166
|
-
const anthropicPath = path === "/v1/messages" && args.args.anthropicEndpoint === true;
|
|
1167
|
-
if (request.method !== "POST" || !(MODEL_PROXY_PATHS.has(path) || anthropicPath)) {
|
|
1168
|
-
sendJsonIfOpen(response, 404, { error: "not found" });
|
|
1169
|
-
return;
|
|
1170
|
-
}
|
|
1171
|
-
if (anthropicPath) wire = "anthropic";
|
|
1172
|
-
const modelPath = path;
|
|
1173
|
-
if (!(request.headers.authorization === `Bearer ${args.token}` || wire === "anthropic" && request.headers["x-api-key"] === args.token)) {
|
|
1174
|
-
respondError(401, "unauthorized");
|
|
1175
|
-
return;
|
|
1176
|
-
}
|
|
1177
|
-
const body = await readBody(request, args.args.budget.maxRequestBytes);
|
|
1178
|
-
const parsed = parseModelProxyRequest(body, modelPath, args.args.model, args.args.budget);
|
|
1179
|
-
const maximumUsage = conservativeMaximumUsage(body.byteLength, parsed.maxOutputTokens + (args.args.budget.maxReasoningTokensPerRequest ?? 0), args.args.budget.pricing);
|
|
1180
|
-
const maximumCostUsd = args.args.budget.pricing ? costForTokenPricing(args.args.budget.pricing, maximumUsage) : void 0;
|
|
1181
|
-
const reservation = args.nextReservation(maximumCostUsd, wire);
|
|
1182
|
-
if (!reservation.accepted) {
|
|
1183
|
-
respondError(429, reservation.reason);
|
|
1184
|
-
return;
|
|
1185
|
-
}
|
|
1186
|
-
const timeout = setTimeout(() => controller.abort(), args.args.budget.requestTimeoutMs ?? 3e5);
|
|
1187
|
-
let chargedForBudget = maximumCostUsd;
|
|
1188
|
-
try {
|
|
1189
|
-
const requestTags = wire === "anthropic" ? {
|
|
1190
|
-
...args.args.tags ?? {},
|
|
1191
|
-
wire: "anthropic",
|
|
1192
|
-
...parsed.strippedFields === void 0 ? {} : { strippedFields: parsed.strippedFields.join(",") }
|
|
1193
|
-
} : args.args.tags;
|
|
1194
|
-
const paid = await args.args.costLedger.runPaidCall({
|
|
1195
|
-
...args.args.callId ? { callId: args.args.callId } : {},
|
|
1196
|
-
channel: args.args.channel ?? "optimizer",
|
|
1197
|
-
phase: args.args.phase,
|
|
1198
|
-
actor: args.args.actor,
|
|
1199
|
-
...requestTags ? { tags: requestTags } : {},
|
|
1200
|
-
model: args.args.model,
|
|
1201
|
-
...args.args.budget.pricing ? { maximumCharge: {
|
|
1202
|
-
customTokenPricing: args.args.budget.pricing,
|
|
1203
|
-
...maximumUsage
|
|
1204
|
-
} } : {},
|
|
1205
|
-
signal: controller.signal,
|
|
1206
|
-
execute: async (paidCallSignal, paidCallId) => forwardModelProxyRequest({
|
|
1207
|
-
call: args.args.call,
|
|
1208
|
-
callId: paidCallId,
|
|
1209
|
-
callRef: args.args.callRef,
|
|
1210
|
-
recordExecutionReceipt: args.recordExecutionReceipt,
|
|
1211
|
-
recordModelCallInvocation: args.recordModelCallInvocation,
|
|
1212
|
-
path: modelPath,
|
|
1213
|
-
request: parsed.request,
|
|
1214
|
-
...parsed.stream === void 0 ? {} : { anthropicStream: parsed.stream },
|
|
1215
|
-
model: args.args.model,
|
|
1216
|
-
allowWithinFamily: args.args.servedModelPolicy === "allow-within-family",
|
|
1217
|
-
maxOutputTokens: parsed.maxOutputTokens,
|
|
1218
|
-
...args.args.budget.maxReasoningTokensPerRequest === void 0 ? {} : { maxReasoningTokens: args.args.budget.maxReasoningTokensPerRequest },
|
|
1219
|
-
maxResponseBytes: args.args.budget.maxResponseBytes,
|
|
1220
|
-
signal: paidCallSignal
|
|
1221
|
-
}),
|
|
1222
|
-
receipt: (result) => result.receipt,
|
|
1223
|
-
receiptFromError: () => ({
|
|
1224
|
-
model: args.args.model,
|
|
1225
|
-
inputTokens: 0,
|
|
1226
|
-
outputTokens: 0,
|
|
1227
|
-
costUnknown: true,
|
|
1228
|
-
usageUnknown: true
|
|
1229
|
-
})
|
|
1230
|
-
});
|
|
1231
|
-
if (!paid.succeeded) {
|
|
1232
|
-
args.recordFailure(paid.error);
|
|
1233
|
-
chargedForBudget = paid.receipt ? paid.receipt.usageUnknown || paid.receipt.costUnknown ? maximumCostUsd : paid.receipt.costUsd : void 0;
|
|
1234
|
-
respondError(isAbortError(paid.error) ? 504 : paid.error instanceof AnthropicRequestRefusal ? paid.error.status : paid.error instanceof ProviderResponseTooLargeError || paid.error instanceof MissingModelExecutionError || paid.error instanceof ModelExecutionPersistenceError || paid.error instanceof OwnerModelContractError || paid.error instanceof ModelSubstitutionError ? 502 : 429, paid.error.message, paid.error instanceof AnthropicRequestRefusal ? paid.error.errorType : void 0);
|
|
1235
|
-
return;
|
|
1236
|
-
}
|
|
1237
|
-
if (paid.value.modelCallFailed) {
|
|
1238
|
-
respondError(502, paid.value.modelCallFailed);
|
|
1239
|
-
return;
|
|
1240
|
-
}
|
|
1241
|
-
chargedForBudget = paid.value.usageComplete ? paid.receipt.costUsd : maximumCostUsd;
|
|
1242
|
-
if (paid.value.usageRejected) {
|
|
1243
|
-
respondError(502, paid.value.usageRejected);
|
|
1244
|
-
return;
|
|
1245
|
-
}
|
|
1246
|
-
if (paid.value.status >= 200 && paid.value.status < 300) args.recordSuccessfulCompletion(wire);
|
|
1247
|
-
if (response.destroyed || response.writableEnded) return;
|
|
1248
|
-
response.writeHead(paid.value.status, {
|
|
1249
|
-
"content-type": paid.value.contentType,
|
|
1250
|
-
"content-length": String(paid.value.body.byteLength)
|
|
1251
|
-
});
|
|
1252
|
-
response.end(paid.value.body);
|
|
1253
|
-
} finally {
|
|
1254
|
-
clearTimeout(timeout);
|
|
1255
|
-
args.settleReservation(maximumCostUsd, chargedForBudget);
|
|
1256
|
-
}
|
|
1257
|
-
} catch (error) {
|
|
1258
|
-
respondError(error instanceof AnthropicRequestRefusal ? error.status : error instanceof RequestBodyTooLargeError ? 413 : error instanceof Error && isAbortError(error) ? 503 : 400, toErrorMessage(error), error instanceof AnthropicRequestRefusal ? error.errorType : void 0);
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1261
|
-
async function forwardModelProxyRequest(args) {
|
|
1262
|
-
args.recordModelCallInvocation();
|
|
1263
|
-
let called;
|
|
1264
|
-
try {
|
|
1265
|
-
called = await args.call({
|
|
1266
|
-
callId: args.callId,
|
|
1267
|
-
request: freezeJsonSnapshot(args.request, "optimizer model canonical request"),
|
|
1268
|
-
endpointFormat: endpointFormat(args.path),
|
|
1269
|
-
signal: args.signal
|
|
1270
|
-
});
|
|
1271
|
-
} catch (error) {
|
|
1272
|
-
throw new MissingModelExecutionError(`optimizer model callback rejected without execution evidence: ${toErrorMessage(error)}`);
|
|
1273
|
-
}
|
|
1274
|
-
if (!called || typeof called !== "object" || typeof called.succeeded !== "boolean") throw new MissingModelExecutionError("optimizer model callback returned no typed success/failure outcome");
|
|
1275
|
-
let execution;
|
|
1276
|
-
try {
|
|
1277
|
-
execution = freezeJsonSnapshot(called.execution, "optimizer model callback execution evidence");
|
|
1278
|
-
} catch (error) {
|
|
1279
|
-
throw new MissingModelExecutionError(`optimizer model callback returned invalid execution evidence: ${toErrorMessage(error)}`);
|
|
1280
|
-
}
|
|
1281
|
-
if (called.succeeded) {
|
|
1282
|
-
let authoritativeReceipt;
|
|
1283
|
-
let canonicalResponse;
|
|
1284
|
-
try {
|
|
1285
|
-
authoritativeReceipt = snapshotModelReceipt(called.receipt, args.model, args.allowWithinFamily);
|
|
1286
|
-
canonicalResponse = snapshotChatResponse(called.response, args.model, args.allowWithinFamily);
|
|
1287
|
-
assertResponseUsageMatchesReceipt(canonicalResponse, authoritativeReceipt);
|
|
1288
|
-
} catch (error) {
|
|
1289
|
-
args.recordExecutionReceipt({
|
|
1290
|
-
callId: args.callId,
|
|
1291
|
-
callRef: args.callRef,
|
|
1292
|
-
path: args.path,
|
|
1293
|
-
model: args.model,
|
|
1294
|
-
succeeded: false,
|
|
1295
|
-
error: toErrorMessage(error),
|
|
1296
|
-
execution
|
|
1297
|
-
});
|
|
1298
|
-
throw error;
|
|
1099
|
+
//#region src/campaign/external-optimizer-model-execution.ts
|
|
1100
|
+
async function forwardModelProxyRequest(args) {
|
|
1101
|
+
args.recordModelCallInvocation();
|
|
1102
|
+
let called;
|
|
1103
|
+
try {
|
|
1104
|
+
called = await args.call({
|
|
1105
|
+
callId: args.callId,
|
|
1106
|
+
request: freezeJsonSnapshot(args.request, "optimizer model canonical request"),
|
|
1107
|
+
endpointFormat: endpointFormat(args.path),
|
|
1108
|
+
signal: args.signal
|
|
1109
|
+
});
|
|
1110
|
+
} catch (error) {
|
|
1111
|
+
throw new MissingModelExecutionError(`optimizer model callback rejected without execution evidence: ${errorMessage(error)}`);
|
|
1112
|
+
}
|
|
1113
|
+
if (!called || typeof called !== "object" || typeof called.succeeded !== "boolean") throw new MissingModelExecutionError("optimizer model callback returned no typed success/failure outcome");
|
|
1114
|
+
let execution;
|
|
1115
|
+
try {
|
|
1116
|
+
execution = freezeJsonSnapshot(called.execution, "optimizer model callback execution evidence");
|
|
1117
|
+
} catch (error) {
|
|
1118
|
+
throw new MissingModelExecutionError(`optimizer model callback returned invalid execution evidence: ${errorMessage(error)}`);
|
|
1119
|
+
}
|
|
1120
|
+
if (called.succeeded) {
|
|
1121
|
+
let authoritativeReceipt;
|
|
1122
|
+
let canonicalResponse;
|
|
1123
|
+
try {
|
|
1124
|
+
authoritativeReceipt = snapshotModelReceipt(called.receipt, args.model, args.allowWithinFamily);
|
|
1125
|
+
canonicalResponse = snapshotChatResponse(called.response, args.model, args.allowWithinFamily);
|
|
1126
|
+
assertResponseUsageMatchesReceipt(canonicalResponse, authoritativeReceipt);
|
|
1127
|
+
} catch (error) {
|
|
1128
|
+
args.recordExecutionReceipt({
|
|
1129
|
+
callId: args.callId,
|
|
1130
|
+
callRef: args.callRef,
|
|
1131
|
+
path: args.path,
|
|
1132
|
+
model: args.model,
|
|
1133
|
+
succeeded: false,
|
|
1134
|
+
error: errorMessage(error),
|
|
1135
|
+
execution
|
|
1136
|
+
});
|
|
1137
|
+
throw error;
|
|
1299
1138
|
}
|
|
1300
1139
|
args.recordExecutionReceipt({
|
|
1301
1140
|
callId: args.callId,
|
|
@@ -1361,7 +1200,7 @@ function snapshotModelReceipt(value, expectedModel, allowWithinFamily) {
|
|
|
1361
1200
|
assertJsonValue(value, "optimizer model callback receipt");
|
|
1362
1201
|
snapshot = JSON.parse(canonicalJson(value));
|
|
1363
1202
|
} catch (error) {
|
|
1364
|
-
throw new OwnerModelContractError(`optimizer model callback returned an invalid receipt: ${
|
|
1203
|
+
throw new OwnerModelContractError(`optimizer model callback returned an invalid receipt: ${errorMessage(error)}`);
|
|
1365
1204
|
}
|
|
1366
1205
|
assertServedModel(expectedModel, snapshot.model, {
|
|
1367
1206
|
context: "optimizer model callback receipt",
|
|
@@ -1369,17 +1208,6 @@ function snapshotModelReceipt(value, expectedModel, allowWithinFamily) {
|
|
|
1369
1208
|
});
|
|
1370
1209
|
return snapshot;
|
|
1371
1210
|
}
|
|
1372
|
-
function freezeJsonSnapshot(value, label) {
|
|
1373
|
-
assertJsonValue(value, label);
|
|
1374
|
-
return deepFreezeJson(JSON.parse(canonicalJson(value)));
|
|
1375
|
-
}
|
|
1376
|
-
function deepFreezeJson(value) {
|
|
1377
|
-
if (value !== null && typeof value === "object") {
|
|
1378
|
-
for (const child of Object.values(value)) deepFreezeJson(child);
|
|
1379
|
-
Object.freeze(value);
|
|
1380
|
-
}
|
|
1381
|
-
return value;
|
|
1382
|
-
}
|
|
1383
1211
|
function assertResponseUsageMatchesReceipt(response, receipt) {
|
|
1384
1212
|
if (response.model !== receipt.model) throw new OwnerModelContractError("optimizer model response and execution receipt disagree about the served model");
|
|
1385
1213
|
if (response.usage.captured === false || receipt.usageUnknown === true) {
|
|
@@ -1394,11 +1222,81 @@ function assertResponseUsageMatchesReceipt(response, receipt) {
|
|
|
1394
1222
|
const receiptCostUsd = receipt.actualCostUsd ?? receipt.estimatedCostUsd ?? (receipt.customTokenPricing && receipt.usageUnknown !== true ? costForTokenPricing(receipt.customTokenPricing, receipt) : null);
|
|
1395
1223
|
if (response.costUsd !== receiptCostUsd) throw new OwnerModelContractError("optimizer model response billed cost disagrees with the execution receipt");
|
|
1396
1224
|
}
|
|
1397
|
-
function
|
|
1398
|
-
if (
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1225
|
+
function snapshotChatResponse(value, expectedModel, allowWithinFamily) {
|
|
1226
|
+
if (!isRecord(value)) throw new OwnerModelContractError("optimizer model callback response must be an object");
|
|
1227
|
+
if (typeof value.content !== "string") throw new OwnerModelContractError("optimizer model callback response content must be a string");
|
|
1228
|
+
assertServedModel(expectedModel, typeof value.model === "string" ? value.model : null, {
|
|
1229
|
+
context: "optimizer model callback response",
|
|
1230
|
+
allowWithinFamily
|
|
1231
|
+
});
|
|
1232
|
+
if (!isNonnegativeFiniteNumber(value.durationMs)) throw new OwnerModelContractError("optimizer model callback response durationMs must be finite and non-negative");
|
|
1233
|
+
if (value.costUsd !== null && !isNonnegativeFiniteNumber(value.costUsd)) throw new OwnerModelContractError("optimizer model callback response costUsd must be null or finite and non-negative");
|
|
1234
|
+
if (value.finishReason !== void 0 && value.finishReason !== null && typeof value.finishReason !== "string") throw new OwnerModelContractError("optimizer model callback response finishReason must be a string or null");
|
|
1235
|
+
const toolCalls = snapshotResponseToolCalls(value.toolCalls);
|
|
1236
|
+
if (value.contentEmpty !== void 0 && (typeof value.contentEmpty !== "boolean" || value.contentEmpty !== (value.content.trim().length === 0))) throw new OwnerModelContractError("optimizer model callback response contentEmpty must match content");
|
|
1237
|
+
if (!isRecord(value.raw)) throw new OwnerModelContractError("optimizer model callback response raw must be an object");
|
|
1238
|
+
if (!isRecord(value.usage)) throw new OwnerModelContractError("optimizer model callback response usage must be an object");
|
|
1239
|
+
const usage = value.usage;
|
|
1240
|
+
for (const field of [
|
|
1241
|
+
"promptTokens",
|
|
1242
|
+
"completionTokens",
|
|
1243
|
+
"totalTokens"
|
|
1244
|
+
]) if (!isNonnegativeSafeInteger(usage[field])) throw new OwnerModelContractError(`optimizer model callback response usage.${field} must be a non-negative safe integer`);
|
|
1245
|
+
const promptTokens = usage.promptTokens;
|
|
1246
|
+
const completionTokens = usage.completionTokens;
|
|
1247
|
+
const totalTokens = usage.totalTokens;
|
|
1248
|
+
if (totalTokens !== promptTokens + completionTokens) throw new OwnerModelContractError("optimizer model callback response totalTokens must equal promptTokens plus completionTokens");
|
|
1249
|
+
if (usage.captured !== void 0 && typeof usage.captured !== "boolean") throw new OwnerModelContractError("optimizer model callback response usage.captured must be a boolean");
|
|
1250
|
+
if (usage.cachedPromptTokens !== void 0 && (!isNonnegativeSafeInteger(usage.cachedPromptTokens) || usage.cachedPromptTokens > promptTokens)) throw new OwnerModelContractError("optimizer model callback response cachedPromptTokens must be a subset of promptTokens");
|
|
1251
|
+
if (usage.reasoningTokens !== void 0 && (!isNonnegativeSafeInteger(usage.reasoningTokens) || usage.reasoningTokens > completionTokens)) throw new OwnerModelContractError("optimizer model callback response reasoningTokens must be a subset of completionTokens");
|
|
1252
|
+
let raw;
|
|
1253
|
+
try {
|
|
1254
|
+
raw = freezeJsonSnapshot(value.raw, "optimizer model callback canonical response.raw");
|
|
1255
|
+
} catch (error) {
|
|
1256
|
+
throw new OwnerModelContractError(`optimizer model callback returned invalid raw response evidence: ${errorMessage(error)}`);
|
|
1257
|
+
}
|
|
1258
|
+
return deepFreezeCanonicalJson({
|
|
1259
|
+
content: value.content,
|
|
1260
|
+
...toolCalls === void 0 ? {} : { toolCalls },
|
|
1261
|
+
usage: {
|
|
1262
|
+
promptTokens,
|
|
1263
|
+
completionTokens,
|
|
1264
|
+
totalTokens,
|
|
1265
|
+
...usage.captured === void 0 ? {} : { captured: usage.captured },
|
|
1266
|
+
...usage.reasoningTokens === void 0 ? {} : { reasoningTokens: usage.reasoningTokens },
|
|
1267
|
+
...usage.cachedPromptTokens === void 0 ? {} : { cachedPromptTokens: usage.cachedPromptTokens }
|
|
1268
|
+
},
|
|
1269
|
+
costUsd: value.costUsd,
|
|
1270
|
+
model: value.model,
|
|
1271
|
+
durationMs: value.durationMs,
|
|
1272
|
+
...value.finishReason === void 0 ? {} : { finishReason: value.finishReason },
|
|
1273
|
+
...value.contentEmpty === void 0 ? {} : { contentEmpty: value.contentEmpty },
|
|
1274
|
+
raw
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
/** Snapshot the owner's canonical tool calls onto the allowlisted response. */
|
|
1278
|
+
function snapshotResponseToolCalls(value) {
|
|
1279
|
+
if (value === void 0) return void 0;
|
|
1280
|
+
if (!Array.isArray(value) || value.length === 0) throw new OwnerModelContractError("optimizer model callback response toolCalls must be a non-empty array when present");
|
|
1281
|
+
return value.map((entry) => {
|
|
1282
|
+
if (!isRecord(entry) || typeof entry.id !== "string" || !entry.id || typeof entry.name !== "string" || !entry.name || typeof entry.argumentsJson !== "string") throw new OwnerModelContractError("optimizer model callback response toolCalls entries require string id, name, and argumentsJson");
|
|
1283
|
+
return {
|
|
1284
|
+
id: entry.id,
|
|
1285
|
+
name: entry.name,
|
|
1286
|
+
argumentsJson: entry.argumentsJson
|
|
1287
|
+
};
|
|
1288
|
+
});
|
|
1289
|
+
}
|
|
1290
|
+
function isNonnegativeSafeInteger(value) {
|
|
1291
|
+
return Number.isSafeInteger(value) && value >= 0;
|
|
1292
|
+
}
|
|
1293
|
+
//#endregion
|
|
1294
|
+
//#region src/campaign/external-optimizer-model-request.ts
|
|
1295
|
+
function parseModelProxyRequest(body, path, expectedModel, budget) {
|
|
1296
|
+
if (path === "/v1/messages") {
|
|
1297
|
+
const translated = translateAnthropicMessagesRequest(body, expectedModel, budget.maxOutputTokensPerRequest);
|
|
1298
|
+
return {
|
|
1299
|
+
maxOutputTokens: translated.maxOutputTokens,
|
|
1402
1300
|
stream: translated.stream,
|
|
1403
1301
|
...translated.strippedFields.length > 0 ? { strippedFields: translated.strippedFields } : {},
|
|
1404
1302
|
request: freezeJsonSnapshot(translated.request, "optimizer model canonical request")
|
|
@@ -1653,169 +1551,309 @@ function assertAllowedKeys(value, allowed, label = "optimizer model request") {
|
|
|
1653
1551
|
const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));
|
|
1654
1552
|
if (unknown.length > 0) throw new Error(`${label} contains unsupported fields: ${unknown.join(", ")}`);
|
|
1655
1553
|
}
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
const usage = value.usage;
|
|
1671
|
-
for (const field of [
|
|
1672
|
-
"promptTokens",
|
|
1673
|
-
"completionTokens",
|
|
1674
|
-
"totalTokens"
|
|
1675
|
-
]) if (!isNonnegativeSafeInteger(usage[field])) throw new OwnerModelContractError(`optimizer model callback response usage.${field} must be a non-negative safe integer`);
|
|
1676
|
-
const promptTokens = usage.promptTokens;
|
|
1677
|
-
const completionTokens = usage.completionTokens;
|
|
1678
|
-
const totalTokens = usage.totalTokens;
|
|
1679
|
-
if (totalTokens !== promptTokens + completionTokens) throw new OwnerModelContractError("optimizer model callback response totalTokens must equal promptTokens plus completionTokens");
|
|
1680
|
-
if (usage.captured !== void 0 && typeof usage.captured !== "boolean") throw new OwnerModelContractError("optimizer model callback response usage.captured must be a boolean");
|
|
1681
|
-
if (usage.cachedPromptTokens !== void 0 && (!isNonnegativeSafeInteger(usage.cachedPromptTokens) || usage.cachedPromptTokens > promptTokens)) throw new OwnerModelContractError("optimizer model callback response cachedPromptTokens must be a subset of promptTokens");
|
|
1682
|
-
if (usage.reasoningTokens !== void 0 && (!isNonnegativeSafeInteger(usage.reasoningTokens) || usage.reasoningTokens > completionTokens)) throw new OwnerModelContractError("optimizer model callback response reasoningTokens must be a subset of completionTokens");
|
|
1683
|
-
let raw;
|
|
1554
|
+
//#endregion
|
|
1555
|
+
//#region src/campaign/external-optimizer-model-handler.ts
|
|
1556
|
+
const MODEL_PROXY_PATHS = /* @__PURE__ */ new Set(["/v1/chat/completions", "/v1/responses"]);
|
|
1557
|
+
async function handleModelProxyRequest(args) {
|
|
1558
|
+
const { controller, request, response } = args;
|
|
1559
|
+
let wire = "openai";
|
|
1560
|
+
const respondError = (status, message, errorType) => {
|
|
1561
|
+
if (wire === "anthropic") {
|
|
1562
|
+
const mapped = status === 429 ? 402 : status;
|
|
1563
|
+
sendJsonIfOpen(response, mapped, anthropicErrorEnvelope(errorType ?? anthropicErrorTypeForStatus(mapped), message));
|
|
1564
|
+
return;
|
|
1565
|
+
}
|
|
1566
|
+
sendJsonIfOpen(response, status, { error: message });
|
|
1567
|
+
};
|
|
1684
1568
|
try {
|
|
1685
|
-
|
|
1569
|
+
const path = request.url ? new URL(request.url, "http://127.0.0.1").pathname : "";
|
|
1570
|
+
const anthropicPath = path === "/v1/messages" && args.args.anthropicEndpoint === true;
|
|
1571
|
+
if (request.method !== "POST" || !(MODEL_PROXY_PATHS.has(path) || anthropicPath)) {
|
|
1572
|
+
sendJsonIfOpen(response, 404, { error: "not found" });
|
|
1573
|
+
return;
|
|
1574
|
+
}
|
|
1575
|
+
if (anthropicPath) wire = "anthropic";
|
|
1576
|
+
const modelPath = path;
|
|
1577
|
+
if (!(request.headers.authorization === `Bearer ${args.token}` || wire === "anthropic" && request.headers["x-api-key"] === args.token)) {
|
|
1578
|
+
respondError(401, "unauthorized");
|
|
1579
|
+
return;
|
|
1580
|
+
}
|
|
1581
|
+
const body = await readBody(request, args.args.budget.maxRequestBytes);
|
|
1582
|
+
const parsed = parseModelProxyRequest(body, modelPath, args.args.model, args.args.budget);
|
|
1583
|
+
const maximumUsage = conservativeMaximumUsage(body.byteLength, parsed.maxOutputTokens + (args.args.budget.maxReasoningTokensPerRequest ?? 0), args.args.budget.pricing);
|
|
1584
|
+
const maximumCostUsd = args.args.budget.pricing ? costForTokenPricing(args.args.budget.pricing, maximumUsage) : void 0;
|
|
1585
|
+
const reservation = args.nextReservation(maximumCostUsd, wire);
|
|
1586
|
+
if (!reservation.accepted) {
|
|
1587
|
+
respondError(429, reservation.reason);
|
|
1588
|
+
return;
|
|
1589
|
+
}
|
|
1590
|
+
const timeout = setTimeout(() => controller.abort(), args.args.budget.requestTimeoutMs ?? 3e5);
|
|
1591
|
+
let chargedForBudget = maximumCostUsd;
|
|
1592
|
+
try {
|
|
1593
|
+
const requestTags = wire === "anthropic" ? {
|
|
1594
|
+
...args.args.tags ?? {},
|
|
1595
|
+
wire: "anthropic",
|
|
1596
|
+
...parsed.strippedFields === void 0 ? {} : { strippedFields: parsed.strippedFields.join(",") }
|
|
1597
|
+
} : args.args.tags;
|
|
1598
|
+
const paid = await args.args.costLedger.runPaidCall({
|
|
1599
|
+
...args.args.callId ? { callId: args.args.callId } : {},
|
|
1600
|
+
channel: args.args.channel ?? "optimizer",
|
|
1601
|
+
phase: args.args.phase,
|
|
1602
|
+
actor: args.args.actor,
|
|
1603
|
+
...requestTags ? { tags: requestTags } : {},
|
|
1604
|
+
model: args.args.model,
|
|
1605
|
+
...args.args.budget.pricing ? { maximumCharge: {
|
|
1606
|
+
customTokenPricing: args.args.budget.pricing,
|
|
1607
|
+
...maximumUsage
|
|
1608
|
+
} } : {},
|
|
1609
|
+
signal: controller.signal,
|
|
1610
|
+
execute: async (paidCallSignal, paidCallId) => forwardModelProxyRequest({
|
|
1611
|
+
call: args.args.call,
|
|
1612
|
+
callId: paidCallId,
|
|
1613
|
+
callRef: args.args.callRef,
|
|
1614
|
+
recordExecutionReceipt: args.recordExecutionReceipt,
|
|
1615
|
+
recordModelCallInvocation: args.recordModelCallInvocation,
|
|
1616
|
+
path: modelPath,
|
|
1617
|
+
request: parsed.request,
|
|
1618
|
+
...parsed.stream === void 0 ? {} : { anthropicStream: parsed.stream },
|
|
1619
|
+
model: args.args.model,
|
|
1620
|
+
allowWithinFamily: args.args.servedModelPolicy === "allow-within-family",
|
|
1621
|
+
maxOutputTokens: parsed.maxOutputTokens,
|
|
1622
|
+
...args.args.budget.maxReasoningTokensPerRequest === void 0 ? {} : { maxReasoningTokens: args.args.budget.maxReasoningTokensPerRequest },
|
|
1623
|
+
maxResponseBytes: args.args.budget.maxResponseBytes,
|
|
1624
|
+
signal: paidCallSignal
|
|
1625
|
+
}),
|
|
1626
|
+
receipt: (result) => result.receipt,
|
|
1627
|
+
receiptFromError: () => ({
|
|
1628
|
+
model: args.args.model,
|
|
1629
|
+
inputTokens: 0,
|
|
1630
|
+
outputTokens: 0,
|
|
1631
|
+
costUnknown: true,
|
|
1632
|
+
usageUnknown: true
|
|
1633
|
+
})
|
|
1634
|
+
});
|
|
1635
|
+
if (!paid.succeeded) {
|
|
1636
|
+
args.recordFailure(paid.error);
|
|
1637
|
+
chargedForBudget = paid.receipt ? paid.receipt.usageUnknown || paid.receipt.costUnknown ? maximumCostUsd : paid.receipt.costUsd : void 0;
|
|
1638
|
+
respondError(isAbortError(paid.error) ? 504 : paid.error instanceof AnthropicRequestRefusal ? paid.error.status : paid.error instanceof ProviderResponseTooLargeError || paid.error instanceof MissingModelExecutionError || paid.error instanceof ModelExecutionPersistenceError || paid.error instanceof OwnerModelContractError || paid.error instanceof ModelSubstitutionError ? 502 : 429, paid.error.message, paid.error instanceof AnthropicRequestRefusal ? paid.error.errorType : void 0);
|
|
1639
|
+
return;
|
|
1640
|
+
}
|
|
1641
|
+
if (paid.value.modelCallFailed) {
|
|
1642
|
+
respondError(502, paid.value.modelCallFailed);
|
|
1643
|
+
return;
|
|
1644
|
+
}
|
|
1645
|
+
chargedForBudget = paid.value.usageComplete ? paid.receipt.costUsd : maximumCostUsd;
|
|
1646
|
+
if (paid.value.usageRejected) {
|
|
1647
|
+
respondError(502, paid.value.usageRejected);
|
|
1648
|
+
return;
|
|
1649
|
+
}
|
|
1650
|
+
if (paid.value.status >= 200 && paid.value.status < 300) args.recordSuccessfulCompletion(wire);
|
|
1651
|
+
if (response.destroyed || response.writableEnded) return;
|
|
1652
|
+
response.writeHead(paid.value.status, {
|
|
1653
|
+
"content-type": paid.value.contentType,
|
|
1654
|
+
"content-length": String(paid.value.body.byteLength)
|
|
1655
|
+
});
|
|
1656
|
+
response.end(paid.value.body);
|
|
1657
|
+
} finally {
|
|
1658
|
+
clearTimeout(timeout);
|
|
1659
|
+
args.settleReservation(maximumCostUsd, chargedForBudget);
|
|
1660
|
+
}
|
|
1686
1661
|
} catch (error) {
|
|
1687
|
-
|
|
1662
|
+
respondError(error instanceof AnthropicRequestRefusal ? error.status : error instanceof RequestBodyTooLargeError ? 413 : error instanceof Error && isAbortError(error) ? 503 : 400, errorMessage(error), error instanceof AnthropicRequestRefusal ? error.errorType : void 0);
|
|
1688
1663
|
}
|
|
1689
|
-
return deepFreezeJson({
|
|
1690
|
-
content: value.content,
|
|
1691
|
-
...toolCalls === void 0 ? {} : { toolCalls },
|
|
1692
|
-
usage: {
|
|
1693
|
-
promptTokens,
|
|
1694
|
-
completionTokens,
|
|
1695
|
-
totalTokens,
|
|
1696
|
-
...usage.captured === void 0 ? {} : { captured: usage.captured },
|
|
1697
|
-
...usage.reasoningTokens === void 0 ? {} : { reasoningTokens: usage.reasoningTokens },
|
|
1698
|
-
...usage.cachedPromptTokens === void 0 ? {} : { cachedPromptTokens: usage.cachedPromptTokens }
|
|
1699
|
-
},
|
|
1700
|
-
costUsd: value.costUsd,
|
|
1701
|
-
model: value.model,
|
|
1702
|
-
durationMs: value.durationMs,
|
|
1703
|
-
...value.finishReason === void 0 ? {} : { finishReason: value.finishReason },
|
|
1704
|
-
...value.contentEmpty === void 0 ? {} : { contentEmpty: value.contentEmpty },
|
|
1705
|
-
raw
|
|
1706
|
-
});
|
|
1707
|
-
}
|
|
1708
|
-
/** Snapshot the owner's canonical tool calls onto the allowlisted response. */
|
|
1709
|
-
function snapshotResponseToolCalls(value) {
|
|
1710
|
-
if (value === void 0) return void 0;
|
|
1711
|
-
if (!Array.isArray(value) || value.length === 0) throw new OwnerModelContractError("optimizer model callback response toolCalls must be a non-empty array when present");
|
|
1712
|
-
return value.map((entry) => {
|
|
1713
|
-
if (!isRecord(entry) || typeof entry.id !== "string" || !entry.id || typeof entry.name !== "string" || !entry.name || typeof entry.argumentsJson !== "string") throw new OwnerModelContractError("optimizer model callback response toolCalls entries require string id, name, and argumentsJson");
|
|
1714
|
-
return {
|
|
1715
|
-
id: entry.id,
|
|
1716
|
-
name: entry.name,
|
|
1717
|
-
argumentsJson: entry.argumentsJson
|
|
1718
|
-
};
|
|
1719
|
-
});
|
|
1720
1664
|
}
|
|
1721
|
-
function
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1665
|
+
function conservativeMaximumUsage(inputTokenUpperBound, outputTokenUpperBound, pricing) {
|
|
1666
|
+
if (pricing === void 0) return {
|
|
1667
|
+
inputTokens: inputTokenUpperBound,
|
|
1668
|
+
outputTokens: outputTokenUpperBound
|
|
1669
|
+
};
|
|
1670
|
+
const inputRates = [pricing.inputUsdPerMillion, pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion];
|
|
1671
|
+
const mostExpensiveInputClass = inputRates.indexOf(Math.max(...inputRates));
|
|
1725
1672
|
return {
|
|
1726
|
-
|
|
1727
|
-
|
|
1673
|
+
inputTokens: mostExpensiveInputClass === 0 ? inputTokenUpperBound : 0,
|
|
1674
|
+
...mostExpensiveInputClass === 1 ? { cachedTokens: inputTokenUpperBound } : {},
|
|
1675
|
+
cacheWriteTokens: inputTokenUpperBound,
|
|
1676
|
+
outputTokens: outputTokenUpperBound
|
|
1728
1677
|
};
|
|
1729
1678
|
}
|
|
1730
|
-
function
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
incomplete_details: finishReason === "length" ? { reason: "max_output_tokens" } : null,
|
|
1755
|
-
output: [{
|
|
1756
|
-
id: `msg-${args.callId}`,
|
|
1757
|
-
type: "message",
|
|
1758
|
-
status: finishReason === "length" ? "incomplete" : "completed",
|
|
1759
|
-
role: "assistant",
|
|
1760
|
-
content: [{
|
|
1761
|
-
type: "output_text",
|
|
1762
|
-
text: args.response.content,
|
|
1763
|
-
annotations: []
|
|
1764
|
-
}]
|
|
1765
|
-
}],
|
|
1766
|
-
output_text: args.response.content,
|
|
1767
|
-
...usage ? { usage } : {}
|
|
1768
|
-
};
|
|
1769
|
-
const encoded = new TextEncoder().encode(JSON.stringify(body));
|
|
1770
|
-
if (encoded.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
|
|
1771
|
-
return encoded;
|
|
1679
|
+
function readBody(request, maximumBytes) {
|
|
1680
|
+
return new Promise((resolvePromise, reject) => {
|
|
1681
|
+
let size = 0;
|
|
1682
|
+
let tooLarge = false;
|
|
1683
|
+
const chunks = [];
|
|
1684
|
+
request.on("data", (chunk) => {
|
|
1685
|
+
if (tooLarge) return;
|
|
1686
|
+
size += chunk.byteLength;
|
|
1687
|
+
if (size > maximumBytes) {
|
|
1688
|
+
tooLarge = true;
|
|
1689
|
+
chunks.length = 0;
|
|
1690
|
+
return;
|
|
1691
|
+
}
|
|
1692
|
+
chunks.push(chunk);
|
|
1693
|
+
});
|
|
1694
|
+
request.on("error", reject);
|
|
1695
|
+
request.on("end", () => {
|
|
1696
|
+
if (tooLarge) {
|
|
1697
|
+
reject(new RequestBodyTooLargeError("optimizer model request body too large"));
|
|
1698
|
+
return;
|
|
1699
|
+
}
|
|
1700
|
+
resolvePromise(new Uint8Array(Buffer.concat(chunks)));
|
|
1701
|
+
});
|
|
1702
|
+
});
|
|
1772
1703
|
}
|
|
1773
|
-
function
|
|
1774
|
-
|
|
1775
|
-
return path === "/v1/responses" ? "responses" : "chat-completions";
|
|
1704
|
+
function isAbortError(error) {
|
|
1705
|
+
return error.name === "AbortError" || error.message.toLowerCase().includes("abort");
|
|
1776
1706
|
}
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1707
|
+
//#endregion
|
|
1708
|
+
//#region src/campaign/external-optimizer-model-proxy.ts
|
|
1709
|
+
/**
|
|
1710
|
+
* Put an OpenAI-compatible optimizer behind the shared cost ledger.
|
|
1711
|
+
*
|
|
1712
|
+
* The child process receives only a loopback URL and an ephemeral token. The
|
|
1713
|
+
* package that owns execution receives a validated immutable request through
|
|
1714
|
+
* `call`; Eval receives no provider credential. Every request reserves its
|
|
1715
|
+
* conservative byte-count input bound plus the declared output cap before the
|
|
1716
|
+
* owner is invoked exactly once.
|
|
1717
|
+
*/
|
|
1718
|
+
async function startExternalOptimizerModelProxy(args) {
|
|
1719
|
+
assertModelProxyConfig(args);
|
|
1720
|
+
args.signal?.throwIfAborted();
|
|
1721
|
+
const token = randomLocalToken();
|
|
1722
|
+
let requestCount = 0;
|
|
1723
|
+
let successfulCompletionCount = 0;
|
|
1724
|
+
const wireCounts = {
|
|
1725
|
+
openai: {
|
|
1726
|
+
requestAttempts: 0,
|
|
1727
|
+
successfulCompletions: 0
|
|
1728
|
+
},
|
|
1729
|
+
anthropic: {
|
|
1730
|
+
requestAttempts: 0,
|
|
1731
|
+
successfulCompletions: 0
|
|
1732
|
+
}
|
|
1782
1733
|
};
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1734
|
+
let modelCallInvocations = 0;
|
|
1735
|
+
let executionRecordCount = 0;
|
|
1736
|
+
let executionSequence = 0;
|
|
1737
|
+
const failures = [];
|
|
1738
|
+
let totalRequestCount = args.initialUsage?.requests ?? 0;
|
|
1739
|
+
let committedForBudget = args.initialUsage?.costUsd ?? 0;
|
|
1740
|
+
let reservedForBudget = 0;
|
|
1741
|
+
let accepting = true;
|
|
1742
|
+
let closePromise;
|
|
1743
|
+
const activeControllers = /* @__PURE__ */ new Set();
|
|
1744
|
+
const activeHandlers = /* @__PURE__ */ new Set();
|
|
1745
|
+
const server = createServer((request, response) => {
|
|
1746
|
+
if (!accepting) {
|
|
1747
|
+
sendJsonIfOpen(response, 503, { error: "external optimizer model proxy is closing" });
|
|
1748
|
+
return;
|
|
1749
|
+
}
|
|
1750
|
+
const controller = new AbortController();
|
|
1751
|
+
const abortRequest = () => {
|
|
1752
|
+
request.destroy();
|
|
1753
|
+
response.destroy();
|
|
1754
|
+
};
|
|
1755
|
+
activeControllers.add(controller);
|
|
1756
|
+
controller.signal.addEventListener("abort", abortRequest, { once: true });
|
|
1757
|
+
let handler;
|
|
1758
|
+
handler = handleModelProxyRequest({
|
|
1759
|
+
request,
|
|
1760
|
+
response,
|
|
1761
|
+
controller,
|
|
1762
|
+
token,
|
|
1763
|
+
args,
|
|
1764
|
+
nextReservation: (maximumCostUsd, wire) => {
|
|
1765
|
+
if (totalRequestCount >= args.budget.maxRequests) return {
|
|
1766
|
+
accepted: false,
|
|
1767
|
+
reason: "optimizer model request limit reached"
|
|
1768
|
+
};
|
|
1769
|
+
if (args.budget.maxCostUsd !== void 0 && maximumCostUsd !== void 0 && committedForBudget + reservedForBudget + maximumCostUsd > args.budget.maxCostUsd + Number.EPSILON) return {
|
|
1770
|
+
accepted: false,
|
|
1771
|
+
reason: "optimizer model cost limit reached"
|
|
1772
|
+
};
|
|
1773
|
+
requestCount += 1;
|
|
1774
|
+
wireCounts[wire].requestAttempts += 1;
|
|
1775
|
+
totalRequestCount += 1;
|
|
1776
|
+
reservedForBudget += maximumCostUsd ?? 0;
|
|
1777
|
+
return { accepted: true };
|
|
1778
|
+
},
|
|
1779
|
+
settleReservation: (maximumCostUsd, chargedCostUsd) => {
|
|
1780
|
+
reservedForBudget = Math.max(0, reservedForBudget - (maximumCostUsd ?? 0));
|
|
1781
|
+
committedForBudget += chargedCostUsd ?? 0;
|
|
1782
|
+
},
|
|
1783
|
+
recordSuccessfulCompletion: (wire) => {
|
|
1784
|
+
successfulCompletionCount += 1;
|
|
1785
|
+
wireCounts[wire].successfulCompletions += 1;
|
|
1786
|
+
},
|
|
1787
|
+
recordExecutionReceipt: (observation) => {
|
|
1788
|
+
try {
|
|
1789
|
+
args.recordExecution({
|
|
1790
|
+
...observation,
|
|
1791
|
+
sequence: executionSequence + 1
|
|
1792
|
+
});
|
|
1793
|
+
} catch (error) {
|
|
1794
|
+
throw new ModelExecutionPersistenceError(`optimizer model execution evidence was not persisted: ${errorMessage(error)}`);
|
|
1795
|
+
}
|
|
1796
|
+
executionSequence += 1;
|
|
1797
|
+
executionRecordCount += 1;
|
|
1798
|
+
},
|
|
1799
|
+
recordModelCallInvocation: () => {
|
|
1800
|
+
modelCallInvocations += 1;
|
|
1801
|
+
},
|
|
1802
|
+
recordFailure: (error) => {
|
|
1803
|
+
failures.push(error);
|
|
1804
|
+
}
|
|
1805
|
+
}).finally(() => {
|
|
1806
|
+
controller.signal.removeEventListener("abort", abortRequest);
|
|
1807
|
+
activeControllers.delete(controller);
|
|
1808
|
+
activeHandlers.delete(handler);
|
|
1809
|
+
});
|
|
1810
|
+
activeHandlers.add(handler);
|
|
1811
|
+
handler.catch(() => void 0);
|
|
1812
|
+
});
|
|
1813
|
+
const port = await listenLocal(server);
|
|
1814
|
+
const close = () => {
|
|
1815
|
+
closePromise ??= closeModelProxy();
|
|
1816
|
+
return closePromise;
|
|
1798
1817
|
};
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
}
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
if (pricing === void 0) return {
|
|
1808
|
-
inputTokens: inputTokenUpperBound,
|
|
1809
|
-
outputTokens: outputTokenUpperBound
|
|
1818
|
+
const onAbort = () => {
|
|
1819
|
+
for (const controller of activeControllers) controller.abort(args.signal?.reason);
|
|
1820
|
+
close().catch(() => void 0);
|
|
1821
|
+
};
|
|
1822
|
+
args.signal?.addEventListener("abort", onAbort, { once: true });
|
|
1823
|
+
if (args.signal?.aborted) onAbort();
|
|
1824
|
+
const assertExecutionComplete = () => {
|
|
1825
|
+
if (executionRecordCount !== modelCallInvocations) throw new Error(`external optimizer model callback returned ${executionRecordCount} execution records for ${modelCallInvocations} invoked calls`);
|
|
1810
1826
|
};
|
|
1811
|
-
const inputRates = [pricing.inputUsdPerMillion, pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion];
|
|
1812
|
-
const mostExpensiveInputClass = inputRates.indexOf(Math.max(...inputRates));
|
|
1813
1827
|
return {
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1828
|
+
baseUrl: `http://127.0.0.1:${port}/v1`,
|
|
1829
|
+
apiKey: token,
|
|
1830
|
+
requestAttempts: () => requestCount,
|
|
1831
|
+
successfulCompletions: () => successfulCompletionCount,
|
|
1832
|
+
wireUsage: () => ({
|
|
1833
|
+
openai: { ...wireCounts.openai },
|
|
1834
|
+
anthropic: { ...wireCounts.anthropic }
|
|
1835
|
+
}),
|
|
1836
|
+
assertExecutionComplete,
|
|
1837
|
+
failures: () => [...failures],
|
|
1838
|
+
close
|
|
1818
1839
|
};
|
|
1840
|
+
async function closeModelProxy() {
|
|
1841
|
+
args.signal?.removeEventListener("abort", onAbort);
|
|
1842
|
+
accepting = false;
|
|
1843
|
+
const closingServer = closeServer(server);
|
|
1844
|
+
server.closeIdleConnections?.();
|
|
1845
|
+
const [serverResult] = await Promise.allSettled([closingServer, waitForActiveHandlers(activeHandlers)]);
|
|
1846
|
+
if (activeControllers.size !== 0 || activeHandlers.size !== 0) throw new Error("external optimizer model proxy closed with active request work");
|
|
1847
|
+
let executionError;
|
|
1848
|
+
try {
|
|
1849
|
+
assertExecutionComplete();
|
|
1850
|
+
} catch (error) {
|
|
1851
|
+
executionError = error;
|
|
1852
|
+
}
|
|
1853
|
+
if (serverResult?.status === "rejected" && executionError !== void 0) throw new AggregateError([serverResult.reason, executionError], "external optimizer model proxy close and execution evidence both failed");
|
|
1854
|
+
if (serverResult?.status === "rejected") throw serverResult.reason;
|
|
1855
|
+
if (executionError !== void 0) throw executionError;
|
|
1856
|
+
}
|
|
1819
1857
|
}
|
|
1820
1858
|
function assertModelProxyConfig(args) {
|
|
1821
1859
|
assertServedModelPolicy(args.servedModelPolicy, "external optimizer model proxy: servedModelPolicy");
|
|
@@ -1840,49 +1878,9 @@ function assertModelProxyConfig(args) {
|
|
|
1840
1878
|
if (args.initialUsage.requests > args.budget.maxRequests || args.budget.maxCostUsd !== void 0 && args.initialUsage.costUsd !== void 0 && args.initialUsage.costUsd > args.budget.maxCostUsd + Number.EPSILON) throw new Error("external optimizer model proxy: initialUsage exceeds the configured budget");
|
|
1841
1879
|
}
|
|
1842
1880
|
}
|
|
1843
|
-
var RequestBodyTooLargeError = class extends Error {};
|
|
1844
|
-
var ProviderResponseTooLargeError = class extends Error {
|
|
1845
|
-
constructor() {
|
|
1846
|
-
super("optimizer model response exceeds maxResponseBytes");
|
|
1847
|
-
}
|
|
1848
|
-
};
|
|
1849
|
-
var MissingModelExecutionError = class extends Error {};
|
|
1850
|
-
var ModelExecutionPersistenceError = class extends Error {};
|
|
1851
|
-
var OwnerModelContractError = class extends Error {};
|
|
1852
|
-
function readBody(request, maximumBytes) {
|
|
1853
|
-
return new Promise((resolvePromise, reject) => {
|
|
1854
|
-
let size = 0;
|
|
1855
|
-
let tooLarge = false;
|
|
1856
|
-
const chunks = [];
|
|
1857
|
-
request.on("data", (chunk) => {
|
|
1858
|
-
if (tooLarge) return;
|
|
1859
|
-
size += chunk.byteLength;
|
|
1860
|
-
if (size > maximumBytes) {
|
|
1861
|
-
tooLarge = true;
|
|
1862
|
-
chunks.length = 0;
|
|
1863
|
-
return;
|
|
1864
|
-
}
|
|
1865
|
-
chunks.push(chunk);
|
|
1866
|
-
});
|
|
1867
|
-
request.on("error", reject);
|
|
1868
|
-
request.on("end", () => {
|
|
1869
|
-
if (tooLarge) {
|
|
1870
|
-
reject(new RequestBodyTooLargeError("optimizer model request body too large"));
|
|
1871
|
-
return;
|
|
1872
|
-
}
|
|
1873
|
-
resolvePromise(new Uint8Array(Buffer.concat(chunks)));
|
|
1874
|
-
});
|
|
1875
|
-
});
|
|
1876
|
-
}
|
|
1877
1881
|
function randomLocalToken() {
|
|
1878
1882
|
return randomBytes(32).toString("hex");
|
|
1879
1883
|
}
|
|
1880
|
-
function isAbortError(error) {
|
|
1881
|
-
return error.name === "AbortError" || error.message.toLowerCase().includes("abort");
|
|
1882
|
-
}
|
|
1883
|
-
function toErrorMessage(error) {
|
|
1884
|
-
return error instanceof Error ? error.message : String(error);
|
|
1885
|
-
}
|
|
1886
1884
|
//#endregion
|
|
1887
1885
|
//#region src/campaign/external-optimizer-resources.ts
|
|
1888
1886
|
async function runWithCleanup(args) {
|
|
@@ -2160,6 +2158,6 @@ function summarizeProcessOutput(capture, max = 4e3) {
|
|
|
2160
2158
|
return `${compact.slice(0, headChars)}...[${compact.length - max} chars omitted]...${compact.slice(-tailChars)}`;
|
|
2161
2159
|
}
|
|
2162
2160
|
//#endregion
|
|
2163
|
-
export {
|
|
2161
|
+
export { spanningWindow as A, UNKNOWN_LINEAGE as C, mostSevere as D, mergeEvidenceUnits as E, fsCampaignStorage as M, inMemoryCampaignStorage as N, parseAnalystFinding as O, ProposalFindingSchema as S, lineageRoots as T, resolveExternalOptimizerCallbackLimits as _, closeServer as a, AnalystFindingSchema as b, waitForActiveHandlers as c, assertExternalOptimizerModelBudget as d, assertJsonValue as f, removeCredentialEnvironment as g, isExternalTextCandidate as h, startExternalOptimizerModelProxy as i, createRunCostLedger as j, readFindingScope as k, DEFAULT_EXTERNAL_OPTIMIZER_CALLBACK_LIMITS as l, isCandidateText as m, closeExternalOptimizerResources as n, listenLocal as o, assertNoCredentialValues as p, runWithCleanup as r, sendJsonIfOpen as s, runExternalOptimizerProcess as t, DEFAULT_EXTERNAL_OPTIMIZER_PROCESS_LIMITS as u, resolveExternalOptimizerProcessLimits as v, independentUnitCount as w, FINDING_LAYERS as x, safePathComponent as y };
|
|
2164
2162
|
|
|
2165
|
-
//# sourceMappingURL=external-optimizer-subprocess-
|
|
2163
|
+
//# sourceMappingURL=external-optimizer-subprocess-XIHBOSKt.js.map
|