diff --git a/README.md b/README.md index 79564201d45..842efa07188 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Some cool features of AnythingLLM - [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) - [LocalAi (all)](https://localai.io/) - [Ollama (all)](https://ollama.ai/) - +- [LM Studio (all)](https://lmstudio.ai) **Supported Transcription models:** diff --git a/docker/.env.example b/docker/.env.example index 32f2a55d48d..aabc139f8cd 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -85,10 +85,15 @@ GID='1000' # EMBEDDING_MODEL_MAX_CHUNK_LENGTH=1000 # The max chunk size in chars a string to embed can be # EMBEDDING_ENGINE='ollama' -# EMBEDDING_BASE_PATH='http://127.0.0.1:11434' +# EMBEDDING_BASE_PATH='http://host.docker.internal:11434' # EMBEDDING_MODEL_PREF='nomic-embed-text:latest' # EMBEDDING_MODEL_MAX_CHUNK_LENGTH=8192 +# EMBEDDING_ENGINE='lmstudio' +# EMBEDDING_BASE_PATH='https://host.docker.internal:1234/v1' +# EMBEDDING_MODEL_PREF='nomic-ai/nomic-embed-text-v1.5-GGUF/nomic-embed-text-v1.5.Q4_0.gguf' +# EMBEDDING_MODEL_MAX_CHUNK_LENGTH=8192 + ########################################### ######## Vector Database Selection ######## ########################################### diff --git a/frontend/src/components/EmbeddingSelection/LMStudioOptions/index.jsx b/frontend/src/components/EmbeddingSelection/LMStudioOptions/index.jsx new file mode 100644 index 00000000000..1192ce675fe --- /dev/null +++ b/frontend/src/components/EmbeddingSelection/LMStudioOptions/index.jsx @@ -0,0 +1,120 @@ +import React, { useEffect, useState } from "react"; +import System from "@/models/system"; + +export default function LMStudioEmbeddingOptions({ settings }) { + const [basePathValue, setBasePathValue] = useState( + settings?.EmbeddingBasePath + ); + const [basePath, setBasePath] = useState(settings?.EmbeddingBasePath); + + return ( +
+
+
+ + setBasePathValue(e.target.value)} + onBlur={() => setBasePath(basePathValue)} + required={true} + autoComplete="off" + spellCheck={false} + /> +
+ +
+ + e.target.blur()} + defaultValue={settings?.EmbeddingModelMaxChunkLength} + required={false} + autoComplete="off" + /> +
+
+
+ ); +} + +function LMStudioModelSelection({ settings, basePath = null }) { + const [customModels, setCustomModels] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + async function findCustomModels() { + if (!basePath || !basePath.includes("/v1")) { + setCustomModels([]); + setLoading(false); + return; + } + setLoading(true); + const { models } = await System.customModels("lmstudio", null, basePath); + setCustomModels(models || []); + setLoading(false); + } + findCustomModels(); + }, [basePath]); + + if (loading || customModels.length == 0) { + return ( +
+ + +
+ ); + } + + return ( +
+ + +
+ ); +} diff --git a/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx b/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx index b3ecab4b173..25dcd62d3ed 100644 --- a/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx @@ -8,6 +8,7 @@ import OpenAiLogo from "@/media/llmprovider/openai.png"; import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; import LocalAiLogo from "@/media/llmprovider/localai.png"; import OllamaLogo from "@/media/llmprovider/ollama.png"; +import LMStudioLogo from "@/media/llmprovider/lmstudio.png"; import PreLoader from "@/components/Preloader"; import ChangeWarningModal from "@/components/ChangeWarning"; import OpenAiOptions from "@/components/EmbeddingSelection/OpenAiOptions"; @@ -15,6 +16,7 @@ import AzureAiOptions from "@/components/EmbeddingSelection/AzureAiOptions"; import LocalAiOptions from "@/components/EmbeddingSelection/LocalAiOptions"; import NativeEmbeddingOptions from "@/components/EmbeddingSelection/NativeEmbeddingOptions"; import OllamaEmbeddingOptions from "@/components/EmbeddingSelection/OllamaOptions"; +import LMStudioEmbeddingOptions from "@/components/EmbeddingSelection/LMStudioOptions"; import EmbedderItem from "@/components/EmbeddingSelection/EmbedderItem"; import { CaretUpDown, MagnifyingGlass, X } from "@phosphor-icons/react"; import { useModal } from "@/hooks/useModal"; @@ -58,6 +60,14 @@ const EMBEDDERS = [ options: (settings) => , description: "Run embedding models locally on your own machine.", }, + { + name: "LM Studio", + value: "lmstudio", + logo: LMStudioLogo, + options: (settings) => , + description: + "Discover, download, and run thousands of cutting edge LLMs in a few clicks.", + }, ]; export default function GeneralEmbeddingPreference() { diff --git a/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx index bd8487842db..11612b99b08 100644 --- a/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx +++ b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx @@ -237,6 +237,13 @@ export const EMBEDDING_ENGINE_PRIVACY = { ], logo: OllamaLogo, }, + lmstudio: { + name: "LMStudio", + description: [ + "Your document text is embedded privately on the server running LMStudio", + ], + logo: LMStudioLogo, + }, }; export default function DataHandling({ setHeader, setForwardBtn, setBackBtn }) { diff --git a/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx index 1932309e43f..fc44a68de96 100644 --- a/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx +++ b/frontend/src/pages/OnboardingFlow/Steps/EmbeddingPreference/index.jsx @@ -5,11 +5,13 @@ import OpenAiLogo from "@/media/llmprovider/openai.png"; import AzureOpenAiLogo from "@/media/llmprovider/azure.png"; import LocalAiLogo from "@/media/llmprovider/localai.png"; import OllamaLogo from "@/media/llmprovider/ollama.png"; +import LMStudioLogo from "@/media/llmprovider/lmstudio.png"; import NativeEmbeddingOptions from "@/components/EmbeddingSelection/NativeEmbeddingOptions"; import OpenAiOptions from "@/components/EmbeddingSelection/OpenAiOptions"; import AzureAiOptions from "@/components/EmbeddingSelection/AzureAiOptions"; import LocalAiOptions from "@/components/EmbeddingSelection/LocalAiOptions"; import OllamaEmbeddingOptions from "@/components/EmbeddingSelection/OllamaOptions"; +import LMStudioEmbeddingOptions from "@/components/EmbeddingSelection/LMStudioOptions"; import EmbedderItem from "@/components/EmbeddingSelection/EmbedderItem"; import System from "@/models/system"; import paths from "@/utils/paths"; @@ -19,6 +21,52 @@ import { useNavigate } from "react-router-dom"; const TITLE = "Embedding Preference"; const DESCRIPTION = "AnythingLLM can work with many embedding models. This will be the model which turns documents into vectors."; +const EMBEDDERS = [ + { + name: "AnythingLLM Embedder", + value: "native", + logo: AnythingLLMIcon, + options: (settings) => , + description: + "Use the built-in embedding engine for AnythingLLM. Zero setup!", + }, + { + name: "OpenAI", + value: "openai", + logo: OpenAiLogo, + options: (settings) => , + description: "The standard option for most non-commercial use.", + }, + { + name: "Azure OpenAI", + value: "azure", + logo: AzureOpenAiLogo, + options: (settings) => , + description: "The enterprise option of OpenAI hosted on Azure services.", + }, + { + name: "Local AI", + value: "localai", + logo: LocalAiLogo, + options: (settings) => , + description: "Run embedding models locally on your own machine.", + }, + { + name: "Ollama", + value: "ollama", + logo: OllamaLogo, + options: (settings) => , + description: "Run embedding models locally on your own machine.", + }, + { + name: "LM Studio", + value: "lmstudio", + logo: LMStudioLogo, + options: (settings) => , + description: + "Discover, download, and run thousands of cutting edge LLMs in a few clicks.", + }, +]; export default function EmbeddingPreference({ setHeader, @@ -42,45 +90,6 @@ export default function EmbeddingPreference({ fetchKeys(); }, []); - const EMBEDDERS = [ - { - name: "AnythingLLM Embedder", - value: "native", - logo: AnythingLLMIcon, - options: , - description: - "Use the built-in embedding engine for AnythingLLM. Zero setup!", - }, - { - name: "OpenAI", - value: "openai", - logo: OpenAiLogo, - options: , - description: "The standard option for most non-commercial use.", - }, - { - name: "Azure OpenAI", - value: "azure", - logo: AzureOpenAiLogo, - options: , - description: "The enterprise option of OpenAI hosted on Azure services.", - }, - { - name: "Local AI", - value: "localai", - logo: LocalAiLogo, - options: , - description: "Run embedding models locally on your own machine.", - }, - { - name: "Ollama", - value: "ollama", - logo: OllamaLogo, - options: , - description: "Run embedding models locally on your own machine.", - }, - ]; - function handleForward() { if (hiddenSubmitButtonRef.current) { hiddenSubmitButtonRef.current.click(); @@ -161,8 +170,9 @@ export default function EmbeddingPreference({
{selectedEmbedder && - EMBEDDERS.find((embedder) => embedder.value === selectedEmbedder) - ?.options} + EMBEDDERS.find( + (embedder) => embedder.value === selectedEmbedder + )?.options(settings)}