| |
| const ALIAS_TO_PROVIDER_ID = { |
| cc: "claude", |
| cx: "codex", |
| gc: "gemini-cli", |
| qw: "qwen", |
| if: "iflow", |
| ag: "antigravity", |
| gh: "github", |
| kr: "kiro", |
| cu: "cursor", |
| kc: "kilocode", |
| kmc: "kimi-coding", |
| cl: "cline", |
| oc: "opencode", |
| ocg: "opencode-go", |
| qd: "qoder", |
| qoder: "qoder", |
| |
| el: "elevenlabs", |
| |
| openai: "openai", |
| vercel: "vercel-ai-gateway", |
| "vercel-ai-gateway": "vercel-ai-gateway", |
| anthropic: "anthropic", |
| gemini: "gemini", |
| openrouter: "openrouter", |
| glm: "glm", |
| kimi: "kimi", |
| minimax: "minimax", |
| "minimax-cn": "minimax-cn", |
| hf: "huggingface", |
| huggingface: "huggingface", |
| ds: "deepseek", |
| deepseek: "deepseek", |
| cmc: "commandcode", |
| commandcode: "commandcode", |
| groq: "groq", |
| xai: "xai", |
| mistral: "mistral", |
| pplx: "perplexity", |
| perplexity: "perplexity", |
| together: "together", |
| fireworks: "fireworks", |
| cerebras: "cerebras", |
| cohere: "cohere", |
| nvidia: "nvidia", |
| nebius: "nebius", |
| siliconflow: "siliconflow", |
| hyp: "hyperbolic", |
| hyperbolic: "hyperbolic", |
| dg: "deepgram", |
| deepgram: "deepgram", |
| aai: "assemblyai", |
| assemblyai: "assemblyai", |
| nb: "nanobanana", |
| nanobanana: "nanobanana", |
| ch: "chutes", |
| chutes: "chutes", |
| ark: "volcengine-ark", |
| "volcengine-ark": "volcengine-ark", |
| byteplus: "byteplus", |
| bpm: "byteplus", |
| cursor: "cursor", |
| vx: "vertex", |
| vertex: "vertex", |
| vxp: "vertex-partner", |
| "vertex-partner": "vertex-partner", |
| |
| gw: "grok-web", |
| "grok-web": "grok-web", |
| pw: "perplexity-web", |
| "perplexity-web": "perplexity-web", |
| mimo: "xiaomi-mimo", |
| "xiaomi-mimo": "xiaomi-mimo", |
| xmtp: "xiaomi-tokenplan", |
| "xiaomi-tokenplan": "xiaomi-tokenplan", |
| cf: "cloudflare-ai", |
| "cloudflare-ai": "cloudflare-ai", |
| |
| fal: "fal-ai", |
| "fal-ai": "fal-ai", |
| stability: "stability-ai", |
| "stability-ai": "stability-ai", |
| bfl: "black-forest-labs", |
| "black-forest-labs": "black-forest-labs", |
| recraft: "recraft", |
| topaz: "topaz", |
| runway: "runwayml", |
| runwayml: "runwayml", |
| |
| jina: "jina-ai", |
| "jina-ai": "jina-ai", |
| |
| polly: "aws-polly", |
| "aws-polly": "aws-polly", |
| |
| agentrouter: "agentrouter", |
| aimlapi: "aimlapi", |
| aiml: "aimlapi", |
| novita: "novita", |
| modal: "modal", |
| mdl: "modal", |
| reka: "reka", |
| nlpcloud: "nlpcloud", |
| nlpc: "nlpcloud", |
| bazaarlink: "bazaarlink", |
| bzl: "bazaarlink", |
| completions: "completions", |
| cpl: "completions", |
| enally: "enally", |
| enly: "enally", |
| freetheai: "freetheai", |
| fta: "freetheai", |
| llm7: "llm7", |
| lepton: "lepton", |
| kluster: "kluster", |
| ai21: "ai21", |
| "inference-net": "inference-net", |
| inet: "inference-net", |
| predibase: "predibase", |
| bytez: "bytez", |
| morph: "morph", |
| longcat: "longcat", |
| lc: "longcat", |
| puter: "puter", |
| pu: "puter", |
| uncloseai: "uncloseai", |
| unc: "uncloseai", |
| scaleway: "scaleway", |
| scw: "scaleway", |
| deepinfra: "deepinfra", |
| sambanova: "sambanova", |
| samba: "sambanova", |
| nscale: "nscale", |
| baseten: "baseten", |
| publicai: "publicai", |
| "nous-research": "nous-research", |
| nous: "nous-research", |
| glhf: "glhf", |
| bb: "blackbox", |
| blackbox: "blackbox", |
| }; |
|
|
| |
| |
| |
| export function resolveProviderAlias(aliasOrId) { |
| return ALIAS_TO_PROVIDER_ID[aliasOrId] || aliasOrId; |
| } |
|
|
| |
| |
| |
| export function parseModel(modelStr) { |
| if (!modelStr) { |
| return { provider: null, model: null, isAlias: false, providerAlias: null }; |
| } |
|
|
| |
| if (modelStr.includes("/")) { |
| const firstSlash = modelStr.indexOf("/"); |
| const providerOrAlias = modelStr.slice(0, firstSlash); |
| const model = modelStr.slice(firstSlash + 1); |
| const provider = resolveProviderAlias(providerOrAlias); |
| return { provider, model, isAlias: false, providerAlias: providerOrAlias }; |
| } |
|
|
| |
| return { |
| provider: null, |
| model: modelStr, |
| isAlias: true, |
| providerAlias: null, |
| }; |
| } |
|
|
| |
| |
| |
| |
| export function resolveModelAliasFromMap(alias, aliases) { |
| if (!aliases) return null; |
|
|
| |
| const resolved = aliases[alias]; |
| if (!resolved) return null; |
|
|
| |
| if (typeof resolved === "string" && resolved.includes("/")) { |
| const firstSlash = resolved.indexOf("/"); |
| const providerOrAlias = resolved.slice(0, firstSlash); |
| return { |
| provider: resolveProviderAlias(providerOrAlias), |
| model: resolved.slice(firstSlash + 1), |
| }; |
| } |
|
|
| |
| if (typeof resolved === "object" && resolved.provider && resolved.model) { |
| return { |
| provider: resolveProviderAlias(resolved.provider), |
| model: resolved.model, |
| }; |
| } |
|
|
| return null; |
| } |
|
|
| |
| |
| |
| |
| |
| export async function getModelInfoCore(modelStr, aliasesOrGetter) { |
| const parsed = parseModel(modelStr); |
|
|
| if (!parsed.isAlias) { |
| return { |
| provider: parsed.provider, |
| model: parsed.model, |
| }; |
| } |
|
|
| |
| const aliases = |
| typeof aliasesOrGetter === "function" |
| ? await aliasesOrGetter() |
| : aliasesOrGetter; |
|
|
| |
| const resolved = resolveModelAliasFromMap(parsed.model, aliases); |
| if (resolved) { |
| return resolved; |
| } |
|
|
| |
| return { |
| provider: inferProviderFromModelName(parsed.model), |
| model: parsed.model, |
| }; |
| } |
|
|
| |
| |
| |
| |
| function inferProviderFromModelName(modelName) { |
| if (!modelName) return "openai"; |
| const m = modelName.toLowerCase(); |
| if (m.startsWith("claude-")) return "anthropic"; |
| if (m.startsWith("gemini-")) return "gemini"; |
| if (m.startsWith("gpt-")) return "openai"; |
| if (m.startsWith("o1") || m.startsWith("o3") || m.startsWith("o4")) |
| return "openai"; |
| if (m.startsWith("deepseek-")) return "openrouter"; |
| |
| return "openai"; |
| } |
|
|