cartethyia 2.7.0 → 2.7.2
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/.env.example +107 -106
- package/README.md +25 -2
- package/dist/dashboard/assets/{BannedPage-P76QLGJA.js → BannedPage-XaUmiBrC.js} +1 -1
- package/dist/dashboard/assets/BannedPage-XaUmiBrC.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-DdBggJS9.js → CliToolDetailPage-CqD7QiLM.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-CqD7QiLM.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-aN1iXhhP.js → CliToolsPage-0XUo4UMn.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-0XUo4UMn.js.gz +0 -0
- package/dist/dashboard/assets/{CombosPage-DE-F1nxZ.js → CombosPage-CXGS_Ct-.js} +1 -1
- package/dist/dashboard/assets/CombosPage-CXGS_Ct-.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-DGnGNYnM.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-DGnGNYnM.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-3CUxMy2X.js → CustomizationPage-DAG5J9EY.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-DAG5J9EY.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BKtAPYVF.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-BKtAPYVF.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-BdmRLnq2.js +1 -0
- package/dist/dashboard/assets/LoginPage-BdmRLnq2.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-DKVslqG3.js → ModelPicker-BH8Tehdi.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-BH8Tehdi.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-CqMxibJB.js +1 -0
- package/dist/dashboard/assets/OverviewPage-CqMxibJB.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-CqMh2NRX.js +4 -0
- package/dist/dashboard/assets/ProviderDetailPage-CqMh2NRX.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-B9uWu4Nz.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-B9uWu4Nz.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-BoWOhpDO.js +9 -0
- package/dist/dashboard/assets/ProxyPage-BoWOhpDO.js.gz +0 -0
- package/dist/dashboard/assets/{QuotaPage-BjldQwIU.js → QuotaPage-7P2n--Fv.js} +1 -1
- package/dist/dashboard/assets/QuotaPage-7P2n--Fv.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-DUIoLRxk.js → SettingsPage-CxZ1fTkN.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-CxZ1fTkN.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-Co12Zzaw.js +1 -0
- package/dist/dashboard/assets/SetupPage-Co12Zzaw.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-fI7JkdIB.js → SortableList-Dqf4zpS-.js} +1 -1
- package/dist/dashboard/assets/SortableList-Dqf4zpS-.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-CHVZqskZ.js → StudioPage-Byj2lAEm.js} +3 -3
- package/dist/dashboard/assets/StudioPage-Byj2lAEm.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-CTkLAuRc.js +56 -0
- package/dist/dashboard/assets/UsagePage-CTkLAuRc.js.gz +0 -0
- package/dist/dashboard/assets/{api-keys-DFY_fZU4.js → api-keys-CUi6UXsR.js} +1 -1
- package/dist/dashboard/assets/api-keys-CUi6UXsR.js.gz +0 -0
- package/dist/dashboard/assets/app-KvsUJUMF.css +2 -0
- package/dist/dashboard/assets/app-KvsUJUMF.css.gz +0 -0
- package/dist/dashboard/assets/{assert-CwdnZARt.js → assert-67xXH5rf.js} +1 -1
- package/dist/dashboard/assets/assert-67xXH5rf.js.gz +0 -0
- package/dist/dashboard/assets/{badge-Dr-uf0Au.js → badge-DC2L43Mj.js} +1 -1
- package/dist/dashboard/assets/badge-DC2L43Mj.js.gz +0 -0
- package/dist/dashboard/assets/{banner-BddmMdoS.js → banner-BBVcb0J3.js} +1 -1
- package/dist/dashboard/assets/banner-BBVcb0J3.js.gz +0 -0
- package/dist/dashboard/assets/{card-CK0PXWlX.js → card-Cca1XC6G.js} +1 -1
- package/dist/dashboard/assets/card-Cca1XC6G.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-CcB6mGh2.js → cli-tools-KvsWa1Jl.js} +1 -1
- package/dist/dashboard/assets/cli-tools-KvsWa1Jl.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DGb2P9Yx.js → clipboard-button-DUzEbynq.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-DUzEbynq.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-LkfuL50u.js → dialog-DFvWhwTa.js} +1 -1
- package/dist/dashboard/assets/dialog-DFvWhwTa.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-ZbEZ_84c.js → drawer-CFM2sMX1.js} +1 -1
- package/dist/dashboard/assets/drawer-CFM2sMX1.js.gz +0 -0
- package/dist/dashboard/assets/{entry-BJfsVMvA.js → entry-Bqy8RFvM.js} +1 -1
- package/dist/dashboard/assets/entry-Bqy8RFvM.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CWBY5A0f.js → entry-ClCMCWWQ.js} +3 -3
- package/dist/dashboard/assets/entry-ClCMCWWQ.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CvC1-Zqx.js → entry-_xHo5x6r.js} +1 -1
- package/dist/dashboard/assets/entry-_xHo5x6r.js.gz +0 -0
- package/dist/dashboard/assets/formatters-CWWZ-uCZ.js +1 -0
- package/dist/dashboard/assets/formatters-CWWZ-uCZ.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-BxpznFLt.js → github-badge-C9e8Ts7e.js} +1 -1
- package/dist/dashboard/assets/github-badge-C9e8Ts7e.js.gz +0 -0
- package/dist/dashboard/assets/{index-CDzP3ovJ.js → index-DFVFrnWW.js} +2 -2
- package/dist/dashboard/assets/index-DFVFrnWW.js.gz +0 -0
- package/dist/dashboard/assets/{inline-Ae13MQ5w.js → inline-BFUcvllj.js} +1 -1
- package/dist/dashboard/assets/inline-BFUcvllj.js.gz +0 -0
- package/dist/dashboard/assets/{input-D23fo7cp.js → input-C_ILAvBb.js} +1 -1
- package/dist/dashboard/assets/input-C_ILAvBb.js.gz +0 -0
- package/dist/dashboard/assets/{layout-CSsxjj5P.js → layout-CBIyT6Rt.js} +1 -1
- package/dist/dashboard/assets/layout-CBIyT6Rt.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-dmbwZMDY.js → list-row-ebJ_-Nsb.js} +1 -1
- package/dist/dashboard/assets/list-row-ebJ_-Nsb.js.gz +0 -0
- package/dist/dashboard/assets/{live-BG1oUsZZ.js → live-D0mm--ME.js} +1 -1
- package/dist/dashboard/assets/live-D0mm--ME.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-DSF-e4ho.js → mutation-sMD965oO.js} +1 -1
- package/dist/dashboard/assets/mutation-sMD965oO.js.gz +0 -0
- package/dist/dashboard/assets/{numbers-Bm_aECY7.js → numbers-BO9dKaFr.js} +1 -1
- package/dist/dashboard/assets/numbers-BO9dKaFr.js.gz +0 -0
- package/dist/dashboard/assets/providers/inception.svg +5 -0
- package/dist/dashboard/assets/providers/inception.svg.gz +0 -0
- package/dist/dashboard/assets/{query-keys-CF56nYIV.js → query-keys-CfL_Zdoh.js} +1 -1
- package/dist/dashboard/assets/query-keys-CfL_Zdoh.js.gz +0 -0
- package/dist/dashboard/assets/{routing-CeA71n7G.js → routing-BnIpi1IJ.js} +1 -1
- package/dist/dashboard/assets/routing-BnIpi1IJ.js.gz +0 -0
- package/dist/dashboard/assets/{select-KIT0rC6G.js → select-DBNVLdUu.js} +1 -1
- package/dist/dashboard/assets/select-DBNVLdUu.js.gz +0 -0
- package/dist/dashboard/assets/{settings-B_2gkePf.js → settings-BAFhDgX8.js} +1 -1
- package/dist/dashboard/assets/settings-BAFhDgX8.js.gz +0 -0
- package/dist/dashboard/assets/{stack-D7WOSzcX.js → stack-EMrOMt4I.js} +1 -1
- package/dist/dashboard/assets/stack-EMrOMt4I.js.gz +0 -0
- package/dist/dashboard/assets/{state-BBxtKZOQ.js → state-CWoo7ty5.js} +1 -1
- package/dist/dashboard/assets/state-CWoo7ty5.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DNS_D5Ea.js → switch-CCjT6IkF.js} +1 -1
- package/dist/dashboard/assets/switch-CCjT6IkF.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BgoxdoMk.js → useMutation-DjkLHUcE.js} +1 -1
- package/dist/dashboard/assets/useMutation-DjkLHUcE.js.gz +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +54 -53
- package/migrations/full-postgres/0024_add_pool_provider_cooldowns.sql +12 -0
- package/migrations/full-postgres/0025_add_pool_random_strategy.sql +3 -0
- package/migrations/lite-sqlite3/0024_add_pool_provider_cooldowns.sql +12 -0
- package/migrations/lite-sqlite3/0025_add_pool_random_strategy.sql +20 -0
- package/package.json +96 -96
- package/scripts/cli/console-menu.ts +5 -2
- package/scripts/cli/tray.ts +21 -6
- package/src/boot/app.ts +684 -714
- package/src/boot/dependencies.ts +65 -62
- package/src/config/cooldowns.ts +16 -0
- package/src/config/providers.ts +13 -1
- package/src/config/resources.ts +70 -70
- package/src/config/security.ts +37 -37
- package/src/config/spec.ts +371 -358
- package/src/console/cli-tools/contracts.ts +10 -4
- package/src/console/console-router.ts +233 -225
- package/src/console/domain-registration.ts +398 -381
- package/src/console/providers/catalog/catalog-projections.ts +2 -6
- package/src/console/providers/catalog/contracts.ts +19 -0
- package/src/console/providers/catalog/provider-operations.ts +38 -0
- package/src/console/providers/catalog/routes.ts +14 -0
- package/src/console/providers/catalog/store-helpers.ts +326 -0
- package/src/console/providers/catalog/store.ts +1292 -1563
- package/src/console/quota/account-quota-global.ts +2 -2
- package/src/console/quota/account-quota-shared.ts +1 -1
- package/src/console/quota/account-quota-tenant.ts +35 -12
- package/src/console/quota/quota-view.ts +2 -2
- package/src/console/routing/pools/contracts.ts +41 -1
- package/src/console/routing/pools/operations.ts +183 -4
- package/src/console/routing/pools/relay-deploy.ts +17 -4
- package/src/console/routing/pools/routes.ts +30 -0
- package/src/console/routing/pools/store.ts +98 -8
- package/src/main.ts +183 -167
- package/src/network/outbound-fetch.ts +124 -208
- package/src/network/pool/agent.ts +15 -0
- package/src/network/pool/pool-state.ts +7 -0
- package/src/network/pool/selector.ts +110 -2
- package/src/network/pool-cooldown-store.ts +252 -0
- package/src/network/pool-health-machine.ts +5 -3
- package/src/network/pool-health.ts +36 -9
- package/src/observability/event-query.ts +57 -0
- package/src/observability/metrics.ts +467 -467
- package/src/observability/runtime-metrics.ts +269 -269
- package/src/persistence/health-event-flush.ts +2 -0
- package/src/persistence/schema.ts +19 -0
- package/src/persistence/usage-flush.ts +8 -3
- package/src/protocol/canonical-model.ts +1 -1
- package/src/protocol/dsml.ts +377 -0
- package/src/protocol/gateway-error.ts +232 -232
- package/src/{providers/provider-reasoning.ts → protocol/reasoning.ts} +10 -9
- package/src/protocol/request/chat.ts +7 -7
- package/src/protocol/request/codex.ts +2 -2
- package/src/protocol/request/gemini.ts +1 -1
- package/src/protocol/request/messages.ts +6 -6
- package/src/protocol/request/responses.ts +7 -7
- package/src/protocol/response/dsml.ts +12 -133
- package/src/{transport → protocol}/translation/attachment-integrity.ts +2 -2
- package/src/{transport → protocol}/translation/cache-controls.ts +1 -1
- package/src/{transport → protocol}/translation/capabilities.ts +2 -2
- package/src/{transport → protocol}/translation/normalize.ts +1 -1
- package/src/{transport → protocol}/translation/quirks.ts +1 -1
- package/src/{transport → protocol}/translation/search.ts +1 -1
- package/src/{transport → protocol}/translation/thinking.ts +23 -1
- package/src/{transport → protocol}/translation/tool-id.ts +1 -1
- package/src/{transport → protocol}/translation/tool-repair.ts +2 -2
- package/src/protocol/upstream-parsing.ts +176 -0
- package/src/providers/adapters/compatible-adapter.ts +11 -2
- package/src/providers/authentication/oauth-refresh-service.ts +9 -5
- package/src/providers/default-registry.ts +22 -5
- package/src/providers/discovery/probe-phases.ts +16 -3
- package/src/providers/discovery/probing-service.ts +4 -1
- package/src/providers/integrations/anthropic.ts +1 -1
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -4
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +141 -8
- package/src/providers/integrations/buddy/buddy-checkin.ts +5 -1
- package/src/providers/integrations/buddy/buddy-growth-shared.ts +0 -82
- package/src/providers/integrations/buddy/buddy-identity.ts +25 -0
- package/src/providers/integrations/buddy/buddy-server-tools.ts +240 -0
- package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +36 -0
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +6 -31
- package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -0
- package/src/providers/integrations/buddy/codebuddy/shared.ts +19 -4
- package/src/providers/integrations/buddy/turing-device-token.ts +262 -0
- package/src/providers/integrations/buddy/workbuddy/provider.ts +2 -0
- package/src/providers/integrations/buddy/workbuddy/shared.ts +56 -3
- package/src/providers/integrations/claude/claude.ts +1 -1
- package/src/providers/integrations/cloudflareai/cloudflareai.ts +1 -1
- package/src/providers/integrations/codex/codex-errors.ts +1 -1
- package/src/providers/integrations/codex/codex.ts +1 -1
- package/src/providers/integrations/factory/factory.ts +1 -1
- package/src/providers/integrations/github/github.ts +1 -1
- package/src/providers/integrations/grok/grok.ts +1 -1
- package/src/providers/integrations/inception/provider.ts +91 -0
- package/src/providers/integrations/inferhub.ts +1 -1
- package/src/providers/integrations/kiro/kiro-request.ts +1 -1
- package/src/providers/integrations/mistral.ts +193 -19
- package/src/providers/integrations/ollamacloud-models.ts +50 -0
- package/src/providers/integrations/opencode/fingerprint.ts +19 -2
- package/src/providers/integrations/opencode/prompt.ts +111 -0
- package/src/providers/integrations/opencode/provider.ts +101 -23
- package/src/providers/integrations/opencode/tool-definitions.ts +4 -4
- package/src/providers/integrations/qoder/qoder-checkin.ts +303 -0
- package/src/providers/integrations/qoder/qoder-oauth.ts +12 -1
- package/src/providers/integrations/qoder/qoder-realm.ts +20 -0
- package/src/providers/integrations/qoder/qoder-text-tools.ts +277 -0
- package/src/providers/integrations/qoder/qoder.ts +315 -400
- package/src/providers/integrations/shared/install-id.ts +2 -1
- package/src/providers/integrations/trae/trae-cache.ts +110 -0
- package/src/providers/integrations/trae/trae-oauth.ts +29 -4
- package/src/providers/integrations/trae/trae-protocol.ts +2 -1
- package/src/providers/integrations/trae/trae.ts +106 -23
- package/src/providers/operations/account-error-classification.ts +1684 -0
- package/src/providers/operations/account-health-service.ts +27 -1503
- package/src/providers/operations/account-reset-service.ts +2 -0
- package/src/providers/operations/provider-catalog-service.ts +11 -1
- package/src/providers/provider-contracts.ts +7 -4
- package/src/providers/provider-metadata.ts +25 -4
- package/src/providers/provider-probe.ts +2 -2
- package/src/{console → providers}/quota/cache.ts +1 -1
- package/src/{console → providers}/quota/refresh.ts +5 -5
- package/src/security/cli-client-fingerprint.ts +9 -2
- package/src/transport/dispatch/attempt-finalize.ts +114 -12
- package/src/transport/dispatch/attempt-loop.ts +3 -0
- package/src/transport/dispatch/empty-stream.ts +9 -2
- package/src/transport/dispatch/generation.ts +37 -55
- package/src/transport/dispatch/handler-deps.ts +32 -0
- package/src/transport/dispatch/leases.ts +9 -4
- package/src/transport/dispatch/proxy-request.ts +6 -30
- package/src/transport/dispatch/responses-compact.ts +22 -43
- package/src/transport/dispatch/streaming/finalize.ts +3 -0
- package/src/transport/dispatch/streaming/stream.ts +0 -8
- package/src/transport/dispatch/systemone.ts +22 -42
- package/src/transport/dispatch/token-count.ts +23 -39
- package/src/transport/dispatch/upstream.ts +1 -3
- package/src/transport/dispatch/websearch.ts +22 -41
- package/src/transport/failure-policy.ts +92 -178
- package/src/transport/guards/abuse-guard.ts +10 -0
- package/src/transport/guards/auth-guard.ts +109 -109
- package/src/transport/guards/error-lifecycle.ts +1 -1
- package/src/transport/guards/pipeline.ts +220 -220
- package/src/transport/guards/request-context.ts +245 -238
- package/src/transport/request/degradation.ts +20 -1
- package/src/transport/request/inflight.ts +4 -114
- package/src/transport/request/preparer.ts +6 -6
- package/src/transport/request/state.ts +66 -38
- package/src/transport/request/tenant-preferences.ts +1 -1
- package/src/transport/routing/route-catalog.ts +75 -43
- package/src/transport/routing/router.ts +30 -2
- package/src/transport/surface/messages/parse.ts +1 -1
- package/src/transport/surface/responses/encode.ts +2 -3
- package/src/transport/surface/responses/parse.ts +49 -7
- package/src/types/undici.d.ts +33 -0
- package/src/workers/buddy-growth-tasks.ts +346 -425
- package/src/workers/daily-checkin.ts +17 -6
- package/src/workers/quota-refresh-sweep.ts +2 -2
- package/src/workers/scheduler.ts +17 -1
- package/dist/dashboard/assets/BannedPage-P76QLGJA.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-DdBggJS9.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-aN1iXhhP.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DE-F1nxZ.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-5SpmfLyw.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-5SpmfLyw.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-3CUxMy2X.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BkmJQKC0.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-BkmJQKC0.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-B_0FUKWc.js +0 -1
- package/dist/dashboard/assets/LoginPage-B_0FUKWc.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-DKVslqG3.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-D-H4MEiT.js +0 -1
- package/dist/dashboard/assets/OverviewPage-D-H4MEiT.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-CEJw6Guo.js +0 -3
- package/dist/dashboard/assets/ProviderDetailPage-CEJw6Guo.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CEplAR-i.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-CEplAR-i.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CAN7hy0f.js +0 -7
- package/dist/dashboard/assets/ProxyPage-CAN7hy0f.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-BjldQwIU.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-DUIoLRxk.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-_bCaTM0v.js +0 -1
- package/dist/dashboard/assets/SetupPage-_bCaTM0v.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-fI7JkdIB.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-CHVZqskZ.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-DiFBymHj.js +0 -56
- package/dist/dashboard/assets/UsagePage-DiFBymHj.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-DFY_fZU4.js.gz +0 -0
- package/dist/dashboard/assets/app-BOJ1_xUB.css +0 -2
- package/dist/dashboard/assets/app-BOJ1_xUB.css.gz +0 -0
- package/dist/dashboard/assets/assert-CwdnZARt.js.gz +0 -0
- package/dist/dashboard/assets/badge-Dr-uf0Au.js.gz +0 -0
- package/dist/dashboard/assets/banner-BddmMdoS.js.gz +0 -0
- package/dist/dashboard/assets/card-CK0PXWlX.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-CcB6mGh2.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DGb2P9Yx.js.gz +0 -0
- package/dist/dashboard/assets/cog-CdWhsajs.js +0 -1
- package/dist/dashboard/assets/cog-CdWhsajs.js.gz +0 -0
- package/dist/dashboard/assets/dialog-LkfuL50u.js.gz +0 -0
- package/dist/dashboard/assets/drawer-ZbEZ_84c.js.gz +0 -0
- package/dist/dashboard/assets/entry-BJfsVMvA.js.gz +0 -0
- package/dist/dashboard/assets/entry-CWBY5A0f.js.gz +0 -0
- package/dist/dashboard/assets/entry-CvC1-Zqx.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-BxpznFLt.js.gz +0 -0
- package/dist/dashboard/assets/index-CDzP3ovJ.js.gz +0 -0
- package/dist/dashboard/assets/inline-Ae13MQ5w.js.gz +0 -0
- package/dist/dashboard/assets/input-D23fo7cp.js.gz +0 -0
- package/dist/dashboard/assets/layout-CSsxjj5P.js.gz +0 -0
- package/dist/dashboard/assets/list-row-dmbwZMDY.js.gz +0 -0
- package/dist/dashboard/assets/live-BG1oUsZZ.js.gz +0 -0
- package/dist/dashboard/assets/mutation-DSF-e4ho.js.gz +0 -0
- package/dist/dashboard/assets/numbers-Bm_aECY7.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-CF56nYIV.js.gz +0 -0
- package/dist/dashboard/assets/routing-CeA71n7G.js.gz +0 -0
- package/dist/dashboard/assets/select-KIT0rC6G.js.gz +0 -0
- package/dist/dashboard/assets/settings-B_2gkePf.js.gz +0 -0
- package/dist/dashboard/assets/stack-D7WOSzcX.js.gz +0 -0
- package/dist/dashboard/assets/state-BBxtKZOQ.js.gz +0 -0
- package/dist/dashboard/assets/switch-DNS_D5Ea.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BgoxdoMk.js.gz +0 -0
- /package/dist/dashboard/assets/{app-CaXZ9SCn.js → app-BaWd0puM.js} +0 -0
- /package/dist/dashboard/assets/{app-CaXZ9SCn.js.gz → app-BaWd0puM.js.gz} +0 -0
|
@@ -3,12 +3,7 @@ import type { ProviderDispatchContext, ProviderId, ProviderAdapter } from "../..
|
|
|
3
3
|
import { GatewayError } from "../../protocol/gateway-error";
|
|
4
4
|
import type { CanonicalEvent } from "../../protocol/canonical-model";
|
|
5
5
|
import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
|
|
6
|
-
import type { OAuthTokenRefresher } from "../../providers/authentication/oauth-refresh-service";
|
|
7
|
-
import type { OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
|
|
8
|
-
import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
|
|
9
6
|
import type { ByokUpstreamHost } from "../../providers/operations/provider-catalog-service";
|
|
10
|
-
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
11
|
-
import type { RouteSnapshotService } from "../routing/route-model";
|
|
12
7
|
import { chatAdapter } from "../surface/chat/adapter";
|
|
13
8
|
import { responsesAdapter } from "../surface/responses/adapter";
|
|
14
9
|
import { messagesAdapter } from "../surface/messages/adapter";
|
|
@@ -21,10 +16,6 @@ import {
|
|
|
21
16
|
resolveTenantImageClampMaxBytes,
|
|
22
17
|
} from "../request/tenant-preferences";
|
|
23
18
|
import { metrics } from "../../observability/metrics";
|
|
24
|
-
import type { NetworkPoolSelector } from "../../network/pool/selector";
|
|
25
|
-
import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
|
|
26
|
-
import { ProxyRequestStateStore } from "../request/state";
|
|
27
|
-
import type { ProxyRequestPreparer } from "../request/preparer";
|
|
28
19
|
import { repriceUsage } from "../../providers/provider-usage";
|
|
29
20
|
import {
|
|
30
21
|
captureProviderExchange,
|
|
@@ -40,27 +31,17 @@ import {
|
|
|
40
31
|
shouldCaptureProviderBodyForRequest,
|
|
41
32
|
} from "./capture-policy";
|
|
42
33
|
import { runAttemptLoop } from "./attempt-loop";
|
|
43
|
-
import { projectForRoute, routeCapabilitiesFor } from "
|
|
34
|
+
import { projectForRoute, routeCapabilitiesFor } from "../../protocol/translation/capabilities";
|
|
44
35
|
import { dispatchStreamingAttempt } from "./streaming/stream";
|
|
45
36
|
import type { ProviderContinuationScope } from "../../providers/provider-contracts";
|
|
46
37
|
import type { PreparedProxyRequest } from "../request/preparer";
|
|
47
38
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/** Preferred over `providerAdapters`: resolves an adapter on demand and caches it. */
|
|
52
|
-
readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
|
|
53
|
-
readonly stateStore: ProxyRequestStateStore;
|
|
54
|
-
readonly proxyPreparer?: ProxyRequestPreparer;
|
|
55
|
-
readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
|
|
39
|
+
import type { GatewayHandlerDeps } from "./handler-deps";
|
|
40
|
+
|
|
41
|
+
export type ProviderProxyHandlerDeps = GatewayHandlerDeps & {
|
|
56
42
|
/** Live lookup of a provider's SSRF-validated upstream host. */
|
|
57
43
|
readonly byokUpstreamHosts?: { readonly get: (providerId: string) => ByokUpstreamHost | undefined };
|
|
58
|
-
|
|
59
|
-
readonly snapshotService?: RouteSnapshotService;
|
|
60
|
-
readonly telemetryBuffer?: TelemetryBatchBuffer;
|
|
61
|
-
readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
|
|
62
|
-
readonly oauthRefreshService?: OAuthRefreshService;
|
|
63
|
-
}
|
|
44
|
+
};
|
|
64
45
|
|
|
65
46
|
/**
|
|
66
47
|
* The continuation scope one dispatch carries.
|
|
@@ -200,9 +181,7 @@ export async function handleProviderProxyRequest(
|
|
|
200
181
|
provider_id: candidate.provider_id as ProviderId,
|
|
201
182
|
credential_kind: "none" as const,
|
|
202
183
|
};
|
|
203
|
-
const adapter = deps.resolveProviderAdapter
|
|
204
|
-
? await deps.resolveProviderAdapter(candidate.provider_id)
|
|
205
|
-
: deps.providerAdapters.get(candidate.provider_id);
|
|
184
|
+
const adapter = await deps.resolveProviderAdapter?.(candidate.provider_id);
|
|
206
185
|
if (!adapter)
|
|
207
186
|
throw new GatewayError("admission_unavailable", 503, "provider adapter not registered");
|
|
208
187
|
if (!isBundledProviderId(candidate.provider_id)) {
|
|
@@ -284,9 +263,6 @@ export async function handleProviderProxyRequest(
|
|
|
284
263
|
),
|
|
285
264
|
}
|
|
286
265
|
: {}),
|
|
287
|
-
...(deps.networkBindingFactory
|
|
288
|
-
? { outboundWebSocket: deps.networkBindingFactory.webSocket(networkPoolId, prepared.authorization.snapshot.tenant_id) }
|
|
289
|
-
: {}),
|
|
290
266
|
...(deps.networkBindingFactory
|
|
291
267
|
? {
|
|
292
268
|
outboundHttp2: deps.networkBindingFactory.http2Bidi(
|
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import type { ProviderAdapter } from "../../providers/provider-contracts";
|
|
2
1
|
import { GatewayError } from "../../protocol/gateway-error";
|
|
3
2
|
import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
|
|
4
|
-
import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
|
|
5
|
-
import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
|
|
6
|
-
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
7
|
-
import type { RouteSnapshotService } from "../routing/route-model";
|
|
8
3
|
import { metrics } from "../../observability/metrics";
|
|
9
|
-
import
|
|
10
|
-
import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
|
|
11
|
-
import { ProxyRequestStateStore } from "../request/state";
|
|
12
|
-
import { ProxyRequestPreparer } from "../request/preparer";
|
|
13
|
-
import { parseThinkingSuffix } from "../translation/thinking";
|
|
4
|
+
import { parseThinkingSuffix } from "../../protocol/translation/thinking";
|
|
14
5
|
import type { CodexCompactAdapter } from "../../providers/integrations/codex/codex";
|
|
15
|
-
import { completeAttempt, estimatedUsage } from "./attempt-finalize";
|
|
6
|
+
import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
|
|
16
7
|
import { repriceUsage, usageFromProvider } from "../../providers/provider-usage";
|
|
17
8
|
import { runAttemptLoop } from "./attempt-loop";
|
|
18
9
|
|
|
@@ -20,20 +11,9 @@ import { runAttemptLoop } from "./attempt-loop";
|
|
|
20
11
|
* The native Codex compaction route (`POST /v1/responses/compact`) and the
|
|
21
12
|
* dependency surface it needs to drive `runAttemptLoop`.
|
|
22
13
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
/** Preferred over `providerAdapters`: resolves an adapter on demand and caches it. */
|
|
27
|
-
readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
|
|
28
|
-
readonly proxyPreparer: ProxyRequestPreparer;
|
|
29
|
-
readonly stateStore: ProxyRequestStateStore;
|
|
30
|
-
readonly poolSelector?: NetworkPoolSelector;
|
|
31
|
-
readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
|
|
32
|
-
readonly snapshotService?: RouteSnapshotService;
|
|
33
|
-
readonly telemetryBuffer?: TelemetryBatchBuffer;
|
|
34
|
-
readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
|
|
35
|
-
readonly oauthRefreshService?: OAuthRefreshService;
|
|
36
|
-
}
|
|
14
|
+
import type { GatewayHandlerDeps } from "./handler-deps";
|
|
15
|
+
|
|
16
|
+
export type ResponsesCompactHandlerDeps = GatewayHandlerDeps;
|
|
37
17
|
|
|
38
18
|
/**
|
|
39
19
|
* Handles `POST /v1/responses/compact`: the native Codex compaction proxy. The
|
|
@@ -72,9 +52,7 @@ export function createResponsesCompactHandler(deps: ResponsesCompactHandlerDeps)
|
|
|
72
52
|
400,
|
|
73
53
|
"Responses compact does not support streaming",
|
|
74
54
|
);
|
|
75
|
-
const adapter = (deps.resolveProviderAdapter
|
|
76
|
-
? await deps.resolveProviderAdapter("codex")
|
|
77
|
-
: deps.providerAdapters.get("codex")) as CodexCompactAdapter | undefined;
|
|
55
|
+
const adapter = (await deps.resolveProviderAdapter?.("codex")) as CodexCompactAdapter | undefined;
|
|
78
56
|
if (!adapter || typeof adapter.compact !== "function")
|
|
79
57
|
throw new GatewayError("admission_unavailable", 503, "Codex compact transport unavailable");
|
|
80
58
|
const prepared = await deps.proxyPreparer.prepareNativeCompact({
|
|
@@ -167,22 +145,23 @@ export function createResponsesCompactHandler(deps: ResponsesCompactHandlerDeps)
|
|
|
167
145
|
);
|
|
168
146
|
await completeAttempt(state, {
|
|
169
147
|
status: "completed",
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
148
|
+
...nativeCompletionBase({
|
|
149
|
+
providerId: candidate.provider_id,
|
|
150
|
+
...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
|
|
151
|
+
...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
|
|
152
|
+
...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
|
|
153
|
+
usage,
|
|
154
|
+
modelId: candidate.model_id,
|
|
155
|
+
lease: leases.lease,
|
|
156
|
+
commitUsage: usage,
|
|
157
|
+
tenantId: prepared.authorization.tenantId,
|
|
158
|
+
ingressBody: state.ingressBody,
|
|
159
|
+
providerCapture,
|
|
160
|
+
db: deps.db,
|
|
161
|
+
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
162
|
+
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
163
|
+
}),
|
|
181
164
|
responseBody: null,
|
|
182
|
-
providerCapture,
|
|
183
|
-
db: deps.db,
|
|
184
|
-
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
185
|
-
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
186
165
|
});
|
|
187
166
|
metrics.proxy_requests_total.inc(1, { status: "completed" });
|
|
188
167
|
return new Response(response.body, {
|
|
@@ -558,6 +558,9 @@ export class StreamFinalizer {
|
|
|
558
558
|
// never an upstream-reported error — the upstream path is already
|
|
559
559
|
// covered by the `GatewayError` branch keeping its own origin.
|
|
560
560
|
errorOrigin: terminalOutcome.errorOrigin,
|
|
561
|
+
...(terminalOutcome.httpStatus === undefined
|
|
562
|
+
? {}
|
|
563
|
+
: { terminalHttpStatus: terminalOutcome.httpStatus }),
|
|
561
564
|
...(!cancelled ? { error: streamError } : {}),
|
|
562
565
|
...(!cancelled
|
|
563
566
|
? {
|
|
@@ -220,14 +220,6 @@ export async function dispatchStreamingAttempt(input: StreamingDispatchInput): P
|
|
|
220
220
|
...(candidate.user_agent === undefined ? {} : { userAgent: candidate.user_agent }),
|
|
221
221
|
...(wrappedOutboundFetch ? { outboundFetch: wrappedOutboundFetch } : {}),
|
|
222
222
|
...(outboundFetch ? { outboundAttachmentFetch: outboundFetch } : {}),
|
|
223
|
-
...(deps.networkBindingFactory
|
|
224
|
-
? {
|
|
225
|
-
outboundWebSocket: deps.networkBindingFactory.webSocket(
|
|
226
|
-
networkPoolId,
|
|
227
|
-
prepared.authorization.snapshot.tenant_id,
|
|
228
|
-
),
|
|
229
|
-
}
|
|
230
|
-
: {}),
|
|
231
223
|
...(deps.networkBindingFactory
|
|
232
224
|
? {
|
|
233
225
|
outboundHttp2: deps.networkBindingFactory.http2Bidi(
|
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import type { ProviderAdapter, ProviderDispatchTarget } from "../../providers/provider-contracts";
|
|
2
2
|
import { GatewayError } from "../../protocol/gateway-error";
|
|
3
3
|
import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
|
|
4
|
-
import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
|
|
5
|
-
import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
|
|
6
|
-
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
7
|
-
import type { RouteSnapshotService } from "../routing/route-model";
|
|
8
4
|
import { metrics } from "../../observability/metrics";
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import { ProxyRequestStateStore } from "../request/state";
|
|
12
|
-
import { ProxyRequestPreparer } from "../request/preparer";
|
|
13
|
-
import { parseThinkingSuffix } from "../translation/thinking";
|
|
14
|
-
import { completeAttempt, estimatedUsage } from "./attempt-finalize";
|
|
5
|
+
import { parseThinkingSuffix } from "../../protocol/translation/thinking";
|
|
6
|
+
import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
|
|
15
7
|
import { repriceUsage, usageFromProvider } from "../../providers/provider-usage";
|
|
16
8
|
import { runAttemptLoop } from "./attempt-loop";
|
|
17
9
|
|
|
@@ -26,20 +18,9 @@ import { runAttemptLoop } from "./attempt-loop";
|
|
|
26
18
|
* route. The provider's adapter method (`ProviderAdapter.systemone`) forwards
|
|
27
19
|
* the body untouched.
|
|
28
20
|
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/** Preferred over `providerAdapters`: resolves an adapter on demand and caches it. */
|
|
33
|
-
readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
|
|
34
|
-
readonly proxyPreparer: ProxyRequestPreparer;
|
|
35
|
-
readonly stateStore: ProxyRequestStateStore;
|
|
36
|
-
readonly poolSelector?: NetworkPoolSelector;
|
|
37
|
-
readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
|
|
38
|
-
readonly snapshotService?: RouteSnapshotService;
|
|
39
|
-
readonly telemetryBuffer?: TelemetryBatchBuffer;
|
|
40
|
-
readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
|
|
41
|
-
readonly oauthRefreshService?: OAuthRefreshService;
|
|
42
|
-
}
|
|
21
|
+
import type { GatewayHandlerDeps } from "./handler-deps";
|
|
22
|
+
|
|
23
|
+
export type SystemoneHandlerDeps = GatewayHandlerDeps;
|
|
43
24
|
|
|
44
25
|
/** Adapter that can serve a System One decision request. */
|
|
45
26
|
type SystemoneAdapter = ProviderAdapter & {
|
|
@@ -117,9 +98,7 @@ export function createSystemoneHandler(deps: SystemoneHandlerDeps) {
|
|
|
117
98
|
provider_id: candidate.provider_id as ProviderAdapter["provider_id"],
|
|
118
99
|
credential_kind: "none" as const,
|
|
119
100
|
};
|
|
120
|
-
const adapter = (deps.resolveProviderAdapter
|
|
121
|
-
? await deps.resolveProviderAdapter(candidate.provider_id)
|
|
122
|
-
: deps.providerAdapters.get(candidate.provider_id)) as SystemoneAdapter | undefined;
|
|
101
|
+
const adapter = (await deps.resolveProviderAdapter?.(candidate.provider_id)) as SystemoneAdapter | undefined;
|
|
123
102
|
if (!adapter || typeof adapter.systemone !== "function")
|
|
124
103
|
throw new GatewayError(
|
|
125
104
|
"capability_unsupported",
|
|
@@ -194,22 +173,23 @@ export function createSystemoneHandler(deps: SystemoneHandlerDeps) {
|
|
|
194
173
|
);
|
|
195
174
|
await completeAttempt(state, {
|
|
196
175
|
status: "completed",
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
176
|
+
...nativeCompletionBase({
|
|
177
|
+
providerId: candidate.provider_id,
|
|
178
|
+
...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
|
|
179
|
+
...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
|
|
180
|
+
...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
|
|
181
|
+
usage,
|
|
182
|
+
modelId: candidate.model_id,
|
|
183
|
+
lease: leases.lease,
|
|
184
|
+
commitUsage: usage,
|
|
185
|
+
tenantId: prepared.authorization.tenantId,
|
|
186
|
+
ingressBody: state.ingressBody,
|
|
187
|
+
providerCapture,
|
|
188
|
+
db: deps.db,
|
|
189
|
+
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
190
|
+
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
191
|
+
}),
|
|
208
192
|
responseBody: null,
|
|
209
|
-
providerCapture,
|
|
210
|
-
db: deps.db,
|
|
211
|
-
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
212
|
-
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
213
193
|
});
|
|
214
194
|
metrics.proxy_requests_total.inc(1, { status: "completed" });
|
|
215
195
|
return new Response(response.body, {
|
|
@@ -37,30 +37,15 @@ import type { ProviderAdapter, ProviderDispatchTarget } from "../../providers/pr
|
|
|
37
37
|
import { GatewayError } from "../../protocol/gateway-error";
|
|
38
38
|
import { isRecord } from "../../protocol/codecs";
|
|
39
39
|
import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
|
|
40
|
-
import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
|
|
41
|
-
import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
|
|
42
|
-
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
43
40
|
import { metrics } from "../../observability/metrics";
|
|
44
|
-
import type {
|
|
45
|
-
import type {
|
|
46
|
-
import
|
|
47
|
-
import type { ProxyRequestPreparer, PreparedNativeRequest } from "../request/preparer";
|
|
48
|
-
import { completeAttempt, estimatedUsage } from "./attempt-finalize";
|
|
41
|
+
import type { ProxyRequestState } from "../request/state";
|
|
42
|
+
import type { PreparedNativeRequest } from "../request/preparer";
|
|
43
|
+
import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
|
|
49
44
|
import { runAttemptLoop } from "./attempt-loop";
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
|
|
55
|
-
readonly proxyPreparer: ProxyRequestPreparer;
|
|
56
|
-
readonly stateStore: ProxyRequestStateStore;
|
|
57
|
-
readonly poolSelector?: NetworkPoolSelector;
|
|
58
|
-
readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
|
|
59
|
-
readonly snapshotService?: import("../routing/route-model").RouteSnapshotService;
|
|
60
|
-
readonly telemetryBuffer?: TelemetryBatchBuffer;
|
|
61
|
-
readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
|
|
62
|
-
readonly oauthRefreshService?: OAuthRefreshService;
|
|
63
|
-
}
|
|
46
|
+
import type { GatewayHandlerDeps } from "./handler-deps";
|
|
47
|
+
|
|
48
|
+
export type TokenCountHandlerDeps = GatewayHandlerDeps;
|
|
64
49
|
|
|
65
50
|
/** Builds the `POST /v1/messages/count_tokens` handler. */
|
|
66
51
|
export function createTokenCountHandler(deps: TokenCountHandlerDeps) {
|
|
@@ -144,9 +129,7 @@ export function createTokenCountHandler(deps: TokenCountHandlerDeps) {
|
|
|
144
129
|
provider_id: candidate.provider_id as ProviderAdapter["provider_id"],
|
|
145
130
|
credential_kind: "none" as const,
|
|
146
131
|
};
|
|
147
|
-
const adapter = deps.resolveProviderAdapter
|
|
148
|
-
? await deps.resolveProviderAdapter(candidate.provider_id)
|
|
149
|
-
: deps.providerAdapters.get(candidate.provider_id);
|
|
132
|
+
const adapter = await deps.resolveProviderAdapter?.(candidate.provider_id);
|
|
150
133
|
if (!adapter) {
|
|
151
134
|
throw new GatewayError("capability_unsupported", 400, "token counting is unavailable for this provider");
|
|
152
135
|
}
|
|
@@ -201,22 +184,23 @@ export function createTokenCountHandler(deps: TokenCountHandlerDeps) {
|
|
|
201
184
|
// quietly stop holding.
|
|
202
185
|
await completeAttempt(state, {
|
|
203
186
|
status: upstream.ok ? "completed" : "failed",
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
187
|
+
...nativeCompletionBase({
|
|
188
|
+
providerId: candidate.provider_id,
|
|
189
|
+
...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
|
|
190
|
+
...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
|
|
191
|
+
...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
|
|
192
|
+
usage: estimatedUsage(0, 0),
|
|
193
|
+
modelId: candidate.model_id,
|
|
194
|
+
lease: leases.lease,
|
|
195
|
+
commitUsage: estimatedUsage(0, 0),
|
|
196
|
+
tenantId: prepared.authorization.tenantId,
|
|
197
|
+
ingressBody: state.ingressBody,
|
|
198
|
+
providerCapture,
|
|
199
|
+
db: deps.db,
|
|
200
|
+
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
201
|
+
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
202
|
+
}),
|
|
215
203
|
responseBody: null,
|
|
216
|
-
providerCapture,
|
|
217
|
-
db: deps.db,
|
|
218
|
-
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
219
|
-
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
220
204
|
});
|
|
221
205
|
metrics.proxy_requests_total.inc(1, { status: upstream.ok ? "completed" : "failed" });
|
|
222
206
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CanonicalEvent } from "../../protocol/canonical-model";
|
|
2
|
-
import type { AttemptLeaseOwnership, ValidatedOutboundFetch, ValidatedOutboundHttp2Bidi
|
|
2
|
+
import type { AttemptLeaseOwnership, ValidatedOutboundFetch, ValidatedOutboundHttp2Bidi } from "../../providers/provider-contracts";
|
|
3
3
|
import type { ProviderContinuationScope } from "../../providers/provider-contracts";
|
|
4
4
|
import { GATEWAY_SECURITY_HEADERS } from "../../security/outbound-headers";
|
|
5
5
|
|
|
@@ -44,7 +44,6 @@ export function buildUpstreamDispatchContext(input: {
|
|
|
44
44
|
readonly outboundFetch?: ValidatedOutboundFetch;
|
|
45
45
|
/** Validated attachment egress that must not be wrapped by provider payload capture. */
|
|
46
46
|
readonly outboundAttachmentFetch?: ValidatedOutboundFetch;
|
|
47
|
-
readonly outboundWebSocket?: ValidatedOutboundWebSocket;
|
|
48
47
|
/** Validated bidirectional HTTP/2 egress bound to the same selected pool. */
|
|
49
48
|
readonly outboundHttp2?: ValidatedOutboundHttp2Bidi;
|
|
50
49
|
/**
|
|
@@ -95,7 +94,6 @@ export function buildUpstreamDispatchContext(input: {
|
|
|
95
94
|
...(input.outboundAttachmentFetch
|
|
96
95
|
? { outbound_attachment_fetch: input.outboundAttachmentFetch }
|
|
97
96
|
: {}),
|
|
98
|
-
...(input.outboundWebSocket ? { outbound_websocket: input.outboundWebSocket } : {}),
|
|
99
97
|
...(input.outboundHttp2 ? { outbound_http2: input.outboundHttp2 } : {}),
|
|
100
98
|
...(input.leaseOwnership ? { lease_ownership: input.leaseOwnership } : {}),
|
|
101
99
|
...(input.continuationScope ? { continuation_scope: input.continuationScope } : {}),
|
|
@@ -17,32 +17,14 @@
|
|
|
17
17
|
import type { ProviderAdapter, ProviderDispatchTarget } from "../../providers/provider-contracts";
|
|
18
18
|
import { GatewayError } from "../../protocol/gateway-error";
|
|
19
19
|
import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
|
|
20
|
-
import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
|
|
21
|
-
import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
|
|
22
|
-
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
23
|
-
import type { RouteSnapshotService } from "../routing/route-model";
|
|
24
20
|
import { metrics } from "../../observability/metrics";
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
-
import { ProxyRequestStateStore } from "../request/state";
|
|
28
|
-
import { ProxyRequestPreparer } from "../request/preparer";
|
|
29
|
-
import { parseThinkingSuffix } from "../translation/thinking";
|
|
30
|
-
import { completeAttempt, estimatedUsage } from "./attempt-finalize";
|
|
21
|
+
import { parseThinkingSuffix } from "../../protocol/translation/thinking";
|
|
22
|
+
import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
|
|
31
23
|
import { runAttemptLoop } from "./attempt-loop";
|
|
32
24
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
|
|
37
|
-
readonly proxyPreparer: ProxyRequestPreparer;
|
|
38
|
-
readonly stateStore: ProxyRequestStateStore;
|
|
39
|
-
readonly poolSelector?: NetworkPoolSelector;
|
|
40
|
-
readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
|
|
41
|
-
readonly snapshotService?: RouteSnapshotService;
|
|
42
|
-
readonly telemetryBuffer?: TelemetryBatchBuffer;
|
|
43
|
-
readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
|
|
44
|
-
readonly oauthRefreshService?: OAuthRefreshService;
|
|
45
|
-
}
|
|
25
|
+
import type { GatewayHandlerDeps } from "./handler-deps";
|
|
26
|
+
|
|
27
|
+
export type WebsearchHandlerDeps = GatewayHandlerDeps;
|
|
46
28
|
|
|
47
29
|
|
|
48
30
|
|
|
@@ -122,9 +104,7 @@ export function createWebsearchHandler(deps: WebsearchHandlerDeps) {
|
|
|
122
104
|
provider_id: candidate.provider_id as ProviderAdapter["provider_id"],
|
|
123
105
|
credential_kind: "none" as const,
|
|
124
106
|
};
|
|
125
|
-
const adapter = (deps.resolveProviderAdapter
|
|
126
|
-
? await deps.resolveProviderAdapter(candidate.provider_id)
|
|
127
|
-
: deps.providerAdapters.get(candidate.provider_id)) as WebsearchAdapter | undefined;
|
|
107
|
+
const adapter = (await deps.resolveProviderAdapter?.(candidate.provider_id)) as WebsearchAdapter | undefined;
|
|
128
108
|
if (!adapter || typeof adapter.websearch !== "function")
|
|
129
109
|
throw new GatewayError(
|
|
130
110
|
"capability_unsupported",
|
|
@@ -174,22 +154,23 @@ export function createWebsearchHandler(deps: WebsearchHandlerDeps) {
|
|
|
174
154
|
const usage = estimatedUsage(0, 0);
|
|
175
155
|
await completeAttempt(state, {
|
|
176
156
|
status: "completed",
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
157
|
+
...nativeCompletionBase({
|
|
158
|
+
providerId: candidate.provider_id,
|
|
159
|
+
...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
|
|
160
|
+
...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
|
|
161
|
+
...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
|
|
162
|
+
usage,
|
|
163
|
+
modelId: candidate.model_id,
|
|
164
|
+
lease: leases.lease,
|
|
165
|
+
commitUsage: usage,
|
|
166
|
+
tenantId: prepared.authorization.tenantId,
|
|
167
|
+
ingressBody: state.ingressBody,
|
|
168
|
+
providerCapture,
|
|
169
|
+
db: deps.db,
|
|
170
|
+
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
171
|
+
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
172
|
+
}),
|
|
188
173
|
responseBody: payload,
|
|
189
|
-
providerCapture,
|
|
190
|
-
db: deps.db,
|
|
191
|
-
...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
|
|
192
|
-
...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
|
|
193
174
|
});
|
|
194
175
|
metrics.proxy_requests_total.inc(1, { status: "completed" });
|
|
195
176
|
return jsonResponse(payload, 200, state.requestId);
|