@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,617 @@
|
|
|
1
|
+
// Opt-in exact-match response cache.
|
|
2
|
+
//
|
|
3
|
+
// A free-tier-stacking proxy lives or dies by how far it stretches scarce
|
|
4
|
+
// quota. Re-asking a model the *same* prompt burns a free-tier slot for an
|
|
5
|
+
// answer we already have, which is pure waste. This cache stores successful
|
|
6
|
+
// completions keyed by a canonical hash of the request and serves an identical
|
|
7
|
+
// later request straight from memory, without touching any provider: zero quota
|
|
8
|
+
// cost, near-zero latency, and one fewer 429 on the way to the daily reset.
|
|
9
|
+
//
|
|
10
|
+
// Design choices that keep it SAFE:
|
|
11
|
+
// - Exact match only. No embeddings / fuzzy matching, so a near-miss can never
|
|
12
|
+
// return a different prompt's answer. The key is a SHA-256 over the
|
|
13
|
+
// canonicalized request, so a single token of difference is a miss.
|
|
14
|
+
// - The key is the REQUEST, not the route. Any model's good answer to an
|
|
15
|
+
// identical prompt is a valid hit, which is what maximizes the hit rate for
|
|
16
|
+
// auto-routed traffic. platform/model_id/key_id are stored for attribution
|
|
17
|
+
// and savings accounting only.
|
|
18
|
+
// - Opt-in. Off unless enabled via the RESPONSE_CACHE env var or the
|
|
19
|
+
// response_cache_enabled setting, so existing installs see no behavior
|
|
20
|
+
// change. A per-request header overrides either way.
|
|
21
|
+
// - Temperature-gated. High-temperature requests are asking for variety, so
|
|
22
|
+
// replaying one frozen answer would defeat that. Cached only when the
|
|
23
|
+
// temperature is omitted or at/below RESPONSE_CACHE_MAX_TEMPERATURE.
|
|
24
|
+
// - In-memory and bounded. Entries live in a size-capped LRU map (oldest use
|
|
25
|
+
// evicted first), so the cache can never grow without bound.
|
|
26
|
+
// - Optionally durable. When the cache is ON, the same entries are written
|
|
27
|
+
// through to the response_cache table so a restart does not throw the day's
|
|
28
|
+
// savings away (the daily quota-reset re-run pattern). This means PLAINTEXT
|
|
29
|
+
// model responses land on disk, which is a privacy posture change, so it is
|
|
30
|
+
// tied to the cache master switch and can be turned off on its own with
|
|
31
|
+
// RESPONSE_CACHE_PERSIST=false (memory-only, the pre-0.9.5 behaviour). The
|
|
32
|
+
// SQLite row is dropped whenever the memory entry goes: TTL expiry, LRU
|
|
33
|
+
// eviction, an explicit flush, or the startup purge.
|
|
34
|
+
// - Fail-safe reads. The settings lookup that decides the master switch is
|
|
35
|
+
// wrapped, so a not-yet-initialized DB disables the cache rather than
|
|
36
|
+
// throwing in the proxy hot path (mirrors services/ratelimit.ts).
|
|
37
|
+
import crypto from 'crypto';
|
|
38
|
+
import { getSetting, getDb } from '../db/index.js';
|
|
39
|
+
// ── Config (read on each call so tests and the dashboard can toggle live) ──
|
|
40
|
+
function envFlag(name, fallback) {
|
|
41
|
+
const raw = process.env[name];
|
|
42
|
+
if (raw === undefined || raw.trim() === '')
|
|
43
|
+
return fallback;
|
|
44
|
+
return /^(1|true|on|yes)$/i.test(raw.trim());
|
|
45
|
+
}
|
|
46
|
+
function envNum(name, fallback) {
|
|
47
|
+
const raw = process.env[name];
|
|
48
|
+
if (raw === undefined || raw.trim() === '')
|
|
49
|
+
return fallback;
|
|
50
|
+
const n = Number(raw);
|
|
51
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
52
|
+
}
|
|
53
|
+
// DB-absent-safe settings read: a not-yet-initialized DB (or any read error)
|
|
54
|
+
// must not throw on the proxy hot path, so it degrades to "no setting stored".
|
|
55
|
+
function readSetting(key) {
|
|
56
|
+
try {
|
|
57
|
+
return getSetting(key);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Setting key that lets the dashboard toggle the cache at runtime, no restart.
|
|
64
|
+
export const CACHE_ENABLED_SETTING = 'response_cache_enabled';
|
|
65
|
+
/**
|
|
66
|
+
* Master switch. Default off so adopting the cache is an explicit choice. The
|
|
67
|
+
* settings-table value wins when present (dashboard toggle, no restart), then
|
|
68
|
+
* the RESPONSE_CACHE env var, then off.
|
|
69
|
+
*/
|
|
70
|
+
export function isCacheEnabled() {
|
|
71
|
+
const stored = readSetting(CACHE_ENABLED_SETTING);
|
|
72
|
+
if (stored !== undefined && stored.trim() !== '') {
|
|
73
|
+
return /^(1|true|on|yes)$/i.test(stored.trim());
|
|
74
|
+
}
|
|
75
|
+
return envFlag('RESPONSE_CACHE', false);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Write-through to SQLite. Only meaningful when the cache itself is on, so an
|
|
79
|
+
* install that never enabled caching persists nothing and the feature is inert.
|
|
80
|
+
* Separately switchable because persisting plaintext model responses to disk is
|
|
81
|
+
* a privacy decision an operator may want to decline while still caching.
|
|
82
|
+
*/
|
|
83
|
+
export function cachePersistenceEnabled() {
|
|
84
|
+
return isCacheEnabled() && envFlag('RESPONSE_CACHE_PERSIST', true);
|
|
85
|
+
}
|
|
86
|
+
/** Entry lifetime. Default 1h: long enough to absorb retries and agent re-runs,
|
|
87
|
+
* short enough that a refreshed catalog or key changes answers soon after. */
|
|
88
|
+
export function cacheTtlMs() {
|
|
89
|
+
return envNum('RESPONSE_CACHE_TTL_SECONDS', 3600) * 1000;
|
|
90
|
+
}
|
|
91
|
+
/** Above this temperature a request wants variety, so it is never cached.
|
|
92
|
+
* Default 1.0 caches everything when enabled (max quota savings); lower it to
|
|
93
|
+
* restrict caching to (near-)deterministic calls. */
|
|
94
|
+
export function cacheMaxTemperature() {
|
|
95
|
+
return envNum('RESPONSE_CACHE_MAX_TEMPERATURE', 1.0);
|
|
96
|
+
}
|
|
97
|
+
/** Hard cap on stored entries; least-recently-used are evicted past this.
|
|
98
|
+
* Bounds memory use. */
|
|
99
|
+
export function cacheMaxEntries() {
|
|
100
|
+
return Math.floor(envNum('RESPONSE_CACHE_MAX_ENTRIES', 5000));
|
|
101
|
+
}
|
|
102
|
+
// A request is cacheable only when its temperature is omitted (caller accepts
|
|
103
|
+
// the provider default and is fine with a stable answer) or at/below the cap.
|
|
104
|
+
export function isCacheableTemperature(temperature) {
|
|
105
|
+
if (temperature === undefined || temperature === null)
|
|
106
|
+
return true;
|
|
107
|
+
return temperature <= cacheMaxTemperature();
|
|
108
|
+
}
|
|
109
|
+
export function parseCacheDirective(header, cacheControl) {
|
|
110
|
+
const cc = (Array.isArray(cacheControl) ? cacheControl[0] : cacheControl)?.toLowerCase() ?? '';
|
|
111
|
+
if (cc.includes('no-store') || cc.includes('no-cache'))
|
|
112
|
+
return 'off';
|
|
113
|
+
const raw = (Array.isArray(header) ? header[0] : header)?.trim().toLowerCase();
|
|
114
|
+
if (!raw)
|
|
115
|
+
return 'default';
|
|
116
|
+
if (/^(off|no|0|false|bypass|skip)$/.test(raw))
|
|
117
|
+
return 'off';
|
|
118
|
+
if (/^(on|yes|1|true|force)$/.test(raw))
|
|
119
|
+
return 'on';
|
|
120
|
+
return 'default';
|
|
121
|
+
}
|
|
122
|
+
/** Resolve the global switch + per-request directive into a single yes/no. */
|
|
123
|
+
export function cacheActive(directive) {
|
|
124
|
+
if (directive === 'off')
|
|
125
|
+
return false;
|
|
126
|
+
if (directive === 'on')
|
|
127
|
+
return true;
|
|
128
|
+
return isCacheEnabled();
|
|
129
|
+
}
|
|
130
|
+
// ── Canonical key ──
|
|
131
|
+
// Deterministic JSON: object keys sorted recursively and undefined dropped, so
|
|
132
|
+
// two requests that differ only in key order or omitted-vs-undefined fields
|
|
133
|
+
// hash identically. (JSON.stringify alone preserves insertion order, which
|
|
134
|
+
// varies between clients and would scatter otherwise-identical requests.)
|
|
135
|
+
function stableStringify(value) {
|
|
136
|
+
if (value === null || typeof value !== 'object')
|
|
137
|
+
return JSON.stringify(value) ?? 'null';
|
|
138
|
+
if (Array.isArray(value))
|
|
139
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
140
|
+
const obj = value;
|
|
141
|
+
const parts = Object.keys(obj)
|
|
142
|
+
.sort()
|
|
143
|
+
.filter(k => obj[k] !== undefined)
|
|
144
|
+
.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`);
|
|
145
|
+
return `{${parts.join(',')}}`;
|
|
146
|
+
}
|
|
147
|
+
function normModel(model) {
|
|
148
|
+
// Omitted and the explicit "auto" sentinel mean the same thing (let the router
|
|
149
|
+
// decide), so they must share a cache bucket.
|
|
150
|
+
return !model || model === 'auto' ? 'auto' : model;
|
|
151
|
+
}
|
|
152
|
+
export function computeCacheKey(input) {
|
|
153
|
+
const canonical = stableStringify({
|
|
154
|
+
v: 4, // explicit-but-default-valued sampling params dropped from the key
|
|
155
|
+
model: normModel(input.model),
|
|
156
|
+
messages: input.messages,
|
|
157
|
+
temperature: input.temperature,
|
|
158
|
+
top_p: defaultableNumber(input.top_p, 1),
|
|
159
|
+
max_tokens: input.max_tokens,
|
|
160
|
+
// tools/tool_choice are part of the key so a request with a different tool
|
|
161
|
+
// set never collides with (or is served) another's cached answer.
|
|
162
|
+
tools: input.tools,
|
|
163
|
+
tool_choice: input.tool_choice,
|
|
164
|
+
// Remaining knobs (see CacheKeyInput). Absent/undefined fields are dropped
|
|
165
|
+
// by stableStringify, so requests without them keep hashing identically.
|
|
166
|
+
stop: input.stop,
|
|
167
|
+
response_format: input.response_format,
|
|
168
|
+
n: defaultableNumber(input.n, 1),
|
|
169
|
+
seed: input.seed,
|
|
170
|
+
presence_penalty: defaultableNumber(input.presence_penalty, 0),
|
|
171
|
+
frequency_penalty: defaultableNumber(input.frequency_penalty, 0),
|
|
172
|
+
logit_bias: input.logit_bias,
|
|
173
|
+
logprobs: input.logprobs,
|
|
174
|
+
top_logprobs: input.top_logprobs,
|
|
175
|
+
// Absent for requests without the knob (stableStringify drops undefined),
|
|
176
|
+
// so pre-existing cache keys are unaffected.
|
|
177
|
+
reasoning_effort: input.reasoning_effort,
|
|
178
|
+
compression: input.compression,
|
|
179
|
+
});
|
|
180
|
+
return crypto.createHash('sha256').update(canonical).digest('hex');
|
|
181
|
+
}
|
|
182
|
+
// Normalizes a sampling param that was passed explicitly but equals the API
|
|
183
|
+
// default down to undefined (stableStringify drops undefined), so a client that
|
|
184
|
+
// always serializes the full param set shares a cache entry with one that omits
|
|
185
|
+
// the defaults. Without this, top_p:1 / n:1 / presence_penalty:0 /
|
|
186
|
+
// frequency_penalty:0 make two otherwise identical requests hash to different
|
|
187
|
+
// keys and miss each other. Non-numbers (null, strings, absent) pass through
|
|
188
|
+
// unchanged so existing behaviour is preserved.
|
|
189
|
+
function defaultableNumber(value, defaultValue) {
|
|
190
|
+
if (typeof value === 'number') {
|
|
191
|
+
if (value === defaultValue)
|
|
192
|
+
return undefined;
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
return value;
|
|
196
|
+
}
|
|
197
|
+
// Insertion-ordered map used as an LRU: the first key is the least-recently
|
|
198
|
+
// used, the last is the most-recently used. A read or write re-inserts its key
|
|
199
|
+
// at the end (delete + set), so eviction from the front drops the coldest entry.
|
|
200
|
+
const store = new Map();
|
|
201
|
+
const streamStore = new Map();
|
|
202
|
+
/** Last use of an entry, for cross-store recency comparison. */
|
|
203
|
+
function lastUsedAtMs(entry) {
|
|
204
|
+
return entry.lastHitAtMs ?? entry.createdAtMs;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Evict least-recently-used entries until the JSON and streaming stores hold
|
|
208
|
+
* RESPONSE_CACHE_MAX_ENTRIES *between them*. One shared budget, so enabling
|
|
209
|
+
* streaming replay cannot silently double the documented memory ceiling.
|
|
210
|
+
* Each map is itself in LRU order, so only their two front entries can be the
|
|
211
|
+
* coldest; the older of the two goes first.
|
|
212
|
+
*/
|
|
213
|
+
function enforceCombinedCap() {
|
|
214
|
+
const cap = cacheMaxEntries();
|
|
215
|
+
while (store.size + streamStore.size > cap) {
|
|
216
|
+
const jsonKey = store.keys().next().value;
|
|
217
|
+
const streamKey = streamStore.keys().next().value;
|
|
218
|
+
const jsonAge = jsonKey === undefined ? Infinity : lastUsedAtMs(store.get(jsonKey));
|
|
219
|
+
const streamAge = streamKey === undefined ? Infinity : lastUsedAtMs(streamStore.get(streamKey));
|
|
220
|
+
if (streamKey !== undefined && streamAge <= jsonAge) {
|
|
221
|
+
streamStore.delete(streamKey);
|
|
222
|
+
}
|
|
223
|
+
else if (jsonKey !== undefined) {
|
|
224
|
+
store.delete(jsonKey);
|
|
225
|
+
// Evicting in memory but not on disk would let the table grow without
|
|
226
|
+
// bound and let a restart resurrect entries the LRU already gave up on.
|
|
227
|
+
scheduleRowDelete(jsonKey);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
break; // both stores empty; cap is 0
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Lifetime-of-process lookup tallies, the denominator behind the dashboard's
|
|
235
|
+
// hit rate. Entries alone cannot provide it: a cache that is 99% empty is 0%
|
|
236
|
+
// useful, and a flushed store would otherwise read as a 100% hit rate.
|
|
237
|
+
// Counted only when a request actually consulted the cache (a cacheKey was
|
|
238
|
+
// computed), never for requests that bypassed it.
|
|
239
|
+
//
|
|
240
|
+
// Deliberately NOT seeded from SQLite on load. Hits persist per row
|
|
241
|
+
// (response_cache.hit_count) but a miss has no row to live on, so restoring
|
|
242
|
+
// only the hits would report a rate biased upward after every restart. A ratio
|
|
243
|
+
// is only honest when numerator and denominator cover the same window, and
|
|
244
|
+
// that window is this process. The savings figures below are the ones that
|
|
245
|
+
// survive a restart, because they ride on the entries themselves.
|
|
246
|
+
let lookupHits = 0;
|
|
247
|
+
let lookupMisses = 0;
|
|
248
|
+
// ── Deferred SQLite write-through ──
|
|
249
|
+
// better-sqlite3 is synchronous, so a store/hit write would sit on the request
|
|
250
|
+
// path (a large completion body is a multi-KB write with an fsync behind it).
|
|
251
|
+
// Every persistence write is therefore queued and drained on the next tick: the
|
|
252
|
+
// in-memory map is already correct by then, and a crash in the gap only costs
|
|
253
|
+
// a cache entry. Individually wrapped so one bad write cannot take down the
|
|
254
|
+
// drain, and skipped entirely when persistence is off.
|
|
255
|
+
const pendingWrites = [];
|
|
256
|
+
let drainScheduled = false;
|
|
257
|
+
function schedulePersist(op) {
|
|
258
|
+
if (!cachePersistenceEnabled())
|
|
259
|
+
return;
|
|
260
|
+
pendingWrites.push(op);
|
|
261
|
+
if (drainScheduled)
|
|
262
|
+
return;
|
|
263
|
+
drainScheduled = true;
|
|
264
|
+
setImmediate(drainPendingWrites);
|
|
265
|
+
}
|
|
266
|
+
function drainPendingWrites() {
|
|
267
|
+
drainScheduled = false;
|
|
268
|
+
const ops = pendingWrites.splice(0, pendingWrites.length);
|
|
269
|
+
for (const op of ops) {
|
|
270
|
+
try {
|
|
271
|
+
op();
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// best-effort: a DB failure degrades to memory-only, never to a 500
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function scheduleRowDelete(cacheKey) {
|
|
279
|
+
schedulePersist(() => {
|
|
280
|
+
getDb().prepare('DELETE FROM response_cache WHERE cache_key = ?').run(cacheKey);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
// Batched hit-count persistence: hits dirtied since the last flush, written in
|
|
284
|
+
// one debounced pass. The flush rides the same drain as other queued writes.
|
|
285
|
+
// A pending count belongs to the entry that earned it: clearCache() and a
|
|
286
|
+
// re-store both drop it, so a stale count is never flushed onto a fresh row.
|
|
287
|
+
const HIT_FLUSH_DELAY_MS = 2_000;
|
|
288
|
+
const dirtyHitCounts = new Map();
|
|
289
|
+
let hitFlushTimer;
|
|
290
|
+
function scheduleHitCountFlush() {
|
|
291
|
+
if (hitFlushTimer)
|
|
292
|
+
return;
|
|
293
|
+
hitFlushTimer = setTimeout(() => {
|
|
294
|
+
hitFlushTimer = undefined;
|
|
295
|
+
if (dirtyHitCounts.size === 0)
|
|
296
|
+
return;
|
|
297
|
+
const batch = new Map(dirtyHitCounts);
|
|
298
|
+
dirtyHitCounts.clear();
|
|
299
|
+
schedulePersist(() => {
|
|
300
|
+
const stmt = getDb().prepare('UPDATE response_cache SET hit_count = ?, last_hit_at_ms = ? WHERE cache_key = ?');
|
|
301
|
+
for (const [cacheKey, hit] of batch)
|
|
302
|
+
stmt.run(hit.hitCount, hit.lastHitAtMs, cacheKey);
|
|
303
|
+
});
|
|
304
|
+
}, HIT_FLUSH_DELAY_MS);
|
|
305
|
+
hitFlushTimer.unref();
|
|
306
|
+
}
|
|
307
|
+
function dropPendingHitCounts() {
|
|
308
|
+
dirtyHitCounts.clear();
|
|
309
|
+
if (hitFlushTimer)
|
|
310
|
+
clearTimeout(hitFlushTimer);
|
|
311
|
+
hitFlushTimer = undefined;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Test-only: run the queued write-through immediately instead of on the next
|
|
315
|
+
* tick, so a synchronous test can assert on what actually reached SQLite.
|
|
316
|
+
*/
|
|
317
|
+
export function __flushPersistenceForTests() {
|
|
318
|
+
drainPendingWrites();
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Test-only: drop the in-memory LRU while leaving the SQLite table intact, the
|
|
322
|
+
* way a process restart does. (clearCache() is the user-facing flush and wipes
|
|
323
|
+
* both, so it cannot stand in for a restart.) Pending write-through is drained
|
|
324
|
+
* first, since a real restart's writes had already landed. Streaming entries
|
|
325
|
+
* are memory-only (never written through), so a restart drops them too.
|
|
326
|
+
*/
|
|
327
|
+
export function __resetMemoryForTests() {
|
|
328
|
+
drainPendingWrites();
|
|
329
|
+
store.clear();
|
|
330
|
+
streamStore.clear();
|
|
331
|
+
lookupHits = 0;
|
|
332
|
+
lookupMisses = 0;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Look up a cached completion. Returns null on a miss or when the entry has aged
|
|
336
|
+
* past the TTL (expired entries are deleted lazily on read, in memory and on
|
|
337
|
+
* disk). A hit bumps the entry's hit_count and moves it to most-recently-used.
|
|
338
|
+
*/
|
|
339
|
+
export function getCachedResponse(cacheKey, now = Date.now()) {
|
|
340
|
+
const entry = store.get(cacheKey);
|
|
341
|
+
if (!entry) {
|
|
342
|
+
lookupMisses += 1;
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
if (now - entry.createdAtMs > cacheTtlMs()) {
|
|
346
|
+
store.delete(cacheKey);
|
|
347
|
+
// The row would otherwise outlive its memory entry until the next restart.
|
|
348
|
+
scheduleRowDelete(cacheKey);
|
|
349
|
+
lookupMisses += 1;
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
lookupHits += 1;
|
|
353
|
+
entry.hitCount += 1;
|
|
354
|
+
entry.lastHitAtMs = now;
|
|
355
|
+
// Move to most-recently-used.
|
|
356
|
+
store.delete(cacheKey);
|
|
357
|
+
store.set(cacheKey, entry);
|
|
358
|
+
// Keep the persisted counters in step so the savings numbers survive a
|
|
359
|
+
// restart instead of resetting to whatever the last store wrote. Hits are
|
|
360
|
+
// batched: one debounced UPDATE for all keys dirtied in the window, instead
|
|
361
|
+
// of one queued UPDATE per hit (a hot entry used to write on every hit).
|
|
362
|
+
dirtyHitCounts.set(cacheKey, { hitCount: entry.hitCount, lastHitAtMs: now });
|
|
363
|
+
scheduleHitCountFlush();
|
|
364
|
+
return {
|
|
365
|
+
body: entry.body,
|
|
366
|
+
platform: entry.platform,
|
|
367
|
+
modelId: entry.modelId,
|
|
368
|
+
keyId: entry.keyId,
|
|
369
|
+
promptTokens: entry.promptTokens,
|
|
370
|
+
completionTokens: entry.completionTokens,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Store a successful completion. Overwrites any existing entry for the key (a
|
|
375
|
+
* re-generation refreshes the cached answer, its TTL, and its hit count).
|
|
376
|
+
* Enforces the entry cap by evicting the least-recently-used entries. Best-
|
|
377
|
+
* effort: an unserializable body is skipped so caching can never break a
|
|
378
|
+
* request that already succeeded.
|
|
379
|
+
*
|
|
380
|
+
* SQLite persistence: when the cache is on, the entry is also written through
|
|
381
|
+
* to the response_cache table so it survives a restart (the daily quota-reset
|
|
382
|
+
* re-run pattern). The write is deferred to the next tick and best-effort, so
|
|
383
|
+
* it never sits on — or throws into — the proxy hot path; a DB failure degrades
|
|
384
|
+
* to in-memory-only, exactly as before.
|
|
385
|
+
*/
|
|
386
|
+
export function storeCachedResponse(cacheKey, input, now = Date.now()) {
|
|
387
|
+
// Reject bodies that can't be JSON-serialized; a hit must be replayable.
|
|
388
|
+
let bodyJson;
|
|
389
|
+
try {
|
|
390
|
+
bodyJson = JSON.stringify(input.body);
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
// Delete-then-set so an overwrite also refreshes recency order. Any hits
|
|
396
|
+
// still waiting to be flushed counted the old answer, not this one.
|
|
397
|
+
store.delete(cacheKey);
|
|
398
|
+
dirtyHitCounts.delete(cacheKey);
|
|
399
|
+
store.set(cacheKey, {
|
|
400
|
+
body: input.body,
|
|
401
|
+
platform: input.platform,
|
|
402
|
+
modelId: input.modelId,
|
|
403
|
+
keyId: input.keyId,
|
|
404
|
+
promptTokens: input.promptTokens,
|
|
405
|
+
completionTokens: input.completionTokens,
|
|
406
|
+
hitCount: 0,
|
|
407
|
+
createdAtMs: now,
|
|
408
|
+
lastHitAtMs: null,
|
|
409
|
+
});
|
|
410
|
+
// Evict least-recently-used beyond the cap, which is shared with the
|
|
411
|
+
// streaming store. The count only drifts by one per insert, so at most one
|
|
412
|
+
// entry is removed per call in steady state.
|
|
413
|
+
enforceCombinedCap();
|
|
414
|
+
// Write-through to SQLite. hit_count is stored at its current in-memory value
|
|
415
|
+
// (0 for a fresh store, since an overwrite resets the rolling stat with the
|
|
416
|
+
// answer it counts); subsequent hits update the row in getCachedResponse.
|
|
417
|
+
const entry = store.get(cacheKey);
|
|
418
|
+
if (!entry)
|
|
419
|
+
return; // cap of 0: the entry was evicted by the loop above
|
|
420
|
+
const expiresAtMs = now + cacheTtlMs();
|
|
421
|
+
schedulePersist(() => {
|
|
422
|
+
getDb().prepare(`INSERT INTO response_cache
|
|
423
|
+
(cache_key, body_json, platform, model_id, key_id, prompt_tokens, completion_tokens, hit_count, created_at_ms, last_hit_at_ms, expires_at_ms)
|
|
424
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
425
|
+
ON CONFLICT(cache_key) DO UPDATE SET
|
|
426
|
+
body_json = excluded.body_json,
|
|
427
|
+
platform = excluded.platform,
|
|
428
|
+
model_id = excluded.model_id,
|
|
429
|
+
key_id = excluded.key_id,
|
|
430
|
+
prompt_tokens = excluded.prompt_tokens,
|
|
431
|
+
completion_tokens = excluded.completion_tokens,
|
|
432
|
+
hit_count = excluded.hit_count,
|
|
433
|
+
created_at_ms = excluded.created_at_ms,
|
|
434
|
+
last_hit_at_ms = excluded.last_hit_at_ms,
|
|
435
|
+
expires_at_ms = excluded.expires_at_ms`).run(cacheKey, bodyJson, input.platform, input.modelId, input.keyId, input.promptTokens, input.completionTokens, entry.hitCount, now, entry.lastHitAtMs, expiresAtMs);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Reload unexpired entries from SQLite into the in-memory LRU, bounded by
|
|
440
|
+
* RESPONSE_CACHE_MAX_ENTRIES. Called once at startup (after initDb) from both
|
|
441
|
+
* boot paths, server/src/index.ts and desktop/src/server-host.ts; expired rows
|
|
442
|
+
* are purged opportunistically. Best-effort: any DB error leaves the cache
|
|
443
|
+
* empty (memory-only), matching the pre-persistence behavior.
|
|
444
|
+
*/
|
|
445
|
+
export function loadCacheFromDb(now = Date.now()) {
|
|
446
|
+
try {
|
|
447
|
+
const db = getDb();
|
|
448
|
+
// Purge expired rows lazily on startup so the table doesn't accumulate
|
|
449
|
+
// dead entries between restarts. Unconditional: rows written while the
|
|
450
|
+
// cache was on must still age out after it is switched off.
|
|
451
|
+
db.prepare('DELETE FROM response_cache WHERE expires_at_ms <= ?').run(now);
|
|
452
|
+
// Hydration only when the operator actually wants the cache (and its
|
|
453
|
+
// on-disk half). Off by default, so this is inert on an untouched install.
|
|
454
|
+
if (!cachePersistenceEnabled())
|
|
455
|
+
return;
|
|
456
|
+
const rows = db.prepare(`SELECT cache_key, body_json, platform, model_id, key_id, prompt_tokens, completion_tokens, hit_count, created_at_ms, last_hit_at_ms
|
|
457
|
+
FROM response_cache
|
|
458
|
+
ORDER BY created_at_ms ASC`).all();
|
|
459
|
+
const cap = cacheMaxEntries();
|
|
460
|
+
// Newest wins: drop rows past the cap from the FRONT (oldest first).
|
|
461
|
+
const keep = rows.length > cap ? rows.slice(rows.length - cap) : rows;
|
|
462
|
+
for (const row of keep) {
|
|
463
|
+
if (now - row.created_at_ms > cacheTtlMs())
|
|
464
|
+
continue; // aged between purge and read
|
|
465
|
+
try {
|
|
466
|
+
store.set(row.cache_key, {
|
|
467
|
+
body: JSON.parse(row.body_json),
|
|
468
|
+
platform: row.platform,
|
|
469
|
+
modelId: row.model_id,
|
|
470
|
+
keyId: row.key_id,
|
|
471
|
+
promptTokens: row.prompt_tokens,
|
|
472
|
+
completionTokens: row.completion_tokens,
|
|
473
|
+
hitCount: row.hit_count,
|
|
474
|
+
createdAtMs: row.created_at_ms,
|
|
475
|
+
lastHitAtMs: row.last_hit_at_ms,
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
// corrupt body — skip; it will be overwritten on the next store
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
// best-effort: DB unavailable at startup → memory-only cache
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// ── Streaming entries ──
|
|
488
|
+
/**
|
|
489
|
+
* Ceiling on one cached stream's replay payload. A single long answer must not
|
|
490
|
+
* be able to pin megabytes of SSE text in memory, and a stream past this size
|
|
491
|
+
* is cheap to regenerate relative to what it costs to hold. The caller stops
|
|
492
|
+
* buffering at this point too (proxy.ts), so an oversize stream never fully
|
|
493
|
+
* materializes; this is the store-side backstop.
|
|
494
|
+
*/
|
|
495
|
+
export const STREAM_CACHE_MAX_BYTES = 2 * 1024 * 1024;
|
|
496
|
+
/**
|
|
497
|
+
* Look up a cached stream. Returns null on a miss or when the entry has aged
|
|
498
|
+
* past the TTL. A hit bumps hit_count and moves the entry to MRU, and — like
|
|
499
|
+
* the JSON lookup — counts into the process-wide hit/miss tallies behind the
|
|
500
|
+
* dashboard's hit rate, so streaming traffic is not invisible there.
|
|
501
|
+
*/
|
|
502
|
+
export function getCachedStreamResponse(cacheKey, now = Date.now()) {
|
|
503
|
+
const entry = streamStore.get(cacheKey);
|
|
504
|
+
if (!entry) {
|
|
505
|
+
lookupMisses += 1;
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
if (now - entry.createdAtMs > cacheTtlMs()) {
|
|
509
|
+
streamStore.delete(cacheKey);
|
|
510
|
+
lookupMisses += 1;
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
lookupHits += 1;
|
|
514
|
+
entry.hitCount += 1;
|
|
515
|
+
entry.lastHitAtMs = now;
|
|
516
|
+
streamStore.delete(cacheKey);
|
|
517
|
+
streamStore.set(cacheKey, entry);
|
|
518
|
+
return {
|
|
519
|
+
sse: entry.sse,
|
|
520
|
+
platform: entry.platform,
|
|
521
|
+
modelId: entry.modelId,
|
|
522
|
+
keyId: entry.keyId,
|
|
523
|
+
promptTokens: entry.promptTokens,
|
|
524
|
+
completionTokens: entry.completionTokens,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Store a completed SSE frame sequence for replay. The frames are the verbatim
|
|
529
|
+
* `data: {...}\n\n` lines (including the final `[DONE]`) the client received,
|
|
530
|
+
* concatenated, so a hit reproduces the stream byte-for-byte. Best-effort like
|
|
531
|
+
* the JSON store: an empty or oversize sequence is silently skipped, and the
|
|
532
|
+
* entry shares the JSON store's entry cap.
|
|
533
|
+
*/
|
|
534
|
+
export function storeCachedStreamResponse(cacheKey, input, now = Date.now()) {
|
|
535
|
+
if (!Array.isArray(input.frames) || input.frames.length === 0)
|
|
536
|
+
return;
|
|
537
|
+
const sse = input.frames.join('');
|
|
538
|
+
if (sse.length === 0 || Buffer.byteLength(sse) > STREAM_CACHE_MAX_BYTES)
|
|
539
|
+
return;
|
|
540
|
+
streamStore.delete(cacheKey);
|
|
541
|
+
streamStore.set(cacheKey, {
|
|
542
|
+
sse,
|
|
543
|
+
platform: input.platform,
|
|
544
|
+
modelId: input.modelId,
|
|
545
|
+
keyId: input.keyId,
|
|
546
|
+
promptTokens: input.promptTokens,
|
|
547
|
+
completionTokens: input.completionTokens,
|
|
548
|
+
hitCount: 0,
|
|
549
|
+
createdAtMs: now,
|
|
550
|
+
lastHitAtMs: null,
|
|
551
|
+
});
|
|
552
|
+
enforceCombinedCap();
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Aggregate cache stats for the dashboard. "saved" tokens are the provider
|
|
556
|
+
* tokens that hits avoided spending: hit_count x the entry's token counts,
|
|
557
|
+
* summed, i.e. the free-tier quota the cache gave back. Those ride on the
|
|
558
|
+
* entries, so they survive a restart along with the persisted rows.
|
|
559
|
+
*
|
|
560
|
+
* hitRate is deliberately computed from the process-lifetime lookup tallies
|
|
561
|
+
* instead of totalHits: totalHits only counts the entries still held, so an
|
|
562
|
+
* eviction (or a TTL expiry) would silently retire hits that really happened
|
|
563
|
+
* and drag the reported rate down forever.
|
|
564
|
+
*/
|
|
565
|
+
export function getCacheStats() {
|
|
566
|
+
let totalHits = 0;
|
|
567
|
+
let savedPromptTokens = 0;
|
|
568
|
+
let savedCompletionTokens = 0;
|
|
569
|
+
for (const entry of store.values()) {
|
|
570
|
+
totalHits += entry.hitCount;
|
|
571
|
+
savedPromptTokens += entry.hitCount * entry.promptTokens;
|
|
572
|
+
savedCompletionTokens += entry.hitCount * entry.completionTokens;
|
|
573
|
+
}
|
|
574
|
+
for (const entry of streamStore.values()) {
|
|
575
|
+
totalHits += entry.hitCount;
|
|
576
|
+
savedPromptTokens += entry.hitCount * entry.promptTokens;
|
|
577
|
+
savedCompletionTokens += entry.hitCount * entry.completionTokens;
|
|
578
|
+
}
|
|
579
|
+
const lookups = lookupHits + lookupMisses;
|
|
580
|
+
return {
|
|
581
|
+
entries: store.size + streamStore.size,
|
|
582
|
+
totalHits,
|
|
583
|
+
estimatedRequestsSaved: totalHits,
|
|
584
|
+
savedPromptTokens,
|
|
585
|
+
savedCompletionTokens,
|
|
586
|
+
lookupHits,
|
|
587
|
+
lookupMisses,
|
|
588
|
+
hitRate: lookups > 0 ? lookupHits / lookups : 0,
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Drop every cached entry, in memory AND on disk. Returns the number removed.
|
|
593
|
+
* The persisted table has to go too: DELETE /api/cache is how an operator
|
|
594
|
+
* forces fresh answers (changed keys, a bad reply, a privacy request), and a
|
|
595
|
+
* flush that left the rows behind would resurrect all of it on the next
|
|
596
|
+
* restart. Queued write-through is discarded for the same reason. Runs inline
|
|
597
|
+
* rather than deferred: this is an admin route, not the proxy hot path.
|
|
598
|
+
*/
|
|
599
|
+
export function clearCache() {
|
|
600
|
+
const removed = store.size + streamStore.size;
|
|
601
|
+
store.clear();
|
|
602
|
+
streamStore.clear();
|
|
603
|
+
pendingWrites.length = 0;
|
|
604
|
+
dropPendingHitCounts();
|
|
605
|
+
// The lookup tallies describe the cache that just went away; keeping them
|
|
606
|
+
// would show a 90% hit rate next to zero entries right after a flush.
|
|
607
|
+
lookupHits = 0;
|
|
608
|
+
lookupMisses = 0;
|
|
609
|
+
try {
|
|
610
|
+
getDb().prepare('DELETE FROM response_cache').run();
|
|
611
|
+
}
|
|
612
|
+
catch {
|
|
613
|
+
// best-effort: no DB (or no table yet) means there is nothing persisted
|
|
614
|
+
}
|
|
615
|
+
return removed;
|
|
616
|
+
}
|
|
617
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"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"}
|