cartethyia 2.5.4 → 2.5.7
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 +13 -4
- package/README.md +2 -2
- package/dist/dashboard/assets/{BannedPage-C2orBsI2.js → BannedPage-DE2607Tb.js} +1 -1
- package/dist/dashboard/assets/BannedPage-DE2607Tb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-Duv6mfrl.js +1 -0
- package/dist/dashboard/assets/CliToolDetailPage-Duv6mfrl.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BV6pxVQo.js → CliToolsPage-C2PNYWzk.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-C2PNYWzk.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-TXP9OfAM.js +1 -0
- package/dist/dashboard/assets/CombosPage-TXP9OfAM.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-CW-wPmJ6.js → ConsoleLogPage-B-9xnAQN.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-B-9xnAQN.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-0p8uX7vB.js → CustomizationPage-xeax9nJt.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-xeax9nJt.js.gz +0 -0
- package/dist/dashboard/assets/{HealthEventsModal-BjqSMfko.js → HealthEventsModal-Df4jjaHJ.js} +1 -1
- package/dist/dashboard/assets/HealthEventsModal-Df4jjaHJ.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-BvzCx8Kr.js → LoginPage-Dyojsm84.js} +1 -1
- package/dist/dashboard/assets/LoginPage-Dyojsm84.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-C7pDb41R.js +1 -0
- package/dist/dashboard/assets/ModelPicker-C7pDb41R.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BJfg4ow6.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BJfg4ow6.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-ChCX1gmT.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-ChCX1gmT.js.gz +0 -0
- package/dist/dashboard/assets/{ProvidersPage-Js9jUPSb.js → ProvidersPage-DeWSOEUO.js} +1 -1
- package/dist/dashboard/assets/ProvidersPage-DeWSOEUO.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CkpWln2S.js +7 -0
- package/dist/dashboard/assets/ProxyPage-CkpWln2S.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-B3VOgQmt.js +1 -0
- package/dist/dashboard/assets/QuotaPage-B3VOgQmt.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-C_klIZom.js +1 -0
- package/dist/dashboard/assets/SettingsPage-C_klIZom.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-DDbMQsoo.js → SetupPage-BYph-InK.js} +1 -1
- package/dist/dashboard/assets/SetupPage-BYph-InK.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-CB3Z7VTf.js → SortableList-CvyQCYWJ.js} +1 -1
- package/dist/dashboard/assets/SortableList-CvyQCYWJ.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-D95UCPHI.js → StudioPage-Cm1JYilI.js} +3 -3
- package/dist/dashboard/assets/StudioPage-Cm1JYilI.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-DlFnc3_S.js +56 -0
- package/dist/dashboard/assets/UsagePage-DlFnc3_S.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-DQYLQxpW.js +1 -0
- package/dist/dashboard/assets/api-keys-DQYLQxpW.js.gz +0 -0
- package/dist/dashboard/assets/app-CX_Z8cMs.css +2 -0
- package/dist/dashboard/assets/app-CX_Z8cMs.css.gz +0 -0
- package/dist/dashboard/assets/{assert-Chi7pCnt.js → assert-C9FD_JwJ.js} +1 -1
- package/dist/dashboard/assets/assert-C9FD_JwJ.js.gz +0 -0
- package/dist/dashboard/assets/{badge-D4pQapKj.js → badge-CR72dasT.js} +1 -1
- package/dist/dashboard/assets/badge-CR72dasT.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DH6cg-_B.js → banner-CI9_eSfO.js} +1 -1
- package/dist/dashboard/assets/banner-CI9_eSfO.js.gz +0 -0
- package/dist/dashboard/assets/{card-BKqlUOe4.js → card-DS7CQEsO.js} +1 -1
- package/dist/dashboard/assets/card-DS7CQEsO.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-fTgljTGA.js → cli-tools-CNqzrfdb.js} +1 -1
- package/dist/dashboard/assets/cli-tools-CNqzrfdb.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-D5Ys_sM0.js → clipboard-button-611pSsaX.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-611pSsaX.js.gz +0 -0
- package/dist/dashboard/assets/{fingerprint-pattern-BWuHtbW4.js → concurrency-BDF0ok7y.js} +1 -1
- package/dist/dashboard/assets/concurrency-BDF0ok7y.js.gz +0 -0
- package/dist/dashboard/assets/dialog-k37exjNt.js +1 -0
- package/dist/dashboard/assets/dialog-k37exjNt.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CX7N8ucR.js +1 -0
- package/dist/dashboard/assets/drawer-CX7N8ucR.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CQBr6U9c.js → entry-B9Xvtnfj.js} +1 -1
- package/dist/dashboard/assets/entry-B9Xvtnfj.js.gz +0 -0
- package/dist/dashboard/assets/entry-Bog0p925.js +4 -0
- package/dist/dashboard/assets/entry-Bog0p925.js.gz +0 -0
- package/dist/dashboard/assets/entry-CTP8AyiS.js +1 -0
- package/dist/dashboard/assets/entry-CTP8AyiS.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-BlptL8Uf.js → github-badge-sltk1qUi.js} +1 -1
- package/dist/dashboard/assets/github-badge-sltk1qUi.js.gz +0 -0
- package/dist/dashboard/assets/{index-js6TJvdr.js → index-CZQIrdoX.js} +2 -2
- package/dist/dashboard/assets/index-CZQIrdoX.js.gz +0 -0
- package/dist/dashboard/assets/{inline-DUWDSmDV.js → inline-BhY2sSnO.js} +1 -1
- package/dist/dashboard/assets/inline-BhY2sSnO.js.gz +0 -0
- package/dist/dashboard/assets/{input-LVjgZq4f.js → input-V1umFiBk.js} +1 -1
- package/dist/dashboard/assets/input-V1umFiBk.js.gz +0 -0
- package/dist/dashboard/assets/layout-BBOYycyS.js +1 -0
- package/dist/dashboard/assets/layout-BBOYycyS.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-DupvLfDx.js → list-row-1zzZYM0B.js} +1 -1
- package/dist/dashboard/assets/list-row-1zzZYM0B.js.gz +0 -0
- package/dist/dashboard/assets/{live-C4pEJUqI.js → live-BivGfuUs.js} +1 -1
- package/dist/dashboard/assets/live-BivGfuUs.js.gz +0 -0
- package/dist/dashboard/assets/{model-bans-BRiuufkB.js → model-bans-CmffjLuG.js} +1 -1
- package/dist/dashboard/assets/model-bans-CmffjLuG.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-B4ROwk8L.js → mutation-46P0oWMe.js} +1 -1
- package/dist/dashboard/assets/mutation-46P0oWMe.js.gz +0 -0
- package/dist/dashboard/assets/numbers-DkfMR5Qs.js +2 -0
- package/dist/dashboard/assets/numbers-DkfMR5Qs.js.gz +0 -0
- package/dist/dashboard/assets/{query-keys-gmjzC3RS.js → query-keys-BFhGpwR1.js} +1 -1
- package/dist/dashboard/assets/query-keys-BFhGpwR1.js.gz +0 -0
- package/dist/dashboard/assets/{routing-C7tBT5o-.js → routing-CAb4F37R.js} +1 -1
- package/dist/dashboard/assets/routing-CAb4F37R.js.gz +0 -0
- package/dist/dashboard/assets/{select-WUCXorXw.js → select-BPpSsBgL.js} +1 -1
- package/dist/dashboard/assets/select-BPpSsBgL.js.gz +0 -0
- package/dist/dashboard/assets/{settings-C_zKl1GS.js → settings-DNX9sydi.js} +1 -1
- package/dist/dashboard/assets/settings-DNX9sydi.js.gz +0 -0
- package/dist/dashboard/assets/{stack-_3O0F8Xn.js → stack-BHTfXdz_.js} +1 -1
- package/dist/dashboard/assets/stack-BHTfXdz_.js.gz +0 -0
- package/dist/dashboard/assets/{state-BgTxHcJS.js → state-mPDRlQkl.js} +1 -1
- package/dist/dashboard/assets/state-mPDRlQkl.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DEjTtOWf.js → switch-DOmJxg7H.js} +1 -1
- package/dist/dashboard/assets/switch-DOmJxg7H.js.gz +0 -0
- package/dist/dashboard/assets/tokens-COzario9.js +1 -0
- package/dist/dashboard/assets/tokens-COzario9.js.gz +0 -0
- package/dist/dashboard/assets/use-modal-focus-By7oJoGd.js +1 -0
- package/dist/dashboard/assets/use-modal-focus-By7oJoGd.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BWSC0UAS.js → useMutation-Dem0lXQj.js} +1 -1
- package/dist/dashboard/assets/useMutation-Dem0lXQj.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 -54
- package/migrations/README.md +52 -52
- package/migrations/lite-sqlite3/0000_baseline.sql +2 -2
- package/package.json +95 -95
- package/scripts/cli/admin.ts +125 -0
- package/scripts/cli/{ui/background.ts → background.ts} +1 -1
- package/scripts/cli/{command/console-menu.ts → console-menu.ts} +275 -244
- package/scripts/cli/doctor.ts +37 -0
- package/scripts/cli/{support/env.ts → env.ts} +99 -99
- package/scripts/cli/{gateway/spawn.ts → gateway.ts} +112 -24
- package/scripts/cli/instance.ts +224 -0
- package/scripts/cli/main.ts +61 -18
- package/scripts/cli/{support/platform.ts → platform.ts} +64 -64
- package/scripts/cli/port.ts +100 -0
- package/scripts/cli/{support/services.ts → services.ts} +88 -88
- package/scripts/cli/{command/setup.ts → setup.ts} +35 -34
- package/scripts/cli/{command/start.ts → start.ts} +10 -5
- package/scripts/cli/{support/startup-signal.ts → startup-signal.ts} +23 -23
- package/scripts/cli/tray/index.ts +62 -12
- package/scripts/cli/{command/tray.ts → tray.ts} +208 -208
- package/scripts/cli/{command/update.ts → update.ts} +39 -39
- package/scripts/cli/version.ts +67 -0
- package/scripts/cli/{ui/wordmark.ts → wordmark.ts} +58 -58
- package/src/boot/app.ts +697 -693
- package/src/boot/dependencies.ts +647 -646
- package/src/boot/timeout.ts +2 -13
- package/src/config/cooldowns.ts +186 -138
- package/src/config/network.ts +8 -14
- package/src/config/providers.ts +7 -10
- package/src/config/runtime.ts +76 -76
- package/src/config/security.ts +15 -0
- package/src/config/spec.ts +20 -30
- package/src/config/telemetry.ts +0 -20
- package/src/config/timeouts.ts +0 -6
- package/src/console/admin/model-abuse/contracts.ts +28 -6
- package/src/console/admin/model-abuse/routes.ts +56 -3
- package/src/console/api-keys/contracts.ts +410 -414
- package/src/console/api-keys/routes.ts +881 -880
- package/src/console/auth/credentials.ts +3 -3
- package/src/console/auth/setup-service.ts +2 -2
- package/src/console/backup/export-endpoint.ts +6 -2
- package/src/console/backup/nine-router.ts +2 -5
- package/src/console/backup/service.ts +4 -0
- package/src/console/backup/store.ts +192 -29
- package/src/console/backup/validate.ts +3 -45
- package/src/console/cli-tools/fs-ops.ts +487 -487
- package/src/console/console-router-guards.ts +1 -1
- package/src/console/data-management/contracts.ts +13 -6
- package/src/console/data-management/operations.ts +23 -18
- package/src/console/data-management/routes.ts +0 -1
- package/src/console/domain-registration.ts +10 -5
- package/src/console/observability/live.ts +22 -0
- package/src/console/observability/store.ts +39 -16
- package/src/console/observability/usage-dimensions.ts +4 -4
- package/src/console/providers/catalog/catalog-projections.ts +6 -7
- package/src/console/providers/catalog/model-operations.ts +5 -2
- package/src/console/providers/catalog/provider-operations.ts +4 -4
- package/src/console/providers/catalog/public-model-store.ts +8 -11
- package/src/console/providers/catalog/store.ts +1553 -1553
- package/src/console/providers/oauth/routes.ts +8 -12
- package/src/console/quota/account-quota-tenant.ts +6 -6
- package/src/console/quota/quota-view.ts +1 -1
- package/src/console/remote-support/contracts.ts +61 -0
- package/src/console/remote-support/routes.ts +65 -0
- package/src/console/remote-support/service.ts +207 -0
- package/src/console/response-compression.ts +0 -3
- package/src/console/routing/pools/probe-result.ts +3 -2
- package/src/console/routing/pools/probe-verdict.ts +132 -132
- package/src/console/routing/pools/store.ts +8 -8
- package/src/console/settings/contracts.ts +58 -2
- package/src/console/settings/store.ts +30 -3
- package/src/console/shared/cursor.ts +8 -8
- package/src/console/shared/errors.ts +1 -3
- package/src/network/http2-bidi.ts +2 -4
- package/src/network/pool/agent.ts +478 -478
- package/src/network/pool/selector.ts +5 -4
- package/src/network/retry.ts +1 -2
- package/src/network/ssrf.ts +5 -4
- package/src/observability/event-compaction.ts +80 -78
- package/src/observability/event-day-index.ts +13 -15
- package/src/observability/event-log.ts +4 -4
- package/src/observability/logger.ts +6 -6
- package/src/observability/payload-capture.ts +151 -33
- package/src/observability/payload-store.ts +397 -440
- package/src/observability/redaction.ts +5 -6
- package/src/observability/request-notify.ts +43 -0
- package/src/observability/telemetry-status.ts +8 -9
- package/src/observability/token-speed.ts +5 -4
- package/src/persistence/db-mode.ts +7 -7
- package/src/persistence/readiness.ts +1 -1
- package/src/persistence/schema.ts +1406 -1402
- package/src/persistence/shared-cache.ts +1 -2
- package/src/persistence/stores/api-key-store.ts +18 -6
- package/src/persistence/stores/share-store.ts +4 -3
- package/src/persistence/stores/telemetry-store.ts +236 -237
- package/src/protocol/canonical-model.ts +11 -3
- package/src/protocol/codecs.ts +138 -4
- package/src/protocol/gateway-error.ts +6 -4
- package/src/protocol/request/chat.ts +21 -1
- package/src/protocol/request/codex.ts +10 -1
- package/src/protocol/request/messages.ts +4 -5
- package/src/protocol/request/responses.ts +9 -1
- package/src/protocol/response/chat.ts +34 -4
- package/src/protocol/response/codex.ts +7 -4
- package/src/protocol/response/dsml.ts +140 -28
- package/src/protocol/response/responses.ts +11 -5
- package/src/protocol/stream-error-frames.ts +4 -5
- package/src/providers/authentication/jwt-validator.ts +9 -10
- package/src/providers/authentication/oauth-refresh-service.ts +9 -11
- package/src/providers/configured-openai-providers.ts +134 -136
- package/src/providers/discovery/catalog/catalog-blob.ts +18 -18
- package/src/providers/discovery/catalog/catalog-format.ts +3 -6
- package/src/providers/discovery/models-dev-catalog.ts +354 -354
- package/src/providers/discovery/probe-phases.ts +4 -4
- package/src/providers/discovery/probe-wire.ts +6 -13
- package/src/providers/discovery/probing-service.ts +1117 -1045
- package/src/providers/integrations/alibabacp/alibabacp.ts +1 -1
- package/src/providers/integrations/antigravity/antigravity-quota.ts +5 -7
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +23 -2
- package/src/providers/integrations/buddy/buddy-checkin.ts +1 -4
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +23 -6
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -1
- package/src/providers/integrations/buddy/buddy-identity.ts +52 -0
- package/src/providers/integrations/buddy/buddy-media.ts +2 -2
- package/src/providers/integrations/buddy/buddy-usage-store.ts +3 -4
- package/src/providers/integrations/buddy/codebuddy/quota.ts +2 -13
- package/src/providers/integrations/buddy/codebuddy/shared.ts +118 -115
- package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -11
- package/src/providers/integrations/buddy/workbuddy/shared.ts +5 -2
- package/src/providers/integrations/claude/claude.ts +608 -608
- package/src/providers/integrations/cline/cline-quota.ts +132 -132
- package/src/providers/integrations/cline/cline.ts +537 -539
- package/src/providers/integrations/codex/codex-oauth.ts +1 -1
- package/src/providers/integrations/commandcode/commandcode.ts +674 -675
- package/src/providers/integrations/commandcode/discovery.ts +117 -116
- package/src/providers/integrations/cursor/cursor-auth.ts +418 -418
- package/src/providers/integrations/cursor/cursor-quota.ts +309 -310
- package/src/providers/integrations/cursor/cursor.ts +11 -163
- package/src/providers/integrations/factory/factory-models.ts +3 -5
- package/src/providers/integrations/grok/grok-install-id.ts +2 -3
- package/src/providers/integrations/grok/grok.ts +6 -7
- package/src/providers/integrations/hermes.ts +14 -18
- package/src/providers/integrations/kiro/kiro-discovery.ts +1 -1
- package/src/providers/integrations/kiro/kiro.ts +1 -1
- package/src/providers/integrations/mistral.ts +6 -6
- package/src/providers/integrations/opencode/fingerprint.ts +3 -3
- package/src/providers/integrations/opencode/provider.ts +8 -8
- package/src/providers/integrations/qoder/qoder-catalog.ts +450 -450
- package/src/providers/integrations/qoder/qoder-oauth.ts +388 -310
- package/src/providers/integrations/qoder/qoder.ts +884 -865
- package/src/providers/integrations/shared/connect.ts +6 -6
- package/src/providers/integrations/trae/trae-catalog.ts +1 -2
- package/src/providers/integrations/trae/trae.ts +2 -2
- package/src/providers/integrations/zcode/oauth.ts +6 -1
- package/src/providers/operations/account-health-service.ts +1528 -1523
- package/src/providers/operations/account-reset-service.ts +1 -1
- package/src/providers/operations/client-versions.ts +6 -6
- package/src/providers/operations/custom-cli-headers.ts +3 -4
- package/src/providers/operations/provider-catalog-seeder.ts +95 -95
- package/src/providers/operations/provider-catalog-service.ts +3 -4
- package/src/providers/provider-metadata.ts +4 -8
- package/src/providers/provider-registry.ts +6 -7
- package/src/providers/provider-usage.ts +1 -1
- package/src/security/abuse.ts +15 -10
- package/src/security/access-control.ts +144 -146
- package/src/security/admission/contracts.ts +11 -0
- package/src/security/admission/in-memory-store.ts +4 -3
- package/src/security/admission/lease-sweep.ts +6 -6
- package/src/security/admission/reasons.ts +5 -1
- package/src/security/admission/redis-store.ts +211 -210
- package/src/security/admission/service.ts +4 -0
- package/src/security/api-key-auth.ts +504 -504
- package/src/security/ip-boundary.ts +155 -15
- package/src/security/model-abuse.ts +366 -94
- package/src/security/outbound-headers.ts +3 -4
- package/src/shared/sleep.ts +4 -0
- package/src/transport/dispatch/attempt-finalize.ts +47 -5
- package/src/transport/dispatch/attempt-loop.ts +531 -530
- package/src/transport/dispatch/stream-bridge.ts +1 -3
- package/src/transport/dispatch/streaming/finalize.ts +1 -1
- package/src/transport/dispatch/streaming/stream.ts +5 -6
- package/src/transport/failure-policy.ts +162 -8
- package/src/transport/guards/auth-guard.ts +7 -4
- package/src/transport/guards/concurrency-guard.ts +0 -5
- package/src/transport/guards/error-lifecycle.ts +13 -6
- package/src/transport/guards/pipeline.ts +15 -3
- package/src/transport/guards/request-context.ts +8 -2
- package/src/transport/request/inflight.ts +5 -6
- package/src/transport/request/preparer.ts +2 -2
- package/src/transport/request/state.ts +12 -8
- package/src/transport/routing/admission.ts +4 -0
- package/src/transport/routing/route-catalog.ts +8 -1
- package/src/transport/routing/route-model.ts +46 -14
- package/src/transport/routing/router.ts +21 -14
- package/src/transport/surface/completion.ts +2 -3
- package/src/transport/surface/dialects.ts +5 -6
- package/src/transport/surface/responses/encode.ts +38 -0
- package/src/transport/surface/responses/parse.ts +4 -0
- package/src/transport/translation/capabilities.ts +2 -3
- package/src/transport/translation/quirks.ts +3 -3
- package/src/workers/buddy-growth-tasks.ts +5 -10
- package/src/workers/daily-checkin.ts +17 -23
- package/src/workers/quota-refresh-sweep.ts +26 -26
- package/dist/dashboard/assets/BannedPage-C2orBsI2.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-DUcZ6pMB.js +0 -1
- package/dist/dashboard/assets/CliToolDetailPage-DUcZ6pMB.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-BV6pxVQo.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-Bsan4679.js +0 -1
- package/dist/dashboard/assets/CombosPage-Bsan4679.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CW-wPmJ6.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-0p8uX7vB.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BjqSMfko.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-BvzCx8Kr.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BY1aKEkP.js +0 -1
- package/dist/dashboard/assets/ModelPicker-BY1aKEkP.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-DOQpy1y0.js +0 -1
- package/dist/dashboard/assets/OverviewPage-DOQpy1y0.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-ecxyUMzt.js +0 -3
- package/dist/dashboard/assets/ProviderDetailPage-ecxyUMzt.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-Js9jUPSb.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-J3TBi3Kx.js +0 -7
- package/dist/dashboard/assets/ProxyPage-J3TBi3Kx.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-C1gZS6xr.js +0 -1
- package/dist/dashboard/assets/QuotaPage-C1gZS6xr.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CS86ho5X.js +0 -1
- package/dist/dashboard/assets/SettingsPage-CS86ho5X.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-DDbMQsoo.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-CB3Z7VTf.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-D95UCPHI.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-Cnae9SWA.js +0 -56
- package/dist/dashboard/assets/UsagePage-Cnae9SWA.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-VY68Mhd1.js +0 -1
- package/dist/dashboard/assets/api-keys-VY68Mhd1.js.gz +0 -0
- package/dist/dashboard/assets/app-COlK95oi.css +0 -2
- package/dist/dashboard/assets/app-COlK95oi.css.gz +0 -0
- package/dist/dashboard/assets/assert-Chi7pCnt.js.gz +0 -0
- package/dist/dashboard/assets/badge-D4pQapKj.js.gz +0 -0
- package/dist/dashboard/assets/banner-DH6cg-_B.js.gz +0 -0
- package/dist/dashboard/assets/card-BKqlUOe4.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-fTgljTGA.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-D5Ys_sM0.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BYj-8WuK.js +0 -1
- package/dist/dashboard/assets/dialog-BYj-8WuK.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CmXIZ6H1.js +0 -1
- package/dist/dashboard/assets/drawer-CmXIZ6H1.js.gz +0 -0
- package/dist/dashboard/assets/entry-CBg5zeu8.js +0 -1
- package/dist/dashboard/assets/entry-CBg5zeu8.js.gz +0 -0
- package/dist/dashboard/assets/entry-CQBr6U9c.js.gz +0 -0
- package/dist/dashboard/assets/entry-CgdSAzEV.js +0 -4
- package/dist/dashboard/assets/entry-CgdSAzEV.js.gz +0 -0
- package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-BlptL8Uf.js.gz +0 -0
- package/dist/dashboard/assets/index-js6TJvdr.js.gz +0 -0
- package/dist/dashboard/assets/inline-DUWDSmDV.js.gz +0 -0
- package/dist/dashboard/assets/input-LVjgZq4f.js.gz +0 -0
- package/dist/dashboard/assets/layout-CPfxpsfy.js +0 -1
- package/dist/dashboard/assets/layout-CPfxpsfy.js.gz +0 -0
- package/dist/dashboard/assets/list-row-DupvLfDx.js.gz +0 -0
- package/dist/dashboard/assets/live-C4pEJUqI.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-BRiuufkB.js.gz +0 -0
- package/dist/dashboard/assets/mutation-B4ROwk8L.js.gz +0 -0
- package/dist/dashboard/assets/numbers-YNcHvRY7.js +0 -2
- package/dist/dashboard/assets/numbers-YNcHvRY7.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-gmjzC3RS.js.gz +0 -0
- package/dist/dashboard/assets/routing-C7tBT5o-.js.gz +0 -0
- package/dist/dashboard/assets/select-WUCXorXw.js.gz +0 -0
- package/dist/dashboard/assets/settings-C_zKl1GS.js.gz +0 -0
- package/dist/dashboard/assets/stack-_3O0F8Xn.js.gz +0 -0
- package/dist/dashboard/assets/state-BgTxHcJS.js.gz +0 -0
- package/dist/dashboard/assets/switch-DEjTtOWf.js.gz +0 -0
- package/dist/dashboard/assets/tokens-DDxMbSRL.js +0 -1
- package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js +0 -1
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BWSC0UAS.js.gz +0 -0
- package/scripts/cli/command/admin.ts +0 -65
- package/scripts/cli/command/doctor.ts +0 -257
- package/scripts/cli/gateway/drain-token.ts +0 -78
- package/scripts/cli/gateway/instance-lock.ts +0 -105
- package/scripts/cli/gateway/stop.ts +0 -51
- package/scripts/cli/support/bun.ts +0 -27
- package/scripts/cli/support/version.ts +0 -37
- /package/dist/dashboard/assets/{app-DCQZRmHY.js → app-BIt446yE.js} +0 -0
- /package/dist/dashboard/assets/{app-DCQZRmHY.js.gz → app-BIt446yE.js.gz} +0 -0
- /package/scripts/cli/{ui/prompt.ts → prompt.ts} +0 -0
|
@@ -236,14 +236,13 @@ function jsonResponse(body: unknown): Response {
|
|
|
236
236
|
*
|
|
237
237
|
* Key fetching, caching, in-flight deduplication, the minimum refresh interval
|
|
238
238
|
* on an unknown `kid`, and `kid`-rotation pickup are all delegated to
|
|
239
|
-
* `jose`'s `createRemoteJWKSet`
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
* be selected for verification.
|
|
239
|
+
* `jose`'s `createRemoteJWKSet`. `jose` additionally honours each JWK's `use`
|
|
240
|
+
* and `key_ops`, so an encryption key published alongside the signing keys
|
|
241
|
+
* cannot be selected for verification.
|
|
243
242
|
*
|
|
244
243
|
* The algorithm is checked against `SUPPORTED_ALGORITHMS` *before* any key is
|
|
245
|
-
* resolved, so the asymmetric-only allowlist (no `none`, no HMAC)
|
|
246
|
-
*
|
|
244
|
+
* resolved, so the asymmetric-only allowlist (no `none`, no HMAC) holds
|
|
245
|
+
* regardless of what the JWKS publishes.
|
|
247
246
|
*/
|
|
248
247
|
export class JwksVerifier {
|
|
249
248
|
readonly #keys: RemoteJWKSet;
|
|
@@ -317,10 +316,10 @@ export class JwksVerifier {
|
|
|
317
316
|
/**
|
|
318
317
|
* One verifier per URL, bounded and time-limited.
|
|
319
318
|
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
*
|
|
319
|
+
* An unbounded, never-evicted registry would pin every JWKS URL ever seen —
|
|
320
|
+
* and its verifier's key cache — for the process lifetime. A TTL plus a hard
|
|
321
|
+
* entry cap keeps a fleet of issuers from growing it without limit while still
|
|
322
|
+
* sharing a verifier's key cache across calls.
|
|
324
323
|
*/
|
|
325
324
|
const JWKS_VERIFIER_TTL_MS = 5 * 60 * 1_000;
|
|
326
325
|
const JWKS_VERIFIER_MAX_ENTRIES = 64;
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
import { randomUUID } from "node:crypto";
|
|
24
24
|
import { and, eq, inArray, isNull, lt, or, sql } from "drizzle-orm";
|
|
25
25
|
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
26
|
+
import { sleep } from "../../shared/sleep";
|
|
26
27
|
import { providerAccounts, providerOauthStates } from "../../persistence/schema";
|
|
27
28
|
import { decryptCredentialToString, encryptCredential } from "../../security/crypto";
|
|
28
29
|
import { invalidateCredentialCache } from "../operations/provider-credential-service";
|
|
@@ -258,6 +259,7 @@ async function disableAccount(
|
|
|
258
259
|
)
|
|
259
260
|
.returning({ id: providerOauthStates.providerAccountId });
|
|
260
261
|
if (leaseRows.length === 0) return;
|
|
262
|
+
const disabledRecoveryMs = resolveAccountDisabledRecoveryMs();
|
|
261
263
|
await tx
|
|
262
264
|
.update(providerAccounts)
|
|
263
265
|
.set({
|
|
@@ -271,13 +273,13 @@ async function disableAccount(
|
|
|
271
273
|
lastErrorCategory: "auth_invalidated",
|
|
272
274
|
lastErrorAt: new Date(),
|
|
273
275
|
// Carries a recovery deadline so `sweepExpiredCooldowns` can bring this
|
|
274
|
-
// account back once it elapses
|
|
275
|
-
//
|
|
276
|
-
//
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
...(
|
|
280
|
-
? { cooldownUntil: new Date(Date.now() +
|
|
276
|
+
// account back once it elapses; without one, one definitive rejection
|
|
277
|
+
// parks the credential for good. The deadline is also what distinguishes
|
|
278
|
+
// this (machine-disabled) from an operator's own disable, which leaves
|
|
279
|
+
// `cooldownUntil` null and is therefore never swept. See
|
|
280
|
+
// `resolveAccountDisabledRecoveryMs`.
|
|
281
|
+
...(disabledRecoveryMs > 0
|
|
282
|
+
? { cooldownUntil: new Date(Date.now() + disabledRecoveryMs) }
|
|
281
283
|
: {}),
|
|
282
284
|
})
|
|
283
285
|
.where(eq(providerAccounts.id, accountId));
|
|
@@ -311,10 +313,6 @@ async function markStaticToken(db: CartethyiaDatabase, accountId: string): Promi
|
|
|
311
313
|
.where(eq(providerAccounts.id, accountId));
|
|
312
314
|
}
|
|
313
315
|
|
|
314
|
-
function sleep(ms: number): Promise<void> {
|
|
315
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
316
|
-
}
|
|
317
|
-
|
|
318
316
|
function failureMessage(error: unknown): string {
|
|
319
317
|
if (error instanceof Error) return error.message;
|
|
320
318
|
return String(error);
|
|
@@ -1,137 +1,135 @@
|
|
|
1
|
-
import type { ApiKeyProviderSpec } from "./configured-provider";
|
|
2
|
-
import type { ProviderId } from "./provider-contracts";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Builtin providers whose entire adapter contract is "bearer auth against the
|
|
6
|
-
* provider's `BUNDLED_PROVIDER_METADATA` base URL, OpenAI-compatible chat +
|
|
7
|
-
* responses, `/v1`-prefixed paths". They carry no catalog, no OAuth, and no
|
|
8
|
-
* provider-specific payload hook, so they share one spec shape rather than
|
|
9
|
-
* one module each.
|
|
10
|
-
*
|
|
11
|
-
* `base_url` is resolved per provider by `providerBaseUrl(provider_id)`.
|
|
12
|
-
*
|
|
13
|
-
* These providers list their models through live `/v1/models` discovery rather
|
|
14
|
-
* than a static catalog: every one of them republishes an aggregator's whole
|
|
15
|
-
* roster, which changes faster than a committed array can. Each registry row
|
|
16
|
-
* pairs this spec with `openAIModelDiscovery`.
|
|
17
|
-
*/
|
|
18
|
-
export const GENERIC_API_KEY_PROVIDER_IDS = [
|
|
19
|
-
"larprouter",
|
|
20
|
-
"mistral",
|
|
21
|
-
"fireworks",
|
|
22
|
-
"nvidia",
|
|
23
|
-
"gmi",
|
|
24
|
-
"ollamacloud",
|
|
25
|
-
"together",
|
|
26
|
-
"siliconflow",
|
|
27
|
-
"siliconflowcn",
|
|
28
|
-
"nanogpt",
|
|
29
|
-
"baseten",
|
|
30
|
-
"synthetic",
|
|
31
|
-
"stepfun",
|
|
32
|
-
"sakana",
|
|
33
|
-
"helmcode",
|
|
34
|
-
"coralbricks",
|
|
35
|
-
"aiand",
|
|
36
|
-
"wafer",
|
|
37
|
-
"coreweave",
|
|
38
|
-
"qwen-portal",
|
|
39
|
-
"dashscope",
|
|
40
|
-
// `deepseek` is intentionally absent: it dispatches on the Anthropic Messages
|
|
41
|
-
// wire at its `/anthropic` root, not the OpenAI chat/responses wires, so it
|
|
42
|
-
// carries a dedicated entry in `default-registry.ts` instead.
|
|
43
|
-
//
|
|
44
|
-
// The aggregators below are absent for a different reason: their base URL is
|
|
45
|
-
// already rooted at a version segment that the `/v1`-prefixed path this shape
|
|
46
|
-
// pins would duplicate (`/openai/v1`, `/v1/openai`, `/v3/openai`, `/api/v1`,
|
|
47
|
-
// `/v2`, and `/inference/v1`), so `joinUrl` would produce
|
|
48
|
-
// `…/v1/v1/chat/completions`. They use `versionedRootApiKeySpec` instead,
|
|
49
|
-
// which pins the path below the version root — the same reason `cerebras`
|
|
50
|
-
// declares `/chat/completions` explicitly.
|
|
51
|
-
] as const;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Ids whose base URL already ends at a version segment.
|
|
55
|
-
*
|
|
56
|
-
* `joinUrl` is plain concatenation and nothing rewrites a declared path, so a
|
|
57
|
-
* base already rooted at a version plus a `/v1/…` path doubles the segment and
|
|
58
|
-
* every request 404s. These specs therefore declare the path *below* the
|
|
59
|
-
* version root. That is the provider stating the truth about its own wire, not
|
|
60
|
-
* a correction applied to it: a wrong path now reaches the operator as the
|
|
61
|
-
* wrong URL instead of being quietly rewritten into a different address.
|
|
62
|
-
*/
|
|
63
|
-
export const VERSIONED_ROOT_API_KEY_PROVIDER_IDS = [
|
|
64
|
-
"groq",
|
|
65
|
-
"deepinfra",
|
|
66
|
-
"novita",
|
|
67
|
-
"venice",
|
|
68
|
-
"qianfan",
|
|
69
|
-
"zhipucoding",
|
|
70
|
-
"firepass",
|
|
71
|
-
] as const;
|
|
72
|
-
|
|
73
|
-
export type VersionedRootApiKeyProviderId =
|
|
74
|
-
(typeof VERSIONED_ROOT_API_KEY_PROVIDER_IDS)[number];
|
|
75
|
-
|
|
76
|
-
function versionedRootApiKeySpec(providerId: ProviderId): ApiKeyProviderSpec {
|
|
77
|
-
return {
|
|
78
|
-
provider_id: providerId,
|
|
79
|
-
endpoint_paths_by_wire_family: {
|
|
80
|
-
chat: "/chat/completions",
|
|
81
|
-
responses: "/responses",
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export const VERSIONED_ROOT_API_KEY_SPECS = {
|
|
87
|
-
groq: versionedRootApiKeySpec("groq"),
|
|
88
|
-
deepinfra: versionedRootApiKeySpec("deepinfra"),
|
|
89
|
-
novita: versionedRootApiKeySpec("novita"),
|
|
90
|
-
venice: versionedRootApiKeySpec("venice"),
|
|
91
|
-
qianfan: versionedRootApiKeySpec("qianfan"),
|
|
92
|
-
zhipucoding: versionedRootApiKeySpec("zhipucoding"),
|
|
93
|
-
firepass: versionedRootApiKeySpec("firepass"),
|
|
94
|
-
} satisfies Readonly<Record<VersionedRootApiKeyProviderId, ApiKeyProviderSpec>>;
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* One id that has both a generic spec and a registry row.
|
|
98
|
-
*
|
|
99
|
-
* Exported so the registry can be checked against the spec list rather than
|
|
100
|
-
* repeating the id as a string: `discoveryBackedProvider` takes this type, so a
|
|
101
|
-
* row naming a provider with no spec is a compile error instead of an
|
|
102
|
-
* `undefined` adapter at first dispatch.
|
|
103
|
-
*/
|
|
104
|
-
export type GenericApiKeyProviderId = (typeof GENERIC_API_KEY_PROVIDER_IDS)[number];
|
|
105
|
-
|
|
106
|
-
function genericApiKeySpec(providerId: GenericApiKeyProviderId): ApiKeyProviderSpec {
|
|
107
|
-
// These roots are *not* bare hosts — every one of them already ends at `/v1`
|
|
108
|
-
// — so the path is declared below that root.
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
dashscope: genericApiKeySpec("dashscope"),
|
|
136
|
-
"qwen-portal": genericApiKeySpec("qwen-portal"),
|
|
1
|
+
import type { ApiKeyProviderSpec } from "./configured-provider";
|
|
2
|
+
import type { ProviderId } from "./provider-contracts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Builtin providers whose entire adapter contract is "bearer auth against the
|
|
6
|
+
* provider's `BUNDLED_PROVIDER_METADATA` base URL, OpenAI-compatible chat +
|
|
7
|
+
* responses, `/v1`-prefixed paths". They carry no catalog, no OAuth, and no
|
|
8
|
+
* provider-specific payload hook, so they share one spec shape rather than
|
|
9
|
+
* one module each.
|
|
10
|
+
*
|
|
11
|
+
* `base_url` is resolved per provider by `providerBaseUrl(provider_id)`.
|
|
12
|
+
*
|
|
13
|
+
* These providers list their models through live `/v1/models` discovery rather
|
|
14
|
+
* than a static catalog: every one of them republishes an aggregator's whole
|
|
15
|
+
* roster, which changes faster than a committed array can. Each registry row
|
|
16
|
+
* pairs this spec with `openAIModelDiscovery`.
|
|
17
|
+
*/
|
|
18
|
+
export const GENERIC_API_KEY_PROVIDER_IDS = [
|
|
19
|
+
"larprouter",
|
|
20
|
+
"mistral",
|
|
21
|
+
"fireworks",
|
|
22
|
+
"nvidia",
|
|
23
|
+
"gmi",
|
|
24
|
+
"ollamacloud",
|
|
25
|
+
"together",
|
|
26
|
+
"siliconflow",
|
|
27
|
+
"siliconflowcn",
|
|
28
|
+
"nanogpt",
|
|
29
|
+
"baseten",
|
|
30
|
+
"synthetic",
|
|
31
|
+
"stepfun",
|
|
32
|
+
"sakana",
|
|
33
|
+
"helmcode",
|
|
34
|
+
"coralbricks",
|
|
35
|
+
"aiand",
|
|
36
|
+
"wafer",
|
|
37
|
+
"coreweave",
|
|
38
|
+
"qwen-portal",
|
|
39
|
+
"dashscope",
|
|
40
|
+
// `deepseek` is intentionally absent: it dispatches on the Anthropic Messages
|
|
41
|
+
// wire at its `/anthropic` root, not the OpenAI chat/responses wires, so it
|
|
42
|
+
// carries a dedicated entry in `default-registry.ts` instead.
|
|
43
|
+
//
|
|
44
|
+
// The aggregators below are absent for a different reason: their base URL is
|
|
45
|
+
// already rooted at a version segment that the `/v1`-prefixed path this shape
|
|
46
|
+
// pins would duplicate (`/openai/v1`, `/v1/openai`, `/v3/openai`, `/api/v1`,
|
|
47
|
+
// `/v2`, and `/inference/v1`), so `joinUrl` would produce
|
|
48
|
+
// `…/v1/v1/chat/completions`. They use `versionedRootApiKeySpec` instead,
|
|
49
|
+
// which pins the path below the version root — the same reason `cerebras`
|
|
50
|
+
// declares `/chat/completions` explicitly.
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Ids whose base URL already ends at a version segment.
|
|
55
|
+
*
|
|
56
|
+
* `joinUrl` is plain concatenation and nothing rewrites a declared path, so a
|
|
57
|
+
* base already rooted at a version plus a `/v1/…` path doubles the segment and
|
|
58
|
+
* every request 404s. These specs therefore declare the path *below* the
|
|
59
|
+
* version root. That is the provider stating the truth about its own wire, not
|
|
60
|
+
* a correction applied to it: a wrong path now reaches the operator as the
|
|
61
|
+
* wrong URL instead of being quietly rewritten into a different address.
|
|
62
|
+
*/
|
|
63
|
+
export const VERSIONED_ROOT_API_KEY_PROVIDER_IDS = [
|
|
64
|
+
"groq",
|
|
65
|
+
"deepinfra",
|
|
66
|
+
"novita",
|
|
67
|
+
"venice",
|
|
68
|
+
"qianfan",
|
|
69
|
+
"zhipucoding",
|
|
70
|
+
"firepass",
|
|
71
|
+
] as const;
|
|
72
|
+
|
|
73
|
+
export type VersionedRootApiKeyProviderId =
|
|
74
|
+
(typeof VERSIONED_ROOT_API_KEY_PROVIDER_IDS)[number];
|
|
75
|
+
|
|
76
|
+
function versionedRootApiKeySpec(providerId: ProviderId): ApiKeyProviderSpec {
|
|
77
|
+
return {
|
|
78
|
+
provider_id: providerId,
|
|
79
|
+
endpoint_paths_by_wire_family: {
|
|
80
|
+
chat: "/chat/completions",
|
|
81
|
+
responses: "/responses",
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export const VERSIONED_ROOT_API_KEY_SPECS = {
|
|
87
|
+
groq: versionedRootApiKeySpec("groq"),
|
|
88
|
+
deepinfra: versionedRootApiKeySpec("deepinfra"),
|
|
89
|
+
novita: versionedRootApiKeySpec("novita"),
|
|
90
|
+
venice: versionedRootApiKeySpec("venice"),
|
|
91
|
+
qianfan: versionedRootApiKeySpec("qianfan"),
|
|
92
|
+
zhipucoding: versionedRootApiKeySpec("zhipucoding"),
|
|
93
|
+
firepass: versionedRootApiKeySpec("firepass"),
|
|
94
|
+
} satisfies Readonly<Record<VersionedRootApiKeyProviderId, ApiKeyProviderSpec>>;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* One id that has both a generic spec and a registry row.
|
|
98
|
+
*
|
|
99
|
+
* Exported so the registry can be checked against the spec list rather than
|
|
100
|
+
* repeating the id as a string: `discoveryBackedProvider` takes this type, so a
|
|
101
|
+
* row naming a provider with no spec is a compile error instead of an
|
|
102
|
+
* `undefined` adapter at first dispatch.
|
|
103
|
+
*/
|
|
104
|
+
export type GenericApiKeyProviderId = (typeof GENERIC_API_KEY_PROVIDER_IDS)[number];
|
|
105
|
+
|
|
106
|
+
function genericApiKeySpec(providerId: GenericApiKeyProviderId): ApiKeyProviderSpec {
|
|
107
|
+
// These roots are *not* bare hosts — every one of them already ends at `/v1`
|
|
108
|
+
// — so the path is declared below that root. Both spec shapes declare the same
|
|
109
|
+
// thing, so this is the one implementation.
|
|
110
|
+
return versionedRootApiKeySpec(providerId);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export const GENERIC_API_KEY_SPECS = {
|
|
114
|
+
larprouter: genericApiKeySpec("larprouter"),
|
|
115
|
+
mistral: genericApiKeySpec("mistral"),
|
|
116
|
+
fireworks: genericApiKeySpec("fireworks"),
|
|
117
|
+
nvidia: genericApiKeySpec("nvidia"),
|
|
118
|
+
gmi: genericApiKeySpec("gmi"),
|
|
119
|
+
ollamacloud: genericApiKeySpec("ollamacloud"),
|
|
120
|
+
together: genericApiKeySpec("together"),
|
|
121
|
+
siliconflow: genericApiKeySpec("siliconflow"),
|
|
122
|
+
siliconflowcn: genericApiKeySpec("siliconflowcn"),
|
|
123
|
+
nanogpt: genericApiKeySpec("nanogpt"),
|
|
124
|
+
baseten: genericApiKeySpec("baseten"),
|
|
125
|
+
synthetic: genericApiKeySpec("synthetic"),
|
|
126
|
+
stepfun: genericApiKeySpec("stepfun"),
|
|
127
|
+
sakana: genericApiKeySpec("sakana"),
|
|
128
|
+
helmcode: genericApiKeySpec("helmcode"),
|
|
129
|
+
coralbricks: genericApiKeySpec("coralbricks"),
|
|
130
|
+
aiand: genericApiKeySpec("aiand"),
|
|
131
|
+
wafer: genericApiKeySpec("wafer"),
|
|
132
|
+
coreweave: genericApiKeySpec("coreweave"),
|
|
133
|
+
dashscope: genericApiKeySpec("dashscope"),
|
|
134
|
+
"qwen-portal": genericApiKeySpec("qwen-portal"),
|
|
137
135
|
} satisfies Readonly<Record<GenericApiKeyProviderId, ApiKeyProviderSpec>>;
|