From 3141c91023fb1700150bf084e08f41a2728a4c61 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Wed, 24 Dec 2025 12:33:44 +0200 Subject: [PATCH] Add base_url to ModelConfig and EmbeddingModelConfig. Deprecate vllm and lm_studio configs, now through open ai --- haiku_rag_slim/haiku/rag/config/models.py | 6 ++- haiku_rag_slim/haiku/rag/utils.py | 61 +++++------------------ 2 files changed, 17 insertions(+), 50 deletions(-) diff --git a/haiku_rag_slim/haiku/rag/config/models.py b/haiku_rag_slim/haiku/rag/config/models.py index 7048de89..2e6c5e1e 100644 --- a/haiku_rag_slim/haiku/rag/config/models.py +++ b/haiku_rag_slim/haiku/rag/config/models.py @@ -12,6 +12,7 @@ class ModelConfig(BaseModel): Attributes: provider: Model provider (ollama, openai, anthropic, etc.) name: Model name/identifier + base_url: Optional base URL for OpenAI-compatible servers (vLLM, LM Studio, etc.) enable_thinking: Control reasoning behavior (true/false/None for default) temperature: Sampling temperature (0.0 to 1.0+) max_tokens: Maximum tokens to generate @@ -19,6 +20,7 @@ class ModelConfig(BaseModel): provider: str = "ollama" name: str = "gpt-oss" + base_url: str | None = None enable_thinking: bool | None = None temperature: float | None = None @@ -29,14 +31,16 @@ class EmbeddingModelConfig(BaseModel): """Configuration for an embedding model. Attributes: - provider: Model provider (ollama, openai, voyageai, vllm, lm_studio) + provider: Model provider (ollama, openai, voyageai, cohere, sentence-transformers) name: Model name/identifier vector_dim: Vector dimensions produced by the model + base_url: Optional base URL for OpenAI-compatible servers (vLLM, LM Studio, etc.) """ provider: str = "ollama" name: str = "qwen3-embedding:4b" vector_dim: int = 2560 + base_url: str | None = None class StorageConfig(BaseModel): diff --git a/haiku_rag_slim/haiku/rag/utils.py b/haiku_rag_slim/haiku/rag/utils.py index 2b8b3fd8..67c15d6b 100644 --- a/haiku_rag_slim/haiku/rag/utils.py +++ b/haiku_rag_slim/haiku/rag/utils.py @@ -135,11 +135,12 @@ def get_model( model_settings, OpenAIChatModelSettings, model_config ) + # Use model-level base_url if set, otherwise fall back to providers config + base_url = model_config.base_url or f"{app_config.providers.ollama.base_url}/v1" + return OpenAIChatModel( model_name=model, - provider=OllamaProvider( - base_url=f"{app_config.providers.ollama.base_url}/v1" - ), + provider=OllamaProvider(base_url=base_url), settings=model_settings, ) @@ -159,6 +160,14 @@ def get_model( openai_settings, OpenAIChatModelSettings, model_config ) + # Use model-level base_url if set (for vLLM, LM Studio, etc.) + if model_config.base_url: + return OpenAIChatModel( + model_name=model, + provider=OpenAIProvider(base_url=model_config.base_url), + settings=openai_settings, + ) + return OpenAIChatModel(model_name=model, settings=openai_settings) elif provider == "anthropic": @@ -264,52 +273,6 @@ def get_model( return BedrockConverseModel(model_name=model, settings=bedrock_settings) - elif provider == "vllm": - vllm_settings = None - - # Apply thinking control for gpt-oss - if model == "gpt-oss" and model_config.enable_thinking is not None: - if model_config.enable_thinking is False: - vllm_settings = OpenAIChatModelSettings(openai_reasoning_effort="low") - else: - vllm_settings = OpenAIChatModelSettings(openai_reasoning_effort="high") - - vllm_settings = apply_common_settings( - vllm_settings, OpenAIChatModelSettings, model_config - ) - - return OpenAIChatModel( - model_name=model, - provider=OpenAIProvider( - base_url=f"{app_config.providers.vllm.research_base_url or app_config.providers.vllm.qa_base_url}/v1", - api_key="none", - ), - settings=vllm_settings, - ) - - elif provider == "lm_studio": - model_settings = None - - # Apply thinking control for gpt-oss - if model == "gpt-oss" and model_config.enable_thinking is not None: - if model_config.enable_thinking is False: - model_settings = OpenAIChatModelSettings(openai_reasoning_effort="low") - else: - model_settings = OpenAIChatModelSettings(openai_reasoning_effort="high") - - model_settings = apply_common_settings( - model_settings, OpenAIChatModelSettings, model_config - ) - - return OpenAIChatModel( - model_name=model, - provider=OpenAIProvider( - base_url=f"{app_config.providers.lm_studio.base_url}/v1", - api_key="dummy", - ), - settings=model_settings, - ) - else: # For any other provider, use string format and let Pydantic AI handle it return f"{provider}:{model}"