@srouterhq/server 0.0.0-stage → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/client/dist/assets/am-TQ7Jmdqe.js +1 -0
- package/client/dist/assets/ar-Bf5a7yfC.js +1 -0
- package/client/dist/assets/az-CrosE1xH.js +1 -0
- package/client/dist/assets/bg-BvWnmcUz.js +1 -0
- package/client/dist/assets/bn-ams5TsJp.js +1 -0
- package/client/dist/assets/cs-Dh67CaJ_.js +1 -0
- package/client/dist/assets/da-9WlT8Iq7.js +1 -0
- package/client/dist/assets/de-lWhJJzz7.js +1 -0
- package/client/dist/assets/el-Cu7_GhNq.js +1 -0
- package/client/dist/assets/es-BZuzsBcP.js +1 -0
- package/client/dist/assets/fa-Dwdn-jKS.js +1 -0
- package/client/dist/assets/fi-BFrFyOTy.js +1 -0
- package/client/dist/assets/fr-XhbtmPpj.js +1 -0
- package/client/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/client/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/client/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/client/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/client/dist/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/client/dist/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/client/dist/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/client/dist/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/client/dist/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/client/dist/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/client/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/client/dist/assets/gu-D0uhLUB8.js +1 -0
- package/client/dist/assets/ha-CVlm9pqp.js +1 -0
- package/client/dist/assets/he-CMIFeoWr.js +1 -0
- package/client/dist/assets/hi-ENTwhBpn.js +1 -0
- package/client/dist/assets/hr-fc03vMy_.js +1 -0
- package/client/dist/assets/hu-YBo2BIYt.js +1 -0
- package/client/dist/assets/id-BEWXYX69.js +1 -0
- package/client/dist/assets/ig-BKLZFKka.js +1 -0
- package/client/dist/assets/index-D9I4KtvR.js +145 -0
- package/client/dist/assets/index-txhEmCdb.css +2 -0
- package/client/dist/assets/it-Bzmei1Y2.js +1 -0
- package/client/dist/assets/ja-BfcpuqEl.js +1 -0
- package/client/dist/assets/ka-CnWjRgLo.js +1 -0
- package/client/dist/assets/km-BAjPR3Qj.js +1 -0
- package/client/dist/assets/kn-B15WKU5m.js +1 -0
- package/client/dist/assets/ko-C61fAB-w.js +1 -0
- package/client/dist/assets/lt-CYTr4_YW.js +1 -0
- package/client/dist/assets/ml-CtqxgyH3.js +1 -0
- package/client/dist/assets/mr-X5TMY7aR.js +1 -0
- package/client/dist/assets/ms-DSg8RqPS.js +1 -0
- package/client/dist/assets/my-D7RqR8uE.js +1 -0
- package/client/dist/assets/ne-DaflxkDj.js +1 -0
- package/client/dist/assets/nl-BOqqtsC8.js +1 -0
- package/client/dist/assets/no-BSHp_StB.js +1 -0
- package/client/dist/assets/or-BkLR9Vub.js +1 -0
- package/client/dist/assets/pa-CarJ2XgI.js +1 -0
- package/client/dist/assets/pl-C2n0V-0k.js +1 -0
- package/client/dist/assets/pt-BR-CqJdNhg2.js +1 -0
- package/client/dist/assets/pt-PT-C_HpMyKz.js +1 -0
- package/client/dist/assets/ro-DVRZqSAS.js +1 -0
- package/client/dist/assets/ru-DwAJG7VC.js +1 -0
- package/client/dist/assets/si-BxUezXm0.js +1 -0
- package/client/dist/assets/sk-eI1VcIfY.js +1 -0
- package/client/dist/assets/sr-CJF3auCr.js +1 -0
- package/client/dist/assets/srouter-logo-C6ZfjGIi.svg +14 -0
- package/client/dist/assets/sv-nqvwHAq_.js +1 -0
- package/client/dist/assets/sw-DWynE2pW.js +1 -0
- package/client/dist/assets/ta-BVM12knC.js +1 -0
- package/client/dist/assets/te-oyzEkF7_.js +1 -0
- package/client/dist/assets/th-COVeE0ZQ.js +1 -0
- package/client/dist/assets/tl-DsJANnQz.js +1 -0
- package/client/dist/assets/tr-B-Fl-urO.js +1 -0
- package/client/dist/assets/uk-C5qketAO.js +1 -0
- package/client/dist/assets/ur-QU9KugfV.js +1 -0
- package/client/dist/assets/uz-DL9cG_mY.js +1 -0
- package/client/dist/assets/vi-CQiVy3Pu.js +1 -0
- package/client/dist/assets/yo-DqazMdrZ.js +1 -0
- package/client/dist/assets/zh-CN-DnYL_Kio.js +1 -0
- package/client/dist/assets/zh-TW-5bdbosKj.js +1 -0
- package/client/dist/favicon.svg +14 -0
- package/client/dist/icons.svg +24 -0
- package/client/dist/index.html +37 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +372 -0
- package/dist/app.js.map +1 -0
- package/dist/db/index.d.ts +49 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +203 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate/TEMPLATE.d.ts +4 -0
- package/dist/db/migrate/TEMPLATE.d.ts.map +1 -0
- package/dist/db/migrate/TEMPLATE.js +18 -0
- package/dist/db/migrate/TEMPLATE.js.map +1 -0
- package/dist/db/migrate/cli.d.ts +2 -0
- package/dist/db/migrate/cli.d.ts.map +1 -0
- package/dist/db/migrate/cli.js +177 -0
- package/dist/db/migrate/cli.js.map +1 -0
- package/dist/db/migrate/defaults.d.ts +52 -0
- package/dist/db/migrate/defaults.d.ts.map +1 -0
- package/dist/db/migrate/defaults.js +126 -0
- package/dist/db/migrate/defaults.js.map +1 -0
- package/dist/db/migrate/runner.d.ts +16 -0
- package/dist/db/migrate/runner.d.ts.map +1 -0
- package/dist/db/migrate/runner.js +178 -0
- package/dist/db/migrate/runner.js.map +1 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.d.ts +4 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.d.ts.map +1 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.js +2240 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.js.map +1 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.d.ts +4 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.d.ts.map +1 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.js +27 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.js.map +1 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.d.ts +4 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.d.ts.map +1 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.js +30 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.js.map +1 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.d.ts +6 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.d.ts.map +1 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.js +104 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.js.map +1 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.d.ts +9 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.d.ts.map +1 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.js +22 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.js.map +1 -0
- package/dist/db/migrations/20260706_000001_request_client_info.d.ts +4 -0
- package/dist/db/migrations/20260706_000001_request_client_info.d.ts.map +1 -0
- package/dist/db/migrations/20260706_000001_request_client_info.js +30 -0
- package/dist/db/migrations/20260706_000001_request_client_info.js.map +1 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.d.ts +17 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.d.ts.map +1 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.js +20 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.js.map +1 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.d.ts +12 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.d.ts.map +1 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.js +45 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.js.map +1 -0
- package/dist/db/migrations/20260720_000001_key_health_error.d.ts +5 -0
- package/dist/db/migrations/20260720_000001_key_health_error.d.ts.map +1 -0
- package/dist/db/migrations/20260720_000001_key_health_error.js +16 -0
- package/dist/db/migrations/20260720_000001_key_health_error.js.map +1 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.d.ts +4 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.js +38 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.js.map +1 -0
- package/dist/db/migrations/20260726_000002_request_attempts.d.ts +4 -0
- package/dist/db/migrations/20260726_000002_request_attempts.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000002_request_attempts.js +43 -0
- package/dist/db/migrations/20260726_000002_request_attempts.js.map +1 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.d.ts +4 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.js +80 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.js.map +1 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.d.ts +4 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.js +34 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.js.map +1 -0
- package/dist/db/migrations/20260726_000005_request_served_model.d.ts +4 -0
- package/dist/db/migrations/20260726_000005_request_served_model.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000005_request_served_model.js +31 -0
- package/dist/db/migrations/20260726_000005_request_served_model.js.map +1 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.d.ts +4 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.js +29 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.js.map +1 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.d.ts +4 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.d.ts.map +1 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.js +41 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.js.map +1 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.d.ts +12 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.d.ts.map +1 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.js +37 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.js.map +1 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.d.ts +4 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.d.ts.map +1 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.js +145 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.js.map +1 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.d.ts +6 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.d.ts.map +1 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.js +52 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.js.map +1 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.d.ts +6 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.d.ts.map +1 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.js +17 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.js.map +1 -0
- package/dist/db/migrations/20260805_000002_client_profiles.d.ts +4 -0
- package/dist/db/migrations/20260805_000002_client_profiles.d.ts.map +1 -0
- package/dist/db/migrations/20260805_000002_client_profiles.js +33 -0
- package/dist/db/migrations/20260805_000002_client_profiles.js.map +1 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.d.ts +4 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.d.ts.map +1 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.js +33 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.js.map +1 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.d.ts +4 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.d.ts.map +1 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.js +19 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.js.map +1 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.d.ts +4 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.d.ts.map +1 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.js +47 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.js.map +1 -0
- package/dist/db/migrations/20260823_000001_server_logs.d.ts +4 -0
- package/dist/db/migrations/20260823_000001_server_logs.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000001_server_logs.js +53 -0
- package/dist/db/migrations/20260823_000001_server_logs.js.map +1 -0
- package/dist/db/migrations/20260823_000002_backups_table.d.ts +8 -0
- package/dist/db/migrations/20260823_000002_backups_table.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000002_backups_table.js +22 -0
- package/dist/db/migrations/20260823_000002_backups_table.js.map +1 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.d.ts +19 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.js +28 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.js.map +1 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.d.ts +14 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.js +25 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.js.map +1 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.d.ts +4 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.d.ts.map +1 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.js +46 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.js.map +1 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.d.ts +4 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.d.ts.map +1 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.js +37 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.js.map +1 -0
- package/dist/db/migrations/20260901_000003_request_caller.d.ts +4 -0
- package/dist/db/migrations/20260901_000003_request_caller.d.ts.map +1 -0
- package/dist/db/migrations/20260901_000003_request_caller.js +27 -0
- package/dist/db/migrations/20260901_000003_request_caller.js.map +1 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.d.ts +4 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.d.ts.map +1 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.js +35 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.js.map +1 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.d.ts +4 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.d.ts.map +1 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.js +37 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.js.map +1 -0
- package/dist/db/migrations/20260903_000002_response_cache.d.ts +4 -0
- package/dist/db/migrations/20260903_000002_response_cache.d.ts.map +1 -0
- package/dist/db/migrations/20260903_000002_response_cache.js +53 -0
- package/dist/db/migrations/20260903_000002_response_cache.js.map +1 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.d.ts +13 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.d.ts.map +1 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.js +35 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.js.map +1 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.d.ts +4 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.d.ts.map +1 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.js +68 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.js.map +1 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.d.ts +5 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.d.ts.map +1 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.js +37 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.js.map +1 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.d.ts +4 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.d.ts.map +1 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.js +28 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.js.map +1 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.d.ts +4 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.d.ts.map +1 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.js +25 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.js.map +1 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.d.ts +10 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.d.ts.map +1 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.js +78 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.js.map +1 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.d.ts +21 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.d.ts.map +1 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.js +41 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.js.map +1 -0
- package/dist/db/model-pricing.d.ts +39 -0
- package/dist/db/model-pricing.d.ts.map +1 -0
- package/dist/db/model-pricing.js +274 -0
- package/dist/db/model-pricing.js.map +1 -0
- package/dist/db/node-sqlite.d.ts +9 -0
- package/dist/db/node-sqlite.d.ts.map +1 -0
- package/dist/db/node-sqlite.js +87 -0
- package/dist/db/node-sqlite.js.map +1 -0
- package/dist/db/types.d.ts +22 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/docs/docs-page.d.ts +2 -0
- package/dist/docs/docs-page.d.ts.map +1 -0
- package/dist/docs/docs-page.js +319 -0
- package/dist/docs/docs-page.js.map +1 -0
- package/dist/docs/openapi.d.ts +1896 -0
- package/dist/docs/openapi.d.ts.map +1 -0
- package/dist/docs/openapi.js +1096 -0
- package/dist/docs/openapi.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +9 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/anthropic-documents.d.ts +41 -0
- package/dist/lib/anthropic-documents.d.ts.map +1 -0
- package/dist/lib/anthropic-documents.js +132 -0
- package/dist/lib/anthropic-documents.js.map +1 -0
- package/dist/lib/app-version.d.ts +5 -0
- package/dist/lib/app-version.d.ts.map +1 -0
- package/dist/lib/app-version.js +61 -0
- package/dist/lib/app-version.js.map +1 -0
- package/dist/lib/attempt-trace.d.ts +23 -0
- package/dist/lib/attempt-trace.d.ts.map +1 -0
- package/dist/lib/attempt-trace.js +32 -0
- package/dist/lib/attempt-trace.js.map +1 -0
- package/dist/lib/budget.d.ts +6 -0
- package/dist/lib/budget.d.ts.map +1 -0
- package/dist/lib/budget.js +40 -0
- package/dist/lib/budget.js.map +1 -0
- package/dist/lib/client-classifier.d.ts +10 -0
- package/dist/lib/client-classifier.d.ts.map +1 -0
- package/dist/lib/client-classifier.js +126 -0
- package/dist/lib/client-classifier.js.map +1 -0
- package/dist/lib/client-context.d.ts +10 -0
- package/dist/lib/client-context.d.ts.map +1 -0
- package/dist/lib/client-context.js +39 -0
- package/dist/lib/client-context.js.map +1 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +94 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/content.d.ts +33 -0
- package/dist/lib/content.d.ts.map +1 -0
- package/dist/lib/content.js +201 -0
- package/dist/lib/content.js.map +1 -0
- package/dist/lib/credential.d.ts +11 -0
- package/dist/lib/credential.d.ts.map +1 -0
- package/dist/lib/credential.js +18 -0
- package/dist/lib/credential.js.map +1 -0
- package/dist/lib/crypto.d.ts +31 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +206 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/custom-provider-cleanup.d.ts +13 -0
- package/dist/lib/custom-provider-cleanup.d.ts.map +1 -0
- package/dist/lib/custom-provider-cleanup.js +43 -0
- package/dist/lib/custom-provider-cleanup.js.map +1 -0
- package/dist/lib/db-backup.d.ts +31 -0
- package/dist/lib/db-backup.d.ts.map +1 -0
- package/dist/lib/db-backup.js +255 -0
- package/dist/lib/db-backup.js.map +1 -0
- package/dist/lib/endpoint-scope.d.ts +42 -0
- package/dist/lib/endpoint-scope.d.ts.map +1 -0
- package/dist/lib/endpoint-scope.js +95 -0
- package/dist/lib/endpoint-scope.js.map +1 -0
- package/dist/lib/env-drift.d.ts +17 -0
- package/dist/lib/env-drift.d.ts.map +1 -0
- package/dist/lib/env-drift.js +108 -0
- package/dist/lib/env-drift.js.map +1 -0
- package/dist/lib/error-classify.d.ts +40 -0
- package/dist/lib/error-classify.d.ts.map +1 -0
- package/dist/lib/error-classify.js +687 -0
- package/dist/lib/error-classify.js.map +1 -0
- package/dist/lib/error-redaction.d.ts +8 -0
- package/dist/lib/error-redaction.d.ts.map +1 -0
- package/dist/lib/error-redaction.js +45 -0
- package/dist/lib/error-redaction.js.map +1 -0
- package/dist/lib/fallback-loop.d.ts +306 -0
- package/dist/lib/fallback-loop.d.ts.map +1 -0
- package/dist/lib/fallback-loop.js +1336 -0
- package/dist/lib/fallback-loop.js.map +1 -0
- package/dist/lib/file-permissions.d.ts +98 -0
- package/dist/lib/file-permissions.d.ts.map +1 -0
- package/dist/lib/file-permissions.js +159 -0
- package/dist/lib/file-permissions.js.map +1 -0
- package/dist/lib/gemini-wire.d.ts +76 -0
- package/dist/lib/gemini-wire.d.ts.map +1 -0
- package/dist/lib/gemini-wire.js +392 -0
- package/dist/lib/gemini-wire.js.map +1 -0
- package/dist/lib/guardrails.d.ts +37 -0
- package/dist/lib/guardrails.d.ts.map +1 -0
- package/dist/lib/guardrails.js +106 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/header-value.d.ts +8 -0
- package/dist/lib/header-value.d.ts.map +1 -0
- package/dist/lib/header-value.js +55 -0
- package/dist/lib/header-value.js.map +1 -0
- package/dist/lib/image-normalize.d.ts +21 -0
- package/dist/lib/image-normalize.d.ts.map +1 -0
- package/dist/lib/image-normalize.js +218 -0
- package/dist/lib/image-normalize.js.map +1 -0
- package/dist/lib/inbound-chat.d.ts +48 -0
- package/dist/lib/inbound-chat.d.ts.map +1 -0
- package/dist/lib/inbound-chat.js +406 -0
- package/dist/lib/inbound-chat.js.map +1 -0
- package/dist/lib/key-parser.d.ts +79 -0
- package/dist/lib/key-parser.d.ts.map +1 -0
- package/dist/lib/key-parser.js +701 -0
- package/dist/lib/key-parser.js.map +1 -0
- package/dist/lib/key-proxy.d.ts +49 -0
- package/dist/lib/key-proxy.d.ts.map +1 -0
- package/dist/lib/key-proxy.js +92 -0
- package/dist/lib/key-proxy.js.map +1 -0
- package/dist/lib/log-redaction.d.ts +28 -0
- package/dist/lib/log-redaction.d.ts.map +1 -0
- package/dist/lib/log-redaction.js +166 -0
- package/dist/lib/log-redaction.js.map +1 -0
- package/dist/lib/model-scope.d.ts +9 -0
- package/dist/lib/model-scope.d.ts.map +1 -0
- package/dist/lib/model-scope.js +29 -0
- package/dist/lib/model-scope.js.map +1 -0
- package/dist/lib/one-time-code.d.ts +15 -0
- package/dist/lib/one-time-code.d.ts.map +1 -0
- package/dist/lib/one-time-code.js +41 -0
- package/dist/lib/one-time-code.js.map +1 -0
- package/dist/lib/output-cap.d.ts +24 -0
- package/dist/lib/output-cap.d.ts.map +1 -0
- package/dist/lib/output-cap.js +80 -0
- package/dist/lib/output-cap.js.map +1 -0
- package/dist/lib/password.d.ts +3 -0
- package/dist/lib/password.d.ts.map +1 -0
- package/dist/lib/password.js +27 -0
- package/dist/lib/password.js.map +1 -0
- package/dist/lib/process-safety-net.d.ts +32 -0
- package/dist/lib/process-safety-net.d.ts.map +1 -0
- package/dist/lib/process-safety-net.js +123 -0
- package/dist/lib/process-safety-net.js.map +1 -0
- package/dist/lib/provider-identity.d.ts +37 -0
- package/dist/lib/provider-identity.d.ts.map +1 -0
- package/dist/lib/provider-identity.js +110 -0
- package/dist/lib/provider-identity.js.map +1 -0
- package/dist/lib/provider-size-parser.d.ts +6 -0
- package/dist/lib/provider-size-parser.d.ts.map +1 -0
- package/dist/lib/provider-size-parser.js +72 -0
- package/dist/lib/provider-size-parser.js.map +1 -0
- package/dist/lib/provider-timeout.d.ts +17 -0
- package/dist/lib/provider-timeout.d.ts.map +1 -0
- package/dist/lib/provider-timeout.js +70 -0
- package/dist/lib/provider-timeout.js.map +1 -0
- package/dist/lib/proxy.d.ts +180 -0
- package/dist/lib/proxy.d.ts.map +1 -0
- package/dist/lib/proxy.js +1002 -0
- package/dist/lib/proxy.js.map +1 -0
- package/dist/lib/request-log.d.ts +4 -0
- package/dist/lib/request-log.d.ts.map +1 -0
- package/dist/lib/request-log.js +161 -0
- package/dist/lib/request-log.js.map +1 -0
- package/dist/lib/reset-code.d.ts +5 -0
- package/dist/lib/reset-code.d.ts.map +1 -0
- package/dist/lib/reset-code.js +39 -0
- package/dist/lib/reset-code.js.map +1 -0
- package/dist/lib/retry-hint.d.ts +14 -0
- package/dist/lib/retry-hint.d.ts.map +1 -0
- package/dist/lib/retry-hint.js +36 -0
- package/dist/lib/retry-hint.js.map +1 -0
- package/dist/lib/route-live.d.ts +29 -0
- package/dist/lib/route-live.d.ts.map +1 -0
- package/dist/lib/route-live.js +97 -0
- package/dist/lib/route-live.js.map +1 -0
- package/dist/lib/sampling-params.d.ts +183 -0
- package/dist/lib/sampling-params.d.ts.map +1 -0
- package/dist/lib/sampling-params.js +386 -0
- package/dist/lib/sampling-params.js.map +1 -0
- package/dist/lib/scheduler.d.ts +13 -0
- package/dist/lib/scheduler.d.ts.map +1 -0
- package/dist/lib/scheduler.js +11 -0
- package/dist/lib/scheduler.js.map +1 -0
- package/dist/lib/served-model.d.ts +16 -0
- package/dist/lib/served-model.d.ts.map +1 -0
- package/dist/lib/served-model.js +0 -0
- package/dist/lib/served-model.js.map +1 -0
- package/dist/lib/server-logs.d.ts +132 -0
- package/dist/lib/server-logs.d.ts.map +1 -0
- package/dist/lib/server-logs.js +473 -0
- package/dist/lib/server-logs.js.map +1 -0
- package/dist/lib/setup-code.d.ts +5 -0
- package/dist/lib/setup-code.d.ts.map +1 -0
- package/dist/lib/setup-code.js +35 -0
- package/dist/lib/setup-code.js.map +1 -0
- package/dist/lib/structured-output.d.ts +9 -0
- package/dist/lib/structured-output.d.ts.map +1 -0
- package/dist/lib/structured-output.js +72 -0
- package/dist/lib/structured-output.js.map +1 -0
- package/dist/lib/system-prompt.d.ts +30 -0
- package/dist/lib/system-prompt.d.ts.map +1 -0
- package/dist/lib/system-prompt.js +66 -0
- package/dist/lib/system-prompt.js.map +1 -0
- package/dist/lib/task-type.d.ts +18 -0
- package/dist/lib/task-type.d.ts.map +1 -0
- package/dist/lib/task-type.js +92 -0
- package/dist/lib/task-type.js.map +1 -0
- package/dist/lib/think-tags.d.ts +37 -0
- package/dist/lib/think-tags.d.ts.map +1 -0
- package/dist/lib/think-tags.js +203 -0
- package/dist/lib/think-tags.js.map +1 -0
- package/dist/lib/tool-args.d.ts +36 -0
- package/dist/lib/tool-args.d.ts.map +1 -0
- package/dist/lib/tool-args.js +190 -0
- package/dist/lib/tool-args.js.map +1 -0
- package/dist/lib/tool-call-rescue.d.ts +62 -0
- package/dist/lib/tool-call-rescue.d.ts.map +1 -0
- package/dist/lib/tool-call-rescue.js +258 -0
- package/dist/lib/tool-call-rescue.js.map +1 -0
- package/dist/lib/tool-capability.d.ts +13 -0
- package/dist/lib/tool-capability.d.ts.map +1 -0
- package/dist/lib/tool-capability.js +70 -0
- package/dist/lib/tool-capability.js.map +1 -0
- package/dist/lib/tool-validate.d.ts +44 -0
- package/dist/lib/tool-validate.d.ts.map +1 -0
- package/dist/lib/tool-validate.js +165 -0
- package/dist/lib/tool-validate.js.map +1 -0
- package/dist/lib/ttfb-budget.d.ts +13 -0
- package/dist/lib/ttfb-budget.d.ts.map +1 -0
- package/dist/lib/ttfb-budget.js +153 -0
- package/dist/lib/ttfb-budget.js.map +1 -0
- package/dist/lib/url-guard.d.ts +47 -0
- package/dist/lib/url-guard.d.ts.map +1 -0
- package/dist/lib/url-guard.js +229 -0
- package/dist/lib/url-guard.js.map +1 -0
- package/dist/lib/wake-detect.d.ts +12 -0
- package/dist/lib/wake-detect.d.ts.map +1 -0
- package/dist/lib/wake-detect.js +99 -0
- package/dist/lib/wake-detect.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +3 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +45 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +4 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/rateLimit.js +125 -0
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware/requireAuth.d.ts +3 -0
- package/dist/middleware/requireAuth.d.ts.map +1 -0
- package/dist/middleware/requireAuth.js +17 -0
- package/dist/middleware/requireAuth.js.map +1 -0
- package/dist/providers/aclide.d.ts +18 -0
- package/dist/providers/aclide.d.ts.map +1 -0
- package/dist/providers/aclide.js +174 -0
- package/dist/providers/aclide.js.map +1 -0
- package/dist/providers/aihorde.d.ts +42 -0
- package/dist/providers/aihorde.d.ts.map +1 -0
- package/dist/providers/aihorde.js +192 -0
- package/dist/providers/aihorde.js.map +1 -0
- package/dist/providers/airforce.d.ts +11 -0
- package/dist/providers/airforce.d.ts.map +1 -0
- package/dist/providers/airforce.js +32 -0
- package/dist/providers/airforce.js.map +1 -0
- package/dist/providers/base.d.ts +177 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +354 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/blaze.d.ts +11 -0
- package/dist/providers/blaze.d.ts.map +1 -0
- package/dist/providers/blaze.js +33 -0
- package/dist/providers/blaze.js.map +1 -0
- package/dist/providers/blockrun.d.ts +14 -0
- package/dist/providers/blockrun.d.ts.map +1 -0
- package/dist/providers/blockrun.js +36 -0
- package/dist/providers/blockrun.js.map +1 -0
- package/dist/providers/clod.d.ts +11 -0
- package/dist/providers/clod.d.ts.map +1 -0
- package/dist/providers/clod.js +39 -0
- package/dist/providers/clod.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +15 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/cloudflare.js +175 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/cohere.d.ts +11 -0
- package/dist/providers/cohere.d.ts.map +1 -0
- package/dist/providers/cohere.js +117 -0
- package/dist/providers/cohere.js.map +1 -0
- package/dist/providers/dreamprompting.d.ts +11 -0
- package/dist/providers/dreamprompting.d.ts.map +1 -0
- package/dist/providers/dreamprompting.js +41 -0
- package/dist/providers/dreamprompting.js.map +1 -0
- package/dist/providers/electronhub.d.ts +10 -0
- package/dist/providers/electronhub.d.ts.map +1 -0
- package/dist/providers/electronhub.js +56 -0
- package/dist/providers/electronhub.js.map +1 -0
- package/dist/providers/experiential.d.ts +10 -0
- package/dist/providers/experiential.d.ts.map +1 -0
- package/dist/providers/experiential.js +33 -0
- package/dist/providers/experiential.js.map +1 -0
- package/dist/providers/gizmo.d.ts +15 -0
- package/dist/providers/gizmo.d.ts.map +1 -0
- package/dist/providers/gizmo.js +54 -0
- package/dist/providers/gizmo.js.map +1 -0
- package/dist/providers/google.d.ts +30 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +766 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +561 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llmtr.d.ts +15 -0
- package/dist/providers/llmtr.d.ts.map +1 -0
- package/dist/providers/llmtr.js +51 -0
- package/dist/providers/llmtr.js.map +1 -0
- package/dist/providers/logfare.d.ts +11 -0
- package/dist/providers/logfare.d.ts.map +1 -0
- package/dist/providers/logfare.js +33 -0
- package/dist/providers/logfare.js.map +1 -0
- package/dist/providers/lucidity.d.ts +11 -0
- package/dist/providers/lucidity.d.ts.map +1 -0
- package/dist/providers/lucidity.js +37 -0
- package/dist/providers/lucidity.js.map +1 -0
- package/dist/providers/modelscope.d.ts +50 -0
- package/dist/providers/modelscope.d.ts.map +1 -0
- package/dist/providers/modelscope.js +143 -0
- package/dist/providers/modelscope.js.map +1 -0
- package/dist/providers/moondream.d.ts +17 -0
- package/dist/providers/moondream.d.ts.map +1 -0
- package/dist/providers/moondream.js +140 -0
- package/dist/providers/moondream.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +140 -0
- package/dist/providers/openai-compat.d.ts.map +1 -0
- package/dist/providers/openai-compat.js +537 -0
- package/dist/providers/openai-compat.js.map +1 -0
- package/dist/providers/opencode-free.d.ts +24 -0
- package/dist/providers/opencode-free.d.ts.map +1 -0
- package/dist/providers/opencode-free.js +262 -0
- package/dist/providers/opencode-free.js.map +1 -0
- package/dist/providers/pollinations.d.ts +32 -0
- package/dist/providers/pollinations.d.ts.map +1 -0
- package/dist/providers/pollinations.js +65 -0
- package/dist/providers/pollinations.js.map +1 -0
- package/dist/providers/router9.d.ts +16 -0
- package/dist/providers/router9.d.ts.map +1 -0
- package/dist/providers/router9.js +42 -0
- package/dist/providers/router9.js.map +1 -0
- package/dist/providers/sail.d.ts +44 -0
- package/dist/providers/sail.d.ts.map +1 -0
- package/dist/providers/sail.js +302 -0
- package/dist/providers/sail.js.map +1 -0
- package/dist/providers/septor.d.ts +10 -0
- package/dist/providers/septor.d.ts.map +1 -0
- package/dist/providers/septor.js +36 -0
- package/dist/providers/septor.js.map +1 -0
- package/dist/providers/speechify.d.ts +14 -0
- package/dist/providers/speechify.d.ts.map +1 -0
- package/dist/providers/speechify.js +28 -0
- package/dist/providers/speechify.js.map +1 -0
- package/dist/providers/speka.d.ts +12 -0
- package/dist/providers/speka.d.ts.map +1 -0
- package/dist/providers/speka.js +37 -0
- package/dist/providers/speka.js.map +1 -0
- package/dist/providers/waterfall.d.ts +11 -0
- package/dist/providers/waterfall.d.ts.map +1 -0
- package/dist/providers/waterfall.js +33 -0
- package/dist/providers/waterfall.js.map +1 -0
- package/dist/providers/xkiro.d.ts +71 -0
- package/dist/providers/xkiro.d.ts.map +1 -0
- package/dist/providers/xkiro.js +119 -0
- package/dist/providers/xkiro.js.map +1 -0
- package/dist/providers/zhipu.d.ts +43 -0
- package/dist/providers/zhipu.d.ts.map +1 -0
- package/dist/providers/zhipu.js +95 -0
- package/dist/providers/zhipu.js.map +1 -0
- package/dist/routes/analytics.d.ts +2 -0
- package/dist/routes/analytics.d.ts.map +1 -0
- package/dist/routes/analytics.js +738 -0
- package/dist/routes/analytics.js.map +1 -0
- package/dist/routes/anthropic.d.ts +7 -0
- package/dist/routes/anthropic.d.ts.map +1 -0
- package/dist/routes/anthropic.js +1076 -0
- package/dist/routes/anthropic.js.map +1 -0
- package/dist/routes/auth.d.ts +2 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +310 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/backups.d.ts +2 -0
- package/dist/routes/backups.d.ts.map +1 -0
- package/dist/routes/backups.js +127 -0
- package/dist/routes/backups.js.map +1 -0
- package/dist/routes/cache.d.ts +2 -0
- package/dist/routes/cache.d.ts.map +1 -0
- package/dist/routes/cache.js +40 -0
- package/dist/routes/cache.js.map +1 -0
- package/dist/routes/client-profiles.d.ts +2 -0
- package/dist/routes/client-profiles.d.ts.map +1 -0
- package/dist/routes/client-profiles.js +128 -0
- package/dist/routes/client-profiles.js.map +1 -0
- package/dist/routes/compression.d.ts +2 -0
- package/dist/routes/compression.d.ts.map +1 -0
- package/dist/routes/compression.js +82 -0
- package/dist/routes/compression.js.map +1 -0
- package/dist/routes/conversations.d.ts +3 -0
- package/dist/routes/conversations.d.ts.map +1 -0
- package/dist/routes/conversations.js +215 -0
- package/dist/routes/conversations.js.map +1 -0
- package/dist/routes/docs.d.ts +2 -0
- package/dist/routes/docs.d.ts.map +1 -0
- package/dist/routes/docs.js +21 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/embeddings.d.ts +2 -0
- package/dist/routes/embeddings.d.ts.map +1 -0
- package/dist/routes/embeddings.js +255 -0
- package/dist/routes/embeddings.js.map +1 -0
- package/dist/routes/fallback.d.ts +2 -0
- package/dist/routes/fallback.d.ts.map +1 -0
- package/dist/routes/fallback.js +631 -0
- package/dist/routes/fallback.js.map +1 -0
- package/dist/routes/free-tier.d.ts +22 -0
- package/dist/routes/free-tier.d.ts.map +1 -0
- package/dist/routes/free-tier.js +175 -0
- package/dist/routes/free-tier.js.map +1 -0
- package/dist/routes/gemini.d.ts +2 -0
- package/dist/routes/gemini.d.ts.map +1 -0
- package/dist/routes/gemini.js +218 -0
- package/dist/routes/gemini.js.map +1 -0
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +72 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/keys.d.ts +17 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +1787 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/logs.d.ts +2 -0
- package/dist/routes/logs.d.ts.map +1 -0
- package/dist/routes/logs.js +88 -0
- package/dist/routes/logs.js.map +1 -0
- package/dist/routes/mcp.d.ts +4 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +563 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/media.d.ts +2 -0
- package/dist/routes/media.d.ts.map +1 -0
- package/dist/routes/media.js +180 -0
- package/dist/routes/media.js.map +1 -0
- package/dist/routes/models.d.ts +2 -0
- package/dist/routes/models.d.ts.map +1 -0
- package/dist/routes/models.js +439 -0
- package/dist/routes/models.js.map +1 -0
- package/dist/routes/ollama.d.ts +7 -0
- package/dist/routes/ollama.d.ts.map +1 -0
- package/dist/routes/ollama.js +595 -0
- package/dist/routes/ollama.js.map +1 -0
- package/dist/routes/profiles.d.ts +3 -0
- package/dist/routes/profiles.d.ts.map +1 -0
- package/dist/routes/profiles.js +431 -0
- package/dist/routes/profiles.js.map +1 -0
- package/dist/routes/proxy.d.ts +32 -0
- package/dist/routes/proxy.d.ts.map +1 -0
- package/dist/routes/proxy.js +2793 -0
- package/dist/routes/proxy.js.map +1 -0
- package/dist/routes/responses.d.ts +1161 -0
- package/dist/routes/responses.d.ts.map +1 -0
- package/dist/routes/responses.js +1521 -0
- package/dist/routes/responses.js.map +1 -0
- package/dist/routes/settings.d.ts +2 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +549 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/status.d.ts +3 -0
- package/dist/routes/status.d.ts.map +1 -0
- package/dist/routes/status.js +214 -0
- package/dist/routes/status.js.map +1 -0
- package/dist/routes/update.d.ts +31 -0
- package/dist/routes/update.d.ts.map +1 -0
- package/dist/routes/update.js +536 -0
- package/dist/routes/update.js.map +1 -0
- package/dist/routes/url-tokens.d.ts +2 -0
- package/dist/routes/url-tokens.d.ts.map +1 -0
- package/dist/routes/url-tokens.js +31 -0
- package/dist/routes/url-tokens.js.map +1 -0
- package/dist/scripts/export-catalog.d.ts +2 -0
- package/dist/scripts/export-catalog.d.ts.map +1 -0
- package/dist/scripts/export-catalog.js +114 -0
- package/dist/scripts/export-catalog.js.map +1 -0
- package/dist/scripts/rotate-encryption-key.d.ts +81 -0
- package/dist/scripts/rotate-encryption-key.d.ts.map +1 -0
- package/dist/scripts/rotate-encryption-key.js +232 -0
- package/dist/scripts/rotate-encryption-key.js.map +1 -0
- package/dist/scripts/routing-sim.d.ts +2 -0
- package/dist/scripts/routing-sim.d.ts.map +1 -0
- package/dist/scripts/routing-sim.js +130 -0
- package/dist/scripts/routing-sim.js.map +1 -0
- package/dist/scripts/test-all-models.d.ts +2 -0
- package/dist/scripts/test-all-models.d.ts.map +1 -0
- package/dist/scripts/test-all-models.js +56 -0
- package/dist/scripts/test-all-models.js.map +1 -0
- package/dist/services/anthropic-map.d.ts +39 -0
- package/dist/services/anthropic-map.d.ts.map +1 -0
- package/dist/services/anthropic-map.js +138 -0
- package/dist/services/anthropic-map.js.map +1 -0
- package/dist/services/auth.d.ts +30 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +124 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/auto-discover.d.ts +77 -0
- package/dist/services/auto-discover.d.ts.map +1 -0
- package/dist/services/auto-discover.js +1047 -0
- package/dist/services/auto-discover.js.map +1 -0
- package/dist/services/backups.d.ts +67 -0
- package/dist/services/backups.d.ts.map +1 -0
- package/dist/services/backups.js +444 -0
- package/dist/services/backups.js.map +1 -0
- package/dist/services/builtin-model-discovery.d.ts +107 -0
- package/dist/services/builtin-model-discovery.d.ts.map +1 -0
- package/dist/services/builtin-model-discovery.js +296 -0
- package/dist/services/builtin-model-discovery.js.map +1 -0
- package/dist/services/cache.d.ts +190 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +617 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/catalog-sync.d.ts +257 -0
- package/dist/services/catalog-sync.d.ts.map +1 -0
- package/dist/services/catalog-sync.js +1041 -0
- package/dist/services/catalog-sync.js.map +1 -0
- package/dist/services/compression/config.d.ts +33 -0
- package/dist/services/compression/config.d.ts.map +1 -0
- package/dist/services/compression/config.js +158 -0
- package/dist/services/compression/config.js.map +1 -0
- package/dist/services/compression/engines/aging.d.ts +2 -0
- package/dist/services/compression/engines/aging.d.ts.map +1 -0
- package/dist/services/compression/engines/aging.js +53 -0
- package/dist/services/compression/engines/aging.js.map +1 -0
- package/dist/services/compression/engines/custom-filters.d.ts +4 -0
- package/dist/services/compression/engines/custom-filters.d.ts.map +1 -0
- package/dist/services/compression/engines/custom-filters.js +49 -0
- package/dist/services/compression/engines/custom-filters.js.map +1 -0
- package/dist/services/compression/engines/dedup.d.ts +2 -0
- package/dist/services/compression/engines/dedup.d.ts.map +1 -0
- package/dist/services/compression/engines/dedup.js +61 -0
- package/dist/services/compression/engines/dedup.js.map +1 -0
- package/dist/services/compression/engines/filter-definitions.d.ts +75 -0
- package/dist/services/compression/engines/filter-definitions.d.ts.map +1 -0
- package/dist/services/compression/engines/filter-definitions.js +45 -0
- package/dist/services/compression/engines/filter-definitions.js.map +1 -0
- package/dist/services/compression/engines/hard-budget.d.ts +2 -0
- package/dist/services/compression/engines/hard-budget.d.ts.map +1 -0
- package/dist/services/compression/engines/hard-budget.js +52 -0
- package/dist/services/compression/engines/hard-budget.js.map +1 -0
- package/dist/services/compression/engines/index.d.ts +9 -0
- package/dist/services/compression/engines/index.d.ts.map +1 -0
- package/dist/services/compression/engines/index.js +9 -0
- package/dist/services/compression/engines/index.js.map +1 -0
- package/dist/services/compression/engines/jsoncompact.d.ts +3 -0
- package/dist/services/compression/engines/jsoncompact.d.ts.map +1 -0
- package/dist/services/compression/engines/jsoncompact.js +145 -0
- package/dist/services/compression/engines/jsoncompact.js.map +1 -0
- package/dist/services/compression/engines/lite.d.ts +2 -0
- package/dist/services/compression/engines/lite.d.ts.map +1 -0
- package/dist/services/compression/engines/lite.js +34 -0
- package/dist/services/compression/engines/lite.js.map +1 -0
- package/dist/services/compression/engines/read-lifecycle.d.ts +2 -0
- package/dist/services/compression/engines/read-lifecycle.d.ts.map +1 -0
- package/dist/services/compression/engines/read-lifecycle.js +70 -0
- package/dist/services/compression/engines/read-lifecycle.js.map +1 -0
- package/dist/services/compression/engines/relevance.d.ts +2 -0
- package/dist/services/compression/engines/relevance.d.ts.map +1 -0
- package/dist/services/compression/engines/relevance.js +74 -0
- package/dist/services/compression/engines/relevance.js.map +1 -0
- package/dist/services/compression/engines/toolfilter.d.ts +2 -0
- package/dist/services/compression/engines/toolfilter.d.ts.map +1 -0
- package/dist/services/compression/engines/toolfilter.js +195 -0
- package/dist/services/compression/engines/toolfilter.js.map +1 -0
- package/dist/services/compression/fidelity-gate.d.ts +12 -0
- package/dist/services/compression/fidelity-gate.d.ts.map +1 -0
- package/dist/services/compression/fidelity-gate.js +90 -0
- package/dist/services/compression/fidelity-gate.js.map +1 -0
- package/dist/services/compression/helpers.d.ts +9 -0
- package/dist/services/compression/helpers.d.ts.map +1 -0
- package/dist/services/compression/helpers.js +52 -0
- package/dist/services/compression/helpers.js.map +1 -0
- package/dist/services/compression/pipeline.d.ts +7 -0
- package/dist/services/compression/pipeline.d.ts.map +1 -0
- package/dist/services/compression/pipeline.js +245 -0
- package/dist/services/compression/pipeline.js.map +1 -0
- package/dist/services/compression/preservation.d.ts +27 -0
- package/dist/services/compression/preservation.d.ts.map +1 -0
- package/dist/services/compression/preservation.js +109 -0
- package/dist/services/compression/preservation.js.map +1 -0
- package/dist/services/compression/registry.d.ts +6 -0
- package/dist/services/compression/registry.d.ts.map +1 -0
- package/dist/services/compression/registry.js +16 -0
- package/dist/services/compression/registry.js.map +1 -0
- package/dist/services/compression/stats.d.ts +29 -0
- package/dist/services/compression/stats.d.ts.map +1 -0
- package/dist/services/compression/stats.js +55 -0
- package/dist/services/compression/stats.js.map +1 -0
- package/dist/services/compression/types.d.ts +90 -0
- package/dist/services/compression/types.d.ts.map +1 -0
- package/dist/services/compression/types.js +2 -0
- package/dist/services/compression/types.js.map +1 -0
- package/dist/services/context-handoff.d.ts +22 -0
- package/dist/services/context-handoff.d.ts.map +1 -0
- package/dist/services/context-handoff.js +164 -0
- package/dist/services/context-handoff.js.map +1 -0
- package/dist/services/cooldown-probe.d.ts +24 -0
- package/dist/services/cooldown-probe.d.ts.map +1 -0
- package/dist/services/cooldown-probe.js +181 -0
- package/dist/services/cooldown-probe.js.map +1 -0
- package/dist/services/custom-endpoint.d.ts +58 -0
- package/dist/services/custom-endpoint.d.ts.map +1 -0
- package/dist/services/custom-endpoint.js +167 -0
- package/dist/services/custom-endpoint.js.map +1 -0
- package/dist/services/custom-media-register.d.ts +22 -0
- package/dist/services/custom-media-register.d.ts.map +1 -0
- package/dist/services/custom-media-register.js +45 -0
- package/dist/services/custom-media-register.js.map +1 -0
- package/dist/services/custom-model-register.d.ts +50 -0
- package/dist/services/custom-model-register.d.ts.map +1 -0
- package/dist/services/custom-model-register.js +103 -0
- package/dist/services/custom-model-register.js.map +1 -0
- package/dist/services/custom-model-seed.d.ts +18 -0
- package/dist/services/custom-model-seed.d.ts.map +1 -0
- package/dist/services/custom-model-seed.js +42 -0
- package/dist/services/custom-model-seed.js.map +1 -0
- package/dist/services/custom-model-sync.d.ts +37 -0
- package/dist/services/custom-model-sync.d.ts.map +1 -0
- package/dist/services/custom-model-sync.js +118 -0
- package/dist/services/custom-model-sync.js.map +1 -0
- package/dist/services/custom-model-tombstone.d.ts +5 -0
- package/dist/services/custom-model-tombstone.d.ts.map +1 -0
- package/dist/services/custom-model-tombstone.js +30 -0
- package/dist/services/custom-model-tombstone.js.map +1 -0
- package/dist/services/declarative-config.d.ts +356 -0
- package/dist/services/declarative-config.d.ts.map +1 -0
- package/dist/services/declarative-config.js +427 -0
- package/dist/services/declarative-config.js.map +1 -0
- package/dist/services/degradation.d.ts +40 -0
- package/dist/services/degradation.d.ts.map +1 -0
- package/dist/services/degradation.js +119 -0
- package/dist/services/degradation.js.map +1 -0
- package/dist/services/embeddings.d.ts +76 -0
- package/dist/services/embeddings.d.ts.map +1 -0
- package/dist/services/embeddings.js +319 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/fusion.d.ts +162 -0
- package/dist/services/fusion.d.ts.map +1 -0
- package/dist/services/fusion.js +789 -0
- package/dist/services/fusion.js.map +1 -0
- package/dist/services/gemini-map.d.ts +14 -0
- package/dist/services/gemini-map.d.ts.map +1 -0
- package/dist/services/gemini-map.js +78 -0
- package/dist/services/gemini-map.js.map +1 -0
- package/dist/services/health.d.ts +52 -0
- package/dist/services/health.d.ts.map +1 -0
- package/dist/services/health.js +352 -0
- package/dist/services/health.js.map +1 -0
- package/dist/services/idempotency.d.ts +49 -0
- package/dist/services/idempotency.d.ts.map +1 -0
- package/dist/services/idempotency.js +140 -0
- package/dist/services/idempotency.js.map +1 -0
- package/dist/services/key-budget.d.ts +74 -0
- package/dist/services/key-budget.d.ts.map +1 -0
- package/dist/services/key-budget.js +200 -0
- package/dist/services/key-budget.js.map +1 -0
- package/dist/services/media.d.ts +123 -0
- package/dist/services/media.d.ts.map +1 -0
- package/dist/services/media.js +954 -0
- package/dist/services/media.js.map +1 -0
- package/dist/services/model-discovery.d.ts +126 -0
- package/dist/services/model-discovery.d.ts.map +1 -0
- package/dist/services/model-discovery.js +662 -0
- package/dist/services/model-discovery.js.map +1 -0
- package/dist/services/model-groups.d.ts +149 -0
- package/dist/services/model-groups.d.ts.map +1 -0
- package/dist/services/model-groups.js +314 -0
- package/dist/services/model-groups.js.map +1 -0
- package/dist/services/model-listing.d.ts +18 -0
- package/dist/services/model-listing.d.ts.map +1 -0
- package/dist/services/model-listing.js +94 -0
- package/dist/services/model-listing.js.map +1 -0
- package/dist/services/model-retirement.d.ts +29 -0
- package/dist/services/model-retirement.d.ts.map +1 -0
- package/dist/services/model-retirement.js +86 -0
- package/dist/services/model-retirement.js.map +1 -0
- package/dist/services/model-state.d.ts +90 -0
- package/dist/services/model-state.d.ts.map +1 -0
- package/dist/services/model-state.js +342 -0
- package/dist/services/model-state.js.map +1 -0
- package/dist/services/model-weight-overrides.d.ts +48 -0
- package/dist/services/model-weight-overrides.d.ts.map +1 -0
- package/dist/services/model-weight-overrides.js +127 -0
- package/dist/services/model-weight-overrides.js.map +1 -0
- package/dist/services/notification-emitter.d.ts +50 -0
- package/dist/services/notification-emitter.d.ts.map +1 -0
- package/dist/services/notification-emitter.js +177 -0
- package/dist/services/notification-emitter.js.map +1 -0
- package/dist/services/opencode-free-sync.d.ts +29 -0
- package/dist/services/opencode-free-sync.d.ts.map +1 -0
- package/dist/services/opencode-free-sync.js +206 -0
- package/dist/services/opencode-free-sync.js.map +1 -0
- package/dist/services/penalty-inspector.d.ts +56 -0
- package/dist/services/penalty-inspector.d.ts.map +1 -0
- package/dist/services/penalty-inspector.js +167 -0
- package/dist/services/penalty-inspector.js.map +1 -0
- package/dist/services/profile-models.d.ts +5 -0
- package/dist/services/profile-models.d.ts.map +1 -0
- package/dist/services/profile-models.js +62 -0
- package/dist/services/profile-models.js.map +1 -0
- package/dist/services/provider-credential.d.ts +19 -0
- package/dist/services/provider-credential.d.ts.map +1 -0
- package/dist/services/provider-credential.js +51 -0
- package/dist/services/provider-credential.js.map +1 -0
- package/dist/services/provider-quota.d.ts +64 -0
- package/dist/services/provider-quota.d.ts.map +1 -0
- package/dist/services/provider-quota.js +563 -0
- package/dist/services/provider-quota.js.map +1 -0
- package/dist/services/quirks.d.ts +0 -0
- package/dist/services/quirks.d.ts.map +1 -0
- package/dist/services/quirks.js +0 -0
- package/dist/services/quirks.js.map +1 -0
- package/dist/services/quota-forecast.d.ts +50 -0
- package/dist/services/quota-forecast.d.ts.map +1 -0
- package/dist/services/quota-forecast.js +150 -0
- package/dist/services/quota-forecast.js.map +1 -0
- package/dist/services/quota-outlook.d.ts +4 -0
- package/dist/services/quota-outlook.d.ts.map +1 -0
- package/dist/services/quota-outlook.js +92 -0
- package/dist/services/quota-outlook.js.map +1 -0
- package/dist/services/ratelimit.d.ts +249 -0
- package/dist/services/ratelimit.d.ts.map +1 -0
- package/dist/services/ratelimit.js +1182 -0
- package/dist/services/ratelimit.js.map +1 -0
- package/dist/services/request-retention.d.ts +60 -0
- package/dist/services/request-retention.d.ts.map +1 -0
- package/dist/services/request-retention.js +229 -0
- package/dist/services/request-retention.js.map +1 -0
- package/dist/services/router.d.ts +384 -0
- package/dist/services/router.d.ts.map +1 -0
- package/dist/services/router.js +1986 -0
- package/dist/services/router.js.map +1 -0
- package/dist/services/scoring.d.ts +156 -0
- package/dist/services/scoring.d.ts.map +1 -0
- package/dist/services/scoring.js +435 -0
- package/dist/services/scoring.js.map +1 -0
- package/dist/services/url-tokens.d.ts +15 -0
- package/dist/services/url-tokens.d.ts.map +1 -0
- package/dist/services/url-tokens.js +55 -0
- package/dist/services/url-tokens.js.map +1 -0
- package/package.json +77 -4
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-forecast.d.ts","sourceRoot":"","sources":["../../src/services/quota-forecast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAczD,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAKlD,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb;mDAC+C;IAC/C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gEAAgE;IAChE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;oFAEgF;IAChF,WAAW,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAInC;;2DAEuD;IACvD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;sBAGkB;IAClB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AASD,sFAAsF;AACtF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAYzE;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAef;AAiDD,wBAAgB,gBAAgB,CAC9B,IAAI,yBAAyB,EAAE,GAAG,SAAa,GAC9C,kBAAkB,EAAE,CAmCtB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { getQuotaStateForKeys, inferPoolForPlatform } from './provider-quota.js';
|
|
2
|
+
import { getDb } from '../db/index.js';
|
|
3
|
+
// Daily free-tier balance forecast (#1104). Free tiers reset on a per-account
|
|
4
|
+
// window (usually UTC midnight) and the only way to know how much headroom is
|
|
5
|
+
// left before that reset is to read what the providers themselves reported.
|
|
6
|
+
// This is a pure aggregation over `getQuotaStateForKeys()` — no new tables, no
|
|
7
|
+
// extra probes — so it costs nothing beyond the query the health view already
|
|
8
|
+
// runs.
|
|
9
|
+
//
|
|
10
|
+
// The value it adds over the raw rows: one number per platform that answers
|
|
11
|
+
// "can I keep calling this platform for the rest of today?", plus a
|
|
12
|
+
// low-balance warning an agent can gate on BEFORE sending a request that would
|
|
13
|
+
// 429.
|
|
14
|
+
export const LOW_BALANCE_THRESHOLD = 0.1; // <10% of the daily window left → warn
|
|
15
|
+
export const LOW_BALANCE_ABSOLUTE = 20; // ...or fewer than 20 requests left
|
|
16
|
+
// The absolute floor is a statement about big windows: "20 left" is alarming
|
|
17
|
+
// out of 14400/day and unremarkable out of 30/day. Below this limit the
|
|
18
|
+
// percentage rule alone decides, otherwise a small tier would warn from its
|
|
19
|
+
// first request onwards and the flag would mean nothing.
|
|
20
|
+
export const LOW_BALANCE_ABSOLUTE_MIN_LIMIT = 200;
|
|
21
|
+
// Rate observation window: look at requests in the last N minutes to estimate
|
|
22
|
+
// current consumption speed. Ten minutes covers bursty usage while ignoring
|
|
23
|
+
// sub-hour lulls; shorter windows would jitter, longer ones would lag.
|
|
24
|
+
export const RATE_OBSERVATION_WINDOW_MINUTES = 10;
|
|
25
|
+
export const MIN_FORECAST_REQUESTS = 3;
|
|
26
|
+
function secondsUntilReset(resetAt) {
|
|
27
|
+
if (!resetAt)
|
|
28
|
+
return null;
|
|
29
|
+
const ms = new Date(resetAt).getTime() - Date.now();
|
|
30
|
+
if (Number.isNaN(ms) || ms <= 0)
|
|
31
|
+
return null;
|
|
32
|
+
return Math.floor(ms / 1000);
|
|
33
|
+
}
|
|
34
|
+
export function getRecentQuotaActivity(now) {
|
|
35
|
+
const sqliteUtc = (ms) => new Date(ms).toISOString().slice(0, 19).replace('T', ' ');
|
|
36
|
+
const since = sqliteUtc(now - RATE_OBSERVATION_WINDOW_MINUTES * 60_000);
|
|
37
|
+
const rows = getDb().prepare(`
|
|
38
|
+
SELECT platform, key_id AS keyId, model_id AS modelId, COUNT(*) AS count
|
|
39
|
+
FROM requests
|
|
40
|
+
WHERE created_at >= ? AND datetime(created_at) >= ? AND datetime(created_at) <= ?
|
|
41
|
+
AND status = 'success'
|
|
42
|
+
GROUP BY platform, key_id, model_id
|
|
43
|
+
`).all(since, since, sqliteUtc(now));
|
|
44
|
+
return rows.map(row => ({ platform: row.platform, keyId: row.keyId,
|
|
45
|
+
pool: inferPoolForPlatform(row.platform, row.modelId), count: Number(row.count) }));
|
|
46
|
+
}
|
|
47
|
+
export function estimateExhaustionAt(remaining, ratePerMin, resetAt, now) {
|
|
48
|
+
// No observed rate → no honest projection. Rates too low to matter are
|
|
49
|
+
// excluded at the caller level (rate_per_min itself is null).
|
|
50
|
+
if (ratePerMin === null || ratePerMin <= 0)
|
|
51
|
+
return null;
|
|
52
|
+
// Remaining is known (caller checks) and limit is positive (enforced below).
|
|
53
|
+
const minutesUntilEmpty = remaining / ratePerMin;
|
|
54
|
+
const secondsFromNow = Math.ceil(minutesUntilEmpty * 60);
|
|
55
|
+
const ms = now + secondsFromNow * 1000;
|
|
56
|
+
// Never project past the natural window reset: if the window expires first,
|
|
57
|
+
// we have headroom even if the request count would otherwise exhaust the
|
|
58
|
+
// pool — the quota header tracks the remaining *before* reset, not absolute
|
|
59
|
+
// spending.
|
|
60
|
+
const resetMs = resetAt ? new Date(resetAt).getTime() : Infinity;
|
|
61
|
+
if (!Number.isFinite(ms) || Number.isNaN(resetMs) || ms >= resetMs || ms <= now)
|
|
62
|
+
return null;
|
|
63
|
+
return new Date(ms).toISOString();
|
|
64
|
+
}
|
|
65
|
+
function entryFor(row, ratePerMin, now) {
|
|
66
|
+
// Only request-based windows are predictable from quota headers; token pools
|
|
67
|
+
// reset semantics vary too much across providers to forecast honestly.
|
|
68
|
+
if (row.metric !== 'requests')
|
|
69
|
+
return null;
|
|
70
|
+
// Without a known limit there is no window to forecast — nothing to warn on.
|
|
71
|
+
if (typeof row.limit !== 'number' || row.limit <= 0)
|
|
72
|
+
return null;
|
|
73
|
+
const limit = row.limit;
|
|
74
|
+
const remaining = typeof row.remaining === 'number' ? row.remaining : null;
|
|
75
|
+
// An unknown `remaining` says nothing about consumption: reporting the whole
|
|
76
|
+
// limit as used would read as an exhausted pool when it may be untouched.
|
|
77
|
+
const used = remaining === null ? null : Math.max(0, limit - remaining);
|
|
78
|
+
let remainingPct = null;
|
|
79
|
+
let lowBalance = false;
|
|
80
|
+
if (remaining !== null) {
|
|
81
|
+
remainingPct = Math.max(0, Math.min(100, Math.round((remaining / limit) * 100)));
|
|
82
|
+
const absoluteApplies = limit >= LOW_BALANCE_ABSOLUTE_MIN_LIMIT;
|
|
83
|
+
lowBalance = (absoluteApplies && remaining <= LOW_BALANCE_ABSOLUTE)
|
|
84
|
+
|| remaining / limit < LOW_BALANCE_THRESHOLD;
|
|
85
|
+
}
|
|
86
|
+
// Rate projection is gated on remaining being known (unknown remaining makes
|
|
87
|
+
// any rate look like a free lunch until the next quota refresh).
|
|
88
|
+
if (remaining === null)
|
|
89
|
+
ratePerMin = null;
|
|
90
|
+
const estimatedExhaustionAt = (remaining !== null && ratePerMin !== null && remaining > 0)
|
|
91
|
+
? estimateExhaustionAt(remaining, ratePerMin, row.resetAt ?? null, now)
|
|
92
|
+
: null;
|
|
93
|
+
return {
|
|
94
|
+
platform: row.platform,
|
|
95
|
+
pool: row.quotaPoolKey ?? `${row.platform}::default`,
|
|
96
|
+
used,
|
|
97
|
+
remaining,
|
|
98
|
+
limit,
|
|
99
|
+
remaining_pct: remainingPct,
|
|
100
|
+
reset_at: row.resetAt ?? null,
|
|
101
|
+
low_balance: lowBalance,
|
|
102
|
+
seconds_until_reset: secondsUntilReset(row.resetAt ?? null),
|
|
103
|
+
rate_per_min: ratePerMin,
|
|
104
|
+
estimated_exhaustion_at: estimatedExhaustionAt,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Dedupe to the TIGHTEST row per platform+pool: a platform with several keys
|
|
108
|
+
// sharing one account pool reports the same window per key, and the number that
|
|
109
|
+
// matters for "can I keep calling" is the least headroom left.
|
|
110
|
+
export function getQuotaForecast(rows = getQuotaStateForKeys(), now = Date.now()) {
|
|
111
|
+
const byKey = new Map();
|
|
112
|
+
const activity = rows.length ? getRecentQuotaActivity(now) : [];
|
|
113
|
+
const counts = new Map();
|
|
114
|
+
for (const row of activity) {
|
|
115
|
+
const identity = JSON.stringify([row.platform, row.pool, row.keyId]);
|
|
116
|
+
counts.set(identity, (counts.get(identity) ?? 0) + row.count);
|
|
117
|
+
}
|
|
118
|
+
const poolKeys = new Map();
|
|
119
|
+
for (const row of rows) {
|
|
120
|
+
if (row.metric !== 'requests')
|
|
121
|
+
continue;
|
|
122
|
+
const pool = JSON.stringify([row.platform, row.quotaPoolKey]);
|
|
123
|
+
const keys = poolKeys.get(pool) ?? new Set();
|
|
124
|
+
keys.add(JSON.stringify([row.platform, row.quotaPoolKey, row.keyId]));
|
|
125
|
+
poolKeys.set(pool, keys);
|
|
126
|
+
}
|
|
127
|
+
for (const row of rows) {
|
|
128
|
+
const keys = poolKeys.get(JSON.stringify([row.platform, row.quotaPoolKey])) ?? [];
|
|
129
|
+
let count = 0;
|
|
130
|
+
for (const key of keys)
|
|
131
|
+
count += counts.get(key) ?? 0;
|
|
132
|
+
const rate = count < MIN_FORECAST_REQUESTS ? null : Math.round(count / RATE_OBSERVATION_WINDOW_MINUTES * 100) / 100;
|
|
133
|
+
const entry = entryFor(row, rate, now);
|
|
134
|
+
if (!entry)
|
|
135
|
+
continue;
|
|
136
|
+
// `pool` already carries its platform ("groq::account"), so it is the key.
|
|
137
|
+
const key = entry.pool;
|
|
138
|
+
const prev = byKey.get(key);
|
|
139
|
+
if (!prev || (entry.remaining_pct ?? Infinity) < (prev.remaining_pct ?? Infinity)) {
|
|
140
|
+
byKey.set(key, entry);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return [...byKey.values()].sort((a, b) => {
|
|
144
|
+
// Low-balance pools first — the ones the caller most needs to see.
|
|
145
|
+
if (a.low_balance !== b.low_balance)
|
|
146
|
+
return a.low_balance ? -1 : 1;
|
|
147
|
+
return a.platform.localeCompare(b.platform);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=quota-forecast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-forecast.js","sourceRoot":"","sources":["../../src/services/quota-forecast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { QuotaOutlookResponse } from '@srouter/shared/types.js';
|
|
2
|
+
/** Local activity is measurable even without provider quota headers. No probes or writes. */
|
|
3
|
+
export declare function getQuotaOutlook(): QuotaOutlookResponse;
|
|
4
|
+
//# sourceMappingURL=quota-outlook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-outlook.d.ts","sourceRoot":"","sources":["../../src/services/quota-outlook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAwBvF,6FAA6F;AAC7F,wBAAgB,eAAe,IAAI,oBAAoB,CA8DtD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { getQuotaStateForKeys } from './provider-quota.js';
|
|
2
|
+
import { estimateExhaustionAt, getRecentQuotaActivity, MIN_FORECAST_REQUESTS, RATE_OBSERVATION_WINDOW_MINUTES } from './quota-forecast.js';
|
|
3
|
+
const WARNING_REMAINING_RATIO = 0.2;
|
|
4
|
+
const WARNING_EXHAUSTION_MS = 2 * 60 * 60_000;
|
|
5
|
+
const MAX_OBSERVATION_AGE_MS = RATE_OBSERVATION_WINDOW_MINUTES * 60_000;
|
|
6
|
+
function utcMillis(value) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return NaN;
|
|
9
|
+
return Date.parse(value.includes('T') ? value : value.replace(' ', 'T') + 'Z');
|
|
10
|
+
}
|
|
11
|
+
function unavailableReason(row, now) {
|
|
12
|
+
if (row.limit == null || !Number.isFinite(row.limit) || row.limit <= 0
|
|
13
|
+
|| row.remaining == null || !Number.isFinite(row.remaining) || row.remaining < 0 || row.remaining > row.limit)
|
|
14
|
+
return 'quota_not_reported';
|
|
15
|
+
const observed = utcMillis(row.observedAt);
|
|
16
|
+
const reset = utcMillis(row.resetAt);
|
|
17
|
+
if (!Number.isFinite(observed) || observed > now || now - observed > MAX_OBSERVATION_AGE_MS
|
|
18
|
+
|| (Number.isFinite(reset) && reset <= now))
|
|
19
|
+
return 'stale_observation';
|
|
20
|
+
if (!Number.isFinite(row.confidence) || row.confidence < 0.7)
|
|
21
|
+
return 'low_confidence';
|
|
22
|
+
return Number.isFinite(reset) ? null : 'reset_not_reported';
|
|
23
|
+
}
|
|
24
|
+
/** Local activity is measurable even without provider quota headers. No probes or writes. */
|
|
25
|
+
export function getQuotaOutlook() {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const activity = getRecentQuotaActivity(now);
|
|
28
|
+
const counts = new Map();
|
|
29
|
+
for (const row of activity)
|
|
30
|
+
counts.set(row.pool, (counts.get(row.pool) ?? 0) + row.count);
|
|
31
|
+
const selected = new Map();
|
|
32
|
+
const rank = (row) => {
|
|
33
|
+
const reason = unavailableReason(row, now);
|
|
34
|
+
return reason === null ? 0 : reason === 'reset_not_reported' ? 1 : reason === 'quota_not_reported' ? 3 : 2;
|
|
35
|
+
};
|
|
36
|
+
for (const row of getQuotaStateForKeys({ normalizeExpired: false })) {
|
|
37
|
+
if (row.metric !== 'requests')
|
|
38
|
+
continue;
|
|
39
|
+
const previous = selected.get(row.quotaPoolKey);
|
|
40
|
+
// A stale legacy key must not hide a current account reading. Among usable
|
|
41
|
+
// readings, retain the tightest pool balance (same rounded-percent tie break).
|
|
42
|
+
const score = (value) => value.limit != null && value.limit > 0 && value.remaining != null
|
|
43
|
+
? Math.round(value.remaining / value.limit * 100) : Infinity;
|
|
44
|
+
if (!previous || rank(row) < rank(previous) || (rank(row) === rank(previous) && score(row) < score(previous))) {
|
|
45
|
+
selected.set(row.quotaPoolKey, row);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const pools = [];
|
|
49
|
+
for (const row of selected.values()) {
|
|
50
|
+
const reason = unavailableReason(row, now);
|
|
51
|
+
const count = counts.get(row.quotaPoolKey) ?? 0;
|
|
52
|
+
const rate = Math.round(count / RATE_OBSERVATION_WINDOW_MINUTES * 100) / 100;
|
|
53
|
+
const known = reason !== 'quota_not_reported';
|
|
54
|
+
const resetMs = utcMillis(row.resetAt);
|
|
55
|
+
const resetAt = Number.isFinite(resetMs) ? new Date(resetMs).toISOString() : null;
|
|
56
|
+
const exhaustion = reason === null && count >= MIN_FORECAST_REQUESTS && row.remaining > 0
|
|
57
|
+
? estimateExhaustionAt(row.remaining, rate, resetAt, now) : null;
|
|
58
|
+
const status = reason === 'quota_not_reported' ? 'unknown'
|
|
59
|
+
: reason === 'stale_observation' ? 'stale'
|
|
60
|
+
: reason ? 'unavailable'
|
|
61
|
+
: row.remaining === 0 ? 'exhausted'
|
|
62
|
+
: count < MIN_FORECAST_REQUESTS ? 'insufficient_data'
|
|
63
|
+
: exhaustion ? 'forecast' : 'resets_first';
|
|
64
|
+
let warning = null;
|
|
65
|
+
if (reason === null) {
|
|
66
|
+
if (row.remaining / row.limit < WARNING_REMAINING_RATIO)
|
|
67
|
+
warning = 'low_balance';
|
|
68
|
+
else if (exhaustion && Date.parse(exhaustion) - now <= WARNING_EXHAUSTION_MS)
|
|
69
|
+
warning = 'exhausting_soon';
|
|
70
|
+
}
|
|
71
|
+
pools.push({
|
|
72
|
+
platform: row.platform, pool: row.quotaPoolKey, limit: row.limit, remaining: row.remaining,
|
|
73
|
+
remainingPct: known ? Math.round(row.remaining / row.limit * 100) : null,
|
|
74
|
+
observedAt: row.observedAt, resetAt,
|
|
75
|
+
recentRequestCount: count, ratePerMin: rate, estimatedExhaustionAt: exhaustion,
|
|
76
|
+
unavailableReason: reason, status, warning,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Providers without any quota observations still have locally recorded usage.
|
|
80
|
+
for (const row of activity) {
|
|
81
|
+
if (selected.has(row.pool) || pools.some(pool => pool.pool === row.pool))
|
|
82
|
+
continue;
|
|
83
|
+
const count = counts.get(row.pool);
|
|
84
|
+
pools.push({ platform: row.platform, pool: row.pool, limit: null, remaining: null, remainingPct: null,
|
|
85
|
+
observedAt: null, resetAt: null, recentRequestCount: count, ratePerMin: Math.round(count / RATE_OBSERVATION_WINDOW_MINUTES * 100) / 100,
|
|
86
|
+
estimatedExhaustionAt: null, unavailableReason: 'quota_not_reported', status: 'unknown', warning: null });
|
|
87
|
+
}
|
|
88
|
+
pools.sort((a, b) => Number(Boolean(b.warning)) - Number(Boolean(a.warning)) || a.pool.localeCompare(b.pool));
|
|
89
|
+
return { generatedAt: new Date(now).toISOString(), observationWindowMinutes: RATE_OBSERVATION_WINDOW_MINUTES,
|
|
90
|
+
minimumRequests: MIN_FORECAST_REQUESTS, pools };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=quota-outlook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-outlook.js","sourceRoot":"","sources":["../../src/services/quota-outlook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concurrent in-flight requests allowed per key, or null for unlimited.
|
|
3
|
+
*
|
|
4
|
+
* Some free tiers meter concurrency per credential rather than per minute, so
|
|
5
|
+
* parallel streams on one key mostly 429 each other. But most do not, and
|
|
6
|
+
* capping by default would serialise every provider and cost real throughput —
|
|
7
|
+
* so this is opt-in. There is deliberately no built-in per-platform table: the
|
|
8
|
+
* providers that behave this way are not documented well enough to assert a
|
|
9
|
+
* number for them here, and a wrong default is worse than none.
|
|
10
|
+
*
|
|
11
|
+
* `MAX_CONCURRENT_REQUESTS_PER_KEY_<PLATFORM>` sets it for one platform;
|
|
12
|
+
* `MAX_CONCURRENT_REQUESTS_PER_KEY` sets a fallback for all of them.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getKeyConcurrencyLimit(platform: string): number | null;
|
|
15
|
+
/** Requests this process currently has in flight against one platform+key. */
|
|
16
|
+
export declare function inFlightForKey(platform: string, keyId: number, now?: number): number;
|
|
17
|
+
/** False when this key already has its allowed number of requests in the air.
|
|
18
|
+
* Always true when no cap is configured, which is the default. */
|
|
19
|
+
export declare function canUseKeyConcurrency(platform: string, keyId: number, now?: number): boolean;
|
|
20
|
+
/** Take a lease for an attempt about to be dispatched. Returns the id to release. */
|
|
21
|
+
export declare function acquireLease(platform: string, modelId: string, keyId: number, tokens: number, now?: number): number;
|
|
22
|
+
/** Release a lease. Idempotent, so a double release from overlapping cleanup
|
|
23
|
+
* paths is harmless. */
|
|
24
|
+
export declare function releaseLease(leaseId: number): void;
|
|
25
|
+
/** Test seam: drop all leases. */
|
|
26
|
+
export declare function resetLeases(): void;
|
|
27
|
+
export declare function canMakeRequest(platform: string, modelId: string, keyId: number, limits: {
|
|
28
|
+
rpm: number | null;
|
|
29
|
+
rpd: number | null;
|
|
30
|
+
tpm: number | null;
|
|
31
|
+
tpd: number | null;
|
|
32
|
+
}): boolean;
|
|
33
|
+
export declare function canUseTokens(platform: string, modelId: string, keyId: number, estimatedTokens: number, limits: {
|
|
34
|
+
tpm: number | null;
|
|
35
|
+
tpd: number | null;
|
|
36
|
+
}): boolean;
|
|
37
|
+
export interface WindowLimits {
|
|
38
|
+
rpm: number | null;
|
|
39
|
+
rpd: number | null;
|
|
40
|
+
tpm: number | null;
|
|
41
|
+
tpd: number | null;
|
|
42
|
+
}
|
|
43
|
+
/** Drop the memoised window snapshot. Tests use it to make a write visible
|
|
44
|
+
* immediately; production relies on the TTL. */
|
|
45
|
+
export declare function invalidateWindowUsage(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Share of its binding rate-limit window a model has already consumed, as a
|
|
48
|
+
* 0..1 fraction (0 idle, 1 exhausted). null = no opinion: the model declares no
|
|
49
|
+
* window limits, has no routable key to measure, or the database is unreachable.
|
|
50
|
+
*
|
|
51
|
+
* Which key's numbers to report matters, and the answer is the same one the
|
|
52
|
+
* dashboard's usage badge settled on (#921): the guardrail asks "how close is
|
|
53
|
+
* this model to being unroutable", so it must follow the key the router would
|
|
54
|
+
* pick NEXT, not the worst key on the account. A platform with one exhausted
|
|
55
|
+
* key and one idle key routes perfectly well, so we take the ELIGIBLE key with
|
|
56
|
+
* the MOST headroom.
|
|
57
|
+
*
|
|
58
|
+
* In-flight leases are deliberately not counted. They exist to close the
|
|
59
|
+
* check-then-act race on the hard gates; this is a steering signal averaged over
|
|
60
|
+
* a whole window, and folding a per-request quantity into a cached snapshot
|
|
61
|
+
* would buy noise, not accuracy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function modelWindowUsedFraction(model: {
|
|
64
|
+
platform: string;
|
|
65
|
+
modelId: string;
|
|
66
|
+
keyId?: number | null;
|
|
67
|
+
}, limits: WindowLimits, now?: number): number | null;
|
|
68
|
+
export declare function getProviderDailyRequestCap(platform: string): number | null;
|
|
69
|
+
/** Account-wide requests-per-minute cap, or null when the provider has none.
|
|
70
|
+
* `PROVIDER_MINUTE_REQUEST_CAP_<PLATFORM>=0` disables the gate for that platform. */
|
|
71
|
+
export declare function getProviderMinuteRequestCap(platform: string): number | null;
|
|
72
|
+
export declare function getProviderDailyTokenCap(platform: string): number | null;
|
|
73
|
+
export declare function providerDailyRequestCount(platform: string, keyId: number, now?: number): number;
|
|
74
|
+
export declare function canUseProvider(platform: string, keyId: number, now?: number): boolean;
|
|
75
|
+
/** Requests in the last minute for a provider account+key, across every model. */
|
|
76
|
+
export declare function providerMinuteRequestCount(platform: string, keyId: number, now?: number): number;
|
|
77
|
+
export declare function canUseProviderMinute(platform: string, keyId: number, now?: number): boolean;
|
|
78
|
+
export declare function providerDailyTokenCount(platform: string, keyId: number, now?: number): number;
|
|
79
|
+
export declare function canUseProviderTokens(platform: string, keyId: number, modelId: string, estimatedTokens: number, now?: number): boolean;
|
|
80
|
+
export declare function recordRequest(platform: string, modelId: string, keyId: number): void;
|
|
81
|
+
export declare function recordTokens(platform: string, modelId: string, keyId: number, tokens: number): void;
|
|
82
|
+
export type CooldownSource = 'heuristic' | 'authoritative' | 'credit' | 'tier';
|
|
83
|
+
export declare const COOLDOWN_CEILING_KEY = "routing_cooldown_ceiling_ms";
|
|
84
|
+
export declare const MIN_COOLDOWN_CEILING_MS: number;
|
|
85
|
+
export declare const MAX_COOLDOWN_CEILING_MS: number;
|
|
86
|
+
/** The configured ceiling in ms, or null when unset/invalid (no cap). Read
|
|
87
|
+
* through a try/catch like every other DB touch in this module so a failure
|
|
88
|
+
* before the DB is ready degrades to "no cap" instead of throwing mid-route. */
|
|
89
|
+
export declare function getCooldownCeilingMs(): number | null;
|
|
90
|
+
/** null clears the ceiling (back to the uncapped ladder). */
|
|
91
|
+
export declare function setCooldownCeilingMs(value: number | null): void;
|
|
92
|
+
/** Apply the operator ceiling to one of OUR heuristic bench durations. */
|
|
93
|
+
export declare function capCooldownMs(durationMs: number): number;
|
|
94
|
+
export declare function getNextCooldownDuration(platform: string, modelId: string, keyId: number): number;
|
|
95
|
+
export declare const PAYMENT_REQUIRED_COOLDOWN_MS: number;
|
|
96
|
+
/** The 402 bench with the operator ceiling applied (#952). */
|
|
97
|
+
export declare function getPaymentRequiredCooldownMs(): number;
|
|
98
|
+
export declare const MODEL_FORBIDDEN_COOLDOWN_MS: number;
|
|
99
|
+
/** The 403 tier bench with the operator ceiling applied (#952). */
|
|
100
|
+
export declare function getModelForbiddenCooldownMs(): number;
|
|
101
|
+
export declare function recentHitCount(platform: string, modelId: string, keyId: number, now: number, windowMs?: number): number;
|
|
102
|
+
export interface CooldownDecision {
|
|
103
|
+
durationMs: number;
|
|
104
|
+
source: CooldownSource;
|
|
105
|
+
}
|
|
106
|
+
export declare const LOCAL_ENDPOINT_COOLDOWN_MS = 5000;
|
|
107
|
+
export declare function isLocalEndpointKey(keyId: number): boolean;
|
|
108
|
+
/** Test hook: the locality verdict is cached per key id for the process
|
|
109
|
+
* lifetime (see above); tests that rewrite api_keys rows need a reset. */
|
|
110
|
+
export declare function resetKeyLocalityCache(): void;
|
|
111
|
+
export interface CooldownLimitOptions {
|
|
112
|
+
/** Whether the triggering failure is an actual provider quota signal (a real
|
|
113
|
+
* 429 / rate-limit-classified error — see isRateLimitSignal in
|
|
114
|
+
* lib/error-classify.ts). Timeouts, 5xx and transport errors are retryable
|
|
115
|
+
* but carry no quota information, so they must not feed the null-limits
|
|
116
|
+
* exhaustion heuristic below (#592) — they get the short transient bench.
|
|
117
|
+
* Defaults to true: legacy callers without error context (fusion's
|
|
118
|
+
* empty-completion benches) keep their pre-#592 behavior. */
|
|
119
|
+
quotaSignal?: boolean;
|
|
120
|
+
}
|
|
121
|
+
export declare function getCooldownDurationForLimit(platform: string, modelId: string, keyId: number, limits: {
|
|
122
|
+
rpd: number | null;
|
|
123
|
+
tpd: number | null;
|
|
124
|
+
}, retryAfterMs?: number | null, opts?: CooldownLimitOptions): number;
|
|
125
|
+
/**
|
|
126
|
+
* Same verdict as getCooldownDurationForLimit, plus the provenance the
|
|
127
|
+
* cooldown-probe recovery job needs: 'authoritative' when an explicit provider
|
|
128
|
+
* Retry-After actually determined the expiry (a fact — never probed early),
|
|
129
|
+
* 'heuristic' when the duration is our own transient/escalation guess (probe-
|
|
130
|
+
* eligible). A Retry-After SHORTER than our bench does not make the cooldown
|
|
131
|
+
* authoritative: everything past the provider's own retry time is our guess.
|
|
132
|
+
*/
|
|
133
|
+
export declare function getCooldownDecisionForLimit(platform: string, modelId: string, keyId: number, limits: {
|
|
134
|
+
rpd: number | null;
|
|
135
|
+
tpd: number | null;
|
|
136
|
+
}, retryAfterMs?: number | null, opts?: CooldownLimitOptions): CooldownDecision;
|
|
137
|
+
/**
|
|
138
|
+
* Delete every already-expired cooldown, on disk and in memory, and return how
|
|
139
|
+
* many rows went. Expiry is otherwise purely lazy: isOnCooldown drops a row only
|
|
140
|
+
* when something asks about that exact (platform, model, key), so a row whose
|
|
141
|
+
* model was retired, whose key was deleted, or that simply outlived a process
|
|
142
|
+
* that had every route benched is never collected — the table only grows, and
|
|
143
|
+
* every cooldown query (status rollups, the probe scan, penalty inspector) pays
|
|
144
|
+
* for the dead rows. Called once at boot (index.ts) so a restart starts clean.
|
|
145
|
+
*/
|
|
146
|
+
export declare function cleanupExpiredCooldowns(now?: number): number;
|
|
147
|
+
export declare function setCooldown(platform: string, modelId: string, keyId: number, durationMs?: number, source?: CooldownSource): void;
|
|
148
|
+
export declare function isOnCooldown(platform: string, modelId: string, keyId: number): boolean;
|
|
149
|
+
export interface ActiveCooldown {
|
|
150
|
+
platform: string;
|
|
151
|
+
modelId: string;
|
|
152
|
+
keyId: number;
|
|
153
|
+
expiresAtMs: number;
|
|
154
|
+
remainingMs: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Active cooldowns for the given keys, grouped by key id. Batched into one query
|
|
158
|
+
* so the dashboard can render "why is this key idle?" without N round-trips.
|
|
159
|
+
* Without this, a key benched by an escalated cooldown (up to 24h) is invisible:
|
|
160
|
+
* it reads as healthy and enabled while the router silently skips it.
|
|
161
|
+
*/
|
|
162
|
+
export declare function getActiveCooldownsForKeys(keyIds: number[], now?: number): Map<number, ActiveCooldown[]>;
|
|
163
|
+
/**
|
|
164
|
+
* Drop every cooldown for one key, in memory and on disk, and return how many
|
|
165
|
+
* were cleared. Escalated cooldowns can bench a key for up to 24h off a single
|
|
166
|
+
* bad window; an operator who has fixed the cause (raised a quota, waited out a
|
|
167
|
+
* provider incident) otherwise has no way back except restarting and waiting.
|
|
168
|
+
*/
|
|
169
|
+
export declare function clearCooldownsForKey(keyId: number): number;
|
|
170
|
+
/**
|
|
171
|
+
* Drop EVERY cooldown (all keys, all models), the escalation-ladder counters
|
|
172
|
+
* and the null-limits hit windows — the "my whole pool is stuck" escape hatch
|
|
173
|
+
* (#952). Returns how many active benches were lifted. Penalties and the
|
|
174
|
+
* model-failure windows live elsewhere; services/penalty-inspector.ts
|
|
175
|
+
* composes all three into one clear.
|
|
176
|
+
*/
|
|
177
|
+
export declare function clearAllCooldowns(now?: number): number;
|
|
178
|
+
export interface ProbeableCooldown {
|
|
179
|
+
platform: string;
|
|
180
|
+
modelId: string;
|
|
181
|
+
keyId: number;
|
|
182
|
+
expiresAtMs: number;
|
|
183
|
+
setAtMs: number | null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Active cooldowns whose expiry is OUR OWN guess ('heuristic'), i.e. the only
|
|
187
|
+
* ones probe-based early recovery may touch. Authoritative/credit/tier rows are
|
|
188
|
+
* excluded at the query so the prober cannot even see them. Deliberately
|
|
189
|
+
* DB-only, no in-memory fallback: the probe job is a best-effort optimisation,
|
|
190
|
+
* and when the DB is unavailable the right amount of probing is none.
|
|
191
|
+
*/
|
|
192
|
+
export declare function getProbeableCooldowns(now?: number): ProbeableCooldown[];
|
|
193
|
+
/**
|
|
194
|
+
* Clear ONE model+key cooldown before its timer expires, after a probe showed
|
|
195
|
+
* the key is serving again. Narrower than clearCooldownsForKey (the operator
|
|
196
|
+
* override): the escalation history in cooldownHits is deliberately kept, so a
|
|
197
|
+
* key that 429s again right after an early recovery re-enters the ladder where
|
|
198
|
+
* it left off instead of starting back at 2 minutes.
|
|
199
|
+
*/
|
|
200
|
+
export declare function clearCooldownEarly(platform: string, modelId: string, keyId: number): void;
|
|
201
|
+
/**
|
|
202
|
+
* Soonest moment any active cooldown expires, in ms since epoch, or null when
|
|
203
|
+
* nothing is cooling down. Used to tell an exhausted caller roughly when to
|
|
204
|
+
* retry (#423) instead of the bare "wait for rate limits to reset".
|
|
205
|
+
*/
|
|
206
|
+
export declare function getSoonestCooldownExpiry(now?: number): number | null;
|
|
207
|
+
export declare function getRateLimitStatus(platform: string, modelId: string, keyId: number, limits: {
|
|
208
|
+
rpm: number | null;
|
|
209
|
+
rpd: number | null;
|
|
210
|
+
tpm: number | null;
|
|
211
|
+
tpd: number | null;
|
|
212
|
+
}): {
|
|
213
|
+
rpm: {
|
|
214
|
+
used: number;
|
|
215
|
+
limit: number | null;
|
|
216
|
+
};
|
|
217
|
+
rpd: {
|
|
218
|
+
used: number;
|
|
219
|
+
limit: number | null;
|
|
220
|
+
};
|
|
221
|
+
tpm: {
|
|
222
|
+
used: number;
|
|
223
|
+
limit: number | null;
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
export type LearnedLimitKind = 'tpm' | 'tpd' | 'rpm' | 'rpd';
|
|
227
|
+
export interface LearnedLimit {
|
|
228
|
+
kind: LearnedLimitKind;
|
|
229
|
+
limit: number;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Pure parser: pull a provider-reported ceiling out of an error message. Returns
|
|
233
|
+
* null unless BOTH a numeric "Limit N" and a confident axis (TPM/TPD/RPM/RPD)
|
|
234
|
+
* are present — guessing the axis would write the wrong column and mis-route
|
|
235
|
+
* every future request, so we refuse to guess.
|
|
236
|
+
*/
|
|
237
|
+
export declare function parseProviderLimit(message: string | undefined | null): LearnedLimit | null;
|
|
238
|
+
/**
|
|
239
|
+
* Persist a provider-reported limit onto the model row, but ONLY when it makes
|
|
240
|
+
* us more conservative: fill a NULL (unknown) limit, or LOWER an existing one
|
|
241
|
+
* that was too high. Never raises a limit — hitting a ceiling means our pre-check
|
|
242
|
+
* already let too much through, so the true limit is at or below what we used.
|
|
243
|
+
* Returns the learned limit when a row was actually changed, else null.
|
|
244
|
+
* DB-guarded (no-op when the DB is unavailable), like the rest of this module.
|
|
245
|
+
*/
|
|
246
|
+
export declare function learnLimitFromError(modelDbId: number, err: {
|
|
247
|
+
message?: string;
|
|
248
|
+
}): LearnedLimit | null;
|
|
249
|
+
//# sourceMappingURL=ratelimit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ratelimit.d.ts","sourceRoot":"","sources":["../../src/services/ratelimit.ts"],"names":[],"mappings":"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"}
|