2026-01-04 21:58:59 -05:00
// Provider definitions
2026-05-15 23:54:41 -04:00
const RISK _NOTICE = "⚠️ Risk Notice: This provider uses a subscription/OAuth session not officially licensed for proxy/router use. Account may be restricted or banned. Use at your own risk." ;
2026-03-30 00:28:07 -04:00
// Free Providers (kiro first, iflow last)
2026-02-06 23:17:06 -05:00
export const FREE _PROVIDERS = {
2026-05-03 07:00:35 -04:00
kiro : { id : "kiro" , alias : "kr" , name : "Kiro AI" , icon : "psychology_alt" , color : "#FF6B35" , website : "https://kiro.dev" , notice : { signupUrl : "https://kiro.dev" } } ,
2026-05-15 23:54:41 -04:00
qwen : { id : "qwen" , alias : "qw" , name : "Qwen Code" , icon : "psychology" , color : "#10B981" , mediaPriority : 999 , hidden : true , deprecated : true , deprecationNotice : "Qwen OAuth free tier was discontinued by Alibaba on 2026-04-15. New connections will not work." , website : "https://chat.qwen.ai" , notice : { signupUrl : "https://chat.qwen.ai" } , serviceKinds : [ "llm" , "tts" ] , ttsConfig : { baseUrl : "http://localhost:8000/v1/audio/speech" , authType : "none" , authHeader : "none" , format : "openai" , models : [ { id : "qwen3-tts" , name : "Qwen3 TTS" } ] } } ,
"gemini-cli" : { id : "gemini-cli" , alias : "gc" , name : "Gemini CLI" , icon : "terminal" , color : "#4285F4" , deprecated : true , deprecationNotice : RISK _NOTICE , website : "https://github.com/google-gemini/gemini-cli" , notice : { signupUrl : "https://github.com/google-gemini/gemini-cli" } } ,
2026-03-30 00:28:07 -04:00
// gitlab: { id: "gitlab", alias: "gl", name: "GitLab Duo", icon: "code", color: "#FC6D26" },
// codebuddy: { id: "codebuddy", alias: "cb", name: "CodeBuddy", icon: "smart_toy", color: "#006EFF" },
2026-03-31 04:41:52 -04:00
// qoder: { id: "qoder", alias: "qd", name: "Qoder AI", icon: "water_drop", color: "#EC4899" },
2026-05-15 23:54:41 -04:00
iflow : { id : "iflow" , alias : "if" , name : "iFlow AI" , icon : "water_drop" , color : "#6366F1" , hidden : true , website : "https://iflow.cn" , notice : { signupUrl : "https://iflow.cn" } } ,
2026-04-22 03:16:21 -04:00
opencode : { id : "opencode" , alias : "oc" , name : "OpenCode Free" , icon : "terminal" , color : "#E87040" , textIcon : "OC" , noAuth : true , passthroughModels : true , modelsFetcher : { url : "https://opencode.ai/zen/v1/models" , type : "opencode-free" } } ,
2026-03-30 00:28:07 -04:00
} ;
// Free Tier Providers (has free access but may require account/API key)
export const FREE _TIER _PROVIDERS = {
2026-04-29 00:34:39 -04:00
openrouter : { id : "openrouter" , alias : "openrouter" , name : "OpenRouter" , icon : "router" , color : "#F97316" , textIcon : "OR" , website : "https://openrouter.ai" , notice : { text : "Free tier: 27+ free models, no credit card needed, 200 req/day. After $10 credit: 1,000 req/day." , apiKeyUrl : "https://openrouter.ai/settings/keys" } , modelsFetcher : { url : "https://openrouter.ai/api/v1/models" , type : "openrouter-free" } , passthroughModels : true , serviceKinds : [ "llm" , "embedding" , "tts" , "imageToText" ] , embeddingConfig : { baseUrl : "https://openrouter.ai/api/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "openai/text-embedding-3-small" , name : "Text Embedding 3 Small (OpenRouter)" , dimensions : 1536 } , { id : "openai/text-embedding-3-large" , name : "Text Embedding 3 Large (OpenRouter)" , dimensions : 3072 } , { id : "openai/text-embedding-ada-002" , name : "Text Embedding Ada 002 (OpenRouter)" , dimensions : 1536 } ] } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
nvidia : { id : "nvidia" , alias : "nvidia" , name : "NVIDIA NIM" , icon : "developer_board" , color : "#76B900" , textIcon : "NV" , website : "https://developer.nvidia.com/nim" , notice : { text : "Free access for NVIDIA Developer Program members (prototyping & testing)." , apiKeyUrl : "https://build.nvidia.com/settings/api-keys" } , serviceKinds : [ "llm" , "tts" , "embedding" ] , ttsConfig : { baseUrl : "https://integrate.api.nvidia.com/v1/audio/speech" , authType : "apikey" , authHeader : "bearer" , format : "nvidia-tts" , models : [ { id : "fastpitch" , name : "FastPitch" } , { id : "tacotron2" , name : "Tacotron2" } ] } , embeddingConfig : { baseUrl : "https://integrate.api.nvidia.com/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "nvidia/nv-embedqa-e5-v5" , name : "NV EmbedQA E5 v5" , dimensions : 1024 } ] } } ,
2026-03-31 04:41:52 -04:00
ollama : { id : "ollama" , alias : "ollama" , name : "Ollama Cloud" , icon : "cloud" , color : "#ffffffff" , textIcon : "OL" , website : "https://ollama.com" , notice : { text : "Free tier: light usage, 1 cloud model at a time (limits reset every 5h & 7d). Pro $20/mo · Max $100/mo." , apiKeyUrl : "https://ollama.com/settings/keys" } } ,
2026-03-30 00:28:07 -04:00
vertex : { id : "vertex" , alias : "vx" , name : "Vertex AI" , icon : "cloud" , color : "#4285F4" , textIcon : "VX" , website : "https://cloud.google.com/vertex-ai" , notice : { text : "New Google Cloud accounts get $300 free credits. Requires GCP project + Service Account with Vertex AI API enabled." , apiKeyUrl : "https://console.cloud.google.com/iam-admin/serviceaccounts" } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
gemini : { id : "gemini" , alias : "gemini" , name : "Gemini" , icon : "diamond" , color : "#4285F4" , textIcon : "GE" , mediaPriority : 1 , website : "https://ai.google.dev" , notice : { apiKeyUrl : "https://aistudio.google.com/app/apikey" } , serviceKinds : [ "llm" , "embedding" , "image" , "imageToText" , "webSearch" , "tts" , "stt" ] , sttConfig : { baseUrl : "https://generativelanguage.googleapis.com/v1beta/models" , authType : "apikey" , authHeader : "key" , format : "gemini-stt" , models : [ { id : "gemini-2.5-pro" , name : "Gemini 2.5 Pro (Best)" } , { id : "gemini-2.5-flash" , name : "Gemini 2.5 Flash" } , { id : "gemini-2.5-flash-lite" , name : "Gemini 2.5 Flash Lite (Cheapest)" } , { id : "gemini-2.0-flash" , name : "Gemini 2.0 Flash" } ] } , searchViaChat : { defaultModel : "gemini-2.5-flash" , pricingUrl : "https://ai.google.dev/pricing" , freeTier : "Free tier: 15 RPM, 1M tokens/day on gemini-2.5-flash via AI Studio." } , embeddingConfig : { baseUrl : "https://generativelanguage.googleapis.com/v1beta/models" , authType : "apikey" , authHeader : "key" , models : [ { id : "text-embedding-004" , name : "Text Embedding 004" , dimensions : 768 } , { id : "embedding-001" , name : "Embedding 001" , dimensions : 768 } ] } , ttsConfig : { baseUrl : "https://generativelanguage.googleapis.com/v1beta/models" , authType : "apikey" , authHeader : "key" , format : "gemini-tts" , models : [ { id : "gemini-2.5-flash-preview-tts" , name : "Gemini 2.5 Flash TTS" } , { id : "gemini-2.5-pro-preview-tts" , name : "Gemini 2.5 Pro TTS" } ] } } ,
2026-05-08 22:53:39 -04:00
"cloudflare-ai" : { id : "cloudflare-ai" , alias : "cf" , name : "Cloudflare" , icon : "cloud" , color : "#F38020" , textIcon : "CF" , website : "https://developers.cloudflare.com/workers-ai/" , notice : { text : "Workers AI free tier. Requires a Cloudflare API token and Account ID." , apiKeyUrl : "https://dash.cloudflare.com/profile/api-tokens" } , serviceKinds : [ "llm" , "image" ] , hasProviderSpecificData : true } ,
2026-04-25 06:04:48 -04:00
byteplus : { id : "byteplus" , alias : "bpm" , name : "BytePlus ModelArk" , icon : "cloud" , color : "#2563EB" , textIcon : "BP" , website : "https://console.byteplus.com/ark" , notice : { text : "Free credits for new accounts. Access to Seed 2.0, Kimi K2 Thinking, GLM 4.7, GPT-OSS-120B models." , apiKeyUrl : "https://console.byteplus.com/ark/region:ark+ap-southeast-1/apiKey" } , serviceKinds : [ "llm" ] } ,
2026-02-06 23:17:06 -05:00
} ;
2026-04-13 01:04:57 -04:00
// Thinking config definitions
// options: list of selectable modes ("auto" = no override from server)
// defaultMode: fallback when user hasn't configured
// extended: claude-style thinking (thinking.type + budget_tokens) — used by most providers
// effort: openai-style reasoning_effort — only openai + codex
export const THINKING _CONFIG = {
extended : {
options : [ "auto" , "on" , "off" ] ,
defaultMode : "auto" ,
defaultBudgetTokens : 10000
} ,
effort : {
options : [ "auto" , "none" , "low" , "medium" , "high" ] ,
defaultMode : "auto"
}
} ;
2026-05-13 04:34:10 -04:00
const MINIMAX _TTS _MODELS = [
{ id : "speech-2.8-hd" , name : "Speech 2.8 HD" } ,
{ id : "speech-2.8-turbo" , name : "Speech 2.8 Turbo" } ,
{ id : "speech-2.6-hd" , name : "Speech 2.6 HD" } ,
{ id : "speech-2.6-turbo" , name : "Speech 2.6 Turbo" } ,
{ id : "speech-02-hd" , name : "Speech 02 HD" } ,
{ id : "speech-02-turbo" , name : "Speech 02 Turbo" } ,
{ id : "speech-01-hd" , name : "Speech 01 HD" } ,
{ id : "speech-01-turbo" , name : "Speech 01 Turbo" } ,
] ;
2026-01-04 21:58:59 -05:00
// OAuth Providers
export const OAUTH _PROVIDERS = {
2026-05-15 23:54:41 -04:00
claude : { id : "claude" , alias : "cc" , name : "Claude Code" , icon : "smart_toy" , color : "#D97757" , deprecated : true , deprecationNotice : RISK _NOTICE , website : "https://claude.ai" , notice : { signupUrl : "https://claude.ai" } } ,
antigravity : { id : "antigravity" , alias : "ag" , name : "Antigravity" , icon : "rocket_launch" , color : "#F59E0B" , hidden : true , deprecated : true , deprecationNotice : "AG is designed exclusively for Antigravity IDE. Using it with other tools (OpenClaw, Claude, Codex...) may result in account restrictions or bans." , website : "https://antigravity.google" , notice : { signupUrl : "https://antigravity.google" } } ,
codex : { id : "codex" , alias : "cx" , name : "OpenAI Codex" , icon : "code" , color : "#3B82F6" , deprecated : true , deprecationNotice : RISK _NOTICE , thinkingConfig : THINKING _CONFIG . effort , serviceKinds : [ "llm" , "image" ] , kindNotice : { image : "Requires a ChatGPT Plus (or higher) account. Free accounts are not supported for image generation." } , website : "https://chatgpt.com/codex" , notice : { signupUrl : "https://chatgpt.com/codex" } } ,
github : { id : "github" , alias : "gh" , name : "GitHub Copilot" , icon : "code" , color : "#333333" , deprecated : true , deprecationNotice : RISK _NOTICE , serviceKinds : [ "llm" , "embedding" ] , embeddingConfig : { baseUrl : "https://models.github.ai/inference/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "text-embedding-3-small" , name : "Text Embedding 3 Small (GitHub)" , dimensions : 1536 } , { id : "text-embedding-3-large" , name : "Text Embedding 3 Large (GitHub)" , dimensions : 3072 } ] } , website : "https://github.com/features/copilot" , notice : { signupUrl : "https://github.com/features/copilot" } } ,
2026-05-03 07:00:35 -04:00
cursor : { id : "cursor" , alias : "cu" , name : "Cursor IDE" , icon : "edit_note" , color : "#00D4AA" , website : "https://cursor.com" , notice : { signupUrl : "https://cursor.com" } } ,
2026-03-11 23:48:11 -04:00
// "kimi-coding": { id: "kimi-coding", alias: "kmc", name: "Kimi Coding", icon: "psychology", color: "#1E40AF", textIcon: "KC" },
2026-05-03 07:00:35 -04:00
kilocode : { id : "kilocode" , alias : "kc" , name : "Kilo Code" , icon : "code" , color : "#FF6B35" , textIcon : "KC" , website : "https://kilocode.ai" , notice : { signupUrl : "https://kilocode.ai" } } ,
cline : { id : "cline" , alias : "cl" , name : "Cline" , icon : "smart_toy" , color : "#5B9BD5" , textIcon : "CL" , website : "https://cline.bot" , notice : { signupUrl : "https://cline.bot" } } ,
2026-03-30 00:28:07 -04:00
// opencode: { id: "opencode", alias: "oc", name: "OpenCode", icon: "terminal", color: "#E87040", textIcon: "OC" },
2026-01-04 21:58:59 -05:00
} ;
export const APIKEY _PROVIDERS = {
2026-05-01 06:03:13 -04:00
glm : { id : "glm" , alias : "glm" , name : "GLM Coding" , icon : "code" , color : "#2563EB" , textIcon : "GL" , website : "https://open.bigmodel.cn" , notice : { apiKeyUrl : "https://open.bigmodel.cn/usercenter/apikeys" } } ,
"glm-cn" : { id : "glm-cn" , alias : "glm-cn" , name : "GLM (China)" , icon : "code" , color : "#DC2626" , textIcon : "GC" , website : "https://open.bigmodel.cn" , notice : { apiKeyUrl : "https://open.bigmodel.cn/usercenter/apikeys" } } ,
kimi : { id : "kimi" , alias : "kimi" , name : "Kimi" , icon : "psychology" , color : "#1E3A8A" , textIcon : "KM" , website : "https://kimi.moonshot.cn" , notice : { apiKeyUrl : "https://platform.moonshot.ai/console/api-keys" } , serviceKinds : [ "llm" , "webSearch" ] , searchViaChat : { defaultModel : "kimi-k2.5" , pricingUrl : "https://platform.moonshot.ai/docs/pricing/chat" } } ,
2026-05-13 04:34:10 -04:00
minimax : { id : "minimax" , alias : "minimax" , name : "Minimax Coding" , icon : "memory" , color : "#7C3AED" , textIcon : "MM" , website : "https://www.minimaxi.com" , notice : { apiKeyUrl : "https://platform.minimaxi.com/user-center/basic-information/interface-key" } , serviceKinds : [ "llm" , "image" , "imageToText" , "webSearch" , "tts" ] , searchViaChat : { defaultModel : "MiniMax-M2.7" , pricingUrl : "https://www.minimaxi.com/document/price" } , ttsConfig : { baseUrl : "https://api.minimax.io/v1/t2a_v2" , authType : "apikey" , authHeader : "bearer" , format : "minimax-tts" , models : MINIMAX _TTS _MODELS } } ,
"minimax-cn" : { id : "minimax-cn" , alias : "minimax-cn" , name : "Minimax (China)" , icon : "memory" , color : "#DC2626" , textIcon : "MC" , website : "https://www.minimaxi.com" , notice : { apiKeyUrl : "https://platform.minimaxi.com/user-center/basic-information/interface-key" } , serviceKinds : [ "llm" , "tts" ] , ttsConfig : { baseUrl : "https://api.minimaxi.com/v1/t2a_v2" , authType : "apikey" , authHeader : "bearer" , format : "minimax-tts" , models : MINIMAX _TTS _MODELS } } ,
2026-05-01 06:03:13 -04:00
alicode : { id : "alicode" , alias : "alicode" , name : "Alibaba" , icon : "cloud" , color : "#FF6A00" , textIcon : "ALi" , website : "https://bailian.console.aliyun.com" , notice : { apiKeyUrl : "https://bailian.console.aliyun.com/?apiKey=1" } } ,
"alicode-intl" : { id : "alicode-intl" , alias : "alicode-intl" , name : "Alibaba Intl" , icon : "cloud" , color : "#FF6A00" , textIcon : "ALi" , website : "https://modelstudio.console.alibabacloud.com" , notice : { apiKeyUrl : "https://modelstudio.console.alibabacloud.com/?apiKey=1" } } ,
"xiaomi-mimo" : { id : "xiaomi-mimo" , alias : "mimo" , name : "Xiaomi MiMo" , icon : "smart_toy" , color : "#FF6900" , textIcon : "XM" , website : "https://xiaomimimo.com" , notice : { apiKeyUrl : "https://xiaomimimo.com" } } ,
2026-05-14 23:29:25 -04:00
"xiaomi-tokenplan" : { id : "xiaomi-tokenplan" , alias : "xmtp" , name : "Xiaomi MiMo (Token Plan)" , icon : "smart_toy" , color : "#FF6700" , textIcon : "XT" , website : "https://mimo.xiaomi.com" , notice : { text : "Xiaomi MiMo Token Plan subscription (API key starts with tp-). Uses Singapore endpoint." , apiKeyUrl : "https://mimo.xiaomi.com" } } ,
2026-05-01 06:03:13 -04:00
"volcengine-ark" : { id : "volcengine-ark" , alias : "ark" , name : "Volcengine Ark" , icon : "cloud" , color : "#1677FF" , textIcon : "ARK" , website : "https://ark.cn-beijing.volces.com" , notice : { apiKeyUrl : "https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey" } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
openai : { id : "openai" , alias : "openai" , name : "OpenAI" , icon : "auto_awesome" , color : "#10A37F" , textIcon : "OA" , website : "https://platform.openai.com" , notice : { apiKeyUrl : "https://platform.openai.com/api-keys" } , serviceKinds : [ "llm" , "embedding" , "tts" , "stt" , "image" , "imageToText" , "webSearch" ] , thinkingConfig : THINKING _CONFIG . effort , searchViaChat : { defaultModel : "gpt-4o-mini" , pricingUrl : "https://openai.com/api/pricing" } , ttsConfig : { baseUrl : "https://api.openai.com/v1/audio/speech" , authType : "apikey" , authHeader : "bearer" , format : "openai" , models : [ { id : "tts-1" , name : "TTS-1" } , { id : "tts-1-hd" , name : "TTS-1 HD" } , { id : "gpt-4o-mini-tts" , name : "GPT-4o Mini TTS" } ] } , sttConfig : { baseUrl : "https://api.openai.com/v1/audio/transcriptions" , authType : "apikey" , authHeader : "bearer" , format : "openai" , models : [ { id : "whisper-1" , name : "Whisper 1" } , { id : "gpt-4o-transcribe" , name : "GPT-4o Transcribe" } , { id : "gpt-4o-mini-transcribe" , name : "GPT-4o Mini Transcribe" } ] } , embeddingConfig : { baseUrl : "https://api.openai.com/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "text-embedding-3-small" , name : "Text Embedding 3 Small" , dimensions : 1536 } , { id : "text-embedding-3-large" , name : "Text Embedding 3 Large" , dimensions : 3072 } , { id : "text-embedding-ada-002" , name : "Text Embedding Ada 002" , dimensions : 1536 } ] } } ,
2026-05-01 06:03:13 -04:00
anthropic : { id : "anthropic" , alias : "anthropic" , name : "Anthropic" , icon : "smart_toy" , color : "#D97757" , textIcon : "AN" , website : "https://console.anthropic.com" , notice : { apiKeyUrl : "https://console.anthropic.com/settings/keys" } , serviceKinds : [ "llm" , "imageToText" ] } ,
2026-04-22 03:16:21 -04:00
"opencode-go" : { id : "opencode-go" , alias : "ocg" , name : "OpenCode Go" , icon : "terminal" , color : "#E87040" , textIcon : "OC" , website : "https://opencode.ai/auth" , notice : { text : "OpenCode Go subscription: $5/mo (then $10/mo). Access to Kimi, GLM, Qwen, MiMo, MiniMax models." , apiKeyUrl : "https://opencode.ai/auth" } } ,
2026-05-01 06:03:13 -04:00
azure : { id : "azure" , alias : "azure" , name : "Azure OpenAI" , icon : "cloud" , color : "#0078D4" , textIcon : "AZ" , website : "https://azure.microsoft.com/en-us/products/ai-services/openai-service" , notice : { apiKeyUrl : "https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI" } , hasProviderSpecificData : true } ,
2026-04-07 00:35:25 -04:00
2026-05-01 06:03:13 -04:00
deepseek : { id : "deepseek" , alias : "ds" , name : "DeepSeek" , icon : "bolt" , color : "#4D6BFE" , textIcon : "DS" , website : "https://deepseek.com" , notice : { apiKeyUrl : "https://platform.deepseek.com/api_keys" } } ,
2026-05-07 12:01:33 -04:00
commandcode : { id : "commandcode" , alias : "cmc" , name : "Command Code" , icon : "smart_toy" , color : "#000000" , textIcon : "CC" , website : "https://commandcode.ai" , notice : { text : "Use your CommandCode CLI API key (starts with user_...) from ~/.commandcode/auth.json or commandcode.ai/studio." , apiKeyUrl : "https://commandcode.ai/studio" } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
groq : { id : "groq" , alias : "groq" , name : "Groq" , icon : "speed" , color : "#F55036" , textIcon : "GQ" , website : "https://groq.com" , notice : { apiKeyUrl : "https://console.groq.com/keys" } , serviceKinds : [ "llm" , "imageToText" , "stt" ] , sttConfig : { baseUrl : "https://api.groq.com/openai/v1/audio/transcriptions" , authType : "apikey" , authHeader : "bearer" , format : "openai" , models : [ { id : "whisper-large-v3" , name : "Whisper Large v3" } , { id : "whisper-large-v3-turbo" , name : "Whisper Large v3 Turbo" } , { id : "distil-whisper-large-v3-en" , name : "Distil Whisper Large v3 EN" } ] } } ,
2026-05-01 06:03:13 -04:00
xai : { id : "xai" , alias : "xai" , name : "xAI (Grok)" , icon : "auto_awesome" , color : "#1DA1F2" , textIcon : "XA" , website : "https://x.ai" , notice : { apiKeyUrl : "https://console.x.ai" } , serviceKinds : [ "llm" , "imageToText" , "webSearch" ] , searchViaChat : { defaultModel : "grok-4.20-reasoning" , pricingUrl : "https://x.ai/api#pricing" } } ,
mistral : { id : "mistral" , alias : "mistral" , name : "Mistral" , icon : "air" , color : "#FF7000" , textIcon : "MI" , website : "https://mistral.ai" , notice : { apiKeyUrl : "https://console.mistral.ai/api-keys" } , serviceKinds : [ "llm" , "imageToText" , "embedding" ] , embeddingConfig : { baseUrl : "https://api.mistral.ai/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "mistral-embed" , name : "Mistral Embed" , dimensions : 1024 } ] } } ,
perplexity : { id : "perplexity" , alias : "pplx" , name : "Perplexity" , icon : "search" , color : "#20808D" , textIcon : "PP" , website : "https://www.perplexity.ai" , notice : { apiKeyUrl : "https://www.perplexity.ai/settings/api" } , serviceKinds : [ "llm" , "webSearch" ] , searchConfig : { baseUrl : "https://api.perplexity.ai/search" , method : "POST" , authType : "apikey" , authHeader : "bearer" , costPerQuery : 0.005 , freeMonthlyQuota : 0 , searchTypes : [ "web" ] , defaultMaxResults : 5 , maxMaxResults : 20 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
together : { id : "together" , alias : "together" , name : "Together AI" , icon : "group_work" , color : "#0F6FFF" , textIcon : "TG" , website : "https://www.together.ai" , notice : { apiKeyUrl : "https://api.together.xyz/settings/api-keys" } , serviceKinds : [ "llm" , "embedding" ] , embeddingConfig : { baseUrl : "https://api.together.xyz/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "BAAI/bge-large-en-v1.5" , name : "BGE Large EN v1.5" , dimensions : 1024 } , { id : "togethercomputer/m2-bert-80M-8k-retrieval" , name : "M2 BERT 80M 8K" , dimensions : 768 } ] } } ,
fireworks : { id : "fireworks" , alias : "fireworks" , name : "Fireworks AI" , icon : "local_fire_department" , color : "#7B2EF2" , textIcon : "FW" , website : "https://fireworks.ai" , notice : { apiKeyUrl : "https://fireworks.ai/account/api-keys" } , serviceKinds : [ "llm" , "embedding" ] , embeddingConfig : { baseUrl : "https://api.fireworks.ai/inference/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "nomic-ai/nomic-embed-text-v1.5" , name : "Nomic Embed Text v1.5" , dimensions : 768 } ] } } ,
cerebras : { id : "cerebras" , alias : "cerebras" , name : "Cerebras" , icon : "memory" , color : "#FF4F00" , textIcon : "CB" , website : "https://www.cerebras.ai" , notice : { apiKeyUrl : "https://cloud.cerebras.ai/platform" } } ,
cohere : { id : "cohere" , alias : "cohere" , name : "Cohere" , icon : "hub" , color : "#39594D" , textIcon : "CO" , website : "https://cohere.com" , notice : { apiKeyUrl : "https://dashboard.cohere.com/api-keys" } } ,
nebius : { id : "nebius" , alias : "nebius" , name : "Nebius AI" , icon : "cloud" , color : "#6C5CE7" , textIcon : "NB" , website : "https://nebius.com" , notice : { apiKeyUrl : "https://studio.nebius.com/settings/api-keys" } , serviceKinds : [ "llm" , "embedding" ] , embeddingConfig : { baseUrl : "https://api.tokenfactory.nebius.com/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "Qwen/Qwen3-Embedding-8B" , name : "Qwen3 Embedding 8B" , dimensions : 4096 } ] } } ,
siliconflow : { id : "siliconflow" , alias : "siliconflow" , name : "SiliconFlow" , icon : "cloud_queue" , color : "#5B6EF5" , textIcon : "SF" , website : "https://cloud.siliconflow.com" , notice : { apiKeyUrl : "https://cloud.siliconflow.com/account/ak" } } ,
hyperbolic : { id : "hyperbolic" , alias : "hyp" , name : "Hyperbolic" , icon : "bolt" , color : "#00D4FF" , textIcon : "HY" , website : "https://hyperbolic.xyz" , notice : { apiKeyUrl : "https://app.hyperbolic.xyz/settings" } , serviceKinds : [ "llm" , "tts" ] , ttsConfig : { baseUrl : "https://api.hyperbolic.xyz/v1/audio/generation" , authType : "apikey" , authHeader : "bearer" , format : "hyperbolic" , models : [ { id : "melo-tts" , name : "Melo TTS" } ] } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
deepgram : { id : "deepgram" , alias : "dg" , name : "Deepgram" , icon : "mic" , color : "#13EF93" , textIcon : "DG" , website : "https://deepgram.com" , notice : { text : "$200 free credit on signup (no card required). Aura-1: $0.015/1k chars, Aura-2: $0.030/1k chars (Pay-As-You-Go)." , apiKeyUrl : "https://console.deepgram.com/api-keys" } , serviceKinds : [ "stt" , "imageToText" , "tts" ] , ttsConfig : { baseUrl : "https://api.deepgram.com/v1/speak" , authType : "apikey" , authHeader : "token" , format : "deepgram" , models : [ ] } , sttConfig : { baseUrl : "https://api.deepgram.com/v1/listen" , authType : "apikey" , authHeader : "token" , format : "deepgram" , models : [ { id : "nova-3" , name : "Nova 3" } , { id : "nova-2" , name : "Nova 2" } , { id : "whisper-large" , name : "Whisper Large" } ] } } ,
assemblyai : { id : "assemblyai" , alias : "aai" , name : "AssemblyAI" , icon : "record_voice_over" , color : "#0062FF" , textIcon : "AA" , website : "https://assemblyai.com" , notice : { apiKeyUrl : "https://www.assemblyai.com/app/api-keys" } , serviceKinds : [ "stt" ] , sttConfig : { baseUrl : "https://api.assemblyai.com/v2/transcript" , authType : "apikey" , authHeader : "bearer" , format : "assemblyai" , async : true , models : [ { id : "universal-3-pro" , name : "Universal 3 Pro" } , { id : "universal-2" , name : "Universal 2" } ] } } ,
2026-05-04 00:29:02 -04:00
nanobanana : { id : "nanobanana" , alias : "nb" , name : "NanoBanana API" , icon : "extension" , color : "#FFD700" , textIcon : "🍌" , website : "https://nanobananaapi.ai" , notice : { text : "3rd-party proxy for Google Nano Banana (Gemini 2.5/3 Flash Image). For official, use Gemini provider." , apiKeyUrl : "https://nanobananaapi.ai/dashboard" } , serviceKinds : [ "image" ] } ,
2026-05-01 06:03:13 -04:00
elevenlabs : { id : "elevenlabs" , alias : "el" , name : "ElevenLabs" , icon : "record_voice_over" , color : "#6C47FF" , textIcon : "EL" , website : "https://elevenlabs.io" , notice : { apiKeyUrl : "https://elevenlabs.io/app/settings/api-keys" } , serviceKinds : [ "tts" ] , ttsConfig : { baseUrl : "https://api.elevenlabs.io/v1/text-to-speech" , authType : "apikey" , authHeader : "xi-api-key" , format : "elevenlabs" , models : [ { id : "eleven_multilingual_v2" , name : "Eleven Multilingual v2" } , { id : "eleven_turbo_v2_5" , name : "Eleven Turbo v2.5" } ] } } ,
cartesia : { id : "cartesia" , alias : "cartesia" , name : "Cartesia" , icon : "spatial_audio" , color : "#FF4F8B" , textIcon : "CA" , website : "https://cartesia.ai" , notice : { apiKeyUrl : "https://play.cartesia.ai/keys" } , serviceKinds : [ "tts" ] , hidden : true , ttsConfig : { baseUrl : "https://api.cartesia.ai/tts/bytes" , authType : "apikey" , authHeader : "x-api-key" , format : "cartesia" , models : [ { id : "sonic-2" , name : "Sonic 2" } , { id : "sonic-3" , name : "Sonic 3" } ] } } ,
playht : { id : "playht" , alias : "playht" , name : "PlayHT" , icon : "play_circle" , color : "#00B4D8" , textIcon : "PH" , website : "https://play.ht" , notice : { apiKeyUrl : "https://play.ht/studio/api-access" } , serviceKinds : [ "tts" ] , hidden : true , ttsConfig : { baseUrl : "https://api.play.ht/api/v2/tts/stream" , authType : "apikey" , authHeader : "playht" , format : "playht" , models : [ { id : "PlayDialog" , name : "PlayDialog" } , { id : "Play3.0-mini" , name : "Play 3.0 Mini" } ] } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
"local-device" : { id : "local-device" , alias : "local-device" , name : "Local Device" , icon : "speaker" , color : "#64748B" , textIcon : "LD" , mediaPriority : 5 , serviceKinds : [ "tts" ] , noAuth : true , ttsConfig : { baseUrl : "local-device" , authType : "none" , authHeader : "none" , format : "local-device" , models : [ ] } } ,
"google-tts" : { id : "google-tts" , alias : "google-tts" , name : "Google TTS" , icon : "record_voice_over" , color : "#4285F4" , textIcon : "GT" , mediaPriority : 5 , serviceKinds : [ "tts" ] , noAuth : true , ttsConfig : { baseUrl : "google-tts" , authType : "none" , authHeader : "none" , format : "google-tts" , models : [ ] } } ,
"edge-tts" : { id : "edge-tts" , alias : "edge-tts" , name : "Edge TTS" , icon : "record_voice_over" , color : "#0078D4" , textIcon : "ET" , mediaPriority : 5 , serviceKinds : [ "tts" ] , noAuth : true , ttsConfig : { baseUrl : "edge-tts" , authType : "none" , authHeader : "none" , format : "edge-tts" , models : [ ] } } ,
2026-04-29 00:34:39 -04:00
coqui : { id : "coqui" , alias : "coqui" , name : "Coqui TTS" , icon : "record_voice_over" , color : "#10B981" , textIcon : "CQ" , website : "https://github.com/coqui-ai/TTS" , serviceKinds : [ "tts" ] , hidden : true , noAuth : true , ttsConfig : { baseUrl : "http://localhost:5002/api/tts" , authType : "none" , authHeader : "none" , format : "coqui" , models : [ { id : "tts_models/en/ljspeech/tacotron2-DDC" , name : "Tacotron2 DDC (LJSpeech)" } ] } } ,
tortoise : { id : "tortoise" , alias : "tortoise" , name : "Tortoise TTS" , icon : "record_voice_over" , color : "#7C3AED" , textIcon : "TT" , website : "https://github.com/neonbjb/tortoise-tts" , serviceKinds : [ "tts" ] , hidden : true , noAuth : true , ttsConfig : { baseUrl : "http://localhost:5000/api/tts" , authType : "none" , authHeader : "none" , format : "tortoise" , models : [ { id : "tortoise-v2" , name : "Tortoise v2" } ] } } ,
inworld : { id : "inworld" , alias : "inworld" , name : "Inworld TTS" , icon : "record_voice_over" , color : "#FF6B6B" , textIcon : "IW" , website : "https://inworld.ai" , notice : { text : "Free tier: 40 minutes/month TTS. Paid: TTS-1.5 Mini $0.01/min ($15/1M chars), TTS-1.5 Max $0.025/min ($30/1M chars). 270+ voices, 15 languages." , apiKeyUrl : "https://platform.inworld.ai/api-keys" } , serviceKinds : [ "tts" ] , ttsConfig : { baseUrl : "https://api.inworld.ai/tts/v1/voice" , authType : "apikey" , authHeader : "basic" , format : "inworld" , models : [ { id : "inworld-tts-1.5-mini" , name : "Inworld TTS 1.5 Mini ($0.01/min)" } , { id : "inworld-tts-1.5-max" , name : "Inworld TTS 1.5 Max ($0.025/min)" } ] } } ,
"voyage-ai" : { id : "voyage-ai" , alias : "voyage" , name : "Voyage AI" , icon : "data_array" , color : "#0EA5E9" , textIcon : "VG" , website : "https://www.voyageai.com" , notice : { apiKeyUrl : "https://dash.voyageai.com/api-keys" } , serviceKinds : [ "embedding" ] , embeddingConfig : { baseUrl : "https://api.voyageai.com/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "voyage-3-large" , name : "Voyage 3 Large" , dimensions : 1024 } , { id : "voyage-3.5" , name : "Voyage 3.5" , dimensions : 1024 } , { id : "voyage-3.5-lite" , name : "Voyage 3.5 Lite" , dimensions : 1024 } , { id : "voyage-code-3" , name : "Voyage Code 3" , dimensions : 1024 } , { id : "voyage-finance-2" , name : "Voyage Finance 2" , dimensions : 1024 } , { id : "voyage-law-2" , name : "Voyage Law 2" , dimensions : 1024 } , { id : "voyage-multilingual-2" , name : "Voyage Multilingual 2" , dimensions : 1024 } ] } } ,
2026-04-04 04:07:07 -04:00
sdwebui : { id : "sdwebui" , alias : "sdwebui" , name : "SD WebUI" , icon : "brush" , color : "#FF7043" , textIcon : "SD" , website : "https://github.com/AUTOMATIC1111/stable-diffusion-webui" , serviceKinds : [ "image" ] } ,
comfyui : { id : "comfyui" , alias : "comfyui" , name : "ComfyUI" , icon : "account_tree" , color : "#4CAF50" , textIcon : "CF" , website : "https://github.com/comfyanonymous/ComfyUI" , serviceKinds : [ "image" ] } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
huggingface : { id : "huggingface" , alias : "hf" , name : "HuggingFace" , icon : "face" , color : "#FFD21E" , textIcon : "HF" , website : "https://huggingface.co" , notice : { apiKeyUrl : "https://huggingface.co/settings/tokens" } , serviceKinds : [ "image" , "imageToText" , "tts" , "stt" ] , hiddenKinds : [ "tts" ] , ttsConfig : { baseUrl : "https://api-inference.huggingface.co/models" , authType : "apikey" , authHeader : "bearer" , format : "huggingface-tts" , models : [ { id : "facebook/mms-tts-eng" , name : "MMS TTS English" } , { id : "microsoft/speecht5_tts" , name : "SpeechT5 TTS" } ] } , sttConfig : { baseUrl : "https://api-inference.huggingface.co/models" , authType : "apikey" , authHeader : "bearer" , format : "huggingface-asr" , models : [ { id : "openai/whisper-large-v3" , name : "Whisper Large v3 (HF)" } , { id : "openai/whisper-small" , name : "Whisper Small (HF)" } ] } } ,
2026-05-01 06:03:13 -04:00
blackbox : { id : "blackbox" , alias : "bb" , name : "Blackbox AI" , icon : "smart_toy" , color : "#5B5FEF" , textIcon : "BB" , website : "https://blackbox.ai" , notice : { apiKeyUrl : "https://www.blackbox.ai/api-management" } , serviceKinds : [ "llm" ] } ,
chutes : { id : "chutes" , alias : "ch" , name : "Chutes AI" , icon : "water_drop" , color : "#ffffffff" , textIcon : "CH" , website : "https://chutes.ai" , notice : { apiKeyUrl : "https://chutes.ai/app/api" } } ,
2026-05-11 22:19:50 -04:00
// === Free-tier LLM providers (synced from OmniRoute) — DISABLED in UI ===
// Uncomment to re-enable. Backend config (PROVIDERS, PROVIDER_MODELS, ALIAS_TO_PROVIDER_ID) remains active.
// agentrouter: { id: "agentrouter", alias: "agentrouter", name: "AgentRouter", icon: "router", color: "#10B981", textIcon: "AR", website: "https://agentrouter.org", notice: { text: "$200 free credits on signup - multi-model routing gateway.", apiKeyUrl: "https://agentrouter.org/register" }, passthroughModels: true, serviceKinds: ["llm"] },
// aimlapi: { id: "aimlapi", alias: "aiml", name: "AI/ML API", icon: "hub", color: "#6366F1", textIcon: "AI", website: "https://aimlapi.com", notice: { text: "$0.025/day free — 200+ models (GPT-4o, Claude, Gemini, Llama) via single endpoint.", apiKeyUrl: "https://aimlapi.com/app/keys" }, passthroughModels: true, serviceKinds: ["llm", "image"] },
// novita: { id: "novita", alias: "novita", name: "Novita AI", icon: "auto_awesome", color: "#FF4081", textIcon: "NV", website: "https://novita.ai", notice: { text: "$0.50 trial credits on signup (valid ~1 year).", apiKeyUrl: "https://novita.ai/settings/key-management" }, passthroughModels: true, serviceKinds: ["llm", "image"] },
// modal: { id: "modal", alias: "mdl", name: "Modal", icon: "cloud_queue", color: "#7C3AED", textIcon: "MDL", website: "https://modal.com", notice: { text: "$30/month free credits for new accounts. Self-hosted OpenAI-compatible apps on /v1.", apiKeyUrl: "https://modal.com/settings/tokens" }, passthroughModels: true, serviceKinds: ["llm"], hasProviderSpecificData: true },
// reka: { id: "reka", alias: "reka", name: "Reka", icon: "auto_awesome", color: "#111827", textIcon: "RK", website: "https://docs.reka.ai", notice: { text: "$10/month recurring free API credits.", apiKeyUrl: "https://platform.reka.ai/apikeys" }, serviceKinds: ["llm"] },
// nlpcloud: { id: "nlpcloud", alias: "nlpc", name: "NLP Cloud", icon: "psychology", color: "#2196F3", textIcon: "NLPC", website: "https://docs.nlpcloud.com", notice: { text: "Trial credits for new accounts.", apiKeyUrl: "https://nlpcloud.com/home/token" }, serviceKinds: ["llm"] },
// bazaarlink: { id: "bazaarlink", alias: "bzl", name: "BazaarLink", icon: "storefront", color: "#6366F1", textIcon: "BZ", website: "https://bazaarlink.ai", notice: { text: "Use model 'auto:free' for zero-cost inference. OpenAI-compatible.", apiKeyUrl: "https://bazaarlink.ai" }, serviceKinds: ["llm"] },
// completions: { id: "completions", alias: "cpl", name: "Completions.me", icon: "bolt", color: "#F59E0B", textIcon: "CP", website: "https://completions.me", notice: { text: "Free unlimited access to Claude, GPT, Gemini.", apiKeyUrl: "https://completions.me" }, serviceKinds: ["llm"] },
// enally: { id: "enally", alias: "enly", name: "Enally AI", icon: "school", color: "#8B5CF6", textIcon: "EN", website: "https://ai.enally.in", notice: { text: "Free for students and developers — OTP verification.", apiKeyUrl: "https://ai.enally.in/api" }, serviceKinds: ["llm"] },
// freetheai: { id: "freetheai", alias: "fta", name: "FreeTheAi", icon: "lock_open", color: "#10B981", textIcon: "FT", website: "https://freetheai.xyz", notice: { text: "Community-run free tier — 16,000+ models, OpenAI-compatible.", apiKeyUrl: "https://freetheai.xyz" }, serviceKinds: ["llm"] },
// llm7: { id: "llm7", alias: "llm7", name: "LLM7.io", icon: "hub", color: "#6366F1", textIcon: "LM", website: "https://llm7.io", notice: { text: "Works without API key (use 'unused'). 2 req/s, 100 req/hr free.", apiKeyUrl: "https://token.llm7.io" }, serviceKinds: ["llm"] },
// lepton: { id: "lepton", alias: "lepton", name: "Lepton AI", icon: "bolt", color: "#10B981", textIcon: "LP", website: "https://lepton.ai", notice: { apiKeyUrl: "https://dashboard.lepton.ai/credentials" }, serviceKinds: ["llm"] },
// kluster: { id: "kluster", alias: "kluster", name: "Kluster AI", icon: "hub", color: "#8B5CF6", textIcon: "KL", website: "https://kluster.ai", notice: { text: "$5 free credits on signup — DeepSeek R1, Llama 4, Qwen3 235B.", apiKeyUrl: "https://kluster.ai/dashboard/api-keys" }, serviceKinds: ["llm"] },
// ai21: { id: "ai21", alias: "ai21", name: "AI21 Labs", icon: "psychology_alt", color: "#0284C7", textIcon: "AI21", website: "https://www.ai21.com", notice: { text: "$10 trial credits on signup (valid 3 months).", apiKeyUrl: "https://studio.ai21.com/account/api-key" }, serviceKinds: ["llm"] },
// "inference-net": { id: "inference-net", alias: "inet", name: "Inference.net", icon: "dns", color: "#2563EB", textIcon: "IN", website: "https://inference.net", notice: { text: "$25 free credits on signup.", apiKeyUrl: "https://inference.net/dashboard/api-keys" }, serviceKinds: ["llm"] },
// predibase: { id: "predibase", alias: "predibase", name: "Predibase", icon: "deployed_code_history", color: "#0F766E", textIcon: "PB", website: "https://predibase.com", notice: { text: "$25 free trial credits (30-day validity).", apiKeyUrl: "https://app.predibase.com/settings" }, serviceKinds: ["llm"] },
// bytez: { id: "bytez", alias: "bytez", name: "Bytez", icon: "api", color: "#6366F1", textIcon: "BZ", website: "https://bytez.com", notice: { text: "$1 free credits, refreshes every 4 weeks.", apiKeyUrl: "https://bytez.com/dashboard/api" }, serviceKinds: ["llm"] },
// morph: { id: "morph", alias: "morph", name: "Morph", icon: "auto_fix_high", color: "#2563EB", textIcon: "MP", website: "https://morphllm.com", notice: { text: "Free tier: 250K credits/month.", apiKeyUrl: "https://morphllm.com/dashboard/api-keys" }, serviceKinds: ["llm"] },
// longcat: { id: "longcat", alias: "lc", name: "LongCat AI", icon: "auto_awesome", color: "#FF6B9D", textIcon: "LC", website: "https://longcat.chat/platform/docs", notice: { text: "50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) — free in public beta.", apiKeyUrl: "https://longcat.chat/platform/api_keys" }, serviceKinds: ["llm"] },
// puter: { id: "puter", alias: "pu", name: "Puter AI", icon: "cloud_circle", color: "#6366F1", textIcon: "PU", website: "https://puter.com", notice: { text: "500+ models (GPT-5, Claude Opus 4, Gemini 3 Pro, Grok 4, DeepSeek V3).", apiKeyUrl: "https://puter.com/dashboard" }, passthroughModels: true, serviceKinds: ["llm"] },
// uncloseai: { id: "uncloseai", alias: "unc", name: "UncloseAI", icon: "auto_awesome", color: "#8B5CF6", textIcon: "UN", website: "https://uncloseai.com", notice: { text: "Free forever — no signup, no credit card. OpenAI-compatible." }, passthroughModels: true, noAuth: true, serviceKinds: ["llm"] },
// scaleway: { id: "scaleway", alias: "scw", name: "Scaleway AI", icon: "cloud", color: "#4F0599", textIcon: "SCW", website: "https://www.scaleway.com/en/ai/generative-apis", notice: { text: "1M free tokens — EU/GDPR compliant (Paris), Qwen3 235B & Llama 70B.", apiKeyUrl: "https://console.scaleway.com/iam/api-keys" }, serviceKinds: ["llm"] },
// deepinfra: { id: "deepinfra", alias: "deepinfra", name: "DeepInfra", icon: "hub", color: "#2563EB", textIcon: "DI", website: "https://deepinfra.com", notice: { text: "Free signup credits for API testing.", apiKeyUrl: "https://deepinfra.com/dash/api_keys" }, serviceKinds: ["llm"] },
// sambanova: { id: "sambanova", alias: "samba", name: "SambaNova", icon: "memory", color: "#DC2626", textIcon: "SN", website: "https://sambanova.ai", notice: { text: "$5 free credits on signup (30-day validity).", apiKeyUrl: "https://cloud.sambanova.ai/apis" }, serviceKinds: ["llm"] },
// nscale: { id: "nscale", alias: "nscale", name: "nScale", icon: "token", color: "#0891B2", textIcon: "NS", website: "https://nscale.com", notice: { text: "$5 free credits on signup.", apiKeyUrl: "https://console.nscale.com/api-keys" }, serviceKinds: ["llm"] },
// baseten: { id: "baseten", alias: "baseten", name: "Baseten", icon: "deployed_code", color: "#111827", textIcon: "BT", website: "https://baseten.co", notice: { text: "$30 free trial credits for GPU inference.", apiKeyUrl: "https://app.baseten.co/settings/api_keys" }, serviceKinds: ["llm"] },
// publicai: { id: "publicai", alias: "publicai", name: "PublicAI", icon: "public", color: "#059669", textIcon: "PA", website: "https://publicai.co", notice: { text: "Free community inference tier.", apiKeyUrl: "https://publicai.co" }, serviceKinds: ["llm"] },
// "nous-research": { id: "nous-research", alias: "nous", name: "Nous Research", icon: "hub", color: "#2563EB", textIcon: "NO", website: "https://portal.nousresearch.com", notice: { text: "Free tier: 50 RPM, 500K TPM — no credit card.", apiKeyUrl: "https://portal.nousresearch.com" }, serviceKinds: ["llm"] },
// glhf: { id: "glhf", alias: "glhf", name: "GLHF Chat", icon: "hub", color: "#10B981", textIcon: "GH", website: "https://glhf.chat", notice: { text: "Free tier for open-source model inference.", apiKeyUrl: "https://glhf.chat/users/settings/api" }, passthroughModels: true, serviceKinds: ["llm"] },
2026-03-12 23:22:59 -04:00
"ollama-local" : { id : "ollama-local" , alias : "ollama-local" , name : "Ollama Local" , icon : "cloud" , color : "#ffffffff" , textIcon : "OL" , website : "https://ollama.com" } ,
2026-05-01 06:03:13 -04:00
"vertex-partner" : { id : "vertex-partner" , alias : "vxp" , name : "Vertex Partner" , icon : "cloud" , color : "#34A853" , textIcon : "VP" , website : "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models" , notice : { apiKeyUrl : "https://console.cloud.google.com/iam-admin/serviceaccounts" } } ,
2026-04-28 06:28:57 -04:00
tavily : { id : "tavily" , alias : "tavily" , name : "Tavily" , icon : "search" , color : "#5B21B6" , textIcon : "TV" , website : "https://tavily.com" , notice : { apiKeyUrl : "https://app.tavily.com/home" } , serviceKinds : [ "webSearch" , "webFetch" ] , searchConfig : { baseUrl : "https://api.tavily.com/search" , method : "POST" , authType : "apikey" , authHeader : "bearer" , costPerQuery : 0.008 , freeMonthlyQuota : 1000 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 20 , timeoutMs : 10000 , cacheTTLMs : 300000 } , fetchConfig : { baseUrl : "https://api.tavily.com/extract" , method : "POST" , authType : "apikey" , authHeader : "bearer" , costPerQuery : 0.008 , freeMonthlyQuota : 1000 , formats : [ "markdown" , "text" ] , maxCharacters : 100000 , timeoutMs : 15000 } } ,
"brave-search" : { id : "brave-search" , alias : "brave" , name : "Brave Search" , icon : "travel_explore" , color : "#FB542B" , textIcon : "BR" , website : "https://brave.com/search/api" , notice : { apiKeyUrl : "https://api-dashboard.search.brave.com/app/keys" } , serviceKinds : [ "webSearch" ] , searchConfig : { baseUrl : "https://api.search.brave.com/res/v1" , method : "GET" , authType : "apikey" , authHeader : "x-subscription-token" , costPerQuery : 0.005 , freeMonthlyQuota : 1000 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 20 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
serper : { id : "serper" , alias : "serper" , name : "Serper" , icon : "search" , color : "#4F46E5" , textIcon : "SP" , website : "https://serper.dev" , notice : { apiKeyUrl : "https://serper.dev/api-key" } , serviceKinds : [ "webSearch" ] , searchConfig : { baseUrl : "https://google.serper.dev" , method : "POST" , authType : "apikey" , authHeader : "x-api-key" , costPerQuery : 0.001 , freeMonthlyQuota : 2500 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 100 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
exa : { id : "exa" , alias : "exa" , name : "Exa" , icon : "manage_search" , color : "#2563EB" , textIcon : "EX" , website : "https://exa.ai" , notice : { apiKeyUrl : "https://dashboard.exa.ai/api-keys" } , serviceKinds : [ "webSearch" , "webFetch" ] , searchConfig : { baseUrl : "https://api.exa.ai/search" , method : "POST" , authType : "apikey" , authHeader : "x-api-key" , costPerQuery : 0.007 , freeMonthlyQuota : 1000 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 100 , timeoutMs : 10000 , cacheTTLMs : 300000 } , fetchConfig : { baseUrl : "https://api.exa.ai/contents" , method : "POST" , authType : "apikey" , authHeader : "x-api-key" , costPerQuery : 0.001 , freeMonthlyQuota : 1000 , formats : [ "text" , "markdown" ] , maxCharacters : 100000 , timeoutMs : 15000 } } ,
2026-04-28 00:07:39 -04:00
searxng : { id : "searxng" , alias : "searxng" , name : "SearXNG" , icon : "saved_search" , color : "#3B82F6" , textIcon : "SX" , website : "https://docs.searxng.org" , serviceKinds : [ "webSearch" ] , noAuth : true , searchConfig : { baseUrl : "http://localhost:8888/search" , method : "GET" , authType : "none" , authHeader : "none" , costPerQuery : 0 , freeMonthlyQuota : 999999 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 50 , timeoutMs : 10000 , cacheTTLMs : 180000 } } ,
2026-04-28 06:28:57 -04:00
"google-pse" : { id : "google-pse" , alias : "gpse" , name : "Google PSE" , icon : "search" , color : "#4285F4" , textIcon : "GP" , website : "https://programmablesearchengine.google.com" , notice : { apiKeyUrl : "https://programmablesearchengine.google.com/controlpanel/create" } , serviceKinds : [ "webSearch" ] , searchConfig : { baseUrl : "https://www.googleapis.com/customsearch/v1" , method : "GET" , authType : "apikey" , authHeader : "key" , costPerQuery : 0.005 , freeMonthlyQuota : 3000 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 10 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
linkup : { id : "linkup" , alias : "linkup" , name : "Linkup" , icon : "link" , color : "#0EA5E9" , textIcon : "LK" , website : "https://linkup.so" , notice : { apiKeyUrl : "https://app.linkup.so/api-keys" } , serviceKinds : [ "webSearch" ] , searchConfig : { baseUrl : "https://api.linkup.so/v1/search" , method : "POST" , authType : "apikey" , authHeader : "bearer" , costPerQuery : 0.005 , freeMonthlyQuota : 1000 , searchTypes : [ "web" ] , defaultMaxResults : 5 , maxMaxResults : 50 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
searchapi : { id : "searchapi" , alias : "searchapi" , name : "SearchAPI" , icon : "search" , color : "#0EA5A4" , textIcon : "SA" , website : "https://www.searchapi.io" , notice : { apiKeyUrl : "https://www.searchapi.io/dashboard" } , serviceKinds : [ "webSearch" ] , searchConfig : { baseUrl : "https://www.searchapi.io/api/v1/search" , method : "GET" , authType : "apikey" , authHeader : "api_key" , costPerQuery : 0.004 , freeMonthlyQuota : 100 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 100 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
youcom : { id : "youcom" , alias : "youcom" , name : "You.com Search" , icon : "search" , color : "#7C3AED" , textIcon : "YC" , website : "https://you.com" , notice : { apiKeyUrl : "https://api.you.com" } , serviceKinds : [ "webSearch" ] , searchConfig : { baseUrl : "https://ydc-index.io/v1/search" , method : "GET" , authType : "apikey" , authHeader : "x-api-key" , costPerQuery : 0.005 , freeMonthlyQuota : 0 , searchTypes : [ "web" , "news" ] , defaultMaxResults : 5 , maxMaxResults : 100 , timeoutMs : 10000 , cacheTTLMs : 300000 } } ,
firecrawl : { id : "firecrawl" , alias : "firecrawl" , name : "Firecrawl" , icon : "local_fire_department" , color : "#F59E0B" , textIcon : "FC" , website : "https://firecrawl.dev" , notice : { apiKeyUrl : "https://www.firecrawl.dev/app/api-keys" } , serviceKinds : [ "webFetch" ] , fetchConfig : { baseUrl : "https://api.firecrawl.dev/v1/scrape" , method : "POST" , authType : "apikey" , authHeader : "bearer" , costPerQuery : 0.002 , freeMonthlyQuota : 500 , formats : [ "markdown" , "html" , "text" ] , maxCharacters : 200000 , timeoutMs : 30000 } } ,
2026-05-10 10:54:54 -04:00
"fal-ai" : { id : "fal-ai" , alias : "fal" , name : "Fal.ai" , icon : "image" , color : "#2563EB" , textIcon : "FL" , website : "https://fal.ai" , notice : { apiKeyUrl : "https://fal.ai/dashboard/keys" } , serviceKinds : [ "image" ] , imageConfig : { baseUrl : "https://api.fal.ai/v1/models?limit=1" , method : "GET" , authType : "apikey" , authHeader : "key" } } ,
2026-05-04 00:29:02 -04:00
"stability-ai" : { id : "stability-ai" , alias : "stability" , name : "Stability AI" , icon : "image" , color : "#8B5CF6" , textIcon : "SA" , website : "https://stability.ai" , notice : { apiKeyUrl : "https://platform.stability.ai/account/keys" } , serviceKinds : [ "image" ] , imageConfig : { baseUrl : "https://api.stability.ai/v1/user/account" , method : "GET" , authType : "apikey" , authHeader : "bearer" } } ,
"black-forest-labs" : { id : "black-forest-labs" , alias : "bfl" , name : "Black Forest Labs" , icon : "image" , color : "#111827" , textIcon : "BF" , website : "https://blackforestlabs.ai" , notice : { apiKeyUrl : "https://api.bfl.ai" } , serviceKinds : [ "image" ] , imageConfig : { baseUrl : "https://api.bfl.ai/v1/get_result?id=ping" , method : "GET" , authType : "apikey" , authHeader : "x-key" } } ,
recraft : { id : "recraft" , alias : "recraft" , name : "Recraft" , icon : "image" , color : "#EC4899" , textIcon : "RC" , website : "https://recraft.ai" , notice : { apiKeyUrl : "https://www.recraft.ai/profile/api" } , serviceKinds : [ "image" ] , imageConfig : { baseUrl : "https://external.api.recraft.ai/v1/users/me" , method : "GET" , authType : "apikey" , authHeader : "bearer" } } ,
topaz : { id : "topaz" , alias : "topaz" , name : "Topaz" , icon : "image" , color : "#059669" , textIcon : "TP" , website : "https://topazlabs.com" , notice : { apiKeyUrl : "https://topazlabs.com/account" } , serviceKinds : [ "image" ] } ,
runwayml : { id : "runwayml" , alias : "runway" , name : "Runway ML" , icon : "movie" , color : "#000000" , textIcon : "RW" , website : "https://runwayml.com" , notice : { apiKeyUrl : "https://dev.runwayml.com" } , serviceKinds : [ "image" , "video" ] , imageConfig : { baseUrl : "https://api.dev.runwayml.com/v1/organization" , method : "GET" , authType : "apikey" , authHeader : "bearer" , extraHeaders : { "X-Runway-Version" : "2024-11-06" } } } ,
"aws-polly" : { id : "aws-polly" , alias : "polly" , name : "AWS Polly" , icon : "record_voice_over" , color : "#FF9900" , textIcon : "PL" , website : "https://aws.amazon.com/polly/" , notice : { text : "Use AWS Secret Access Key as API key; set providerSpecificData.accessKeyId and optional region." , apiKeyUrl : "https://console.aws.amazon.com/iam/home#/security_credentials" } , serviceKinds : [ "tts" ] , hasProviderSpecificData : true , ttsConfig : { baseUrl : "https://polly.{region}.amazonaws.com/v1/speech" , authType : "apikey" , authHeader : "aws-sigv4" , format : "aws-polly" , models : [ { id : "standard" , name : "Standard" } , { id : "neural" , name : "Neural" } , { id : "long-form" , name : "Long-form" } , { id : "generative" , name : "Generative" } ] } } ,
"jina-ai" : { id : "jina-ai" , alias : "jina" , name : "Jina AI" , icon : "blur_on" , color : "#2563EB" , textIcon : "JA" , website : "https://jina.ai" , notice : { text : "10M free tokens on signup (non-commercial), no credit card required." , apiKeyUrl : "https://jina.ai/?sui=apikey" } , serviceKinds : [ "embedding" ] , embeddingConfig : { baseUrl : "https://api.jina.ai/v1/embeddings" , authType : "apikey" , authHeader : "bearer" , models : [ { id : "jina-embeddings-v3" , name : "Jina Embeddings v3" , dimensions : 1024 } , { id : "jina-embeddings-v2-base-en" , name : "Jina Embeddings v2 Base EN" , dimensions : 768 } , { id : "jina-embeddings-v2-base-code" , name : "Jina Embeddings v2 Base Code" , dimensions : 768 } ] } } ,
2026-04-28 06:28:57 -04:00
"jina-reader" : { id : "jina-reader" , alias : "jina" , name : "Jina Reader" , icon : "menu_book" , color : "#000000" , textIcon : "JR" , website : "https://jina.ai/reader" , notice : { apiKeyUrl : "https://jina.ai/?sui=apikey" } , serviceKinds : [ "webFetch" ] , fetchConfig : { baseUrl : "https://r.jina.ai" , method : "GET" , authType : "apikey" , authHeader : "bearer" , costPerQuery : 0 , freeMonthlyQuota : 1000000 , formats : [ "markdown" , "text" , "html" ] , maxCharacters : 200000 , timeoutMs : 30000 } } ,
2026-01-04 21:58:59 -05:00
} ;
2026-04-22 00:58:53 -04:00
// Web Cookie Providers (use browser session cookie instead of API key)
export const WEB _COOKIE _PROVIDERS = {
"grok-web" : { id : "grok-web" , alias : "gw" , name : "Grok Web (Subscription)" , icon : "auto_awesome" , color : "#1DA1F2" , textIcon : "GW" , website : "https://grok.com" , authType : "cookie" , authHint : "Paste your sso= cookie value from grok.com" , passthroughModels : true , serviceKinds : [ "llm" ] } ,
"perplexity-web" : { id : "perplexity-web" , alias : "pw" , name : "Perplexity Web (Pro/Max)" , icon : "search" , color : "#20808D" , textIcon : "PW" , website : "https://www.perplexity.ai" , authType : "cookie" , authHint : "Paste your __Secure-next-auth.session-token cookie value from perplexity.ai" , serviceKinds : [ "llm" ] } ,
} ;
2026-04-04 04:07:07 -04:00
// Media provider kinds — each kind maps to a route and endpoint config
export const MEDIA _PROVIDER _KINDS = [
2026-04-14 23:45:46 -04:00
{ id : "embedding" , label : "Embedding" , icon : "data_array" , endpoint : { method : "POST" , path : "/v1/embeddings" } } ,
{ id : "image" , label : "Text to Image" , icon : "brush" , endpoint : { method : "POST" , path : "/v1/images/generations" } } ,
{ id : "imageToText" , label : "Image to Text" , icon : "image_search" , endpoint : { method : "POST" , path : "/v1/images/understanding" } } ,
{ id : "tts" , label : "Text To Speech" , icon : "record_voice_over" , endpoint : { method : "POST" , path : "/v1/audio/speech" } } ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
{ id : "stt" , label : "Speech To Text" , icon : "mic" , endpoint : { method : "POST" , path : "/v1/audio/transcriptions" } } ,
2026-04-14 23:45:46 -04:00
{ id : "webSearch" , label : "Web Search" , icon : "travel_explore" , endpoint : { method : "POST" , path : "/v1/search" } } ,
{ id : "webFetch" , label : "Web Fetch" , icon : "language" , endpoint : { method : "POST" , path : "/v1/web/fetch" } } ,
{ id : "video" , label : "Video" , icon : "movie" , endpoint : { method : "POST" , path : "/v1/video/generations" } } ,
{ id : "music" , label : "Music" , icon : "music_note" , endpoint : { method : "POST" , path : "/v1/audio/music" } } ,
2026-04-04 04:07:07 -04:00
] ;
2026-02-02 07:45:12 -05:00
export const OPENAI _COMPATIBLE _PREFIX = "openai-compatible-" ;
2026-02-03 03:11:41 -05:00
export const ANTHROPIC _COMPATIBLE _PREFIX = "anthropic-compatible-" ;
2026-04-25 05:22:30 -04:00
export const CUSTOM _EMBEDDING _PREFIX = "custom-embedding-" ;
2026-02-02 07:45:12 -05:00
export function isOpenAICompatibleProvider ( providerId ) {
return typeof providerId === "string" && providerId . startsWith ( OPENAI _COMPATIBLE _PREFIX ) ;
}
2026-02-03 03:11:41 -05:00
export function isAnthropicCompatibleProvider ( providerId ) {
return typeof providerId === "string" && providerId . startsWith ( ANTHROPIC _COMPATIBLE _PREFIX ) ;
}
2026-04-25 05:22:30 -04:00
export function isCustomEmbeddingProvider ( providerId ) {
return typeof providerId === "string" && providerId . startsWith ( CUSTOM _EMBEDDING _PREFIX ) ;
}
2026-01-04 21:58:59 -05:00
// All providers (combined)
2026-04-22 00:58:53 -04:00
export const AI _PROVIDERS = { ... FREE _PROVIDERS , ... FREE _TIER _PROVIDERS , ... OAUTH _PROVIDERS , ... APIKEY _PROVIDERS , ... WEB _COOKIE _PROVIDERS } ;
2026-01-04 21:58:59 -05:00
// Auth methods
export const AUTH _METHODS = {
oauth : { id : "oauth" , name : "OAuth" , icon : "lock" } ,
apikey : { id : "apikey" , name : "API Key" , icon : "key" } ,
2026-04-22 00:58:53 -04:00
cookie : { id : "cookie" , name : "Browser Cookie" , icon : "cookie" } ,
2026-01-04 21:58:59 -05:00
} ;
// 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 ;
} , { } ) ;
2026-02-05 06:38:50 -05:00
2026-04-04 04:07:07 -04:00
// Helper: Get providers by service kind (e.g. "tts", "embedding", "image")
// Providers without serviceKinds default to ["llm"]
export function getProvidersByKind ( kind ) {
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
return Object . values ( AI _PROVIDERS )
. filter ( ( p ) => {
const kinds = p . serviceKinds ? ? [ "llm" ] ;
if ( ! kinds . includes ( kind ) ) return false ;
if ( p . hidden ) return false ;
if ( p . hiddenKinds ? . includes ( kind ) ) return false ;
return true ;
} )
. sort ( ( a , b ) => ( a . mediaPriority ? ? 100 ) - ( b . mediaPriority ? ? 100 ) ) ;
2026-04-04 04:07:07 -04:00
}
2026-02-05 06:38:50 -05:00
// Providers that support usage/quota API
2026-03-11 23:48:11 -04:00
export const USAGE _SUPPORTED _PROVIDERS = [
"claude" ,
"antigravity" ,
"kiro" ,
"github" ,
"codex" ,
"kimi-coding" ,
2026-04-21 23:32:28 -04:00
"ollama" ,
feat: add STT support, Gemini TTS, and expand usage tracking
- Speech-to-Text: full pipeline with sttCore handler, /v1/audio/transcriptions
endpoint, sttConfig for OpenAI, Gemini, Groq, Deepgram, AssemblyAI,
HuggingFace, NVIDIA Parakeet; new 9router-stt skill
- Gemini TTS: add gemini provider with 30 prebuilt voices and TTS_PROVIDER_CONFIG
- Usage: implement GLM (intl/cn) and MiniMax (intl/cn) quota fetchers; refactor
Gemini CLI usage to use retrieveUserQuota with per-model buckets
- Disabled models: lowdb-backed disabledModelsDb + /api/models/disabled route
- Header search: reusable Zustand store (headerSearchStore) wired into Header
- CLI tools: add Claude Cowork tool card and cowork-settings API
- Providers: introduce mediaPriority sorting in getProvidersByKind, add
Kimi K2.6, reorder hermes, drop qwen STT kind
- UI: expand media-providers/[kind]/[id] page (+314), enhance OAuthModal,
ModelSelectModal, ProviderTopology, ProxyPools, ProviderLimits
- Assets: refresh provider PNGs (alicode, byteplus, cloudflare-ai, nvidia,
ollama, vertex, volcengine-ark) and add aws-polly, fal-ai, jina-ai, recraft,
runwayml, stability-ai, topaz, black-forest-labs
2026-05-04 23:32:59 -04:00
"gemini-cli" ,
"glm" ,
"glm-cn" ,
"minimax" ,
"minimax-cn" ,
] ;
// Subset that uses apikey auth (still surfaced on quota page)
export const USAGE _APIKEY _PROVIDERS = [
"glm" ,
"glm-cn" ,
"minimax" ,
"minimax-cn" ,
2026-03-11 23:48:11 -04:00
] ;