{"repo": "bukhhh/rita-edge-demo", "files": {"server/utils/helpers/customModels.js": {"ad5cf5d5dcfe953b8b579354701e9a02374615ce": {"t": 1785745547.3611917, "n": 31189, "h": "cbf8da861a169320", "c": "const { fetchOpenRouterModels } = require(\"../AiProviders/openRouter\");\nconst {\n fetchOpenRouterEmbeddingModels,\n} = require(\"../EmbeddingEngines/openRouter\");\nconst { fetchApiPieModels } = require(\"../AiProviders/apipie\");\nconst { perplexityModels } = require(\"../AiProviders/perplexity\");\nconst { fireworksAiModels } = require(\"../AiProviders/fireworksAi\");\nconst { ElevenLabsTTS } = require(\"../TextToSpeech/elevenLabs\");\nconst { fetchNovitaModels } = require(\"../AiProviders/novita\");\nconst { parseLMStudioBasePath } = require(\"../AiProviders/lmStudio\");\nconst { parseNvidiaNimBasePath } = require(\"../AiProviders/nvidiaNim\");\nconst { fetchPPIOModels } = require(\"../AiProviders/ppio\");\nconst { GeminiLLM } = require(\"../AiProviders/gemini\");\nconst { fetchCometApiModels } = require(\"../AiProviders/cometapi\");\nconst { parseFoundryBasePath } = require(\"../AiProviders/foundry\");\nconst { getDockerModels } = require(\"../AiProviders/dockerModelRunner\");\nconst { getAllLemonadeModels } = require(\"../AiProviders/lemonade\");\n\nconst SUPPORT_CUSTOM_MODELS = [\n \"openai\",\n \"anthropic\",\n \"localai\",\n \"ollama\",\n \"togetherai\",\n \"fireworksai\",\n \"nvidia-nim\",\n \"mistral\",\n \"perplexity\",\n \"openrouter\",\n \"lmstudio\",\n \"koboldcpp\",\n \"litellm\",\n \"elevenlabs-tts\",\n \"groq\",\n \"deepseek\",\n \"apipie\",\n \"novita\",\n \"cometapi\",\n \"xai\",\n \"gemini\",\n \"ppio\",\n \"dpais\",\n \"moonshotai\",\n \"foundry\",\n \"cohere\",\n \"zai\",\n \"giteeai\",\n \"docker-model-runner\",\n \"privatemode\",\n \"sambanova\",\n \"lemonade\",\n \"minimax\",\n // Embedding Engines\n \"native-embedder\",\n \"cohere-embedder\",\n \"openrouter-embedder\",\n \"lemonade-embedder\",\n];\n\nasync function getCustomModels(provider = \"\", apiKey = null, basePath = null) {\n if (!SUPPORT_CUSTOM_MODELS.includes(provider))\n return { models: [], error: \"Invalid provider for custom models\" };\n\n switch (provider) {\n case \"openai\":\n return await openAiModels(apiKey);\n case \"anthropic\":\n return await anthropicModels(apiKey);\n case \"localai\":\n return await localAIModels(basePath, apiKey);\n case \"ollama\":\n return await ollamaAIModels(basePath, apiKey);\n case \"togetherai\":\n return await getTogetherAiModels(apiKey);\n case \"fireworksai\":\n return await getFireworksAiModels(apiKey);\n case \"mistral\":\n return await getMistralModels(apiKey);\n case \"perplexity\":\n return await getPerplexityModels();\n case \"openrouter\":\n return await getOpenRouterModels();\n case \"lmstudio\":\n return await getLMStudioModels(basePath, apiKey);\n case \"koboldcpp\":\n return await getKoboldCPPModels(basePath);\n case \"litellm\":\n return await liteLLMModels(basePath, apiKey);\n case \"elevenlabs-tts\":\n return await getElevenLabsModels(apiKey);\n case \"groq\":\n return await getGroqAiModels(apiKey);\n case \"deepseek\":\n return await getDeepSeekModels(apiKey);\n case \"apipie\":\n return await getAPIPieModels(apiKey);\n case \"novita\":\n return await getNovitaModels();\n case \"cometapi\":\n return await getCometApiModels();\n case \"xai\":\n return await getXAIModels(apiKey);\n case \"nvidia-nim\":\n return await getNvidiaNimModels(basePath);\n case \"gemini\":\n return await getGeminiModels(apiKey);\n case \"ppio\":\n return await getPPIOModels(apiKey);\n case \"dpais\":\n return await getDellProAiStudioModels(basePath);\n case \"moonshotai\":\n return await getMoonshotAiModels(apiKey);\n case \"foundry\":\n return await getFoundryModels(basePath);\n case \"cohere\":\n return await getCohereModels(apiKey, \"chat\");\n case \"zai\":\n return await getZAiModels(apiKey);\n case \"native-embedder\":\n return await getNativeEmbedderModels();\n case \"cohere-embedder\":\n return await getCohereModels(apiKey, \"embed\");\n case \"openrouter-embedder\":\n return await getOpenRouterEmbeddingModels();\n case \"giteeai\":\n return await getGiteeAIModels(apiKey);\n case \"docker-model-runner\":\n return await getDockerModelRunnerModels(basePath);\n case \"privatemode\":\n return await getPrivatemodeModels(basePath, \"generate\");\n case \"sambanova\":\n return await getSambaNovaModels(apiKey);\n case \"lemonade\":\n return await getLemonadeModels(basePath);\n case \"lemonade-embedder\":\n return await getLemonadeModels(basePath, \"embedding\");\n case \"minimax\":\n return await getMinimaxModels(apiKey);\n default:\n return { models: [], error: \"Invalid provider for custom models\" };\n }\n}\n\nasync function openAiModels(apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n apiKey: apiKey || process.env.OPEN_AI_KEY,\n });\n const allModels = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`OpenAI:listModels`, e.message);\n return [\n {\n name: \"gpt-3.5-turbo\",\n id: \"gpt-3.5-turbo\",\n object: \"model\",\n created: 1677610602,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4o\",\n id: \"gpt-4o\",\n object: \"model\",\n created: 1677610602,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4\",\n id: \"gpt-4\",\n object: \"model\",\n created: 1687882411,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4-turbo\",\n id: \"gpt-4-turbo\",\n object: \"model\",\n created: 1712361441,\n owned_by: \"system\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4-32k\",\n id: \"gpt-4-32k\",\n object: \"model\",\n created: 1687979321,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-3.5-turbo-16k\",\n id: \"gpt-3.5-turbo-16k\",\n object: \"model\",\n created: 1683758102,\n owned_by: \"openai-internal\",\n organization: \"OpenAi\",\n },\n ];\n });\n\n const gpts = allModels\n .filter(\n (model) =>\n (model.id.includes(\"gpt\") && !model.id.startsWith(\"ft:\")) ||\n model.id.startsWith(\"o\") // o1, o1-mini, o3, etc\n )\n .filter(\n (model) =>\n !model.id.includes(\"vision\") &&\n !model.id.includes(\"instruct\") &&\n !model.id.includes(\"audio\") &&\n !model.id.includes(\"realtime\") &&\n !model.id.includes(\"image\") &&\n !model.id.includes(\"moderation\") &&\n !model.id.includes(\"transcribe\")\n )\n .map((model) => {\n return {\n ...model,\n name: model.id,\n organization: \"OpenAi\",\n };\n });\n\n const customModels = allModels\n .filter(\n (model) =>\n !model.owned_by.includes(\"openai\") && model.owned_by !== \"system\"\n )\n .map((model) => {\n return {\n ...model,\n name: model.id,\n organization: \"Your Fine-Tunes\",\n };\n });\n\n // Api Key was successful so lets save it for future uses\n if ((gpts.length > 0 || customModels.length > 0) && !!apiKey)\n process.env.OPEN_AI_KEY = apiKey;\n return { models: [...gpts, ...customModels], error: null };\n}\n\nasync function anthropicModels(_apiKey = null) {\n const apiKey =\n _apiKey === true\n ? process.env.ANTHROPIC_API_KEY\n : _apiKey || process.env.ANTHROPIC_API_KEY || null;\n const AnthropicAI = require(\"@anthropic-ai/sdk\");\n const anthropic = new AnthropicAI({ apiKey });\n const models = await anthropic.models\n .list()\n .then((results) => results.data)\n .then((models) => {\n return models\n .filter((model) => model.type === \"model\")\n .map((model) => {\n return {\n id: model.id,\n name: model.display_name,\n };\n });\n })\n .catch((e) => {\n console.error(`Anthropic:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.ANTHROPIC_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function localAIModels(basePath = null, apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: basePath || process.env.LOCAL_AI_BASE_PATH,\n apiKey: apiKey || process.env.LOCAL_AI_API_KEY || null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`LocalAI:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.LOCAL_AI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getGroqAiModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.GROQ_API_KEY\n : _apiKey || process.env.GROQ_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.groq.com/openai/v1\",\n apiKey,\n });\n const models = (\n await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`GroqAi:listModels`, e.message);\n return [];\n })\n ).filter(\n (model) => !model.id.includes(\"whisper\") && !model.id.includes(\"tool-use\")\n );\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.GROQ_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function liteLLMModels(basePath = null, apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: basePath || process.env.LITE_LLM_BASE_PATH,\n apiKey: apiKey || process.env.LITE_LLM_API_KEY || null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`LiteLLM:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.LITE_LLM_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getLMStudioModels(basePath = null, _apiKey = null) {\n try {\n const apiKey =\n _apiKey === true\n ? process.env.LMSTUDIO_AUTH_TOKEN\n : _apiKey || process.env.LMSTUDIO_AUTH_TOKEN || null;\n\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseLMStudioBasePath(\n basePath || process.env.LMSTUDIO_BASE_PATH\n ),\n apiKey: apiKey || null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`LMStudio:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`LMStudio:getLMStudioModels`, e.message);\n return { models: [], error: \"Could not fetch LMStudio Models\" };\n }\n}\n\nasync function getKoboldCPPModels(basePath = null) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: basePath || process.env.KOBOLD_CPP_BASE_PATH,\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`KoboldCPP:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`KoboldCPP:getKoboldCPPModels`, e.message);\n return { models: [], error: \"Could not fetch KoboldCPP Models\" };\n }\n}\n\nasync function ollamaAIModels(basePath = null, _authToken = null) {\n let url;\n try {\n let urlPath = basePath ?? process.env.OLLAMA_BASE_PATH;\n new URL(urlPath);\n if (urlPath.split(\"\").slice(-1)?.[0] === \"/\")\n throw new Error(\"BasePath Cannot end in /!\");\n url = urlPath;\n } catch {\n return { models: [], error: \"Not a valid URL.\" };\n }\n\n const authToken = _authToken || process.env.OLLAMA_AUTH_TOKEN || null;\n const headers = authToken ? { Authorization: `Bearer ${authToken}` } : {};\n const models = await fetch(`${url}/api/tags`, { headers: headers })\n .then((res) => {\n if (!res.ok)\n throw new Error(`Could not reach Ollama server! ${res.status}`);\n return res.json();\n })\n .then((data) => data?.models || [])\n .then((models) =>\n models.map((model) => {\n return { id: model.name };\n })\n )\n .catch((e) => {\n console.error(e);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!authToken)\n process.env.OLLAMA_AUTH_TOKEN = authToken;\n return { models, error: null };\n}\n\nasync function getTogetherAiModels(apiKey = null) {\n const _apiKey =\n apiKey === true\n ? process.env.TOGETHER_AI_API_KEY\n : apiKey || process.env.TOGETHER_AI_API_KEY || null;\n try {\n const { togetherAiModels } = require(\"../AiProviders/togetherAi\");\n const models = await togetherAiModels(_apiKey);\n if (models.length > 0 && !!_apiKey)\n process.env.TOGETHER_AI_API_KEY = _apiKey;\n return { models, error: null };\n } catch (error) {\n console.error(\"Error in getTogetherAiModels:\", error);\n return { models: [], error: \"Failed to fetch Together AI models\" };\n }\n}\n\nasync function getFireworksAiModels(apiKey = null) {\n const knownModels = await fireworksAiModels(apiKey);\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getPerplexityModels() {\n const knownModels = perplexityModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getOpenRouterModels() {\n const knownModels = await fetchOpenRouterModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getNovitaModels() {\n const knownModels = await fetchNovitaModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getCometApiModels() {\n const knownModels = await fetchCometApiModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getAPIPieModels(apiKey = null) {\n const knownModels = await fetchApiPieModels(apiKey);\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels)\n .filter((model) => {\n // Filter for chat models\n return (\n model.subtype &&\n (model.subtype.includes(\"chat\") || model.subtype.includes(\"chatx\"))\n );\n })\n .map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getMistralModels(apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n apiKey: apiKey || process.env.MISTRAL_API_KEY || null,\n baseURL: \"https://api.mistral.ai/v1\",\n });\n const models = await openai.models\n .list()\n .then((results) =>\n results.data.filter((model) => !model.id.includes(\"embed\"))\n )\n .catch((e) => {\n console.error(`Mistral:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.MISTRAL_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getElevenLabsModels(apiKey = null) {\n const models = (await ElevenLabsTTS.voices(apiKey)).map((model) => {\n return {\n id: model.voice_id,\n organization: model.category,\n name: model.name,\n };\n });\n\n if (models.length === 0) {\n return {\n models: [\n {\n id: \"21m00Tcm4TlvDq8ikWAM\",\n organization: \"premade\",\n name: \"Rachel (default)\",\n },\n ],\n error: null,\n };\n }\n\n if (models.length > 0 && !!apiKey) process.env.TTS_ELEVEN_LABS_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getMinimaxModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.MINIMAX_API_KEY\n : _apiKey || process.env.MINIMAX_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.minimax.io/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) =>\n models.map((model) => ({\n id: model.id,\n name: model.id,\n organization: model.owned_by || \"minimax\",\n }))\n )\n .catch((e) => {\n console.error(`Minimax:listModels`, e.message);\n return [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax-M2.7\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.7-highspeed\",\n name: \"MiniMax-M2.7-highspeed\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.5\",\n name: \"MiniMax-M2.5\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.5-highspeed\",\n name: \"MiniMax-M2.5-highspeed\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.1\",\n name: \"MiniMax-M2.1\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.1-highspeed\",\n name: \"MiniMax-M2.1-highspeed\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2\",\n name: \"MiniMax-M2\",\n organization: \"minimax\",\n },\n ];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.MINIMAX_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getDeepSeekModels(apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n apiKey: apiKey || process.env.DEEPSEEK_API_KEY,\n baseURL: \"https://api.deepseek.com/v1\",\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) =>\n models.map((model) => ({\n id: model.id,\n name: model.id,\n organization: model.owned_by,\n }))\n )\n .catch((e) => {\n console.error(`DeepSeek:listModels`, e.message);\n return [\n {\n id: \"deepseek-chat\",\n name: \"deepseek-chat\",\n organization: \"deepseek\",\n },\n {\n id: \"deepseek-reasoner\",\n name: \"deepseek-reasoner\",\n organization: \"deepseek\",\n },\n ];\n });\n\n if (models.length > 0 && !!apiKey) process.env.DEEPSEEK_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getGiteeAIModels() {\n const { giteeAiModels } = require(\"../AiProviders/giteeai\");\n const modelMap = await giteeAiModels();\n if (!Object.keys(modelMap).length === 0) return { models: [], error: null };\n const models = Object.values(modelMap).map((model) => {\n return {\n id: model.id,\n organization: model.organization ?? \"GiteeAI\",\n name: model.id,\n };\n });\n return { models, error: null };\n}\n\nasync function getXAIModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.XAI_LLM_API_KEY\n : _apiKey || process.env.XAI_LLM_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.x.ai/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`XAI:listModels`, e.message);\n return [\n {\n created: 1725148800,\n id: \"grok-beta\",\n object: \"model\",\n owned_by: \"xai\",\n },\n ];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.XAI_LLM_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getNvidiaNimModels(basePath = null) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseNvidiaNimBasePath(\n basePath ?? process.env.NVIDIA_NIM_LLM_BASE_PATH\n ),\n apiKey: null,\n });\n const modelResponse = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n throw new Error(e.message);\n });\n\n const models = modelResponse.map((model) => {\n return {\n id: model.id,\n name: model.id,\n organization: model.owned_by,\n };\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`NVIDIA NIM:getNvidiaNimModels`, e.message);\n return { models: [], error: \"Could not fetch NVIDIA NIM Models\" };\n }\n}\n\nasync function getGeminiModels(_apiKey = null) {\n const apiKey =\n _apiKey === true\n ? process.env.GEMINI_API_KEY\n : _apiKey || process.env.GEMINI_API_KEY || null;\n const models = await GeminiLLM.fetchModels(apiKey);\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.GEMINI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getPPIOModels() {\n const ppioModels = await fetchPPIOModels();\n if (!Object.keys(ppioModels).length === 0) return { models: [], error: null };\n const models = Object.values(ppioModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getDellProAiStudioModels(basePath = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n try {\n const { origin } = new URL(\n basePath || process.env.DELL_PRO_AI_STUDIO_BASE_PATH\n );\n const openai = new OpenAIApi({\n baseURL: `${origin}/v1/openai`,\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) => {\n return models\n .filter(\n (model) => model?.capability?.includes(\"TextToText\") // Only include text-to-text models for this handler\n )\n .map((model) => {\n return {\n id: model.id,\n name: model.name,\n organization: model.owned_by,\n };\n });\n })\n .catch((e) => {\n throw new Error(e.message);\n });\n return { models, error: null };\n } catch (e) {\n console.error(`getDellProAiStudioModels`, e.message);\n return {\n models: [],\n error: \"Could not reach Dell Pro Ai Studio from the provided base path\",\n };\n }\n}\n\nfunction getNativeEmbedderModels() {\n const { NativeEmbedder } = require(\"../EmbeddingEngines/native\");\n return { models: NativeEmbedder.availableModels(), error: null };\n}\n\nasync function getMoonshotAiModels(_apiKey = null) {\n const apiKey =\n _apiKey === true\n ? process.env.MOONSHOT_AI_API_KEY\n : _apiKey || process.env.MOONSHOT_AI_API_KEY || null;\n\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: \"https://api.moonshot.ai/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`MoonshotAi:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0) process.env.MOONSHOT_AI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getFoundryModels(basePath = null) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseFoundryBasePath(basePath || process.env.FOUNDRY_BASE_PATH),\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) =>\n results.data.map((model) => ({\n ...model,\n name: model.id,\n }))\n )\n .catch((e) => {\n console.error(`Foundry:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`Foundry:getFoundryModels`, e.message);\n return { models: [], error: \"Could not fetch Foundry Models\" };\n }\n}\n\n/**\n * Get Cohere models\n * @param {string} _apiKey - The API key to use\n * @param {'chat' | 'embed'} type - The type of model to get\n * @returns {Promise<{models: Array<{id: string, organization: string, name: string}>, error: string | null}>}\n */\nasync function getCohereModels(_apiKey = null, type = \"chat\") {\n const apiKey =\n _apiKey === true\n ? process.env.COHERE_API_KEY\n : _apiKey || process.env.COHERE_API_KEY || null;\n\n const { CohereClient } = require(\"cohere-ai\");\n const cohere = new CohereClient({\n token: apiKey,\n });\n const models = await cohere.models\n .list({ pageSize: 1000, endpoint: type })\n .then((results) => results.models)\n .then((models) =>\n models.map((model) => ({\n id: model.name,\n name: model.name,\n }))\n )\n .catch((e) => {\n console.error(`Cohere:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n}\n\nasync function getZAiModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.ZAI_API_KEY\n : _apiKey || process.env.ZAI_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.z.ai/api/paas/v4\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`Z.AI:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.ZAI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getOpenRouterEmbeddingModels() {\n const knownModels = await fetchOpenRouterEmbeddingModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getDockerModelRunnerModels(basePath = null) {\n try {\n const models = await getDockerModels(basePath);\n return { models, error: null };\n } catch (e) {\n console.error(`DockerModelRunner:getDockerModelRunnerModels`, e.message);\n return {\n models: [],\n error: \"Could not fetch Docker Model Runner Models\",\n };\n }\n}\n\nasync function getLemonadeModels(basePath = null, task = \"chat\") {\n try {\n const models = await getAllLemonadeModels(basePath, task);\n return { models, error: null };\n } catch (e) {\n console.error(`Lemonade:getLemonadeModels`, e.message);\n return { models: [], error: \"Could not fetch Lemonade Models\" };\n }\n}\n\n/**\n * Get Privatemode models\n * @param {string} basePath - The base path of the Privatemode endpoint.\n * @param {'any' | 'generate' | 'embed' | 'transcribe'} task - The task to fetch the models for.\n * @returns {Promise<{models: Array<{id: string, organization: string, name: string}>, error: string | null}>}\n */\nasync function getPrivatemodeModels(basePath = null, task = \"any\") {\n try {\n const { PrivatemodeLLM } = require(\"../AiProviders/privatemode\");\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: PrivatemodeLLM.parseBasePath(\n basePath || process.env.PRIVATEMODE_LLM_BASE_PATH\n ),\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then(\n (models) =>\n models\n .filter((model) => !model.id.includes(\"/\")) // remove legacy prefixed models\n .filter((model) =>\n task === \"any\" ? true : model.tasks.includes(task)\n ) // filter by task or show all if task is any\n )\n .then((models) =>\n models.map((model) => ({\n id: model.id,\n organization: \"Privatemode\",\n name: model.id\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \"),\n }))\n )\n .catch((e) => {\n console.error(`Privatemode:listModels`, e.message);\n return [];\n });\n return { models, error: null };\n } catch (e) {\n console.error(`Privatemode:getPrivatemodeModels`, e.message);\n return { models: [], error: \"Could not fetch Privatemode Models\" };\n }\n}\n\n/**\n * Get SambaNova models\n * @param {string} _apiKey - The API key to use\n * @returns {Promise<{models: Array<{id: string, organization: string, name: string}>, error: string | null}>}\n */\nasync function getSambaNovaModels(_apiKey = null) {\n try {\n const apiKey =\n _apiKey === true\n ? process.env.SAMBANOVA_LLM_API_KEY\n : _apiKey || process.env.SAMBANOVA_LLM_API_KEY || null;\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: \"https://api.sambanova.ai/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) =>\n models.filter((model) => !model.id.toLowerCase().startsWith(\"whisper\"))\n )\n .then((models) =>\n models.map((model) => {\n const organization =\n model.hasOwnProperty(\"owned_by\") &&\n model.owned_by !== \"no-reply@sambanova.ai\"\n ? model.owned_by\n : \"SambaNova\";\n return {\n id: model.id,\n organization,\n name: model.id,\n };\n })\n )\n .catch((e) => {\n console.error(`SambaNova:listModels`, e.message);\n return [];\n });\n return { models, error: null };\n } catch (e) {\n console.error(`SambaNova:getSambaNovaModels`, e.message);\n return { models: [], error: \"Could not fetch SambaNova Models\" };\n }\n}\n\nmodule.exports = {\n getCustomModels,\n SUPPORT_CUSTOM_MODELS,\n};\n"}, "ad2da5a6ae36356e7635ef5fd5503cd3a6d3016c": {"t": 1785754106.7976694, "n": 31189, "h": "cbf8da861a169320", "c": "const { fetchOpenRouterModels } = require(\"../AiProviders/openRouter\");\nconst {\n fetchOpenRouterEmbeddingModels,\n} = require(\"../EmbeddingEngines/openRouter\");\nconst { fetchApiPieModels } = require(\"../AiProviders/apipie\");\nconst { perplexityModels } = require(\"../AiProviders/perplexity\");\nconst { fireworksAiModels } = require(\"../AiProviders/fireworksAi\");\nconst { ElevenLabsTTS } = require(\"../TextToSpeech/elevenLabs\");\nconst { fetchNovitaModels } = require(\"../AiProviders/novita\");\nconst { parseLMStudioBasePath } = require(\"../AiProviders/lmStudio\");\nconst { parseNvidiaNimBasePath } = require(\"../AiProviders/nvidiaNim\");\nconst { fetchPPIOModels } = require(\"../AiProviders/ppio\");\nconst { GeminiLLM } = require(\"../AiProviders/gemini\");\nconst { fetchCometApiModels } = require(\"../AiProviders/cometapi\");\nconst { parseFoundryBasePath } = require(\"../AiProviders/foundry\");\nconst { getDockerModels } = require(\"../AiProviders/dockerModelRunner\");\nconst { getAllLemonadeModels } = require(\"../AiProviders/lemonade\");\n\nconst SUPPORT_CUSTOM_MODELS = [\n \"openai\",\n \"anthropic\",\n \"localai\",\n \"ollama\",\n \"togetherai\",\n \"fireworksai\",\n \"nvidia-nim\",\n \"mistral\",\n \"perplexity\",\n \"openrouter\",\n \"lmstudio\",\n \"koboldcpp\",\n \"litellm\",\n \"elevenlabs-tts\",\n \"groq\",\n \"deepseek\",\n \"apipie\",\n \"novita\",\n \"cometapi\",\n \"xai\",\n \"gemini\",\n \"ppio\",\n \"dpais\",\n \"moonshotai\",\n \"foundry\",\n \"cohere\",\n \"zai\",\n \"giteeai\",\n \"docker-model-runner\",\n \"privatemode\",\n \"sambanova\",\n \"lemonade\",\n \"minimax\",\n // Embedding Engines\n \"native-embedder\",\n \"cohere-embedder\",\n \"openrouter-embedder\",\n \"lemonade-embedder\",\n];\n\nasync function getCustomModels(provider = \"\", apiKey = null, basePath = null) {\n if (!SUPPORT_CUSTOM_MODELS.includes(provider))\n return { models: [], error: \"Invalid provider for custom models\" };\n\n switch (provider) {\n case \"openai\":\n return await openAiModels(apiKey);\n case \"anthropic\":\n return await anthropicModels(apiKey);\n case \"localai\":\n return await localAIModels(basePath, apiKey);\n case \"ollama\":\n return await ollamaAIModels(basePath, apiKey);\n case \"togetherai\":\n return await getTogetherAiModels(apiKey);\n case \"fireworksai\":\n return await getFireworksAiModels(apiKey);\n case \"mistral\":\n return await getMistralModels(apiKey);\n case \"perplexity\":\n return await getPerplexityModels();\n case \"openrouter\":\n return await getOpenRouterModels();\n case \"lmstudio\":\n return await getLMStudioModels(basePath, apiKey);\n case \"koboldcpp\":\n return await getKoboldCPPModels(basePath);\n case \"litellm\":\n return await liteLLMModels(basePath, apiKey);\n case \"elevenlabs-tts\":\n return await getElevenLabsModels(apiKey);\n case \"groq\":\n return await getGroqAiModels(apiKey);\n case \"deepseek\":\n return await getDeepSeekModels(apiKey);\n case \"apipie\":\n return await getAPIPieModels(apiKey);\n case \"novita\":\n return await getNovitaModels();\n case \"cometapi\":\n return await getCometApiModels();\n case \"xai\":\n return await getXAIModels(apiKey);\n case \"nvidia-nim\":\n return await getNvidiaNimModels(basePath);\n case \"gemini\":\n return await getGeminiModels(apiKey);\n case \"ppio\":\n return await getPPIOModels(apiKey);\n case \"dpais\":\n return await getDellProAiStudioModels(basePath);\n case \"moonshotai\":\n return await getMoonshotAiModels(apiKey);\n case \"foundry\":\n return await getFoundryModels(basePath);\n case \"cohere\":\n return await getCohereModels(apiKey, \"chat\");\n case \"zai\":\n return await getZAiModels(apiKey);\n case \"native-embedder\":\n return await getNativeEmbedderModels();\n case \"cohere-embedder\":\n return await getCohereModels(apiKey, \"embed\");\n case \"openrouter-embedder\":\n return await getOpenRouterEmbeddingModels();\n case \"giteeai\":\n return await getGiteeAIModels(apiKey);\n case \"docker-model-runner\":\n return await getDockerModelRunnerModels(basePath);\n case \"privatemode\":\n return await getPrivatemodeModels(basePath, \"generate\");\n case \"sambanova\":\n return await getSambaNovaModels(apiKey);\n case \"lemonade\":\n return await getLemonadeModels(basePath);\n case \"lemonade-embedder\":\n return await getLemonadeModels(basePath, \"embedding\");\n case \"minimax\":\n return await getMinimaxModels(apiKey);\n default:\n return { models: [], error: \"Invalid provider for custom models\" };\n }\n}\n\nasync function openAiModels(apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n apiKey: apiKey || process.env.OPEN_AI_KEY,\n });\n const allModels = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`OpenAI:listModels`, e.message);\n return [\n {\n name: \"gpt-3.5-turbo\",\n id: \"gpt-3.5-turbo\",\n object: \"model\",\n created: 1677610602,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4o\",\n id: \"gpt-4o\",\n object: \"model\",\n created: 1677610602,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4\",\n id: \"gpt-4\",\n object: \"model\",\n created: 1687882411,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4-turbo\",\n id: \"gpt-4-turbo\",\n object: \"model\",\n created: 1712361441,\n owned_by: \"system\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-4-32k\",\n id: \"gpt-4-32k\",\n object: \"model\",\n created: 1687979321,\n owned_by: \"openai\",\n organization: \"OpenAi\",\n },\n {\n name: \"gpt-3.5-turbo-16k\",\n id: \"gpt-3.5-turbo-16k\",\n object: \"model\",\n created: 1683758102,\n owned_by: \"openai-internal\",\n organization: \"OpenAi\",\n },\n ];\n });\n\n const gpts = allModels\n .filter(\n (model) =>\n (model.id.includes(\"gpt\") && !model.id.startsWith(\"ft:\")) ||\n model.id.startsWith(\"o\") // o1, o1-mini, o3, etc\n )\n .filter(\n (model) =>\n !model.id.includes(\"vision\") &&\n !model.id.includes(\"instruct\") &&\n !model.id.includes(\"audio\") &&\n !model.id.includes(\"realtime\") &&\n !model.id.includes(\"image\") &&\n !model.id.includes(\"moderation\") &&\n !model.id.includes(\"transcribe\")\n )\n .map((model) => {\n return {\n ...model,\n name: model.id,\n organization: \"OpenAi\",\n };\n });\n\n const customModels = allModels\n .filter(\n (model) =>\n !model.owned_by.includes(\"openai\") && model.owned_by !== \"system\"\n )\n .map((model) => {\n return {\n ...model,\n name: model.id,\n organization: \"Your Fine-Tunes\",\n };\n });\n\n // Api Key was successful so lets save it for future uses\n if ((gpts.length > 0 || customModels.length > 0) && !!apiKey)\n process.env.OPEN_AI_KEY = apiKey;\n return { models: [...gpts, ...customModels], error: null };\n}\n\nasync function anthropicModels(_apiKey = null) {\n const apiKey =\n _apiKey === true\n ? process.env.ANTHROPIC_API_KEY\n : _apiKey || process.env.ANTHROPIC_API_KEY || null;\n const AnthropicAI = require(\"@anthropic-ai/sdk\");\n const anthropic = new AnthropicAI({ apiKey });\n const models = await anthropic.models\n .list()\n .then((results) => results.data)\n .then((models) => {\n return models\n .filter((model) => model.type === \"model\")\n .map((model) => {\n return {\n id: model.id,\n name: model.display_name,\n };\n });\n })\n .catch((e) => {\n console.error(`Anthropic:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.ANTHROPIC_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function localAIModels(basePath = null, apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: basePath || process.env.LOCAL_AI_BASE_PATH,\n apiKey: apiKey || process.env.LOCAL_AI_API_KEY || null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`LocalAI:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.LOCAL_AI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getGroqAiModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.GROQ_API_KEY\n : _apiKey || process.env.GROQ_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.groq.com/openai/v1\",\n apiKey,\n });\n const models = (\n await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`GroqAi:listModels`, e.message);\n return [];\n })\n ).filter(\n (model) => !model.id.includes(\"whisper\") && !model.id.includes(\"tool-use\")\n );\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.GROQ_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function liteLLMModels(basePath = null, apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: basePath || process.env.LITE_LLM_BASE_PATH,\n apiKey: apiKey || process.env.LITE_LLM_API_KEY || null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`LiteLLM:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.LITE_LLM_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getLMStudioModels(basePath = null, _apiKey = null) {\n try {\n const apiKey =\n _apiKey === true\n ? process.env.LMSTUDIO_AUTH_TOKEN\n : _apiKey || process.env.LMSTUDIO_AUTH_TOKEN || null;\n\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseLMStudioBasePath(\n basePath || process.env.LMSTUDIO_BASE_PATH\n ),\n apiKey: apiKey || null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`LMStudio:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`LMStudio:getLMStudioModels`, e.message);\n return { models: [], error: \"Could not fetch LMStudio Models\" };\n }\n}\n\nasync function getKoboldCPPModels(basePath = null) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: basePath || process.env.KOBOLD_CPP_BASE_PATH,\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`KoboldCPP:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`KoboldCPP:getKoboldCPPModels`, e.message);\n return { models: [], error: \"Could not fetch KoboldCPP Models\" };\n }\n}\n\nasync function ollamaAIModels(basePath = null, _authToken = null) {\n let url;\n try {\n let urlPath = basePath ?? process.env.OLLAMA_BASE_PATH;\n new URL(urlPath);\n if (urlPath.split(\"\").slice(-1)?.[0] === \"/\")\n throw new Error(\"BasePath Cannot end in /!\");\n url = urlPath;\n } catch {\n return { models: [], error: \"Not a valid URL.\" };\n }\n\n const authToken = _authToken || process.env.OLLAMA_AUTH_TOKEN || null;\n const headers = authToken ? { Authorization: `Bearer ${authToken}` } : {};\n const models = await fetch(`${url}/api/tags`, { headers: headers })\n .then((res) => {\n if (!res.ok)\n throw new Error(`Could not reach Ollama server! ${res.status}`);\n return res.json();\n })\n .then((data) => data?.models || [])\n .then((models) =>\n models.map((model) => {\n return { id: model.name };\n })\n )\n .catch((e) => {\n console.error(e);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!authToken)\n process.env.OLLAMA_AUTH_TOKEN = authToken;\n return { models, error: null };\n}\n\nasync function getTogetherAiModels(apiKey = null) {\n const _apiKey =\n apiKey === true\n ? process.env.TOGETHER_AI_API_KEY\n : apiKey || process.env.TOGETHER_AI_API_KEY || null;\n try {\n const { togetherAiModels } = require(\"../AiProviders/togetherAi\");\n const models = await togetherAiModels(_apiKey);\n if (models.length > 0 && !!_apiKey)\n process.env.TOGETHER_AI_API_KEY = _apiKey;\n return { models, error: null };\n } catch (error) {\n console.error(\"Error in getTogetherAiModels:\", error);\n return { models: [], error: \"Failed to fetch Together AI models\" };\n }\n}\n\nasync function getFireworksAiModels(apiKey = null) {\n const knownModels = await fireworksAiModels(apiKey);\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getPerplexityModels() {\n const knownModels = perplexityModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getOpenRouterModels() {\n const knownModels = await fetchOpenRouterModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getNovitaModels() {\n const knownModels = await fetchNovitaModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getCometApiModels() {\n const knownModels = await fetchCometApiModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getAPIPieModels(apiKey = null) {\n const knownModels = await fetchApiPieModels(apiKey);\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels)\n .filter((model) => {\n // Filter for chat models\n return (\n model.subtype &&\n (model.subtype.includes(\"chat\") || model.subtype.includes(\"chatx\"))\n );\n })\n .map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getMistralModels(apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n apiKey: apiKey || process.env.MISTRAL_API_KEY || null,\n baseURL: \"https://api.mistral.ai/v1\",\n });\n const models = await openai.models\n .list()\n .then((results) =>\n results.data.filter((model) => !model.id.includes(\"embed\"))\n )\n .catch((e) => {\n console.error(`Mistral:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.MISTRAL_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getElevenLabsModels(apiKey = null) {\n const models = (await ElevenLabsTTS.voices(apiKey)).map((model) => {\n return {\n id: model.voice_id,\n organization: model.category,\n name: model.name,\n };\n });\n\n if (models.length === 0) {\n return {\n models: [\n {\n id: \"21m00Tcm4TlvDq8ikWAM\",\n organization: \"premade\",\n name: \"Rachel (default)\",\n },\n ],\n error: null,\n };\n }\n\n if (models.length > 0 && !!apiKey) process.env.TTS_ELEVEN_LABS_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getMinimaxModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.MINIMAX_API_KEY\n : _apiKey || process.env.MINIMAX_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.minimax.io/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) =>\n models.map((model) => ({\n id: model.id,\n name: model.id,\n organization: model.owned_by || \"minimax\",\n }))\n )\n .catch((e) => {\n console.error(`Minimax:listModels`, e.message);\n return [\n {\n id: \"MiniMax-M2.7\",\n name: \"MiniMax-M2.7\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.7-highspeed\",\n name: \"MiniMax-M2.7-highspeed\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.5\",\n name: \"MiniMax-M2.5\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.5-highspeed\",\n name: \"MiniMax-M2.5-highspeed\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.1\",\n name: \"MiniMax-M2.1\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2.1-highspeed\",\n name: \"MiniMax-M2.1-highspeed\",\n organization: \"minimax\",\n },\n {\n id: \"MiniMax-M2\",\n name: \"MiniMax-M2\",\n organization: \"minimax\",\n },\n ];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.MINIMAX_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getDeepSeekModels(apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n apiKey: apiKey || process.env.DEEPSEEK_API_KEY,\n baseURL: \"https://api.deepseek.com/v1\",\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) =>\n models.map((model) => ({\n id: model.id,\n name: model.id,\n organization: model.owned_by,\n }))\n )\n .catch((e) => {\n console.error(`DeepSeek:listModels`, e.message);\n return [\n {\n id: \"deepseek-chat\",\n name: \"deepseek-chat\",\n organization: \"deepseek\",\n },\n {\n id: \"deepseek-reasoner\",\n name: \"deepseek-reasoner\",\n organization: \"deepseek\",\n },\n ];\n });\n\n if (models.length > 0 && !!apiKey) process.env.DEEPSEEK_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getGiteeAIModels() {\n const { giteeAiModels } = require(\"../AiProviders/giteeai\");\n const modelMap = await giteeAiModels();\n if (!Object.keys(modelMap).length === 0) return { models: [], error: null };\n const models = Object.values(modelMap).map((model) => {\n return {\n id: model.id,\n organization: model.organization ?? \"GiteeAI\",\n name: model.id,\n };\n });\n return { models, error: null };\n}\n\nasync function getXAIModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.XAI_LLM_API_KEY\n : _apiKey || process.env.XAI_LLM_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.x.ai/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`XAI:listModels`, e.message);\n return [\n {\n created: 1725148800,\n id: \"grok-beta\",\n object: \"model\",\n owned_by: \"xai\",\n },\n ];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.XAI_LLM_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getNvidiaNimModels(basePath = null) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseNvidiaNimBasePath(\n basePath ?? process.env.NVIDIA_NIM_LLM_BASE_PATH\n ),\n apiKey: null,\n });\n const modelResponse = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n throw new Error(e.message);\n });\n\n const models = modelResponse.map((model) => {\n return {\n id: model.id,\n name: model.id,\n organization: model.owned_by,\n };\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`NVIDIA NIM:getNvidiaNimModels`, e.message);\n return { models: [], error: \"Could not fetch NVIDIA NIM Models\" };\n }\n}\n\nasync function getGeminiModels(_apiKey = null) {\n const apiKey =\n _apiKey === true\n ? process.env.GEMINI_API_KEY\n : _apiKey || process.env.GEMINI_API_KEY || null;\n const models = await GeminiLLM.fetchModels(apiKey);\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.GEMINI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getPPIOModels() {\n const ppioModels = await fetchPPIOModels();\n if (!Object.keys(ppioModels).length === 0) return { models: [], error: null };\n const models = Object.values(ppioModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getDellProAiStudioModels(basePath = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n try {\n const { origin } = new URL(\n basePath || process.env.DELL_PRO_AI_STUDIO_BASE_PATH\n );\n const openai = new OpenAIApi({\n baseURL: `${origin}/v1/openai`,\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) => {\n return models\n .filter(\n (model) => model?.capability?.includes(\"TextToText\") // Only include text-to-text models for this handler\n )\n .map((model) => {\n return {\n id: model.id,\n name: model.name,\n organization: model.owned_by,\n };\n });\n })\n .catch((e) => {\n throw new Error(e.message);\n });\n return { models, error: null };\n } catch (e) {\n console.error(`getDellProAiStudioModels`, e.message);\n return {\n models: [],\n error: \"Could not reach Dell Pro Ai Studio from the provided base path\",\n };\n }\n}\n\nfunction getNativeEmbedderModels() {\n const { NativeEmbedder } = require(\"../EmbeddingEngines/native\");\n return { models: NativeEmbedder.availableModels(), error: null };\n}\n\nasync function getMoonshotAiModels(_apiKey = null) {\n const apiKey =\n _apiKey === true\n ? process.env.MOONSHOT_AI_API_KEY\n : _apiKey || process.env.MOONSHOT_AI_API_KEY || null;\n\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: \"https://api.moonshot.ai/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`MoonshotAi:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0) process.env.MOONSHOT_AI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getFoundryModels(basePath = null) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseFoundryBasePath(basePath || process.env.FOUNDRY_BASE_PATH),\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) =>\n results.data.map((model) => ({\n ...model,\n name: model.id,\n }))\n )\n .catch((e) => {\n console.error(`Foundry:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n } catch (e) {\n console.error(`Foundry:getFoundryModels`, e.message);\n return { models: [], error: \"Could not fetch Foundry Models\" };\n }\n}\n\n/**\n * Get Cohere models\n * @param {string} _apiKey - The API key to use\n * @param {'chat' | 'embed'} type - The type of model to get\n * @returns {Promise<{models: Array<{id: string, organization: string, name: string}>, error: string | null}>}\n */\nasync function getCohereModels(_apiKey = null, type = \"chat\") {\n const apiKey =\n _apiKey === true\n ? process.env.COHERE_API_KEY\n : _apiKey || process.env.COHERE_API_KEY || null;\n\n const { CohereClient } = require(\"cohere-ai\");\n const cohere = new CohereClient({\n token: apiKey,\n });\n const models = await cohere.models\n .list({ pageSize: 1000, endpoint: type })\n .then((results) => results.models)\n .then((models) =>\n models.map((model) => ({\n id: model.name,\n name: model.name,\n }))\n )\n .catch((e) => {\n console.error(`Cohere:listModels`, e.message);\n return [];\n });\n\n return { models, error: null };\n}\n\nasync function getZAiModels(_apiKey = null) {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const apiKey =\n _apiKey === true\n ? process.env.ZAI_API_KEY\n : _apiKey || process.env.ZAI_API_KEY || null;\n const openai = new OpenAIApi({\n baseURL: \"https://api.z.ai/api/paas/v4\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .catch((e) => {\n console.error(`Z.AI:listModels`, e.message);\n return [];\n });\n\n // Api Key was successful so lets save it for future uses\n if (models.length > 0 && !!apiKey) process.env.ZAI_API_KEY = apiKey;\n return { models, error: null };\n}\n\nasync function getOpenRouterEmbeddingModels() {\n const knownModels = await fetchOpenRouterEmbeddingModels();\n if (!Object.keys(knownModels).length === 0)\n return { models: [], error: null };\n\n const models = Object.values(knownModels).map((model) => {\n return {\n id: model.id,\n organization: model.organization,\n name: model.name,\n };\n });\n return { models, error: null };\n}\n\nasync function getDockerModelRunnerModels(basePath = null) {\n try {\n const models = await getDockerModels(basePath);\n return { models, error: null };\n } catch (e) {\n console.error(`DockerModelRunner:getDockerModelRunnerModels`, e.message);\n return {\n models: [],\n error: \"Could not fetch Docker Model Runner Models\",\n };\n }\n}\n\nasync function getLemonadeModels(basePath = null, task = \"chat\") {\n try {\n const models = await getAllLemonadeModels(basePath, task);\n return { models, error: null };\n } catch (e) {\n console.error(`Lemonade:getLemonadeModels`, e.message);\n return { models: [], error: \"Could not fetch Lemonade Models\" };\n }\n}\n\n/**\n * Get Privatemode models\n * @param {string} basePath - The base path of the Privatemode endpoint.\n * @param {'any' | 'generate' | 'embed' | 'transcribe'} task - The task to fetch the models for.\n * @returns {Promise<{models: Array<{id: string, organization: string, name: string}>, error: string | null}>}\n */\nasync function getPrivatemodeModels(basePath = null, task = \"any\") {\n try {\n const { PrivatemodeLLM } = require(\"../AiProviders/privatemode\");\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: PrivatemodeLLM.parseBasePath(\n basePath || process.env.PRIVATEMODE_LLM_BASE_PATH\n ),\n apiKey: null,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then(\n (models) =>\n models\n .filter((model) => !model.id.includes(\"/\")) // remove legacy prefixed models\n .filter((model) =>\n task === \"any\" ? true : model.tasks.includes(task)\n ) // filter by task or show all if task is any\n )\n .then((models) =>\n models.map((model) => ({\n id: model.id,\n organization: \"Privatemode\",\n name: model.id\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \"),\n }))\n )\n .catch((e) => {\n console.error(`Privatemode:listModels`, e.message);\n return [];\n });\n return { models, error: null };\n } catch (e) {\n console.error(`Privatemode:getPrivatemodeModels`, e.message);\n return { models: [], error: \"Could not fetch Privatemode Models\" };\n }\n}\n\n/**\n * Get SambaNova models\n * @param {string} _apiKey - The API key to use\n * @returns {Promise<{models: Array<{id: string, organization: string, name: string}>, error: string | null}>}\n */\nasync function getSambaNovaModels(_apiKey = null) {\n try {\n const apiKey =\n _apiKey === true\n ? process.env.SAMBANOVA_LLM_API_KEY\n : _apiKey || process.env.SAMBANOVA_LLM_API_KEY || null;\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: \"https://api.sambanova.ai/v1\",\n apiKey,\n });\n const models = await openai.models\n .list()\n .then((results) => results.data)\n .then((models) =>\n models.filter((model) => !model.id.toLowerCase().startsWith(\"whisper\"))\n )\n .then((models) =>\n models.map((model) => {\n const organization =\n model.hasOwnProperty(\"owned_by\") &&\n model.owned_by !== \"no-reply@sambanova.ai\"\n ? model.owned_by\n : \"SambaNova\";\n return {\n id: model.id,\n organization,\n name: model.id,\n };\n })\n )\n .catch((e) => {\n console.error(`SambaNova:listModels`, e.message);\n return [];\n });\n return { models, error: null };\n } catch (e) {\n console.error(`SambaNova:getSambaNovaModels`, e.message);\n return { models: [], error: \"Could not fetch SambaNova Models\" };\n }\n}\n\nmodule.exports = {\n getCustomModels,\n SUPPORT_CUSTOM_MODELS,\n};\n"}}}}