Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
21 KiB
JSON

{"repo": "ardotheedu/anything-llm", "files": {"server/utils/helpers/customModels.js": {"1bd8a805702d6293e796fe1cc54e97e3a4be6501": {"t": 1786068268.5626001, "n": 20328, "h": "97e4f9179dce2168", "c": "const { fetchOpenRouterModels } = require(\"../AiProviders/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\");\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 \"xai\",\n \"gemini\",\n \"ppio\",\n \"dpais\",\n \"moonshotai\",\n // Embedding Engines\n \"native-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);\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 \"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 \"native-embedder\":\n return await getNativeEmbedderModels();\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) {\n try {\n const { OpenAI: OpenAIApi } = require(\"openai\");\n const openai = new OpenAIApi({\n baseURL: parseLMStudioBasePath(\n basePath || process.env.LMSTUDIO_BASE_PATH\n ),\n 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() {\n const knownModels = fireworksAiModels();\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 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 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 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((model) => model.capability === \"TextToText\") // Only include text-to-text models for this handler\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\nmodule.exports = {\n getCustomModels,\n SUPPORT_CUSTOM_MODELS,\n};\n"}}}}