@prometheus-ai/ai 0.5.4 → 0.5.8
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/dist/types/auth-broker/remote-store.d.ts +2 -1
- package/dist/types/auth-broker/wire-schemas.d.ts +4 -1
- package/dist/types/auth-gateway/server.d.ts +19 -0
- package/dist/types/auth-gateway/types.d.ts +9 -3
- package/dist/types/auth-retry.d.ts +119 -0
- package/dist/types/auth-storage.d.ts +217 -8
- package/dist/types/errors.d.ts +24 -0
- package/dist/types/index.d.ts +5 -9
- package/dist/types/provider-details.d.ts +1 -1
- package/dist/types/providers/amazon-bedrock.d.ts +12 -6
- package/dist/types/providers/anthropic-client.d.ts +10 -3
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +2 -2
- package/dist/types/providers/anthropic-messages-server.d.ts +3 -3
- package/dist/types/providers/anthropic-wire.d.ts +3 -3
- package/dist/types/providers/anthropic.d.ts +41 -34
- package/dist/types/providers/aws-credentials.d.ts +8 -0
- package/dist/types/providers/azure-openai-responses.d.ts +1 -0
- package/dist/types/providers/google-gemini-cli.d.ts +22 -1
- package/dist/types/providers/google-shared.d.ts +22 -0
- package/dist/types/providers/google-types.d.ts +13 -1
- package/dist/types/providers/mock.d.ts +8 -3
- package/dist/types/providers/ollama.d.ts +6 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +6 -3
- package/dist/types/providers/openai-chat-server.d.ts +3 -3
- package/dist/types/providers/openai-chat-wire.d.ts +644 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +8 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +9 -0
- package/dist/types/providers/openai-codex-responses.d.ts +31 -2
- package/dist/types/providers/openai-completions-compat.d.ts +2 -25
- package/dist/types/providers/openai-completions.d.ts +2 -10
- package/dist/types/providers/openai-responses-server-schema.d.ts +4 -4
- package/dist/types/providers/openai-responses-server.d.ts +2 -2
- package/dist/types/providers/openai-responses-shared.d.ts +49 -9
- package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
- package/dist/types/providers/openai-responses.d.ts +13 -4
- package/dist/types/providers/prometheus-native-client.d.ts +9 -0
- package/dist/types/providers/prometheus-native-server.d.ts +4 -3
- package/dist/types/providers/transform-messages.d.ts +1 -2
- package/dist/types/rate-limit-utils.d.ts +3 -2
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +7 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/{utils/oauth → registry}/api-key-login.d.ts +8 -2
- package/dist/types/{utils/oauth → registry}/api-key-validation.d.ts +15 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
- package/dist/types/{utils → registry}/oauth/anthropic.d.ts +2 -1
- package/dist/types/{utils → registry}/oauth/github-copilot.d.ts +15 -23
- package/dist/types/{utils → registry}/oauth/index.d.ts +1 -0
- package/dist/types/{utils → registry}/oauth/minimax-code.d.ts +5 -5
- package/dist/types/{utils → registry}/oauth/types.d.ts +6 -1
- package/dist/types/{utils → registry}/oauth/xai-oauth.d.ts +2 -1
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +272 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +51 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-pass.d.ts +6 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +4 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +7 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +9 -1
- package/dist/types/types.d.ts +56 -295
- package/dist/types/usage/google-antigravity.d.ts +15 -1
- package/dist/types/usage/openai-codex-reset.d.ts +79 -0
- package/dist/types/usage/openai-codex.d.ts +1 -0
- package/dist/types/usage.d.ts +77 -4
- package/dist/types/utils/abort.d.ts +6 -0
- package/dist/types/utils/event-stream.d.ts +2 -0
- package/dist/types/utils/http-inspector.d.ts +0 -1
- package/dist/types/utils/idle-iterator.d.ts +35 -0
- package/dist/types/utils/openai-http.d.ts +58 -0
- package/dist/types/utils/request-debug.d.ts +3 -0
- package/dist/types/utils/retry-after.d.ts +1 -0
- package/dist/types/utils/schema/fields.d.ts +5 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +7 -15
- package/dist/types/utils/sse-debug.d.ts +0 -5
- package/dist/types/utils/stream-markup-healing.d.ts +2 -0
- package/dist/types/utils.d.ts +1 -5
- package/package.json +17 -29
- package/src/auth-broker/remote-store.ts +10 -1
- package/src/auth-broker/snapshot-cache.ts +1 -1
- package/src/auth-broker/wire-schemas.ts +1 -1
- package/src/auth-gateway/http.ts +1 -1
- package/src/auth-gateway/server.ts +95 -30
- package/src/auth-gateway/types.ts +10 -2
- package/src/auth-retry.ts +238 -0
- package/src/auth-storage.ts +935 -430
- package/src/errors.ts +32 -0
- package/src/index.ts +9 -14
- package/src/provider-details.ts +1 -1
- package/src/providers/__tests__/google-auth.test.ts +144 -0
- package/src/providers/amazon-bedrock.ts +70 -40
- package/src/providers/anthropic-client.ts +15 -13
- package/src/providers/anthropic-messages-server-schema.ts +17 -7
- package/src/providers/anthropic-messages-server.ts +88 -20
- package/src/providers/anthropic-wire.ts +4 -3
- package/src/providers/anthropic.ts +1234 -621
- package/src/providers/aws-credentials.ts +47 -5
- package/src/providers/aws-eventstream.ts +5 -0
- package/src/providers/azure-openai-responses.ts +117 -67
- package/src/providers/cursor.ts +30 -30
- package/src/providers/github-copilot-headers.ts +1 -1
- package/src/providers/gitlab-duo.ts +36 -29
- package/src/providers/google-auth.ts +71 -8
- package/src/providers/google-gemini-cli.ts +118 -22
- package/src/providers/google-shared.ts +163 -43
- package/src/providers/google-types.ts +10 -1
- package/src/providers/kimi.ts +1 -1
- package/src/providers/mock.ts +11 -3
- package/src/providers/ollama.ts +64 -7
- package/src/providers/openai-anthropic-shim.ts +17 -8
- package/src/providers/openai-chat-server-schema.ts +9 -3
- package/src/providers/openai-chat-server.ts +82 -16
- package/src/providers/openai-chat-wire.ts +847 -0
- package/src/providers/openai-codex/request-transformer.ts +129 -34
- package/src/providers/openai-codex/response-handler.ts +22 -1
- package/src/providers/openai-codex-responses.ts +699 -247
- package/src/providers/openai-completions-compat.ts +8 -308
- package/src/providers/openai-completions.ts +416 -267
- package/src/providers/openai-responses-server-schema.ts +15 -9
- package/src/providers/openai-responses-server.ts +162 -114
- package/src/providers/openai-responses-shared.ts +320 -82
- package/src/providers/openai-responses-wire.ts +6391 -0
- package/src/providers/openai-responses.ts +382 -176
- package/src/providers/prometheus-native-client.ts +27 -11
- package/src/providers/prometheus-native-server.ts +44 -17
- package/src/providers/transform-messages.ts +311 -120
- package/src/providers/vision-guard.ts +5 -3
- package/src/rate-limit-utils.ts +13 -3
- package/src/registry/aimlapi.ts +6 -0
- package/src/{utils/oauth → registry}/alibaba-coding-plan.ts +8 -18
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/{utils/oauth → registry}/api-key-login.ts +25 -3
- package/src/{utils/oauth → registry}/api-key-validation.ts +62 -2
- package/src/{utils/oauth → registry}/cerebras.ts +8 -1
- package/src/{utils/oauth → registry}/cloudflare-ai-gateway.ts +8 -12
- package/src/registry/cursor.ts +20 -0
- package/src/{utils/oauth → registry}/deepseek.ts +9 -17
- package/src/registry/derived.ts +9 -0
- package/src/{utils/oauth → registry}/firepass.ts +10 -2
- package/src/{utils/oauth → registry}/fireworks.ts +8 -1
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/google-antigravity.ts +21 -0
- package/src/registry/google-gemini-cli.ts +21 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/{utils/oauth → registry}/huggingface.ts +8 -19
- package/src/registry/index.ts +4 -0
- package/src/{utils/oauth → registry}/kagi.ts +9 -11
- package/src/{utils/oauth → registry}/kilo.ts +11 -6
- package/src/registry/kimi-code.ts +17 -0
- package/src/{utils/oauth → registry}/litellm.ts +8 -12
- package/src/{utils/oauth → registry}/lm-studio.ts +9 -17
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/{utils/oauth → registry}/moonshot.ts +8 -9
- package/src/{utils/oauth → registry}/nanogpt.ts +8 -1
- package/src/{utils/oauth → registry}/nvidia.ts +8 -18
- package/src/{utils → registry}/oauth/__tests__/xai-oauth.test.ts +4 -7
- package/src/{utils → registry}/oauth/anthropic.ts +38 -17
- package/src/{utils → registry}/oauth/github-copilot.ts +79 -115
- package/src/registry/oauth/gitlab-duo.ts +198 -0
- package/src/{utils → registry}/oauth/google-antigravity.ts +1 -4
- package/src/{utils → registry}/oauth/google-gemini-cli.ts +1 -4
- package/src/registry/oauth/index.ts +164 -0
- package/src/{utils → registry}/oauth/minimax-code.ts +16 -14
- package/src/{utils → registry}/oauth/types.ts +7 -51
- package/src/{utils → registry}/oauth/wafer.ts +1 -1
- package/src/{utils → registry}/oauth/xai-oauth.ts +16 -8
- package/src/{utils → registry}/oauth/xiaomi.ts +9 -4
- package/src/{utils/oauth → registry}/ollama-cloud.ts +8 -1
- package/src/{utils/oauth → registry}/ollama.ts +8 -13
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/{utils/oauth → registry}/openrouter.ts +10 -2
- package/src/{utils/oauth → registry}/parallel.ts +9 -11
- package/src/registry/perplexity.ts +13 -0
- package/src/{utils/oauth → registry}/qianfan.ts +8 -17
- package/src/{utils/oauth → registry}/qwen-portal.ts +8 -19
- package/src/registry/registry.ts +149 -0
- package/src/{utils/oauth → registry}/synthetic.ts +7 -1
- package/src/{utils/oauth → registry}/tavily.ts +10 -12
- package/src/{utils/oauth → registry}/together.ts +7 -1
- package/src/registry/types.ts +56 -0
- package/src/{utils/oauth → registry}/venice.ts +8 -12
- package/src/{utils/oauth → registry}/vercel-ai-gateway.ts +8 -18
- package/src/{utils/oauth → registry}/vllm.ts +9 -16
- package/src/registry/wafer-pass.ts +12 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +6 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/{utils/oauth → registry}/zai.ts +10 -22
- package/src/{utils/oauth → registry}/zenmux.ts +8 -1
- package/src/{utils/oauth/zhipu.ts → registry/zhipu-coding-plan.ts} +9 -21
- package/src/stream.ts +229 -199
- package/src/types.ts +63 -384
- package/src/usage/claude.ts +4 -2
- package/src/usage/github-copilot.ts +4 -2
- package/src/usage/google-antigravity.ts +196 -28
- package/src/usage/kimi.ts +1 -1
- package/src/usage/minimax-code.ts +5 -6
- package/src/usage/openai-codex-reset.ts +174 -0
- package/src/usage/openai-codex.ts +19 -2
- package/src/usage/zai.ts +2 -1
- package/src/usage.ts +93 -4
- package/src/utils/abort.ts +14 -0
- package/src/utils/event-stream.ts +17 -0
- package/src/utils/http-inspector.ts +4 -12
- package/src/utils/idle-iterator.ts +250 -79
- package/src/utils/openai-http.ts +157 -0
- package/src/utils/request-debug.ts +67 -19
- package/src/utils/retry-after.ts +1 -1
- package/src/utils/retry.ts +23 -2
- package/src/utils/schema/CONSTRAINTS.md +4 -2
- package/src/utils/schema/fields.ts +16 -0
- package/src/utils/schema/json-schema-validator.ts +19 -1
- package/src/utils/schema/normalize.ts +80 -8
- package/src/utils/schema/stamps.ts +22 -10
- package/src/utils/schema/wire.ts +2 -2
- package/src/utils/sse-debug.ts +0 -271
- package/src/utils/stream-markup-healing.ts +50 -8
- package/src/utils/validation.ts +49 -13
- package/src/utils.ts +2 -26
- package/dist/types/model-cache.d.ts +0 -17
- package/dist/types/model-manager.d.ts +0 -64
- package/dist/types/model-thinking.d.ts +0 -100
- package/dist/types/models.d.ts +0 -12
- package/dist/types/provider-models/bundled-references.d.ts +0 -4
- package/dist/types/provider-models/descriptors.d.ts +0 -50
- package/dist/types/provider-models/google.d.ts +0 -24
- package/dist/types/provider-models/index.d.ts +0 -5
- package/dist/types/provider-models/ollama.d.ts +0 -7
- package/dist/types/provider-models/openai-compat.d.ts +0 -323
- package/dist/types/provider-models/special.d.ts +0 -16
- package/dist/types/utils/discovery/antigravity.d.ts +0 -61
- package/dist/types/utils/discovery/codex.d.ts +0 -38
- package/dist/types/utils/discovery/cursor.d.ts +0 -23
- package/dist/types/utils/discovery/gemini.d.ts +0 -25
- package/dist/types/utils/discovery/index.d.ts +0 -4
- package/dist/types/utils/discovery/openai-compatible.d.ts +0 -72
- package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +0 -18
- package/dist/types/utils/oauth/cerebras.d.ts +0 -1
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +0 -18
- package/dist/types/utils/oauth/deepseek.d.ts +0 -10
- package/dist/types/utils/oauth/firepass.d.ts +0 -1
- package/dist/types/utils/oauth/fireworks.d.ts +0 -1
- package/dist/types/utils/oauth/huggingface.d.ts +0 -19
- package/dist/types/utils/oauth/kagi.d.ts +0 -17
- package/dist/types/utils/oauth/kilo.d.ts +0 -5
- package/dist/types/utils/oauth/litellm.d.ts +0 -18
- package/dist/types/utils/oauth/lm-studio.d.ts +0 -17
- package/dist/types/utils/oauth/moonshot.d.ts +0 -1
- package/dist/types/utils/oauth/nanogpt.d.ts +0 -1
- package/dist/types/utils/oauth/nvidia.d.ts +0 -18
- package/dist/types/utils/oauth/ollama-cloud.d.ts +0 -2
- package/dist/types/utils/oauth/ollama.d.ts +0 -18
- package/dist/types/utils/oauth/openrouter.d.ts +0 -1
- package/dist/types/utils/oauth/parallel.d.ts +0 -17
- package/dist/types/utils/oauth/qianfan.d.ts +0 -17
- package/dist/types/utils/oauth/qwen-portal.d.ts +0 -19
- package/dist/types/utils/oauth/synthetic.d.ts +0 -1
- package/dist/types/utils/oauth/tavily.d.ts +0 -17
- package/dist/types/utils/oauth/together.d.ts +0 -1
- package/dist/types/utils/oauth/venice.d.ts +0 -18
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +0 -18
- package/dist/types/utils/oauth/vllm.d.ts +0 -16
- package/dist/types/utils/oauth/zai.d.ts +0 -18
- package/dist/types/utils/oauth/zenmux.d.ts +0 -1
- package/dist/types/utils/oauth/zhipu.d.ts +0 -18
- package/src/model-cache.ts +0 -129
- package/src/model-manager.ts +0 -469
- package/src/model-thinking.ts +0 -756
- package/src/models.json +0 -60287
- package/src/models.json.d.ts +0 -9
- package/src/models.ts +0 -56
- package/src/provider-models/bundled-references.ts +0 -38
- package/src/provider-models/descriptors.ts +0 -364
- package/src/provider-models/google.ts +0 -88
- package/src/provider-models/index.ts +0 -5
- package/src/provider-models/ollama.ts +0 -153
- package/src/provider-models/openai-compat.ts +0 -2904
- package/src/provider-models/special.ts +0 -67
- package/src/utils/discovery/antigravity.ts +0 -261
- package/src/utils/discovery/codex.ts +0 -371
- package/src/utils/discovery/cursor.ts +0 -306
- package/src/utils/discovery/gemini.ts +0 -248
- package/src/utils/discovery/index.ts +0 -4
- package/src/utils/discovery/openai-compatible.ts +0 -224
- package/src/utils/oauth/gitlab-duo.ts +0 -123
- package/src/utils/oauth/index.ts +0 -502
- /package/dist/types/{utils/oauth/__tests__/xai-oauth.test.d.ts → providers/__tests__/google-auth.test.d.ts} +0 -0
- /package/dist/types/{utils → registry}/oauth/callback-server.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/cursor.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/gitlab-duo.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/google-antigravity.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/google-gemini-cli.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/google-oauth-shared.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/kimi.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/openai-codex.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/opencode.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/perplexity.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/pkce.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/wafer.d.ts +0 -0
- /package/dist/types/{utils → registry}/oauth/xiaomi.d.ts +0 -0
- /package/src/{utils → registry}/oauth/callback-server.ts +0 -0
- /package/src/{utils → registry}/oauth/cursor.ts +0 -0
- /package/src/{utils → registry}/oauth/google-oauth-shared.ts +0 -0
- /package/src/{utils → registry}/oauth/kimi.ts +0 -0
- /package/src/{utils → registry}/oauth/oauth.html +0 -0
- /package/src/{utils → registry}/oauth/openai-codex.ts +0 -0
- /package/src/{utils → registry}/oauth/opencode.ts +0 -0
- /package/src/{utils → registry}/oauth/perplexity.ts +0 -0
- /package/src/{utils → registry}/oauth/pkce.ts +0 -0
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { UNK_CONTEXT_WINDOW, UNK_MAX_TOKENS } from "@prometheus-ai/ai";
|
|
2
|
-
import * as z from "zod/v4";
|
|
3
|
-
import type { Api, Model, Provider } from "../../types";
|
|
4
|
-
|
|
5
|
-
const MODELS_PATH = "/models";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Minimal OpenAI-style model entry shape consumed by discovery.
|
|
9
|
-
*
|
|
10
|
-
* Providers may return additional fields; this type only captures
|
|
11
|
-
* fields that are useful for generic normalization.
|
|
12
|
-
*/
|
|
13
|
-
export interface OpenAICompatibleModelRecord {
|
|
14
|
-
id?: unknown;
|
|
15
|
-
name?: unknown;
|
|
16
|
-
object?: unknown;
|
|
17
|
-
owned_by?: unknown;
|
|
18
|
-
[key: string]: unknown;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Tolerant envelope for OpenAI-compatible `/models` responses.
|
|
23
|
-
*
|
|
24
|
-
* Common providers return `{ data: [...] }`, but variants such as
|
|
25
|
-
* `{ models: [...] }`, `{ result: [...] }`, or direct arrays are also
|
|
26
|
-
* accepted during extraction.
|
|
27
|
-
*/
|
|
28
|
-
export interface OpenAICompatibleModelsEnvelope {
|
|
29
|
-
data?: unknown;
|
|
30
|
-
models?: unknown;
|
|
31
|
-
result?: unknown;
|
|
32
|
-
items?: unknown;
|
|
33
|
-
[key: string]: unknown;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const openAICompatibleModelRecordSchema = z
|
|
37
|
-
.object({
|
|
38
|
-
id: z.string().min(1),
|
|
39
|
-
name: z.string().optional().nullable(),
|
|
40
|
-
object: z.unknown().optional(),
|
|
41
|
-
owned_by: z.unknown().optional(),
|
|
42
|
-
})
|
|
43
|
-
.loose();
|
|
44
|
-
|
|
45
|
-
const openAICompatibleModelsEnvelopeSchema = z
|
|
46
|
-
.object({
|
|
47
|
-
data: z.unknown().optional(),
|
|
48
|
-
models: z.unknown().optional(),
|
|
49
|
-
result: z.unknown().optional(),
|
|
50
|
-
items: z.unknown().optional(),
|
|
51
|
-
})
|
|
52
|
-
.loose();
|
|
53
|
-
|
|
54
|
-
const openAICompatibleModelsPayloadSchema = z.union([z.array(z.unknown()), openAICompatibleModelsEnvelopeSchema]);
|
|
55
|
-
|
|
56
|
-
type ParsedOpenAICompatibleModelRecord = z.infer<typeof openAICompatibleModelRecordSchema>;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Context passed to custom OpenAI-compatible model mappers.
|
|
60
|
-
*/
|
|
61
|
-
export interface OpenAICompatibleModelMapperContext<TApi extends Api> {
|
|
62
|
-
api: TApi;
|
|
63
|
-
provider: Provider;
|
|
64
|
-
baseUrl: string;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Options for fetching and normalizing OpenAI-compatible `/models` catalogs.
|
|
69
|
-
*/
|
|
70
|
-
export interface FetchOpenAICompatibleModelsOptions<TApi extends Api> {
|
|
71
|
-
/** API type assigned to normalized models. */
|
|
72
|
-
api: TApi;
|
|
73
|
-
/** Provider id assigned to normalized models. */
|
|
74
|
-
provider: Provider;
|
|
75
|
-
/** Provider base URL used for both fetch and normalized model records. */
|
|
76
|
-
baseUrl: string;
|
|
77
|
-
/** Optional bearer token for Authorization header. */
|
|
78
|
-
apiKey?: string;
|
|
79
|
-
/** Additional request headers. */
|
|
80
|
-
headers?: Record<string, string>;
|
|
81
|
-
/** Optional AbortSignal for request cancellation. */
|
|
82
|
-
signal?: AbortSignal;
|
|
83
|
-
/** Optional fetch implementation override for testing/custom runtimes. */
|
|
84
|
-
fetch?: typeof globalThis.fetch;
|
|
85
|
-
/**
|
|
86
|
-
* Optional post-normalization filter.
|
|
87
|
-
* Return false to skip a model.
|
|
88
|
-
*/
|
|
89
|
-
filterModel?: (entry: OpenAICompatibleModelRecord, model: Model<TApi>) => boolean;
|
|
90
|
-
/**
|
|
91
|
-
* Optional mapper override for provider-specific quirks.
|
|
92
|
-
* Return null to skip a model.
|
|
93
|
-
*/
|
|
94
|
-
mapModel?: (
|
|
95
|
-
entry: OpenAICompatibleModelRecord,
|
|
96
|
-
defaults: Model<TApi>,
|
|
97
|
-
context: OpenAICompatibleModelMapperContext<TApi>,
|
|
98
|
-
) => Model<TApi> | null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Fetches and normalizes an OpenAI-compatible `/models` catalog.
|
|
103
|
-
*
|
|
104
|
-
* Returns `null` on transport/protocol failures.
|
|
105
|
-
* Returns `[]` only when the endpoint responds successfully with no usable models.
|
|
106
|
-
*/
|
|
107
|
-
export async function fetchOpenAICompatibleModels<TApi extends Api>(
|
|
108
|
-
options: FetchOpenAICompatibleModelsOptions<TApi>,
|
|
109
|
-
): Promise<Model<TApi>[] | null> {
|
|
110
|
-
const baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
111
|
-
if (!baseUrl) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const requestHeaders: Record<string, string> = {
|
|
116
|
-
Accept: "application/json",
|
|
117
|
-
...options.headers,
|
|
118
|
-
};
|
|
119
|
-
if (options.apiKey) {
|
|
120
|
-
requestHeaders.Authorization = `Bearer ${options.apiKey}`;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
124
|
-
let response: Response;
|
|
125
|
-
try {
|
|
126
|
-
response = await fetchImpl(`${baseUrl}${MODELS_PATH}`, {
|
|
127
|
-
method: "GET",
|
|
128
|
-
headers: requestHeaders,
|
|
129
|
-
signal: options.signal,
|
|
130
|
-
});
|
|
131
|
-
} catch {
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (!response.ok) {
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
let payload: unknown;
|
|
140
|
-
try {
|
|
141
|
-
payload = await response.json();
|
|
142
|
-
} catch {
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const entries = extractModelEntries(payload);
|
|
147
|
-
if (entries === null) {
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const context: OpenAICompatibleModelMapperContext<TApi> = {
|
|
152
|
-
api: options.api,
|
|
153
|
-
provider: options.provider,
|
|
154
|
-
baseUrl,
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const deduped = new Map<string, Model<TApi>>();
|
|
158
|
-
for (const entry of entries) {
|
|
159
|
-
const defaults: Model<TApi> = {
|
|
160
|
-
id: entry.id,
|
|
161
|
-
name: typeof entry.name === "string" && entry.name.length > 0 ? entry.name : entry.id,
|
|
162
|
-
api: options.api,
|
|
163
|
-
provider: options.provider,
|
|
164
|
-
baseUrl,
|
|
165
|
-
reasoning: false,
|
|
166
|
-
input: ["text"],
|
|
167
|
-
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
168
|
-
contextWindow: UNK_CONTEXT_WINDOW,
|
|
169
|
-
maxTokens: UNK_MAX_TOKENS,
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
const mapped = options.mapModel?.(entry, defaults, context) ?? defaults;
|
|
173
|
-
if (!mapped || typeof mapped.id !== "string" || mapped.id.length === 0) {
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
if (options.filterModel && !options.filterModel(entry, mapped)) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
deduped.set(mapped.id, mapped);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return Array.from(deduped.values()).sort((left, right) => left.id.localeCompare(right.id));
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
function normalizeBaseUrl(baseUrl: string): string {
|
|
186
|
-
const trimmed = baseUrl.trim();
|
|
187
|
-
if (!trimmed) {
|
|
188
|
-
return "";
|
|
189
|
-
}
|
|
190
|
-
return trimmed.endsWith("/") ? trimmed.slice(0, -1) : trimmed;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function extractModelEntries(payload: unknown): ParsedOpenAICompatibleModelRecord[] | null {
|
|
194
|
-
return extractModelEntriesFromNode(payload);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function extractModelEntriesFromNode(node: unknown): ParsedOpenAICompatibleModelRecord[] | null {
|
|
198
|
-
const parsedPayload = openAICompatibleModelsPayloadSchema.safeParse(node);
|
|
199
|
-
if (!parsedPayload.success) {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
if (Array.isArray(parsedPayload.data)) {
|
|
203
|
-
const parsedEntries = parsedPayload.data
|
|
204
|
-
.map(entry => openAICompatibleModelRecordSchema.safeParse(entry))
|
|
205
|
-
.flatMap(entry => (entry.success ? [entry.data] : []));
|
|
206
|
-
return parsedEntries;
|
|
207
|
-
}
|
|
208
|
-
for (const candidate of [
|
|
209
|
-
parsedPayload.data.data,
|
|
210
|
-
parsedPayload.data.models,
|
|
211
|
-
parsedPayload.data.result,
|
|
212
|
-
parsedPayload.data.items,
|
|
213
|
-
]) {
|
|
214
|
-
if (candidate === undefined) {
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
const nested = extractModelEntriesFromNode(candidate);
|
|
218
|
-
if (nested !== null) {
|
|
219
|
-
return nested;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { clearGitLabDuoDirectAccessCache } from "../../providers/gitlab-duo";
|
|
2
|
-
import { OAuthCallbackFlow } from "./callback-server";
|
|
3
|
-
import { generatePKCE } from "./pkce";
|
|
4
|
-
import type { OAuthCredentials, OAuthLoginCallbacks } from "./types";
|
|
5
|
-
|
|
6
|
-
const GITLAB_COM_URL = "https://gitlab.com";
|
|
7
|
-
const BUNDLED_CLIENT_ID = "da4edff2e6ebd2bc3208611e2768bc1c1dd7be791dc5ff26ca34ca9ee44f7d4b";
|
|
8
|
-
const OAUTH_SCOPES = ["api"];
|
|
9
|
-
const CALLBACK_PORT = 8080;
|
|
10
|
-
const CALLBACK_PATH = "/callback";
|
|
11
|
-
|
|
12
|
-
interface PKCEPair {
|
|
13
|
-
verifier: string;
|
|
14
|
-
challenge: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function mapTokenResponse(payload: {
|
|
18
|
-
access_token?: string;
|
|
19
|
-
refresh_token?: string;
|
|
20
|
-
expires_in?: number;
|
|
21
|
-
created_at?: number;
|
|
22
|
-
}): OAuthCredentials {
|
|
23
|
-
if (!payload.access_token || !payload.refresh_token || typeof payload.expires_in !== "number") {
|
|
24
|
-
throw new Error("GitLab OAuth token response missing required fields");
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const createdAtMs =
|
|
28
|
-
typeof payload.created_at === "number" && Number.isFinite(payload.created_at)
|
|
29
|
-
? payload.created_at * 1000
|
|
30
|
-
: Date.now();
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
access: payload.access_token,
|
|
34
|
-
refresh: payload.refresh_token,
|
|
35
|
-
expires: createdAtMs + payload.expires_in * 1000 - 5 * 60 * 1000,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
class GitLabDuoOAuthFlow extends OAuthCallbackFlow {
|
|
40
|
-
#pkce: PKCEPair;
|
|
41
|
-
|
|
42
|
-
constructor(ctrl: OAuthLoginCallbacks, pkce: PKCEPair) {
|
|
43
|
-
super(ctrl, CALLBACK_PORT, CALLBACK_PATH);
|
|
44
|
-
this.#pkce = pkce;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
override async generateAuthUrl(state: string, redirectUri: string): Promise<{ url: string; instructions?: string }> {
|
|
48
|
-
const authParams = new URLSearchParams({
|
|
49
|
-
client_id: BUNDLED_CLIENT_ID,
|
|
50
|
-
redirect_uri: redirectUri,
|
|
51
|
-
response_type: "code",
|
|
52
|
-
scope: OAUTH_SCOPES.join(" "),
|
|
53
|
-
code_challenge: this.#pkce.challenge,
|
|
54
|
-
code_challenge_method: "S256",
|
|
55
|
-
state,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
url: `${GITLAB_COM_URL}/oauth/authorize?${authParams.toString()}`,
|
|
60
|
-
instructions: "Complete GitLab login in browser. Authentication will finish automatically.",
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
override async exchangeToken(code: string, _state: string, redirectUri: string): Promise<OAuthCredentials> {
|
|
65
|
-
const response = await fetch(`${GITLAB_COM_URL}/oauth/token`, {
|
|
66
|
-
method: "POST",
|
|
67
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
68
|
-
body: new URLSearchParams({
|
|
69
|
-
client_id: BUNDLED_CLIENT_ID,
|
|
70
|
-
grant_type: "authorization_code",
|
|
71
|
-
code,
|
|
72
|
-
code_verifier: this.#pkce.verifier,
|
|
73
|
-
redirect_uri: redirectUri,
|
|
74
|
-
}).toString(),
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
if (!response.ok) {
|
|
78
|
-
throw new Error(`GitLab OAuth token exchange failed: ${response.status} ${await response.text()}`);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
clearGitLabDuoDirectAccessCache();
|
|
82
|
-
return mapTokenResponse(
|
|
83
|
-
(await response.json()) as {
|
|
84
|
-
access_token?: string;
|
|
85
|
-
refresh_token?: string;
|
|
86
|
-
expires_in?: number;
|
|
87
|
-
created_at?: number;
|
|
88
|
-
},
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export async function loginGitLabDuo(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {
|
|
94
|
-
const pkce = await generatePKCE();
|
|
95
|
-
const flow = new GitLabDuoOAuthFlow(callbacks, pkce);
|
|
96
|
-
return flow.login();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export async function refreshGitLabDuoToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {
|
|
100
|
-
const response = await fetch(`${GITLAB_COM_URL}/oauth/token`, {
|
|
101
|
-
method: "POST",
|
|
102
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
103
|
-
body: new URLSearchParams({
|
|
104
|
-
client_id: BUNDLED_CLIENT_ID,
|
|
105
|
-
grant_type: "refresh_token",
|
|
106
|
-
refresh_token: credentials.refresh,
|
|
107
|
-
}).toString(),
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
if (!response.ok) {
|
|
111
|
-
throw new Error(`GitLab OAuth refresh failed: ${response.status} ${await response.text()}`);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
clearGitLabDuoDirectAccessCache();
|
|
115
|
-
return mapTokenResponse(
|
|
116
|
-
(await response.json()) as {
|
|
117
|
-
access_token?: string;
|
|
118
|
-
refresh_token?: string;
|
|
119
|
-
expires_in?: number;
|
|
120
|
-
created_at?: number;
|
|
121
|
-
},
|
|
122
|
-
);
|
|
123
|
-
}
|