diff --git a/open-sse/config/providerModels.js b/open-sse/config/providerModels.js index 46b92e02..e0bb6599 100644 --- a/open-sse/config/providerModels.js +++ b/open-sse/config/providerModels.js @@ -1,845 +1,11 @@ import { PROVIDERS } from "./providers.js"; -import { buildTtsProviderModels } from "./ttsModels.js"; +// PROVIDER_MODELS now built from providers/registry (transport + models co-located) +import { PROVIDER_MODELS } from "../providers/index.js"; -// Provider models - Single source of truth -// Key = alias (cc, cx, gc, qw, if, ag, gh for OAuth; id for API Key) -// Field "provider" for special cases (e.g. AntiGravity models that call different backends) +export { PROVIDER_MODELS }; const CODEX_REVIEW_SUFFIX = "-review"; -function withCodexReviewModels(models) { - return models.flatMap((model) => { - if ((model.type || "llm") !== "llm" || model.id.endsWith(CODEX_REVIEW_SUFFIX)) { - return [model]; - } - - return [ - model, - { - ...model, - id: `${model.id}${CODEX_REVIEW_SUFFIX}`, - name: `${model.name} Review`, - upstreamModelId: model.upstreamModelId || model.id, - quotaFamily: "review", - }, - ]; - }); -} - -export const PROVIDER_MODELS = { - // OAuth Providers (using alias) - cc: [ // Claude Code - { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, - { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, - { id: "claude-opus-4-6", name: "Claude Opus 4.6" }, - { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, - { id: "claude-opus-4-5-20251101", name: "Claude 4.5 Opus" }, - { id: "claude-sonnet-4-5-20250929", name: "Claude 4.5 Sonnet" }, - { id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" }, - ], - cx: withCodexReviewModels([ // OpenAI Codex - { id: "gpt-5.5", name: "GPT 5.5" }, - { id: "gpt-5.4", name: "GPT 5.4" }, - { id: "gpt-5.4-mini", name: "GPT 5.4 Mini" }, - // GPT 5.3 Codex - all thinking levels - { id: "gpt-5.3-codex", name: "GPT 5.3 Codex" }, - { id: "gpt-5.3-codex-xhigh", name: "GPT 5.3 Codex (xHigh)" }, - { id: "gpt-5.3-codex-high", name: "GPT 5.3 Codex (High)" }, - { id: "gpt-5.3-codex-low", name: "GPT 5.3 Codex (Low)" }, - { id: "gpt-5.3-codex-none", name: "GPT 5.3 Codex (None)" }, - { id: "gpt-5.3-codex-spark", name: "GPT 5.3 Codex Spark" }, - // Image models (uses image_generation tool, requires Plus/Pro plan) - { id: "gpt-5.5-image", name: "GPT 5.5 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] }, - { id: "gpt-5.4-image", name: "GPT 5.4 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] }, - { id: "gpt-5.3-image", name: "GPT 5.3 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] }, - ]), - gc: [ // Gemini CLI - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview" }, - { id: "gemini-3-pro-preview", name: "Gemini 3 Pro Preview" }, - ], - qw: [ // Qwen Code - // { id: "qwen3-coder-next", name: "Qwen3 Coder Next" }, - { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, - { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash" }, - { id: "vision-model", name: "Qwen3 Vision Model" }, - { id: "coder-model", name: "Qwen3.6 Coder Model" }, - ], - if: [ // iFlow AI - { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, - { id: "qwen3-max", name: "Qwen3 Max" }, - { id: "qwen3-vl-plus", name: "Qwen3 VL Plus" }, - { id: "qwen3-max-preview", name: "Qwen3 Max Preview" }, - { id: "qwen3-235b", name: "Qwen3 235B A22B" }, - { id: "qwen3-235b-a22b-instruct", name: "Qwen3 235B A22B Instruct" }, - { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking" }, - { id: "qwen3-32b", name: "Qwen3 32B" }, - { id: "kimi-k2", name: "Kimi K2" }, - { id: "deepseek-v3.2", name: "DeepSeek V3.2 Exp" }, - { id: "deepseek-v3.1", name: "DeepSeek V3.1 Terminus" }, - { id: "deepseek-v3", name: "DeepSeek V3 671B" }, - { id: "deepseek-r1", name: "DeepSeek R1" }, - { id: "glm-4.7", name: "GLM 4.7" }, - { id: "iflow-rome-30ba3b", name: "iFlow ROME" }, - ], - ag: [ // Antigravity - special case: models call different backends - { id: "gemini-3-flash-agent", name: "Gemini 3.5 Flash (High)" }, - { id: "gemini-3.5-flash-low", name: "Gemini 3.5 Flash (Medium)" }, - { id: "gemini-3.5-flash-extra-low", name: "Gemini 3.5 Flash (Low)" }, - { id: "gemini-pro-agent", name: "Gemini 3.1 Pro (High)" }, - { id: "gemini-3.1-pro-low", name: "Gemini 3.1 Pro (Low)" }, - { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Thinking)" }, - { id: "claude-opus-4-6-thinking", name: "Claude Opus 4.6 (Thinking)" }, - { id: "gpt-oss-120b-medium", name: "GPT-OSS 120B (Medium)" }, - { id: "gemini-3-flash", name: "Gemini 3 Flash", thinking: false }, // command model; AG strips thinking - ], - gh: [ // GitHub Copilot - OpenAI models - { id: "gpt-3.5-turbo", name: "GPT-3.5 Turbo" }, - { id: "gpt-4", name: "GPT-4" }, - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gpt-4o-mini", name: "GPT-4o mini" }, - { id: "gpt-4.1", name: "GPT-4.1" }, - { id: "gpt-5-mini", name: "GPT-5 Mini" }, - { id: "gpt-5.2", name: "GPT-5.2" }, - { id: "gpt-5.2-codex", name: "GPT-5.2 Codex" }, - { id: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, - { id: "gpt-5.4", name: "GPT-5.4" }, - { id: "gpt-5.4-mini", name: "GPT-5.4 Mini" }, - // GitHub Copilot - Anthropic models - { id: "claude-haiku-4.5", name: "Claude Haiku 4.5" }, - { id: "claude-opus-4.5", name: "Claude Opus 4.5" }, - { id: "claude-sonnet-4", name: "Claude Sonnet 4" }, - { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5" }, - { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6" }, - { id: "claude-opus-4.6", name: "Claude Opus 4.6" }, - { id: "claude-opus-4.7", name: "Claude Opus 4.7" }, - // GitHub Copilot - Google models - { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro" }, - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash" }, - { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro" }, - // GitHub Copilot - Other models - { id: "grok-code-fast-1", name: "Grok Code Fast 1" }, - { id: "oswe-vscode-prime", name: "Raptor Mini" }, - { id: "goldeneye-free-auto", name: "GoldenEye" }, - // GitHub Copilot - Embedding models - { id: "text-embedding-3-small", name: "Text Embedding 3 Small (GitHub)", type: "embedding" }, - { id: "text-embedding-3-large", name: "Text Embedding 3 Large (GitHub)", type: "embedding" }, - ], - kr: [ // Kiro AI - // --- Base Claude variants --- - // { id: "claude-opus-4.5", name: "Claude Opus 4.5" }, - { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5" }, - { id: "claude-haiku-4.5", name: "Claude Haiku 4.5" }, - { id: "deepseek-3.2", name: "DeepSeek 3.2", strip: ["image", "audio"] }, - { id: "qwen3-coder-next", name: "Qwen3 Coder Next", strip: ["image", "audio"] }, - { id: "glm-5", name: "GLM 5" }, - { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, - // --- Thinking variants (alias to base; thinking is enabled at request time - // via enabled system-prompt injection) --- - { id: "claude-sonnet-4.5-thinking", name: "Claude Sonnet 4.5 (Thinking)" }, - { id: "claude-haiku-4.5-thinking", name: "Claude Haiku 4.5 (Thinking)" }, - // --- Agentic variants (synthetic; same upstream model + chunked-write - // system prompt to dodge Kiro's 2-3 min server timeout on big writes) --- - { id: "claude-sonnet-4.5-agentic", name: "Claude Sonnet 4.5 (Agentic)" }, - { id: "claude-haiku-4.5-agentic", name: "Claude Haiku 4.5 (Agentic)" }, - { id: "claude-sonnet-4.5-thinking-agentic", name: "Claude Sonnet 4.5 (Thinking + Agentic)" }, - { id: "claude-haiku-4.5-thinking-agentic", name: "Claude Haiku 4.5 (Thinking + Agentic)" }, - ], - qd: [ // Qoder - tier + frontier models (server-published catalog) - // Tier models — pick a quality/cost tradeoff - { id: "auto", name: "Qoder Auto" }, - { id: "ultimate", name: "Qoder Ultimate" }, - { id: "performance", name: "Qoder Performance" }, - { id: "efficient", name: "Qoder Efficient" }, - { id: "lite", name: "Qoder Lite" }, - // Frontier models — pin a specific backing model - { id: "qmodel", name: "Qwen 3.6 Plus (Qoder)" }, - { id: "qmodel_latest", name: "Qoder Qwen 3.7 Max" }, - { id: "dmodel", name: "DeepSeek V4 Pro (Qoder)" }, - { id: "dfmodel", name: "DeepSeek V4 Flash (Qoder)" }, - { id: "gm51model", name: "GLM 5.1 (Qoder)" }, - { id: "kmodel", name: "Kimi K2.6 (Qoder)" }, - { id: "mmodel", name: "MiniMax M2.7 (Qoder)" }, - ], - cu: [ // Cursor IDE - { id: "default", name: "Auto (Server Picks)" }, - { id: "claude-4.5-opus-high-thinking", name: "Claude 4.5 Opus High Thinking" }, - { id: "claude-4.5-opus-high", name: "Claude 4.5 Opus High" }, - { id: "claude-4.5-sonnet-thinking", name: "Claude 4.5 Sonnet Thinking" }, - { id: "claude-4.5-sonnet", name: "Claude 4.5 Sonnet" }, - { id: "claude-4.5-haiku", name: "Claude 4.5 Haiku" }, - { id: "claude-4.5-opus", name: "Claude 4.5 Opus" }, - { id: "gpt-5.2-codex", name: "GPT 5.2 Codex" }, - { id: "claude-4.6-opus-max", name: "Claude 4.6 Opus Max" }, - { id: "claude-4.6-sonnet-medium-thinking", name: "Claude 4.6 Sonnet Medium Thinking" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview" }, - { id: "gpt-5.2", name: "GPT 5.2" }, - { id: "gpt-5.3-codex", name: "GPT 5.3 Codex" }, - ], - kmc: [ // Kimi Coding - { id: "kimi-k2.6", name: "Kimi K2.6" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "kimi-k2.5-thinking", name: "Kimi K2.5 Thinking" }, - { id: "kimi-latest", name: "Kimi Latest" }, - ], - kc: [ // KiloCode - { id: "anthropic/claude-sonnet-4-20250514", name: "Claude Sonnet 4" }, - { id: "anthropic/claude-opus-4-20250514", name: "Claude Opus 4" }, - { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro" }, - { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash" }, - { id: "openai/gpt-4.1", name: "GPT-4.1" }, - { id: "openai/o3", name: "o3" }, - { id: "deepseek/deepseek-chat", name: "DeepSeek Chat" }, - { id: "deepseek/deepseek-reasoner", name: "DeepSeek Reasoner" }, - ], - "opencode-go": [ // OpenCode Go subscription (API key) - { id: "kimi-k2.6", name: "Kimi K2.6" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "glm-5.1", name: "GLM 5.1" }, - { id: "glm-5", name: "GLM 5" }, - { id: "qwen3.5-plus", name: "Qwen 3.5 Plus" }, - { id: "qwen3.6-plus", name: "Qwen 3.6 Plus" }, - { id: "mimo-v2-pro", name: "MiMo V2 Pro" }, - { id: "mimo-v2-omni", name: "MiMo V2 Omni" }, - { id: "minimax-m2.7", name: "MiniMax M2.7", targetFormat: "claude" }, - { id: "minimax-m2.5", name: "MiniMax M2.5", targetFormat: "claude" }, - ], - oc: [ // OpenCode - // { id: "nemotron-3-super-free", name: "Nemotron 3 Super" }, - // { id: "qwen3.6-plus-free", name: "Qwen 3.6 Plus" }, - // { id: "big-pickle", name: "Big Pickle", targetFormat: "claude" }, - // { id: "minimax-m2.5-free", name: "MiniMax M2.5", targetFormat: "claude" }, - // { id: "trinity-large-preview-free", name: "Trinity Large Preview" }, - ], - mmf: [ // MiMo Free — free channel only serves mimo-auto - { id: "mimo-auto", name: "MiMo Auto" }, - ], - - cl: [ // Cline - { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7" }, - { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6" }, - { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6" }, - { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex" }, - { id: "openai/gpt-5.4", name: "GPT-5.4" }, - { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview" }, - { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview" }, - { id: "kwaipilot/kat-coder-pro", name: "KAT Coder Pro" }, - ], - - // API Key Providers (alias = id) - openai: [ - // Flagship models - { id: "gpt-5.4", name: "GPT-5.4" }, - { id: "gpt-5.4-mini", name: "GPT-5.4 Mini" }, - { id: "gpt-5.4-nano", name: "GPT-5.4 Nano" }, - { id: "gpt-5.2", name: "GPT-5.2" }, - { id: "gpt-5.1", name: "GPT-5.1" }, - { id: "gpt-5", name: "GPT-5" }, - { id: "gpt-5-mini", name: "GPT-5 Mini" }, - { id: "gpt-5-nano", name: "GPT-5 Nano" }, - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gpt-4o-mini", name: "GPT-4o Mini" }, - { id: "gpt-4-turbo", name: "GPT-4 Turbo" }, - { id: "gpt-4.1", name: "GPT-4.1" }, - { id: "gpt-4.1-mini", name: "GPT-4.1 Mini" }, - { id: "gpt-4.1-nano", name: "GPT-4.1 Nano" }, - // Reasoning models - { id: "o3", name: "O3" }, - { id: "o3-mini", name: "O3 Mini" }, - { id: "o3-pro", name: "O3 Pro" }, - { id: "o4-mini", name: "O4 Mini" }, - { id: "o1", name: "O1" }, - { id: "o1-mini", name: "O1 Mini" }, - // Embedding models - { id: "text-embedding-3-large", name: "Text Embedding 3 Large", type: "embedding" }, - { id: "text-embedding-3-small", name: "Text Embedding 3 Small", type: "embedding" }, - { id: "text-embedding-ada-002", name: "Text Embedding Ada 002", type: "embedding" }, - // TTS models - { id: "tts-1", name: "TTS-1", type: "tts" }, - { id: "tts-1-hd", name: "TTS-1 HD", type: "tts" }, - { id: "gpt-4o-mini-tts", name: "GPT-4o Mini TTS", type: "tts" }, - // STT models - { id: "whisper-1", name: "Whisper 1", type: "stt", params: ["language", "response_format", "temperature", "prompt"] }, - { id: "gpt-4o-transcribe", name: "GPT-4o Transcribe", type: "stt", params: ["language", "response_format", "temperature", "prompt"] }, - { id: "gpt-4o-mini-transcribe", name: "GPT-4o Mini Transcribe", type: "stt", params: ["language", "response_format", "temperature", "prompt"] }, - // Image models - { id: "gpt-image-1", name: "GPT Image 1", type: "image", params: ["n", "size", "quality", "response_format"] }, - { id: "dall-e-3", name: "DALL-E 3", type: "image", params: ["size", "quality", "style", "response_format"] }, - { id: "dall-e-2", name: "DALL-E 2", type: "image", params: ["n", "size", "response_format"] }, - ], - anthropic: [ - { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4" }, - { id: "claude-opus-4-20250514", name: "Claude Opus 4" }, - { id: "claude-3-5-sonnet-20241022", name: "Claude 3.5 Sonnet" }, - ], - gemini: [ - // Gemini 3.1 series - { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview" }, - { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview" }, - // Gemini 3 series - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview" }, - // Gemini 2.5 series - { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro" }, - { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, - { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite" }, - // Gemini 2.0 series (retiring June 1, 2026) - { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" }, - { id: "gemini-2.0-flash-lite", name: "Gemini 2.0 Flash Lite" }, - { id: "gemma-4-31b-it", name: "Gemma 4 31B IT" }, - - // Embedding models - { id: "gemini-embedding-2-preview", name: "Gemini Embedding 2 Preview", type: "embedding" }, - { id: "gemini-embedding-001", name: "Gemini Embedding 001", type: "embedding" }, - { id: "text-embedding-005", name: "Text Embedding 005", type: "embedding" }, - { id: "text-embedding-004", name: "Text Embedding 004 (Legacy)", type: "embedding" }, - // Image models (Nano Banana) - { id: "gemini-3.1-flash-image-preview", name: "Gemini 3.1 Flash Image (Nano Banana 2)", type: "image", params: [] }, - { id: "gemini-3-pro-image-preview", name: "Gemini 3 Pro Image (Nano Banana Pro)", type: "image", params: [] }, - { id: "gemini-2.5-flash-image", name: "Gemini 2.5 Flash Image (Nano Banana)", type: "image", params: [] }, - // STT models (multimodal generateContent) - { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro (Best)", type: "stt", params: ["language", "prompt"] }, - { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", type: "stt", params: ["language", "prompt"] }, - { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite (Cheapest)", type: "stt", params: ["language", "prompt"] }, - { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", type: "stt", params: ["language", "prompt"] }, - ], - openrouter: [ - // Embedding models - { id: "openai/text-embedding-3-large", name: "OpenAI Text Embedding 3 Large", type: "embedding" }, - { id: "openai/text-embedding-3-small", name: "OpenAI Text Embedding 3 Small", type: "embedding" }, - { id: "openai/text-embedding-ada-002", name: "OpenAI Text Embedding Ada 002", type: "embedding" }, - { id: "qwen/qwen3-embedding-8b", name: "Qwen3 Embedding 8B", type: "embedding" }, - { id: "perplexity/pplx-embed-v1-4b", name: "Perplexity Embed V1 4B", type: "embedding" }, - { id: "perplexity/pplx-embed-v1-0.6b", name: "Perplexity Embed V1 0.6B", type: "embedding" }, - { id: "nvidia/llama-nemotron-embed-vl-1b-v2:free", name: "NVIDIA Nemotron Embed VL 1B V2 (Free)", type: "embedding" }, - // TTS models - { id: "openai/gpt-4o-mini-tts", name: "GPT-4o Mini TTS", type: "tts" }, - { id: "openai/tts-1-hd", name: "TTS-1 HD", type: "tts" }, - { id: "openai/tts-1", name: "TTS-1", type: "tts" }, - // Image models - { id: "openai/dall-e-3", name: "DALL-E 3 (via OpenRouter)", type: "image", params: ["size", "quality", "style", "response_format"] }, - { id: "openai/gpt-image-1", name: "GPT Image 1 (via OpenRouter)", type: "image", params: ["n", "size", "quality", "response_format"] }, - { id: "google/imagen-3.0-generate-002", name: "Imagen 3 (via OpenRouter)", type: "image", params: ["n", "size"] }, - { id: "black-forest-labs/FLUX.1-schnell", name: "FLUX.1 Schnell (via OpenRouter)", type: "image", params: ["n", "size"] }, - ], - glm: [ - { id: "glm-5.1", name: "GLM 5.1" }, - { id: "glm-5", name: "GLM 5" }, - { id: "glm-4.7", name: "GLM 4.7" }, - { id: "glm-4.6v", name: "GLM 4.6V (Vision)" }, - ], - "glm-cn": [ - { id: "glm-5.1", name: "GLM 5.1" }, - { id: "glm-5", name: "GLM 5" }, - { id: "glm-4.7", name: "GLM-4.7" }, - { id: "glm-4.6", name: "GLM-4.6" }, - { id: "glm-4.5-air", name: "GLM-4.5-Air" }, - ], - kimi: [ - { id: "kimi-k2.6", name: "Kimi K2.6" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "kimi-k2.5-thinking", name: "Kimi K2.5 Thinking" }, - { id: "kimi-latest", name: "Kimi Latest" }, - ], - minimax: [ - { id: "MiniMax-M3", name: "MiniMax M3", targetFormat: "claude" }, - { id: "MiniMax-M2.7", name: "MiniMax M2.7" }, - { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, - { id: "MiniMax-M2.1", name: "MiniMax M2.1" }, - // Image models - { id: "minimax-image-01", name: "MiniMax Image 01", type: "image", params: ["n", "size", "response_format"] }, - ], - blackbox: [ - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gpt-4o-mini", name: "GPT-4o mini" }, - { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6" }, - { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5" }, - { id: "claude-opus-4.6", name: "Claude Opus 4.6" }, - { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Legacy)" }, - { id: "claude-opus-4-6", name: "Claude Opus 4.6 (Legacy)" }, - { id: "deepseek-chat", name: "DeepSeek Chat" }, - { id: "deepseek-v3-671b", name: "DeepSeek V3 671B" }, - { id: "deepseek-r1", name: "DeepSeek R1" }, - { id: "o1", name: "OpenAI o1" }, - { id: "o3-mini", name: "OpenAI o3-mini" }, - { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview" }, - { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, - { id: "qwen3-max", name: "Qwen3 Max" }, - { id: "qwen3-vl-plus", name: "Qwen3 VL Plus" }, - ], - "minimax-cn": [ - { id: "MiniMax-M3", name: "MiniMax M3", targetFormat: "claude" }, - { id: "MiniMax-M2.7", name: "MiniMax M2.7" }, - { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, - { id: "MiniMax-M2.1", name: "MiniMax M2.1" }, - ], - alicode: [ - { id: "qwen3.5-plus", name: "Qwen3.5 Plus" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "glm-5", name: "GLM 5" }, - { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, - { id: "qwen3-max-2026-01-23", name: "Qwen3 Max" }, - { id: "qwen3-coder-next", name: "Qwen3 Coder Next" }, - { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, - { id: "glm-4.7", name: "GLM 4.7" }, - ], - "alicode-intl": [ - { id: "qwen3.5-plus", name: "Qwen3.5 Plus" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "glm-5", name: "GLM 5" }, - { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, - { id: "qwen3-coder-next", name: "Qwen3 Coder Next" }, - { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus" }, - { id: "glm-4.7", name: "GLM 4.7" }, - ], - "volcengine-ark": [ - { id: "Doubao-Seed-2.0-Code", name: "Doubao-Seed-2.0-Code" }, - { id: "Doubao-Seed-2.0-pro", name: "Doubao-Seed-2.0-pro" }, - { id: "Doubao-Seed-2.0-lite", name: "Doubao-Seed-2.0-lite" }, - { id: "Doubao-Seed-Code", name: "Doubao-Seed-Code" }, - { id: "DeepSeek-V4-Flash", name: "DeepSeek-V4-Flash" }, - { id: "DeepSeek-V4-Pro", name: "DeepSeek-V4-Pro" }, - { id: "GLM-5.1", name: "GLM-5.1" }, - { id: "MiniMax-M2.7", name: "MiniMax-M2.7" }, - { id: "Kimi-K2.6", name: "Kimi-K2.6" }, - ], - "cloudflare-ai": [ - { id: "@cf/meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct" }, - { id: "@cf/meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct" }, - { id: "@cf/meta/llama-3.1-8b-instruct-fp8-fast", name: "Llama 3.1 8B Instruct FP8 Fast" }, - { id: "@cf/meta/llama-3.1-8b-instruct-awq", name: "Llama 3.1 8B Instruct AWQ" }, - { id: "@cf/mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B Instruct" }, - { id: "@cf/meta/llama-3.1-70b-instruct-fp8-fast", name: "Llama 3.1 70B Instruct FP8 Fast" }, - { id: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", name: "Llama 3.3 70B Instruct FP8 Fast" }, - { id: "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B" }, - { id: "@cf/moonshotai/kimi-k2.5", name: "Kimi K2.5" }, - { id: "@cf/moonshotai/kimi-k2.6", name: "Kimi K2.6" }, - { id: "@cf/zai-org/glm-4.7-flash", name: "GLM 4.7 Flash" }, - { id: "@cf/qwen/qwq-32b", name: "QwQ 32B" }, - { id: "@cf/qwen/qwen2.5-coder-32b-instruct", name: "Qwen 2.5 Coder 32B Instruct" }, - { id: "@cf/black-forest-labs/flux-2-klein-9b", name: "FLUX.2 Klein 9B", type: "image", params: ["size"] }, - { id: "@cf/black-forest-labs/flux-2-klein-4b", name: "FLUX.2 Klein 4B", type: "image", params: ["size"] }, - { id: "@cf/black-forest-labs/flux-2-dev", name: "FLUX.2 Dev", type: "image", params: ["size"] }, - { id: "@cf/leonardo/lucid-origin", name: "Lucid Origin", type: "image", params: ["size"] }, - { id: "@cf/leonardo/phoenix-1.0", name: "Phoenix 1.0", type: "image", params: ["size"] }, - { id: "@cf/black-forest-labs/flux-1-schnell", name: "FLUX.1 Schnell", type: "image", params: ["size"] }, - { id: "@cf/bytedance/stable-diffusion-xl-lightning", name: "SDXL Lightning", type: "image", params: ["size"] }, - { id: "@cf/lykon/dreamshaper-8-lcm", name: "DreamShaper 8 LCM", type: "image", params: ["size"] }, - { id: "@cf/runwayml/stable-diffusion-v1-5-img2img", name: "Stable Diffusion v1.5 Img2Img", type: "image", params: ["size"], capabilities: ["edit"] }, - { id: "@cf/runwayml/stable-diffusion-v1-5-inpainting", name: "Stable Diffusion v1.5 Inpainting", type: "image", params: ["size"], capabilities: ["edit", "mask"] }, - { id: "@cf/stabilityai/stable-diffusion-xl-base-1.0", name: "SDXL Base 1.0", type: "image", params: ["size"] }, - ], - byteplus: [ - { id: "seed-2-0-pro-260328", name: "Seed 2.0 Pro" }, - { id: "seed-2-0-code-preview-260328", name: "Seed 2.0 Code Preview" }, - { id: "seed-2-0-mini-260215", name: "Seed 2.0 Mini" }, - { id: "seed-2-0-lite-260228", name: "Seed 2.0 Lite" }, - { id: "kimi-k2-thinking-251104", name: "Kimi K2 Thinking" }, - { id: "glm-4-7-251222", name: "GLM 4.7" }, - { id: "gpt-oss-120b-250805", name: "GPT-OSS-120B" }, - ], - deepseek: [ - { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro" }, - { id: "deepseek-v4-pro-max", name: "DeepSeek V4 Pro Max", upstreamModelId: "deepseek-v4-pro" }, - { id: "deepseek-v4-pro-none", name: "DeepSeek V4 Pro No Thinking", upstreamModelId: "deepseek-v4-pro" }, - { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash" }, - { id: "deepseek-chat", name: "DeepSeek V3.2 Chat" }, - { id: "deepseek-reasoner", name: "DeepSeek V3.2 Reasoner" }, - ], - commandcode: [ - { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro" }, - { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash" }, - { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6" }, - { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5" }, - { id: "zai-org/GLM-5.1", name: "GLM 5.1" }, - { id: "zai-org/GLM-5", name: "GLM 5" }, - { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax M2.7" }, - { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5" }, - { id: "Qwen/Qwen3.6-Max-Preview", name: "Qwen 3.6 Max Preview" }, - { id: "Qwen/Qwen3.6-Plus", name: "Qwen 3.6 Plus" }, - { id: "stepfun/Step-3.5-Flash", name: "Step 3.5 Flash" }, - ], - groq: [ - { id: "llama-3.3-70b-versatile", name: "Llama 3.3 70B" }, - { id: "meta-llama/llama-4-maverick-17b-128e-instruct", name: "Llama 4 Maverick" }, - { id: "qwen/qwen3-32b", name: "Qwen3 32B" }, - { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B" }, - // STT models - { id: "whisper-large-v3", name: "Whisper Large v3", type: "stt", params: ["language", "response_format", "temperature", "prompt"] }, - { id: "whisper-large-v3-turbo", name: "Whisper Large v3 Turbo", type: "stt", params: ["language", "response_format", "temperature", "prompt"] }, - { id: "distil-whisper-large-v3-en", name: "Distil Whisper Large v3 EN", type: "stt", params: ["language", "response_format", "temperature", "prompt"] }, - ], - xai: [ - { id: "grok-4", name: "Grok 4" }, - { id: "grok-4-fast-reasoning", name: "Grok 4 Fast Reasoning" }, - { id: "grok-code-fast-1", name: "Grok Code Fast" }, - { id: "grok-3", name: "Grok 3" }, - { id: "grok-2-image-1212", name: "Grok 2 Image", type: "image", params: ["n", "response_format"] }, - ], - mistral: [ - { id: "mistral-large-latest", name: "Mistral Large 3" }, - { id: "codestral-latest", name: "Codestral" }, - { id: "mistral-medium-latest", name: "Mistral Medium 3" }, - { id: "mistral-embed", name: "Mistral Embed", type: "embedding" }, - ], - perplexity: [ - { id: "sonar-pro", name: "Sonar Pro" }, - { id: "sonar", name: "Sonar" }, - ], - together: [ - { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "Llama 3.3 70B Turbo" }, - { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, - { id: "Qwen/Qwen3-235B-A22B", name: "Qwen3 235B" }, - { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick" }, - { id: "BAAI/bge-large-en-v1.5", name: "BGE Large EN v1.5", type: "embedding" }, - { id: "togethercomputer/m2-bert-80M-8k-retrieval", name: "M2 BERT 80M 8K", type: "embedding" }, - ], - fireworks: [ - { id: "accounts/fireworks/models/deepseek-v3p1", name: "DeepSeek V3.1" }, - { id: "accounts/fireworks/models/llama-v3p3-70b-instruct", name: "Llama 3.3 70B" }, - { id: "accounts/fireworks/models/qwen3-235b-a22b", name: "Qwen3 235B" }, - { id: "nomic-ai/nomic-embed-text-v1.5", name: "Nomic Embed Text v1.5", type: "embedding" }, - ], - cerebras: [ - { id: "gpt-oss-120b", name: "GPT OSS 120B" }, - { id: "zai-glm-4.7", name: "ZAI GLM 4.7" }, - { id: "llama-3.3-70b", name: "Llama 3.3 70B" }, - { id: "llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout" }, - { id: "qwen-3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B" }, - { id: "qwen-3-32b", name: "Qwen3 32B" }, - ], - cohere: [ - { id: "command-r-plus-08-2024", name: "Command R+ (Aug 2024)" }, - { id: "command-r-08-2024", name: "Command R (Aug 2024)" }, - { id: "command-a-03-2025", name: "Command A (Mar 2025)" }, - ], - nvidia: [ - { id: "minimaxai/minimax-m2.7", name: "Minimax M2.7" }, - { id: "z-ai/glm4.7", name: "GLM 4.7" }, - { id: "nvidia/nv-embedqa-e5-v5", name: "NV EmbedQA E5 v5", type: "embedding" }, - // STT models - { id: "nvidia/parakeet-ctc-1.1b-asr", name: "Parakeet CTC 1.1B", type: "stt", params: ["language"] }, - ], - nebius: [ - { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct" }, - { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen3 Embedding 8B", type: "embedding" }, - ], - "voyage-ai": [ - { id: "voyage-3-large", name: "Voyage 3 Large", type: "embedding" }, - { id: "voyage-3.5", name: "Voyage 3.5", type: "embedding" }, - { id: "voyage-3.5-lite", name: "Voyage 3.5 Lite", type: "embedding" }, - { id: "voyage-code-3", name: "Voyage Code 3", type: "embedding" }, - { id: "voyage-finance-2", name: "Voyage Finance 2", type: "embedding" }, - { id: "voyage-law-2", name: "Voyage Law 2", type: "embedding" }, - { id: "voyage-multilingual-2", name: "Voyage Multilingual 2", type: "embedding" }, - ], - siliconflow: [ - // DeepSeek models - { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro" }, - { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash" }, - { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek V3.2" }, - { id: "deepseek-ai/DeepSeek-V3.2-Exp", name: "DeepSeek V3.2 Exp" }, - { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1" }, - { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "DeepSeek V3.1 Terminus" }, - { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, - // Qwen models - { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen 3.5 397B A17B" }, - { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen 3.5 122B A10B" }, - // GLM models - { id: "zai-org/GLM-5.1", name: "GLM 5.1" }, - { id: "zai-org/GLM-5", name: "GLM 5" }, - // Kimi models - { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6" }, - { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5" }, - // Other models - { id: "openai/gpt-oss-120b", name: "GPT OSS 120B" }, - { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5" }, - { id: "inclusionAI/Ling-flash-2.0", name: "Ling Flash 2.0" }, - ], - "xiaomi-mimo": [ - { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro" }, - { id: "mimo-v2.5", name: "MiMo V2.5" }, - { id: "mimo-v2-omni", name: "MiMo V2 Omni" }, - { id: "mimo-v2-flash", name: "MiMo V2 Flash" }, - ], - "xiaomi-tokenplan": [ - { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro" }, - { id: "mimo-v2.5-pro-claude", name: "MiMo V2.5 Pro (Claude Native)", targetFormat: "claude", upstreamModelId: "mimo-v2.5-pro" }, - { id: "mimo-v2.5", name: "MiMo V2.5" }, - { id: "mimo-v2-pro", name: "MiMo V2 Pro" }, - { id: "mimo-v2-omni", name: "MiMo V2 Omni" }, - { id: "mimo-v2-tts", name: "MiMo V2 TTS" }, - { id: "mimo-v2.5-tts", name: "MiMo V2.5 TTS" }, - { id: "mimo-v2.5-tts-voiceclone", name: "MiMo V2.5 TTS Voice Clone" }, - { id: "mimo-v2.5-tts-voicedesign", name: "MiMo V2.5 TTS Voice Design" }, - ], - hyperbolic: [ - { id: "Qwen/QwQ-32B", name: "QwQ 32B" }, - { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, - { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek V3" }, - { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B" }, - { id: "meta-llama/Llama-3.2-3B-Instruct", name: "Llama 3.2 3B" }, - { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen 2.5 72B" }, - { id: "Qwen/Qwen2.5-Coder-32B-Instruct", name: "Qwen 2.5 Coder 32B" }, - { id: "NousResearch/Hermes-3-Llama-3.1-70B", name: "Hermes 3 70B" }, - ], - ollama: [ - { id: "gpt-oss:120b", name: "GPT OSS 120B" }, - { id: "kimi-k2.5", name: "Kimi K2.5" }, - { id: "glm-5", name: "GLM 5" }, - { id: "minimax-m2.5", name: "MiniMax M2.5" }, - { id: "glm-4.7-flash", name: "GLM 4.7 Flash" }, - { id: "qwen3.5", name: "Qwen3.5" }, - ], - vertex: [ - { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview" }, - { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview" }, - { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview" }, - { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, - ], - "vertex-partner": [ - { id: "deepseek-ai/deepseek-v3.2-maas", name: "DeepSeek V3.2 (Vertex)" }, - { id: "qwen/qwen3-next-80b-a3b-thinking-maas", name: "Qwen3 Next 80B Thinking (Vertex)" }, - { id: "qwen/qwen3-next-80b-a3b-instruct-maas", name: "Qwen3 Next 80B Instruct (Vertex)" }, - { id: "zai-org/glm-5-maas", name: "GLM-5 (Vertex)" }, - ], - "grok-web": [ - { id: "grok-3", name: "Grok 3" }, - { id: "grok-3-mini", name: "Grok 3 Mini (Thinking)" }, - { id: "grok-3-thinking", name: "Grok 3 Thinking" }, - { id: "grok-4", name: "Grok 4" }, - { id: "grok-4-mini", name: "Grok 4 Mini (Thinking)" }, - { id: "grok-4-thinking", name: "Grok 4 Thinking" }, - { id: "grok-4-heavy", name: "Grok 4 Heavy (SuperGrok)" }, - { id: "grok-4.1-mini", name: "Grok 4.1 Mini (Thinking)" }, - { id: "grok-4.1-fast", name: "Grok 4.1 Fast" }, - { id: "grok-4.1-expert", name: "Grok 4.1 Expert" }, - { id: "grok-4.1-thinking", name: "Grok 4.1 Thinking" }, - { id: "grok-4.2", name: "Grok 4.2 (4.20 Beta)" }, - ], - "perplexity-web": [ - { id: "pplx-auto", name: "Perplexity Auto (Free)" }, - { id: "pplx-sonar", name: "Perplexity Sonar" }, - { id: "pplx-gpt", name: "GPT-5.4 (via Perplexity)" }, - { id: "pplx-gemini", name: "Gemini 3.1 Pro (via Perplexity)" }, - { id: "pplx-sonnet", name: "Claude Sonnet 4.6 (via Perplexity)" }, - { id: "pplx-opus", name: "Claude Opus 4.6 (via Perplexity)" }, - { id: "pplx-nemotron", name: "Nemotron 3 Super (via Perplexity)" }, - ], - - // TTS entries are loaded from ttsModels.js via buildTtsProviderModels() - ...buildTtsProviderModels(), - - // Image providers - nanobanana: [ - { id: "nanobanana-flash", name: "NanoBanana Flash", type: "image", params: ["n", "size"] }, - { id: "nanobanana-pro", name: "NanoBanana Pro", type: "image", params: ["n", "size"] }, - ], - sdwebui: [ - { id: "stable-diffusion-v1-5", name: "Stable Diffusion v1.5", type: "image", params: ["n", "size"] }, - { id: "sdxl-base-1.0", name: "SDXL Base 1.0", type: "image", params: ["n", "size"] }, - ], - comfyui: [ - { id: "flux-dev", name: "FLUX Dev", type: "image", params: ["n", "size"] }, - { id: "sdxl", name: "SDXL", type: "image", params: ["n", "size"] }, - ], - huggingface: [ - { id: "black-forest-labs/FLUX.1-schnell", name: "FLUX.1 Schnell", type: "image", params: [] }, - { id: "stabilityai/stable-diffusion-xl-base-1.0", name: "SDXL Base 1.0", type: "image", params: [] }, - // STT models - { id: "openai/whisper-large-v3", name: "Whisper Large v3 (HF)", type: "stt", params: ["language"] }, - { id: "openai/whisper-small", name: "Whisper Small (HF)", type: "stt", params: ["language"] }, - ], - - // === Free-tier providers (synced from OmniRoute) === - agentrouter: [ - { id: "claude-opus-4-6", name: "Claude 4.6 Opus" }, - { id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" }, - { id: "glm-5.1", name: "GLM 5.1" }, - { id: "deepseek-v3.2", name: "DeepSeek V3.2" }, - ], - aimlapi: [ - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gpt-4o-mini", name: "GPT-4o Mini" }, - { id: "claude-3-5-sonnet-20241022", name: "Claude 3.5 Sonnet" }, - { id: "gemini-2.0-flash-exp", name: "Gemini 2.0 Flash" }, - { id: "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", name: "Llama 3.1 70B" }, - ], - novita: [ - { id: "deepseek/deepseek-r1", name: "DeepSeek R1" }, - { id: "deepseek/deepseek-v3", name: "DeepSeek V3" }, - { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama 3.3 70B" }, - { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen 2.5 72B" }, - ], - modal: [ - { id: "auto", name: "Auto (User-hosted)" }, - ], - reka: [ - { id: "reka-flash-3", name: "Reka Flash 3" }, - { id: "reka-edge-2603", name: "Reka Edge 2603" }, - ], - nlpcloud: [ - { id: "chatdolphin", name: "ChatDolphin" }, - { id: "dolphin", name: "Dolphin" }, - { id: "finetuned-llama-3-70b", name: "Llama 3 70B (Finetuned)" }, - ], - bazaarlink: [ - { id: "auto:free", name: "Auto Free (Zero Cost)" }, - { id: "auto", name: "Auto (Best Model)" }, - ], - completions: [ - { id: "claude-opus-4", name: "Claude Opus 4" }, - { id: "claude-sonnet-4", name: "Claude Sonnet 4" }, - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" }, - ], - enally: [ - { id: "gpt-4o", name: "GPT-4o" }, - { id: "gpt-4o-mini", name: "GPT-4o Mini" }, - { id: "claude-3-5-sonnet", name: "Claude 3.5 Sonnet" }, - ], - freetheai: [ - { id: "gpt-4o", name: "GPT-4o" }, - { id: "claude-3-5-sonnet", name: "Claude 3.5 Sonnet" }, - { id: "gemini-1.5-pro", name: "Gemini 1.5 Pro" }, - { id: "deepseek-chat", name: "DeepSeek Chat" }, - ], - llm7: [ - { id: "gpt-4o-mini", name: "GPT-4o Mini" }, - { id: "gpt-4.1-mini", name: "GPT-4.1 Mini" }, - { id: "gemini-1.5-flash", name: "Gemini 1.5 Flash" }, - ], - lepton: [ - { id: "llama3-1-405b", name: "Llama 3.1 405B" }, - { id: "llama3-1-70b", name: "Llama 3.1 70B" }, - { id: "llama3-1-8b", name: "Llama 3.1 8B" }, - { id: "mixtral-8x7b", name: "Mixtral 8x7B" }, - ], - kluster: [ - { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, - { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick" }, - { id: "meta-llama/Llama-4-Scout-17B-16E-Instruct", name: "Llama 4 Scout" }, - { id: "Qwen/Qwen3-235B-A22B-Instruct", name: "Qwen3 235B" }, - ], - ai21: [ - { id: "jamba-large", name: "Jamba 1.5 Large" }, - { id: "jamba-mini", name: "Jamba 1.5 Mini" }, - ], - "inference-net": [ - { id: "meta-llama/llama-3.3-70b-instruct/fp-16", name: "Llama 3.3 70B" }, - { id: "deepseek/deepseek-v3-0324", name: "DeepSeek V3" }, - { id: "mistralai/mistral-nemo-12b-instruct/fp-16", name: "Mistral Nemo 12B" }, - ], - predibase: [ - { id: "llama-3-2-3b-instruct", name: "Llama 3.2 3B" }, - { id: "llama-3-1-8b-instruct", name: "Llama 3.1 8B" }, - { id: "qwen2-5-7b-instruct", name: "Qwen 2.5 7B" }, - ], - bytez: [ - { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B" }, - { id: "mistralai/Mistral-7B-Instruct-v0.3", name: "Mistral 7B v0.3" }, - { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen 2.5 72B" }, - ], - morph: [ - { id: "morph-v3-large", name: "Morph V3 Large" }, - { id: "morph-v3-fast", name: "Morph V3 Fast" }, - ], - longcat: [ - { id: "LongCat-Flash-Chat", name: "LongCat Flash Chat" }, - { id: "LongCat-Flash-Thinking", name: "LongCat Flash Thinking" }, - { id: "LongCat-Flash-Lite", name: "LongCat Flash Lite" }, - ], - puter: [ - { id: "gpt-5", name: "GPT-5" }, - { id: "claude-opus-4", name: "Claude Opus 4" }, - { id: "gemini-3-pro-preview", name: "Gemini 3 Pro" }, - { id: "grok-4", name: "Grok 4" }, - { id: "deepseek-chat", name: "DeepSeek V3" }, - ], - uncloseai: [ - { id: "auto", name: "Auto (Free)" }, - { id: "gpt-4o-mini", name: "GPT-4o Mini" }, - ], - scaleway: [ - { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B" }, - { id: "llama-3.3-70b-instruct", name: "Llama 3.3 70B" }, - { id: "mistral-small-3.1-24b-instruct-2503", name: "Mistral Small 3.1" }, - ], - deepinfra: [ - { id: "meta-llama/Meta-Llama-3.1-70B-Instruct", name: "Llama 3.1 70B" }, - { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek V3" }, - { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen 2.5 72B" }, - ], - sambanova: [ - { id: "Meta-Llama-3.1-405B-Instruct", name: "Llama 3.1 405B" }, - { id: "Meta-Llama-3.1-70B-Instruct", name: "Llama 3.1 70B" }, - { id: "Meta-Llama-3.1-8B-Instruct", name: "Llama 3.1 8B" }, - ], - nscale: [ - { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B" }, - { id: "Qwen/Qwen2.5-Coder-32B-Instruct", name: "Qwen 2.5 Coder 32B" }, - ], - baseten: [ - { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, - { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B" }, - ], - publicai: [ - { id: "auto", name: "Auto (Community)" }, - ], - "nous-research": [ - { id: "Hermes-4-405B", name: "Hermes 4 405B" }, - { id: "Hermes-4-70B", name: "Hermes 4 70B" }, - ], - glhf: [ - { id: "hf:meta-llama/Meta-Llama-3.1-405B-Instruct", name: "Llama 3.1 405B" }, - { id: "hf:meta-llama/Meta-Llama-3.1-70B-Instruct", name: "Llama 3.1 70B" }, - { id: "hf:Qwen/Qwen2.5-72B-Instruct", name: "Qwen 2.5 72B" }, - ], - - deepgram: [ - { id: "nova-3", name: "Nova 3", type: "stt", params: ["language"] }, - { id: "nova-2", name: "Nova 2", type: "stt", params: ["language"] }, - { id: "whisper-large", name: "Whisper Large", type: "stt", params: ["language"] }, - ], - assemblyai: [ - { id: "universal-3-pro", name: "Universal 3 Pro", type: "stt", params: ["language"] }, - { id: "universal-2", name: "Universal 2", type: "stt", params: ["language"] }, - ], - "fal-ai": [ - { id: "fal-ai/flux/schnell", name: "FLUX Schnell", type: "image", params: ["n", "size"] }, - { id: "fal-ai/flux/dev", name: "FLUX Dev", type: "image", params: ["n", "size"] }, - { id: "fal-ai/flux-pro/v1.1", name: "FLUX Pro v1.1", type: "image", params: ["n", "size"] }, - { id: "fal-ai/flux-pro/v1.1-ultra", name: "FLUX Pro v1.1 Ultra", type: "image", params: ["n", "size"] }, - { id: "fal-ai/recraft-v3", name: "Recraft V3", type: "image", params: ["n", "size", "style"] }, - { id: "fal-ai/ideogram/v2", name: "Ideogram V2", type: "image", params: ["n", "size", "style"] }, - { id: "fal-ai/stable-diffusion-v35-large", name: "SD 3.5 Large", type: "image", params: ["n", "size"] }, - ], - "stability-ai": [ - { id: "stable-image-ultra", name: "Stable Image Ultra", type: "image", params: ["size"] }, - { id: "stable-image-core", name: "Stable Image Core", type: "image", params: ["size", "style"] }, - { id: "sd3.5-large", name: "Stable Diffusion 3.5 Large", type: "image", params: ["size"] }, - { id: "sd3.5-large-turbo", name: "Stable Diffusion 3.5 Large Turbo", type: "image", params: ["size"] }, - { id: "sd3.5-medium", name: "Stable Diffusion 3.5 Medium", type: "image", params: ["size"] }, - ], - "black-forest-labs": [ - { id: "flux-pro-1.1", name: "FLUX Pro 1.1", type: "image", params: ["n", "size"] }, - { id: "flux-pro-1.1-ultra", name: "FLUX Pro 1.1 Ultra", type: "image", params: ["size"] }, - { id: "flux-pro", name: "FLUX Pro", type: "image", params: ["n", "size"] }, - { id: "flux-dev", name: "FLUX Dev", type: "image", params: ["n", "size"] }, - { id: "flux-kontext-pro", name: "FLUX Kontext Pro (Edit)", type: "image", params: ["size"], capabilities: ["edit"] }, - { id: "flux-kontext-max", name: "FLUX Kontext Max (Edit)", type: "image", params: ["size"], capabilities: ["edit"] }, - ], - recraft: [ - { id: "recraftv3", name: "Recraft V3", type: "image", params: ["n", "size", "style"] }, - { id: "recraftv2", name: "Recraft V2", type: "image", params: ["n", "size", "style"] }, - ], - runwayml: [ - { id: "gen4_image", name: "Gen-4 Image", type: "image", params: ["size"] }, - { id: "gen4_image_turbo", name: "Gen-4 Image Turbo", type: "image", params: ["size"] }, - { id: "gen4_turbo", name: "Gen-4 Turbo", type: "video", params: [] }, - { id: "gen3a_turbo", name: "Gen-3 Alpha Turbo", type: "video", params: [] }, - ], -}; // Helper functions export function getProviderModels(aliasOrId) { diff --git a/open-sse/config/providers.js b/open-sse/config/providers.js index f0e8d7c1..f7aa53dc 100644 --- a/open-sse/config/providers.js +++ b/open-sse/config/providers.js @@ -1,426 +1,5 @@ -import { platform, arch } from "os"; - -// === OS/Arch helpers === -function mapStainlessOs() { - switch (platform()) { - case "darwin": return "MacOS"; - case "win32": return "Windows"; - case "linux": return "Linux"; - case "freebsd": return "FreeBSD"; - default: return `Other::${platform()}`; - } -} - -function mapStainlessArch() { - switch (arch()) { - case "x64": return "x64"; - case "arm64": return "arm64"; - case "ia32": return "x86"; - default: return `other::${arch()}`; - } -} - -// Shared Claude-compatible API headers (reused across claude-format providers) -const CLAUDE_API_HEADERS = { - "Anthropic-Version": "2023-06-01", - "Anthropic-Beta": "claude-code-20250219,interleaved-thinking-2025-05-14" -}; - -// Full Claude CLI fingerprint — required by providers that gate on client identity (e.g. agentrouter) -const CLAUDE_CLI_SPOOF_HEADERS = { - "Anthropic-Version": "2023-06-01", - "Anthropic-Beta": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28", - "Anthropic-Dangerous-Direct-Browser-Access": "true", - "User-Agent": "claude-cli/2.1.92 (external, sdk-cli)", - "X-App": "cli", - "X-Stainless-Helper-Method": "stream", - "X-Stainless-Retry-Count": "0", - "X-Stainless-Runtime-Version": "v24.14.0", - "X-Stainless-Package-Version": "0.80.0", - "X-Stainless-Runtime": "node", - "X-Stainless-Lang": "js", - "X-Stainless-Arch": mapStainlessArch(), - "X-Stainless-Os": mapStainlessOs(), - "X-Stainless-Timeout": "600" -}; - -// Shared baseUrls -const KIMI_CODING_BASE_URL = "https://api.kimi.com/coding/v1/messages"; - -// Apply shared transport defaults without changing output shape -function defineProviders(raw) { - const out = {}; - for (const [id, cfg] of Object.entries(raw)) { - out[id] = { ...cfg }; - if (!out[id].format) out[id].format = "openai"; - } - return out; -} - -export const PROVIDERS = defineProviders({ - claude: { - baseUrl: "https://api.anthropic.com/v1/messages", - format: "claude", - headers: { ...CLAUDE_CLI_SPOOF_HEADERS }, - clientId: "9d1c250a-e61b-44d9-88ed-5944d1962f5e", - tokenUrl: "https://api.anthropic.com/v1/oauth/token" - }, - gemini: { - baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", - format: "gemini", - clientId: "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com", - clientSecret: "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" - }, - "gemini-cli": { - baseUrl: "https://cloudcode-pa.googleapis.com/v1internal", - format: "gemini-cli", - clientId: "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com", - clientSecret: "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" - }, - codex: { - baseUrl: "https://chatgpt.com/backend-api/codex/responses", - format: "openai-responses", - headers: { - "originator": "codex_cli_rs", - "User-Agent": "codex_cli_rs/0.136.0" - }, - clientId: "app_EMoamEEZ73f0CkXaXp7hrann", - tokenUrl: "https://auth.openai.com/oauth/token" - }, - qwen: { - baseUrl: "https://portal.qwen.ai/v1/chat/completions", - clientId: "f0304373b74a44d2b584a3fb70ca9e56", - tokenUrl: "https://chat.qwen.ai/api/v1/oauth2/token", - authUrl: "https://chat.qwen.ai/api/v1/oauth2/device/code" - }, - iflow: { - baseUrl: "https://apis.iflow.cn/v1/chat/completions", - headers: { "User-Agent": "iFlow-Cli" }, - clientId: "10009311001", - clientSecret: "4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW", - tokenUrl: "https://iflow.cn/oauth/token", - authUrl: "https://iflow.cn/oauth" - }, - qoder: { - // The qoder executor builds the full URL itself (it has to append - // ?Encode=1 + sigPath query params and bypass any provider-level URL - // rewriting). baseUrl is kept for compatibility with introspection - // helpers but the executor ignores it. - baseUrl: "https://api3.qoder.sh/algo/api/v2/service/pro/sse/agent_chat_generation", - headers: {}, - // Reasoning models think long before first byte; raise both timeouts. - timeoutMs: 120000, - stallTimeoutMs: 120000, - }, - antigravity: { - baseUrls: [ - "https://daily-cloudcode-pa.googleapis.com", - "https://daily-cloudcode-pa.sandbox.googleapis.com", - ], - format: "antigravity", - headers: { "User-Agent": `antigravity/1.107.0 ${platform()}/${arch()}` }, - clientId: "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com", - clientSecret: "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" - }, - openrouter: { - baseUrl: "https://openrouter.ai/api/v1/chat/completions", - headers: { - "HTTP-Referer": "https://endpoint-proxy.local", - "X-Title": "Endpoint Proxy" - } - }, - openai: { - baseUrl: "https://api.openai.com/v1/chat/completions", - }, - "vercel-ai-gateway": { - baseUrl: "https://ai-gateway.vercel.sh/v1/chat/completions", - retry: { 429: 2 } - }, - glm: { - baseUrl: "https://api.z.ai/api/anthropic/v1/messages", - format: "claude", - headers: { ...CLAUDE_API_HEADERS } - }, - "glm-cn": { - baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions", - headers: {} - }, - kimi: { - baseUrl: KIMI_CODING_BASE_URL, - format: "claude", - headers: { ...CLAUDE_API_HEADERS } - }, - minimax: { - baseUrl: "https://api.minimax.io/anthropic/v1/messages", - format: "claude", - headers: { ...CLAUDE_API_HEADERS } - }, - "minimax-cn": { - baseUrl: "https://api.minimaxi.com/anthropic/v1/messages", - format: "claude", - headers: { ...CLAUDE_API_HEADERS } - }, - alicode: { - baseUrl: "https://coding.dashscope.aliyuncs.com/v1/chat/completions", - headers: {} - }, - "alicode-intl": { - baseUrl: "https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions", - headers: {} - }, - "volcengine-ark": { - baseUrl: "https://ark.cn-beijing.volces.com/api/coding/v3/chat/completions", - headers: {} - }, - byteplus: { - baseUrl: "https://ark.ap-southeast.bytepluses.com/api/coding/v3/chat/completions", - headers: {} - }, - github: { - baseUrl: "https://api.githubcopilot.com/chat/completions", - responsesUrl: "https://api.githubcopilot.com/responses", - headers: { - "copilot-integration-id": "vscode-chat", - "editor-version": "vscode/1.110.0", - "editor-plugin-version": "copilot-chat/0.38.0", - "user-agent": "GitHubCopilotChat/0.38.0", - "openai-intent": "conversation-panel", - "x-github-api-version": "2025-04-01", - "x-vscode-user-agent-library-version": "electron-fetch", - "X-Initiator": "user", - "Accept": "application/json", - "Content-Type": "application/json" - }, - clientId: "Iv1.b507a08c87ecfe98" - }, - kiro: { - // All three hosts resolve to the same regional CodeWhisperer streaming service - // (GenerateAssistantResponse). They are alternate DNS surfaces, NOT separate quota - // buckets — AWS throttles per authenticated identity (token + profileArn), not per - // hostname. Listing them enables edge-level failover (5xx / connect timeout / a - // degraded surface); it does NOT multiply 429 headroom. To actually spread 429 load, - // add multiple Kiro accounts — account rotation in sse/handlers/chat.js handles that. - // Order: newest Kiro IDE endpoint first, legacy AWS domains as fallback. - baseUrl: "https://runtime.us-east-1.kiro.dev/generateAssistantResponse", - baseUrls: [ - "https://runtime.us-east-1.kiro.dev/generateAssistantResponse", - "https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse", - "https://q.us-east-1.amazonaws.com/generateAssistantResponse", - ], - format: "kiro", - // 429 = identity-level throttle; retrying the same identity only spams AWS. - // Rotate across the 3 host surfaces once each (shouldRetry) without per-host retries. - retry: { 429: 0 }, - headers: { - "Content-Type": "application/json", - "Accept": "application/vnd.amazon.eventstream", - "X-Amz-Target": "AmazonCodeWhispererStreamingService.GenerateAssistantResponse", - "User-Agent": "AWS-SDK-JS/3.0.0 kiro-ide/1.0.0", - "X-Amz-User-Agent": "aws-sdk-js/3.0.0 kiro-ide/1.0.0" - }, - tokenUrl: "https://prod.us-east-1.auth.desktop.kiro.dev/refreshToken", - authUrl: "https://prod.us-east-1.auth.desktop.kiro.dev" - }, - cursor: { - baseUrl: "https://api2.cursor.sh", - chatPath: "/aiserver.v1.ChatService/StreamUnifiedChatWithTools", - format: "cursor", - headers: { - "connect-accept-encoding": "gzip", - "connect-protocol-version": "1", - "Content-Type": "application/connect+proto", - "User-Agent": "connect-es/1.6.1" - }, - clientVersion: "3.1.0" - }, - "kimi-coding": { - baseUrl: KIMI_CODING_BASE_URL, - format: "claude", - headers: { ...CLAUDE_API_HEADERS }, - clientId: "17e5f671-d194-4dfb-9706-5516cb48c098", - tokenUrl: "https://auth.kimi.com/api/oauth/token", - refreshUrl: "https://auth.kimi.com/api/oauth/token" - }, - kilocode: { - baseUrl: "https://api.kilo.ai/api/openrouter/chat/completions", - headers: {} - }, - cline: { - baseUrl: "https://api.cline.bot/api/v1/chat/completions", - headers: { - "HTTP-Referer": "https://cline.bot", - "X-Title": "Cline" - }, - tokenUrl: "https://api.cline.bot/api/v1/auth/token", - refreshUrl: "https://api.cline.bot/api/v1/auth/refresh" - }, - nvidia: { - baseUrl: "https://integrate.api.nvidia.com/v1/chat/completions", - }, - anthropic: { - baseUrl: "https://api.anthropic.com/v1/messages", - format: "claude", - headers: { ...CLAUDE_API_HEADERS } - }, - deepseek: { - baseUrl: "https://api.deepseek.com/chat/completions", - }, - commandcode: { - baseUrl: "https://api.commandcode.ai/alpha/generate", - format: "commandcode", - headers: { - "x-command-code-version": "0.25.7", - "x-cli-environment": "cli" - } - }, - groq: { - baseUrl: "https://api.groq.com/openai/v1/chat/completions", - }, - xai: { - baseUrl: "https://api.x.ai/v1/chat/completions", - responsesUrl: "https://api.x.ai/v1/responses", - clientId: "b1a00492-073a-47ea-816f-4c329264a828", - tokenUrl: "https://auth.x.ai/oauth2/token", - refreshUrl: "https://auth.x.ai/oauth2/token" - }, - mistral: { - baseUrl: "https://api.mistral.ai/v1/chat/completions", - }, - perplexity: { - baseUrl: "https://api.perplexity.ai/chat/completions", - }, - together: { - baseUrl: "https://api.together.xyz/v1/chat/completions", - }, - fireworks: { - baseUrl: "https://api.fireworks.ai/inference/v1/chat/completions", - }, - cerebras: { - baseUrl: "https://api.cerebras.ai/v1/chat/completions", - }, - cohere: { - baseUrl: "https://api.cohere.ai/v1/chat/completions", - }, - nebius: { - baseUrl: "https://api.studio.nebius.ai/v1/chat/completions", - }, - siliconflow: { - baseUrl: "https://api.siliconflow.com/v1/chat/completions", - }, - hyperbolic: { - baseUrl: "https://api.hyperbolic.xyz/v1/chat/completions", - }, - deepgram: { - baseUrl: "https://api.deepgram.com/v1/listen", - }, - assemblyai: { - baseUrl: "https://api.assemblyai.com/v1/audio/transcriptions", - }, - nanobanana: { - baseUrl: "https://api.nanobananaapi.ai/v1/chat/completions", - }, - chutes: { - baseUrl: "https://llm.chutes.ai/v1/chat/completions", - }, - ollama: { - baseUrl: "https://ollama.com/api/chat", - format: "ollama" - }, - "ollama-local": { - baseUrl: "http://localhost:11434/api/chat", - format: "ollama" - }, - // Vertex AI - Gemini models via Service Account JSON - // baseUrl is not used; VertexExecutor.buildUrl() constructs it dynamically - vertex: { - baseUrl: "https://aiplatform.googleapis.com", - format: "vertex" - }, - // Vertex AI - Partner models (Claude, Llama, Mistral, GLM) via SA JSON - // Uses OpenAI-compatible global endpoint (or rawPredict for Anthropic) - "vertex-partner": { - baseUrl: "https://aiplatform.googleapis.com", - }, - // GitLab Duo - OpenAI-compatible chat endpoint - gitlab: { - baseUrl: "https://gitlab.com/api/v4/chat/completions", - }, - // CodeBuddy (Tencent) - uses device_code polling auth, no chat completions baseUrl needed - codebuddy: { - baseUrl: "https://copilot.tencent.com/v1/chat/completions", - }, - opencode: { - baseUrl: "https://opencode.ai", - headers: { "x-opencode-client": "desktop" }, - noAuth: true - }, - "opencode-go": { - baseUrl: "https://opencode.ai/zen/go/v1/chat/completions", - headers: {} - }, - "grok-web": { - baseUrl: "https://grok.com/rest/app-chat/conversations/new", - format: "grok-web", - authType: "cookie" - }, - "perplexity-web": { - baseUrl: "https://www.perplexity.ai/rest/sse/perplexity_ask", - format: "perplexity-web", - authType: "cookie" - }, - azure: { - baseUrl: "", - headers: {} - }, - // Cloudflare Workers AI - {accountId} resolved from credentials.providerSpecificData.accountId - "cloudflare-ai": { - baseUrl: "https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1/chat/completions", - }, - "xiaomi-mimo": { - baseUrl: "https://api.xiaomimimo.com/v1/chat/completions", - }, - "mimo-free": { baseUrl: "https://api.xiaomimimo.com/api/free-ai/openai/chat", noAuth: true }, - mmf: { baseUrl: "https://api.xiaomimimo.com/api/free-ai/openai/chat", noAuth: true }, - "xiaomi-tokenplan": { - baseUrl: "https://token-plan-sgp.xiaomimimo.com/v1/chat/completions", - }, - // Region map for Xiaomi MiMo Token Plan (keys are cluster-specific) - // Used by resolveXiaomiTokenplanBaseUrl below - // === Free-tier providers (synced from OmniRoute) === - // Claude-format with Claude CLI header spoofing (auth: x-api-key) - agentrouter: { baseUrl: "https://agentrouter.org/v1/messages", format: "claude", headers: { ...CLAUDE_CLI_SPOOF_HEADERS } }, - // OpenAI-compatible (auth: bearer) - aimlapi: { baseUrl: "https://api.aimlapi.com/v1/chat/completions" }, - novita: { baseUrl: "https://api.novita.ai/v3/openai/chat/completions" }, - modal: { baseUrl: "https://api.modal.com/v1/chat/completions" }, - reka: { baseUrl: "https://api.reka.ai/v1/chat/completions" }, - nlpcloud: { baseUrl: "https://api.nlpcloud.io/v1/gpu/chatbot" }, - bazaarlink: { baseUrl: "https://bazaarlink.ai/api/v1/chat/completions" }, - completions: { baseUrl: "https://completions.me/api/v1/chat/completions" }, - // enally uses X-API-Key header (not bearer); handled in validate route - enally: { baseUrl: "https://ai.enally.in/v1/chat/completions", authHeader: "x-api-key" }, - freetheai: { baseUrl: "https://api.freetheai.xyz/v1/chat/completions" }, - llm7: { baseUrl: "https://api.llm7.io/v1/chat/completions" }, - lepton: { baseUrl: "https://api.lepton.ai/api/v1/chat/completions" }, - kluster: { baseUrl: "https://api.kluster.ai/v1/chat/completions" }, - ai21: { baseUrl: "https://api.ai21.com/studio/v1/chat/completions" }, - "inference-net": { baseUrl: "https://api.inference.net/v1/chat/completions" }, - predibase: { baseUrl: "https://serving.app.predibase.com/v1/chat/completions" }, - bytez: { baseUrl: "https://api.bytez.com/models/v2" }, - morph: { baseUrl: "https://api.morphllm.com/v1/chat/completions" }, - longcat: { baseUrl: "https://api.longcat.chat/openai/v1/chat/completions" }, - puter: { baseUrl: "https://api.puter.com/puterai/openai/v1/chat/completions" }, - uncloseai: { baseUrl: "https://hermes.ai.unturf.com/v1/chat/completions", noAuth: true }, - scaleway: { baseUrl: "https://api.scaleway.ai/v1/chat/completions" }, - deepinfra: { baseUrl: "https://api.deepinfra.com/v1/openai/chat/completions" }, - sambanova: { baseUrl: "https://api.sambanova.ai/v1/chat/completions" }, - nscale: { baseUrl: "https://inference.api.nscale.com/v1/chat/completions" }, - baseten: { baseUrl: "https://inference.baseten.co/v1/chat/completions" }, - publicai: { baseUrl: "https://api.publicai.co/v1/chat/completions" }, - "nous-research": { baseUrl: "https://inference-api.nousresearch.com/v1/chat/completions" }, - glhf: { baseUrl: "https://glhf.chat/api/openai/v1/chat/completions" }, - blackbox: { baseUrl: "https://api.blackbox.ai/chat/completions" }, -}); +// Barrel: PROVIDERS now built from providers/registry (transport co-located with models) +export { PROVIDERS } from "../providers/index.js"; export const OLLAMA_LOCAL_DEFAULT_HOST = "http://localhost:11434"; diff --git a/open-sse/providers/index.js b/open-sse/providers/index.js new file mode 100644 index 00000000..9e5e92d4 --- /dev/null +++ b/open-sse/providers/index.js @@ -0,0 +1,22 @@ +// Single source: build PROVIDERS + PROVIDER_MODELS from registry/{id}.js (transport + models co-located). +import REGISTRY from "./registry/index.js"; +import { PROVIDER_DEFAULTS } from "./schema.js"; +import { buildTtsProviderModels } from "../config/ttsModels.js"; + +// transport: re-apply shared default (format:"openai") like the old defineProviders() +function buildTransport(transport) { + const t = { ...transport }; + if (!t.format) t.format = PROVIDER_DEFAULTS.format; + return t; +} + +export const PROVIDERS = {}; +export const PROVIDER_MODELS = {}; +for (const entry of REGISTRY) { + if (entry.transport) PROVIDERS[entry.id] = buildTransport(entry.transport); + // models omitted (undefined) → provider has no model list key; [] is a valid explicit empty list + if (entry.models !== undefined) PROVIDER_MODELS[entry.alias] = entry.models; +} + +// TTS model/voice tables keyed by special names (openai-tts-models, ...), not provider ids +Object.assign(PROVIDER_MODELS, buildTtsProviderModels()); diff --git a/open-sse/providers/models/helpers.js b/open-sse/providers/models/helpers.js new file mode 100644 index 00000000..016a696a --- /dev/null +++ b/open-sse/providers/models/helpers.js @@ -0,0 +1,20 @@ +// Codex auto-generates a "-review" variant for each llm model (review quota family) +const CODEX_REVIEW_SUFFIX = "-review"; + +export function withCodexReviewModels(models) { + return models.flatMap((model) => { + if ((model.type || "llm") !== "llm" || model.id.endsWith(CODEX_REVIEW_SUFFIX)) { + return [model]; + } + return [ + model, + { + ...model, + id: `${model.id}${CODEX_REVIEW_SUFFIX}`, + name: `${model.name} Review`, + upstreamModelId: model.upstreamModelId || model.id, + quotaFamily: "review" + } + ]; + }); +} diff --git a/open-sse/providers/registry/agentrouter.js b/open-sse/providers/registry/agentrouter.js new file mode 100644 index 00000000..832fb364 --- /dev/null +++ b/open-sse/providers/registry/agentrouter.js @@ -0,0 +1,17 @@ +import { CLAUDE_CLI_SPOOF_HEADERS } from "../shared.js"; + +export default { + id: "agentrouter", + alias: "agentrouter", + transport: { + baseUrl: "https://agentrouter.org/v1/messages", + format: "claude", + headers: { ...CLAUDE_CLI_SPOOF_HEADERS } + }, + models: [ + { id: "claude-opus-4-6", name: "Claude 4.6 Opus" }, + { id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" }, + { id: "glm-5.1", name: "GLM 5.1" }, + { id: "deepseek-v3.2", name: "DeepSeek V3.2" } + ] +}; diff --git a/open-sse/providers/registry/ai21.js b/open-sse/providers/registry/ai21.js new file mode 100644 index 00000000..b3265bf3 --- /dev/null +++ b/open-sse/providers/registry/ai21.js @@ -0,0 +1,17 @@ +export default { + "id": "ai21", + "alias": "ai21", + "transport": { + "baseUrl": "https://api.ai21.com/studio/v1/chat/completions" + }, + "models": [ + { + "id": "jamba-large", + "name": "Jamba 1.5 Large" + }, + { + "id": "jamba-mini", + "name": "Jamba 1.5 Mini" + } + ] +}; diff --git a/open-sse/providers/registry/aimlapi.js b/open-sse/providers/registry/aimlapi.js new file mode 100644 index 00000000..0e57949e --- /dev/null +++ b/open-sse/providers/registry/aimlapi.js @@ -0,0 +1,29 @@ +export default { + "id": "aimlapi", + "alias": "aimlapi", + "transport": { + "baseUrl": "https://api.aimlapi.com/v1/chat/completions" + }, + "models": [ + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o Mini" + }, + { + "id": "claude-3-5-sonnet-20241022", + "name": "Claude 3.5 Sonnet" + }, + { + "id": "gemini-2.0-flash-exp", + "name": "Gemini 2.0 Flash" + }, + { + "id": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + "name": "Llama 3.1 70B" + } + ] +}; diff --git a/open-sse/providers/registry/alicode-intl.js b/open-sse/providers/registry/alicode-intl.js new file mode 100644 index 00000000..07336c36 --- /dev/null +++ b/open-sse/providers/registry/alicode-intl.js @@ -0,0 +1,38 @@ +export default { + "id": "alicode-intl", + "alias": "alicode-intl", + "transport": { + "baseUrl": "https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus" + }, + { + "id": "kimi-k2.5", + "name": "Kimi K2.5" + }, + { + "id": "glm-5", + "name": "GLM 5" + }, + { + "id": "MiniMax-M2.5", + "name": "MiniMax M2.5" + }, + { + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next" + }, + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus" + }, + { + "id": "glm-4.7", + "name": "GLM 4.7" + } + ] +}; diff --git a/open-sse/providers/registry/alicode.js b/open-sse/providers/registry/alicode.js new file mode 100644 index 00000000..0d5e0885 --- /dev/null +++ b/open-sse/providers/registry/alicode.js @@ -0,0 +1,42 @@ +export default { + "id": "alicode", + "alias": "alicode", + "transport": { + "baseUrl": "https://coding.dashscope.aliyuncs.com/v1/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "qwen3.5-plus", + "name": "Qwen3.5 Plus" + }, + { + "id": "kimi-k2.5", + "name": "Kimi K2.5" + }, + { + "id": "glm-5", + "name": "GLM 5" + }, + { + "id": "MiniMax-M2.5", + "name": "MiniMax M2.5" + }, + { + "id": "qwen3-max-2026-01-23", + "name": "Qwen3 Max" + }, + { + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next" + }, + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus" + }, + { + "id": "glm-4.7", + "name": "GLM 4.7" + } + ] +}; diff --git a/open-sse/providers/registry/anthropic.js b/open-sse/providers/registry/anthropic.js new file mode 100644 index 00000000..9897d72b --- /dev/null +++ b/open-sse/providers/registry/anthropic.js @@ -0,0 +1,16 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "anthropic", + alias: "anthropic", + transport: { + baseUrl: "https://api.anthropic.com/v1/messages", + format: "claude", + headers: { ...CLAUDE_API_HEADERS } + }, + models: [ + { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4" }, + { id: "claude-opus-4-20250514", name: "Claude Opus 4" }, + { id: "claude-3-5-sonnet-20241022", name: "Claude 3.5 Sonnet" } + ] +}; diff --git a/open-sse/providers/registry/antigravity.js b/open-sse/providers/registry/antigravity.js new file mode 100644 index 00000000..65f6083a --- /dev/null +++ b/open-sse/providers/registry/antigravity.js @@ -0,0 +1,27 @@ +import { platform, arch } from "os"; + +export default { + id: "antigravity", + alias: "ag", + transport: { + baseUrls: [ + "https://daily-cloudcode-pa.googleapis.com", + "https://daily-cloudcode-pa.sandbox.googleapis.com" + ], + format: "antigravity", + headers: { "User-Agent": `antigravity/1.107.0 ${platform()}/${arch()}` }, + clientId: "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com", + clientSecret: "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" + }, + models: [ + { id: "gemini-3-flash-agent", name: "Gemini 3.5 Flash (High)" }, + { id: "gemini-3.5-flash-low", name: "Gemini 3.5 Flash (Medium)" }, + { id: "gemini-3.5-flash-extra-low", name: "Gemini 3.5 Flash (Low)" }, + { id: "gemini-pro-agent", name: "Gemini 3.1 Pro (High)" }, + { id: "gemini-3.1-pro-low", name: "Gemini 3.1 Pro (Low)" }, + { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Thinking)" }, + { id: "claude-opus-4-6-thinking", name: "Claude Opus 4.6 (Thinking)" }, + { id: "gpt-oss-120b-medium", name: "GPT-OSS 120B (Medium)" }, + { id: "gemini-3-flash", name: "Gemini 3 Flash", thinking: false } + ] +}; diff --git a/open-sse/providers/registry/assemblyai.js b/open-sse/providers/registry/assemblyai.js new file mode 100644 index 00000000..c10e5e29 --- /dev/null +++ b/open-sse/providers/registry/assemblyai.js @@ -0,0 +1,25 @@ +export default { + "id": "assemblyai", + "alias": "assemblyai", + "transport": { + "baseUrl": "https://api.assemblyai.com/v1/audio/transcriptions" + }, + "models": [ + { + "id": "universal-3-pro", + "name": "Universal 3 Pro", + "type": "stt", + "params": [ + "language" + ] + }, + { + "id": "universal-2", + "name": "Universal 2", + "type": "stt", + "params": [ + "language" + ] + } + ] +}; diff --git a/open-sse/providers/registry/azure.js b/open-sse/providers/registry/azure.js new file mode 100644 index 00000000..6f594650 --- /dev/null +++ b/open-sse/providers/registry/azure.js @@ -0,0 +1,8 @@ +export default { + "id": "azure", + "alias": "azure", + "transport": { + "baseUrl": "", + "headers": {} + } +}; diff --git a/open-sse/providers/registry/baseten.js b/open-sse/providers/registry/baseten.js new file mode 100644 index 00000000..7b8d92bf --- /dev/null +++ b/open-sse/providers/registry/baseten.js @@ -0,0 +1,17 @@ +export default { + "id": "baseten", + "alias": "baseten", + "transport": { + "baseUrl": "https://inference.baseten.co/v1/chat/completions" + }, + "models": [ + { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1" + }, + { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B" + } + ] +}; diff --git a/open-sse/providers/registry/bazaarlink.js b/open-sse/providers/registry/bazaarlink.js new file mode 100644 index 00000000..0a6674ff --- /dev/null +++ b/open-sse/providers/registry/bazaarlink.js @@ -0,0 +1,17 @@ +export default { + "id": "bazaarlink", + "alias": "bazaarlink", + "transport": { + "baseUrl": "https://bazaarlink.ai/api/v1/chat/completions" + }, + "models": [ + { + "id": "auto:free", + "name": "Auto Free (Zero Cost)" + }, + { + "id": "auto", + "name": "Auto (Best Model)" + } + ] +}; diff --git a/open-sse/providers/registry/black-forest-labs.js b/open-sse/providers/registry/black-forest-labs.js new file mode 100644 index 00000000..b6762824 --- /dev/null +++ b/open-sse/providers/registry/black-forest-labs.js @@ -0,0 +1,64 @@ +export default { + "id": "black-forest-labs", + "alias": "black-forest-labs", + "transport": null, + "models": [ + { + "id": "flux-pro-1.1", + "name": "FLUX Pro 1.1", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "flux-pro-1.1-ultra", + "name": "FLUX Pro 1.1 Ultra", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "flux-pro", + "name": "FLUX Pro", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "flux-dev", + "name": "FLUX Dev", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "flux-kontext-pro", + "name": "FLUX Kontext Pro (Edit)", + "type": "image", + "params": [ + "size" + ], + "capabilities": [ + "edit" + ] + }, + { + "id": "flux-kontext-max", + "name": "FLUX Kontext Max (Edit)", + "type": "image", + "params": [ + "size" + ], + "capabilities": [ + "edit" + ] + } + ] +}; diff --git a/open-sse/providers/registry/blackbox.js b/open-sse/providers/registry/blackbox.js new file mode 100644 index 00000000..647a5fb3 --- /dev/null +++ b/open-sse/providers/registry/blackbox.js @@ -0,0 +1,77 @@ +export default { + "id": "blackbox", + "alias": "blackbox", + "transport": { + "baseUrl": "https://api.blackbox.ai/chat/completions" + }, + "models": [ + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o mini" + }, + { + "id": "claude-sonnet-4.6", + "name": "Claude Sonnet 4.6" + }, + { + "id": "claude-sonnet-4.5", + "name": "Claude Sonnet 4.5" + }, + { + "id": "claude-opus-4.6", + "name": "Claude Opus 4.6" + }, + { + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6 (Legacy)" + }, + { + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6 (Legacy)" + }, + { + "id": "deepseek-chat", + "name": "DeepSeek Chat" + }, + { + "id": "deepseek-v3-671b", + "name": "DeepSeek V3 671B" + }, + { + "id": "deepseek-r1", + "name": "DeepSeek R1" + }, + { + "id": "o1", + "name": "OpenAI o1" + }, + { + "id": "o3-mini", + "name": "OpenAI o3-mini" + }, + { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash" + }, + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview" + }, + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus" + }, + { + "id": "qwen3-max", + "name": "Qwen3 Max" + }, + { + "id": "qwen3-vl-plus", + "name": "Qwen3 VL Plus" + } + ] +}; diff --git a/open-sse/providers/registry/byteplus.js b/open-sse/providers/registry/byteplus.js new file mode 100644 index 00000000..798fc662 --- /dev/null +++ b/open-sse/providers/registry/byteplus.js @@ -0,0 +1,38 @@ +export default { + "id": "byteplus", + "alias": "byteplus", + "transport": { + "baseUrl": "https://ark.ap-southeast.bytepluses.com/api/coding/v3/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "seed-2-0-pro-260328", + "name": "Seed 2.0 Pro" + }, + { + "id": "seed-2-0-code-preview-260328", + "name": "Seed 2.0 Code Preview" + }, + { + "id": "seed-2-0-mini-260215", + "name": "Seed 2.0 Mini" + }, + { + "id": "seed-2-0-lite-260228", + "name": "Seed 2.0 Lite" + }, + { + "id": "kimi-k2-thinking-251104", + "name": "Kimi K2 Thinking" + }, + { + "id": "glm-4-7-251222", + "name": "GLM 4.7" + }, + { + "id": "gpt-oss-120b-250805", + "name": "GPT-OSS-120B" + } + ] +}; diff --git a/open-sse/providers/registry/bytez.js b/open-sse/providers/registry/bytez.js new file mode 100644 index 00000000..2a2037dc --- /dev/null +++ b/open-sse/providers/registry/bytez.js @@ -0,0 +1,21 @@ +export default { + "id": "bytez", + "alias": "bytez", + "transport": { + "baseUrl": "https://api.bytez.com/models/v2" + }, + "models": [ + { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B" + }, + { + "id": "mistralai/Mistral-7B-Instruct-v0.3", + "name": "Mistral 7B v0.3" + }, + { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B" + } + ] +}; diff --git a/open-sse/providers/registry/cerebras.js b/open-sse/providers/registry/cerebras.js new file mode 100644 index 00000000..7d496bec --- /dev/null +++ b/open-sse/providers/registry/cerebras.js @@ -0,0 +1,33 @@ +export default { + "id": "cerebras", + "alias": "cerebras", + "transport": { + "baseUrl": "https://api.cerebras.ai/v1/chat/completions" + }, + "models": [ + { + "id": "gpt-oss-120b", + "name": "GPT OSS 120B" + }, + { + "id": "zai-glm-4.7", + "name": "ZAI GLM 4.7" + }, + { + "id": "llama-3.3-70b", + "name": "Llama 3.3 70B" + }, + { + "id": "llama-4-scout-17b-16e-instruct", + "name": "Llama 4 Scout" + }, + { + "id": "qwen-3-235b-a22b-instruct-2507", + "name": "Qwen3 235B A22B" + }, + { + "id": "qwen-3-32b", + "name": "Qwen3 32B" + } + ] +}; diff --git a/open-sse/providers/registry/chutes.js b/open-sse/providers/registry/chutes.js new file mode 100644 index 00000000..a2f7934e --- /dev/null +++ b/open-sse/providers/registry/chutes.js @@ -0,0 +1,7 @@ +export default { + "id": "chutes", + "alias": "chutes", + "transport": { + "baseUrl": "https://llm.chutes.ai/v1/chat/completions" + } +}; diff --git a/open-sse/providers/registry/claude.js b/open-sse/providers/registry/claude.js new file mode 100644 index 00000000..e34c842a --- /dev/null +++ b/open-sse/providers/registry/claude.js @@ -0,0 +1,22 @@ +import { CLAUDE_CLI_SPOOF_HEADERS } from "../shared.js"; + +export default { + id: "claude", + alias: "cc", + transport: { + baseUrl: "https://api.anthropic.com/v1/messages", + format: "claude", + headers: { ...CLAUDE_CLI_SPOOF_HEADERS }, + clientId: "9d1c250a-e61b-44d9-88ed-5944d1962f5e", + tokenUrl: "https://api.anthropic.com/v1/oauth/token" + }, + models: [ + { id: "claude-opus-4-8", name: "Claude Opus 4.8" }, + { id: "claude-opus-4-7", name: "Claude Opus 4.7" }, + { id: "claude-opus-4-6", name: "Claude Opus 4.6" }, + { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, + { id: "claude-opus-4-5-20251101", name: "Claude 4.5 Opus" }, + { id: "claude-sonnet-4-5-20250929", name: "Claude 4.5 Sonnet" }, + { id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" } + ] +}; diff --git a/open-sse/providers/registry/cline.js b/open-sse/providers/registry/cline.js new file mode 100644 index 00000000..58b3f01c --- /dev/null +++ b/open-sse/providers/registry/cline.js @@ -0,0 +1,47 @@ +export default { + "id": "cline", + "alias": "cl", + "transport": { + "baseUrl": "https://api.cline.bot/api/v1/chat/completions", + "headers": { + "HTTP-Referer": "https://cline.bot", + "X-Title": "Cline" + }, + "tokenUrl": "https://api.cline.bot/api/v1/auth/token", + "refreshUrl": "https://api.cline.bot/api/v1/auth/refresh" + }, + "models": [ + { + "id": "anthropic/claude-opus-4.7", + "name": "Claude Opus 4.7" + }, + { + "id": "anthropic/claude-sonnet-4.6", + "name": "Claude Sonnet 4.6" + }, + { + "id": "anthropic/claude-opus-4.6", + "name": "Claude Opus 4.6" + }, + { + "id": "openai/gpt-5.3-codex", + "name": "GPT-5.3 Codex" + }, + { + "id": "openai/gpt-5.4", + "name": "GPT-5.4" + }, + { + "id": "google/gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview" + }, + { + "id": "google/gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview" + }, + { + "id": "kwaipilot/kat-coder-pro", + "name": "KAT Coder Pro" + } + ] +}; diff --git a/open-sse/providers/registry/cloudflare-ai.js b/open-sse/providers/registry/cloudflare-ai.js new file mode 100644 index 00000000..3fd3b267 --- /dev/null +++ b/open-sse/providers/registry/cloudflare-ai.js @@ -0,0 +1,156 @@ +export default { + "id": "cloudflare-ai", + "alias": "cloudflare-ai", + "transport": { + "baseUrl": "https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1/chat/completions" + }, + "models": [ + { + "id": "@cf/meta/llama-3.2-1b-instruct", + "name": "Llama 3.2 1B Instruct" + }, + { + "id": "@cf/meta/llama-3.2-3b-instruct", + "name": "Llama 3.2 3B Instruct" + }, + { + "id": "@cf/meta/llama-3.1-8b-instruct-fp8-fast", + "name": "Llama 3.1 8B Instruct FP8 Fast" + }, + { + "id": "@cf/meta/llama-3.1-8b-instruct-awq", + "name": "Llama 3.1 8B Instruct AWQ" + }, + { + "id": "@cf/mistralai/mistral-small-3.1-24b-instruct", + "name": "Mistral Small 3.1 24B Instruct" + }, + { + "id": "@cf/meta/llama-3.1-70b-instruct-fp8-fast", + "name": "Llama 3.1 70B Instruct FP8 Fast" + }, + { + "id": "@cf/meta/llama-3.3-70b-instruct-fp8-fast", + "name": "Llama 3.3 70B Instruct FP8 Fast" + }, + { + "id": "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", + "name": "DeepSeek R1 Distill Qwen 32B" + }, + { + "id": "@cf/moonshotai/kimi-k2.5", + "name": "Kimi K2.5" + }, + { + "id": "@cf/moonshotai/kimi-k2.6", + "name": "Kimi K2.6" + }, + { + "id": "@cf/zai-org/glm-4.7-flash", + "name": "GLM 4.7 Flash" + }, + { + "id": "@cf/qwen/qwq-32b", + "name": "QwQ 32B" + }, + { + "id": "@cf/qwen/qwen2.5-coder-32b-instruct", + "name": "Qwen 2.5 Coder 32B Instruct" + }, + { + "id": "@cf/black-forest-labs/flux-2-klein-9b", + "name": "FLUX.2 Klein 9B", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/black-forest-labs/flux-2-klein-4b", + "name": "FLUX.2 Klein 4B", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/black-forest-labs/flux-2-dev", + "name": "FLUX.2 Dev", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/leonardo/lucid-origin", + "name": "Lucid Origin", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/leonardo/phoenix-1.0", + "name": "Phoenix 1.0", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/black-forest-labs/flux-1-schnell", + "name": "FLUX.1 Schnell", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/bytedance/stable-diffusion-xl-lightning", + "name": "SDXL Lightning", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/lykon/dreamshaper-8-lcm", + "name": "DreamShaper 8 LCM", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "@cf/runwayml/stable-diffusion-v1-5-img2img", + "name": "Stable Diffusion v1.5 Img2Img", + "type": "image", + "params": [ + "size" + ], + "capabilities": [ + "edit" + ] + }, + { + "id": "@cf/runwayml/stable-diffusion-v1-5-inpainting", + "name": "Stable Diffusion v1.5 Inpainting", + "type": "image", + "params": [ + "size" + ], + "capabilities": [ + "edit", + "mask" + ] + }, + { + "id": "@cf/stabilityai/stable-diffusion-xl-base-1.0", + "name": "SDXL Base 1.0", + "type": "image", + "params": [ + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/codebuddy.js b/open-sse/providers/registry/codebuddy.js new file mode 100644 index 00000000..d63432d3 --- /dev/null +++ b/open-sse/providers/registry/codebuddy.js @@ -0,0 +1,7 @@ +export default { + "id": "codebuddy", + "alias": "codebuddy", + "transport": { + "baseUrl": "https://copilot.tencent.com/v1/chat/completions" + } +}; diff --git a/open-sse/providers/registry/codex.js b/open-sse/providers/registry/codex.js new file mode 100644 index 00000000..bbad11a5 --- /dev/null +++ b/open-sse/providers/registry/codex.js @@ -0,0 +1,30 @@ +import { withCodexReviewModels } from "../models/helpers.js"; + +export default { + id: "codex", + alias: "cx", + transport: { + baseUrl: "https://chatgpt.com/backend-api/codex/responses", + format: "openai-responses", + headers: { + "originator": "codex_cli_rs", + "User-Agent": "codex_cli_rs/0.136.0" + }, + clientId: "app_EMoamEEZ73f0CkXaXp7hrann", + tokenUrl: "https://auth.openai.com/oauth/token" + }, + models: withCodexReviewModels([ + { id: "gpt-5.5", name: "GPT 5.5" }, + { id: "gpt-5.4", name: "GPT 5.4" }, + { id: "gpt-5.4-mini", name: "GPT 5.4 Mini" }, + { id: "gpt-5.3-codex", name: "GPT 5.3 Codex" }, + { id: "gpt-5.3-codex-xhigh", name: "GPT 5.3 Codex (xHigh)" }, + { id: "gpt-5.3-codex-high", name: "GPT 5.3 Codex (High)" }, + { id: "gpt-5.3-codex-low", name: "GPT 5.3 Codex (Low)" }, + { id: "gpt-5.3-codex-none", name: "GPT 5.3 Codex (None)" }, + { id: "gpt-5.3-codex-spark", name: "GPT 5.3 Codex Spark" }, + { id: "gpt-5.5-image", name: "GPT 5.5 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] }, + { id: "gpt-5.4-image", name: "GPT 5.4 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] }, + { id: "gpt-5.3-image", name: "GPT 5.3 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] } + ]) +}; diff --git a/open-sse/providers/registry/cohere.js b/open-sse/providers/registry/cohere.js new file mode 100644 index 00000000..e2315c70 --- /dev/null +++ b/open-sse/providers/registry/cohere.js @@ -0,0 +1,21 @@ +export default { + "id": "cohere", + "alias": "cohere", + "transport": { + "baseUrl": "https://api.cohere.ai/v1/chat/completions" + }, + "models": [ + { + "id": "command-r-plus-08-2024", + "name": "Command R+ (Aug 2024)" + }, + { + "id": "command-r-08-2024", + "name": "Command R (Aug 2024)" + }, + { + "id": "command-a-03-2025", + "name": "Command A (Mar 2025)" + } + ] +}; diff --git a/open-sse/providers/registry/comfyui.js b/open-sse/providers/registry/comfyui.js new file mode 100644 index 00000000..5549710c --- /dev/null +++ b/open-sse/providers/registry/comfyui.js @@ -0,0 +1,25 @@ +export default { + "id": "comfyui", + "alias": "comfyui", + "transport": null, + "models": [ + { + "id": "flux-dev", + "name": "FLUX Dev", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "sdxl", + "name": "SDXL", + "type": "image", + "params": [ + "n", + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/commandcode.js b/open-sse/providers/registry/commandcode.js new file mode 100644 index 00000000..cd30088c --- /dev/null +++ b/open-sse/providers/registry/commandcode.js @@ -0,0 +1,58 @@ +export default { + "id": "commandcode", + "alias": "commandcode", + "transport": { + "baseUrl": "https://api.commandcode.ai/alpha/generate", + "format": "commandcode", + "headers": { + "x-command-code-version": "0.25.7", + "x-cli-environment": "cli" + } + }, + "models": [ + { + "id": "deepseek/deepseek-v4-pro", + "name": "DeepSeek V4 Pro" + }, + { + "id": "deepseek/deepseek-v4-flash", + "name": "DeepSeek V4 Flash" + }, + { + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6" + }, + { + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5" + }, + { + "id": "zai-org/GLM-5.1", + "name": "GLM 5.1" + }, + { + "id": "zai-org/GLM-5", + "name": "GLM 5" + }, + { + "id": "MiniMaxAI/MiniMax-M2.7", + "name": "MiniMax M2.7" + }, + { + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax M2.5" + }, + { + "id": "Qwen/Qwen3.6-Max-Preview", + "name": "Qwen 3.6 Max Preview" + }, + { + "id": "Qwen/Qwen3.6-Plus", + "name": "Qwen 3.6 Plus" + }, + { + "id": "stepfun/Step-3.5-Flash", + "name": "Step 3.5 Flash" + } + ] +}; diff --git a/open-sse/providers/registry/completions.js b/open-sse/providers/registry/completions.js new file mode 100644 index 00000000..2b191e6e --- /dev/null +++ b/open-sse/providers/registry/completions.js @@ -0,0 +1,25 @@ +export default { + "id": "completions", + "alias": "completions", + "transport": { + "baseUrl": "https://completions.me/api/v1/chat/completions" + }, + "models": [ + { + "id": "claude-opus-4", + "name": "Claude Opus 4" + }, + { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4" + }, + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash" + } + ] +}; diff --git a/open-sse/providers/registry/cursor.js b/open-sse/providers/registry/cursor.js new file mode 100644 index 00000000..963b44d7 --- /dev/null +++ b/open-sse/providers/registry/cursor.js @@ -0,0 +1,74 @@ +export default { + "id": "cursor", + "alias": "cu", + "transport": { + "baseUrl": "https://api2.cursor.sh", + "chatPath": "/aiserver.v1.ChatService/StreamUnifiedChatWithTools", + "format": "cursor", + "headers": { + "connect-accept-encoding": "gzip", + "connect-protocol-version": "1", + "Content-Type": "application/connect+proto", + "User-Agent": "connect-es/1.6.1" + }, + "clientVersion": "3.1.0" + }, + "models": [ + { + "id": "default", + "name": "Auto (Server Picks)" + }, + { + "id": "claude-4.5-opus-high-thinking", + "name": "Claude 4.5 Opus High Thinking" + }, + { + "id": "claude-4.5-opus-high", + "name": "Claude 4.5 Opus High" + }, + { + "id": "claude-4.5-sonnet-thinking", + "name": "Claude 4.5 Sonnet Thinking" + }, + { + "id": "claude-4.5-sonnet", + "name": "Claude 4.5 Sonnet" + }, + { + "id": "claude-4.5-haiku", + "name": "Claude 4.5 Haiku" + }, + { + "id": "claude-4.5-opus", + "name": "Claude 4.5 Opus" + }, + { + "id": "gpt-5.2-codex", + "name": "GPT 5.2 Codex" + }, + { + "id": "claude-4.6-opus-max", + "name": "Claude 4.6 Opus Max" + }, + { + "id": "claude-4.6-sonnet-medium-thinking", + "name": "Claude 4.6 Sonnet Medium Thinking" + }, + { + "id": "kimi-k2.5", + "name": "Kimi K2.5" + }, + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview" + }, + { + "id": "gpt-5.2", + "name": "GPT 5.2" + }, + { + "id": "gpt-5.3-codex", + "name": "GPT 5.3 Codex" + } + ] +}; diff --git a/open-sse/providers/registry/deepgram.js b/open-sse/providers/registry/deepgram.js new file mode 100644 index 00000000..8b3717f3 --- /dev/null +++ b/open-sse/providers/registry/deepgram.js @@ -0,0 +1,33 @@ +export default { + "id": "deepgram", + "alias": "deepgram", + "transport": { + "baseUrl": "https://api.deepgram.com/v1/listen" + }, + "models": [ + { + "id": "nova-3", + "name": "Nova 3", + "type": "stt", + "params": [ + "language" + ] + }, + { + "id": "nova-2", + "name": "Nova 2", + "type": "stt", + "params": [ + "language" + ] + }, + { + "id": "whisper-large", + "name": "Whisper Large", + "type": "stt", + "params": [ + "language" + ] + } + ] +}; diff --git a/open-sse/providers/registry/deepinfra.js b/open-sse/providers/registry/deepinfra.js new file mode 100644 index 00000000..b8c2b367 --- /dev/null +++ b/open-sse/providers/registry/deepinfra.js @@ -0,0 +1,21 @@ +export default { + "id": "deepinfra", + "alias": "deepinfra", + "transport": { + "baseUrl": "https://api.deepinfra.com/v1/openai/chat/completions" + }, + "models": [ + { + "id": "meta-llama/Meta-Llama-3.1-70B-Instruct", + "name": "Llama 3.1 70B" + }, + { + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek V3" + }, + { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B" + } + ] +}; diff --git a/open-sse/providers/registry/deepseek.js b/open-sse/providers/registry/deepseek.js new file mode 100644 index 00000000..be0e5f4b --- /dev/null +++ b/open-sse/providers/registry/deepseek.js @@ -0,0 +1,35 @@ +export default { + "id": "deepseek", + "alias": "deepseek", + "transport": { + "baseUrl": "https://api.deepseek.com/chat/completions" + }, + "models": [ + { + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro" + }, + { + "id": "deepseek-v4-pro-max", + "name": "DeepSeek V4 Pro Max", + "upstreamModelId": "deepseek-v4-pro" + }, + { + "id": "deepseek-v4-pro-none", + "name": "DeepSeek V4 Pro No Thinking", + "upstreamModelId": "deepseek-v4-pro" + }, + { + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash" + }, + { + "id": "deepseek-chat", + "name": "DeepSeek V3.2 Chat" + }, + { + "id": "deepseek-reasoner", + "name": "DeepSeek V3.2 Reasoner" + } + ] +}; diff --git a/open-sse/providers/registry/enally.js b/open-sse/providers/registry/enally.js new file mode 100644 index 00000000..82496c1b --- /dev/null +++ b/open-sse/providers/registry/enally.js @@ -0,0 +1,22 @@ +export default { + "id": "enally", + "alias": "enally", + "transport": { + "baseUrl": "https://ai.enally.in/v1/chat/completions", + "authHeader": "x-api-key" + }, + "models": [ + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o Mini" + }, + { + "id": "claude-3-5-sonnet", + "name": "Claude 3.5 Sonnet" + } + ] +}; diff --git a/open-sse/providers/registry/fal-ai.js b/open-sse/providers/registry/fal-ai.js new file mode 100644 index 00000000..9028c183 --- /dev/null +++ b/open-sse/providers/registry/fal-ai.js @@ -0,0 +1,72 @@ +export default { + "id": "fal-ai", + "alias": "fal-ai", + "transport": null, + "models": [ + { + "id": "fal-ai/flux/schnell", + "name": "FLUX Schnell", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "fal-ai/flux/dev", + "name": "FLUX Dev", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "fal-ai/flux-pro/v1.1", + "name": "FLUX Pro v1.1", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "fal-ai/flux-pro/v1.1-ultra", + "name": "FLUX Pro v1.1 Ultra", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "fal-ai/recraft-v3", + "name": "Recraft V3", + "type": "image", + "params": [ + "n", + "size", + "style" + ] + }, + { + "id": "fal-ai/ideogram/v2", + "name": "Ideogram V2", + "type": "image", + "params": [ + "n", + "size", + "style" + ] + }, + { + "id": "fal-ai/stable-diffusion-v35-large", + "name": "SD 3.5 Large", + "type": "image", + "params": [ + "n", + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/fireworks.js b/open-sse/providers/registry/fireworks.js new file mode 100644 index 00000000..74372615 --- /dev/null +++ b/open-sse/providers/registry/fireworks.js @@ -0,0 +1,26 @@ +export default { + "id": "fireworks", + "alias": "fireworks", + "transport": { + "baseUrl": "https://api.fireworks.ai/inference/v1/chat/completions" + }, + "models": [ + { + "id": "accounts/fireworks/models/deepseek-v3p1", + "name": "DeepSeek V3.1" + }, + { + "id": "accounts/fireworks/models/llama-v3p3-70b-instruct", + "name": "Llama 3.3 70B" + }, + { + "id": "accounts/fireworks/models/qwen3-235b-a22b", + "name": "Qwen3 235B" + }, + { + "id": "nomic-ai/nomic-embed-text-v1.5", + "name": "Nomic Embed Text v1.5", + "type": "embedding" + } + ] +}; diff --git a/open-sse/providers/registry/freetheai.js b/open-sse/providers/registry/freetheai.js new file mode 100644 index 00000000..2f447f70 --- /dev/null +++ b/open-sse/providers/registry/freetheai.js @@ -0,0 +1,25 @@ +export default { + "id": "freetheai", + "alias": "freetheai", + "transport": { + "baseUrl": "https://api.freetheai.xyz/v1/chat/completions" + }, + "models": [ + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "claude-3-5-sonnet", + "name": "Claude 3.5 Sonnet" + }, + { + "id": "gemini-1.5-pro", + "name": "Gemini 1.5 Pro" + }, + { + "id": "deepseek-chat", + "name": "DeepSeek Chat" + } + ] +}; diff --git a/open-sse/providers/registry/gemini-cli.js b/open-sse/providers/registry/gemini-cli.js new file mode 100644 index 00000000..df1269c4 --- /dev/null +++ b/open-sse/providers/registry/gemini-cli.js @@ -0,0 +1,20 @@ +export default { + "id": "gemini-cli", + "alias": "gc", + "transport": { + "baseUrl": "https://cloudcode-pa.googleapis.com/v1internal", + "format": "gemini-cli", + "clientId": "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com", + "clientSecret": "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" + }, + "models": [ + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview" + }, + { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro Preview" + } + ] +}; diff --git a/open-sse/providers/registry/gemini.js b/open-sse/providers/registry/gemini.js new file mode 100644 index 00000000..be3fbbb4 --- /dev/null +++ b/open-sse/providers/registry/gemini.js @@ -0,0 +1,122 @@ +export default { + "id": "gemini", + "alias": "gemini", + "transport": { + "baseUrl": "https://generativelanguage.googleapis.com/v1beta/models", + "format": "gemini", + "clientId": "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com", + "clientSecret": "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" + }, + "models": [ + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview" + }, + { + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview" + }, + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview" + }, + { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro" + }, + { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash" + }, + { + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite" + }, + { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash" + }, + { + "id": "gemini-2.0-flash-lite", + "name": "Gemini 2.0 Flash Lite" + }, + { + "id": "gemma-4-31b-it", + "name": "Gemma 4 31B IT" + }, + { + "id": "gemini-embedding-2-preview", + "name": "Gemini Embedding 2 Preview", + "type": "embedding" + }, + { + "id": "gemini-embedding-001", + "name": "Gemini Embedding 001", + "type": "embedding" + }, + { + "id": "text-embedding-005", + "name": "Text Embedding 005", + "type": "embedding" + }, + { + "id": "text-embedding-004", + "name": "Text Embedding 004 (Legacy)", + "type": "embedding" + }, + { + "id": "gemini-3.1-flash-image-preview", + "name": "Gemini 3.1 Flash Image (Nano Banana 2)", + "type": "image", + "params": [] + }, + { + "id": "gemini-3-pro-image-preview", + "name": "Gemini 3 Pro Image (Nano Banana Pro)", + "type": "image", + "params": [] + }, + { + "id": "gemini-2.5-flash-image", + "name": "Gemini 2.5 Flash Image (Nano Banana)", + "type": "image", + "params": [] + }, + { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro (Best)", + "type": "stt", + "params": [ + "language", + "prompt" + ] + }, + { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash", + "type": "stt", + "params": [ + "language", + "prompt" + ] + }, + { + "id": "gemini-2.5-flash-lite", + "name": "Gemini 2.5 Flash Lite (Cheapest)", + "type": "stt", + "params": [ + "language", + "prompt" + ] + }, + { + "id": "gemini-2.0-flash", + "name": "Gemini 2.0 Flash", + "type": "stt", + "params": [ + "language", + "prompt" + ] + } + ] +}; diff --git a/open-sse/providers/registry/github.js b/open-sse/providers/registry/github.js new file mode 100644 index 00000000..014bf857 --- /dev/null +++ b/open-sse/providers/registry/github.js @@ -0,0 +1,129 @@ +export default { + "id": "github", + "alias": "gh", + "transport": { + "baseUrl": "https://api.githubcopilot.com/chat/completions", + "responsesUrl": "https://api.githubcopilot.com/responses", + "headers": { + "copilot-integration-id": "vscode-chat", + "editor-version": "vscode/1.110.0", + "editor-plugin-version": "copilot-chat/0.38.0", + "user-agent": "GitHubCopilotChat/0.38.0", + "openai-intent": "conversation-panel", + "x-github-api-version": "2025-04-01", + "x-vscode-user-agent-library-version": "electron-fetch", + "X-Initiator": "user", + "Accept": "application/json", + "Content-Type": "application/json" + }, + "clientId": "Iv1.b507a08c87ecfe98" + }, + "models": [ + { + "id": "gpt-3.5-turbo", + "name": "GPT-3.5 Turbo" + }, + { + "id": "gpt-4", + "name": "GPT-4" + }, + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o mini" + }, + { + "id": "gpt-4.1", + "name": "GPT-4.1" + }, + { + "id": "gpt-5-mini", + "name": "GPT-5 Mini" + }, + { + "id": "gpt-5.2", + "name": "GPT-5.2" + }, + { + "id": "gpt-5.2-codex", + "name": "GPT-5.2 Codex" + }, + { + "id": "gpt-5.3-codex", + "name": "GPT-5.3 Codex" + }, + { + "id": "gpt-5.4", + "name": "GPT-5.4" + }, + { + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini" + }, + { + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5" + }, + { + "id": "claude-opus-4.5", + "name": "Claude Opus 4.5" + }, + { + "id": "claude-sonnet-4", + "name": "Claude Sonnet 4" + }, + { + "id": "claude-sonnet-4.5", + "name": "Claude Sonnet 4.5" + }, + { + "id": "claude-sonnet-4.6", + "name": "Claude Sonnet 4.6" + }, + { + "id": "claude-opus-4.6", + "name": "Claude Opus 4.6" + }, + { + "id": "claude-opus-4.7", + "name": "Claude Opus 4.7" + }, + { + "id": "gemini-2.5-pro", + "name": "Gemini 2.5 Pro" + }, + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash" + }, + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro" + }, + { + "id": "grok-code-fast-1", + "name": "Grok Code Fast 1" + }, + { + "id": "oswe-vscode-prime", + "name": "Raptor Mini" + }, + { + "id": "goldeneye-free-auto", + "name": "GoldenEye" + }, + { + "id": "text-embedding-3-small", + "name": "Text Embedding 3 Small (GitHub)", + "type": "embedding" + }, + { + "id": "text-embedding-3-large", + "name": "Text Embedding 3 Large (GitHub)", + "type": "embedding" + } + ] +}; diff --git a/open-sse/providers/registry/gitlab.js b/open-sse/providers/registry/gitlab.js new file mode 100644 index 00000000..3a4aa938 --- /dev/null +++ b/open-sse/providers/registry/gitlab.js @@ -0,0 +1,7 @@ +export default { + "id": "gitlab", + "alias": "gitlab", + "transport": { + "baseUrl": "https://gitlab.com/api/v4/chat/completions" + } +}; diff --git a/open-sse/providers/registry/glhf.js b/open-sse/providers/registry/glhf.js new file mode 100644 index 00000000..47177d6a --- /dev/null +++ b/open-sse/providers/registry/glhf.js @@ -0,0 +1,21 @@ +export default { + "id": "glhf", + "alias": "glhf", + "transport": { + "baseUrl": "https://glhf.chat/api/openai/v1/chat/completions" + }, + "models": [ + { + "id": "hf:meta-llama/Meta-Llama-3.1-405B-Instruct", + "name": "Llama 3.1 405B" + }, + { + "id": "hf:meta-llama/Meta-Llama-3.1-70B-Instruct", + "name": "Llama 3.1 70B" + }, + { + "id": "hf:Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B" + } + ] +}; diff --git a/open-sse/providers/registry/glm-cn.js b/open-sse/providers/registry/glm-cn.js new file mode 100644 index 00000000..4bff5498 --- /dev/null +++ b/open-sse/providers/registry/glm-cn.js @@ -0,0 +1,30 @@ +export default { + "id": "glm-cn", + "alias": "glm-cn", + "transport": { + "baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "glm-5.1", + "name": "GLM 5.1" + }, + { + "id": "glm-5", + "name": "GLM 5" + }, + { + "id": "glm-4.7", + "name": "GLM-4.7" + }, + { + "id": "glm-4.6", + "name": "GLM-4.6" + }, + { + "id": "glm-4.5-air", + "name": "GLM-4.5-Air" + } + ] +}; diff --git a/open-sse/providers/registry/glm.js b/open-sse/providers/registry/glm.js new file mode 100644 index 00000000..88cea5e2 --- /dev/null +++ b/open-sse/providers/registry/glm.js @@ -0,0 +1,17 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "glm", + alias: "glm", + transport: { + baseUrl: "https://api.z.ai/api/anthropic/v1/messages", + format: "claude", + headers: { ...CLAUDE_API_HEADERS } + }, + models: [ + { id: "glm-5.1", name: "GLM 5.1" }, + { id: "glm-5", name: "GLM 5" }, + { id: "glm-4.7", name: "GLM 4.7" }, + { id: "glm-4.6v", name: "GLM 4.6V (Vision)" } + ] +}; diff --git a/open-sse/providers/registry/grok-web.js b/open-sse/providers/registry/grok-web.js new file mode 100644 index 00000000..53539782 --- /dev/null +++ b/open-sse/providers/registry/grok-web.js @@ -0,0 +1,59 @@ +export default { + "id": "grok-web", + "alias": "grok-web", + "transport": { + "baseUrl": "https://grok.com/rest/app-chat/conversations/new", + "format": "grok-web", + "authType": "cookie" + }, + "models": [ + { + "id": "grok-3", + "name": "Grok 3" + }, + { + "id": "grok-3-mini", + "name": "Grok 3 Mini (Thinking)" + }, + { + "id": "grok-3-thinking", + "name": "Grok 3 Thinking" + }, + { + "id": "grok-4", + "name": "Grok 4" + }, + { + "id": "grok-4-mini", + "name": "Grok 4 Mini (Thinking)" + }, + { + "id": "grok-4-thinking", + "name": "Grok 4 Thinking" + }, + { + "id": "grok-4-heavy", + "name": "Grok 4 Heavy (SuperGrok)" + }, + { + "id": "grok-4.1-mini", + "name": "Grok 4.1 Mini (Thinking)" + }, + { + "id": "grok-4.1-fast", + "name": "Grok 4.1 Fast" + }, + { + "id": "grok-4.1-expert", + "name": "Grok 4.1 Expert" + }, + { + "id": "grok-4.1-thinking", + "name": "Grok 4.1 Thinking" + }, + { + "id": "grok-4.2", + "name": "Grok 4.2 (4.20 Beta)" + } + ] +}; diff --git a/open-sse/providers/registry/groq.js b/open-sse/providers/registry/groq.js new file mode 100644 index 00000000..cb12b4bb --- /dev/null +++ b/open-sse/providers/registry/groq.js @@ -0,0 +1,58 @@ +export default { + "id": "groq", + "alias": "groq", + "transport": { + "baseUrl": "https://api.groq.com/openai/v1/chat/completions" + }, + "models": [ + { + "id": "llama-3.3-70b-versatile", + "name": "Llama 3.3 70B" + }, + { + "id": "meta-llama/llama-4-maverick-17b-128e-instruct", + "name": "Llama 4 Maverick" + }, + { + "id": "qwen/qwen3-32b", + "name": "Qwen3 32B" + }, + { + "id": "openai/gpt-oss-120b", + "name": "GPT-OSS 120B" + }, + { + "id": "whisper-large-v3", + "name": "Whisper Large v3", + "type": "stt", + "params": [ + "language", + "response_format", + "temperature", + "prompt" + ] + }, + { + "id": "whisper-large-v3-turbo", + "name": "Whisper Large v3 Turbo", + "type": "stt", + "params": [ + "language", + "response_format", + "temperature", + "prompt" + ] + }, + { + "id": "distil-whisper-large-v3-en", + "name": "Distil Whisper Large v3 EN", + "type": "stt", + "params": [ + "language", + "response_format", + "temperature", + "prompt" + ] + } + ] +}; diff --git a/open-sse/providers/registry/huggingface.js b/open-sse/providers/registry/huggingface.js new file mode 100644 index 00000000..7ffb858f --- /dev/null +++ b/open-sse/providers/registry/huggingface.js @@ -0,0 +1,35 @@ +export default { + "id": "huggingface", + "alias": "huggingface", + "transport": null, + "models": [ + { + "id": "black-forest-labs/FLUX.1-schnell", + "name": "FLUX.1 Schnell", + "type": "image", + "params": [] + }, + { + "id": "stabilityai/stable-diffusion-xl-base-1.0", + "name": "SDXL Base 1.0", + "type": "image", + "params": [] + }, + { + "id": "openai/whisper-large-v3", + "name": "Whisper Large v3 (HF)", + "type": "stt", + "params": [ + "language" + ] + }, + { + "id": "openai/whisper-small", + "name": "Whisper Small (HF)", + "type": "stt", + "params": [ + "language" + ] + } + ] +}; diff --git a/open-sse/providers/registry/hyperbolic.js b/open-sse/providers/registry/hyperbolic.js new file mode 100644 index 00000000..010a93f1 --- /dev/null +++ b/open-sse/providers/registry/hyperbolic.js @@ -0,0 +1,41 @@ +export default { + "id": "hyperbolic", + "alias": "hyperbolic", + "transport": { + "baseUrl": "https://api.hyperbolic.xyz/v1/chat/completions" + }, + "models": [ + { + "id": "Qwen/QwQ-32B", + "name": "QwQ 32B" + }, + { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1" + }, + { + "id": "deepseek-ai/DeepSeek-V3", + "name": "DeepSeek V3" + }, + { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B" + }, + { + "id": "meta-llama/Llama-3.2-3B-Instruct", + "name": "Llama 3.2 3B" + }, + { + "id": "Qwen/Qwen2.5-72B-Instruct", + "name": "Qwen 2.5 72B" + }, + { + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen 2.5 Coder 32B" + }, + { + "id": "NousResearch/Hermes-3-Llama-3.1-70B", + "name": "Hermes 3 70B" + } + ] +}; diff --git a/open-sse/providers/registry/iflow.js b/open-sse/providers/registry/iflow.js new file mode 100644 index 00000000..033f07bd --- /dev/null +++ b/open-sse/providers/registry/iflow.js @@ -0,0 +1,76 @@ +export default { + "id": "iflow", + "alias": "if", + "transport": { + "baseUrl": "https://apis.iflow.cn/v1/chat/completions", + "headers": { + "User-Agent": "iFlow-Cli" + }, + "clientId": "10009311001", + "clientSecret": "4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW", + "tokenUrl": "https://iflow.cn/oauth/token", + "authUrl": "https://iflow.cn/oauth" + }, + "models": [ + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus" + }, + { + "id": "qwen3-max", + "name": "Qwen3 Max" + }, + { + "id": "qwen3-vl-plus", + "name": "Qwen3 VL Plus" + }, + { + "id": "qwen3-max-preview", + "name": "Qwen3 Max Preview" + }, + { + "id": "qwen3-235b", + "name": "Qwen3 235B A22B" + }, + { + "id": "qwen3-235b-a22b-instruct", + "name": "Qwen3 235B A22B Instruct" + }, + { + "id": "qwen3-235b-a22b-thinking-2507", + "name": "Qwen3 235B A22B Thinking" + }, + { + "id": "qwen3-32b", + "name": "Qwen3 32B" + }, + { + "id": "kimi-k2", + "name": "Kimi K2" + }, + { + "id": "deepseek-v3.2", + "name": "DeepSeek V3.2 Exp" + }, + { + "id": "deepseek-v3.1", + "name": "DeepSeek V3.1 Terminus" + }, + { + "id": "deepseek-v3", + "name": "DeepSeek V3 671B" + }, + { + "id": "deepseek-r1", + "name": "DeepSeek R1" + }, + { + "id": "glm-4.7", + "name": "GLM 4.7" + }, + { + "id": "iflow-rome-30ba3b", + "name": "iFlow ROME" + } + ] +}; diff --git a/open-sse/providers/registry/index.js b/open-sse/providers/registry/index.js new file mode 100644 index 00000000..ed0c76d9 --- /dev/null +++ b/open-sse/providers/registry/index.js @@ -0,0 +1,204 @@ +// Auto-generated: static imports of all registry entries +import p0 from './agentrouter.js'; +import p1 from './ai21.js'; +import p2 from './aimlapi.js'; +import p3 from './alicode-intl.js'; +import p4 from './alicode.js'; +import p5 from './anthropic.js'; +import p6 from './antigravity.js'; +import p7 from './assemblyai.js'; +import p8 from './azure.js'; +import p9 from './baseten.js'; +import p10 from './bazaarlink.js'; +import p11 from './black-forest-labs.js'; +import p12 from './blackbox.js'; +import p13 from './byteplus.js'; +import p14 from './bytez.js'; +import p15 from './cerebras.js'; +import p16 from './chutes.js'; +import p17 from './claude.js'; +import p18 from './cline.js'; +import p19 from './cloudflare-ai.js'; +import p20 from './codebuddy.js'; +import p21 from './codex.js'; +import p22 from './cohere.js'; +import p23 from './comfyui.js'; +import p24 from './commandcode.js'; +import p25 from './completions.js'; +import p26 from './cursor.js'; +import p27 from './deepgram.js'; +import p28 from './deepinfra.js'; +import p29 from './deepseek.js'; +import p30 from './enally.js'; +import p31 from './fal-ai.js'; +import p32 from './fireworks.js'; +import p33 from './freetheai.js'; +import p34 from './gemini-cli.js'; +import p35 from './gemini.js'; +import p36 from './github.js'; +import p37 from './gitlab.js'; +import p38 from './glhf.js'; +import p39 from './glm-cn.js'; +import p40 from './glm.js'; +import p41 from './grok-web.js'; +import p42 from './groq.js'; +import p43 from './huggingface.js'; +import p44 from './hyperbolic.js'; +import p45 from './iflow.js'; +import p46 from './inference-net.js'; +import p47 from './kilocode.js'; +import p48 from './kimi-coding.js'; +import p49 from './kimi.js'; +import p50 from './kiro.js'; +import p51 from './kluster.js'; +import p52 from './lepton.js'; +import p53 from './llm7.js'; +import p54 from './longcat.js'; +import p55 from './mimo-free.js'; +import p56 from './minimax-cn.js'; +import p57 from './minimax.js'; +import p58 from './mistral.js'; +import p59 from './mmf.js'; +import p60 from './modal.js'; +import p61 from './morph.js'; +import p62 from './nanobanana.js'; +import p63 from './nebius.js'; +import p64 from './nlpcloud.js'; +import p65 from './nous-research.js'; +import p66 from './novita.js'; +import p67 from './nscale.js'; +import p68 from './nvidia.js'; +import p69 from './ollama-local.js'; +import p70 from './ollama.js'; +import p71 from './openai.js'; +import p72 from './opencode-go.js'; +import p73 from './opencode.js'; +import p74 from './openrouter.js'; +import p75 from './perplexity-web.js'; +import p76 from './perplexity.js'; +import p77 from './predibase.js'; +import p78 from './publicai.js'; +import p79 from './puter.js'; +import p80 from './qoder.js'; +import p81 from './qwen.js'; +import p82 from './recraft.js'; +import p83 from './reka.js'; +import p84 from './runwayml.js'; +import p85 from './sambanova.js'; +import p86 from './scaleway.js'; +import p87 from './sdwebui.js'; +import p88 from './siliconflow.js'; +import p89 from './stability-ai.js'; +import p90 from './together.js'; +import p91 from './uncloseai.js'; +import p92 from './vercel-ai-gateway.js'; +import p93 from './vertex-partner.js'; +import p94 from './vertex.js'; +import p95 from './volcengine-ark.js'; +import p96 from './voyage-ai.js'; +import p97 from './xai.js'; +import p98 from './xiaomi-mimo.js'; +import p99 from './xiaomi-tokenplan.js'; + +export default [ + p0, + p1, + p2, + p3, + p4, + p5, + p6, + p7, + p8, + p9, + p10, + p11, + p12, + p13, + p14, + p15, + p16, + p17, + p18, + p19, + p20, + p21, + p22, + p23, + p24, + p25, + p26, + p27, + p28, + p29, + p30, + p31, + p32, + p33, + p34, + p35, + p36, + p37, + p38, + p39, + p40, + p41, + p42, + p43, + p44, + p45, + p46, + p47, + p48, + p49, + p50, + p51, + p52, + p53, + p54, + p55, + p56, + p57, + p58, + p59, + p60, + p61, + p62, + p63, + p64, + p65, + p66, + p67, + p68, + p69, + p70, + p71, + p72, + p73, + p74, + p75, + p76, + p77, + p78, + p79, + p80, + p81, + p82, + p83, + p84, + p85, + p86, + p87, + p88, + p89, + p90, + p91, + p92, + p93, + p94, + p95, + p96, + p97, + p98, + p99 +]; diff --git a/open-sse/providers/registry/inference-net.js b/open-sse/providers/registry/inference-net.js new file mode 100644 index 00000000..0b79ecd1 --- /dev/null +++ b/open-sse/providers/registry/inference-net.js @@ -0,0 +1,21 @@ +export default { + "id": "inference-net", + "alias": "inference-net", + "transport": { + "baseUrl": "https://api.inference.net/v1/chat/completions" + }, + "models": [ + { + "id": "meta-llama/llama-3.3-70b-instruct/fp-16", + "name": "Llama 3.3 70B" + }, + { + "id": "deepseek/deepseek-v3-0324", + "name": "DeepSeek V3" + }, + { + "id": "mistralai/mistral-nemo-12b-instruct/fp-16", + "name": "Mistral Nemo 12B" + } + ] +}; diff --git a/open-sse/providers/registry/kilocode.js b/open-sse/providers/registry/kilocode.js new file mode 100644 index 00000000..98372a72 --- /dev/null +++ b/open-sse/providers/registry/kilocode.js @@ -0,0 +1,42 @@ +export default { + "id": "kilocode", + "alias": "kc", + "transport": { + "baseUrl": "https://api.kilo.ai/api/openrouter/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "anthropic/claude-sonnet-4-20250514", + "name": "Claude Sonnet 4" + }, + { + "id": "anthropic/claude-opus-4-20250514", + "name": "Claude Opus 4" + }, + { + "id": "google/gemini-2.5-pro", + "name": "Gemini 2.5 Pro" + }, + { + "id": "google/gemini-2.5-flash", + "name": "Gemini 2.5 Flash" + }, + { + "id": "openai/gpt-4.1", + "name": "GPT-4.1" + }, + { + "id": "openai/o3", + "name": "o3" + }, + { + "id": "deepseek/deepseek-chat", + "name": "DeepSeek Chat" + }, + { + "id": "deepseek/deepseek-reasoner", + "name": "DeepSeek Reasoner" + } + ] +}; diff --git a/open-sse/providers/registry/kimi-coding.js b/open-sse/providers/registry/kimi-coding.js new file mode 100644 index 00000000..e82b1e5e --- /dev/null +++ b/open-sse/providers/registry/kimi-coding.js @@ -0,0 +1,20 @@ +import { CLAUDE_API_HEADERS, KIMI_CODING_BASE_URL } from "../shared.js"; + +export default { + id: "kimi-coding", + alias: "kmc", + transport: { + baseUrl: KIMI_CODING_BASE_URL, + format: "claude", + headers: { ...CLAUDE_API_HEADERS }, + clientId: "17e5f671-d194-4dfb-9706-5516cb48c098", + tokenUrl: "https://auth.kimi.com/api/oauth/token", + refreshUrl: "https://auth.kimi.com/api/oauth/token" + }, + models: [ + { id: "kimi-k2.6", name: "Kimi K2.6" }, + { id: "kimi-k2.5", name: "Kimi K2.5" }, + { id: "kimi-k2.5-thinking", name: "Kimi K2.5 Thinking" }, + { id: "kimi-latest", name: "Kimi Latest" } + ] +}; diff --git a/open-sse/providers/registry/kimi.js b/open-sse/providers/registry/kimi.js new file mode 100644 index 00000000..cd45236e --- /dev/null +++ b/open-sse/providers/registry/kimi.js @@ -0,0 +1,17 @@ +import { CLAUDE_API_HEADERS, KIMI_CODING_BASE_URL } from "../shared.js"; + +export default { + id: "kimi", + alias: "kimi", + transport: { + baseUrl: KIMI_CODING_BASE_URL, + format: "claude", + headers: { ...CLAUDE_API_HEADERS } + }, + models: [ + { id: "kimi-k2.6", name: "Kimi K2.6" }, + { id: "kimi-k2.5", name: "Kimi K2.5" }, + { id: "kimi-k2.5-thinking", name: "Kimi K2.5 Thinking" }, + { id: "kimi-latest", name: "Kimi Latest" } + ] +}; diff --git a/open-sse/providers/registry/kiro.js b/open-sse/providers/registry/kiro.js new file mode 100644 index 00000000..a3302830 --- /dev/null +++ b/open-sse/providers/registry/kiro.js @@ -0,0 +1,83 @@ +export default { + "id": "kiro", + "alias": "kr", + "transport": { + "baseUrl": "https://runtime.us-east-1.kiro.dev/generateAssistantResponse", + "baseUrls": [ + "https://runtime.us-east-1.kiro.dev/generateAssistantResponse", + "https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse", + "https://q.us-east-1.amazonaws.com/generateAssistantResponse" + ], + "format": "kiro", + "retry": { + "429": 0 + }, + "headers": { + "Content-Type": "application/json", + "Accept": "application/vnd.amazon.eventstream", + "X-Amz-Target": "AmazonCodeWhispererStreamingService.GenerateAssistantResponse", + "User-Agent": "AWS-SDK-JS/3.0.0 kiro-ide/1.0.0", + "X-Amz-User-Agent": "aws-sdk-js/3.0.0 kiro-ide/1.0.0" + }, + "tokenUrl": "https://prod.us-east-1.auth.desktop.kiro.dev/refreshToken", + "authUrl": "https://prod.us-east-1.auth.desktop.kiro.dev" + }, + "models": [ + { + "id": "claude-sonnet-4.5", + "name": "Claude Sonnet 4.5" + }, + { + "id": "claude-haiku-4.5", + "name": "Claude Haiku 4.5" + }, + { + "id": "deepseek-3.2", + "name": "DeepSeek 3.2", + "strip": [ + "image", + "audio" + ] + }, + { + "id": "qwen3-coder-next", + "name": "Qwen3 Coder Next", + "strip": [ + "image", + "audio" + ] + }, + { + "id": "glm-5", + "name": "GLM 5" + }, + { + "id": "MiniMax-M2.5", + "name": "MiniMax M2.5" + }, + { + "id": "claude-sonnet-4.5-thinking", + "name": "Claude Sonnet 4.5 (Thinking)" + }, + { + "id": "claude-haiku-4.5-thinking", + "name": "Claude Haiku 4.5 (Thinking)" + }, + { + "id": "claude-sonnet-4.5-agentic", + "name": "Claude Sonnet 4.5 (Agentic)" + }, + { + "id": "claude-haiku-4.5-agentic", + "name": "Claude Haiku 4.5 (Agentic)" + }, + { + "id": "claude-sonnet-4.5-thinking-agentic", + "name": "Claude Sonnet 4.5 (Thinking + Agentic)" + }, + { + "id": "claude-haiku-4.5-thinking-agentic", + "name": "Claude Haiku 4.5 (Thinking + Agentic)" + } + ] +}; diff --git a/open-sse/providers/registry/kluster.js b/open-sse/providers/registry/kluster.js new file mode 100644 index 00000000..e537c962 --- /dev/null +++ b/open-sse/providers/registry/kluster.js @@ -0,0 +1,25 @@ +export default { + "id": "kluster", + "alias": "kluster", + "transport": { + "baseUrl": "https://api.kluster.ai/v1/chat/completions" + }, + "models": [ + { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1" + }, + { + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick" + }, + { + "id": "meta-llama/Llama-4-Scout-17B-16E-Instruct", + "name": "Llama 4 Scout" + }, + { + "id": "Qwen/Qwen3-235B-A22B-Instruct", + "name": "Qwen3 235B" + } + ] +}; diff --git a/open-sse/providers/registry/lepton.js b/open-sse/providers/registry/lepton.js new file mode 100644 index 00000000..28041cb9 --- /dev/null +++ b/open-sse/providers/registry/lepton.js @@ -0,0 +1,25 @@ +export default { + "id": "lepton", + "alias": "lepton", + "transport": { + "baseUrl": "https://api.lepton.ai/api/v1/chat/completions" + }, + "models": [ + { + "id": "llama3-1-405b", + "name": "Llama 3.1 405B" + }, + { + "id": "llama3-1-70b", + "name": "Llama 3.1 70B" + }, + { + "id": "llama3-1-8b", + "name": "Llama 3.1 8B" + }, + { + "id": "mixtral-8x7b", + "name": "Mixtral 8x7B" + } + ] +}; diff --git a/open-sse/providers/registry/llm7.js b/open-sse/providers/registry/llm7.js new file mode 100644 index 00000000..9b59e872 --- /dev/null +++ b/open-sse/providers/registry/llm7.js @@ -0,0 +1,21 @@ +export default { + "id": "llm7", + "alias": "llm7", + "transport": { + "baseUrl": "https://api.llm7.io/v1/chat/completions" + }, + "models": [ + { + "id": "gpt-4o-mini", + "name": "GPT-4o Mini" + }, + { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 Mini" + }, + { + "id": "gemini-1.5-flash", + "name": "Gemini 1.5 Flash" + } + ] +}; diff --git a/open-sse/providers/registry/longcat.js b/open-sse/providers/registry/longcat.js new file mode 100644 index 00000000..0cdf5377 --- /dev/null +++ b/open-sse/providers/registry/longcat.js @@ -0,0 +1,21 @@ +export default { + "id": "longcat", + "alias": "longcat", + "transport": { + "baseUrl": "https://api.longcat.chat/openai/v1/chat/completions" + }, + "models": [ + { + "id": "LongCat-Flash-Chat", + "name": "LongCat Flash Chat" + }, + { + "id": "LongCat-Flash-Thinking", + "name": "LongCat Flash Thinking" + }, + { + "id": "LongCat-Flash-Lite", + "name": "LongCat Flash Lite" + } + ] +}; diff --git a/open-sse/providers/registry/mimo-free.js b/open-sse/providers/registry/mimo-free.js new file mode 100644 index 00000000..6ae57292 --- /dev/null +++ b/open-sse/providers/registry/mimo-free.js @@ -0,0 +1,14 @@ +export default { + "id": "mimo-free", + "alias": "mmf", + "transport": { + "baseUrl": "https://api.xiaomimimo.com/api/free-ai/openai/chat", + "noAuth": true + }, + "models": [ + { + "id": "mimo-auto", + "name": "MiMo Auto" + } + ] +}; diff --git a/open-sse/providers/registry/minimax-cn.js b/open-sse/providers/registry/minimax-cn.js new file mode 100644 index 00000000..22253497 --- /dev/null +++ b/open-sse/providers/registry/minimax-cn.js @@ -0,0 +1,17 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "minimax-cn", + alias: "minimax-cn", + transport: { + baseUrl: "https://api.minimaxi.com/anthropic/v1/messages", + format: "claude", + headers: { ...CLAUDE_API_HEADERS } + }, + models: [ + { id: "MiniMax-M3", name: "MiniMax M3", targetFormat: "claude" }, + { id: "MiniMax-M2.7", name: "MiniMax M2.7" }, + { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, + { id: "MiniMax-M2.1", name: "MiniMax M2.1" } + ] +}; diff --git a/open-sse/providers/registry/minimax.js b/open-sse/providers/registry/minimax.js new file mode 100644 index 00000000..defdc8d4 --- /dev/null +++ b/open-sse/providers/registry/minimax.js @@ -0,0 +1,18 @@ +import { CLAUDE_API_HEADERS } from "../shared.js"; + +export default { + id: "minimax", + alias: "minimax", + transport: { + baseUrl: "https://api.minimax.io/anthropic/v1/messages", + format: "claude", + headers: { ...CLAUDE_API_HEADERS } + }, + models: [ + { id: "MiniMax-M3", name: "MiniMax M3", targetFormat: "claude" }, + { id: "MiniMax-M2.7", name: "MiniMax M2.7" }, + { id: "MiniMax-M2.5", name: "MiniMax M2.5" }, + { id: "MiniMax-M2.1", name: "MiniMax M2.1" }, + { id: "minimax-image-01", name: "MiniMax Image 01", type: "image", params: ["n", "size", "response_format"] } + ] +}; diff --git a/open-sse/providers/registry/mistral.js b/open-sse/providers/registry/mistral.js new file mode 100644 index 00000000..0e91ce34 --- /dev/null +++ b/open-sse/providers/registry/mistral.js @@ -0,0 +1,26 @@ +export default { + "id": "mistral", + "alias": "mistral", + "transport": { + "baseUrl": "https://api.mistral.ai/v1/chat/completions" + }, + "models": [ + { + "id": "mistral-large-latest", + "name": "Mistral Large 3" + }, + { + "id": "codestral-latest", + "name": "Codestral" + }, + { + "id": "mistral-medium-latest", + "name": "Mistral Medium 3" + }, + { + "id": "mistral-embed", + "name": "Mistral Embed", + "type": "embedding" + } + ] +}; diff --git a/open-sse/providers/registry/mmf.js b/open-sse/providers/registry/mmf.js new file mode 100644 index 00000000..c8b2537c --- /dev/null +++ b/open-sse/providers/registry/mmf.js @@ -0,0 +1,14 @@ +export default { + "id": "mmf", + "alias": "mmf", + "transport": { + "baseUrl": "https://api.xiaomimimo.com/api/free-ai/openai/chat", + "noAuth": true + }, + "models": [ + { + "id": "mimo-auto", + "name": "MiMo Auto" + } + ] +}; diff --git a/open-sse/providers/registry/modal.js b/open-sse/providers/registry/modal.js new file mode 100644 index 00000000..262fcbe0 --- /dev/null +++ b/open-sse/providers/registry/modal.js @@ -0,0 +1,13 @@ +export default { + "id": "modal", + "alias": "modal", + "transport": { + "baseUrl": "https://api.modal.com/v1/chat/completions" + }, + "models": [ + { + "id": "auto", + "name": "Auto (User-hosted)" + } + ] +}; diff --git a/open-sse/providers/registry/morph.js b/open-sse/providers/registry/morph.js new file mode 100644 index 00000000..bfcaf85a --- /dev/null +++ b/open-sse/providers/registry/morph.js @@ -0,0 +1,17 @@ +export default { + "id": "morph", + "alias": "morph", + "transport": { + "baseUrl": "https://api.morphllm.com/v1/chat/completions" + }, + "models": [ + { + "id": "morph-v3-large", + "name": "Morph V3 Large" + }, + { + "id": "morph-v3-fast", + "name": "Morph V3 Fast" + } + ] +}; diff --git a/open-sse/providers/registry/nanobanana.js b/open-sse/providers/registry/nanobanana.js new file mode 100644 index 00000000..21ecf876 --- /dev/null +++ b/open-sse/providers/registry/nanobanana.js @@ -0,0 +1,27 @@ +export default { + "id": "nanobanana", + "alias": "nanobanana", + "transport": { + "baseUrl": "https://api.nanobananaapi.ai/v1/chat/completions" + }, + "models": [ + { + "id": "nanobanana-flash", + "name": "NanoBanana Flash", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "nanobanana-pro", + "name": "NanoBanana Pro", + "type": "image", + "params": [ + "n", + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/nebius.js b/open-sse/providers/registry/nebius.js new file mode 100644 index 00000000..1312a3ed --- /dev/null +++ b/open-sse/providers/registry/nebius.js @@ -0,0 +1,18 @@ +export default { + "id": "nebius", + "alias": "nebius", + "transport": { + "baseUrl": "https://api.studio.nebius.ai/v1/chat/completions" + }, + "models": [ + { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B Instruct" + }, + { + "id": "Qwen/Qwen3-Embedding-8B", + "name": "Qwen3 Embedding 8B", + "type": "embedding" + } + ] +}; diff --git a/open-sse/providers/registry/nlpcloud.js b/open-sse/providers/registry/nlpcloud.js new file mode 100644 index 00000000..dfc35940 --- /dev/null +++ b/open-sse/providers/registry/nlpcloud.js @@ -0,0 +1,21 @@ +export default { + "id": "nlpcloud", + "alias": "nlpcloud", + "transport": { + "baseUrl": "https://api.nlpcloud.io/v1/gpu/chatbot" + }, + "models": [ + { + "id": "chatdolphin", + "name": "ChatDolphin" + }, + { + "id": "dolphin", + "name": "Dolphin" + }, + { + "id": "finetuned-llama-3-70b", + "name": "Llama 3 70B (Finetuned)" + } + ] +}; diff --git a/open-sse/providers/registry/nous-research.js b/open-sse/providers/registry/nous-research.js new file mode 100644 index 00000000..c43af3b8 --- /dev/null +++ b/open-sse/providers/registry/nous-research.js @@ -0,0 +1,17 @@ +export default { + "id": "nous-research", + "alias": "nous-research", + "transport": { + "baseUrl": "https://inference-api.nousresearch.com/v1/chat/completions" + }, + "models": [ + { + "id": "Hermes-4-405B", + "name": "Hermes 4 405B" + }, + { + "id": "Hermes-4-70B", + "name": "Hermes 4 70B" + } + ] +}; diff --git a/open-sse/providers/registry/novita.js b/open-sse/providers/registry/novita.js new file mode 100644 index 00000000..91cc4552 --- /dev/null +++ b/open-sse/providers/registry/novita.js @@ -0,0 +1,25 @@ +export default { + "id": "novita", + "alias": "novita", + "transport": { + "baseUrl": "https://api.novita.ai/v3/openai/chat/completions" + }, + "models": [ + { + "id": "deepseek/deepseek-r1", + "name": "DeepSeek R1" + }, + { + "id": "deepseek/deepseek-v3", + "name": "DeepSeek V3" + }, + { + "id": "meta-llama/llama-3.3-70b-instruct", + "name": "Llama 3.3 70B" + }, + { + "id": "qwen/qwen-2.5-72b-instruct", + "name": "Qwen 2.5 72B" + } + ] +}; diff --git a/open-sse/providers/registry/nscale.js b/open-sse/providers/registry/nscale.js new file mode 100644 index 00000000..5a0565a7 --- /dev/null +++ b/open-sse/providers/registry/nscale.js @@ -0,0 +1,17 @@ +export default { + "id": "nscale", + "alias": "nscale", + "transport": { + "baseUrl": "https://inference.api.nscale.com/v1/chat/completions" + }, + "models": [ + { + "id": "meta-llama/Llama-3.3-70B-Instruct", + "name": "Llama 3.3 70B" + }, + { + "id": "Qwen/Qwen2.5-Coder-32B-Instruct", + "name": "Qwen 2.5 Coder 32B" + } + ] +}; diff --git a/open-sse/providers/registry/nvidia.js b/open-sse/providers/registry/nvidia.js new file mode 100644 index 00000000..a7a81f57 --- /dev/null +++ b/open-sse/providers/registry/nvidia.js @@ -0,0 +1,30 @@ +export default { + "id": "nvidia", + "alias": "nvidia", + "transport": { + "baseUrl": "https://integrate.api.nvidia.com/v1/chat/completions" + }, + "models": [ + { + "id": "minimaxai/minimax-m2.7", + "name": "Minimax M2.7" + }, + { + "id": "z-ai/glm4.7", + "name": "GLM 4.7" + }, + { + "id": "nvidia/nv-embedqa-e5-v5", + "name": "NV EmbedQA E5 v5", + "type": "embedding" + }, + { + "id": "nvidia/parakeet-ctc-1.1b-asr", + "name": "Parakeet CTC 1.1B", + "type": "stt", + "params": [ + "language" + ] + } + ] +}; diff --git a/open-sse/providers/registry/ollama-local.js b/open-sse/providers/registry/ollama-local.js new file mode 100644 index 00000000..1f61c685 --- /dev/null +++ b/open-sse/providers/registry/ollama-local.js @@ -0,0 +1,8 @@ +export default { + "id": "ollama-local", + "alias": "ollama-local", + "transport": { + "baseUrl": "http://localhost:11434/api/chat", + "format": "ollama" + } +}; diff --git a/open-sse/providers/registry/ollama.js b/open-sse/providers/registry/ollama.js new file mode 100644 index 00000000..76279f5c --- /dev/null +++ b/open-sse/providers/registry/ollama.js @@ -0,0 +1,34 @@ +export default { + "id": "ollama", + "alias": "ollama", + "transport": { + "baseUrl": "https://ollama.com/api/chat", + "format": "ollama" + }, + "models": [ + { + "id": "gpt-oss:120b", + "name": "GPT OSS 120B" + }, + { + "id": "kimi-k2.5", + "name": "Kimi K2.5" + }, + { + "id": "glm-5", + "name": "GLM 5" + }, + { + "id": "minimax-m2.5", + "name": "MiniMax M2.5" + }, + { + "id": "glm-4.7-flash", + "name": "GLM 4.7 Flash" + }, + { + "id": "qwen3.5", + "name": "Qwen3.5" + } + ] +}; diff --git a/open-sse/providers/registry/openai.js b/open-sse/providers/registry/openai.js new file mode 100644 index 00000000..80eeece0 --- /dev/null +++ b/open-sse/providers/registry/openai.js @@ -0,0 +1,184 @@ +export default { + "id": "openai", + "alias": "openai", + "transport": { + "baseUrl": "https://api.openai.com/v1/chat/completions" + }, + "models": [ + { + "id": "gpt-5.4", + "name": "GPT-5.4" + }, + { + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini" + }, + { + "id": "gpt-5.4-nano", + "name": "GPT-5.4 Nano" + }, + { + "id": "gpt-5.2", + "name": "GPT-5.2" + }, + { + "id": "gpt-5.1", + "name": "GPT-5.1" + }, + { + "id": "gpt-5", + "name": "GPT-5" + }, + { + "id": "gpt-5-mini", + "name": "GPT-5 Mini" + }, + { + "id": "gpt-5-nano", + "name": "GPT-5 Nano" + }, + { + "id": "gpt-4o", + "name": "GPT-4o" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o Mini" + }, + { + "id": "gpt-4-turbo", + "name": "GPT-4 Turbo" + }, + { + "id": "gpt-4.1", + "name": "GPT-4.1" + }, + { + "id": "gpt-4.1-mini", + "name": "GPT-4.1 Mini" + }, + { + "id": "gpt-4.1-nano", + "name": "GPT-4.1 Nano" + }, + { + "id": "o3", + "name": "O3" + }, + { + "id": "o3-mini", + "name": "O3 Mini" + }, + { + "id": "o3-pro", + "name": "O3 Pro" + }, + { + "id": "o4-mini", + "name": "O4 Mini" + }, + { + "id": "o1", + "name": "O1" + }, + { + "id": "o1-mini", + "name": "O1 Mini" + }, + { + "id": "text-embedding-3-large", + "name": "Text Embedding 3 Large", + "type": "embedding" + }, + { + "id": "text-embedding-3-small", + "name": "Text Embedding 3 Small", + "type": "embedding" + }, + { + "id": "text-embedding-ada-002", + "name": "Text Embedding Ada 002", + "type": "embedding" + }, + { + "id": "tts-1", + "name": "TTS-1", + "type": "tts" + }, + { + "id": "tts-1-hd", + "name": "TTS-1 HD", + "type": "tts" + }, + { + "id": "gpt-4o-mini-tts", + "name": "GPT-4o Mini TTS", + "type": "tts" + }, + { + "id": "whisper-1", + "name": "Whisper 1", + "type": "stt", + "params": [ + "language", + "response_format", + "temperature", + "prompt" + ] + }, + { + "id": "gpt-4o-transcribe", + "name": "GPT-4o Transcribe", + "type": "stt", + "params": [ + "language", + "response_format", + "temperature", + "prompt" + ] + }, + { + "id": "gpt-4o-mini-transcribe", + "name": "GPT-4o Mini Transcribe", + "type": "stt", + "params": [ + "language", + "response_format", + "temperature", + "prompt" + ] + }, + { + "id": "gpt-image-1", + "name": "GPT Image 1", + "type": "image", + "params": [ + "n", + "size", + "quality", + "response_format" + ] + }, + { + "id": "dall-e-3", + "name": "DALL-E 3", + "type": "image", + "params": [ + "size", + "quality", + "style", + "response_format" + ] + }, + { + "id": "dall-e-2", + "name": "DALL-E 2", + "type": "image", + "params": [ + "n", + "size", + "response_format" + ] + } + ] +}; diff --git a/open-sse/providers/registry/opencode-go.js b/open-sse/providers/registry/opencode-go.js new file mode 100644 index 00000000..4404409f --- /dev/null +++ b/open-sse/providers/registry/opencode-go.js @@ -0,0 +1,52 @@ +export default { + "id": "opencode-go", + "alias": "opencode-go", + "transport": { + "baseUrl": "https://opencode.ai/zen/go/v1/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "kimi-k2.6", + "name": "Kimi K2.6" + }, + { + "id": "kimi-k2.5", + "name": "Kimi K2.5" + }, + { + "id": "glm-5.1", + "name": "GLM 5.1" + }, + { + "id": "glm-5", + "name": "GLM 5" + }, + { + "id": "qwen3.5-plus", + "name": "Qwen 3.5 Plus" + }, + { + "id": "qwen3.6-plus", + "name": "Qwen 3.6 Plus" + }, + { + "id": "mimo-v2-pro", + "name": "MiMo V2 Pro" + }, + { + "id": "mimo-v2-omni", + "name": "MiMo V2 Omni" + }, + { + "id": "minimax-m2.7", + "name": "MiniMax M2.7", + "targetFormat": "claude" + }, + { + "id": "minimax-m2.5", + "name": "MiniMax M2.5", + "targetFormat": "claude" + } + ] +}; diff --git a/open-sse/providers/registry/opencode.js b/open-sse/providers/registry/opencode.js new file mode 100644 index 00000000..ec115efc --- /dev/null +++ b/open-sse/providers/registry/opencode.js @@ -0,0 +1,12 @@ +export default { + "id": "opencode", + "alias": "oc", + "transport": { + "baseUrl": "https://opencode.ai", + "headers": { + "x-opencode-client": "desktop" + }, + "noAuth": true + }, + "models": [] +}; diff --git a/open-sse/providers/registry/openrouter.js b/open-sse/providers/registry/openrouter.js new file mode 100644 index 00000000..dec79700 --- /dev/null +++ b/open-sse/providers/registry/openrouter.js @@ -0,0 +1,103 @@ +export default { + "id": "openrouter", + "alias": "openrouter", + "transport": { + "baseUrl": "https://openrouter.ai/api/v1/chat/completions", + "headers": { + "HTTP-Referer": "https://endpoint-proxy.local", + "X-Title": "Endpoint Proxy" + } + }, + "models": [ + { + "id": "openai/text-embedding-3-large", + "name": "OpenAI Text Embedding 3 Large", + "type": "embedding" + }, + { + "id": "openai/text-embedding-3-small", + "name": "OpenAI Text Embedding 3 Small", + "type": "embedding" + }, + { + "id": "openai/text-embedding-ada-002", + "name": "OpenAI Text Embedding Ada 002", + "type": "embedding" + }, + { + "id": "qwen/qwen3-embedding-8b", + "name": "Qwen3 Embedding 8B", + "type": "embedding" + }, + { + "id": "perplexity/pplx-embed-v1-4b", + "name": "Perplexity Embed V1 4B", + "type": "embedding" + }, + { + "id": "perplexity/pplx-embed-v1-0.6b", + "name": "Perplexity Embed V1 0.6B", + "type": "embedding" + }, + { + "id": "nvidia/llama-nemotron-embed-vl-1b-v2:free", + "name": "NVIDIA Nemotron Embed VL 1B V2 (Free)", + "type": "embedding" + }, + { + "id": "openai/gpt-4o-mini-tts", + "name": "GPT-4o Mini TTS", + "type": "tts" + }, + { + "id": "openai/tts-1-hd", + "name": "TTS-1 HD", + "type": "tts" + }, + { + "id": "openai/tts-1", + "name": "TTS-1", + "type": "tts" + }, + { + "id": "openai/dall-e-3", + "name": "DALL-E 3 (via OpenRouter)", + "type": "image", + "params": [ + "size", + "quality", + "style", + "response_format" + ] + }, + { + "id": "openai/gpt-image-1", + "name": "GPT Image 1 (via OpenRouter)", + "type": "image", + "params": [ + "n", + "size", + "quality", + "response_format" + ] + }, + { + "id": "google/imagen-3.0-generate-002", + "name": "Imagen 3 (via OpenRouter)", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "black-forest-labs/FLUX.1-schnell", + "name": "FLUX.1 Schnell (via OpenRouter)", + "type": "image", + "params": [ + "n", + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/perplexity-web.js b/open-sse/providers/registry/perplexity-web.js new file mode 100644 index 00000000..ec203ee2 --- /dev/null +++ b/open-sse/providers/registry/perplexity-web.js @@ -0,0 +1,39 @@ +export default { + "id": "perplexity-web", + "alias": "perplexity-web", + "transport": { + "baseUrl": "https://www.perplexity.ai/rest/sse/perplexity_ask", + "format": "perplexity-web", + "authType": "cookie" + }, + "models": [ + { + "id": "pplx-auto", + "name": "Perplexity Auto (Free)" + }, + { + "id": "pplx-sonar", + "name": "Perplexity Sonar" + }, + { + "id": "pplx-gpt", + "name": "GPT-5.4 (via Perplexity)" + }, + { + "id": "pplx-gemini", + "name": "Gemini 3.1 Pro (via Perplexity)" + }, + { + "id": "pplx-sonnet", + "name": "Claude Sonnet 4.6 (via Perplexity)" + }, + { + "id": "pplx-opus", + "name": "Claude Opus 4.6 (via Perplexity)" + }, + { + "id": "pplx-nemotron", + "name": "Nemotron 3 Super (via Perplexity)" + } + ] +}; diff --git a/open-sse/providers/registry/perplexity.js b/open-sse/providers/registry/perplexity.js new file mode 100644 index 00000000..e7736a3d --- /dev/null +++ b/open-sse/providers/registry/perplexity.js @@ -0,0 +1,17 @@ +export default { + "id": "perplexity", + "alias": "perplexity", + "transport": { + "baseUrl": "https://api.perplexity.ai/chat/completions" + }, + "models": [ + { + "id": "sonar-pro", + "name": "Sonar Pro" + }, + { + "id": "sonar", + "name": "Sonar" + } + ] +}; diff --git a/open-sse/providers/registry/predibase.js b/open-sse/providers/registry/predibase.js new file mode 100644 index 00000000..3a38fbac --- /dev/null +++ b/open-sse/providers/registry/predibase.js @@ -0,0 +1,21 @@ +export default { + "id": "predibase", + "alias": "predibase", + "transport": { + "baseUrl": "https://serving.app.predibase.com/v1/chat/completions" + }, + "models": [ + { + "id": "llama-3-2-3b-instruct", + "name": "Llama 3.2 3B" + }, + { + "id": "llama-3-1-8b-instruct", + "name": "Llama 3.1 8B" + }, + { + "id": "qwen2-5-7b-instruct", + "name": "Qwen 2.5 7B" + } + ] +}; diff --git a/open-sse/providers/registry/publicai.js b/open-sse/providers/registry/publicai.js new file mode 100644 index 00000000..d8b10ec7 --- /dev/null +++ b/open-sse/providers/registry/publicai.js @@ -0,0 +1,13 @@ +export default { + "id": "publicai", + "alias": "publicai", + "transport": { + "baseUrl": "https://api.publicai.co/v1/chat/completions" + }, + "models": [ + { + "id": "auto", + "name": "Auto (Community)" + } + ] +}; diff --git a/open-sse/providers/registry/puter.js b/open-sse/providers/registry/puter.js new file mode 100644 index 00000000..d354c93f --- /dev/null +++ b/open-sse/providers/registry/puter.js @@ -0,0 +1,29 @@ +export default { + "id": "puter", + "alias": "puter", + "transport": { + "baseUrl": "https://api.puter.com/puterai/openai/v1/chat/completions" + }, + "models": [ + { + "id": "gpt-5", + "name": "GPT-5" + }, + { + "id": "claude-opus-4", + "name": "Claude Opus 4" + }, + { + "id": "gemini-3-pro-preview", + "name": "Gemini 3 Pro" + }, + { + "id": "grok-4", + "name": "Grok 4" + }, + { + "id": "deepseek-chat", + "name": "DeepSeek V3" + } + ] +}; diff --git a/open-sse/providers/registry/qoder.js b/open-sse/providers/registry/qoder.js new file mode 100644 index 00000000..8c436d26 --- /dev/null +++ b/open-sse/providers/registry/qoder.js @@ -0,0 +1,60 @@ +export default { + "id": "qoder", + "alias": "qd", + "transport": { + "baseUrl": "https://api3.qoder.sh/algo/api/v2/service/pro/sse/agent_chat_generation", + "headers": {}, + "timeoutMs": 120000, + "stallTimeoutMs": 120000 + }, + "models": [ + { + "id": "auto", + "name": "Qoder Auto" + }, + { + "id": "ultimate", + "name": "Qoder Ultimate" + }, + { + "id": "performance", + "name": "Qoder Performance" + }, + { + "id": "efficient", + "name": "Qoder Efficient" + }, + { + "id": "lite", + "name": "Qoder Lite" + }, + { + "id": "qmodel", + "name": "Qwen 3.6 Plus (Qoder)" + }, + { + "id": "qmodel_latest", + "name": "Qoder Qwen 3.7 Max" + }, + { + "id": "dmodel", + "name": "DeepSeek V4 Pro (Qoder)" + }, + { + "id": "dfmodel", + "name": "DeepSeek V4 Flash (Qoder)" + }, + { + "id": "gm51model", + "name": "GLM 5.1 (Qoder)" + }, + { + "id": "kmodel", + "name": "Kimi K2.6 (Qoder)" + }, + { + "id": "mmodel", + "name": "MiniMax M2.7 (Qoder)" + } + ] +}; diff --git a/open-sse/providers/registry/qwen.js b/open-sse/providers/registry/qwen.js new file mode 100644 index 00000000..2da59eb4 --- /dev/null +++ b/open-sse/providers/registry/qwen.js @@ -0,0 +1,28 @@ +export default { + "id": "qwen", + "alias": "qw", + "transport": { + "baseUrl": "https://portal.qwen.ai/v1/chat/completions", + "clientId": "f0304373b74a44d2b584a3fb70ca9e56", + "tokenUrl": "https://chat.qwen.ai/api/v1/oauth2/token", + "authUrl": "https://chat.qwen.ai/api/v1/oauth2/device/code" + }, + "models": [ + { + "id": "qwen3-coder-plus", + "name": "Qwen3 Coder Plus" + }, + { + "id": "qwen3-coder-flash", + "name": "Qwen3 Coder Flash" + }, + { + "id": "vision-model", + "name": "Qwen3 Vision Model" + }, + { + "id": "coder-model", + "name": "Qwen3.6 Coder Model" + } + ] +}; diff --git a/open-sse/providers/registry/recraft.js b/open-sse/providers/registry/recraft.js new file mode 100644 index 00000000..9432e6b6 --- /dev/null +++ b/open-sse/providers/registry/recraft.js @@ -0,0 +1,27 @@ +export default { + "id": "recraft", + "alias": "recraft", + "transport": null, + "models": [ + { + "id": "recraftv3", + "name": "Recraft V3", + "type": "image", + "params": [ + "n", + "size", + "style" + ] + }, + { + "id": "recraftv2", + "name": "Recraft V2", + "type": "image", + "params": [ + "n", + "size", + "style" + ] + } + ] +}; diff --git a/open-sse/providers/registry/reka.js b/open-sse/providers/registry/reka.js new file mode 100644 index 00000000..0028947c --- /dev/null +++ b/open-sse/providers/registry/reka.js @@ -0,0 +1,17 @@ +export default { + "id": "reka", + "alias": "reka", + "transport": { + "baseUrl": "https://api.reka.ai/v1/chat/completions" + }, + "models": [ + { + "id": "reka-flash-3", + "name": "Reka Flash 3" + }, + { + "id": "reka-edge-2603", + "name": "Reka Edge 2603" + } + ] +}; diff --git a/open-sse/providers/registry/runwayml.js b/open-sse/providers/registry/runwayml.js new file mode 100644 index 00000000..a79f6a6e --- /dev/null +++ b/open-sse/providers/registry/runwayml.js @@ -0,0 +1,35 @@ +export default { + "id": "runwayml", + "alias": "runwayml", + "transport": null, + "models": [ + { + "id": "gen4_image", + "name": "Gen-4 Image", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "gen4_image_turbo", + "name": "Gen-4 Image Turbo", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "gen4_turbo", + "name": "Gen-4 Turbo", + "type": "video", + "params": [] + }, + { + "id": "gen3a_turbo", + "name": "Gen-3 Alpha Turbo", + "type": "video", + "params": [] + } + ] +}; diff --git a/open-sse/providers/registry/sambanova.js b/open-sse/providers/registry/sambanova.js new file mode 100644 index 00000000..49091af8 --- /dev/null +++ b/open-sse/providers/registry/sambanova.js @@ -0,0 +1,21 @@ +export default { + "id": "sambanova", + "alias": "sambanova", + "transport": { + "baseUrl": "https://api.sambanova.ai/v1/chat/completions" + }, + "models": [ + { + "id": "Meta-Llama-3.1-405B-Instruct", + "name": "Llama 3.1 405B" + }, + { + "id": "Meta-Llama-3.1-70B-Instruct", + "name": "Llama 3.1 70B" + }, + { + "id": "Meta-Llama-3.1-8B-Instruct", + "name": "Llama 3.1 8B" + } + ] +}; diff --git a/open-sse/providers/registry/scaleway.js b/open-sse/providers/registry/scaleway.js new file mode 100644 index 00000000..51c4e822 --- /dev/null +++ b/open-sse/providers/registry/scaleway.js @@ -0,0 +1,21 @@ +export default { + "id": "scaleway", + "alias": "scaleway", + "transport": { + "baseUrl": "https://api.scaleway.ai/v1/chat/completions" + }, + "models": [ + { + "id": "qwen3-235b-a22b-instruct-2507", + "name": "Qwen3 235B" + }, + { + "id": "llama-3.3-70b-instruct", + "name": "Llama 3.3 70B" + }, + { + "id": "mistral-small-3.1-24b-instruct-2503", + "name": "Mistral Small 3.1" + } + ] +}; diff --git a/open-sse/providers/registry/sdwebui.js b/open-sse/providers/registry/sdwebui.js new file mode 100644 index 00000000..8512bf37 --- /dev/null +++ b/open-sse/providers/registry/sdwebui.js @@ -0,0 +1,25 @@ +export default { + "id": "sdwebui", + "alias": "sdwebui", + "transport": null, + "models": [ + { + "id": "stable-diffusion-v1-5", + "name": "Stable Diffusion v1.5", + "type": "image", + "params": [ + "n", + "size" + ] + }, + { + "id": "sdxl-base-1.0", + "name": "SDXL Base 1.0", + "type": "image", + "params": [ + "n", + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/siliconflow.js b/open-sse/providers/registry/siliconflow.js new file mode 100644 index 00000000..8218672d --- /dev/null +++ b/open-sse/providers/registry/siliconflow.js @@ -0,0 +1,73 @@ +export default { + "id": "siliconflow", + "alias": "siliconflow", + "transport": { + "baseUrl": "https://api.siliconflow.com/v1/chat/completions" + }, + "models": [ + { + "id": "deepseek-ai/DeepSeek-V4-Pro", + "name": "DeepSeek V4 Pro" + }, + { + "id": "deepseek-ai/DeepSeek-V4-Flash", + "name": "DeepSeek V4 Flash" + }, + { + "id": "deepseek-ai/DeepSeek-V3.2", + "name": "DeepSeek V3.2" + }, + { + "id": "deepseek-ai/DeepSeek-V3.2-Exp", + "name": "DeepSeek V3.2 Exp" + }, + { + "id": "deepseek-ai/DeepSeek-V3.1", + "name": "DeepSeek V3.1" + }, + { + "id": "deepseek-ai/DeepSeek-V3.1-Terminus", + "name": "DeepSeek V3.1 Terminus" + }, + { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1" + }, + { + "id": "Qwen/Qwen3.5-397B-A17B", + "name": "Qwen 3.5 397B A17B" + }, + { + "id": "Qwen/Qwen3.5-122B-A10B", + "name": "Qwen 3.5 122B A10B" + }, + { + "id": "zai-org/GLM-5.1", + "name": "GLM 5.1" + }, + { + "id": "zai-org/GLM-5", + "name": "GLM 5" + }, + { + "id": "moonshotai/Kimi-K2.6", + "name": "Kimi K2.6" + }, + { + "id": "moonshotai/Kimi-K2.5", + "name": "Kimi K2.5" + }, + { + "id": "openai/gpt-oss-120b", + "name": "GPT OSS 120B" + }, + { + "id": "MiniMaxAI/MiniMax-M2.5", + "name": "MiniMax M2.5" + }, + { + "id": "inclusionAI/Ling-flash-2.0", + "name": "Ling Flash 2.0" + } + ] +}; diff --git a/open-sse/providers/registry/stability-ai.js b/open-sse/providers/registry/stability-ai.js new file mode 100644 index 00000000..02e319f5 --- /dev/null +++ b/open-sse/providers/registry/stability-ai.js @@ -0,0 +1,48 @@ +export default { + "id": "stability-ai", + "alias": "stability-ai", + "transport": null, + "models": [ + { + "id": "stable-image-ultra", + "name": "Stable Image Ultra", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "stable-image-core", + "name": "Stable Image Core", + "type": "image", + "params": [ + "size", + "style" + ] + }, + { + "id": "sd3.5-large", + "name": "Stable Diffusion 3.5 Large", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "sd3.5-large-turbo", + "name": "Stable Diffusion 3.5 Large Turbo", + "type": "image", + "params": [ + "size" + ] + }, + { + "id": "sd3.5-medium", + "name": "Stable Diffusion 3.5 Medium", + "type": "image", + "params": [ + "size" + ] + } + ] +}; diff --git a/open-sse/providers/registry/together.js b/open-sse/providers/registry/together.js new file mode 100644 index 00000000..19c00764 --- /dev/null +++ b/open-sse/providers/registry/together.js @@ -0,0 +1,35 @@ +export default { + "id": "together", + "alias": "together", + "transport": { + "baseUrl": "https://api.together.xyz/v1/chat/completions" + }, + "models": [ + { + "id": "meta-llama/Llama-3.3-70B-Instruct-Turbo", + "name": "Llama 3.3 70B Turbo" + }, + { + "id": "deepseek-ai/DeepSeek-R1", + "name": "DeepSeek R1" + }, + { + "id": "Qwen/Qwen3-235B-A22B", + "name": "Qwen3 235B" + }, + { + "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + "name": "Llama 4 Maverick" + }, + { + "id": "BAAI/bge-large-en-v1.5", + "name": "BGE Large EN v1.5", + "type": "embedding" + }, + { + "id": "togethercomputer/m2-bert-80M-8k-retrieval", + "name": "M2 BERT 80M 8K", + "type": "embedding" + } + ] +}; diff --git a/open-sse/providers/registry/uncloseai.js b/open-sse/providers/registry/uncloseai.js new file mode 100644 index 00000000..edb3e35f --- /dev/null +++ b/open-sse/providers/registry/uncloseai.js @@ -0,0 +1,18 @@ +export default { + "id": "uncloseai", + "alias": "uncloseai", + "transport": { + "baseUrl": "https://hermes.ai.unturf.com/v1/chat/completions", + "noAuth": true + }, + "models": [ + { + "id": "auto", + "name": "Auto (Free)" + }, + { + "id": "gpt-4o-mini", + "name": "GPT-4o Mini" + } + ] +}; diff --git a/open-sse/providers/registry/vercel-ai-gateway.js b/open-sse/providers/registry/vercel-ai-gateway.js new file mode 100644 index 00000000..2fe53b92 --- /dev/null +++ b/open-sse/providers/registry/vercel-ai-gateway.js @@ -0,0 +1,10 @@ +export default { + "id": "vercel-ai-gateway", + "alias": "vercel-ai-gateway", + "transport": { + "baseUrl": "https://ai-gateway.vercel.sh/v1/chat/completions", + "retry": { + "429": 2 + } + } +}; diff --git a/open-sse/providers/registry/vertex-partner.js b/open-sse/providers/registry/vertex-partner.js new file mode 100644 index 00000000..11d67c3d --- /dev/null +++ b/open-sse/providers/registry/vertex-partner.js @@ -0,0 +1,25 @@ +export default { + "id": "vertex-partner", + "alias": "vertex-partner", + "transport": { + "baseUrl": "https://aiplatform.googleapis.com" + }, + "models": [ + { + "id": "deepseek-ai/deepseek-v3.2-maas", + "name": "DeepSeek V3.2 (Vertex)" + }, + { + "id": "qwen/qwen3-next-80b-a3b-thinking-maas", + "name": "Qwen3 Next 80B Thinking (Vertex)" + }, + { + "id": "qwen/qwen3-next-80b-a3b-instruct-maas", + "name": "Qwen3 Next 80B Instruct (Vertex)" + }, + { + "id": "zai-org/glm-5-maas", + "name": "GLM-5 (Vertex)" + } + ] +}; diff --git a/open-sse/providers/registry/vertex.js b/open-sse/providers/registry/vertex.js new file mode 100644 index 00000000..d507719a --- /dev/null +++ b/open-sse/providers/registry/vertex.js @@ -0,0 +1,26 @@ +export default { + "id": "vertex", + "alias": "vertex", + "transport": { + "baseUrl": "https://aiplatform.googleapis.com", + "format": "vertex" + }, + "models": [ + { + "id": "gemini-3.1-pro-preview", + "name": "Gemini 3.1 Pro Preview" + }, + { + "id": "gemini-3.1-flash-lite-preview", + "name": "Gemini 3.1 Flash Lite Preview" + }, + { + "id": "gemini-3-flash-preview", + "name": "Gemini 3 Flash Preview" + }, + { + "id": "gemini-2.5-flash", + "name": "Gemini 2.5 Flash" + } + ] +}; diff --git a/open-sse/providers/registry/volcengine-ark.js b/open-sse/providers/registry/volcengine-ark.js new file mode 100644 index 00000000..77edad45 --- /dev/null +++ b/open-sse/providers/registry/volcengine-ark.js @@ -0,0 +1,46 @@ +export default { + "id": "volcengine-ark", + "alias": "volcengine-ark", + "transport": { + "baseUrl": "https://ark.cn-beijing.volces.com/api/coding/v3/chat/completions", + "headers": {} + }, + "models": [ + { + "id": "Doubao-Seed-2.0-Code", + "name": "Doubao-Seed-2.0-Code" + }, + { + "id": "Doubao-Seed-2.0-pro", + "name": "Doubao-Seed-2.0-pro" + }, + { + "id": "Doubao-Seed-2.0-lite", + "name": "Doubao-Seed-2.0-lite" + }, + { + "id": "Doubao-Seed-Code", + "name": "Doubao-Seed-Code" + }, + { + "id": "DeepSeek-V4-Flash", + "name": "DeepSeek-V4-Flash" + }, + { + "id": "DeepSeek-V4-Pro", + "name": "DeepSeek-V4-Pro" + }, + { + "id": "GLM-5.1", + "name": "GLM-5.1" + }, + { + "id": "MiniMax-M2.7", + "name": "MiniMax-M2.7" + }, + { + "id": "Kimi-K2.6", + "name": "Kimi-K2.6" + } + ] +}; diff --git a/open-sse/providers/registry/voyage-ai.js b/open-sse/providers/registry/voyage-ai.js new file mode 100644 index 00000000..2e7fd1ff --- /dev/null +++ b/open-sse/providers/registry/voyage-ai.js @@ -0,0 +1,42 @@ +export default { + "id": "voyage-ai", + "alias": "voyage-ai", + "transport": null, + "models": [ + { + "id": "voyage-3-large", + "name": "Voyage 3 Large", + "type": "embedding" + }, + { + "id": "voyage-3.5", + "name": "Voyage 3.5", + "type": "embedding" + }, + { + "id": "voyage-3.5-lite", + "name": "Voyage 3.5 Lite", + "type": "embedding" + }, + { + "id": "voyage-code-3", + "name": "Voyage Code 3", + "type": "embedding" + }, + { + "id": "voyage-finance-2", + "name": "Voyage Finance 2", + "type": "embedding" + }, + { + "id": "voyage-law-2", + "name": "Voyage Law 2", + "type": "embedding" + }, + { + "id": "voyage-multilingual-2", + "name": "Voyage Multilingual 2", + "type": "embedding" + } + ] +}; diff --git a/open-sse/providers/registry/xai.js b/open-sse/providers/registry/xai.js new file mode 100644 index 00000000..2be5091a --- /dev/null +++ b/open-sse/providers/registry/xai.js @@ -0,0 +1,38 @@ +export default { + "id": "xai", + "alias": "xai", + "transport": { + "baseUrl": "https://api.x.ai/v1/chat/completions", + "responsesUrl": "https://api.x.ai/v1/responses", + "clientId": "b1a00492-073a-47ea-816f-4c329264a828", + "tokenUrl": "https://auth.x.ai/oauth2/token", + "refreshUrl": "https://auth.x.ai/oauth2/token" + }, + "models": [ + { + "id": "grok-4", + "name": "Grok 4" + }, + { + "id": "grok-4-fast-reasoning", + "name": "Grok 4 Fast Reasoning" + }, + { + "id": "grok-code-fast-1", + "name": "Grok Code Fast" + }, + { + "id": "grok-3", + "name": "Grok 3" + }, + { + "id": "grok-2-image-1212", + "name": "Grok 2 Image", + "type": "image", + "params": [ + "n", + "response_format" + ] + } + ] +}; diff --git a/open-sse/providers/registry/xiaomi-mimo.js b/open-sse/providers/registry/xiaomi-mimo.js new file mode 100644 index 00000000..c73326f0 --- /dev/null +++ b/open-sse/providers/registry/xiaomi-mimo.js @@ -0,0 +1,25 @@ +export default { + "id": "xiaomi-mimo", + "alias": "xiaomi-mimo", + "transport": { + "baseUrl": "https://api.xiaomimimo.com/v1/chat/completions" + }, + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro" + }, + { + "id": "mimo-v2.5", + "name": "MiMo V2.5" + }, + { + "id": "mimo-v2-omni", + "name": "MiMo V2 Omni" + }, + { + "id": "mimo-v2-flash", + "name": "MiMo V2 Flash" + } + ] +}; diff --git a/open-sse/providers/registry/xiaomi-tokenplan.js b/open-sse/providers/registry/xiaomi-tokenplan.js new file mode 100644 index 00000000..d2788e01 --- /dev/null +++ b/open-sse/providers/registry/xiaomi-tokenplan.js @@ -0,0 +1,47 @@ +export default { + "id": "xiaomi-tokenplan", + "alias": "xiaomi-tokenplan", + "transport": { + "baseUrl": "https://token-plan-sgp.xiaomimimo.com/v1/chat/completions" + }, + "models": [ + { + "id": "mimo-v2.5-pro", + "name": "MiMo V2.5 Pro" + }, + { + "id": "mimo-v2.5-pro-claude", + "name": "MiMo V2.5 Pro (Claude Native)", + "targetFormat": "claude", + "upstreamModelId": "mimo-v2.5-pro" + }, + { + "id": "mimo-v2.5", + "name": "MiMo V2.5" + }, + { + "id": "mimo-v2-pro", + "name": "MiMo V2 Pro" + }, + { + "id": "mimo-v2-omni", + "name": "MiMo V2 Omni" + }, + { + "id": "mimo-v2-tts", + "name": "MiMo V2 TTS" + }, + { + "id": "mimo-v2.5-tts", + "name": "MiMo V2.5 TTS" + }, + { + "id": "mimo-v2.5-tts-voiceclone", + "name": "MiMo V2.5 TTS Voice Clone" + }, + { + "id": "mimo-v2.5-tts-voicedesign", + "name": "MiMo V2.5 TTS Voice Design" + } + ] +}; diff --git a/open-sse/providers/shared.js b/open-sse/providers/shared.js new file mode 100644 index 00000000..e4fad1e1 --- /dev/null +++ b/open-sse/providers/shared.js @@ -0,0 +1,48 @@ +import { platform, arch } from "os"; + +// === OS/Arch helpers (Stainless fingerprint) === +export function mapStainlessOs() { + switch (platform()) { + case "darwin": return "MacOS"; + case "win32": return "Windows"; + case "linux": return "Linux"; + case "freebsd": return "FreeBSD"; + default: return `Other::${platform()}`; + } +} + +export function mapStainlessArch() { + switch (arch()) { + case "x64": return "x64"; + case "arm64": return "arm64"; + case "ia32": return "x86"; + default: return `other::${arch()}`; + } +} + +// Shared Claude-compatible API headers (reused across claude-format providers) +export const CLAUDE_API_HEADERS = { + "Anthropic-Version": "2023-06-01", + "Anthropic-Beta": "claude-code-20250219,interleaved-thinking-2025-05-14" +}; + +// Full Claude CLI fingerprint — required by providers that gate on client identity (e.g. agentrouter) +export const CLAUDE_CLI_SPOOF_HEADERS = { + "Anthropic-Version": "2023-06-01", + "Anthropic-Beta": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advanced-tool-use-2025-11-20,effort-2025-11-24,structured-outputs-2025-12-15,fast-mode-2026-02-01,redact-thinking-2026-02-12,token-efficient-tools-2026-03-28", + "Anthropic-Dangerous-Direct-Browser-Access": "true", + "User-Agent": "claude-cli/2.1.92 (external, sdk-cli)", + "X-App": "cli", + "X-Stainless-Helper-Method": "stream", + "X-Stainless-Retry-Count": "0", + "X-Stainless-Runtime-Version": "v24.14.0", + "X-Stainless-Package-Version": "0.80.0", + "X-Stainless-Runtime": "node", + "X-Stainless-Lang": "js", + "X-Stainless-Arch": mapStainlessArch(), + "X-Stainless-Os": mapStainlessOs(), + "X-Stainless-Timeout": "600" +}; + +// Shared baseUrls +export const KIMI_CODING_BASE_URL = "https://api.kimi.com/coding/v1/messages"; diff --git a/tests/__baseline__/alias-baseline.json b/tests/__baseline__/alias-baseline.json index f4786df7..0cf6a319 100644 --- a/tests/__baseline__/alias-baseline.json +++ b/tests/__baseline__/alias-baseline.json @@ -135,97 +135,97 @@ "blackbox": "blackbox" }, "idToAlias": { - "claude": "cc", - "gemini": "gemini", - "gemini-cli": "gc", - "codex": "cx", - "qwen": "qw", - "iflow": "if", - "qoder": "qd", - "antigravity": "ag", - "openrouter": "openrouter", - "openai": "openai", - "vercel-ai-gateway": "vercel-ai-gateway", - "glm": "glm", - "glm-cn": "glm-cn", - "kimi": "kimi", - "minimax": "minimax", - "minimax-cn": "minimax-cn", + "agentrouter": "agentrouter", + "ai21": "ai21", + "aimlapi": "aimlapi", "alicode": "alicode", "alicode-intl": "alicode-intl", - "volcengine-ark": "volcengine-ark", - "byteplus": "byteplus", - "github": "gh", - "kiro": "kr", - "cursor": "cu", - "kimi-coding": "kmc", - "kilocode": "kc", - "cline": "cl", - "nvidia": "nvidia", "anthropic": "anthropic", - "deepseek": "deepseek", - "commandcode": "commandcode", - "groq": "groq", - "xai": "xai", - "mistral": "mistral", - "perplexity": "perplexity", - "together": "together", - "fireworks": "fireworks", - "cerebras": "cerebras", - "cohere": "cohere", - "nebius": "nebius", - "siliconflow": "siliconflow", - "hyperbolic": "hyperbolic", - "deepgram": "deepgram", + "antigravity": "ag", "assemblyai": "assemblyai", - "nanobanana": "nanobanana", + "azure": "azure", + "baseten": "baseten", + "bazaarlink": "bazaarlink", + "blackbox": "blackbox", + "byteplus": "byteplus", + "bytez": "bytez", + "cerebras": "cerebras", "chutes": "chutes", + "claude": "cc", + "cline": "cl", + "cloudflare-ai": "cloudflare-ai", + "codebuddy": "codebuddy", + "codex": "cx", + "cohere": "cohere", + "commandcode": "commandcode", + "completions": "completions", + "cursor": "cu", + "deepgram": "deepgram", + "deepinfra": "deepinfra", + "deepseek": "deepseek", + "enally": "enally", + "fireworks": "fireworks", + "freetheai": "freetheai", + "gemini": "gemini", + "gemini-cli": "gc", + "github": "gh", + "gitlab": "gitlab", + "glhf": "glhf", + "glm": "glm", + "glm-cn": "glm-cn", + "grok-web": "grok-web", + "groq": "groq", + "hyperbolic": "hyperbolic", + "iflow": "if", + "inference-net": "inference-net", + "kilocode": "kc", + "kimi": "kimi", + "kimi-coding": "kmc", + "kiro": "kr", + "kluster": "kluster", + "lepton": "lepton", + "llm7": "llm7", + "longcat": "longcat", + "mimo-free": "mmf", + "minimax": "minimax", + "minimax-cn": "minimax-cn", + "mistral": "mistral", + "mmf": "mmf", + "modal": "modal", + "morph": "morph", + "nanobanana": "nanobanana", + "nebius": "nebius", + "nlpcloud": "nlpcloud", + "nous-research": "nous-research", + "novita": "novita", + "nscale": "nscale", + "nvidia": "nvidia", "ollama": "ollama", "ollama-local": "ollama-local", - "vertex": "vertex", - "vertex-partner": "vertex-partner", - "gitlab": "gitlab", - "codebuddy": "codebuddy", + "openai": "openai", "opencode": "oc", "opencode-go": "opencode-go", - "grok-web": "grok-web", + "openrouter": "openrouter", + "perplexity": "perplexity", "perplexity-web": "perplexity-web", - "azure": "azure", - "cloudflare-ai": "cloudflare-ai", - "xiaomi-mimo": "xiaomi-mimo", - "mimo-free": "mmf", - "mmf": "mmf", - "xiaomi-tokenplan": "xiaomi-tokenplan", - "agentrouter": "agentrouter", - "aimlapi": "aimlapi", - "novita": "novita", - "modal": "modal", - "reka": "reka", - "nlpcloud": "nlpcloud", - "bazaarlink": "bazaarlink", - "completions": "completions", - "enally": "enally", - "freetheai": "freetheai", - "llm7": "llm7", - "lepton": "lepton", - "kluster": "kluster", - "ai21": "ai21", - "inference-net": "inference-net", "predibase": "predibase", - "bytez": "bytez", - "morph": "morph", - "longcat": "longcat", - "puter": "puter", - "uncloseai": "uncloseai", - "scaleway": "scaleway", - "deepinfra": "deepinfra", - "sambanova": "sambanova", - "nscale": "nscale", - "baseten": "baseten", "publicai": "publicai", - "nous-research": "nous-research", - "glhf": "glhf", - "blackbox": "blackbox" + "puter": "puter", + "qoder": "qd", + "qwen": "qw", + "reka": "reka", + "sambanova": "sambanova", + "scaleway": "scaleway", + "siliconflow": "siliconflow", + "together": "together", + "uncloseai": "uncloseai", + "vercel-ai-gateway": "vercel-ai-gateway", + "vertex": "vertex", + "vertex-partner": "vertex-partner", + "volcengine-ark": "volcengine-ark", + "xai": "xai", + "xiaomi-mimo": "xiaomi-mimo", + "xiaomi-tokenplan": "xiaomi-tokenplan" }, "modelKeys": [ "ag", diff --git a/tests/__baseline__/verify-alias.mjs b/tests/__baseline__/verify-alias.mjs index d7d7bdd9..d92da296 100644 --- a/tests/__baseline__/verify-alias.mjs +++ b/tests/__baseline__/verify-alias.mjs @@ -25,9 +25,13 @@ const ALIAS_TOKENS = [ "sambanova","samba","nscale","baseten","publicai","nous-research","nous","glhf","bb","blackbox", ]; +// Sort idToAlias by key — runtime accesses by key, order is irrelevant (content-based) +const sortedIdToAlias = Object.fromEntries( + Object.keys(PROVIDER_ID_TO_ALIAS).sort().map(k => [k, PROVIDER_ID_TO_ALIAS[k]]) +); const resolved = { aliasToId: Object.fromEntries(ALIAS_TOKENS.map(a => [a, resolveProviderAlias(a)])), - idToAlias: PROVIDER_ID_TO_ALIAS, + idToAlias: sortedIdToAlias, modelKeys: Object.keys(PROVIDER_MODELS).sort(), }; const current = JSON.parse(JSON.stringify(resolved));