From a1832e324576d911552c6140b5baa114722ed06d Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Mon, 22 Dec 2025 11:15:27 +0100 Subject: [PATCH] refactor: consolidate Ollama model configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add OLLAMA_EMBEDDING_MODEL for embeddings (nomic-embed-text) - OLLAMA_MODEL now used for all LLM operations (mistral-nemo-large:latest) - Remove separate reranker_model setting - Update WikiPageWriter to use settings instead of hardcoded model - Improves VRAM efficiency by keeping one model hot 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 11 +++++++++++ README.md | 3 ++- pyproject.toml | 2 +- src/config.py | 6 +++--- src/core/dependencies.py | 2 +- src/routers/wiki.py | 2 +- src/services/consolidation_service.py | 4 ++-- src/services/hybrid_rag_service.py | 4 ++-- src/services/wiki_page_writer.py | 7 ++++--- 9 files changed, 27 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c4498c..b81870b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to Library Desk will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.2] - 2025-12-22 + +### Changed + +- **Consolidated Ollama model configuration** - All LLM operations now use single `OLLAMA_MODEL` environment variable + - Removed separate `reranker_model` setting + - HybridRAG re-ranking, consolidation analysis, and wiki page writing all use the same model + - Improves VRAM efficiency by keeping one model hot +- Added `OLLAMA_EMBEDDING_MODEL` environment variable for embedding model (previously overloaded `OLLAMA_MODEL`) +- Updated WikiPageWriter to accept settings instead of hardcoded model name + ## [1.3.1] - 2025-12-16 ### Fixed diff --git a/README.md b/README.md index 1bb5bd2..d1f2e7a 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,8 @@ QDRANT_PORT=6333 WIKIJS_URL=http://wiki:3000 SEARXNG_URL=http://searxng:8080 OLLAMA_URL=http://ollama:11434 -OLLAMA_MODEL=nomic-embed-text +OLLAMA_MODEL=mistral-nemo-large:latest +OLLAMA_EMBEDDING_MODEL=nomic-embed-text REDIS_HOST=redis-shared REDIS_PORT=6379 REDIS_DB=2 diff --git a/pyproject.toml b/pyproject.toml index 6209483..817c1c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "library-desk" -version = "1.3.1" +version = "1.3.2" description = "Coordination service for The Library system - HybridRAG queries, document ingestion, entity extraction, and knowledge consolidation" readme = "README.md" requires-python = ">=3.12" diff --git a/src/config.py b/src/config.py index 1c846be..a8d65b5 100644 --- a/src/config.py +++ b/src/config.py @@ -62,12 +62,12 @@ class Settings(BaseSettings): # SearXNG Configuration searxng_url: str = Field(default="http://searxng:8080", description="SearXNG URL") - # Ollama Configuration (for embeddings) + # Ollama Configuration ollama_url: str = Field(default="http://ollama:11434", description="Ollama URL") - ollama_model: str = Field(default="nomic-embed-text", description="Ollama embedding model") + ollama_model: str = Field(default="mistral-nemo-large:latest", description="Ollama LLM model") + ollama_embedding_model: str = Field(default="nomic-embed-text", description="Ollama embedding model") # HybridRAG Configuration - reranker_model: str = Field(default="mistral-nemo", description="Model for LLM re-ranking") reranker_enabled: bool = Field(default=True, description="Enable LLM re-ranking") hybrid_rag_vector_limit: int = Field(default=10, ge=1, le=50, description="Vector search limit") hybrid_rag_graph_limit: int = Field(default=10, ge=1, le=50, description="Graph search limit") diff --git a/src/core/dependencies.py b/src/core/dependencies.py index eb3fe7d..f0cc814 100644 --- a/src/core/dependencies.py +++ b/src/core/dependencies.py @@ -113,7 +113,7 @@ def get_ollama_client() -> OllamaClient: settings = get_settings() client = OllamaClient( base_url=settings.ollama_url, - model=settings.ollama_model + model=settings.ollama_embedding_model ) logger.debug("Created Ollama client instance") return client diff --git a/src/routers/wiki.py b/src/routers/wiki.py index ab0c255..d84b71f 100644 --- a/src/routers/wiki.py +++ b/src/routers/wiki.py @@ -229,7 +229,7 @@ async def smart_create_page( content_extractor=content_extractor, settings=settings ) - wiki_page_writer = WikiPageWriter(ollama_client=ollama_client) + wiki_page_writer = WikiPageWriter(ollama_client=ollama_client, settings=settings) # Step 1-5: Research + Generate + Create page page, research_data = await wiki_service.smart_create_page( diff --git a/src/services/consolidation_service.py b/src/services/consolidation_service.py index 6cee204..c81cd89 100644 --- a/src/services/consolidation_service.py +++ b/src/services/consolidation_service.py @@ -47,7 +47,7 @@ class ConsolidationService: self.ollama = ollama self.wiki = wiki self.settings = settings - self.wiki_page_writer = WikiPageWriter(ollama_client=ollama) + self.wiki_page_writer = WikiPageWriter(ollama_client=ollama, settings=settings) self.ingestion_service = ingestion_service # Optional to avoid circular dependency async def consolidate_knowledge( @@ -465,7 +465,7 @@ JSON:""" # Call Ollama for analysis response = await self.ollama.generate_text( prompt=prompt, - model=self.settings.reranker_model, # Use mistral-nemo + model=self.settings.ollama_model, stream=False ) diff --git a/src/services/hybrid_rag_service.py b/src/services/hybrid_rag_service.py index 331798a..aa2dbc8 100644 --- a/src/services/hybrid_rag_service.py +++ b/src/services/hybrid_rag_service.py @@ -6,7 +6,7 @@ HybridRAG service combining vector, graph, and web search. 1. Parallel Retrieval - Vector + Graph + Web search 2. RRF Fusion - Merge results with Reciprocal Rank Fusion 3. Enrichment - Add related dossiers via graph -4. LLM Re-ranking - Re-rank with mistral-nemo +4. LLM Re-ranking - Re-rank with configured Ollama model 5. Context Formatting - Format for LLM consumption 6. Persistence - Store for Librarian processing """ @@ -65,7 +65,7 @@ class HybridRAGService: self.ollama = ollama_client self.content_extractor = content_extractor self.settings = settings - self.reranker_model = settings.reranker_model + self.reranker_model = settings.ollama_model async def search( self, diff --git a/src/services/wiki_page_writer.py b/src/services/wiki_page_writer.py index 43ce86b..1307d34 100644 --- a/src/services/wiki_page_writer.py +++ b/src/services/wiki_page_writer.py @@ -1,7 +1,7 @@ """ Intelligent Wiki Page Writer Service -Uses LLM (mistral-nemo) to create and reconstruct wiki pages with: +Uses LLM to create and reconstruct wiki pages with: - Holistic content restructuring - Zero fact loss (unless superseded) - Conflict detection and flagging @@ -25,15 +25,16 @@ class WikiPageWriter: Intelligent wiki page writer using LLM for content generation and restructuring. """ - def __init__(self, ollama_client): + def __init__(self, ollama_client, settings): """ Initialize wiki page writer. Args: ollama_client: OllamaClient for LLM operations + settings: Application settings """ self.ollama = ollama_client - self.model = "mistral-nemo" # Default model for writing + self.model = settings.ollama_model async def create_page( self,