@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,177 @@
|
|
|
1
|
+
import type { ChatMessage, ChatCompletionResponse, ChatCompletionChunk, ChatToolDefinition, ChatToolChoice, Platform } from '@srouter/shared/types.js';
|
|
2
|
+
import type { QuotaObservationContext } from '../services/provider-quota.js';
|
|
3
|
+
import type { ExtendedSamplingOptions } from '../lib/sampling-params.js';
|
|
4
|
+
/** A provider HTTP error carrying the upstream status and, when the provider
|
|
5
|
+
* stated one, the parsed back-off so the router can bench the key for at least
|
|
6
|
+
* that long. The delay may come from the Retry-After header or from the error
|
|
7
|
+
* body — see providerHttpError. */
|
|
8
|
+
export interface ProviderHttpError extends Error {
|
|
9
|
+
status?: number;
|
|
10
|
+
retryAfterMs?: number;
|
|
11
|
+
/** Explicit daily-window violation from structured upstream quota details. */
|
|
12
|
+
dailyQuotaExhausted?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Parse an HTTP `Retry-After` header (delta-seconds or an HTTP-date) into a
|
|
15
|
+
* millisecond delay, clamped to MAX_RETRY_AFTER_MS. Returns undefined when
|
|
16
|
+
* absent or unparseable. */
|
|
17
|
+
export declare function parseRetryAfterMs(value: string | null | undefined): number | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* The back-off a provider stated inside its error BODY, in milliseconds.
|
|
20
|
+
*
|
|
21
|
+
* Not every provider uses the Retry-After header. Gemini answers a 429 with
|
|
22
|
+
* `error.details[]` carrying a `google.rpc.RetryInfo` whose `retryDelay` is
|
|
23
|
+
* "17s", and several OpenAI-compatible tiers only say it in prose. Those hints
|
|
24
|
+
* were being thrown away: the body is flattened to a single message string
|
|
25
|
+
* before it reaches the router, so a provider that told us exactly when to come
|
|
26
|
+
* back got the same heuristic cooldown ladder as one that said nothing.
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseStatedRetryMs(body: unknown): number | undefined;
|
|
29
|
+
/** Build an error for a non-OK upstream response, capturing the status and any
|
|
30
|
+
* stated back-off. Used by every provider adapter so the proxy can honor a
|
|
31
|
+
* provider's explicit hint when it sets the cooldown.
|
|
32
|
+
*
|
|
33
|
+
* `body` is the already-parsed error payload the caller used to build
|
|
34
|
+
* `message`. Only a delay is read out of it and only a number is kept — the
|
|
35
|
+
* body itself is never retained, so nothing extra reaches a log or the
|
|
36
|
+
* attempt trace. The Retry-After header still wins when both are present: it
|
|
37
|
+
* is the standard channel, and preferring it keeps existing behavior exactly
|
|
38
|
+
* as it was. */
|
|
39
|
+
export declare function providerHttpError(res: Response, message: string, body?: unknown): ProviderHttpError;
|
|
40
|
+
export interface CompletionOptions extends ExtendedSamplingOptions {
|
|
41
|
+
model?: string;
|
|
42
|
+
temperature?: number;
|
|
43
|
+
max_tokens?: number;
|
|
44
|
+
top_p?: number;
|
|
45
|
+
stop?: string | string[];
|
|
46
|
+
tools?: ChatToolDefinition[];
|
|
47
|
+
tool_choice?: ChatToolChoice;
|
|
48
|
+
parallel_tool_calls?: boolean;
|
|
49
|
+
stream_options?: {
|
|
50
|
+
include_usage?: boolean;
|
|
51
|
+
};
|
|
52
|
+
/** Remaining context budget (context_window − estimated_input_tokens) for
|
|
53
|
+
* this route. resolveMaxTokens clamps max_tokens to fit. */
|
|
54
|
+
contextBudget?: number;
|
|
55
|
+
/** Per-call HTTP timeout override. Not part of the OpenAI wire format (it is
|
|
56
|
+
* stripped before the request body is built); used by the probe script so
|
|
57
|
+
* NVIDIA's 15-60s serverless cold starts don't read as failures. */
|
|
58
|
+
timeoutMs?: number;
|
|
59
|
+
/** Abort signal for the gateway's OWN client (request socket closed). The
|
|
60
|
+
* proxy surfaces thread it here so a disconnect cancels the upstream fetch
|
|
61
|
+
* AND any in-progress body/stream read — tokens stop burning and the
|
|
62
|
+
* in-flight lease frees immediately instead of when the read happens to
|
|
63
|
+
* finish. Composed with the per-attempt timeout in fetchWithTimeout; never
|
|
64
|
+
* serialized into the request body. */
|
|
65
|
+
signal?: AbortSignal;
|
|
66
|
+
}
|
|
67
|
+
/** Per-call abort/timeout wiring for fetchWithTimeout. */
|
|
68
|
+
export interface ProviderFetchOptions {
|
|
69
|
+
/** Client-disconnect signal, composed with the per-attempt timeout via
|
|
70
|
+
* AbortSignal.any. Unlike the timeout it is never disarmed at headers, so it
|
|
71
|
+
* also aborts body reads and stream iteration through undici. */
|
|
72
|
+
signal?: AbortSignal;
|
|
73
|
+
/** What the per-attempt timeout bounds:
|
|
74
|
+
* - 'headers' (default, historical): the abort timer dies the moment
|
|
75
|
+
* response HEADERS arrive — right for streams, whose body legitimately
|
|
76
|
+
* outlives any fixed deadline (readSseStream's stall watchdog owns
|
|
77
|
+
* mid-stream hangs, the client signal owns "nobody is listening").
|
|
78
|
+
* - 'request': the deadline stays armed across the body read too, so a 200
|
|
79
|
+
* whose body never finishes aborts at timeoutMs instead of hanging
|
|
80
|
+
* res.json() forever. Use for non-streaming calls, which read the whole
|
|
81
|
+
* body as one unit. */
|
|
82
|
+
timeoutBounds?: 'headers' | 'request';
|
|
83
|
+
}
|
|
84
|
+
/** Per-stream timeout wiring for readSseStream (#584). */
|
|
85
|
+
export interface SseStreamOptions {
|
|
86
|
+
/** The chat timeout the adapter gave fetchWithTimeout for this request
|
|
87
|
+
* (options.timeoutMs override included). Becomes the first-byte grace
|
|
88
|
+
* budget, floored at the stall budget — see firstByteBudgetMs. Defaults to
|
|
89
|
+
* fetchWithTimeout's own default, providerTimeoutMs(platform, 15000). */
|
|
90
|
+
firstByteTimeoutMs?: number;
|
|
91
|
+
/** Mid-stream inactivity budget; defaults to streamStallTimeoutMs(platform)
|
|
92
|
+
* (per-platform env > global env > 90s). 0 disables the watchdog. */
|
|
93
|
+
stallTimeoutMs?: number;
|
|
94
|
+
}
|
|
95
|
+
export interface KeyValidationFailure {
|
|
96
|
+
valid: false;
|
|
97
|
+
/** Provider-supplied reason suitable for health logs and the local keys UI. */
|
|
98
|
+
error: string;
|
|
99
|
+
}
|
|
100
|
+
export type KeyValidationResult = boolean | KeyValidationFailure;
|
|
101
|
+
export declare abstract class BaseProvider {
|
|
102
|
+
abstract readonly platform: Platform;
|
|
103
|
+
abstract readonly name: string;
|
|
104
|
+
/** Providers whose free tier needs no API key (e.g. Kilo's anonymous gateway).
|
|
105
|
+
* When true, the gateway stores a sentinel key row so routing still considers
|
|
106
|
+
* the platform "configured", and the provider omits the Authorization header
|
|
107
|
+
* on outgoing requests. Defaults to false; set by subclasses. */
|
|
108
|
+
keyless: boolean;
|
|
109
|
+
abstract chatCompletion(apiKey: string, messages: ChatMessage[], modelId: string, options?: CompletionOptions, quotaContext?: QuotaObservationContext): Promise<ChatCompletionResponse>;
|
|
110
|
+
abstract streamChatCompletion(apiKey: string, messages: ChatMessage[], modelId: string, options?: CompletionOptions, quotaContext?: QuotaObservationContext): AsyncGenerator<ChatCompletionChunk>;
|
|
111
|
+
abstract validateKey(apiKey: string, quotaContext?: QuotaObservationContext): Promise<KeyValidationResult>;
|
|
112
|
+
/**
|
|
113
|
+
* Turn a conventional 401/403 validation response into a diagnostic result.
|
|
114
|
+
* Providers still return a simple boolean when no useful error body exists,
|
|
115
|
+
* but preserving the upstream message here lets the health service persist
|
|
116
|
+
* and display the reason instead of reducing every failure to "invalid".
|
|
117
|
+
*/
|
|
118
|
+
protected validationResult(res: Response): Promise<KeyValidationResult>;
|
|
119
|
+
protected fetchWithTimeout(url: string, init: RequestInit, timeoutMs?: number, fetchOpts?: ProviderFetchOptions): Promise<Response>;
|
|
120
|
+
protected makeId(): string;
|
|
121
|
+
/**
|
|
122
|
+
* One reader.read() bounded by the mid-stream inactivity watchdog (#553).
|
|
123
|
+
* Shared by readSseStream and adapters that parse their own wire format
|
|
124
|
+
* (google.ts) so every stream gets the same stall semantics:
|
|
125
|
+
* PROVIDER_STREAM_STALL_TIMEOUT_MS (per-platform override
|
|
126
|
+
* PROVIDER_STREAM_STALL_TIMEOUT_<PLATFORM>, #584), default 90s, 0 disables.
|
|
127
|
+
* Client-abort rejections pass through untouched — undici errors the body
|
|
128
|
+
* with the request signal's reason, so a disconnect surfaces here as the
|
|
129
|
+
* marked error from newClientAbortError, not as a stall. `timeoutMessage`
|
|
130
|
+
* lets the first-byte read report its distinct wording (#584).
|
|
131
|
+
*/
|
|
132
|
+
protected readWithStallTimeout<T>(read: () => Promise<T>, inactivityTimeoutMs: number, timeoutMessage?: string): Promise<T>;
|
|
133
|
+
/**
|
|
134
|
+
* Budget for the FIRST read of a streaming body (issue #584): the platform's
|
|
135
|
+
* chat timeout is already "how slow may the first token be" — tuned per
|
|
136
|
+
* platform at registration and env-overridable via PROVIDER_TIMEOUT_<PLATFORM>
|
|
137
|
+
* — but on streams it is disarmed the moment response HEADERS arrive, and
|
|
138
|
+
* providers like NVIDIA NIM send SSE headers instantly then prefill for
|
|
139
|
+
* minutes. Floored at the stall budget so a platform with a short chat
|
|
140
|
+
* timeout never gets a STRICTER first read than the pre-#584 watchdog gave
|
|
141
|
+
* it. 0 on either side (env-disabled chat timeout, or disabled watchdog)
|
|
142
|
+
* means the first read is unbounded — the client signal still owns
|
|
143
|
+
* "nobody is listening".
|
|
144
|
+
*/
|
|
145
|
+
protected firstByteBudgetMs(chatTimeoutMs: number, stallTimeoutMs: number): number;
|
|
146
|
+
/** Distinct wording for a first-byte timeout (vs a mid-stream stall) so the
|
|
147
|
+
* attempt-trace error_summary tells slow prefill apart from a dead stream. */
|
|
148
|
+
protected firstByteTimeoutMessage(budgetMs: number): string;
|
|
149
|
+
/**
|
|
150
|
+
* Shared SSE reader for OpenAI-wire streaming endpoints (#231 audit).
|
|
151
|
+
*
|
|
152
|
+
* Hardened against the upstream failure modes observed live:
|
|
153
|
+
* - Inactivity timeout: fetchWithTimeout's abort timer dies the moment
|
|
154
|
+
* response HEADERS arrive, so a provider that stalls mid-body used to
|
|
155
|
+
* hang the client forever. Each read now has its own deadline. The FIRST
|
|
156
|
+
* read gets a grace budget derived from the platform's chat timeout
|
|
157
|
+
* (#584) — SSE headers can arrive instantly while the model prefills a
|
|
158
|
+
* long prompt for minutes, which is slow, not stalled.
|
|
159
|
+
* - Abrupt EOF: a stream that ends without `[DONE]` AND without any
|
|
160
|
+
* `finish_reason` is a truncated generation, not a completion. It used
|
|
161
|
+
* to end the generator silently (truncation logged as success); it now
|
|
162
|
+
* throws a retryable error so the proxy can fail over or report it.
|
|
163
|
+
* Providers that skip `[DONE]` but do send a terminal finish_reason
|
|
164
|
+
* (several compat shims) still complete normally.
|
|
165
|
+
*
|
|
166
|
+
* Malformed data lines are skipped, matching previous behavior.
|
|
167
|
+
*
|
|
168
|
+
* The frames additionally pass through the inline `<think>` extractor
|
|
169
|
+
* (lib/think-tags.ts): DeepSeek-style models that serialize their reasoning
|
|
170
|
+
* trace INTO delta.content as a leading `<think>…</think>` block get it
|
|
171
|
+
* moved to delta.reasoning_content, so downstream surfaces never render
|
|
172
|
+
* thinking as answer text. Streams without the tag are forwarded verbatim.
|
|
173
|
+
*/
|
|
174
|
+
protected readSseStream(res: Response, opts?: SseStreamOptions): AsyncGenerator<ChatCompletionChunk>;
|
|
175
|
+
private readSseFrames;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { proxyFetch } from '../lib/proxy.js';
|
|
2
|
+
import { providerTimeoutMs, streamStallTimeoutMs } from '../lib/provider-timeout.js';
|
|
3
|
+
import { extractThinkTagsFromStream } from '../lib/think-tags.js';
|
|
4
|
+
/** Upper bound on a provider-supplied back-off. A malformed or hostile
|
|
5
|
+
* `Retry-After` (e.g. 99999999999) would otherwise bench a key effectively
|
|
6
|
+
* forever, since the value feeds the cooldown expiry directly. A day is longer
|
|
7
|
+
* than any real free-tier reset window, so clamping cannot mask a genuine hint. */
|
|
8
|
+
const MAX_RETRY_AFTER_MS = 24 * 60 * 60 * 1000;
|
|
9
|
+
/** Parse an HTTP `Retry-After` header (delta-seconds or an HTTP-date) into a
|
|
10
|
+
* millisecond delay, clamped to MAX_RETRY_AFTER_MS. Returns undefined when
|
|
11
|
+
* absent or unparseable. */
|
|
12
|
+
export function parseRetryAfterMs(value) {
|
|
13
|
+
if (!value)
|
|
14
|
+
return undefined;
|
|
15
|
+
const trimmed = value.trim();
|
|
16
|
+
if (/^\d+$/.test(trimmed))
|
|
17
|
+
return Math.min(Number(trimmed) * 1000, MAX_RETRY_AFTER_MS);
|
|
18
|
+
const when = Date.parse(trimmed);
|
|
19
|
+
if (!Number.isNaN(when)) {
|
|
20
|
+
return Math.min(Math.max(0, when - Date.now()), MAX_RETRY_AFTER_MS);
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
/** A protobuf Duration, as google.rpc.RetryInfo spells its `retryDelay`:
|
|
25
|
+
* digits, an optional fraction, then a literal `s` ("17s", "1.5s", "0.25s"). */
|
|
26
|
+
const PROTOBUF_DURATION = /^(\d+(?:\.\d+)?)s$/;
|
|
27
|
+
/** "Please try again in 7.66s" / "retry after 30 seconds" / "try again in 2m".
|
|
28
|
+
* Anchored on an explicit retry phrase so an unrelated number in an error
|
|
29
|
+
* message can never be mistaken for a back-off. */
|
|
30
|
+
const PROSE_RETRY = /(?:try again|retry)\s+(?:in|after)\s+(\d+(?:\.\d+)?)\s*(ms|s|sec|secs|second|seconds|m|min|mins|minute|minutes|h|hour|hours)\b/i;
|
|
31
|
+
const UNIT_MS = {
|
|
32
|
+
ms: 1,
|
|
33
|
+
s: 1000, sec: 1000, secs: 1000, second: 1000, seconds: 1000,
|
|
34
|
+
m: 60_000, min: 60_000, mins: 60_000, minute: 60_000, minutes: 60_000,
|
|
35
|
+
h: 3_600_000, hour: 3_600_000, hours: 3_600_000,
|
|
36
|
+
};
|
|
37
|
+
function clampRetryMs(ms) {
|
|
38
|
+
if (!Number.isFinite(ms) || ms < 0)
|
|
39
|
+
return undefined;
|
|
40
|
+
return Math.min(ms, MAX_RETRY_AFTER_MS);
|
|
41
|
+
}
|
|
42
|
+
/** Depth-first search for the first `retryDelay`/`retry_after`-shaped field. The
|
|
43
|
+
* shape varies by provider and by endpoint within a provider, so walking is
|
|
44
|
+
* more durable than a list of exact paths — and cheaper to maintain than one
|
|
45
|
+
* parser per adapter. Depth-capped so a pathological body cannot spin. */
|
|
46
|
+
function findStatedDelayMs(node, depth = 0) {
|
|
47
|
+
if (depth > 6 || node === null || typeof node !== 'object')
|
|
48
|
+
return undefined;
|
|
49
|
+
if (Array.isArray(node)) {
|
|
50
|
+
for (const item of node) {
|
|
51
|
+
const found = findStatedDelayMs(item, depth + 1);
|
|
52
|
+
if (found !== undefined)
|
|
53
|
+
return found;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
for (const [key, value] of Object.entries(node)) {
|
|
58
|
+
const normalized = key.toLowerCase().replace(/[_-]/g, '');
|
|
59
|
+
if (normalized === 'retrydelay' || normalized === 'retryafter' || normalized === 'retryafterseconds') {
|
|
60
|
+
// google.rpc.RetryInfo states "17s"; other providers state bare seconds.
|
|
61
|
+
if (typeof value === 'string') {
|
|
62
|
+
const duration = PROTOBUF_DURATION.exec(value.trim());
|
|
63
|
+
if (duration)
|
|
64
|
+
return clampRetryMs(Number(duration[1]) * 1000);
|
|
65
|
+
if (/^\d+(\.\d+)?$/.test(value.trim()))
|
|
66
|
+
return clampRetryMs(Number(value) * 1000);
|
|
67
|
+
}
|
|
68
|
+
if (typeof value === 'number')
|
|
69
|
+
return clampRetryMs(value * 1000);
|
|
70
|
+
}
|
|
71
|
+
const found = findStatedDelayMs(value, depth + 1);
|
|
72
|
+
if (found !== undefined)
|
|
73
|
+
return found;
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The back-off a provider stated inside its error BODY, in milliseconds.
|
|
79
|
+
*
|
|
80
|
+
* Not every provider uses the Retry-After header. Gemini answers a 429 with
|
|
81
|
+
* `error.details[]` carrying a `google.rpc.RetryInfo` whose `retryDelay` is
|
|
82
|
+
* "17s", and several OpenAI-compatible tiers only say it in prose. Those hints
|
|
83
|
+
* were being thrown away: the body is flattened to a single message string
|
|
84
|
+
* before it reaches the router, so a provider that told us exactly when to come
|
|
85
|
+
* back got the same heuristic cooldown ladder as one that said nothing.
|
|
86
|
+
*/
|
|
87
|
+
export function parseStatedRetryMs(body) {
|
|
88
|
+
if (body == null)
|
|
89
|
+
return undefined;
|
|
90
|
+
if (typeof body !== 'string') {
|
|
91
|
+
const structured = findStatedDelayMs(body);
|
|
92
|
+
if (structured !== undefined)
|
|
93
|
+
return structured;
|
|
94
|
+
}
|
|
95
|
+
// Prose last: a stated field is a promise, a sentence is an observation.
|
|
96
|
+
const text = typeof body === 'string' ? body : safeStringify(body);
|
|
97
|
+
const prose = text ? PROSE_RETRY.exec(text) : null;
|
|
98
|
+
if (prose) {
|
|
99
|
+
const unit = UNIT_MS[prose[2].toLowerCase()];
|
|
100
|
+
if (unit)
|
|
101
|
+
return clampRetryMs(Number(prose[1]) * unit);
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
function safeStringify(value) {
|
|
106
|
+
try {
|
|
107
|
+
return JSON.stringify(value) ?? '';
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return ''; // Circular or otherwise unserialisable — no prose to read.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Build an error for a non-OK upstream response, capturing the status and any
|
|
114
|
+
* stated back-off. Used by every provider adapter so the proxy can honor a
|
|
115
|
+
* provider's explicit hint when it sets the cooldown.
|
|
116
|
+
*
|
|
117
|
+
* `body` is the already-parsed error payload the caller used to build
|
|
118
|
+
* `message`. Only a delay is read out of it and only a number is kept — the
|
|
119
|
+
* body itself is never retained, so nothing extra reaches a log or the
|
|
120
|
+
* attempt trace. The Retry-After header still wins when both are present: it
|
|
121
|
+
* is the standard channel, and preferring it keeps existing behavior exactly
|
|
122
|
+
* as it was. */
|
|
123
|
+
export function providerHttpError(res, message, body) {
|
|
124
|
+
const err = new Error(message);
|
|
125
|
+
err.status = res.status;
|
|
126
|
+
const retryAfterMs = parseRetryAfterMs(res.headers?.get('retry-after')) ?? parseStatedRetryMs(body);
|
|
127
|
+
if (retryAfterMs !== undefined)
|
|
128
|
+
err.retryAfterMs = retryAfterMs;
|
|
129
|
+
return err;
|
|
130
|
+
}
|
|
131
|
+
export class BaseProvider {
|
|
132
|
+
/** Providers whose free tier needs no API key (e.g. Kilo's anonymous gateway).
|
|
133
|
+
* When true, the gateway stores a sentinel key row so routing still considers
|
|
134
|
+
* the platform "configured", and the provider omits the Authorization header
|
|
135
|
+
* on outgoing requests. Defaults to false; set by subclasses. */
|
|
136
|
+
keyless = false;
|
|
137
|
+
/**
|
|
138
|
+
* Turn a conventional 401/403 validation response into a diagnostic result.
|
|
139
|
+
* Providers still return a simple boolean when no useful error body exists,
|
|
140
|
+
* but preserving the upstream message here lets the health service persist
|
|
141
|
+
* and display the reason instead of reducing every failure to "invalid".
|
|
142
|
+
*/
|
|
143
|
+
async validationResult(res) {
|
|
144
|
+
if (res.status !== 401 && res.status !== 403)
|
|
145
|
+
return true;
|
|
146
|
+
// A Cloudflare bot challenge ("Just a moment...") is a 403 about the
|
|
147
|
+
// caller's IP and User-Agent, not about the key. Surface it as
|
|
148
|
+
// inconclusive so health never auto-disables a good key behind it (#1298).
|
|
149
|
+
if (res.headers?.get('cf-mitigated') === 'challenge') {
|
|
150
|
+
throw providerHttpError(res, `${this.name} key validation blocked by a Cloudflare challenge (HTTP ${res.status}); the key was not checked`);
|
|
151
|
+
}
|
|
152
|
+
let body = null;
|
|
153
|
+
try {
|
|
154
|
+
if (typeof res.json === 'function')
|
|
155
|
+
body = await res.json();
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// A status and provider name are still more useful than no reason.
|
|
159
|
+
}
|
|
160
|
+
const detail = [
|
|
161
|
+
body?.error?.message,
|
|
162
|
+
body?.errors?.[0]?.message,
|
|
163
|
+
body?.message,
|
|
164
|
+
body?.detail,
|
|
165
|
+
body?.title,
|
|
166
|
+
res.statusText,
|
|
167
|
+
].find((value) => typeof value === 'string' && value.trim().length > 0);
|
|
168
|
+
return {
|
|
169
|
+
valid: false,
|
|
170
|
+
error: `${this.name} key validation failed (HTTP ${res.status})${detail ? `: ${detail}` : ''}`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async fetchWithTimeout(url, init,
|
|
174
|
+
// Adapters that don't pass a timeout inherit the platform's env override
|
|
175
|
+
// (PROVIDER_TIMEOUT_<PLATFORM>, issue #547) over the historical 15s.
|
|
176
|
+
timeoutMs = providerTimeoutMs(this.platform, 15000), fetchOpts) {
|
|
177
|
+
const signals = [];
|
|
178
|
+
if (fetchOpts?.signal)
|
|
179
|
+
signals.push(fetchOpts.signal);
|
|
180
|
+
// timeoutMs <= 0 means "no timeout" (PROVIDER_TIMEOUT_<PLATFORM>=0).
|
|
181
|
+
// setTimeout(abort, 0) would abort every request on the next macrotask.
|
|
182
|
+
let headerTimer;
|
|
183
|
+
if (timeoutMs > 0) {
|
|
184
|
+
const controller = new AbortController();
|
|
185
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
186
|
+
signals.push(controller.signal);
|
|
187
|
+
if (fetchOpts?.timeoutBounds === 'request') {
|
|
188
|
+
// Whole-request deadline: stays armed across the body read, so a 200
|
|
189
|
+
// whose body never finishes aborts res.json() at timeoutMs instead of
|
|
190
|
+
// hanging forever. Never cleared — firing after the response is fully
|
|
191
|
+
// consumed is a no-op — and unref'd so a spent request's leftover
|
|
192
|
+
// deadline can't hold the process open.
|
|
193
|
+
timer.unref?.();
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Historical header-only deadline: disarmed the moment response
|
|
197
|
+
// HEADERS arrive (see finally). Streams need this — an SSE body
|
|
198
|
+
// legitimately outlives any fixed deadline, and mid-stream hangs are
|
|
199
|
+
// owned by the stall watchdog (readSseStream) + the client signal.
|
|
200
|
+
headerTimer = timer;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Compose the per-attempt timeout with the client-disconnect signal.
|
|
204
|
+
// Unlike the timeout, the client signal is never disarmed: undici ties it
|
|
205
|
+
// to the whole request, so a disconnect also aborts body reads and stream
|
|
206
|
+
// iteration, rejecting them with the marked reason from newClientAbortError.
|
|
207
|
+
const signal = signals.length === 0
|
|
208
|
+
? init.signal ?? undefined
|
|
209
|
+
: signals.length === 1 ? signals[0] : AbortSignal.any(signals);
|
|
210
|
+
try {
|
|
211
|
+
// requestType='chat' + timeoutMs makes the AbortError message read
|
|
212
|
+
// `<platform>, chat, 15s` for triage from the requests.error column.
|
|
213
|
+
return await proxyFetch(url, signal ? { ...init, signal } : init, this.platform, 'chat', timeoutMs);
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
if (headerTimer !== undefined)
|
|
217
|
+
clearTimeout(headerTimer);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
makeId() {
|
|
221
|
+
return `chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* One reader.read() bounded by the mid-stream inactivity watchdog (#553).
|
|
225
|
+
* Shared by readSseStream and adapters that parse their own wire format
|
|
226
|
+
* (google.ts) so every stream gets the same stall semantics:
|
|
227
|
+
* PROVIDER_STREAM_STALL_TIMEOUT_MS (per-platform override
|
|
228
|
+
* PROVIDER_STREAM_STALL_TIMEOUT_<PLATFORM>, #584), default 90s, 0 disables.
|
|
229
|
+
* Client-abort rejections pass through untouched — undici errors the body
|
|
230
|
+
* with the request signal's reason, so a disconnect surfaces here as the
|
|
231
|
+
* marked error from newClientAbortError, not as a stall. `timeoutMessage`
|
|
232
|
+
* lets the first-byte read report its distinct wording (#584).
|
|
233
|
+
*/
|
|
234
|
+
async readWithStallTimeout(read, inactivityTimeoutMs, timeoutMessage) {
|
|
235
|
+
if (inactivityTimeoutMs <= 0)
|
|
236
|
+
return read();
|
|
237
|
+
let timer;
|
|
238
|
+
return Promise.race([
|
|
239
|
+
read(),
|
|
240
|
+
new Promise((_, reject) => {
|
|
241
|
+
timer = setTimeout(() => reject(new Error(timeoutMessage ?? `${this.name} stream stalled: no data for ${inactivityTimeoutMs}ms (timeout)`)), inactivityTimeoutMs);
|
|
242
|
+
}),
|
|
243
|
+
]).finally(() => clearTimeout(timer));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Budget for the FIRST read of a streaming body (issue #584): the platform's
|
|
247
|
+
* chat timeout is already "how slow may the first token be" — tuned per
|
|
248
|
+
* platform at registration and env-overridable via PROVIDER_TIMEOUT_<PLATFORM>
|
|
249
|
+
* — but on streams it is disarmed the moment response HEADERS arrive, and
|
|
250
|
+
* providers like NVIDIA NIM send SSE headers instantly then prefill for
|
|
251
|
+
* minutes. Floored at the stall budget so a platform with a short chat
|
|
252
|
+
* timeout never gets a STRICTER first read than the pre-#584 watchdog gave
|
|
253
|
+
* it. 0 on either side (env-disabled chat timeout, or disabled watchdog)
|
|
254
|
+
* means the first read is unbounded — the client signal still owns
|
|
255
|
+
* "nobody is listening".
|
|
256
|
+
*/
|
|
257
|
+
firstByteBudgetMs(chatTimeoutMs, stallTimeoutMs) {
|
|
258
|
+
if (chatTimeoutMs <= 0 || stallTimeoutMs <= 0)
|
|
259
|
+
return 0;
|
|
260
|
+
return Math.max(chatTimeoutMs, stallTimeoutMs);
|
|
261
|
+
}
|
|
262
|
+
/** Distinct wording for a first-byte timeout (vs a mid-stream stall) so the
|
|
263
|
+
* attempt-trace error_summary tells slow prefill apart from a dead stream. */
|
|
264
|
+
firstByteTimeoutMessage(budgetMs) {
|
|
265
|
+
return `${this.name} stream: no first byte within ${budgetMs}ms (first-byte timeout)`;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Shared SSE reader for OpenAI-wire streaming endpoints (#231 audit).
|
|
269
|
+
*
|
|
270
|
+
* Hardened against the upstream failure modes observed live:
|
|
271
|
+
* - Inactivity timeout: fetchWithTimeout's abort timer dies the moment
|
|
272
|
+
* response HEADERS arrive, so a provider that stalls mid-body used to
|
|
273
|
+
* hang the client forever. Each read now has its own deadline. The FIRST
|
|
274
|
+
* read gets a grace budget derived from the platform's chat timeout
|
|
275
|
+
* (#584) — SSE headers can arrive instantly while the model prefills a
|
|
276
|
+
* long prompt for minutes, which is slow, not stalled.
|
|
277
|
+
* - Abrupt EOF: a stream that ends without `[DONE]` AND without any
|
|
278
|
+
* `finish_reason` is a truncated generation, not a completion. It used
|
|
279
|
+
* to end the generator silently (truncation logged as success); it now
|
|
280
|
+
* throws a retryable error so the proxy can fail over or report it.
|
|
281
|
+
* Providers that skip `[DONE]` but do send a terminal finish_reason
|
|
282
|
+
* (several compat shims) still complete normally.
|
|
283
|
+
*
|
|
284
|
+
* Malformed data lines are skipped, matching previous behavior.
|
|
285
|
+
*
|
|
286
|
+
* The frames additionally pass through the inline `<think>` extractor
|
|
287
|
+
* (lib/think-tags.ts): DeepSeek-style models that serialize their reasoning
|
|
288
|
+
* trace INTO delta.content as a leading `<think>…</think>` block get it
|
|
289
|
+
* moved to delta.reasoning_content, so downstream surfaces never render
|
|
290
|
+
* thinking as answer text. Streams without the tag are forwarded verbatim.
|
|
291
|
+
*/
|
|
292
|
+
async *readSseStream(res, opts) {
|
|
293
|
+
yield* extractThinkTagsFromStream(this.readSseFrames(res, opts));
|
|
294
|
+
}
|
|
295
|
+
async *readSseFrames(res, opts) {
|
|
296
|
+
const reader = res.body?.getReader();
|
|
297
|
+
if (!reader)
|
|
298
|
+
throw new Error('No response body');
|
|
299
|
+
// The 90s default was hardcoded and silently truncated slow streams — the
|
|
300
|
+
// gateway ended them with an error frame plus a clean [DONE] that OpenAI
|
|
301
|
+
// SDK clients swallow, so responses "just stopped" (issue #553). Operators
|
|
302
|
+
// proxying slow free tiers can raise it (or 0 to disable) via
|
|
303
|
+
// PROVIDER_STREAM_STALL_TIMEOUT_MS, or per platform via
|
|
304
|
+
// PROVIDER_STREAM_STALL_TIMEOUT_<PLATFORM> (#584).
|
|
305
|
+
const inactivityTimeoutMs = opts?.stallTimeoutMs ?? streamStallTimeoutMs(this.platform);
|
|
306
|
+
// First-byte grace (#584): adapters pass the same chat timeout they gave
|
|
307
|
+
// fetchWithTimeout; the fallback mirrors fetchWithTimeout's own default so
|
|
308
|
+
// adapters that never tuned either stay on max(15s-or-env, stall) — i.e.
|
|
309
|
+
// exactly the stall budget they had before.
|
|
310
|
+
const chatTimeoutMs = opts?.firstByteTimeoutMs ?? providerTimeoutMs(this.platform, 15000);
|
|
311
|
+
const firstByteMs = this.firstByteBudgetMs(chatTimeoutMs, inactivityTimeoutMs);
|
|
312
|
+
const decoder = new TextDecoder();
|
|
313
|
+
let buffer = '';
|
|
314
|
+
let sawFinishReason = false;
|
|
315
|
+
let awaitingFirstByte = true;
|
|
316
|
+
try {
|
|
317
|
+
while (true) {
|
|
318
|
+
const { done, value } = awaitingFirstByte
|
|
319
|
+
? await this.readWithStallTimeout(() => reader.read(), firstByteMs, this.firstByteTimeoutMessage(firstByteMs))
|
|
320
|
+
: await this.readWithStallTimeout(() => reader.read(), inactivityTimeoutMs);
|
|
321
|
+
awaitingFirstByte = false;
|
|
322
|
+
if (done)
|
|
323
|
+
break;
|
|
324
|
+
buffer += decoder.decode(value, { stream: true });
|
|
325
|
+
const lines = buffer.split('\n');
|
|
326
|
+
buffer = lines.pop() ?? '';
|
|
327
|
+
for (const line of lines) {
|
|
328
|
+
const trimmed = line.trim();
|
|
329
|
+
if (!trimmed || !trimmed.startsWith('data:'))
|
|
330
|
+
continue;
|
|
331
|
+
const data = trimmed.slice(5).replace(/^ /, '');
|
|
332
|
+
if (data === '[DONE]')
|
|
333
|
+
return;
|
|
334
|
+
try {
|
|
335
|
+
const chunk = JSON.parse(data);
|
|
336
|
+
if (chunk.choices?.some(c => c.finish_reason != null))
|
|
337
|
+
sawFinishReason = true;
|
|
338
|
+
yield chunk;
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// Skip malformed chunks
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
reader.cancel().catch(() => { });
|
|
348
|
+
}
|
|
349
|
+
if (!sawFinishReason) {
|
|
350
|
+
throw new Error(`${this.name} stream ended unexpectedly (no [DONE], no finish_reason) — connection reset or truncated upstream`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChatCompletionChunk, ChatCompletionResponse, ChatMessage } from '@srouter/shared/types.js';
|
|
2
|
+
import { type CompletionOptions, type KeyValidationResult } from './base.js';
|
|
3
|
+
import type { QuotaObservationContext } from '../services/provider-quota.js';
|
|
4
|
+
import { OpenAICompatProvider } from './openai-compat.js';
|
|
5
|
+
export declare class BlazeProvider extends OpenAICompatProvider {
|
|
6
|
+
protected validationResult(response: Response): Promise<KeyValidationResult>;
|
|
7
|
+
constructor();
|
|
8
|
+
chatCompletion(apiKey: string, messages: ChatMessage[], modelId: string, options?: CompletionOptions, quotaContext?: QuotaObservationContext): Promise<ChatCompletionResponse>;
|
|
9
|
+
streamChatCompletion(apiKey: string, messages: ChatMessage[], modelId: string, options?: CompletionOptions, quotaContext?: QuotaObservationContext): AsyncGenerator<ChatCompletionChunk>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=blaze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blaze.d.ts","sourceRoot":"","sources":["../../src/providers/blaze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,qBAAa,aAAc,SAAQ,oBAAoB;cAC5B,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC;;IAc5E,cAAc,CAC3B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EACxD,OAAO,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,uBAAuB,GAClE,OAAO,CAAC,sBAAsB,CAAC;IAMlB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EACxD,OAAO,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,uBAAuB,GAClE,cAAc,CAAC,mBAAmB,CAAC;CAMvC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { providerHttpError } from './base.js';
|
|
2
|
+
import { OpenAICompatProvider } from './openai-compat.js';
|
|
3
|
+
function checkModel(requested, returned) {
|
|
4
|
+
if (!returned || returned !== requested) {
|
|
5
|
+
throw Object.assign(new Error('BlazeAPI returned a different or missing model identity'), { status: 502 });
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class BlazeProvider extends OpenAICompatProvider {
|
|
9
|
+
async validationResult(response) {
|
|
10
|
+
if (!response.ok && ![401, 403].includes(response.status)) {
|
|
11
|
+
throw providerHttpError(response, 'BlazeAPI key validation is temporarily inconclusive');
|
|
12
|
+
}
|
|
13
|
+
return super.validationResult(response);
|
|
14
|
+
}
|
|
15
|
+
constructor() {
|
|
16
|
+
// Despite its name, /paid/v1 is also the documented Free-plan endpoint.
|
|
17
|
+
// Named catalog routes only: no fallback to a paid or automatic route.
|
|
18
|
+
super({ platform: 'blaze', name: 'BlazeAPI', baseUrl: 'https://api.blazeapi.org/paid/v1',
|
|
19
|
+
validateUrl: 'https://api.blazeapi.org/paid/v1/usage' });
|
|
20
|
+
}
|
|
21
|
+
async chatCompletion(apiKey, messages, modelId, options, quotaContext) {
|
|
22
|
+
const response = await super.chatCompletion(apiKey, messages, modelId, options, quotaContext);
|
|
23
|
+
checkModel(modelId, response.model);
|
|
24
|
+
return response;
|
|
25
|
+
}
|
|
26
|
+
async *streamChatCompletion(apiKey, messages, modelId, options, quotaContext) {
|
|
27
|
+
for await (const chunk of super.streamChatCompletion(apiKey, messages, modelId, options, quotaContext)) {
|
|
28
|
+
checkModel(modelId, chunk.model);
|
|
29
|
+
yield chunk;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=blaze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blaze.js","sourceRoot":"","sources":["../../src/providers/blaze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAoD,MAAM,WAAW,CAAC;AAEhG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,SAAS,UAAU,CAAC,SAAiB,EAAE,QAAgB;IACrD,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC;AAED,MAAM,OAAO,aAAc,SAAQ,oBAAoB;IAClC,KAAK,CAAC,gBAAgB,CAAC,QAAkB;QAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,MAAM,iBAAiB,CAAC,QAAQ,EAAE,qDAAqD,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED;QACE,wEAAwE;QACxE,uEAAuE;QACvE,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kCAAkC;YACtF,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAEQ,KAAK,CAAC,cAAc,CAC3B,MAAc,EAAE,QAAuB,EAAE,OAAe,EACxD,OAA2B,EAAE,YAAsC;QAEnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9F,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEQ,KAAK,CAAC,CAAC,oBAAoB,CAClC,MAAc,EAAE,QAAuB,EAAE,OAAe,EACxD,OAA2B,EAAE,YAAsC;QAEnE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YACvG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ChatCompletionChunk, ChatCompletionResponse, ChatMessage } from '@srouter/shared/types.js';
|
|
2
|
+
import { type CompletionOptions, type KeyValidationResult } from './base.js';
|
|
3
|
+
import { OpenAICompatProvider } from './openai-compat.js';
|
|
4
|
+
import type { QuotaObservationContext } from '../services/provider-quota.js';
|
|
5
|
+
export declare const BLOCKRUN_BASE_URL = "https://api.blockrun.ai/v1";
|
|
6
|
+
/** API-key gateway, NOT the separate wallet/x402 endpoint. Only tested $0
|
|
7
|
+
* routes enter the signed catalog; the public roster also includes paid IDs. */
|
|
8
|
+
export declare class BlockRunProvider extends OpenAICompatProvider {
|
|
9
|
+
constructor();
|
|
10
|
+
protected validationResult(response: Response): Promise<KeyValidationResult>;
|
|
11
|
+
chatCompletion(apiKey: string, messages: ChatMessage[], modelId: string, options?: CompletionOptions, quotaContext?: QuotaObservationContext): Promise<ChatCompletionResponse>;
|
|
12
|
+
streamChatCompletion(apiKey: string, messages: ChatMessage[], modelId: string, options?: CompletionOptions, quotaContext?: QuotaObservationContext): AsyncGenerator<ChatCompletionChunk>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=blockrun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockrun.d.ts","sourceRoot":"","sources":["../../src/providers/blockrun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAE7E,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAU9D;gFACgF;AAChF,qBAAa,gBAAiB,SAAQ,oBAAoB;;cAM/B,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO5E,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EACpF,OAAO,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAMvF,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAC3F,OAAO,CAAC,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,uBAAuB,GAAG,cAAc,CAAC,mBAAmB,CAAC;CAM5G"}
|