@gajae-code/ai 0.1.1
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/CHANGELOG.md +2644 -0
- package/README.md +1181 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +66 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +96 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +105 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +17 -0
- package/dist/types/auth-gateway/types.d.ts +115 -0
- package/dist/types/auth-storage.d.ts +641 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/model-cache.d.ts +17 -0
- package/dist/types/model-manager.d.ts +62 -0
- package/dist/types/model-thinking.d.ts +71 -0
- package/dist/types/models.d.ts +12 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/provider-models/bundled-references.d.ts +4 -0
- package/dist/types/provider-models/descriptors.d.ts +48 -0
- package/dist/types/provider-models/google.d.ts +20 -0
- package/dist/types/provider-models/index.d.ts +5 -0
- package/dist/types/provider-models/ollama.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +237 -0
- package/dist/types/provider-models/special.d.ts +16 -0
- package/dist/types/providers/amazon-bedrock.d.ts +36 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic.d.ts +188 -0
- package/dist/types/providers/aws-credentials.d.ts +43 -0
- package/dist/types/providers/aws-eventstream.d.ts +38 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +15 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
- package/dist/types/providers/cursor.d.ts +42 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +72 -0
- package/dist/types/providers/google-gemini-headers.d.ts +18 -0
- package/dist/types/providers/google-shared.d.ts +163 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +175 -0
- package/dist/types/providers/ollama.d.ts +6 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +814 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-codex/constants.d.ts +26 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
- package/dist/types/providers/openai-codex-responses.d.ts +67 -0
- package/dist/types/providers/openai-completions-compat.d.ts +25 -0
- package/dist/types/providers/openai-completions.d.ts +33 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-shared.d.ts +89 -0
- package/dist/types/providers/openai-responses.d.ts +32 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +68 -0
- package/dist/types/providers/register-builtins.d.ts +31 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +12 -0
- package/dist/types/providers/vision-guard.d.ts +8 -0
- package/dist/types/rate-limit-utils.d.ts +19 -0
- package/dist/types/stream.d.ts +24 -0
- package/dist/types/types.d.ts +746 -0
- package/dist/types/usage/claude.d.ts +3 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +2 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +258 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +31 -0
- package/dist/types/utils/discovery/antigravity.d.ts +61 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +23 -0
- package/dist/types/utils/discovery/gemini.d.ts +25 -0
- package/dist/types/utils/discovery/index.d.ts +4 -0
- package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
- package/dist/types/utils/event-stream.d.ts +28 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +31 -0
- package/dist/types/utils/idle-iterator.d.ts +67 -0
- package/dist/types/utils/json-parse.d.ts +10 -0
- package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
- package/dist/types/utils/oauth/anthropic.d.ts +22 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
- package/dist/types/utils/oauth/callback-server.d.ts +57 -0
- package/dist/types/utils/oauth/cerebras.d.ts +1 -0
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepseek.d.ts +10 -0
- package/dist/types/utils/oauth/firepass.d.ts +1 -0
- package/dist/types/utils/oauth/fireworks.d.ts +1 -0
- package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
- package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
- package/dist/types/utils/oauth/huggingface.d.ts +19 -0
- package/dist/types/utils/oauth/index.d.ts +38 -0
- package/dist/types/utils/oauth/kagi.d.ts +17 -0
- package/dist/types/utils/oauth/kilo.d.ts +5 -0
- package/dist/types/utils/oauth/kimi.d.ts +21 -0
- package/dist/types/utils/oauth/litellm.d.ts +18 -0
- package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
- package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
- package/dist/types/utils/oauth/moonshot.d.ts +1 -0
- package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
- package/dist/types/utils/oauth/nvidia.d.ts +18 -0
- package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
- package/dist/types/utils/oauth/ollama.d.ts +18 -0
- package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
- package/dist/types/utils/oauth/opencode.d.ts +18 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +9 -0
- package/dist/types/utils/oauth/pkce.d.ts +8 -0
- package/dist/types/utils/oauth/qianfan.d.ts +17 -0
- package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
- package/dist/types/utils/oauth/synthetic.d.ts +1 -0
- package/dist/types/utils/oauth/tavily.d.ts +17 -0
- package/dist/types/utils/oauth/together.d.ts +1 -0
- package/dist/types/utils/oauth/types.d.ts +44 -0
- package/dist/types/utils/oauth/venice.d.ts +18 -0
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/vllm.d.ts +16 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
- package/dist/types/utils/oauth/zai.d.ts +18 -0
- package/dist/types/utils/oauth/zenmux.d.ts +1 -0
- package/dist/types/utils/overflow.d.ts +54 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry.d.ts +26 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +49 -0
- package/dist/types/utils/schema/index.d.ts +13 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +93 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +25 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/wire.d.ts +54 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sse-debug.d.ts +10 -0
- package/dist/types/utils/tool-call-healing.d.ts +71 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +17 -0
- package/dist/types/utils.d.ts +28 -0
- package/package.json +146 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +358 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/refresher.ts +127 -0
- package/src/auth-broker/remote-store.ts +623 -0
- package/src/auth-broker/server.ts +644 -0
- package/src/auth-broker/types.ts +127 -0
- package/src/auth-broker/wire-schemas.ts +200 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +717 -0
- package/src/auth-gateway/types.ts +134 -0
- package/src/auth-storage.ts +4104 -0
- package/src/cli.ts +262 -0
- package/src/index.ts +54 -0
- package/src/model-cache.ts +129 -0
- package/src/model-manager.ts +450 -0
- package/src/model-thinking.ts +691 -0
- package/src/models.json +73853 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +56 -0
- package/src/prompts/turn-aborted-guidance.md +4 -0
- package/src/provider-details.ts +90 -0
- package/src/provider-models/bundled-references.ts +38 -0
- package/src/provider-models/descriptors.ts +308 -0
- package/src/provider-models/google.ts +91 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +153 -0
- package/src/provider-models/openai-compat.ts +2275 -0
- package/src/provider-models/special.ts +67 -0
- package/src/providers/amazon-bedrock.ts +849 -0
- package/src/providers/anthropic-messages-server-schema.ts +229 -0
- package/src/providers/anthropic-messages-server.ts +677 -0
- package/src/providers/anthropic.ts +2696 -0
- package/src/providers/aws-credentials.ts +501 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +337 -0
- package/src/providers/cursor/gen/agent_pb.ts +15274 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2561 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.ts +372 -0
- package/src/providers/google-auth.ts +252 -0
- package/src/providers/google-gemini-cli.ts +795 -0
- package/src/providers/google-gemini-headers.ts +41 -0
- package/src/providers/google-shared.ts +902 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.ts +88 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +500 -0
- package/src/providers/ollama.ts +544 -0
- package/src/providers/openai-anthropic-shim.ts +138 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +628 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.ts +161 -0
- package/src/providers/openai-codex/response-handler.ts +81 -0
- package/src/providers/openai-codex-responses.ts +2598 -0
- package/src/providers/openai-completions-compat.ts +279 -0
- package/src/providers/openai-completions.ts +1853 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1183 -0
- package/src/providers/openai-responses-shared.ts +800 -0
- package/src/providers/openai-responses.ts +621 -0
- package/src/providers/pi-native-client.ts +228 -0
- package/src/providers/pi-native-server.ts +210 -0
- package/src/providers/register-builtins.ts +412 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +309 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/rate-limit-utils.ts +84 -0
- package/src/stream.ts +895 -0
- package/src/types.ts +884 -0
- package/src/usage/claude.ts +431 -0
- package/src/usage/gemini.ts +250 -0
- package/src/usage/github-copilot.ts +421 -0
- package/src/usage/google-antigravity.ts +201 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +31 -0
- package/src/usage/openai-codex.ts +503 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +247 -0
- package/src/usage.ts +183 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/anthropic-auth.ts +87 -0
- package/src/utils/discovery/antigravity.ts +261 -0
- package/src/utils/discovery/codex.ts +371 -0
- package/src/utils/discovery/cursor.ts +306 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +224 -0
- package/src/utils/event-stream.ts +142 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/h2-fetch.ts +60 -0
- package/src/utils/http-inspector.ts +176 -0
- package/src/utils/idle-iterator.ts +250 -0
- package/src/utils/json-parse.ts +148 -0
- package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
- package/src/utils/oauth/anthropic.ts +200 -0
- package/src/utils/oauth/api-key-login.ts +87 -0
- package/src/utils/oauth/api-key-validation.ts +92 -0
- package/src/utils/oauth/callback-server.ts +276 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepseek.ts +53 -0
- package/src/utils/oauth/firepass.ts +24 -0
- package/src/utils/oauth/fireworks.ts +15 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/google-antigravity.ts +200 -0
- package/src/utils/oauth/google-gemini-cli.ts +256 -0
- package/src/utils/oauth/google-oauth-shared.ts +110 -0
- package/src/utils/oauth/huggingface.ts +62 -0
- package/src/utils/oauth/index.ts +444 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.ts +254 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/minimax-code.ts +78 -0
- package/src/utils/oauth/moonshot.ts +16 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +199 -0
- package/src/utils/oauth/ollama-cloud.ts +28 -0
- package/src/utils/oauth/ollama.ts +47 -0
- package/src/utils/oauth/openai-codex.ts +299 -0
- package/src/utils/oauth/opencode.ts +49 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +206 -0
- package/src/utils/oauth/pkce.ts +18 -0
- package/src/utils/oauth/qianfan.ts +58 -0
- package/src/utils/oauth/qwen-portal.ts +60 -0
- package/src/utils/oauth/synthetic.ts +16 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.ts +94 -0
- package/src/utils/oauth/venice.ts +59 -0
- package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
- package/src/utils/oauth/vllm.ts +40 -0
- package/src/utils/oauth/xiaomi.ts +137 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/overflow.ts +137 -0
- package/src/utils/parse-bind.ts +54 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +54 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +190 -0
- package/src/utils/schema/index.ts +13 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.ts +11 -0
- package/src/utils/schema/wire.ts +213 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/tool-call-healing.ts +271 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1019 -0
- package/src/utils.ts +166 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Api } from "./types";
|
|
2
|
+
|
|
3
|
+
/** Typed declaration for the generated models.json — only the `api` field matters for type inference. */
|
|
4
|
+
declare const models: {
|
|
5
|
+
[provider: string]: {
|
|
6
|
+
[modelId: string]: { readonly api: Api; [key: string]: unknown };
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export default models;
|
package/src/models.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { enrichModelThinking } from "./model-thinking";
|
|
2
|
+
import MODELS from "./models.json" with { type: "json" };
|
|
3
|
+
import type { Api, KnownProvider, Model, Usage } from "./types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Static bundled model registry loaded from `models.json`.
|
|
7
|
+
*
|
|
8
|
+
* This module intentionally exposes compile-time defaults only.
|
|
9
|
+
* It does not include runtime discovery, models.dev overlays, or on-disk cache state.
|
|
10
|
+
*
|
|
11
|
+
* For runtime-aware resolution, use `createModelManager()` / `resolveProviderModels()`.
|
|
12
|
+
*/
|
|
13
|
+
const modelRegistry: Map<string, Map<string, Model<Api>>> = new Map();
|
|
14
|
+
for (const [provider, models] of Object.entries(MODELS)) {
|
|
15
|
+
const providerModels = new Map<string, Model<Api>>();
|
|
16
|
+
for (const [id, model] of Object.entries(models)) {
|
|
17
|
+
providerModels.set(id, enrichModelThinking(model as Model<Api>));
|
|
18
|
+
}
|
|
19
|
+
modelRegistry.set(provider, providerModels);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type GeneratedProvider = keyof typeof MODELS;
|
|
23
|
+
|
|
24
|
+
export function getBundledModel<TApi extends Api = Api>(provider: GeneratedProvider, modelId: string): Model<TApi> {
|
|
25
|
+
const providerModels = modelRegistry.get(provider);
|
|
26
|
+
return providerModels?.get(modelId) as Model<TApi>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getBundledProviders(): KnownProvider[] {
|
|
30
|
+
return Array.from(modelRegistry.keys()) as KnownProvider[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getBundledModels(provider: GeneratedProvider): Model<Api>[] {
|
|
34
|
+
const models = modelRegistry.get(provider);
|
|
35
|
+
return models ? (Array.from(models.values()) as Model<Api>[]) : [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function calculateCost<TApi extends Api>(model: Model<TApi>, usage: Usage): Usage["cost"] {
|
|
39
|
+
usage.cost.input = (model.cost.input / 1000000) * usage.input;
|
|
40
|
+
usage.cost.output = (model.cost.output / 1000000) * usage.output;
|
|
41
|
+
usage.cost.cacheRead = (model.cost.cacheRead / 1000000) * usage.cacheRead;
|
|
42
|
+
usage.cost.cacheWrite = (model.cost.cacheWrite / 1000000) * usage.cacheWrite;
|
|
43
|
+
usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
|
|
44
|
+
return usage.cost;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if two models are equal by comparing both their id and provider.
|
|
48
|
+
* Returns false if either model is null or undefined.
|
|
49
|
+
*/
|
|
50
|
+
export function modelsAreEqual<TApi extends Api>(
|
|
51
|
+
a: Model<TApi> | null | undefined,
|
|
52
|
+
b: Model<TApi> | null | undefined,
|
|
53
|
+
): boolean {
|
|
54
|
+
if (!a || !b) return false;
|
|
55
|
+
return a.id === b.id && a.provider === b.provider;
|
|
56
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { getOpenAICodexTransportDetails, type OpenAICodexTransportDetails } from "./providers/openai-codex-responses";
|
|
2
|
+
import type { Api, Model, Provider, ProviderSessionState } from "./types";
|
|
3
|
+
|
|
4
|
+
export interface ProviderDetailField {
|
|
5
|
+
label: string;
|
|
6
|
+
value: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ProviderDetails {
|
|
10
|
+
provider: Provider;
|
|
11
|
+
api: Api;
|
|
12
|
+
fields: ProviderDetailField[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ProviderDetailsContext {
|
|
16
|
+
model: Model<Api>;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
authMode?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Human-readable description of the active credential, e.g.
|
|
21
|
+
* `"broker http://can.internal:8765 · oauth #5 (foo@bar.com)"`.
|
|
22
|
+
* Rendered as a `Source` field; omitted when undefined.
|
|
23
|
+
*/
|
|
24
|
+
credentialSource?: string;
|
|
25
|
+
preferWebsockets?: boolean;
|
|
26
|
+
providerSessionState?: Map<string, ProviderSessionState>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getProviderDetails(context: ProviderDetailsContext): ProviderDetails {
|
|
30
|
+
const endpoint = formatEndpoint(context.model.baseUrl);
|
|
31
|
+
const fields: ProviderDetailField[] = [
|
|
32
|
+
{ label: "Model", value: context.model.id },
|
|
33
|
+
{ label: "API", value: context.model.api },
|
|
34
|
+
{ label: "Auth", value: context.authMode ?? "auto" },
|
|
35
|
+
{ label: "Endpoint", value: endpoint },
|
|
36
|
+
];
|
|
37
|
+
if (context.credentialSource) {
|
|
38
|
+
fields.push({ label: "Source", value: context.credentialSource });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (context.model.api === "openai-codex-responses") {
|
|
42
|
+
const codexDetails = getOpenAICodexTransportDetails(context.model as Model<"openai-codex-responses">, {
|
|
43
|
+
sessionId: context.sessionId,
|
|
44
|
+
baseUrl: context.model.baseUrl,
|
|
45
|
+
preferWebsockets: context.preferWebsockets,
|
|
46
|
+
providerSessionState: context.providerSessionState,
|
|
47
|
+
});
|
|
48
|
+
fields.push({ label: "Transport", value: formatCodexTransport(codexDetails) });
|
|
49
|
+
fields.push({ label: "WebSocket", value: formatCodexWebSocket(codexDetails) });
|
|
50
|
+
fields.push({ label: "Reuse", value: formatCodexReuse(codexDetails, context.sessionId) });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
provider: context.model.provider,
|
|
55
|
+
api: context.model.api,
|
|
56
|
+
fields,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function formatEndpoint(baseUrl: string): string {
|
|
61
|
+
try {
|
|
62
|
+
const parsed = new URL(baseUrl);
|
|
63
|
+
const path = parsed.pathname.replace(/\/$/, "");
|
|
64
|
+
return `${parsed.origin}${path || "/"}`;
|
|
65
|
+
} catch {
|
|
66
|
+
return baseUrl;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function formatCodexTransport(details: OpenAICodexTransportDetails): string {
|
|
71
|
+
if (details.lastTransport === "websocket") return "websocket";
|
|
72
|
+
if (details.lastTransport === "sse" && (details.websocketDisabled || details.fallbackCount > 0)) {
|
|
73
|
+
return "sse (fallback)";
|
|
74
|
+
}
|
|
75
|
+
if (details.lastTransport === "sse") return "sse";
|
|
76
|
+
return details.websocketPreferred ? "websocket preferred" : "sse";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function formatCodexWebSocket(details: OpenAICodexTransportDetails): string {
|
|
80
|
+
if (!details.websocketPreferred) return "off";
|
|
81
|
+
if (details.websocketDisabled) return "disabled after fallback";
|
|
82
|
+
if (details.websocketConnected) return "connected";
|
|
83
|
+
if (details.prewarmed) return "prewarmed";
|
|
84
|
+
return details.hasSessionState ? "enabled" : "waiting for first request";
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function formatCodexReuse(details: OpenAICodexTransportDetails, sessionId: string | undefined): string {
|
|
88
|
+
if (!sessionId) return "no session key";
|
|
89
|
+
return details.canAppend ? "append enabled" : "full request";
|
|
90
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getBundledModels, getBundledProviders } from "../models";
|
|
2
|
+
import type { Api, Model } from "../types";
|
|
3
|
+
|
|
4
|
+
export function createBundledReferenceMap<TApi extends Api>(
|
|
5
|
+
provider: Parameters<typeof getBundledModels>[0],
|
|
6
|
+
): Map<string, Model<TApi>> {
|
|
7
|
+
const references = new Map<string, Model<TApi>>();
|
|
8
|
+
for (const model of getBundledModels(provider)) {
|
|
9
|
+
references.set(model.id, model as Model<TApi>);
|
|
10
|
+
}
|
|
11
|
+
return references;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function createReferenceResolver<TApi extends Api>(
|
|
15
|
+
providerRefs: Map<string, Model<TApi>>,
|
|
16
|
+
): (modelId: string) => Model<TApi> | undefined {
|
|
17
|
+
const globalRefs = new Map<string, Model<Api>>();
|
|
18
|
+
for (const provider of getBundledProviders()) {
|
|
19
|
+
for (const model of getBundledModels(provider as Parameters<typeof getBundledModels>[0])) {
|
|
20
|
+
const candidate = model as Model<Api>;
|
|
21
|
+
const existing = globalRefs.get(candidate.id);
|
|
22
|
+
if (!existing) {
|
|
23
|
+
globalRefs.set(candidate.id, candidate);
|
|
24
|
+
} else if (candidate.contextWindow !== existing.contextWindow) {
|
|
25
|
+
if (candidate.contextWindow > existing.contextWindow) {
|
|
26
|
+
globalRefs.set(candidate.id, candidate);
|
|
27
|
+
}
|
|
28
|
+
} else if (candidate.maxTokens !== existing.maxTokens) {
|
|
29
|
+
if (candidate.maxTokens > existing.maxTokens) {
|
|
30
|
+
globalRefs.set(candidate.id, candidate);
|
|
31
|
+
}
|
|
32
|
+
} else if (existing.provider !== "openai" && candidate.provider === "openai") {
|
|
33
|
+
globalRefs.set(candidate.id, candidate);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return (modelId: string) => providerRefs.get(modelId) ?? (globalRefs.get(modelId) as Model<TApi> | undefined);
|
|
38
|
+
}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified provider descriptors — single source of truth for provider metadata
|
|
3
|
+
* used by both runtime model discovery (model-registry.ts) and catalog
|
|
4
|
+
* generation (generate-models.ts).
|
|
5
|
+
*/
|
|
6
|
+
import type { ModelManagerOptions } from "../model-manager";
|
|
7
|
+
import type { Api, KnownProvider } from "../types";
|
|
8
|
+
import type { OAuthProvider } from "../utils/oauth/types";
|
|
9
|
+
import { googleModelManagerOptions } from "./google";
|
|
10
|
+
import { ollamaCloudModelManagerOptions } from "./ollama";
|
|
11
|
+
import {
|
|
12
|
+
alibabaCodingPlanModelManagerOptions,
|
|
13
|
+
anthropicModelManagerOptions,
|
|
14
|
+
cerebrasModelManagerOptions,
|
|
15
|
+
cloudflareAiGatewayModelManagerOptions,
|
|
16
|
+
deepseekModelManagerOptions,
|
|
17
|
+
firepassModelManagerOptions,
|
|
18
|
+
fireworksModelManagerOptions,
|
|
19
|
+
githubCopilotModelManagerOptions,
|
|
20
|
+
groqModelManagerOptions,
|
|
21
|
+
huggingfaceModelManagerOptions,
|
|
22
|
+
kiloModelManagerOptions,
|
|
23
|
+
kimiCodeModelManagerOptions,
|
|
24
|
+
litellmModelManagerOptions,
|
|
25
|
+
lmStudioModelManagerOptions,
|
|
26
|
+
mistralModelManagerOptions,
|
|
27
|
+
moonshotModelManagerOptions,
|
|
28
|
+
nanoGptModelManagerOptions,
|
|
29
|
+
nvidiaModelManagerOptions,
|
|
30
|
+
ollamaModelManagerOptions,
|
|
31
|
+
openaiModelManagerOptions,
|
|
32
|
+
opencodeGoModelManagerOptions,
|
|
33
|
+
opencodeZenModelManagerOptions,
|
|
34
|
+
openrouterModelManagerOptions,
|
|
35
|
+
qianfanModelManagerOptions,
|
|
36
|
+
qwenPortalModelManagerOptions,
|
|
37
|
+
syntheticModelManagerOptions,
|
|
38
|
+
togetherModelManagerOptions,
|
|
39
|
+
veniceModelManagerOptions,
|
|
40
|
+
vercelAiGatewayModelManagerOptions,
|
|
41
|
+
vllmModelManagerOptions,
|
|
42
|
+
xaiModelManagerOptions,
|
|
43
|
+
xiaomiModelManagerOptions,
|
|
44
|
+
zenmuxModelManagerOptions,
|
|
45
|
+
} from "./openai-compat";
|
|
46
|
+
import { cursorModelManagerOptions, zaiModelManagerOptions } from "./special";
|
|
47
|
+
|
|
48
|
+
/** Catalog discovery configuration for providers that support endpoint-based model listing. */
|
|
49
|
+
export interface CatalogDiscoveryConfig {
|
|
50
|
+
/** Human-readable name for log messages. */
|
|
51
|
+
label: string;
|
|
52
|
+
/** Environment variables to check for API keys during catalog generation. */
|
|
53
|
+
envVars: string[];
|
|
54
|
+
/** OAuth provider for credential refresh during catalog generation. */
|
|
55
|
+
oauthProvider?: OAuthProvider;
|
|
56
|
+
/** When true, catalog discovery proceeds even without credentials. */
|
|
57
|
+
allowUnauthenticated?: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Unified provider descriptor used by both runtime discovery and catalog generation. */
|
|
61
|
+
export interface ProviderDescriptor {
|
|
62
|
+
providerId: KnownProvider;
|
|
63
|
+
createModelManagerOptions(config: { apiKey?: string; baseUrl?: string }): ModelManagerOptions<Api>;
|
|
64
|
+
/** Preferred model ID when no explicit selection is made. */
|
|
65
|
+
defaultModel: string;
|
|
66
|
+
/** When true, the runtime creates a model manager even without a valid API key (e.g. ollama). */
|
|
67
|
+
allowUnauthenticated?: boolean;
|
|
68
|
+
/** Catalog discovery configuration. Only providers with this field participate in generate-models.ts. */
|
|
69
|
+
catalogDiscovery?: CatalogDiscoveryConfig;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A provider descriptor that has catalog discovery configured. */
|
|
73
|
+
export type CatalogProviderDescriptor = ProviderDescriptor & { catalogDiscovery: CatalogDiscoveryConfig };
|
|
74
|
+
|
|
75
|
+
/** Type guard for descriptors with catalog discovery. */
|
|
76
|
+
export function isCatalogDescriptor(d: ProviderDescriptor): d is CatalogProviderDescriptor {
|
|
77
|
+
return d.catalogDiscovery != null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Whether catalog discovery may run without provider credentials. */
|
|
81
|
+
export function allowsUnauthenticatedCatalogDiscovery(descriptor: CatalogProviderDescriptor): boolean {
|
|
82
|
+
return descriptor.catalogDiscovery.allowUnauthenticated ?? descriptor.allowUnauthenticated ?? false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function descriptor(
|
|
86
|
+
providerId: KnownProvider,
|
|
87
|
+
defaultModel: string,
|
|
88
|
+
createModelManagerOptions: ProviderDescriptor["createModelManagerOptions"],
|
|
89
|
+
options: Pick<ProviderDescriptor, "allowUnauthenticated"> = {},
|
|
90
|
+
): ProviderDescriptor {
|
|
91
|
+
return {
|
|
92
|
+
providerId,
|
|
93
|
+
defaultModel,
|
|
94
|
+
createModelManagerOptions,
|
|
95
|
+
...options,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function catalog(
|
|
100
|
+
label: string,
|
|
101
|
+
envVars: string[],
|
|
102
|
+
options: Pick<CatalogDiscoveryConfig, "oauthProvider" | "allowUnauthenticated"> = {},
|
|
103
|
+
): CatalogDiscoveryConfig {
|
|
104
|
+
return {
|
|
105
|
+
label,
|
|
106
|
+
envVars,
|
|
107
|
+
...options,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function catalogDescriptor(
|
|
112
|
+
providerId: KnownProvider,
|
|
113
|
+
defaultModel: string,
|
|
114
|
+
createModelManagerOptions: ProviderDescriptor["createModelManagerOptions"],
|
|
115
|
+
catalogDiscovery: CatalogDiscoveryConfig,
|
|
116
|
+
options: Pick<ProviderDescriptor, "allowUnauthenticated"> = {},
|
|
117
|
+
): ProviderDescriptor {
|
|
118
|
+
return {
|
|
119
|
+
...descriptor(providerId, defaultModel, createModelManagerOptions, options),
|
|
120
|
+
catalogDiscovery,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* All standard providers. Special providers (google-antigravity, google-gemini-cli,
|
|
126
|
+
* OpenAI code provider) are handled separately because they require different config shapes.
|
|
127
|
+
*/
|
|
128
|
+
export const PROVIDER_DESCRIPTORS: readonly ProviderDescriptor[] = [
|
|
129
|
+
descriptor("anthropic", "claude-sonnet-4-6", config => anthropicModelManagerOptions(config)),
|
|
130
|
+
catalogDescriptor(
|
|
131
|
+
"alibaba-coding-plan",
|
|
132
|
+
"qwen3.5-plus",
|
|
133
|
+
config => alibabaCodingPlanModelManagerOptions(config),
|
|
134
|
+
catalog("Alibaba Coding Plan", ["ALIBABA_CODING_PLAN_API_KEY"]),
|
|
135
|
+
),
|
|
136
|
+
descriptor("openai", "gpt-5.4", config => openaiModelManagerOptions(config)),
|
|
137
|
+
descriptor("groq", "openai/gpt-oss-120b", config => groqModelManagerOptions(config)),
|
|
138
|
+
catalogDescriptor(
|
|
139
|
+
"huggingface",
|
|
140
|
+
"deepseek-ai/DeepSeek-R1",
|
|
141
|
+
config => huggingfaceModelManagerOptions(config),
|
|
142
|
+
catalog("Hugging Face", ["HUGGINGFACE_HUB_TOKEN", "HF_TOKEN"]),
|
|
143
|
+
),
|
|
144
|
+
catalogDescriptor(
|
|
145
|
+
"cerebras",
|
|
146
|
+
"zai-glm-4.6",
|
|
147
|
+
config => cerebrasModelManagerOptions(config),
|
|
148
|
+
catalog("Cerebras", ["CEREBRAS_API_KEY"]),
|
|
149
|
+
),
|
|
150
|
+
catalogDescriptor(
|
|
151
|
+
"fireworks",
|
|
152
|
+
"kimi-k2.6",
|
|
153
|
+
config => fireworksModelManagerOptions(config),
|
|
154
|
+
catalog("Fireworks", ["FIREWORKS_API_KEY"]),
|
|
155
|
+
),
|
|
156
|
+
descriptor("firepass", "kimi-k2.6-turbo", config => firepassModelManagerOptions(config)),
|
|
157
|
+
descriptor("xai", "grok-4-fast-non-reasoning", config => xaiModelManagerOptions(config)),
|
|
158
|
+
catalogDescriptor(
|
|
159
|
+
"deepseek",
|
|
160
|
+
"deepseek-v4-pro",
|
|
161
|
+
config => deepseekModelManagerOptions(config),
|
|
162
|
+
catalog("DeepSeek", ["DEEPSEEK_API_KEY"]),
|
|
163
|
+
),
|
|
164
|
+
descriptor("mistral", "devstral-medium-latest", config => mistralModelManagerOptions(config)),
|
|
165
|
+
catalogDescriptor(
|
|
166
|
+
"nvidia",
|
|
167
|
+
"nvidia/llama-3.1-nemotron-70b-instruct",
|
|
168
|
+
config => nvidiaModelManagerOptions(config),
|
|
169
|
+
catalog("NVIDIA", ["NVIDIA_API_KEY"]),
|
|
170
|
+
),
|
|
171
|
+
catalogDescriptor(
|
|
172
|
+
"nanogpt",
|
|
173
|
+
"openai/gpt-5.4",
|
|
174
|
+
config => nanoGptModelManagerOptions(config),
|
|
175
|
+
catalog("NanoGPT", ["NANO_GPT_API_KEY"]),
|
|
176
|
+
),
|
|
177
|
+
descriptor("opencode-zen", "claude-sonnet-4-6", config => opencodeZenModelManagerOptions(config)),
|
|
178
|
+
descriptor("opencode-go", "kimi-k2.5", config => opencodeGoModelManagerOptions(config)),
|
|
179
|
+
catalogDescriptor(
|
|
180
|
+
"openrouter",
|
|
181
|
+
"openai/gpt-5.4",
|
|
182
|
+
config => openrouterModelManagerOptions(config),
|
|
183
|
+
catalog("OpenRouter", ["OPENROUTER_API_KEY"], { allowUnauthenticated: true }),
|
|
184
|
+
),
|
|
185
|
+
catalogDescriptor(
|
|
186
|
+
"kilo",
|
|
187
|
+
"anthropic/claude-sonnet-4.5",
|
|
188
|
+
config => kiloModelManagerOptions(config),
|
|
189
|
+
catalog("Kilo Gateway", ["KILO_API_KEY"], { allowUnauthenticated: true }),
|
|
190
|
+
),
|
|
191
|
+
catalogDescriptor(
|
|
192
|
+
"vercel-ai-gateway",
|
|
193
|
+
"anthropic/claude-sonnet-4-6",
|
|
194
|
+
config => vercelAiGatewayModelManagerOptions(config),
|
|
195
|
+
catalog("Vercel AI Gateway", ["VERCEL_AI_GATEWAY_API_KEY"], { allowUnauthenticated: true }),
|
|
196
|
+
),
|
|
197
|
+
catalogDescriptor(
|
|
198
|
+
"ollama",
|
|
199
|
+
"gpt-oss:20b",
|
|
200
|
+
config => ollamaModelManagerOptions(config),
|
|
201
|
+
catalog("Ollama", ["OLLAMA_API_KEY"]),
|
|
202
|
+
{ allowUnauthenticated: true },
|
|
203
|
+
),
|
|
204
|
+
catalogDescriptor(
|
|
205
|
+
"ollama-cloud",
|
|
206
|
+
"gpt-oss:120b",
|
|
207
|
+
config => ollamaCloudModelManagerOptions(config),
|
|
208
|
+
catalog("Ollama Cloud", ["OLLAMA_CLOUD_API_KEY"], { oauthProvider: "ollama-cloud" }),
|
|
209
|
+
),
|
|
210
|
+
catalogDescriptor(
|
|
211
|
+
"cloudflare-ai-gateway",
|
|
212
|
+
"claude-sonnet-4-5",
|
|
213
|
+
config => cloudflareAiGatewayModelManagerOptions(config),
|
|
214
|
+
catalog("Cloudflare AI Gateway", ["CLOUDFLARE_AI_GATEWAY_API_KEY"]),
|
|
215
|
+
),
|
|
216
|
+
catalogDescriptor(
|
|
217
|
+
"kimi-code",
|
|
218
|
+
"kimi-k2.5",
|
|
219
|
+
config => kimiCodeModelManagerOptions(config),
|
|
220
|
+
catalog("Kimi Code", ["KIMI_API_KEY"]),
|
|
221
|
+
),
|
|
222
|
+
catalogDescriptor(
|
|
223
|
+
"qwen-portal",
|
|
224
|
+
"coder-model",
|
|
225
|
+
config => qwenPortalModelManagerOptions(config),
|
|
226
|
+
catalog("Qwen Portal", ["QWEN_OAUTH_TOKEN", "QWEN_PORTAL_API_KEY"], { oauthProvider: "qwen-portal" }),
|
|
227
|
+
),
|
|
228
|
+
catalogDescriptor(
|
|
229
|
+
"synthetic",
|
|
230
|
+
"hf:moonshotai/Kimi-K2.5",
|
|
231
|
+
config => syntheticModelManagerOptions(config),
|
|
232
|
+
catalog("Synthetic", ["SYNTHETIC_API_KEY"]),
|
|
233
|
+
),
|
|
234
|
+
catalogDescriptor(
|
|
235
|
+
"venice",
|
|
236
|
+
"llama-3.3-70b",
|
|
237
|
+
config => veniceModelManagerOptions(config),
|
|
238
|
+
catalog("Venice", ["VENICE_API_KEY"], { allowUnauthenticated: true }),
|
|
239
|
+
),
|
|
240
|
+
catalogDescriptor(
|
|
241
|
+
"litellm",
|
|
242
|
+
"claude-opus-4-6",
|
|
243
|
+
config => litellmModelManagerOptions(config),
|
|
244
|
+
catalog("LiteLLM", ["LITELLM_API_KEY"], { allowUnauthenticated: true }),
|
|
245
|
+
),
|
|
246
|
+
descriptor("lm-studio", "llama-3-8b", config => lmStudioModelManagerOptions(config), { allowUnauthenticated: true }),
|
|
247
|
+
catalogDescriptor(
|
|
248
|
+
"vllm",
|
|
249
|
+
"gpt-oss-20b",
|
|
250
|
+
config => vllmModelManagerOptions(config),
|
|
251
|
+
catalog("vLLM", ["VLLM_API_KEY"], { allowUnauthenticated: true }),
|
|
252
|
+
),
|
|
253
|
+
catalogDescriptor(
|
|
254
|
+
"moonshot",
|
|
255
|
+
"kimi-k2.5",
|
|
256
|
+
config => moonshotModelManagerOptions(config),
|
|
257
|
+
catalog("Moonshot", ["MOONSHOT_API_KEY"]),
|
|
258
|
+
),
|
|
259
|
+
catalogDescriptor(
|
|
260
|
+
"qianfan",
|
|
261
|
+
"deepseek-v3.2",
|
|
262
|
+
config => qianfanModelManagerOptions(config),
|
|
263
|
+
catalog("Qianfan", ["QIANFAN_API_KEY"]),
|
|
264
|
+
),
|
|
265
|
+
catalogDescriptor(
|
|
266
|
+
"together",
|
|
267
|
+
"moonshotai/Kimi-K2.5",
|
|
268
|
+
config => togetherModelManagerOptions(config),
|
|
269
|
+
catalog("Together", ["TOGETHER_API_KEY"]),
|
|
270
|
+
),
|
|
271
|
+
catalogDescriptor(
|
|
272
|
+
"xiaomi",
|
|
273
|
+
"mimo-v2-flash",
|
|
274
|
+
config => xiaomiModelManagerOptions(config),
|
|
275
|
+
catalog("Xiaomi", ["XIAOMI_API_KEY"]),
|
|
276
|
+
),
|
|
277
|
+
catalogDescriptor(
|
|
278
|
+
"zenmux",
|
|
279
|
+
"anthropic/claude-opus-4.6",
|
|
280
|
+
config => zenmuxModelManagerOptions(config),
|
|
281
|
+
catalog("ZenMux", ["ZENMUX_API_KEY"]),
|
|
282
|
+
),
|
|
283
|
+
catalogDescriptor("zai", "glm-5.1", config => zaiModelManagerOptions(config), catalog("zAI", ["ZAI_API_KEY"])),
|
|
284
|
+
descriptor("github-copilot", "gpt-4o", config => githubCopilotModelManagerOptions(config)),
|
|
285
|
+
descriptor("google", "gemini-2.5-pro", config => googleModelManagerOptions(config)),
|
|
286
|
+
catalogDescriptor(
|
|
287
|
+
"cursor",
|
|
288
|
+
"claude-sonnet-4-6",
|
|
289
|
+
config => cursorModelManagerOptions(config),
|
|
290
|
+
catalog("Cursor", ["CURSOR_API_KEY"], { oauthProvider: "cursor" }),
|
|
291
|
+
),
|
|
292
|
+
] as const;
|
|
293
|
+
|
|
294
|
+
/** Default model IDs for all known providers, built from descriptors + special providers. */
|
|
295
|
+
export const DEFAULT_MODEL_PER_PROVIDER: Record<KnownProvider, string> = {
|
|
296
|
+
...Object.fromEntries(PROVIDER_DESCRIPTORS.map(d => [d.providerId, d.defaultModel])),
|
|
297
|
+
// Providers not in PROVIDER_DESCRIPTORS (special auth or no standard discovery)
|
|
298
|
+
"alibaba-coding-plan": "qwen3.5-plus",
|
|
299
|
+
"amazon-bedrock": "us.anthropic.claude-opus-4-6-v1",
|
|
300
|
+
"google-antigravity": "gemini-3-pro-high",
|
|
301
|
+
"google-gemini-cli": "gemini-2.5-pro",
|
|
302
|
+
"google-vertex": "gemini-3-pro-preview",
|
|
303
|
+
minimax: "MiniMax-M2.5",
|
|
304
|
+
"minimax-code": "MiniMax-M2.5",
|
|
305
|
+
"minimax-code-cn": "MiniMax-M2.5",
|
|
306
|
+
"openai-codex": "gpt-5.4",
|
|
307
|
+
"gitlab-duo": "duo-chat-sonnet-4-5",
|
|
308
|
+
} as Record<KnownProvider, string>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { ModelManagerOptions } from "../model-manager";
|
|
2
|
+
import { fetchAntigravityDiscoveryModels } from "../utils/discovery/antigravity";
|
|
3
|
+
import { fetchGeminiModels } from "../utils/discovery/gemini";
|
|
4
|
+
|
|
5
|
+
export interface GoogleModelManagerConfig {
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface GoogleVertexModelManagerConfig {
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface GoogleAntigravityModelManagerConfig {
|
|
15
|
+
oauthToken?: string;
|
|
16
|
+
endpoint?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface GoogleGeminiCliModelManagerConfig {
|
|
20
|
+
oauthToken?: string;
|
|
21
|
+
endpoint?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const CLOUD_CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
|
|
25
|
+
|
|
26
|
+
export function googleModelManagerOptions(
|
|
27
|
+
config?: GoogleModelManagerConfig,
|
|
28
|
+
): ModelManagerOptions<"google-generative-ai"> {
|
|
29
|
+
const apiKey = config?.apiKey;
|
|
30
|
+
return {
|
|
31
|
+
providerId: "google",
|
|
32
|
+
...(apiKey ? { fetchDynamicModels: () => fetchGeminiModels({ apiKey, baseUrl: config?.baseUrl }) } : undefined),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function googleVertexModelManagerOptions(
|
|
37
|
+
_config?: GoogleVertexModelManagerConfig,
|
|
38
|
+
): ModelManagerOptions<"google-vertex"> {
|
|
39
|
+
// Vertex AI uses Application Default Credentials (ADC) for authentication,
|
|
40
|
+
// which is handled at stream time rather than during model discovery.
|
|
41
|
+
// Dynamic model discovery is not yet implemented for this provider.
|
|
42
|
+
return {
|
|
43
|
+
providerId: "google-vertex",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function googleAntigravityModelManagerOptions(
|
|
48
|
+
config?: GoogleAntigravityModelManagerConfig,
|
|
49
|
+
): ModelManagerOptions<"google-gemini-cli"> {
|
|
50
|
+
const token = config?.oauthToken;
|
|
51
|
+
return {
|
|
52
|
+
providerId: "google-antigravity",
|
|
53
|
+
...(token
|
|
54
|
+
? {
|
|
55
|
+
fetchDynamicModels: () =>
|
|
56
|
+
fetchAntigravityDiscoveryModels({
|
|
57
|
+
token,
|
|
58
|
+
endpoint: config?.endpoint,
|
|
59
|
+
}),
|
|
60
|
+
}
|
|
61
|
+
: undefined),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function googleGeminiCliModelManagerOptions(
|
|
66
|
+
config?: GoogleGeminiCliModelManagerConfig,
|
|
67
|
+
): ModelManagerOptions<"google-gemini-cli"> {
|
|
68
|
+
const token = config?.oauthToken;
|
|
69
|
+
const endpoint = config?.endpoint ?? CLOUD_CODE_ASSIST_ENDPOINT;
|
|
70
|
+
return {
|
|
71
|
+
providerId: "google-gemini-cli",
|
|
72
|
+
...(token
|
|
73
|
+
? {
|
|
74
|
+
fetchDynamicModels: async () => {
|
|
75
|
+
const models = await fetchAntigravityDiscoveryModels({
|
|
76
|
+
token,
|
|
77
|
+
endpoint,
|
|
78
|
+
});
|
|
79
|
+
if (models === null) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return models.map(m => ({
|
|
83
|
+
...m,
|
|
84
|
+
provider: "google-gemini-cli" as const,
|
|
85
|
+
baseUrl: endpoint,
|
|
86
|
+
}));
|
|
87
|
+
},
|
|
88
|
+
}
|
|
89
|
+
: undefined),
|
|
90
|
+
};
|
|
91
|
+
}
|