mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-07 15:52:52 +03:00
562 lines
13 KiB
TypeScript
562 lines
13 KiB
TypeScript
// Provider definitions
|
|
|
|
// Free Providers
|
|
export const FREE_PROVIDERS = {
|
|
iflow: { id: "iflow", alias: "if", name: "iFlow AI", icon: "water_drop", color: "#6366F1" },
|
|
qwen: { id: "qwen", alias: "qw", name: "Qwen Code", icon: "psychology", color: "#10B981" },
|
|
"gemini-cli": {
|
|
id: "gemini-cli",
|
|
alias: "gc",
|
|
name: "Gemini CLI",
|
|
icon: "terminal",
|
|
color: "#4285F4",
|
|
},
|
|
kiro: { id: "kiro", alias: "kr", name: "Kiro AI", icon: "psychology_alt", color: "#FF6B35" },
|
|
};
|
|
|
|
// OAuth Providers
|
|
export const OAUTH_PROVIDERS = {
|
|
claude: { id: "claude", alias: "cc", name: "Claude Code", icon: "smart_toy", color: "#D97757" },
|
|
antigravity: {
|
|
id: "antigravity",
|
|
alias: "ag",
|
|
name: "Antigravity",
|
|
icon: "rocket_launch",
|
|
color: "#F59E0B",
|
|
},
|
|
codex: { id: "codex", alias: "cx", name: "OpenAI Codex", icon: "code", color: "#3B82F6" },
|
|
github: { id: "github", alias: "gh", name: "GitHub Copilot", icon: "code", color: "#333333" },
|
|
cursor: { id: "cursor", alias: "cu", name: "Cursor IDE", icon: "edit_note", color: "#00D4AA" },
|
|
"kimi-coding": {
|
|
id: "kimi-coding",
|
|
alias: "kmc",
|
|
name: "Kimi Coding",
|
|
icon: "psychology",
|
|
color: "#1E40AF",
|
|
textIcon: "KC",
|
|
},
|
|
kilocode: {
|
|
id: "kilocode",
|
|
alias: "kc",
|
|
name: "Kilo Code",
|
|
icon: "code",
|
|
color: "#FF6B35",
|
|
textIcon: "KC",
|
|
},
|
|
cline: {
|
|
id: "cline",
|
|
alias: "cl",
|
|
name: "Cline",
|
|
icon: "smart_toy",
|
|
color: "#5B9BD5",
|
|
textIcon: "CL",
|
|
},
|
|
};
|
|
|
|
// API Key Providers
|
|
export const APIKEY_PROVIDERS = {
|
|
openrouter: {
|
|
id: "openrouter",
|
|
alias: "openrouter",
|
|
name: "OpenRouter",
|
|
icon: "router",
|
|
color: "#F97316",
|
|
textIcon: "OR",
|
|
passthroughModels: true,
|
|
website: "https://openrouter.ai",
|
|
},
|
|
glm: {
|
|
id: "glm",
|
|
alias: "glm",
|
|
name: "GLM Coding",
|
|
icon: "code",
|
|
color: "#2563EB",
|
|
textIcon: "GL",
|
|
website: "https://open.bigmodel.cn",
|
|
},
|
|
"bailian-coding-plan": {
|
|
id: "bailian-coding-plan",
|
|
alias: "bcp",
|
|
name: "Alibaba Coding Plan",
|
|
icon: "code",
|
|
color: "#FF6A00",
|
|
textIcon: "BCP",
|
|
website: "https://www.alibabacloud.com/help/en/model-studio/coding-plan",
|
|
},
|
|
kimi: {
|
|
id: "kimi",
|
|
alias: "kimi",
|
|
name: "Kimi",
|
|
icon: "psychology",
|
|
color: "#1E3A8A",
|
|
textIcon: "KM",
|
|
website: "https://kimi.moonshot.cn",
|
|
},
|
|
"kimi-coding-apikey": {
|
|
id: "kimi-coding-apikey",
|
|
alias: "kmca",
|
|
name: "Kimi Coding (API Key)",
|
|
icon: "psychology",
|
|
color: "#1E40AF",
|
|
textIcon: "KC",
|
|
website: "https://kimi.com",
|
|
},
|
|
minimax: {
|
|
id: "minimax",
|
|
alias: "minimax",
|
|
name: "Minimax Coding",
|
|
icon: "memory",
|
|
color: "#7C3AED",
|
|
textIcon: "MM",
|
|
website: "https://www.minimaxi.com",
|
|
},
|
|
"minimax-cn": {
|
|
id: "minimax-cn",
|
|
alias: "minimax-cn",
|
|
name: "Minimax (China)",
|
|
icon: "memory",
|
|
color: "#DC2626",
|
|
textIcon: "MC",
|
|
website: "https://www.minimaxi.com",
|
|
},
|
|
alicode: {
|
|
id: "alicode",
|
|
alias: "alicode",
|
|
name: "Alibaba",
|
|
icon: "cloud",
|
|
color: "#FF6A00",
|
|
textIcon: "ALi",
|
|
website: "https://bailian.console.aliyun.com",
|
|
},
|
|
"alicode-intl": {
|
|
id: "alicode-intl",
|
|
alias: "alicode-intl",
|
|
name: "Alibaba Intl",
|
|
icon: "cloud",
|
|
color: "#FF6A00",
|
|
textIcon: "ALi",
|
|
website: "https://modelstudio.console.alibabacloud.com",
|
|
},
|
|
openai: {
|
|
id: "openai",
|
|
alias: "openai",
|
|
name: "OpenAI",
|
|
icon: "auto_awesome",
|
|
color: "#10A37F",
|
|
textIcon: "OA",
|
|
website: "https://platform.openai.com",
|
|
},
|
|
anthropic: {
|
|
id: "anthropic",
|
|
alias: "anthropic",
|
|
name: "Anthropic",
|
|
icon: "smart_toy",
|
|
color: "#D97757",
|
|
textIcon: "AN",
|
|
website: "https://console.anthropic.com",
|
|
},
|
|
gemini: {
|
|
id: "gemini",
|
|
alias: "gemini",
|
|
name: "Gemini",
|
|
icon: "diamond",
|
|
color: "#4285F4",
|
|
textIcon: "GE",
|
|
website: "https://ai.google.dev",
|
|
},
|
|
deepseek: {
|
|
id: "deepseek",
|
|
alias: "ds",
|
|
name: "DeepSeek",
|
|
icon: "bolt",
|
|
color: "#4D6BFE",
|
|
textIcon: "DS",
|
|
website: "https://deepseek.com",
|
|
},
|
|
groq: {
|
|
id: "groq",
|
|
alias: "groq",
|
|
name: "Groq",
|
|
icon: "speed",
|
|
color: "#F55036",
|
|
textIcon: "GQ",
|
|
website: "https://groq.com",
|
|
hasFree: true,
|
|
freeNote: "Free tier: 30 RPM / 14.4K RPD — no credit card",
|
|
},
|
|
blackbox: {
|
|
id: "blackbox",
|
|
alias: "bb",
|
|
name: "Blackbox AI",
|
|
icon: "view_in_ar",
|
|
color: "#1A1A2E",
|
|
textIcon: "BB",
|
|
website: "https://blackbox.ai",
|
|
},
|
|
xai: {
|
|
id: "xai",
|
|
alias: "xai",
|
|
name: "xAI (Grok)",
|
|
icon: "auto_awesome",
|
|
color: "#1DA1F2",
|
|
textIcon: "XA",
|
|
website: "https://x.ai",
|
|
},
|
|
mistral: {
|
|
id: "mistral",
|
|
alias: "mistral",
|
|
name: "Mistral",
|
|
icon: "air",
|
|
color: "#FF7000",
|
|
textIcon: "MI",
|
|
website: "https://mistral.ai",
|
|
},
|
|
perplexity: {
|
|
id: "perplexity",
|
|
alias: "pplx",
|
|
name: "Perplexity",
|
|
icon: "search",
|
|
color: "#20808D",
|
|
textIcon: "PP",
|
|
website: "https://www.perplexity.ai",
|
|
},
|
|
together: {
|
|
id: "together",
|
|
alias: "together",
|
|
name: "Together AI",
|
|
icon: "group_work",
|
|
color: "#0F6FFF",
|
|
textIcon: "TG",
|
|
website: "https://www.together.ai",
|
|
},
|
|
fireworks: {
|
|
id: "fireworks",
|
|
alias: "fireworks",
|
|
name: "Fireworks AI",
|
|
icon: "local_fire_department",
|
|
color: "#7B2EF2",
|
|
textIcon: "FW",
|
|
website: "https://fireworks.ai",
|
|
},
|
|
cerebras: {
|
|
id: "cerebras",
|
|
alias: "cerebras",
|
|
name: "Cerebras",
|
|
icon: "memory",
|
|
color: "#FF4F00",
|
|
textIcon: "CB",
|
|
website: "https://inference.cerebras.ai",
|
|
hasFree: true,
|
|
freeNote: "Free: 1M tokens/day, 60K TPM — world's fastest inference",
|
|
},
|
|
cohere: {
|
|
id: "cohere",
|
|
alias: "cohere",
|
|
name: "Cohere",
|
|
icon: "hub",
|
|
color: "#39594D",
|
|
textIcon: "CO",
|
|
website: "https://cohere.com",
|
|
},
|
|
nvidia: {
|
|
id: "nvidia",
|
|
alias: "nvidia",
|
|
name: "NVIDIA NIM",
|
|
icon: "developer_board",
|
|
color: "#76B900",
|
|
textIcon: "NV",
|
|
website: "https://build.nvidia.com",
|
|
hasFree: true,
|
|
freeNote: "Free dev access: ~40 RPM, 70+ models (Kimi K2.5, GLM 4.7, DeepSeek V3.2...)",
|
|
},
|
|
nebius: {
|
|
id: "nebius",
|
|
alias: "nebius",
|
|
name: "Nebius AI",
|
|
icon: "cloud",
|
|
color: "#6C5CE7",
|
|
textIcon: "NB",
|
|
website: "https://nebius.com",
|
|
},
|
|
siliconflow: {
|
|
id: "siliconflow",
|
|
alias: "siliconflow",
|
|
name: "SiliconFlow",
|
|
icon: "cloud_queue",
|
|
color: "#5B6EF5",
|
|
textIcon: "SF",
|
|
website: "https://cloud.siliconflow.com",
|
|
},
|
|
hyperbolic: {
|
|
id: "hyperbolic",
|
|
alias: "hyp",
|
|
name: "Hyperbolic",
|
|
icon: "bolt",
|
|
color: "#00D4FF",
|
|
textIcon: "HY",
|
|
website: "https://hyperbolic.xyz",
|
|
},
|
|
deepgram: {
|
|
id: "deepgram",
|
|
alias: "dg",
|
|
name: "Deepgram",
|
|
icon: "mic",
|
|
color: "#13EF93",
|
|
textIcon: "DG",
|
|
website: "https://deepgram.com",
|
|
},
|
|
assemblyai: {
|
|
id: "assemblyai",
|
|
alias: "aai",
|
|
name: "AssemblyAI",
|
|
icon: "record_voice_over",
|
|
color: "#0062FF",
|
|
textIcon: "AA",
|
|
website: "https://assemblyai.com",
|
|
},
|
|
nanobanana: {
|
|
id: "nanobanana",
|
|
alias: "nb",
|
|
name: "NanoBanana",
|
|
icon: "image",
|
|
color: "#FFD700",
|
|
textIcon: "NB",
|
|
website: "https://nanobananaapi.ai",
|
|
},
|
|
"ollama-cloud": {
|
|
id: "ollama-cloud",
|
|
alias: "ollamacloud",
|
|
name: "Ollama Cloud",
|
|
icon: "cloud",
|
|
color: "#58A6FF",
|
|
textIcon: "OC",
|
|
website: "https://ollama.com/settings/api-keys",
|
|
},
|
|
elevenlabs: {
|
|
id: "elevenlabs",
|
|
alias: "el",
|
|
name: "ElevenLabs",
|
|
icon: "record_voice_over",
|
|
color: "#6C47FF",
|
|
textIcon: "EL",
|
|
website: "https://elevenlabs.io",
|
|
},
|
|
cartesia: {
|
|
id: "cartesia",
|
|
alias: "cartesia",
|
|
name: "Cartesia",
|
|
icon: "spatial_audio",
|
|
color: "#FF4F8B",
|
|
textIcon: "CA",
|
|
website: "https://cartesia.ai",
|
|
},
|
|
playht: {
|
|
id: "playht",
|
|
alias: "playht",
|
|
name: "PlayHT",
|
|
icon: "play_circle",
|
|
color: "#00B4D8",
|
|
textIcon: "PH",
|
|
website: "https://play.ht",
|
|
},
|
|
inworld: {
|
|
id: "inworld",
|
|
alias: "inworld",
|
|
name: "Inworld",
|
|
icon: "voice_chat",
|
|
color: "#7B2EF2",
|
|
textIcon: "IW",
|
|
website: "https://inworld.ai",
|
|
},
|
|
sdwebui: {
|
|
id: "sdwebui",
|
|
alias: "sdwebui",
|
|
name: "SD WebUI",
|
|
icon: "brush",
|
|
color: "#FF7043",
|
|
textIcon: "SD",
|
|
website: "https://github.com/AUTOMATIC1111/stable-diffusion-webui",
|
|
},
|
|
comfyui: {
|
|
id: "comfyui",
|
|
alias: "comfyui",
|
|
name: "ComfyUI",
|
|
icon: "account_tree",
|
|
color: "#4CAF50",
|
|
textIcon: "CF",
|
|
website: "https://github.com/comfyanonymous/ComfyUI",
|
|
},
|
|
huggingface: {
|
|
id: "huggingface",
|
|
alias: "hf",
|
|
name: "HuggingFace",
|
|
icon: "face",
|
|
color: "#FFD21E",
|
|
textIcon: "HF",
|
|
website: "https://huggingface.co",
|
|
hasFree: true,
|
|
freeNote: "Free Inference API for thousands of models (Whisper, VITS, SDXL…)",
|
|
},
|
|
synthetic: {
|
|
id: "synthetic",
|
|
alias: "synthetic",
|
|
name: "Synthetic",
|
|
icon: "verified_user",
|
|
color: "#6366F1",
|
|
textIcon: "SY",
|
|
website: "https://synthetic.new",
|
|
passthroughModels: true,
|
|
},
|
|
"kilo-gateway": {
|
|
id: "kilo-gateway",
|
|
alias: "kg",
|
|
name: "Kilo Gateway",
|
|
icon: "hub",
|
|
color: "#617A91",
|
|
textIcon: "KG",
|
|
website: "https://kilo.ai",
|
|
passthroughModels: true,
|
|
},
|
|
vertex: {
|
|
id: "vertex",
|
|
alias: "vertex",
|
|
name: "Vertex AI",
|
|
icon: "cloud",
|
|
color: "#4285F4",
|
|
textIcon: "VA",
|
|
website: "https://cloud.google.com/vertex-ai",
|
|
authHint: "Provide Service Account JSON or OAuth access_token",
|
|
},
|
|
zai: {
|
|
id: "zai",
|
|
alias: "zai",
|
|
name: "Z.AI (GLM-5)",
|
|
icon: "psychology",
|
|
color: "#2563EB",
|
|
textIcon: "ZA",
|
|
website: "https://open.bigmodel.cn",
|
|
apiHint: "API key from https://open.bigmodel.cn/usercenter/apikeys",
|
|
},
|
|
"perplexity-search": {
|
|
id: "perplexity-search",
|
|
alias: "pplx-search",
|
|
name: "Perplexity Search",
|
|
icon: "search",
|
|
color: "#20808D",
|
|
textIcon: "PS",
|
|
website: "https://docs.perplexity.ai/guides/search-quickstart",
|
|
authHint: "Same API key as Perplexity (pplx-...)",
|
|
},
|
|
"serper-search": {
|
|
id: "serper-search",
|
|
alias: "serper-search",
|
|
name: "Serper Search",
|
|
icon: "search",
|
|
color: "#4285F4",
|
|
textIcon: "SP",
|
|
website: "https://serper.dev",
|
|
authHint: "API key from serper.dev dashboard",
|
|
},
|
|
"brave-search": {
|
|
id: "brave-search",
|
|
alias: "brave-search",
|
|
name: "Brave Search",
|
|
icon: "travel_explore",
|
|
color: "#FB542B",
|
|
textIcon: "BR",
|
|
website: "https://brave.com/search/api",
|
|
authHint: "Subscription token from Brave Search API dashboard",
|
|
},
|
|
"exa-search": {
|
|
id: "exa-search",
|
|
alias: "exa-search",
|
|
name: "Exa Search",
|
|
icon: "neurology",
|
|
color: "#1E40AF",
|
|
textIcon: "EX",
|
|
website: "https://exa.ai",
|
|
authHint: "API key from dashboard.exa.ai",
|
|
},
|
|
"tavily-search": {
|
|
id: "tavily-search",
|
|
alias: "tavily-search",
|
|
name: "Tavily Search",
|
|
icon: "manage_search",
|
|
color: "#5B4FDB",
|
|
textIcon: "TV",
|
|
website: "https://tavily.com",
|
|
authHint: "API key from app.tavily.com (format: tvly-...)",
|
|
},
|
|
};
|
|
|
|
export const OPENAI_COMPATIBLE_PREFIX = "openai-compatible-";
|
|
export const ANTHROPIC_COMPATIBLE_PREFIX = "anthropic-compatible-";
|
|
|
|
export function isOpenAICompatibleProvider(providerId) {
|
|
return typeof providerId === "string" && providerId.startsWith(OPENAI_COMPATIBLE_PREFIX);
|
|
}
|
|
|
|
export function isAnthropicCompatibleProvider(providerId) {
|
|
return typeof providerId === "string" && providerId.startsWith(ANTHROPIC_COMPATIBLE_PREFIX);
|
|
}
|
|
|
|
// All providers (combined)
|
|
export const AI_PROVIDERS = { ...FREE_PROVIDERS, ...OAUTH_PROVIDERS, ...APIKEY_PROVIDERS };
|
|
|
|
// Auth methods
|
|
export const AUTH_METHODS = {
|
|
oauth: { id: "oauth", name: "OAuth", icon: "lock" },
|
|
apikey: { id: "apikey", name: "API Key", icon: "key" },
|
|
};
|
|
|
|
// Helper: Get provider by alias
|
|
export function getProviderByAlias(alias) {
|
|
for (const provider of Object.values(AI_PROVIDERS)) {
|
|
if (provider.alias === alias || provider.id === alias) {
|
|
return provider;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Helper: Get provider ID from alias
|
|
export function resolveProviderId(aliasOrId) {
|
|
const provider = getProviderByAlias(aliasOrId);
|
|
return provider?.id || aliasOrId;
|
|
}
|
|
|
|
// Helper: Get alias from provider ID
|
|
export function getProviderAlias(providerId) {
|
|
const provider = AI_PROVIDERS[providerId];
|
|
return provider?.alias || providerId;
|
|
}
|
|
|
|
// Alias to ID mapping (for quick lookup)
|
|
export const ALIAS_TO_ID = Object.values(AI_PROVIDERS).reduce((acc, p) => {
|
|
acc[p.alias] = p.id;
|
|
return acc;
|
|
}, {});
|
|
|
|
// ID to Alias mapping
|
|
export const ID_TO_ALIAS = Object.values(AI_PROVIDERS).reduce((acc, p) => {
|
|
acc[p.id] = p.alias;
|
|
return acc;
|
|
}, {});
|
|
|
|
// Providers that support usage/quota API
|
|
export const USAGE_SUPPORTED_PROVIDERS = [
|
|
"antigravity",
|
|
"kiro",
|
|
"github",
|
|
"codex",
|
|
"claude",
|
|
"kimi-coding",
|
|
];
|
|
|
|
// ── Zod validation at module load (Phase 7.2) ──
|
|
import { validateProviders } from "../validation/providerSchema";
|
|
|
|
validateProviders(FREE_PROVIDERS, "FREE_PROVIDERS");
|
|
validateProviders(OAUTH_PROVIDERS, "OAUTH_PROVIDERS");
|
|
validateProviders(APIKEY_PROVIDERS, "APIKEY_PROVIDERS");
|