From 958fe43f2a0830ae70324e5522d97c57d1d39f8a Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Fri, 26 Dec 2025 12:02:55 +0200 Subject: [PATCH] Remove vllm and lmstudio custom configs, they can now use the openai base --- CHANGELOG.md | 1 + docs/configuration/providers.md | 7 ++---- haiku_rag_slim/haiku/rag/config/__init__.py | 4 --- haiku_rag_slim/haiku/rag/config/models.py | 13 ---------- .../haiku/rag/reranking/__init__.py | 5 +++- haiku_rag_slim/haiku/rag/reranking/vllm.py | 5 ++-- tests/test_qa.py | 25 ------------------- tests/test_reranker.py | 10 +++++--- 8 files changed, 15 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b55504b3..d0840676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ ### Removed - Deleted obsolete embedder implementations: `ollama.py`, `openai.py`, `vllm.py`, `lm_studio.py`, `base.py` +- Removed `VLLMConfig` and `LMStudioConfig` from configuration (use `base_url` in model config instead) ## [0.22.0] - 2025-12-19 diff --git a/docs/configuration/providers.md b/docs/configuration/providers.md index 7d847a46..12bb9603 100644 --- a/docs/configuration/providers.md +++ b/docs/configuration/providers.md @@ -378,10 +378,7 @@ reranking: model: provider: vllm name: mixedbread-ai/mxbai-rerank-base-v2 - -providers: - vllm: - rerank_base_url: http://localhost:8001 + base_url: http://localhost:8001 ``` -**Note:** vLLM reranking uses the `/rerank` API endpoint. You need to run a vLLM server separately with a reranking model loaded. Consult the specific model's documentation for proper vLLM serving configuration. +**Note:** vLLM reranking uses the `/v1/rerank` API endpoint. You need to run a vLLM server separately with a reranking model loaded. diff --git a/haiku_rag_slim/haiku/rag/config/__init__.py b/haiku_rag_slim/haiku/rag/config/__init__.py index c8c8b99d..e4efd7c6 100644 --- a/haiku_rag_slim/haiku/rag/config/__init__.py +++ b/haiku_rag_slim/haiku/rag/config/__init__.py @@ -12,7 +12,6 @@ from haiku.rag.config.models import ( EmbeddingModelConfig, EmbeddingsConfig, LanceDBConfig, - LMStudioConfig, ModelConfig, MonitorConfig, OllamaConfig, @@ -22,7 +21,6 @@ from haiku.rag.config.models import ( RerankingConfig, ResearchConfig, StorageConfig, - VLLMConfig, ) __all__ = [ @@ -33,7 +31,6 @@ __all__ = [ "EmbeddingModelConfig", "EmbeddingsConfig", "LanceDBConfig", - "LMStudioConfig", "ModelConfig", "MonitorConfig", "OllamaConfig", @@ -43,7 +40,6 @@ __all__ = [ "RerankingConfig", "ResearchConfig", "StorageConfig", - "VLLMConfig", "find_config_file", "generate_default_config", "get_config", diff --git a/haiku_rag_slim/haiku/rag/config/models.py b/haiku_rag_slim/haiku/rag/config/models.py index 2e6c5e1e..50b4ffd9 100644 --- a/haiku_rag_slim/haiku/rag/config/models.py +++ b/haiku_rag_slim/haiku/rag/config/models.py @@ -142,27 +142,14 @@ class OllamaConfig(BaseModel): ) -class VLLMConfig(BaseModel): - embeddings_base_url: str = "" - rerank_base_url: str = "" - qa_base_url: str = "" - research_base_url: str = "" - - class DoclingServeConfig(BaseModel): base_url: str = "http://localhost:5001" api_key: str = "" timeout: int = 300 -class LMStudioConfig(BaseModel): - base_url: str = "http://localhost:1234" - - class ProvidersConfig(BaseModel): ollama: OllamaConfig = Field(default_factory=OllamaConfig) - vllm: VLLMConfig = Field(default_factory=VLLMConfig) - lm_studio: LMStudioConfig = Field(default_factory=LMStudioConfig) docling_serve: DoclingServeConfig = Field(default_factory=DoclingServeConfig) diff --git a/haiku_rag_slim/haiku/rag/reranking/__init__.py b/haiku_rag_slim/haiku/rag/reranking/__init__.py index 0fc83e3f..b3502db6 100644 --- a/haiku_rag_slim/haiku/rag/reranking/__init__.py +++ b/haiku_rag_slim/haiku/rag/reranking/__init__.py @@ -45,7 +45,10 @@ def get_reranker(config: AppConfig = Config) -> RerankerBase | None: try: from haiku.rag.reranking.vllm import VLLMReranker - reranker = VLLMReranker(config.reranking.model.name) + base_url = config.reranking.model.base_url + if not base_url: + raise ValueError("vLLM reranker requires base_url in reranking.model") + reranker = VLLMReranker(config.reranking.model.name, base_url) except ImportError: reranker = None diff --git a/haiku_rag_slim/haiku/rag/reranking/vllm.py b/haiku_rag_slim/haiku/rag/reranking/vllm.py index 750d9f85..ab370110 100644 --- a/haiku_rag_slim/haiku/rag/reranking/vllm.py +++ b/haiku_rag_slim/haiku/rag/reranking/vllm.py @@ -1,14 +1,13 @@ import httpx -from haiku.rag.config import Config from haiku.rag.reranking.base import RerankerBase from haiku.rag.store.models.chunk import Chunk class VLLMReranker(RerankerBase): # pragma: no cover - def __init__(self, model: str): + def __init__(self, model: str, base_url: str): self._model = model - self._base_url = Config.providers.vllm.rerank_base_url + self._base_url = base_url async def rerank( self, query: str, chunks: list[Chunk], top_n: int = 10 diff --git a/tests/test_qa.py b/tests/test_qa.py index 52626516..db0e04b0 100644 --- a/tests/test_qa.py +++ b/tests/test_qa.py @@ -5,13 +5,11 @@ from datasets import Dataset from evaluations.evaluators import LLMJudge from haiku.rag.client import HaikuRAG -from haiku.rag.config import Config from haiku.rag.config.models import ModelConfig from haiku.rag.qa.agent import QuestionAnswerAgent OPENAI_AVAILABLE = bool(os.getenv("OPENAI_API_KEY")) ANTHROPIC_AVAILABLE = bool(os.getenv("ANTHROPIC_API_KEY")) -VLLM_QA_AVAILABLE = bool(Config.providers.vllm.qa_base_url) @pytest.mark.asyncio @@ -87,26 +85,3 @@ async def test_qa_anthropic(qa_corpus: Dataset, temp_db_path): assert is_equivalent, ( f"Generated answer not equivalent to expected answer.\nQuestion: {question}\nGenerated: {answer}\nExpected: {expected_answer}" ) - - -@pytest.mark.asyncio -@pytest.mark.skipif(not VLLM_QA_AVAILABLE, reason="vLLM QA server not configured") -async def test_qa_vllm(qa_corpus: Dataset, temp_db_path): - """Test vLLM QA with LLM judge.""" - client = HaikuRAG(temp_db_path, create=True) - qa = QuestionAnswerAgent(client, ModelConfig(provider="vllm", name="Qwen/Qwen3-4B")) - llm_judge = LLMJudge() - - doc = qa_corpus[1] - await client.create_document( - content=doc["document_extracted"], uri=doc["document_id"] - ) - - question = doc["question"] - expected_answer = doc["answer"] - answer, _ = await qa.answer(question) - is_equivalent = await llm_judge.judge_answers(question, answer, expected_answer) - - assert is_equivalent, ( - f"Generated answer not equivalent to expected answer.\nQuestion: {question}\nGenerated: {answer}\nExpected: {expected_answer}" - ) diff --git a/tests/test_reranker.py b/tests/test_reranker.py index 80a73b2d..0370d431 100644 --- a/tests/test_reranker.py +++ b/tests/test_reranker.py @@ -2,13 +2,12 @@ import os import pytest -from haiku.rag.config import Config from haiku.rag.reranking.base import RerankerBase from haiku.rag.reranking.vllm import VLLMReranker from haiku.rag.store.models.chunk import Chunk COHERE_AVAILABLE = bool(os.getenv("CO_API_KEY")) -VLLM_RERANK_AVAILABLE = bool(Config.providers.vllm.rerank_base_url) +VLLM_RERANK_BASE_URL = os.getenv("VLLM_RERANK_BASE_URL", "") ZEROENTROPY_AVAILABLE = bool(os.getenv("ZEROENTROPY_API_KEY")) chunks = [ @@ -41,6 +40,7 @@ async def test_reranker_base(): @pytest.mark.asyncio async def test_mxbai_reranker(): try: + from haiku.rag.config import Config from haiku.rag.config.models import ModelConfig from haiku.rag.reranking.mxbai import MxBAIReranker @@ -80,11 +80,13 @@ async def test_cohere_reranker(): @pytest.mark.asyncio @pytest.mark.skipif( - not VLLM_RERANK_AVAILABLE, reason="vLLM rerank server not configured" + not VLLM_RERANK_BASE_URL, reason="vLLM rerank server not configured" ) async def test_vllm_reranker(): try: - reranker = VLLMReranker("mixedbread-ai/mxbai-rerank-base-v2") + reranker = VLLMReranker( + "mixedbread-ai/mxbai-rerank-base-v2", VLLM_RERANK_BASE_URL + ) reranked = await reranker.rerank( "Who wrote 'To Kill a Mockingbird'?", chunks, top_n=2