@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,49 @@
|
|
|
1
|
+
import type { ChatMessage } from '@srouter/shared/types.js';
|
|
2
|
+
/** Replay window for completed idempotent responses (default 24h). */
|
|
3
|
+
export declare function idempotencyTtlMs(): number;
|
|
4
|
+
export declare function hashIdempotencyKey(key: string): string;
|
|
5
|
+
/** Canonical fingerprint of the request content that produced a response. */
|
|
6
|
+
export declare function computeIdempotencyFingerprint(input: {
|
|
7
|
+
model?: string;
|
|
8
|
+
messages: ChatMessage[];
|
|
9
|
+
temperature?: number | null;
|
|
10
|
+
top_p?: number | null;
|
|
11
|
+
max_tokens?: number | null;
|
|
12
|
+
tools?: unknown;
|
|
13
|
+
tool_choice?: unknown;
|
|
14
|
+
}): string;
|
|
15
|
+
export type IdempotencyClaimResult = {
|
|
16
|
+
kind: 'replay';
|
|
17
|
+
status: number;
|
|
18
|
+
body: unknown;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'conflict';
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'miss';
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Attempt to claim a completed idempotent response for the given key hash.
|
|
26
|
+
*
|
|
27
|
+
* Returns:
|
|
28
|
+
* - { kind: 'replay', ... } when a completed claim with the SAME fingerprint
|
|
29
|
+
* exists and is still inside the replay window — the caller should replay
|
|
30
|
+
* it verbatim without touching a provider.
|
|
31
|
+
* - { kind: 'conflict' } when a completed claim exists but its fingerprint
|
|
32
|
+
* differs — the caller must return 409 idempotency_key_conflict.
|
|
33
|
+
* - { kind: 'miss' } when there is no usable claim — proceed normally and
|
|
34
|
+
* persist the result on success.
|
|
35
|
+
*/
|
|
36
|
+
export declare function lookupIdempotencyReplay(keyHash: string, fingerprint: string, now?: number): IdempotencyClaimResult;
|
|
37
|
+
/**
|
|
38
|
+
* Persist a completed response for future replays. Replaces any previous claim
|
|
39
|
+
* for the same key hash. Expired rows are swept lazily for this key first.
|
|
40
|
+
*/
|
|
41
|
+
export declare function storeIdempotencyResult(keyHash: string, fingerprint: string, status: number, body: unknown, executionId?: string, now?: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* Delete an idempotency claim (e.g. after a failed generation that the caller
|
|
44
|
+
* does not want replayed). Fail-safe.
|
|
45
|
+
*/
|
|
46
|
+
export declare function clearIdempotencyResult(keyHash: string): void;
|
|
47
|
+
/** Normalize an Idempotency-Key header: trim, non-empty, ≤ 255 UTF-8 bytes. */
|
|
48
|
+
export declare function normalizeIdempotencyKey(raw: string | string[] | undefined): string | null;
|
|
49
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/services/idempotency.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAW5D,sEAAsE;AACtE,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,CAWT;AAID,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,GAAG,SAAa,GACf,sBAAsB,CAwBxB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,GAAG,SAAa,GACf,IAAI,CA6BN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM5D;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMzF"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Idempotency-Key support for non-streaming chat requests.
|
|
2
|
+
//
|
|
3
|
+
// Free-tier quota is a scarce asset: a client that times out and retries the
|
|
4
|
+
// same non-streaming request currently burns a second free-tier slot for an
|
|
5
|
+
// answer it already received. This module lets callers opt in to idempotent
|
|
6
|
+
// retries via the `Idempotency-Key` header:
|
|
7
|
+
//
|
|
8
|
+
// - Only a SHA-256 hash of the caller's key is stored, never the raw key.
|
|
9
|
+
// - A request fingerprint (canonical SHA-256 of model + messages + sampling
|
|
10
|
+
// params) is bound to the key, so reusing the same key with different
|
|
11
|
+
// content is a 409 conflict, not a silent wrong answer.
|
|
12
|
+
// - On success the original HTTP status + body are persisted to SQLite and
|
|
13
|
+
// replayed for later requests with the same key + fingerprint — zero
|
|
14
|
+
// provider cost, mirroring what the response cache does for exact-match
|
|
15
|
+
// hits, but scoped per caller (key) instead of per request content.
|
|
16
|
+
// - A duplicate that arrives while the original request is still running is
|
|
17
|
+
// NOT deduplicated: only completed responses are claimed, so both attempts
|
|
18
|
+
// execute. Guarding the in-flight window needs a pending-claim state with
|
|
19
|
+
// its own (short) TTL so a crash cannot wedge a key for a day; that is
|
|
20
|
+
// deliberately out of scope here.
|
|
21
|
+
//
|
|
22
|
+
// Storage is the idempotency_claims table (see db/migrations). All writes are
|
|
23
|
+
// guarded so a DB failure degrades to "no idempotency" rather than throwing in
|
|
24
|
+
// the proxy hot path (mirrors services/cache.ts).
|
|
25
|
+
import crypto from 'crypto';
|
|
26
|
+
import { getDb } from '../db/index.js';
|
|
27
|
+
// ── Config (read per call so tests can flip it live) ──
|
|
28
|
+
function envNum(name, fallback) {
|
|
29
|
+
const raw = process.env[name];
|
|
30
|
+
if (raw === undefined || raw.trim() === '')
|
|
31
|
+
return fallback;
|
|
32
|
+
const n = Number(raw);
|
|
33
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
34
|
+
}
|
|
35
|
+
/** Replay window for completed idempotent responses (default 24h). */
|
|
36
|
+
export function idempotencyTtlMs() {
|
|
37
|
+
return envNum('IDEMPOTENCY_TTL_MS', 24 * 60 * 60 * 1000);
|
|
38
|
+
}
|
|
39
|
+
// ── Key / fingerprint helpers ──
|
|
40
|
+
export function hashIdempotencyKey(key) {
|
|
41
|
+
return crypto.createHash('sha256').update(key).digest('hex');
|
|
42
|
+
}
|
|
43
|
+
/** Canonical fingerprint of the request content that produced a response. */
|
|
44
|
+
export function computeIdempotencyFingerprint(input) {
|
|
45
|
+
const stable = JSON.stringify({
|
|
46
|
+
model: input.model ?? null,
|
|
47
|
+
messages: input.messages,
|
|
48
|
+
temperature: input.temperature ?? null,
|
|
49
|
+
top_p: input.top_p ?? null,
|
|
50
|
+
max_tokens: input.max_tokens ?? null,
|
|
51
|
+
tools: input.tools ?? null,
|
|
52
|
+
tool_choice: input.tool_choice ?? null,
|
|
53
|
+
});
|
|
54
|
+
return crypto.createHash('sha256').update(stable).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Attempt to claim a completed idempotent response for the given key hash.
|
|
58
|
+
*
|
|
59
|
+
* Returns:
|
|
60
|
+
* - { kind: 'replay', ... } when a completed claim with the SAME fingerprint
|
|
61
|
+
* exists and is still inside the replay window — the caller should replay
|
|
62
|
+
* it verbatim without touching a provider.
|
|
63
|
+
* - { kind: 'conflict' } when a completed claim exists but its fingerprint
|
|
64
|
+
* differs — the caller must return 409 idempotency_key_conflict.
|
|
65
|
+
* - { kind: 'miss' } when there is no usable claim — proceed normally and
|
|
66
|
+
* persist the result on success.
|
|
67
|
+
*/
|
|
68
|
+
export function lookupIdempotencyReplay(keyHash, fingerprint, now = Date.now()) {
|
|
69
|
+
try {
|
|
70
|
+
const db = getDb();
|
|
71
|
+
const row = db.prepare(`SELECT request_fingerprint, response_status, response_body
|
|
72
|
+
FROM idempotency_claims
|
|
73
|
+
WHERE key_hash = ? AND expires_at_ms > ?`).get(keyHash, now);
|
|
74
|
+
if (!row)
|
|
75
|
+
return { kind: 'miss' };
|
|
76
|
+
if (row.request_fingerprint !== fingerprint)
|
|
77
|
+
return { kind: 'conflict' };
|
|
78
|
+
let body;
|
|
79
|
+
try {
|
|
80
|
+
body = JSON.parse(row.response_body);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Corrupt stored body — treat as a miss and let the caller regenerate.
|
|
84
|
+
return { kind: 'miss' };
|
|
85
|
+
}
|
|
86
|
+
return { kind: 'replay', status: row.response_status, body };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// DB unavailable: degrade to no idempotency rather than failing the request.
|
|
90
|
+
return { kind: 'miss' };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Persist a completed response for future replays. Replaces any previous claim
|
|
95
|
+
* for the same key hash. Expired rows are swept lazily for this key first.
|
|
96
|
+
*/
|
|
97
|
+
export function storeIdempotencyResult(keyHash, fingerprint, status, body, executionId, now = Date.now()) {
|
|
98
|
+
try {
|
|
99
|
+
const db = getDb();
|
|
100
|
+
const ttl = idempotencyTtlMs();
|
|
101
|
+
db.prepare('DELETE FROM idempotency_claims WHERE key_hash = ? AND expires_at_ms <= ?')
|
|
102
|
+
.run(keyHash, now);
|
|
103
|
+
db.prepare(`INSERT INTO idempotency_claims
|
|
104
|
+
(key_hash, request_fingerprint, response_status, response_body, execution_id, created_at_ms, expires_at_ms)
|
|
105
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
106
|
+
ON CONFLICT(key_hash) DO UPDATE SET
|
|
107
|
+
request_fingerprint = excluded.request_fingerprint,
|
|
108
|
+
response_status = excluded.response_status,
|
|
109
|
+
response_body = excluded.response_body,
|
|
110
|
+
execution_id = excluded.execution_id,
|
|
111
|
+
created_at_ms = excluded.created_at_ms,
|
|
112
|
+
expires_at_ms = excluded.expires_at_ms`).run(keyHash, fingerprint, status, JSON.stringify(body), executionId ?? null, now, now + ttl);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// DB unavailable: idempotency is best-effort; the response already went out.
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Delete an idempotency claim (e.g. after a failed generation that the caller
|
|
120
|
+
* does not want replayed). Fail-safe.
|
|
121
|
+
*/
|
|
122
|
+
export function clearIdempotencyResult(keyHash) {
|
|
123
|
+
try {
|
|
124
|
+
getDb().prepare('DELETE FROM idempotency_claims WHERE key_hash = ?').run(keyHash);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// best-effort
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Normalize an Idempotency-Key header: trim, non-empty, ≤ 255 UTF-8 bytes. */
|
|
131
|
+
export function normalizeIdempotencyKey(raw) {
|
|
132
|
+
if (raw === undefined)
|
|
133
|
+
return null;
|
|
134
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
135
|
+
const trimmed = (value ?? '').trim();
|
|
136
|
+
if (!trimmed || Buffer.byteLength(trimmed, 'utf8') > 255)
|
|
137
|
+
return null;
|
|
138
|
+
return trimmed;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/services/idempotency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { BudgetPeriod, ConcreteBudgetPeriod, BudgetPeriodSource } from '@srouter/shared/types.js';
|
|
2
|
+
/** Re-exported so consumers can import the shared types from here. */
|
|
3
|
+
export type { BudgetPeriod, ConcreteBudgetPeriod, BudgetPeriodSource };
|
|
4
|
+
export declare const BUDGET_PERIODS: readonly ConcreteBudgetPeriod[];
|
|
5
|
+
export declare function asBudgetPeriod(raw: unknown): BudgetPeriod;
|
|
6
|
+
/** Cast a stored/external value to a concrete period (auto is never stored). */
|
|
7
|
+
export declare function asConcreteBudgetPeriod(raw: unknown): ConcreteBudgetPeriod;
|
|
8
|
+
/** Resolve the auto budget period for a platform from the catalog. */
|
|
9
|
+
export declare function resolveAutoPeriod(platform: string): {
|
|
10
|
+
period: ConcreteBudgetPeriod;
|
|
11
|
+
source: BudgetPeriodSource;
|
|
12
|
+
};
|
|
13
|
+
/** Synchronize an auto-mode key's concrete period with the catalog. */
|
|
14
|
+
export declare function syncAutoBudgetPeriod(keyId: number): {
|
|
15
|
+
mode: 'auto' | 'manual';
|
|
16
|
+
period: ConcreteBudgetPeriod;
|
|
17
|
+
source: BudgetPeriodSource;
|
|
18
|
+
};
|
|
19
|
+
export interface MonthlyBudgetCaps {
|
|
20
|
+
/** 0 = unlimited (the default, unchanged behaviour). */
|
|
21
|
+
requestCap: number;
|
|
22
|
+
/** 0 = unlimited. */
|
|
23
|
+
tokenCap: number;
|
|
24
|
+
/** UTC window the caps are counted against. */
|
|
25
|
+
period: ConcreteBudgetPeriod;
|
|
26
|
+
/** Whether the period is auto-resolved or manually chosen. */
|
|
27
|
+
mode: 'auto' | 'manual';
|
|
28
|
+
/** For 'auto': why the period was chosen. */
|
|
29
|
+
source: BudgetPeriodSource;
|
|
30
|
+
}
|
|
31
|
+
export interface MonthlyUsage {
|
|
32
|
+
/** Successful requests in the current period. */
|
|
33
|
+
requests: number;
|
|
34
|
+
/** Sum of (input_tokens + output_tokens) over those successes. */
|
|
35
|
+
tokens: number;
|
|
36
|
+
}
|
|
37
|
+
export type BudgetVerdict = {
|
|
38
|
+
allowed: true;
|
|
39
|
+
} | {
|
|
40
|
+
allowed: false;
|
|
41
|
+
reason: 'monthly_request_cap' | 'monthly_token_cap';
|
|
42
|
+
retryAfterSec: number;
|
|
43
|
+
};
|
|
44
|
+
/** Ledger bucket for a period at `now` — must match the trigger's SQL. */
|
|
45
|
+
export declare function periodBucket(period: ConcreteBudgetPeriod, now?: number): string;
|
|
46
|
+
export declare function getMonthlyBudgetCaps(keyId: number): MonthlyBudgetCaps;
|
|
47
|
+
export declare function setMonthlyBudgetCaps(keyId: number, patch: Partial<Pick<MonthlyBudgetCaps, 'requestCap' | 'tokenCap'>>): boolean;
|
|
48
|
+
export declare function getMonthlyUsage(keyId: number, period?: ConcreteBudgetPeriod, now?: number): MonthlyUsage;
|
|
49
|
+
/**
|
|
50
|
+
* Check a key against its caps, taking the current period's successful usage
|
|
51
|
+
* plus the tokens THIS request would add. Returns allowed when both caps are
|
|
52
|
+
* 0 (unlimited) or neither would be exceeded.
|
|
53
|
+
*/
|
|
54
|
+
export declare function checkMonthlyBudget(keyId: number, estimatedTokens: number, now?: number): BudgetVerdict;
|
|
55
|
+
/** Check and reserve synchronously before dispatch; release on every terminal path. */
|
|
56
|
+
export declare function reserveMonthlyBudget(keyId: number, estimatedTokens: number): {
|
|
57
|
+
allowed: true;
|
|
58
|
+
release: () => void;
|
|
59
|
+
} | Extract<BudgetVerdict, {
|
|
60
|
+
allowed: false;
|
|
61
|
+
}>;
|
|
62
|
+
/** Seconds from `now` until the next boundary of the period — the Retry-After value. */
|
|
63
|
+
export declare function secondsUntilNextPeriod(period: ConcreteBudgetPeriod, now?: number): number;
|
|
64
|
+
/** Seconds from `now` until the next UTC month boundary (monthly default). */
|
|
65
|
+
export declare function secondsUntilNextMonth(now?: number): number;
|
|
66
|
+
/** ISO timestamp of the next period boundary (for headers / diagnostics). */
|
|
67
|
+
export declare function nextResetAt(period: ConcreteBudgetPeriod, now?: number): string;
|
|
68
|
+
/** ISO timestamp of the next UTC month boundary (monthly default). */
|
|
69
|
+
export declare function nextMonthResetAt(now?: number): string;
|
|
70
|
+
/** Soonest period boundary among the keys currently blocked by their caps —
|
|
71
|
+
* what the routing exhaustion body advertises as the retry time. Falls back
|
|
72
|
+
* to the next month when no capped key is blocked. */
|
|
73
|
+
export declare function soonestBudgetResetAt(now?: number): string;
|
|
74
|
+
//# sourceMappingURL=key-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-budget.d.ts","sourceRoot":"","sources":["../../src/services/key-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-key budget (#1158, period-aware): optional request/token caps per
|
|
3
|
+
* api_keys row, enforced against the CURRENT UTC period's successful
|
|
4
|
+
* requests. The period is chosen per key to match the provider's reset
|
|
5
|
+
* cycle: daily (next 00:00 UTC), weekly (next Monday 00:00 UTC) or monthly
|
|
6
|
+
* (1st 00:00 UTC, the original behaviour and the default).
|
|
7
|
+
*
|
|
8
|
+
* A key at its cap returns `quota_exceeded` (429) with a Retry-After of
|
|
9
|
+
* "seconds until the next period boundary" — the semantic GateLLM-style
|
|
10
|
+
* rejection so an agent knows when the window resets instead of hammering
|
|
11
|
+
* a 429.
|
|
12
|
+
*
|
|
13
|
+
* Successful usage is retained in key_monthly_usage independently of
|
|
14
|
+
* analytics retention. Buckets are namespaced per period ('d:YYYY-MM-DD',
|
|
15
|
+
* 'w:YYYY-MM-DD' Monday, bare 'YYYY-MM' month) so switching a key's period
|
|
16
|
+
* starts the new counter at zero instead of reinterpreting old rows — see
|
|
17
|
+
* migration 20261005_000001_key_budget_period, whose trigger mirrors
|
|
18
|
+
* periodBucket() exactly. Active requests reserve their estimated tokens
|
|
19
|
+
* until their route is released. Actual provider usage is settled by the
|
|
20
|
+
* request-log transaction; token estimates are an admission guard, not an
|
|
21
|
+
* exact upstream billing cap. Caps are opt-in (0 = unlimited).
|
|
22
|
+
*
|
|
23
|
+
* AUTO MODE: a key may leave its period to the provider's catalog
|
|
24
|
+
* declaration (`budget_period_mode = 'auto'`). resolveAutoPeriod() reads the
|
|
25
|
+
* `models` table for that platform — a per-day limit field (tpd_limit or
|
|
26
|
+
* rpd_limit) means the provider resets daily, a non-empty
|
|
27
|
+
* monthly_token_budget means a monthly allowance, otherwise the unknown
|
|
28
|
+
* fallback is monthly. The resolved CONCRETE period is written into
|
|
29
|
+
* `budget_period` (the trigger reads that column and must stay concrete —
|
|
30
|
+
* 'auto' is never stored there); `budget_period_mode` stays 'auto' so the
|
|
31
|
+
* UI can tell a resolved key from a manually-picked one. Weekly is never
|
|
32
|
+
* produced by auto resolution: the catalog carries no weekly field, so
|
|
33
|
+
* weekly remains a manual choice only.
|
|
34
|
+
*/
|
|
35
|
+
import { getDb } from '../db/index.js';
|
|
36
|
+
export const BUDGET_PERIODS = ['daily', 'weekly', 'monthly'];
|
|
37
|
+
export function asBudgetPeriod(raw) {
|
|
38
|
+
return raw === 'daily' || raw === 'weekly' || raw === 'monthly' ? raw : 'monthly';
|
|
39
|
+
}
|
|
40
|
+
/** Cast a stored/external value to a concrete period (auto is never stored). */
|
|
41
|
+
export function asConcreteBudgetPeriod(raw) {
|
|
42
|
+
return raw === 'daily' || raw === 'weekly' ? raw : 'monthly';
|
|
43
|
+
}
|
|
44
|
+
/** Resolve the auto budget period for a platform from the catalog. */
|
|
45
|
+
export function resolveAutoPeriod(platform) {
|
|
46
|
+
const db = getDb();
|
|
47
|
+
const row = db.prepare(`SELECT
|
|
48
|
+
EXISTS(SELECT 1 FROM models WHERE platform = ? AND (tpd_limit IS NOT NULL OR rpd_limit IS NOT NULL)) AS has_daily,
|
|
49
|
+
EXISTS(SELECT 1 FROM models WHERE platform = ? AND monthly_token_budget <> '') AS has_monthly`).get(platform, platform);
|
|
50
|
+
if (row.has_daily)
|
|
51
|
+
return { period: 'daily', source: 'daily-limit' };
|
|
52
|
+
if (row.has_monthly)
|
|
53
|
+
return { period: 'monthly', source: 'monthly-label' };
|
|
54
|
+
return { period: 'monthly', source: 'fallback' };
|
|
55
|
+
}
|
|
56
|
+
/** Synchronize an auto-mode key's concrete period with the catalog. */
|
|
57
|
+
export function syncAutoBudgetPeriod(keyId) {
|
|
58
|
+
const row = getDb().prepare('SELECT platform, budget_period, budget_period_mode FROM api_keys WHERE id = ?').get(keyId);
|
|
59
|
+
if (!row)
|
|
60
|
+
return { mode: 'manual', period: 'monthly', source: 'manual' };
|
|
61
|
+
if (row.budget_period_mode === 'manual') {
|
|
62
|
+
return { mode: 'manual', period: asConcreteBudgetPeriod(row.budget_period), source: 'manual' };
|
|
63
|
+
}
|
|
64
|
+
const resolved = resolveAutoPeriod(row.platform);
|
|
65
|
+
if (resolved.period !== row.budget_period) {
|
|
66
|
+
getDb().prepare('UPDATE api_keys SET budget_period = ? WHERE id = ?').run(resolved.period, keyId);
|
|
67
|
+
}
|
|
68
|
+
return { mode: 'auto', period: resolved.period, source: resolved.source };
|
|
69
|
+
}
|
|
70
|
+
/** Ledger bucket for a period at `now` — must match the trigger's SQL. */
|
|
71
|
+
export function periodBucket(period, now = Date.now()) {
|
|
72
|
+
const d = new Date(now);
|
|
73
|
+
if (period === 'monthly')
|
|
74
|
+
return d.toISOString().slice(0, 7);
|
|
75
|
+
const day = d.toISOString().slice(0, 10);
|
|
76
|
+
if (period === 'daily')
|
|
77
|
+
return `d:${day}`;
|
|
78
|
+
const mondayMs = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() - ((d.getUTCDay() + 6) % 7));
|
|
79
|
+
return `w:${new Date(mondayMs).toISOString().slice(0, 10)}`;
|
|
80
|
+
}
|
|
81
|
+
function utcNextPeriodStartMs(period, now) {
|
|
82
|
+
const d = new Date(now);
|
|
83
|
+
if (period === 'monthly') {
|
|
84
|
+
const month = d.getUTCMonth() + 1;
|
|
85
|
+
return Date.UTC(d.getUTCFullYear() + Math.floor(month / 12), month % 12, 1);
|
|
86
|
+
}
|
|
87
|
+
if (period === 'daily') {
|
|
88
|
+
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() + 1);
|
|
89
|
+
}
|
|
90
|
+
// weekly: Monday of this UTC week + 7 days
|
|
91
|
+
const mondayDate = d.getUTCDate() - ((d.getUTCDay() + 6) % 7);
|
|
92
|
+
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), mondayDate + 7);
|
|
93
|
+
}
|
|
94
|
+
// These requests belong to this process and remain reserved until completion,
|
|
95
|
+
// even if a stream outlives the short rate-limit lease timeout. A restarted
|
|
96
|
+
// process has no active requests; completed usage remains in SQLite.
|
|
97
|
+
const reservations = new WeakMap();
|
|
98
|
+
function activeReservations() {
|
|
99
|
+
const db = getDb();
|
|
100
|
+
let active = reservations.get(db);
|
|
101
|
+
if (!active) {
|
|
102
|
+
active = new Set();
|
|
103
|
+
reservations.set(db, active);
|
|
104
|
+
}
|
|
105
|
+
return active;
|
|
106
|
+
}
|
|
107
|
+
export function getMonthlyBudgetCaps(keyId) {
|
|
108
|
+
const sync = syncAutoBudgetPeriod(keyId);
|
|
109
|
+
const row = getDb().prepare('SELECT monthly_request_cap, monthly_token_cap FROM api_keys WHERE id = ?').get(keyId);
|
|
110
|
+
if (!row)
|
|
111
|
+
return { requestCap: 0, tokenCap: 0, period: 'monthly', mode: 'manual', source: 'manual' };
|
|
112
|
+
return { requestCap: row.monthly_request_cap, tokenCap: row.monthly_token_cap, period: sync.period, mode: sync.mode, source: sync.source };
|
|
113
|
+
}
|
|
114
|
+
export function setMonthlyBudgetCaps(keyId, patch) {
|
|
115
|
+
const sets = [];
|
|
116
|
+
const values = [];
|
|
117
|
+
if (patch.requestCap !== undefined) {
|
|
118
|
+
sets.push('monthly_request_cap = ?');
|
|
119
|
+
values.push(patch.requestCap);
|
|
120
|
+
}
|
|
121
|
+
if (patch.tokenCap !== undefined) {
|
|
122
|
+
sets.push('monthly_token_cap = ?');
|
|
123
|
+
values.push(patch.tokenCap);
|
|
124
|
+
}
|
|
125
|
+
if (sets.length === 0)
|
|
126
|
+
return false;
|
|
127
|
+
const result = getDb().prepare(`UPDATE api_keys SET ${sets.join(', ')} WHERE id = ?`).run(...values, keyId);
|
|
128
|
+
return result.changes > 0;
|
|
129
|
+
}
|
|
130
|
+
export function getMonthlyUsage(keyId, period = 'monthly', now = Date.now()) {
|
|
131
|
+
const row = getDb().prepare(`SELECT requests, tokens FROM key_monthly_usage WHERE key_id = ? AND month = ?`).get(keyId, periodBucket(period, now));
|
|
132
|
+
return { requests: Number(row?.requests ?? 0), tokens: Number(row?.tokens ?? 0) };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check a key against its caps, taking the current period's successful usage
|
|
136
|
+
* plus the tokens THIS request would add. Returns allowed when both caps are
|
|
137
|
+
* 0 (unlimited) or neither would be exceeded.
|
|
138
|
+
*/
|
|
139
|
+
export function checkMonthlyBudget(keyId, estimatedTokens, now = Date.now()) {
|
|
140
|
+
const caps = getMonthlyBudgetCaps(keyId);
|
|
141
|
+
if (caps.requestCap <= 0 && caps.tokenCap <= 0)
|
|
142
|
+
return { allowed: true };
|
|
143
|
+
const usage = getMonthlyUsage(keyId, caps.period, now);
|
|
144
|
+
for (const reservation of activeReservations()) {
|
|
145
|
+
if (reservation.keyId !== keyId)
|
|
146
|
+
continue;
|
|
147
|
+
usage.requests++;
|
|
148
|
+
usage.tokens += reservation.tokens;
|
|
149
|
+
}
|
|
150
|
+
if (caps.requestCap > 0 && usage.requests >= caps.requestCap) {
|
|
151
|
+
return { allowed: false, reason: 'monthly_request_cap', retryAfterSec: secondsUntilNextPeriod(caps.period, now) };
|
|
152
|
+
}
|
|
153
|
+
if (caps.tokenCap > 0 && (usage.tokens >= caps.tokenCap || usage.tokens + Math.max(0, estimatedTokens) > caps.tokenCap)) {
|
|
154
|
+
return { allowed: false, reason: 'monthly_token_cap', retryAfterSec: secondsUntilNextPeriod(caps.period, now) };
|
|
155
|
+
}
|
|
156
|
+
return { allowed: true };
|
|
157
|
+
}
|
|
158
|
+
/** Check and reserve synchronously before dispatch; release on every terminal path. */
|
|
159
|
+
export function reserveMonthlyBudget(keyId, estimatedTokens) {
|
|
160
|
+
const verdict = checkMonthlyBudget(keyId, estimatedTokens);
|
|
161
|
+
if (!verdict.allowed)
|
|
162
|
+
return verdict;
|
|
163
|
+
const active = activeReservations();
|
|
164
|
+
const reservation = { keyId, tokens: Math.max(0, estimatedTokens) };
|
|
165
|
+
active.add(reservation);
|
|
166
|
+
return { allowed: true, release: () => { active.delete(reservation); } };
|
|
167
|
+
}
|
|
168
|
+
/** Seconds from `now` until the next boundary of the period — the Retry-After value. */
|
|
169
|
+
export function secondsUntilNextPeriod(period, now = Date.now()) {
|
|
170
|
+
return Math.max(1, Math.floor((utcNextPeriodStartMs(period, now) - now) / 1000));
|
|
171
|
+
}
|
|
172
|
+
/** Seconds from `now` until the next UTC month boundary (monthly default). */
|
|
173
|
+
export function secondsUntilNextMonth(now = Date.now()) {
|
|
174
|
+
return secondsUntilNextPeriod('monthly', now);
|
|
175
|
+
}
|
|
176
|
+
/** ISO timestamp of the next period boundary (for headers / diagnostics). */
|
|
177
|
+
export function nextResetAt(period, now = Date.now()) {
|
|
178
|
+
return new Date(utcNextPeriodStartMs(period, now)).toISOString();
|
|
179
|
+
}
|
|
180
|
+
/** ISO timestamp of the next UTC month boundary (monthly default). */
|
|
181
|
+
export function nextMonthResetAt(now = Date.now()) {
|
|
182
|
+
return nextResetAt('monthly', now);
|
|
183
|
+
}
|
|
184
|
+
/** Soonest period boundary among the keys currently blocked by their caps —
|
|
185
|
+
* what the routing exhaustion body advertises as the retry time. Falls back
|
|
186
|
+
* to the next month when no capped key is blocked. */
|
|
187
|
+
export function soonestBudgetResetAt(now = Date.now()) {
|
|
188
|
+
const rows = getDb().prepare('SELECT id FROM api_keys WHERE monthly_request_cap > 0 OR monthly_token_cap > 0').all();
|
|
189
|
+
let soonestMs = utcNextPeriodStartMs('monthly', now);
|
|
190
|
+
for (const row of rows) {
|
|
191
|
+
const caps = getMonthlyBudgetCaps(row.id);
|
|
192
|
+
if (checkMonthlyBudget(row.id, 0, now).allowed)
|
|
193
|
+
continue;
|
|
194
|
+
const atMs = utcNextPeriodStartMs(caps.period, now);
|
|
195
|
+
if (atMs < soonestMs)
|
|
196
|
+
soonestMs = atMs;
|
|
197
|
+
}
|
|
198
|
+
return new Date(soonestMs).toISOString();
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=key-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-budget.js","sourceRoot":"","sources":["../../src/services/key-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/** Platforms with a media adapter below. catalog-sync gates media rows on this
|
|
2
|
+
* (decoupled from the chat provider registry — e.g. SiliconFlow is media-only). */
|
|
3
|
+
export declare const MEDIA_PLATFORMS: Set<string>;
|
|
4
|
+
/** Video uses a dedicated optional catalog registry so binaries that predate
|
|
5
|
+
* this modality ignore the rows instead of accidentally ingesting them as
|
|
6
|
+
* chat models. Keep its adapter allowlist separate for the same reason. */
|
|
7
|
+
export declare const VIDEO_PLATFORMS: Set<string>;
|
|
8
|
+
/** Platforms with a speech-to-text adapter below. catalog-sync gates the
|
|
9
|
+
* catalog's `transcriptionModels` entries on this, the way MEDIA_PLATFORMS
|
|
10
|
+
* gates the generative-media rows. */
|
|
11
|
+
export declare const TRANSCRIPTION_PLATFORMS: Set<string>;
|
|
12
|
+
export type MediaModality = 'image' | 'video' | 'audio' | 'transcription';
|
|
13
|
+
export interface MediaModelRow {
|
|
14
|
+
id: number;
|
|
15
|
+
platform: string;
|
|
16
|
+
model_id: string;
|
|
17
|
+
display_name: string;
|
|
18
|
+
modality: MediaModality;
|
|
19
|
+
priority: number;
|
|
20
|
+
enabled: number;
|
|
21
|
+
quota_label: string;
|
|
22
|
+
key_id: number | null;
|
|
23
|
+
meta_json: string | null;
|
|
24
|
+
}
|
|
25
|
+
export declare class MediaError extends Error {
|
|
26
|
+
status: number;
|
|
27
|
+
/** Optional machine-readable error code surfaced in the OpenAI-shaped body. */
|
|
28
|
+
code?: string;
|
|
29
|
+
/** Back-off the upstream provider stated (`Retry-After` header), in
|
|
30
|
+
* milliseconds — relayed to the client so an SDK sleeps the stated amount
|
|
31
|
+
* instead of hammering the chain, mirroring the embeddings path. */
|
|
32
|
+
retryAfterMs?: number;
|
|
33
|
+
constructor(message: string, status: number, code?: string, retryAfterMs?: number);
|
|
34
|
+
}
|
|
35
|
+
export interface ImageResult {
|
|
36
|
+
platform: string;
|
|
37
|
+
modelId: string;
|
|
38
|
+
images: Array<{
|
|
39
|
+
b64_json?: string;
|
|
40
|
+
url?: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface SpeechResult {
|
|
44
|
+
platform: string;
|
|
45
|
+
modelId: string;
|
|
46
|
+
audio: Buffer;
|
|
47
|
+
contentType: string;
|
|
48
|
+
}
|
|
49
|
+
export interface VideoResult {
|
|
50
|
+
platform: string;
|
|
51
|
+
modelId: string;
|
|
52
|
+
video: Buffer;
|
|
53
|
+
contentType: string;
|
|
54
|
+
}
|
|
55
|
+
export interface ImageParams {
|
|
56
|
+
prompt: string;
|
|
57
|
+
n?: number;
|
|
58
|
+
size?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface SpeechParams {
|
|
61
|
+
input: string;
|
|
62
|
+
voice?: string;
|
|
63
|
+
format?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface VideoParams {
|
|
66
|
+
prompt: string;
|
|
67
|
+
duration?: number;
|
|
68
|
+
aspectRatio?: '16:9' | '9:16';
|
|
69
|
+
image?: string;
|
|
70
|
+
seed?: number;
|
|
71
|
+
audio?: boolean;
|
|
72
|
+
}
|
|
73
|
+
export declare function listMediaModels(modality: MediaModality): MediaModelRow[];
|
|
74
|
+
/** All media models (both modalities, including disabled) for the dashboard. */
|
|
75
|
+
export declare function listAllMediaModels(): MediaModelRow[];
|
|
76
|
+
/** Generate image(s), failing over across providers serving the modality. */
|
|
77
|
+
export declare function runImageGeneration(model: string | undefined, params: ImageParams): Promise<ImageResult>;
|
|
78
|
+
/** Generate a video, failing over across catalogued text-to-video providers.
|
|
79
|
+
* `clientSignal` is the API caller's connection: when it aborts, the in-flight
|
|
80
|
+
* upstream request is dropped and no further provider is tried. */
|
|
81
|
+
export declare function runVideoGeneration(model: string | undefined, params: VideoParams, clientSignal?: AbortSignal): Promise<VideoResult>;
|
|
82
|
+
/** Per-model adapter metadata carried on the catalog entry (meta_json). */
|
|
83
|
+
export interface TranscriptionMeta {
|
|
84
|
+
/** Subtitle formats the provider returns natively (e.g. ['vtt']). Formats
|
|
85
|
+
* not produced natively by the chain are refused with 400 at the route. */
|
|
86
|
+
subtitleFormats?: string[];
|
|
87
|
+
/** Provider upload ceiling in bytes; absent = MAX_TRANSCRIPTION_BYTES. */
|
|
88
|
+
maxBytes?: number | null;
|
|
89
|
+
/** Adapter request flavor where one platform hosts more than one deployment
|
|
90
|
+
* style. Cloudflare: 'json' = JSON body with base64 audio (large-v3-turbo),
|
|
91
|
+
* 'binary' = raw bytes (plain whisper, the default). */
|
|
92
|
+
requestStyle?: string | null;
|
|
93
|
+
}
|
|
94
|
+
/** Global upload ceiling enforced by the route (multer) so it can reject
|
|
95
|
+
* early with a clean OpenAI-shaped 413 instead of buffering an upload no
|
|
96
|
+
* provider can accept. Per-model catalog `maxBytes` may only lower this. */
|
|
97
|
+
export declare const MAX_TRANSCRIPTION_BYTES: number;
|
|
98
|
+
export interface TranscriptionParams {
|
|
99
|
+
file: Buffer;
|
|
100
|
+
filename: string;
|
|
101
|
+
mimeType?: string;
|
|
102
|
+
language?: string;
|
|
103
|
+
prompt?: string;
|
|
104
|
+
temperature?: number;
|
|
105
|
+
/** 'json' | 'text' | 'verbose_json' | 'vtt' (srt is rejected at the route). */
|
|
106
|
+
responseFormat: string;
|
|
107
|
+
}
|
|
108
|
+
export interface TranscriptionResult {
|
|
109
|
+
platform: string;
|
|
110
|
+
modelId: string;
|
|
111
|
+
text: string;
|
|
112
|
+
language?: string;
|
|
113
|
+
duration?: number;
|
|
114
|
+
segments?: unknown[];
|
|
115
|
+
vtt?: string;
|
|
116
|
+
}
|
|
117
|
+
/** Transcribe audio, failing over across STT providers. 429s bench the
|
|
118
|
+
* (platform, model, key) triple through the standard cooldown machinery so a
|
|
119
|
+
* rate-limited key is skipped on subsequent requests, exactly like chat. */
|
|
120
|
+
export declare function runTranscription(model: string | undefined, p: TranscriptionParams): Promise<TranscriptionResult>;
|
|
121
|
+
/** Synthesize speech, failing over across providers serving the modality. */
|
|
122
|
+
export declare function runSpeech(model: string | undefined, params: SpeechParams): Promise<SpeechResult>;
|
|
123
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/services/media.ts"],"names":[],"mappings":"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"}
|