From 1091f19c67bc8dc40f5b772f640ab0d3e0b1afdb Mon Sep 17 00:00:00 2001 From: Eric Curtin Date: Fri, 4 Sep 2026 13:22:34 +0100 Subject: [PATCH] feat: add llmman as a local model provider llmman (https://github.com/llmmanorg/llmman) is a local model runner that serves the Ollama API on port 17434, so the existing Ollama credentials, chat/embedding models, /api/tags listing and /api/pull download path drive it unchanged. LlmmanModelProvider subclasses OllamaModelProvider and is registered in ModelProvideConstants, the local-provider grouping in Provider.vue and the static provider list. --- .../constants/model_provider_constants.py | 2 + .../impl/llmman_model_provider/__init__.py | 1 + .../llmman_model_provider/icon/__init__.py | 1 + .../icon/llmman_icon_svg | 5 ++ .../llmman_model_provider.py | 47 +++++++++++++++++++ .../items/model/provider-data.ts | 5 ++ ui/src/views/model/component/Provider.vue | 1 + 7 files changed, 62 insertions(+) create mode 100644 apps/models_provider/impl/llmman_model_provider/__init__.py create mode 100644 apps/models_provider/impl/llmman_model_provider/icon/__init__.py create mode 100644 apps/models_provider/impl/llmman_model_provider/icon/llmman_icon_svg create mode 100644 apps/models_provider/impl/llmman_model_provider/llmman_model_provider.py diff --git a/apps/models_provider/constants/model_provider_constants.py b/apps/models_provider/constants/model_provider_constants.py index ae749795cb7..986995d0e82 100644 --- a/apps/models_provider/constants/model_provider_constants.py +++ b/apps/models_provider/constants/model_provider_constants.py @@ -10,6 +10,7 @@ from models_provider.impl.docker_ai_model_provider.docker_ai_model_provider import DockerModelProvider from models_provider.impl.gemini_model_provider.gemini_model_provider import GeminiModelProvider from models_provider.impl.kimi_model_provider.kimi_model_provider import KimiModelProvider +from models_provider.impl.llmman_model_provider.llmman_model_provider import LlmmanModelProvider from models_provider.impl.local_model_provider.local_model_provider import LocalModelProvider from models_provider.impl.ollama_model_provider.ollama_model_provider import OllamaModelProvider from models_provider.impl.openai_model_provider.openai_model_provider import OpenAIModelProvider @@ -30,6 +31,7 @@ class ModelProvideConstants(Enum): model_azure_provider = AzureModelProvider() model_wenxin_provider = WenxinModelProvider() model_ollama_provider = OllamaModelProvider() + model_llmman_provider = LlmmanModelProvider() model_openai_provider = OpenAIModelProvider() model_docker_ai_provider = DockerModelProvider() model_kimi_provider = KimiModelProvider() diff --git a/apps/models_provider/impl/llmman_model_provider/__init__.py b/apps/models_provider/impl/llmman_model_provider/__init__.py new file mode 100644 index 00000000000..9bad5790a57 --- /dev/null +++ b/apps/models_provider/impl/llmman_model_provider/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/apps/models_provider/impl/llmman_model_provider/icon/__init__.py b/apps/models_provider/impl/llmman_model_provider/icon/__init__.py new file mode 100644 index 00000000000..9bad5790a57 --- /dev/null +++ b/apps/models_provider/impl/llmman_model_provider/icon/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/apps/models_provider/impl/llmman_model_provider/icon/llmman_icon_svg b/apps/models_provider/impl/llmman_model_provider/icon/llmman_icon_svg new file mode 100644 index 00000000000..fe064836a6b --- /dev/null +++ b/apps/models_provider/impl/llmman_model_provider/icon/llmman_icon_svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/models_provider/impl/llmman_model_provider/llmman_model_provider.py b/apps/models_provider/impl/llmman_model_provider/llmman_model_provider.py new file mode 100644 index 00000000000..4f57707c33c --- /dev/null +++ b/apps/models_provider/impl/llmman_model_provider/llmman_model_provider.py @@ -0,0 +1,47 @@ +# coding=utf-8 +""" + llmman (https://github.com/llmmanorg/llmman) is a local model runner that serves the + Ollama API on port 17434, so the Ollama model classes and credentials are reused as-is. +""" +import os + +from common.utils.common import get_file_content +from maxkb.conf import PROJECT_DIR +from models_provider.base_model_provider import ModelInfo, ModelInfoManage, ModelProvideInfo, ModelTypeConst +from models_provider.impl.ollama_model_provider.credential.embedding import OllamaEmbeddingModelCredential +from models_provider.impl.ollama_model_provider.credential.llm import OllamaLLMModelCredential +from models_provider.impl.ollama_model_provider.model.embedding import OllamaEmbedding +from models_provider.impl.ollama_model_provider.model.llm import OllamaChatModel +from models_provider.impl.ollama_model_provider.ollama_model_provider import OllamaModelProvider + +llmman_llm_model_credential = OllamaLLMModelCredential() +llmman_embedding_model_credential = OllamaEmbeddingModelCredential() +model_info_list = [ + ModelInfo('gemma4', '', ModelTypeConst.LLM, llmman_llm_model_credential, OllamaChatModel), + ModelInfo('qwen3.8', '', ModelTypeConst.LLM, llmman_llm_model_credential, OllamaChatModel), + ModelInfo('hf.co/unsloth/Qwen3.5-0.8B-GGUF', '', ModelTypeConst.LLM, llmman_llm_model_credential, + OllamaChatModel), +] +embedding_model_info = [ + ModelInfo('hf.co/nomic-ai/nomic-embed-text-v1.5-GGUF', '', ModelTypeConst.EMBEDDING, + llmman_embedding_model_credential, OllamaEmbedding), +] + +model_info_manage = ( + ModelInfoManage.builder() + .append_model_info_list(model_info_list) + .append_default_model_info(model_info_list[0]) + .append_model_info_list(embedding_model_info) + .append_default_model_info(embedding_model_info[0]) + .build() +) + + +class LlmmanModelProvider(OllamaModelProvider): + def get_model_info_manage(self): + return model_info_manage + + def get_model_provide_info(self): + return ModelProvideInfo(provider='model_llmman_provider', name='llmman', icon=get_file_content( + os.path.join(PROJECT_DIR, "apps", 'models_provider', 'impl', 'llmman_model_provider', 'icon', + 'llmman_icon_svg'))) diff --git a/ui/src/components/dynamics-form/items/model/provider-data.ts b/ui/src/components/dynamics-form/items/model/provider-data.ts index 5e7b39b82c6..6b6ee31fe0a 100644 --- a/ui/src/components/dynamics-form/items/model/provider-data.ts +++ b/ui/src/components/dynamics-form/items/model/provider-data.ts @@ -14,6 +14,11 @@ export const providerList = [ "name": "Ollama", "icon": " \n\n" }, + { + "provider": "model_llmman_provider", + "name": "llmman", + "icon": "\n\n\n\n\n" + }, { "provider": "model_openai_provider", "name": "OpenAI", diff --git a/ui/src/views/model/component/Provider.vue b/ui/src/views/model/component/Provider.vue index 1498e20c8a9..fe2f8732cf6 100644 --- a/ui/src/views/model/component/Provider.vue +++ b/ui/src/views/model/component/Provider.vue @@ -126,6 +126,7 @@ watch( (list) => { const local_provider = [ 'model_ollama_provider', + 'model_llmman_provider', 'model_local_provider', 'model_xinference_provider', 'model_vllm_provider',