diff --git a/README.md b/README.md index ff72e6787..c2b5492fe 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ MindWork AI Studio is a free desktop app for macOS, Windows, and Linux. It provi - [IONOS](https://cloud.ionos.com/managed/ai-model-hub) (AI Model Hub running open-source models in Germany) - [LiteLLM](https://www.litellm.ai/) (an AI gateway you run yourself, in front of models from many providers) - [Hugging Face](https://huggingface.co/) using their [inference providers](https://huggingface.co/docs/inference-providers/index) such as Cerebras, Nebius, Sambanova, Novita, Hyperbolic, Together AI, Fireworks, Hugging Face - - Self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), and [vLLM](https://github.com/vllm-project/vllm) + - Self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), [vLLM](https://github.com/vllm-project/vllm), and [llmman](https://github.com/llmmanorg/llmman) - [Groq](https://groq.com/) - [Fireworks](https://fireworks.ai/) - For scientists and employees of research institutions, we also support [Helmholtz](https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570) and [GWDG](https://gwdg.de/services/application-services/ai-services/) AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index f82499d0c..d08798401 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -127,7 +127,7 @@ public EmbeddingProviderDialog() GetPreviousInstanceName = () => this.dataEditingPreviousInstanceName, GetUsedInstanceNames = () => this.UsedInstanceNames, GetHost = () => this.DataHost, - IsModelProvidedManually = () => this.DataLLMProvider is LLMProviders.SELF_HOSTED && this.DataHost is Host.OLLAMA, + IsModelProvidedManually = () => this.DataLLMProvider is LLMProviders.SELF_HOSTED && this.DataHost is (Host.OLLAMA or Host.LLMMAN), }; } @@ -137,7 +137,7 @@ private EmbeddingProvider CreateEmbeddingProviderSettings() Model model = default; if(this.DataLLMProvider is LLMProviders.SELF_HOSTED) { - if (this.DataHost is Host.OLLAMA) + if (this.DataHost is Host.OLLAMA or Host.LLMMAN) model = new Model(this.dataManuallyModel, null); else if (this.DataHost is Host.LM_STUDIO) model = this.DataModel; diff --git a/app/MindWork AI Studio/Plugins/configuration/plugin.lua b/app/MindWork AI Studio/Plugins/configuration/plugin.lua index 1ed421b9a..a4146a2b4 100644 --- a/app/MindWork AI Studio/Plugins/configuration/plugin.lua +++ b/app/MindWork AI Studio/Plugins/configuration/plugin.lua @@ -82,7 +82,7 @@ CONFIG["LLM_PROVIDERS"] = {} -- ["InstanceName"] = "", -- ["UsedLLMProvider"] = "SELF_HOSTED", -- --- -- Allowed values for Host are: LM_STUDIO, LLAMACPP, OLLAMA, and VLLM +-- -- Allowed values for Host are: LM_STUDIO, LLAMACPP, OLLAMA, VLLM, and LLMMAN -- ["Host"] = "OLLAMA", -- ["Hostname"] = "", -- @@ -200,7 +200,7 @@ CONFIG["EMBEDDING_PROVIDERS"] = {} -- ["Name"] = "", -- ["UsedLLMProvider"] = "SELF_HOSTED", -- --- -- Allowed values for Host are: LM_STUDIO, LLAMACPP, OLLAMA, and VLLM +-- -- Allowed values for Host are: LM_STUDIO, LLAMACPP, OLLAMA, VLLM, and LLMMAN -- ["Host"] = "OLLAMA", -- ["Hostname"] = "", -- diff --git a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs index 20212f930..107dd6470 100644 --- a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs +++ b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs @@ -534,6 +534,7 @@ public static bool CanLoadModels(this LLMProviders provider, Host host, string? case Host.OLLAMA: case Host.LM_STUDIO: case Host.VLLM: + case Host.LLMMAN: return true; } } diff --git a/app/MindWork AI Studio/Provider/SelfHosted/Host.cs b/app/MindWork AI Studio/Provider/SelfHosted/Host.cs index d0dde8068..3ecd92d41 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/Host.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/Host.cs @@ -9,4 +9,7 @@ public enum Host WHISPER_CPP, OLLAMA, VLLM, + + // llmman, local runner with OpenAI-compatible /v1/ routes: https://github.com/llmmanorg/llmman + LLMMAN, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs b/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs index 25dc07ca1..7045b2db8 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/HostExtensions.cs @@ -11,6 +11,7 @@ public static class HostExtensions Host.WHISPER_CPP => "whisper.cpp", Host.OLLAMA => "ollama", Host.VLLM => "vLLM", + Host.LLMMAN => "llmman", _ => "Unknown", }; @@ -47,6 +48,7 @@ public static bool IsChatSupported(this Host host) case Host.VLLM: case Host.LM_STUDIO: case Host.LLAMA_CPP: + case Host.LLMMAN: return true; } } @@ -58,6 +60,7 @@ public static bool IsEmbeddingSupported(this Host host) case Host.LM_STUDIO: case Host.OLLAMA: case Host.VLLM: + case Host.LLMMAN: return true; default: @@ -78,6 +81,7 @@ public static bool IsTranscriptionSupported(this Host host) default: case Host.LM_STUDIO: case Host.LLAMA_CPP: + case Host.LLMMAN: return false; } } diff --git a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs index 4743f87af..2f493843e 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs @@ -24,7 +24,7 @@ namespace AIStudio.Provider.SelfHosted; public override string InstanceName { get; set; } = "Self-hosted"; /// - public override bool HasModelLoadingCapability => host is Host.OLLAMA or Host.LM_STUDIO or Host.VLLM or Host.LLAMA_CPP; + public override bool HasModelLoadingCapability => host is Host.OLLAMA or Host.LM_STUDIO or Host.VLLM or Host.LLAMA_CPP or Host.LLMMAN; /// public override async IAsyncEnumerable StreamChatCompletion(Provider.Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default) @@ -101,6 +101,7 @@ public override async Task GetTextModels(string? apiKeyProvisio case Host.LM_STUDIO: case Host.OLLAMA: case Host.VLLM: + case Host.LLMMAN: return await this.LoadModels( SecretStoreType.LLM_PROVIDER, ["embed"], [], apiKeyProvisional, token); } @@ -128,6 +129,7 @@ public override async Task GetEmbeddingModels(string? apiKeyPro case Host.LM_STUDIO: case Host.OLLAMA: case Host.VLLM: + case Host.LLMMAN: return await this.LoadModels( SecretStoreType.EMBEDDING_PROVIDER, [], ["embed"], apiKeyProvisional, token); } diff --git a/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md b/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md index 1ee360db9..e575a5434 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md @@ -9,3 +9,4 @@ - Added organization-wide management for tools. IT departments can switch tools off entirely (`DataTools.EnableTools`), disable individual ones (`DataTools.DisabledToolIds`), raise the provider trust a tool requires (`DataTools.MinimumProviderConfidenceByToolId`), and manage every tool setting by tool and field name — either fixed (`DataTools.LockedToolSettings`) or as a pre-filled value the user may still change (`DataTools.DefaultToolSettings`). None of these needs to be known to AI Studio in advance, so it covers the tools future plugins will bring just as well. Secrets such as API keys can be rolled out too, encrypted with your enterprise encryption secret, the same way you already deploy provider keys. The example configuration plugin documents every setting of both tools. - Added tool calling to the abilities you can state yourself in the expert provider settings. When you use a model AI Studio does not recognize as tool-capable, you can now declare that it is, the same way you already could for image input or reasoning. - Improved loading web content in the assistants: it now uses the same reader as the Read Web Page tool, which extracts the main content of a page more reliably and skips navigation and boilerplate. Pages from your own network, including local servers, keep working as before. When a page cannot be read, AI Studio now says why instead of leaving the field empty. +- Added [llmman](https://github.com/llmmanorg/llmman) as a host option for self-hosted chat and embedding providers. llmman is a local model runner; use `http://localhost:17434` as the hostname. \ No newline at end of file