@sixb/core 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.js +77 -89
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/run-dispatch.d.ts.map +1 -1
- package/dist/actions/types/context.d.ts +2 -0
- package/dist/actions/types/context.d.ts.map +1 -1
- package/dist/actions/validation.d.ts +1 -1
- package/dist/actions/validation.d.ts.map +1 -1
- package/dist/actions/worker.js +33 -37
- package/dist/actions/worker.js.map +2 -2
- package/dist/agents/adapters.d.ts +3 -3
- package/dist/agents/{context.d.ts → context/entries.d.ts} +3 -3
- package/dist/agents/context/entries.d.ts.map +1 -0
- package/dist/agents/context/index.d.ts +4 -0
- package/dist/agents/context/index.d.ts.map +1 -0
- package/dist/agents/context/index.js +19 -0
- package/dist/agents/{streams.js.map → context/index.js.map} +1 -1
- package/dist/agents/context-model.d.ts +1 -1
- package/dist/agents/context-model.d.ts.map +1 -1
- package/dist/agents/context-resolution.d.ts +1 -1
- package/dist/agents/context-resolution.d.ts.map +1 -1
- package/dist/agents/index.d.ts +4 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +192 -204
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +1 -1
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +2 -0
- package/dist/agents/model-loop.d.ts.map +1 -1
- package/dist/agents/request.d.ts +1 -1
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/streams/index.d.ts +4 -0
- package/dist/agents/streams/index.d.ts.map +1 -0
- package/dist/agents/streams/index.js +20 -0
- package/dist/{chunk-y64skrwp.js.map → agents/streams/index.js.map} +1 -1
- package/dist/agents/streams/internal.d.ts +3 -0
- package/dist/agents/streams/internal.d.ts.map +1 -0
- package/dist/agents/streams/internal.js +40 -0
- package/dist/agents/{context.js.map → streams/internal.js.map} +1 -1
- package/dist/agents/{streams.d.ts → streams/protocol.d.ts} +5 -5
- package/dist/agents/streams/protocol.d.ts.map +1 -0
- package/dist/agents/types.d.ts +1 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +96 -108
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/strategy.js +8 -9
- package/dist/auth/strategy.js.map +1 -1
- package/dist/authorization/index.js +51 -56
- package/dist/authorization/index.js.map +1 -1
- package/dist/blob-storage/browser.js +15 -17
- package/dist/blob-storage/browser.js.map +1 -1
- package/dist/blob-storage/index.js +36 -38
- package/dist/blob-storage/index.js.map +1 -1
- package/dist/bootstrap/discovery.d.ts +14 -1
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.d.ts +2 -2
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +79 -88
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/index.js +8 -10
- package/dist/broker/index.js.map +1 -1
- package/dist/{chunk-k34z5rvh.js → chunk-0rdrecsb.js} +18 -18
- package/dist/{chunk-k34z5rvh.js.map → chunk-0rdrecsb.js.map} +2 -2
- package/dist/{chunk-q0k9nc5a.js → chunk-0w35wavj.js} +98 -98
- package/dist/{chunk-q0k9nc5a.js.map → chunk-0w35wavj.js.map} +2 -2
- package/dist/chunk-0y39rgsb.js +43 -0
- package/dist/{chunk-c15dr03f.js.map → chunk-0y39rgsb.js.map} +2 -2
- package/dist/{chunk-k522z7v6.js → chunk-17kfctj6.js} +16 -11
- package/dist/chunk-17kfctj6.js.map +10 -0
- package/dist/{chunk-aa2pen2v.js → chunk-1enhpacz.js} +188 -175
- package/dist/{chunk-aa2pen2v.js.map → chunk-1enhpacz.js.map} +2 -2
- package/dist/{chunk-5gd7tpv6.js → chunk-2c4j899j.js} +4 -4
- package/dist/{chunk-5gd7tpv6.js.map → chunk-2c4j899j.js.map} +2 -2
- package/dist/{chunk-fvt9rjsa.js → chunk-38zv5rkr.js} +4 -4
- package/dist/{chunk-fvt9rjsa.js.map → chunk-38zv5rkr.js.map} +1 -1
- package/dist/{chunk-w3e09qqk.js → chunk-39tqv9hz.js} +24 -24
- package/dist/{chunk-w3e09qqk.js.map → chunk-39tqv9hz.js.map} +2 -2
- package/dist/{chunk-04b07a9q.js → chunk-3bh94gbw.js} +13 -13
- package/dist/{chunk-04b07a9q.js.map → chunk-3bh94gbw.js.map} +2 -2
- package/dist/{chunk-8m5ejdpn.js → chunk-3f7veca0.js} +4 -4
- package/dist/{chunk-8m5ejdpn.js.map → chunk-3f7veca0.js.map} +2 -2
- package/dist/chunk-3frsnm7x.js +32 -0
- package/dist/chunk-3frsnm7x.js.map +11 -0
- package/dist/{chunk-n2w475r0.js → chunk-3tgwrcyh.js} +81 -81
- package/dist/{chunk-n2w475r0.js.map → chunk-3tgwrcyh.js.map} +2 -2
- package/dist/{chunk-mwsxn98e.js → chunk-52hbv0ak.js} +170 -170
- package/dist/{chunk-mwsxn98e.js.map → chunk-52hbv0ak.js.map} +4 -4
- package/dist/{chunk-nf4r78r4.js → chunk-5a4a52tq.js} +4 -4
- package/dist/{chunk-nf4r78r4.js.map → chunk-5a4a52tq.js.map} +2 -2
- package/dist/{chunk-rte5sm3z.js → chunk-5hz0fnca.js} +23 -23
- package/dist/{chunk-rte5sm3z.js.map → chunk-5hz0fnca.js.map} +2 -2
- package/dist/chunk-653vwrzr.js +39 -0
- package/dist/chunk-653vwrzr.js.map +10 -0
- package/dist/{chunk-qw9gvjv5.js → chunk-72w2pxk7.js} +13 -13
- package/dist/{chunk-qw9gvjv5.js.map → chunk-72w2pxk7.js.map} +2 -2
- package/dist/chunk-7apz6hg4.js +50 -0
- package/dist/{chunk-jq43kdvk.js.map → chunk-7apz6hg4.js.map} +2 -2
- package/dist/chunk-7bs40fe1.js +218 -0
- package/dist/{chunk-p1rzczbt.js.map → chunk-7bs40fe1.js.map} +3 -3
- package/dist/chunk-7zgecwy1.js +113 -0
- package/dist/chunk-7zgecwy1.js.map +10 -0
- package/dist/{chunk-pc7ys28c.js → chunk-860dwwy0.js} +29 -29
- package/dist/{chunk-pc7ys28c.js.map → chunk-860dwwy0.js.map} +2 -2
- package/dist/chunk-8vj0rjgs.js +165 -0
- package/dist/chunk-8vj0rjgs.js.map +15 -0
- package/dist/{chunk-7y0f6rf1.js → chunk-92vk7gta.js} +58 -58
- package/dist/chunk-92vk7gta.js.map +10 -0
- package/dist/{chunk-rafagrwr.js → chunk-93csa55g.js} +45 -17
- package/dist/chunk-93csa55g.js.map +11 -0
- package/dist/{chunk-d8qkxt2v.js → chunk-98cw09sw.js} +7 -7
- package/dist/chunk-98cw09sw.js.map +10 -0
- package/dist/{chunk-n4khvw9n.js → chunk-9qsh3p5y.js} +17 -17
- package/dist/{chunk-n4khvw9n.js.map → chunk-9qsh3p5y.js.map} +2 -2
- package/dist/{chunk-4a849fr1.js → chunk-9tc8dxmn.js} +1 -1
- package/dist/{chunk-9nbmsvn5.js → chunk-9vx5e9g1.js} +9 -9
- package/dist/{chunk-9nbmsvn5.js.map → chunk-9vx5e9g1.js.map} +2 -2
- package/dist/{chunk-f26bck4t.js → chunk-an5tt9y0.js} +353 -353
- package/dist/{chunk-f26bck4t.js.map → chunk-an5tt9y0.js.map} +2 -2
- package/dist/{chunk-2dw777qw.js → chunk-ap0g1g74.js} +37 -82
- package/dist/{chunk-2dw777qw.js.map → chunk-ap0g1g74.js.map} +3 -4
- package/dist/{chunk-v4en4jc2.js → chunk-awbhdqyc.js} +7 -7
- package/dist/{chunk-v4en4jc2.js.map → chunk-awbhdqyc.js.map} +2 -2
- package/dist/{chunk-ka3a2ft3.js → chunk-b19g04jk.js} +12 -12
- package/dist/{chunk-ka3a2ft3.js.map → chunk-b19g04jk.js.map} +2 -2
- package/dist/{chunk-nx7k8tpr.js → chunk-br3k6qbf.js} +23 -23
- package/dist/{chunk-nx7k8tpr.js.map → chunk-br3k6qbf.js.map} +2 -2
- package/dist/{chunk-dbc80ad7.js → chunk-c5rkjrgp.js} +28 -28
- package/dist/{chunk-dbc80ad7.js.map → chunk-c5rkjrgp.js.map} +2 -2
- package/dist/{chunk-dktq02ne.js → chunk-cqr3acm1.js} +4 -4
- package/dist/{chunk-dktq02ne.js.map → chunk-cqr3acm1.js.map} +2 -2
- package/dist/chunk-d62kjtbg.js +7 -0
- package/dist/{chunk-zcnhxkvd.js.map → chunk-d62kjtbg.js.map} +2 -2
- package/dist/{chunk-74drx9gd.js → chunk-dfm066qg.js} +10 -10
- package/dist/{chunk-74drx9gd.js.map → chunk-dfm066qg.js.map} +2 -2
- package/dist/{chunk-5e3pq99w.js → chunk-dmn70ztd.js} +30 -30
- package/dist/chunk-dmn70ztd.js.map +11 -0
- package/dist/{chunk-p1x242ad.js → chunk-dz5h08xv.js} +175 -175
- package/dist/{chunk-p1x242ad.js.map → chunk-dz5h08xv.js.map} +2 -2
- package/dist/{chunk-p2vqaxkc.js → chunk-e0d1rzef.js} +27 -22
- package/dist/{chunk-p2vqaxkc.js.map → chunk-e0d1rzef.js.map} +3 -3
- package/dist/{chunk-5sz8ta9r.js → chunk-e1c18xjx.js} +52 -52
- package/dist/{chunk-5sz8ta9r.js.map → chunk-e1c18xjx.js.map} +2 -2
- package/dist/{chunk-wtf06et8.js → chunk-emyyk7dx.js} +55 -55
- package/dist/{chunk-wtf06et8.js.map → chunk-emyyk7dx.js.map} +2 -2
- package/dist/{chunk-19jp6g9d.js → chunk-f0rwz2vh.js} +54 -33
- package/dist/chunk-f0rwz2vh.js.map +11 -0
- package/dist/{chunk-2xns679x.js → chunk-f4w3yp4f.js} +171 -36
- package/dist/chunk-f4w3yp4f.js.map +12 -0
- package/dist/{chunk-979ww6b3.js → chunk-fb3feg1e.js} +29 -29
- package/dist/{chunk-979ww6b3.js.map → chunk-fb3feg1e.js.map} +2 -2
- package/dist/{chunk-4sm0aznx.js → chunk-g00bfdq6.js} +254 -256
- package/dist/{chunk-4sm0aznx.js.map → chunk-g00bfdq6.js.map} +3 -3
- package/dist/{chunk-p03r0h5s.js → chunk-g53f0e4j.js} +76 -202
- package/dist/chunk-g53f0e4j.js.map +15 -0
- package/dist/chunk-g6cke204.js +124 -0
- package/dist/chunk-g6cke204.js.map +10 -0
- package/dist/{chunk-51fjndv0.js → chunk-gfdh9kqa.js} +4 -4
- package/dist/{chunk-51fjndv0.js.map → chunk-gfdh9kqa.js.map} +2 -2
- package/dist/chunk-h1gfhhbh.js +602 -0
- package/dist/chunk-h1gfhhbh.js.map +18 -0
- package/dist/chunk-h3v76ams.js +32 -0
- package/dist/{chunk-08m3b6w8.js.map → chunk-h3v76ams.js.map} +2 -2
- package/dist/{chunk-xajtptbw.js → chunk-hpr1r6av.js} +1367 -418
- package/dist/chunk-hpr1r6av.js.map +44 -0
- package/dist/{chunk-jecn6t54.js → chunk-jgwb25gc.js} +74 -74
- package/dist/{chunk-jecn6t54.js.map → chunk-jgwb25gc.js.map} +2 -2
- package/dist/{chunk-w9tg6yyb.js → chunk-jjy0fhrn.js} +36 -36
- package/dist/{chunk-w9tg6yyb.js.map → chunk-jjy0fhrn.js.map} +2 -2
- package/dist/{chunk-wdage1eb.js → chunk-jmfet9r4.js} +6 -6
- package/dist/{chunk-wdage1eb.js.map → chunk-jmfet9r4.js.map} +2 -2
- package/dist/{chunk-ajnan18g.js → chunk-k3cqkkn2.js} +58 -55
- package/dist/chunk-k3cqkkn2.js.map +12 -0
- package/dist/{chunk-s5y30bc9.js → chunk-kxwa347f.js} +51 -49
- package/dist/{chunk-s5y30bc9.js.map → chunk-kxwa347f.js.map} +4 -4
- package/dist/{chunk-2ab72m2h.js → chunk-m2ca93my.js} +3 -3
- package/dist/{chunk-2ab72m2h.js.map → chunk-m2ca93my.js.map} +2 -2
- package/dist/{chunk-3z1qec12.js → chunk-m3z3x9v0.js} +107 -64
- package/dist/{chunk-3z1qec12.js.map → chunk-m3z3x9v0.js.map} +3 -3
- package/dist/{chunk-sbzzr4kx.js → chunk-mjbk2djy.js} +1061 -1195
- package/dist/{chunk-sbzzr4kx.js.map → chunk-mjbk2djy.js.map} +9 -15
- package/dist/{chunk-4jjp5k14.js → chunk-mmagke4x.js} +6 -6
- package/dist/{chunk-4jjp5k14.js.map → chunk-mmagke4x.js.map} +2 -2
- package/dist/{chunk-359jm1jw.js → chunk-mrp7k0pw.js} +20 -20
- package/dist/{chunk-359jm1jw.js.map → chunk-mrp7k0pw.js.map} +2 -2
- package/dist/{chunk-h0k55pc7.js → chunk-ms2tmn1k.js} +139 -139
- package/dist/{chunk-h0k55pc7.js.map → chunk-ms2tmn1k.js.map} +2 -2
- package/dist/{chunk-rv2hkwwa.js → chunk-ppytyr6w.js} +156 -179
- package/dist/{chunk-rv2hkwwa.js.map → chunk-ppytyr6w.js.map} +3 -5
- package/dist/{chunk-trxxmgnf.js → chunk-pqajwytd.js} +10 -10
- package/dist/{chunk-trxxmgnf.js.map → chunk-pqajwytd.js.map} +3 -3
- package/dist/{chunk-nn0tekr1.js → chunk-pr2h4bv4.js} +33 -33
- package/dist/{chunk-nn0tekr1.js.map → chunk-pr2h4bv4.js.map} +2 -2
- package/dist/{chunk-xwnf87e1.js → chunk-q5gz3g2j.js} +64 -64
- package/dist/{chunk-xwnf87e1.js.map → chunk-q5gz3g2j.js.map} +2 -2
- package/dist/{chunk-5ntny1qx.js → chunk-qf954wje.js} +6 -6
- package/dist/{chunk-5ntny1qx.js.map → chunk-qf954wje.js.map} +2 -2
- package/dist/{chunk-mth82m8t.js → chunk-qhcpj9wc.js} +77 -77
- package/dist/{chunk-mth82m8t.js.map → chunk-qhcpj9wc.js.map} +2 -2
- package/dist/{chunk-tpnd31c1.js → chunk-r29fxdhn.js} +12 -12
- package/dist/{chunk-tpnd31c1.js.map → chunk-r29fxdhn.js.map} +2 -2
- package/dist/{chunk-b49dgvsj.js → chunk-r2y23egw.js} +3 -3
- package/dist/{chunk-b49dgvsj.js.map → chunk-r2y23egw.js.map} +2 -2
- package/dist/{chunk-3xep5cjx.js → chunk-r4tfx1sf.js} +104 -86
- package/dist/chunk-r4tfx1sf.js.map +15 -0
- package/dist/{chunk-4rh2m6zg.js → chunk-rb1xx120.js} +13 -13
- package/dist/{chunk-4rh2m6zg.js.map → chunk-rb1xx120.js.map} +2 -2
- package/dist/chunk-s3csryxe.js +152 -0
- package/dist/chunk-s3csryxe.js.map +11 -0
- package/dist/chunk-s670k14v.js +60 -0
- package/dist/{chunk-407j3msh.js.map → chunk-s670k14v.js.map} +2 -2
- package/dist/chunk-skz0hst3.js +788 -0
- package/dist/chunk-skz0hst3.js.map +19 -0
- package/dist/{chunk-r8jrnexe.js → chunk-v4jbb3rs.js} +4 -4
- package/dist/{chunk-r8jrnexe.js.map → chunk-v4jbb3rs.js.map} +2 -2
- package/dist/{chunk-v1xppd0y.js → chunk-vf691g1r.js} +60 -60
- package/dist/{chunk-v1xppd0y.js.map → chunk-vf691g1r.js.map} +2 -2
- package/dist/{chunk-w1tvjszy.js → chunk-vsj3mdfj.js} +8 -8
- package/dist/{chunk-w1tvjszy.js.map → chunk-vsj3mdfj.js.map} +2 -2
- package/dist/{chunk-9dzba0f2.js → chunk-wjasrj67.js} +8 -8
- package/dist/{chunk-9dzba0f2.js.map → chunk-wjasrj67.js.map} +2 -2
- package/dist/{chunk-1evzqhks.js → chunk-wr8qp979.js} +6 -6
- package/dist/{chunk-1evzqhks.js.map → chunk-wr8qp979.js.map} +2 -2
- package/dist/{chunk-n6jxh8sw.js → chunk-wy0qdqfm.js} +18 -18
- package/dist/{chunk-n6jxh8sw.js.map → chunk-wy0qdqfm.js.map} +2 -2
- package/dist/{chunk-8tsf6dmc.js → chunk-x57ycxq0.js} +204 -204
- package/dist/{chunk-8tsf6dmc.js.map → chunk-x57ycxq0.js.map} +2 -2
- package/dist/{chunk-z4ccwbkz.js → chunk-x9v4cx1d.js} +1 -1
- package/dist/{chunk-gbejpkex.js → chunk-xfbydgzy.js} +26 -26
- package/dist/{chunk-gbejpkex.js.map → chunk-xfbydgzy.js.map} +2 -2
- package/dist/{chunk-gzasd5b6.js → chunk-xyr8kppc.js} +22 -22
- package/dist/{chunk-gzasd5b6.js.map → chunk-xyr8kppc.js.map} +2 -2
- package/dist/{chunk-h5vqbfmd.js → chunk-ypbtykv6.js} +117 -117
- package/dist/{chunk-h5vqbfmd.js.map → chunk-ypbtykv6.js.map} +3 -3
- package/dist/{chunk-ry24jbr1.js → chunk-yv79ncbv.js} +10 -10
- package/dist/{chunk-ry24jbr1.js.map → chunk-yv79ncbv.js.map} +2 -2
- package/dist/{chunk-yp8ee62z.js → chunk-z30bv4ga.js} +35 -35
- package/dist/{chunk-yp8ee62z.js.map → chunk-z30bv4ga.js.map} +2 -2
- package/dist/{chunk-8ydjhh27.js → chunk-z3y411fq.js} +11 -7
- package/dist/{chunk-8ydjhh27.js.map → chunk-z3y411fq.js.map} +3 -3
- package/dist/{chunk-9t8f5xfx.js → chunk-z5rnrmz1.js} +10 -10
- package/dist/{chunk-9t8f5xfx.js.map → chunk-z5rnrmz1.js.map} +2 -2
- package/dist/{chunk-96swp2wd.js → chunk-z667z3sg.js} +3 -3
- package/dist/{chunk-96swp2wd.js.map → chunk-z667z3sg.js.map} +2 -2
- package/dist/{chunk-4yqmp43v.js → chunk-z8fx5cgb.js} +12 -12
- package/dist/{chunk-4yqmp43v.js.map → chunk-z8fx5cgb.js.map} +2 -2
- package/dist/{chunk-xhy826cz.js → chunk-zcnq6105.js} +7 -7
- package/dist/{chunk-xhy826cz.js.map → chunk-zcnq6105.js.map} +2 -2
- package/dist/{chunk-yt8wphsx.js → chunk-zvx7h87b.js} +3 -3
- package/dist/{chunk-yt8wphsx.js.map → chunk-zvx7h87b.js.map} +2 -2
- package/dist/connectors/connections/internal.js +9 -10
- package/dist/connectors/connections/internal.js.map +1 -1
- package/dist/datasets/write.js +8 -12
- package/dist/datasets/write.js.map +1 -1
- package/dist/edits/index.js +7 -8
- package/dist/edits/index.js.map +1 -1
- package/dist/error-reporting/internal.js +22 -24
- package/dist/error-reporting/internal.js.map +1 -1
- package/dist/errors/internal.d.ts +1 -1
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +22 -24
- package/dist/errors/internal.js.map +1 -1
- package/dist/errors/redaction.d.ts +8 -0
- package/dist/errors/redaction.d.ts.map +1 -0
- package/dist/errors/types.d.ts +4 -0
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/events/index.js +60 -63
- package/dist/events/index.js.map +1 -1
- package/dist/events/scope.js +4 -5
- package/dist/events/scope.js.map +1 -1
- package/dist/events/selectors/index.js +9 -10
- package/dist/events/selectors/index.js.map +1 -1
- package/dist/execution/agent.d.ts +3 -3
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +70 -82
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/durable.d.ts +1 -0
- package/dist/execution/durable.d.ts.map +1 -1
- package/dist/execution/primitive.d.ts +2 -0
- package/dist/execution/primitive.d.ts.map +1 -1
- package/dist/execution/primitive.js +63 -71
- package/dist/execution/primitive.js.map +3 -3
- package/dist/execution/request.d.ts +1 -0
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +65 -75
- package/dist/execution/request.js.map +3 -3
- package/dist/http/index.js +10 -11
- package/dist/http/index.js.map +1 -1
- package/dist/index.d.ts +14 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +455 -477
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/index.js +38 -42
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/logging/index.d.ts +3 -4
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +18 -40
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/internal.d.ts +5 -0
- package/dist/logging/internal.d.ts.map +1 -0
- package/dist/logging/internal.js +43 -0
- package/dist/logging/internal.js.map +9 -0
- package/dist/materialization/index.js +46 -49
- package/dist/materialization/index.js.map +1 -1
- package/dist/materializer/index.js +137 -145
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/errors.d.ts +4 -0
- package/dist/models/errors.d.ts.map +1 -1
- package/dist/models/execution/binding.d.ts +9 -0
- package/dist/models/execution/binding.d.ts.map +1 -0
- package/dist/models/execution/errors.d.ts +9 -0
- package/dist/models/execution/errors.d.ts.map +1 -0
- package/dist/models/execution/index.d.ts +11 -0
- package/dist/models/execution/index.d.ts.map +1 -0
- package/dist/models/execution/index.js +55 -0
- package/dist/models/execution/index.js.map +9 -0
- package/dist/models/execution/model-call-accounting.d.ts +17 -0
- package/dist/models/execution/model-call-accounting.d.ts.map +1 -0
- package/dist/models/execution/model-call-admission.d.ts +47 -0
- package/dist/models/execution/model-call-admission.d.ts.map +1 -0
- package/dist/models/execution/model-call-limits.d.ts +15 -0
- package/dist/models/execution/model-call-limits.d.ts.map +1 -0
- package/dist/models/execution/model-call-recorder.d.ts +40 -0
- package/dist/models/execution/model-call-recorder.d.ts.map +1 -0
- package/dist/models/execution/model-call-recovery.d.ts +12 -0
- package/dist/models/execution/model-call-recovery.d.ts.map +1 -0
- package/dist/models/execution/recovery-queue.d.ts +5 -0
- package/dist/models/execution/recovery-queue.d.ts.map +1 -0
- package/dist/models/execution/types.d.ts +44 -0
- package/dist/models/execution/types.d.ts.map +1 -0
- package/dist/models/execution/usage.d.ts +5 -0
- package/dist/models/execution/usage.d.ts.map +1 -0
- package/dist/models/execution.d.ts +6 -0
- package/dist/models/execution.d.ts.map +1 -0
- package/dist/models/generation-types.d.ts +40 -0
- package/dist/models/generation-types.d.ts.map +1 -0
- package/dist/models/index.d.ts +1 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +42 -43
- package/dist/models/index.js.map +1 -1
- package/dist/models/language-model.d.ts +3 -0
- package/dist/models/language-model.d.ts.map +1 -1
- package/dist/models/output.d.ts +5 -0
- package/dist/models/output.d.ts.map +1 -0
- package/dist/models/resolve.d.ts +4 -0
- package/dist/models/resolve.d.ts.map +1 -0
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +75 -87
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/query/index.js +67 -76
- package/dist/objects/query/index.js.map +1 -1
- package/dist/ontology/index.d.ts +1 -2
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +62 -113
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/internal.d.ts +7 -0
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +65 -116
- package/dist/ontology/internal.js.map +3 -4
- package/dist/pipelines/index.js +57 -66
- package/dist/pipelines/index.js.map +1 -1
- package/dist/projections/internal.js +58 -67
- package/dist/projections/internal.js.map +1 -1
- package/dist/query.d.ts +0 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +11 -15
- package/dist/query.js.map +1 -1
- package/dist/queues/index.d.ts +2 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +6 -7
- package/dist/queues/index.js.map +1 -1
- package/dist/queues/types.d.ts +3 -20
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/internal.js +4 -5
- package/dist/rules/internal.js.map +1 -1
- package/dist/runtime/create.d.ts +2 -1
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +2 -1
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.js +13 -14
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/sixb.d.ts +2 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/sandboxes/errors.d.ts +4 -0
- package/dist/sandboxes/errors.d.ts.map +1 -1
- package/dist/sandboxes/index.d.ts +2 -2
- package/dist/sandboxes/index.d.ts.map +1 -1
- package/dist/sandboxes/index.js +14 -13
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/sandboxes/sandbox.d.ts +35 -7
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -10
- package/dist/scheduler/index.js.map +1 -1
- package/dist/schedules/index.js +31 -33
- package/dist/schedules/index.js.map +1 -1
- package/dist/shares/internal.js +46 -54
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +7 -9
- package/dist/storage/action-runs/failure.js.map +1 -1
- package/dist/storage/action-runs/provider.js +4 -8
- package/dist/storage/action-runs/provider.js.map +1 -1
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +26 -30
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +0 -3
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/attribution.d.ts +4 -0
- package/dist/storage/ai-cost/attribution.d.ts.map +1 -0
- package/dist/storage/ai-cost/groups.d.ts +3 -0
- package/dist/storage/ai-cost/groups.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.d.ts +1 -0
- package/dist/storage/ai-cost/provider.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +30 -143
- package/dist/storage/ai-cost/provider.js.map +3 -4
- package/dist/storage/ai-cost/types.d.ts +15 -0
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +14 -16
- package/dist/storage/ai-limits/enforcement.js.map +1 -1
- package/dist/storage/ai-limits/provider.js +56 -57
- package/dist/storage/ai-limits/provider.js.map +1 -1
- package/dist/storage/auth/in-memory.d.ts +1 -1
- package/dist/storage/auth/in-memory.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +34 -36
- package/dist/storage/connector-connections/provider.js.map +2 -2
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +2 -1
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +14 -11
- package/dist/storage/executions/provider.js.map +3 -3
- package/dist/storage/executions/types.d.ts +6 -2
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/executions/validation.d.ts +2 -0
- package/dist/storage/executions/validation.d.ts.map +1 -1
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +6 -7
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +221 -256
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +10 -0
- package/dist/storage/internal.d.ts.map +1 -0
- package/dist/storage/internal.js +47 -0
- package/dist/storage/internal.js.map +9 -0
- package/dist/storage/ontology/provider.js +105 -109
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/operation-scope.js +18 -19
- package/dist/storage/operation-scope.js.map +1 -1
- package/dist/storage/pipeline-runs/provider.js +4 -6
- package/dist/storage/pipeline-runs/provider.js.map +1 -1
- package/dist/storage/projection-runs/provider.js +66 -70
- package/dist/storage/projection-runs/provider.js.map +1 -1
- package/dist/storage/share-grants/provider.js +17 -19
- package/dist/storage/share-grants/provider.js.map +1 -1
- package/dist/storage/share-sessions/provider.js +14 -15
- package/dist/storage/share-sessions/provider.js.map +1 -1
- package/dist/storage/sync-runs/provider.js +4 -6
- package/dist/storage/sync-runs/provider.js.map +1 -1
- package/dist/storage/webhook-runs/provider.js +4 -6
- package/dist/storage/webhook-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +13 -21
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +0 -3
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +55 -65
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/action-execution.d.ts +4 -1
- package/dist/testing/action-execution.d.ts.map +1 -1
- package/dist/testing/agent-execution.d.ts +1 -0
- package/dist/testing/agent-execution.d.ts.map +1 -1
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution.d.ts +1 -0
- package/dist/testing/execution.d.ts.map +1 -1
- package/dist/testing/index.js +911 -799
- package/dist/testing/index.js.map +9 -9
- package/dist/testing/workflow-execution.d.ts +1 -0
- package/dist/testing/workflow-execution.d.ts.map +1 -1
- package/dist/webhooks/internal.js +51 -59
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +11 -13
- package/dist/workers/index.js.map +2 -2
- package/dist/workflows/failure.d.ts +2 -0
- package/dist/workflows/failure.d.ts.map +1 -1
- package/dist/workflows/index.js +135 -147
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +0 -1
- package/dist/workflows/run-dispatch.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +2 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +48 -30
- package/src/actions/run-dispatch.ts +2 -6
- package/src/actions/types/context.ts +2 -0
- package/src/actions/validation.ts +2 -1
- package/src/agents/adapters.ts +4 -9
- package/src/agents/{context.ts → context/entries.ts} +4 -4
- package/src/agents/context/index.ts +15 -0
- package/src/agents/context-model.ts +1 -1
- package/src/agents/context-resolution.ts +1 -1
- package/src/agents/index.ts +4 -4
- package/src/agents/message.ts +1 -1
- package/src/agents/model-loop.ts +8 -0
- package/src/agents/request.ts +11 -26
- package/src/agents/streams/index.ts +18 -0
- package/src/agents/streams/internal.ts +19 -0
- package/src/agents/{streams.ts → streams/protocol.ts} +5 -5
- package/src/agents/types.ts +1 -1
- package/src/agents/validation.ts +3 -7
- package/src/auth/index.ts +0 -1
- package/src/bootstrap/discovery.ts +81 -24
- package/src/bootstrap/index.ts +8 -1
- package/src/errors/internal.ts +90 -10
- package/src/errors/redaction.ts +98 -0
- package/src/errors/types.ts +4 -0
- package/src/execution/agent.ts +5 -3
- package/src/execution/durable.ts +11 -1
- package/src/execution/primitive.ts +5 -1
- package/src/execution/request.ts +3 -0
- package/src/index.ts +20 -18
- package/src/logging/index.ts +2 -33
- package/src/logging/internal.ts +43 -0
- package/src/models/errors.ts +12 -0
- package/src/models/execution/binding.ts +29 -0
- package/src/models/execution/errors.ts +18 -0
- package/src/models/execution/index.ts +26 -0
- package/src/models/execution/model-call-accounting.ts +211 -0
- package/src/models/execution/model-call-admission.ts +127 -0
- package/src/models/execution/model-call-limits.ts +135 -0
- package/src/models/execution/model-call-recorder.ts +235 -0
- package/src/models/execution/model-call-recovery.ts +125 -0
- package/src/models/execution/recovery-queue.ts +31 -0
- package/src/models/execution/types.ts +58 -0
- package/src/models/execution/usage.ts +23 -0
- package/src/models/execution.ts +207 -0
- package/src/models/generation-types.ts +50 -0
- package/src/models/index.ts +8 -0
- package/src/models/language-model.ts +3 -0
- package/src/models/output.ts +45 -0
- package/src/models/resolve.ts +27 -0
- package/src/objects/execution.ts +1 -1
- package/src/ontology/index.ts +1 -2
- package/src/ontology/internal.ts +35 -0
- package/src/projections/run-dispatch.ts +1 -0
- package/src/query.ts +0 -1
- package/src/queues/index.ts +4 -2
- package/src/queues/types.ts +6 -25
- package/src/runtime/create.ts +2 -1
- package/src/runtime/host.ts +2 -1
- package/src/runtime/sixb.ts +4 -0
- package/src/sandboxes/errors.ts +5 -0
- package/src/sandboxes/index.ts +3 -0
- package/src/sandboxes/sandbox.ts +35 -7
- package/src/storage/agents/in-memory.ts +0 -3
- package/src/storage/agents/types.ts +0 -3
- package/src/storage/ai-cost/analytics.ts +1 -1
- package/src/storage/ai-cost/attribution.ts +15 -0
- package/src/storage/ai-cost/groups.ts +5 -1
- package/src/storage/ai-cost/provider.ts +1 -0
- package/src/storage/ai-cost/types.ts +7 -0
- package/src/storage/auth/in-memory.ts +1 -1
- package/src/storage/executions/in-memory.ts +4 -9
- package/src/storage/executions/provider.ts +4 -0
- package/src/storage/executions/types.ts +6 -2
- package/src/storage/executions/validation.ts +32 -0
- package/src/storage/in-memory/index.ts +16 -1
- package/src/storage/index.ts +3 -29
- package/src/storage/internal.ts +20 -0
- package/src/storage/workflow-runs/in-memory.ts +0 -2
- package/src/storage/workflow-runs/types.ts +0 -3
- package/src/testing/action-execution.ts +9 -2
- package/src/testing/agent-execution.ts +3 -0
- package/src/testing/agent-storage-contract.ts +0 -5
- package/src/testing/ai-model-call-groups-contract.ts +74 -2
- package/src/testing/execution-storage-contract.ts +59 -1
- package/src/testing/execution.ts +6 -0
- package/src/testing/workflow-execution.ts +4 -0
- package/src/workflows/failure.ts +62 -1
- package/src/workflows/request.ts +0 -9
- package/src/workflows/run-dispatch.ts +0 -3
- package/src/workflows/types.ts +2 -0
- package/src/workflows/validation.ts +1 -1
- package/dist/agents/context.d.ts.map +0 -1
- package/dist/agents/context.js +0 -23
- package/dist/agents/streams.d.ts.map +0 -1
- package/dist/agents/streams.js +0 -55
- package/dist/chunk-08m3b6w8.js +0 -32
- package/dist/chunk-19jp6g9d.js.map +0 -11
- package/dist/chunk-2xns679x.js.map +0 -11
- package/dist/chunk-3xep5cjx.js.map +0 -15
- package/dist/chunk-407j3msh.js +0 -60
- package/dist/chunk-4qfkag59.js +0 -1568
- package/dist/chunk-4qfkag59.js.map +0 -20
- package/dist/chunk-5e3pq99w.js.map +0 -11
- package/dist/chunk-7y0f6rf1.js.map +0 -10
- package/dist/chunk-ajnan18g.js.map +0 -12
- package/dist/chunk-c15dr03f.js +0 -43
- package/dist/chunk-d8qkxt2v.js.map +0 -10
- package/dist/chunk-jq43kdvk.js +0 -50
- package/dist/chunk-k522z7v6.js.map +0 -10
- package/dist/chunk-p03r0h5s.js.map +0 -16
- package/dist/chunk-p1rzczbt.js +0 -218
- package/dist/chunk-rafagrwr.js.map +0 -11
- package/dist/chunk-xajtptbw.js.map +0 -40
- package/dist/chunk-y64skrwp.js +0 -19
- package/dist/chunk-zcnhxkvd.js +0 -7
- package/dist/logging/types.js +0 -27
- package/dist/logging/types.js.map +0 -9
- /package/dist/{chunk-zqqz8052.js → chunk-7n30ybym.js} +0 -0
- /package/dist/{chunk-zqqz8052.js.map → chunk-7n30ybym.js.map} +0 -0
- /package/dist/{chunk-4a849fr1.js.map → chunk-9tc8dxmn.js.map} +0 -0
- /package/dist/{chunk-j1sbhm7p.js → chunk-ey1nk510.js} +0 -0
- /package/dist/{chunk-j1sbhm7p.js.map → chunk-ey1nk510.js.map} +0 -0
- /package/dist/{chunk-z4ccwbkz.js.map → chunk-x9v4cx1d.js.map} +0 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto"
|
|
2
|
+
import type { ReadonlyJsonObject, RecordAiModelCallInput } from "../../storage"
|
|
3
|
+
import type { ModelCallEndEvent, ModelUsage } from "../events"
|
|
4
|
+
import type { LanguageModel, LanguageModelRequest } from "../language-model"
|
|
5
|
+
import { ModelUsageRecordingError } from "./errors"
|
|
6
|
+
import {
|
|
7
|
+
normalizeModelCallAccounting,
|
|
8
|
+
recordAiModelCallAccounting,
|
|
9
|
+
requireAccountingCapabilities,
|
|
10
|
+
} from "./model-call-accounting"
|
|
11
|
+
import {
|
|
12
|
+
aiModelCallOutputTokenAllowance,
|
|
13
|
+
type BeforeAiModelCall,
|
|
14
|
+
estimateAiModelCallInputTokens,
|
|
15
|
+
estimatedAiModelCallTotalTokens,
|
|
16
|
+
} from "./model-call-admission"
|
|
17
|
+
import type { AiModelCallLimitController } from "./model-call-limits"
|
|
18
|
+
import { isPermanentAiUsageRecoveryError } from "./model-call-recovery"
|
|
19
|
+
import type {
|
|
20
|
+
ModelCallAccountingStorage,
|
|
21
|
+
RecoverAiModelCall,
|
|
22
|
+
RecoverAiModelCallInput,
|
|
23
|
+
} from "./types"
|
|
24
|
+
import { aiModelCallUsageFromModel } from "./usage"
|
|
25
|
+
|
|
26
|
+
const STORAGE_RETRY_DELAYS_MS = [50, 200, 600] as const
|
|
27
|
+
|
|
28
|
+
export interface AiModelCallRecorderInput {
|
|
29
|
+
readonly storage: ModelCallAccountingStorage
|
|
30
|
+
readonly projectId: string
|
|
31
|
+
readonly executionId: string
|
|
32
|
+
readonly attempt: number
|
|
33
|
+
readonly requesterGroupIds: readonly string[]
|
|
34
|
+
readonly limits: AiModelCallLimitController
|
|
35
|
+
readonly recoverAiModelCall: RecoverAiModelCall
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface AiModelCallRecorderInternals {
|
|
39
|
+
readonly generateId?: () => string
|
|
40
|
+
readonly now?: () => Date
|
|
41
|
+
readonly retryDelaysMs?: readonly number[]
|
|
42
|
+
readonly sleep?: (ms: number) => Promise<void>
|
|
43
|
+
readonly recordAccounting?: (input: RecoverAiModelCallInput) => Promise<void>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Persist every completed provider call before another billable loop step can start. */
|
|
47
|
+
export class AiModelCallRecorder {
|
|
48
|
+
private readonly generateId: () => string
|
|
49
|
+
private readonly now: () => Date
|
|
50
|
+
private readonly retryDelaysMs: readonly number[]
|
|
51
|
+
private readonly sleep: (ms: number) => Promise<void>
|
|
52
|
+
private readonly recordAccounting: (input: RecoverAiModelCallInput) => Promise<void>
|
|
53
|
+
private readonly reservations = new Set<string>()
|
|
54
|
+
private admissionError: unknown
|
|
55
|
+
private recordingError: ModelUsageRecordingError | undefined
|
|
56
|
+
|
|
57
|
+
constructor(
|
|
58
|
+
private readonly input: AiModelCallRecorderInput,
|
|
59
|
+
internals: AiModelCallRecorderInternals = {}
|
|
60
|
+
) {
|
|
61
|
+
requireAccountingCapabilities(input.storage)
|
|
62
|
+
this.generateId = internals.generateId ?? (() => `ai_usage_${randomUUID()}`)
|
|
63
|
+
this.now = internals.now ?? (() => new Date())
|
|
64
|
+
this.retryDelaysMs = internals.retryDelaysMs ?? STORAGE_RETRY_DELAYS_MS
|
|
65
|
+
this.sleep = internals.sleep ?? sleep
|
|
66
|
+
this.recordAccounting =
|
|
67
|
+
internals.recordAccounting ??
|
|
68
|
+
(async (recovery) => {
|
|
69
|
+
await recordAiModelCallAccounting({ storage: this.input.storage, ...recovery })
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Wrap the resolved model so all calls in an execution share admission. */
|
|
74
|
+
wrapModel(model: LanguageModel): LanguageModel {
|
|
75
|
+
return {
|
|
76
|
+
providerId: model.providerId,
|
|
77
|
+
modelId: model.modelId,
|
|
78
|
+
definition: model.definition,
|
|
79
|
+
costEstimator: model.costEstimator,
|
|
80
|
+
...(model.validateResponseFormat === undefined
|
|
81
|
+
? {}
|
|
82
|
+
: { validateResponseFormat: model.validateResponseFormat.bind(model) }),
|
|
83
|
+
stream: async (request) => {
|
|
84
|
+
this.assertHealthy()
|
|
85
|
+
const inputTokens = estimateAiModelCallInputTokens({
|
|
86
|
+
prompt: request.messages,
|
|
87
|
+
tools: request.tools,
|
|
88
|
+
responseFormat: request.responseFormat,
|
|
89
|
+
})
|
|
90
|
+
const outputTokenAllowance = aiModelCallOutputTokenAllowance(request.maxOutputTokens)
|
|
91
|
+
let decision: Awaited<ReturnType<BeforeAiModelCall>>
|
|
92
|
+
try {
|
|
93
|
+
decision = await this.input.limits.beforeModelCall({
|
|
94
|
+
...this.identity(request),
|
|
95
|
+
requesterGroupIds: this.input.requesterGroupIds,
|
|
96
|
+
providerId: model.providerId,
|
|
97
|
+
modelId: model.modelId,
|
|
98
|
+
costEstimator: model.costEstimator,
|
|
99
|
+
inputTokens,
|
|
100
|
+
outputTokenAllowance,
|
|
101
|
+
estimatedTotalTokens: estimatedAiModelCallTotalTokens(
|
|
102
|
+
inputTokens,
|
|
103
|
+
outputTokenAllowance
|
|
104
|
+
),
|
|
105
|
+
})
|
|
106
|
+
} catch (error) {
|
|
107
|
+
// Execution boundaries must retain the original coded admission failure.
|
|
108
|
+
this.admissionError = error
|
|
109
|
+
throw error
|
|
110
|
+
}
|
|
111
|
+
if (decision.reservation === "active") this.reservations.add(request.callId)
|
|
112
|
+
try {
|
|
113
|
+
return await model.stream(request)
|
|
114
|
+
} catch (error) {
|
|
115
|
+
if (this.reservations.has(request.callId)) {
|
|
116
|
+
await this.input.limits.markModelCallUnknown(this.identity(request))
|
|
117
|
+
}
|
|
118
|
+
throw error
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private identity(request: Pick<LanguageModelRequest, "callId">) {
|
|
125
|
+
return {
|
|
126
|
+
projectId: this.input.projectId,
|
|
127
|
+
executionId: this.input.executionId,
|
|
128
|
+
attempt: this.input.attempt,
|
|
129
|
+
callId: request.callId,
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
readonly onModelCallEnd = async (event: ModelCallEndEvent): Promise<void> => {
|
|
134
|
+
// Calls already in flight still need their own accounting after another call fails.
|
|
135
|
+
// Only admission is gated by the execution's sticky failure.
|
|
136
|
+
try {
|
|
137
|
+
const occurredAt = this.now()
|
|
138
|
+
const record: RecordAiModelCallInput = {
|
|
139
|
+
id: this.generateId(),
|
|
140
|
+
projectId: this.input.projectId,
|
|
141
|
+
executionId: this.input.executionId,
|
|
142
|
+
attempt: this.input.attempt,
|
|
143
|
+
callId: event.callId,
|
|
144
|
+
requesterGroupIds: this.input.requesterGroupIds,
|
|
145
|
+
providerId: event.providerId,
|
|
146
|
+
...(event.providerIds === undefined ? {} : { providerIds: event.providerIds }),
|
|
147
|
+
requestedModelId: event.modelId,
|
|
148
|
+
...(event.requestedReasoning === undefined
|
|
149
|
+
? {}
|
|
150
|
+
: { requestedReasoning: event.requestedReasoning }),
|
|
151
|
+
...(event.responseModelId === undefined ? {} : { responseModelId: event.responseModelId }),
|
|
152
|
+
responseId: event.responseId,
|
|
153
|
+
usage: aiModelCallUsageFromModel(event.usage),
|
|
154
|
+
...(event.usage.raw === undefined ? {} : { rawUsage: rawUsage(event.usage) }),
|
|
155
|
+
occurredAt,
|
|
156
|
+
}
|
|
157
|
+
const recoveryInput = normalizeModelCallAccounting({
|
|
158
|
+
usage: record,
|
|
159
|
+
cost: event.cost,
|
|
160
|
+
...(event.estimate === undefined ? {} : { estimate: event.estimate }),
|
|
161
|
+
...(event.route === undefined ? {} : { route: event.route }),
|
|
162
|
+
ratedAt: new Date(occurredAt),
|
|
163
|
+
...(this.reservations.has(event.callId) ? { reconcileLimitReservation: true } : {}),
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
await retryOperation(
|
|
168
|
+
() => this.recordAccounting(recoveryInput),
|
|
169
|
+
this.retryDelaysMs,
|
|
170
|
+
this.sleep,
|
|
171
|
+
(error) => !isPermanentAiUsageRecoveryError(error)
|
|
172
|
+
)
|
|
173
|
+
} catch (storageError) {
|
|
174
|
+
if (isPermanentAiUsageRecoveryError(storageError)) throw storageError
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
await retryOperation(
|
|
178
|
+
() => this.input.recoverAiModelCall(recoveryInput),
|
|
179
|
+
this.retryDelaysMs,
|
|
180
|
+
this.sleep,
|
|
181
|
+
(error) => !isPermanentAiUsageRecoveryError(error)
|
|
182
|
+
)
|
|
183
|
+
} catch (recoveryError) {
|
|
184
|
+
throw new AggregateError(
|
|
185
|
+
[storageError, recoveryError],
|
|
186
|
+
"Direct AI accounting and durable recovery both failed."
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
throw new ModelUsageRecordingError(this.input.executionId, event.callId, true, {
|
|
190
|
+
cause: storageError,
|
|
191
|
+
})
|
|
192
|
+
}
|
|
193
|
+
} catch (error) {
|
|
194
|
+
const recordingError =
|
|
195
|
+
error instanceof ModelUsageRecordingError
|
|
196
|
+
? error
|
|
197
|
+
: new ModelUsageRecordingError(this.input.executionId, event.callId, false, {
|
|
198
|
+
cause: error,
|
|
199
|
+
})
|
|
200
|
+
this.recordingError ??= recordingError
|
|
201
|
+
throw recordingError
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
assertHealthy(): void {
|
|
206
|
+
if (this.admissionError !== undefined) throw this.admissionError
|
|
207
|
+
if (this.recordingError) throw this.recordingError
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function rawUsage(usage: ModelUsage): ReadonlyJsonObject {
|
|
212
|
+
return structuredClone(usage.raw ?? {})
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async function retryOperation<TResult>(
|
|
216
|
+
operation: () => Promise<TResult>,
|
|
217
|
+
retryDelaysMs: readonly number[],
|
|
218
|
+
wait: (ms: number) => Promise<void>,
|
|
219
|
+
shouldRetry: (error: unknown) => boolean
|
|
220
|
+
): Promise<TResult> {
|
|
221
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
222
|
+
try {
|
|
223
|
+
return await operation()
|
|
224
|
+
} catch (error) {
|
|
225
|
+
if (!shouldRetry(error)) throw error
|
|
226
|
+
const delay = retryDelaysMs[attempt]
|
|
227
|
+
if (delay === undefined) throw error
|
|
228
|
+
await wait(delay)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function sleep(ms: number): Promise<void> {
|
|
234
|
+
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
235
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { RecordAiModelCallInput, RecordAiModelCallResult } from "../../storage"
|
|
2
|
+
import { AiCostStorageError, AiLimitStorageError, AiUsageStorageError } from "../../storage"
|
|
3
|
+
import { normalizeAiModelCallRecord } from "../../storage/ai-usage/record"
|
|
4
|
+
import { recordAiModelCallAccounting } from "./model-call-accounting"
|
|
5
|
+
import type {
|
|
6
|
+
AiModelCallAccountingPayload,
|
|
7
|
+
AiModelCallRecordPayload,
|
|
8
|
+
AiModelCallRecoveryRecord,
|
|
9
|
+
ModelCallAccountingStorage,
|
|
10
|
+
RecoverAiModelCallInput,
|
|
11
|
+
} from "./types"
|
|
12
|
+
import { aiModelCallUsageFromModel } from "./usage"
|
|
13
|
+
|
|
14
|
+
class InvalidAiUsageRecoveryJobError extends Error {
|
|
15
|
+
readonly name = "InvalidAiUsageRecoveryJobError"
|
|
16
|
+
|
|
17
|
+
constructor(message: string, options?: ErrorOptions) {
|
|
18
|
+
super(`[SixbModels] ${message}`, options)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Encode one failed accounting transaction for a durable, JSON-safe handoff. */
|
|
23
|
+
export function modelCallRecoveryPayload(input: RecoverAiModelCallInput): {
|
|
24
|
+
readonly record: AiModelCallRecordPayload
|
|
25
|
+
readonly accounting: AiModelCallAccountingPayload
|
|
26
|
+
} {
|
|
27
|
+
normalizeAiModelCallRecord(input.usage)
|
|
28
|
+
return {
|
|
29
|
+
record: toQueuePayload(input.usage),
|
|
30
|
+
accounting: toAccountingPayload(input),
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Replay one durable handoff through the idempotent atomic accounting boundary. */
|
|
35
|
+
export async function recordRecoveredAiModelCall(
|
|
36
|
+
storage: Pick<ModelCallAccountingStorage, "transaction">,
|
|
37
|
+
job: AiModelCallRecoveryRecord
|
|
38
|
+
): Promise<RecordAiModelCallResult> {
|
|
39
|
+
const usage = fromQueuePayload(job)
|
|
40
|
+
const accounting = accountingFromQueuePayload(job)
|
|
41
|
+
return recordAiModelCallAccounting({ storage, usage, ...accounting })
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Validation and referential-integrity failures cannot become valid through queue redelivery. */
|
|
45
|
+
export function isPermanentAiUsageRecoveryError(error: unknown): boolean {
|
|
46
|
+
return (
|
|
47
|
+
error instanceof InvalidAiUsageRecoveryJobError ||
|
|
48
|
+
error instanceof TypeError ||
|
|
49
|
+
(error instanceof AiUsageStorageError &&
|
|
50
|
+
(error.code === "duplicate_id" || error.code === "missing_execution")) ||
|
|
51
|
+
(error instanceof AiCostStorageError &&
|
|
52
|
+
(error.code === "missing_usage" || error.code === "cost_mismatch")) ||
|
|
53
|
+
(error instanceof AiLimitStorageError &&
|
|
54
|
+
(error.code === "missing_execution" ||
|
|
55
|
+
error.code === "missing_reservation" ||
|
|
56
|
+
error.code === "missing_usage_record" ||
|
|
57
|
+
error.code === "usage_mismatch" ||
|
|
58
|
+
error.code === "reservation_conflict" ||
|
|
59
|
+
error.code === "reconciliation_conflict" ||
|
|
60
|
+
error.code === "invalid_reservation_state"))
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function toQueuePayload(record: RecordAiModelCallInput): AiModelCallRecordPayload {
|
|
65
|
+
return {
|
|
66
|
+
id: record.id,
|
|
67
|
+
executionId: record.executionId,
|
|
68
|
+
attempt: record.attempt,
|
|
69
|
+
callId: record.callId,
|
|
70
|
+
requesterGroupIds: [...record.requesterGroupIds],
|
|
71
|
+
providerId: record.providerId,
|
|
72
|
+
...(record.providerIds === undefined
|
|
73
|
+
? {}
|
|
74
|
+
: { providerIds: structuredClone(record.providerIds) }),
|
|
75
|
+
requestedModelId: record.requestedModelId,
|
|
76
|
+
...(record.requestedReasoning === undefined
|
|
77
|
+
? {}
|
|
78
|
+
: { requestedReasoning: structuredClone(record.requestedReasoning) }),
|
|
79
|
+
...(record.responseModelId === undefined ? {} : { responseModelId: record.responseModelId }),
|
|
80
|
+
responseId: record.responseId,
|
|
81
|
+
usage: aiModelCallUsageFromModel(record.usage),
|
|
82
|
+
...(record.rawUsage === undefined ? {} : { rawUsage: structuredClone(record.rawUsage) }),
|
|
83
|
+
occurredAt: record.occurredAt.toISOString(),
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function toAccountingPayload(input: RecoverAiModelCallInput): AiModelCallAccountingPayload {
|
|
88
|
+
return {
|
|
89
|
+
cost: structuredClone(input.cost),
|
|
90
|
+
...(input.estimate === undefined ? {} : { estimate: structuredClone(input.estimate) }),
|
|
91
|
+
...(input.route === undefined ? {} : { route: structuredClone(input.route) }),
|
|
92
|
+
ratedAt: input.ratedAt.toISOString(),
|
|
93
|
+
...(input.reconcileLimitReservation ? { reconcileLimitReservation: true } : {}),
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function fromQueuePayload(job: AiModelCallRecoveryRecord): RecordAiModelCallInput {
|
|
98
|
+
const occurredAt = parseDate(job.payload.record.occurredAt, job.id, "occurredAt")
|
|
99
|
+
return { ...job.payload.record, projectId: job.projectId, occurredAt }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function accountingFromQueuePayload(
|
|
103
|
+
job: AiModelCallRecoveryRecord
|
|
104
|
+
): Omit<RecoverAiModelCallInput, "usage"> {
|
|
105
|
+
const accounting = job.payload.accounting
|
|
106
|
+
return {
|
|
107
|
+
cost: structuredClone(accounting.cost),
|
|
108
|
+
...(accounting.estimate === undefined
|
|
109
|
+
? {}
|
|
110
|
+
: { estimate: structuredClone(accounting.estimate) }),
|
|
111
|
+
...(accounting.route === undefined ? {} : { route: structuredClone(accounting.route) }),
|
|
112
|
+
ratedAt: parseDate(accounting.ratedAt, job.id, "ratedAt"),
|
|
113
|
+
reconcileLimitReservation: accounting.reconcileLimitReservation === true,
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function parseDate(value: string, jobId: string, field: string): Date {
|
|
118
|
+
const date = new Date(value)
|
|
119
|
+
if (!Number.isFinite(date.getTime())) {
|
|
120
|
+
throw new InvalidAiUsageRecoveryJobError(
|
|
121
|
+
`AI usage recovery job '${jobId}' has an invalid ${field} timestamp.`
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
return date
|
|
125
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createSixbError } from "../../errors/internal"
|
|
2
|
+
import type { AgentQueueJob, Queue } from "../../queues"
|
|
3
|
+
import { modelCallRecoveryPayload } from "./model-call-recovery"
|
|
4
|
+
import type { RecoverAiModelCallInput } from "./types"
|
|
5
|
+
|
|
6
|
+
/** Stable queue identity: a lost enqueue response can safely retry the same accounting handoff. */
|
|
7
|
+
function agentAiUsageRecoveryJobId(recordId: string): string {
|
|
8
|
+
return `agt_usage_job_${recordId}`
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Transport adapter for the agent worker's existing durable recovery lane. */
|
|
12
|
+
export async function enqueueAiModelCallRecovery(
|
|
13
|
+
queue: Pick<Queue<AgentQueueJob>, "enqueue">,
|
|
14
|
+
input: RecoverAiModelCallInput
|
|
15
|
+
): Promise<void> {
|
|
16
|
+
const payload = modelCallRecoveryPayload(input)
|
|
17
|
+
const record = input.usage
|
|
18
|
+
const jobId = agentAiUsageRecoveryJobId(record.id)
|
|
19
|
+
const [job] = await queue.enqueue({
|
|
20
|
+
projectId: record.projectId,
|
|
21
|
+
jobs: [{ id: jobId, type: "agent.ai-usage.record.requested", payload }],
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
if (job?.id !== jobId || job.type !== "agent.ai-usage.record.requested") {
|
|
25
|
+
throw createSixbError(
|
|
26
|
+
"internal.unexpected",
|
|
27
|
+
`[SixbModels] Agent queue did not confirm AI usage recovery job '${jobId}'.`,
|
|
28
|
+
{ details: { jobId } }
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AiCostStorage,
|
|
3
|
+
AiLimitStorage,
|
|
4
|
+
AiUsageStorage,
|
|
5
|
+
RecordAiModelCallInput,
|
|
6
|
+
Storage,
|
|
7
|
+
} from "../../storage"
|
|
8
|
+
import type { ModelRoute } from "../events"
|
|
9
|
+
import type { ModelCallCost, ModelCostEstimate } from "../pricing"
|
|
10
|
+
|
|
11
|
+
/** Only the stores and transaction boundary needed by model-call accounting. */
|
|
12
|
+
export interface ModelCallAccountingStorage extends Pick<Storage, "transaction"> {
|
|
13
|
+
readonly aiUsage: AiUsageStorage
|
|
14
|
+
readonly aiCosts: AiCostStorage
|
|
15
|
+
readonly aiLimits: AiLimitStorage
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface RecoverAiModelCallInput {
|
|
19
|
+
readonly usage: RecordAiModelCallInput
|
|
20
|
+
readonly cost: ModelCallCost
|
|
21
|
+
readonly estimate?: ModelCostEstimate
|
|
22
|
+
readonly route?: ModelRoute
|
|
23
|
+
readonly ratedAt: Date
|
|
24
|
+
/** True only when admission created an aggregate-budget reservation for this provider attempt. */
|
|
25
|
+
readonly reconcileLimitReservation?: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type RecoverAiModelCall = (input: RecoverAiModelCallInput) => Promise<void>
|
|
29
|
+
|
|
30
|
+
/** JSON-safe ledger input shared by durable recovery transports. */
|
|
31
|
+
export type AiModelCallRecordPayload = Omit<
|
|
32
|
+
RecordAiModelCallInput,
|
|
33
|
+
"projectId" | "usage" | "occurredAt" | "recordedAt"
|
|
34
|
+
> & {
|
|
35
|
+
readonly usage: {
|
|
36
|
+
readonly [Field in keyof RecordAiModelCallInput["usage"]]: RecordAiModelCallInput["usage"][Field]
|
|
37
|
+
}
|
|
38
|
+
readonly occurredAt: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface AiModelCallAccountingPayload {
|
|
42
|
+
readonly estimate?: ModelCostEstimate
|
|
43
|
+
readonly cost: ModelCallCost
|
|
44
|
+
readonly route?: ModelRoute
|
|
45
|
+
readonly ratedAt: string
|
|
46
|
+
/** True when admission created a reservation that recovery must reconcile. */
|
|
47
|
+
readonly reconcileLimitReservation?: boolean
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Transport identity is used only for recovery diagnostics, not accounting identity. */
|
|
51
|
+
export interface AiModelCallRecoveryRecord {
|
|
52
|
+
readonly id: string
|
|
53
|
+
readonly projectId: string
|
|
54
|
+
readonly payload: {
|
|
55
|
+
readonly record: AiModelCallRecordPayload
|
|
56
|
+
readonly accounting: AiModelCallAccountingPayload
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AiModelCallUsageInput } from "../../storage"
|
|
2
|
+
import type { ModelUsage } from "../events"
|
|
3
|
+
|
|
4
|
+
/** Map one provider-neutral model call into Sixb's durable accounting vocabulary. */
|
|
5
|
+
export function aiModelCallUsageFromModel(usage: ModelUsage): AiModelCallUsageInput {
|
|
6
|
+
return {
|
|
7
|
+
...(usage.inputTokens === undefined ? {} : { inputTokens: usage.inputTokens }),
|
|
8
|
+
...(usage.outputTokens === undefined ? {} : { outputTokens: usage.outputTokens }),
|
|
9
|
+
...(usage.uncachedInputTokens === undefined
|
|
10
|
+
? {}
|
|
11
|
+
: { uncachedInputTokens: usage.uncachedInputTokens }),
|
|
12
|
+
...(usage.cacheReadInputTokens === undefined
|
|
13
|
+
? {}
|
|
14
|
+
: { cacheReadInputTokens: usage.cacheReadInputTokens }),
|
|
15
|
+
...(usage.cacheWriteInputTokens === undefined
|
|
16
|
+
? {}
|
|
17
|
+
: { cacheWriteInputTokens: usage.cacheWriteInputTokens }),
|
|
18
|
+
...(usage.textOutputTokens === undefined ? {} : { textOutputTokens: usage.textOutputTokens }),
|
|
19
|
+
...(usage.reasoningOutputTokens === undefined
|
|
20
|
+
? {}
|
|
21
|
+
: { reasoningOutputTokens: usage.reasoningOutputTokens }),
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { runModelLoop } from "../agents/model-loop"
|
|
2
|
+
import { assertProviderAccess } from "../authorization"
|
|
3
|
+
import type { ExecutionContext } from "../execution"
|
|
4
|
+
import { ensureExecutionRecord, executionRecordInputFromRuntime } from "../execution/durable"
|
|
5
|
+
import type { SixbRuntimeContext } from "../runtime/types"
|
|
6
|
+
import type { ModelCatalog } from "./catalog"
|
|
7
|
+
import { ModelProviderError, ModelStreamError, UnsupportedModelFeatureError } from "./errors"
|
|
8
|
+
import type { ModelCallEndEvent } from "./events"
|
|
9
|
+
import { type ModelExecutionAttempt, registerModelExecutionBinding } from "./execution/binding"
|
|
10
|
+
import { requireAccountingCapabilities } from "./execution/model-call-accounting"
|
|
11
|
+
import { aiModelCallOutputTokenAllowance } from "./execution/model-call-admission"
|
|
12
|
+
import { createAiModelCallLimitController } from "./execution/model-call-limits"
|
|
13
|
+
import { AiModelCallRecorder } from "./execution/model-call-recorder"
|
|
14
|
+
import { enqueueAiModelCallRecovery } from "./execution/recovery-queue"
|
|
15
|
+
import type {
|
|
16
|
+
InferLanguageModelOutput,
|
|
17
|
+
LanguageModelGenerateInput,
|
|
18
|
+
LanguageModelGenerateResult,
|
|
19
|
+
LanguageModelOutputShape,
|
|
20
|
+
ModelsRuntime,
|
|
21
|
+
} from "./generation-types"
|
|
22
|
+
import { modelReasoningSupportIssue } from "./language-model"
|
|
23
|
+
import type { ModelMessage } from "./messages"
|
|
24
|
+
import { languageModelOutput } from "./output"
|
|
25
|
+
import { resolveLanguageModel } from "./resolve"
|
|
26
|
+
|
|
27
|
+
export function createModelsRuntime(
|
|
28
|
+
runtime: SixbRuntimeContext,
|
|
29
|
+
execution: ExecutionContext,
|
|
30
|
+
catalog: ModelCatalog | undefined
|
|
31
|
+
): ModelsRuntime {
|
|
32
|
+
let binding: ModelExecutionAttempt | undefined
|
|
33
|
+
let recorder: Promise<AiModelCallRecorder> | undefined
|
|
34
|
+
|
|
35
|
+
async function createRecorder(): Promise<AiModelCallRecorder> {
|
|
36
|
+
const storage = {
|
|
37
|
+
...requireAccountingCapabilities(runtime.storage),
|
|
38
|
+
transaction: runtime.storage.transaction.bind(runtime.storage),
|
|
39
|
+
}
|
|
40
|
+
if (!binding) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
"[SixbModels] Generation requires a bound request or worker execution attempt."
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
const { requesterGroupIds } = await ensureExecutionRecord(
|
|
46
|
+
runtime.storage.executions,
|
|
47
|
+
executionRecordInputFromRuntime({
|
|
48
|
+
execution,
|
|
49
|
+
runtimeAuthorization: runtime.runtimeAuthorization,
|
|
50
|
+
})
|
|
51
|
+
)
|
|
52
|
+
return new AiModelCallRecorder({
|
|
53
|
+
storage,
|
|
54
|
+
projectId: runtime.projectId,
|
|
55
|
+
executionId: execution.id,
|
|
56
|
+
attempt: binding.attempt,
|
|
57
|
+
requesterGroupIds,
|
|
58
|
+
limits: createAiModelCallLimitController({
|
|
59
|
+
storage,
|
|
60
|
+
projectId: runtime.projectId,
|
|
61
|
+
requestedBy: execution.requestedBy,
|
|
62
|
+
requesterGroupIds,
|
|
63
|
+
}),
|
|
64
|
+
recoverAiModelCall: (input) => enqueueAiModelCallRecovery(runtime.queues.agents, input),
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function generate<const TShape extends LanguageModelOutputShape | undefined = undefined>(
|
|
69
|
+
input: LanguageModelGenerateInput<TShape>
|
|
70
|
+
): Promise<
|
|
71
|
+
LanguageModelGenerateResult<
|
|
72
|
+
TShape extends LanguageModelOutputShape ? InferLanguageModelOutput<TShape> : string
|
|
73
|
+
>
|
|
74
|
+
>
|
|
75
|
+
async function generate(
|
|
76
|
+
input: LanguageModelGenerateInput<LanguageModelOutputShape | undefined>
|
|
77
|
+
): Promise<LanguageModelGenerateResult<unknown>> {
|
|
78
|
+
assertProviderAccess(runtime, execution, "models.language.generate")
|
|
79
|
+
const messages = generationMessages(input)
|
|
80
|
+
if (!binding) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
"[SixbModels] Generation requires a bound request or worker execution attempt."
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
const signal = input.signal ? AbortSignal.any([binding.signal, input.signal]) : binding.signal
|
|
86
|
+
signal.throwIfAborted()
|
|
87
|
+
const selected = input.model
|
|
88
|
+
? catalog
|
|
89
|
+
? catalog.language.getByRef({
|
|
90
|
+
provider: input.model.providerId,
|
|
91
|
+
modelId: input.model.modelId,
|
|
92
|
+
})?.model
|
|
93
|
+
: input.model
|
|
94
|
+
: catalog?.language.default.model
|
|
95
|
+
if (!selected) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
input.model
|
|
98
|
+
? `[SixbModels] Model '${input.model.providerId}/${input.model.modelId}' is not configured in models.language.`
|
|
99
|
+
: "[SixbModels] Configure models.language in createSixb() or supply a model to generate()."
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
const output =
|
|
103
|
+
input.output === undefined
|
|
104
|
+
? undefined
|
|
105
|
+
: languageModelOutput(input.output, runtime.ontology.getValueTypesById())
|
|
106
|
+
const model = await resolveLanguageModel(selected)
|
|
107
|
+
const reasoningIssue = modelReasoningSupportIssue(
|
|
108
|
+
model.definition.capabilities.reasoning,
|
|
109
|
+
input.reasoning
|
|
110
|
+
)
|
|
111
|
+
if (reasoningIssue) throw new UnsupportedModelFeatureError(`[SixbModels] ${reasoningIssue}.`)
|
|
112
|
+
if (output && model.definition.capabilities.nativeStructuredOutput === false) {
|
|
113
|
+
throw new UnsupportedModelFeatureError(
|
|
114
|
+
"[SixbModels] Model does not support native structured output."
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
const maxOutputTokens = Math.min(
|
|
118
|
+
aiModelCallOutputTokenAllowance(input.maxOutputTokens ?? model.definition.maxOutputTokens),
|
|
119
|
+
model.definition.maxOutputTokens ?? Infinity
|
|
120
|
+
)
|
|
121
|
+
if (typeof input.reasoning === "object" && input.reasoning.budgetTokens >= maxOutputTokens) {
|
|
122
|
+
throw new TypeError("[SixbModels] Output allowance must exceed the reasoning token budget.")
|
|
123
|
+
}
|
|
124
|
+
recorder ??= createRecorder()
|
|
125
|
+
const accounting = await recorder
|
|
126
|
+
accounting.assertHealthy()
|
|
127
|
+
signal.throwIfAborted()
|
|
128
|
+
let event: ModelCallEndEvent | undefined
|
|
129
|
+
const options = {
|
|
130
|
+
model: accounting.wrapModel(model),
|
|
131
|
+
messages,
|
|
132
|
+
maxSteps: 1,
|
|
133
|
+
rejectLocalToolCalls: true,
|
|
134
|
+
maxOutputTokens,
|
|
135
|
+
reasoning: input.reasoning,
|
|
136
|
+
caching: input.caching,
|
|
137
|
+
signal,
|
|
138
|
+
onModelCallEnd: async (completed: ModelCallEndEvent) => {
|
|
139
|
+
await accounting.onModelCallEnd(completed)
|
|
140
|
+
event = completed
|
|
141
|
+
},
|
|
142
|
+
}
|
|
143
|
+
const result = output ? await runModelLoop({ ...options, output }) : await runModelLoop(options)
|
|
144
|
+
if (result.status === "aborted") {
|
|
145
|
+
signal.throwIfAborted()
|
|
146
|
+
throw new DOMException("Model generation aborted", "AbortError")
|
|
147
|
+
}
|
|
148
|
+
if (result.finishReason === "error" || result.finishReason === "content-filter") {
|
|
149
|
+
throw new ModelProviderError(
|
|
150
|
+
`[SixbModels] Generation ended with '${result.finishReason}'.`,
|
|
151
|
+
model.providerId,
|
|
152
|
+
model.modelId
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
if (!event)
|
|
156
|
+
throw new ModelStreamError("[SixbModels] Generation completed without accounting metadata.")
|
|
157
|
+
return {
|
|
158
|
+
output: result.output,
|
|
159
|
+
usage: event.usage,
|
|
160
|
+
cost: event.cost,
|
|
161
|
+
callId: event.callId,
|
|
162
|
+
finishReason: result.finishReason,
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const models: ModelsRuntime = {
|
|
167
|
+
language: { generate },
|
|
168
|
+
}
|
|
169
|
+
registerModelExecutionBinding(models, (input) => {
|
|
170
|
+
binding = { attempt: input.attempt, signal: input.signal }
|
|
171
|
+
})
|
|
172
|
+
return models
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function generationMessages(
|
|
176
|
+
input: LanguageModelGenerateInput<LanguageModelOutputShape | undefined>
|
|
177
|
+
): readonly ModelMessage[] {
|
|
178
|
+
if ((input.prompt === undefined) === (input.messages === undefined)) {
|
|
179
|
+
throw new TypeError("[SixbModels] Supply exactly one of prompt or messages.")
|
|
180
|
+
}
|
|
181
|
+
if (input.prompt !== undefined && typeof input.prompt !== "string") {
|
|
182
|
+
throw new TypeError("[SixbModels] prompt must be a string.")
|
|
183
|
+
}
|
|
184
|
+
if (input.messages !== undefined && !Array.isArray(input.messages)) {
|
|
185
|
+
throw new TypeError("[SixbModels] messages must be an array.")
|
|
186
|
+
}
|
|
187
|
+
if (input.instructions !== undefined && typeof input.instructions !== "string") {
|
|
188
|
+
throw new TypeError("[SixbModels] instructions must be a string.")
|
|
189
|
+
}
|
|
190
|
+
if (
|
|
191
|
+
input.maxOutputTokens !== undefined &&
|
|
192
|
+
(!Number.isSafeInteger(input.maxOutputTokens) || input.maxOutputTokens <= 0)
|
|
193
|
+
) {
|
|
194
|
+
throw new TypeError("[SixbModels] maxOutputTokens must be a positive safe integer.")
|
|
195
|
+
}
|
|
196
|
+
if (input.caching !== undefined && input.caching !== "auto" && input.caching !== "off") {
|
|
197
|
+
throw new TypeError("[SixbModels] caching must be 'auto' or 'off'.")
|
|
198
|
+
}
|
|
199
|
+
return [
|
|
200
|
+
...(input.instructions === undefined
|
|
201
|
+
? []
|
|
202
|
+
: [{ role: "system" as const, content: input.instructions }]),
|
|
203
|
+
...(input.prompt !== undefined
|
|
204
|
+
? [{ role: "user" as const, content: [{ type: "text" as const, text: input.prompt }] }]
|
|
205
|
+
: (input.messages ?? [])),
|
|
206
|
+
]
|
|
207
|
+
}
|