From 1ccb5b5fad14a3c0deae61060c48287a63c962b1 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Tue, 5 May 2026 16:08:14 +0300 Subject: [PATCH] auto-append /v1 to vllm base_url, matching ollama behavior --- .../haiku/rag/embeddings/__init__.py | 2 + tests/test_embedder_config.py | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/haiku_rag_slim/haiku/rag/embeddings/__init__.py b/haiku_rag_slim/haiku/rag/embeddings/__init__.py index e28f100e..5d00e1d3 100644 --- a/haiku_rag_slim/haiku/rag/embeddings/__init__.py +++ b/haiku_rag_slim/haiku/rag/embeddings/__init__.py @@ -200,6 +200,8 @@ def get_embedder(config: AppConfig = Config) -> EmbedderWrapper: from haiku.rag.embeddings.vllm import VLLMMultimodalEmbedder base_url = embedding_model.base_url or "http://localhost:8000/v1" + if not base_url.rstrip("/").endswith("/v1"): + base_url = base_url.rstrip("/") + "/v1" return VLLMMultimodalEmbedder(model_name, vector_dim, base_url=base_url) raise ValueError(f"Unsupported embedding provider: {provider}") diff --git a/tests/test_embedder_config.py b/tests/test_embedder_config.py index ee620dfd..a8a37fde 100644 --- a/tests/test_embedder_config.py +++ b/tests/test_embedder_config.py @@ -111,3 +111,40 @@ def test_ollama_embedder_does_not_double_append_v1(): url = str(pa_model.base_url).rstrip("/") # type: ignore[union-attr] # ty: ignore[unresolved-attribute] assert url.endswith("/v1") assert not url.endswith("/v1/v1") + + +def test_vllm_embedder_appends_v1_when_missing(): + """vLLM's chat-completions endpoint also lives under /v1. A user who + forgets the suffix would otherwise POST to /embeddings and get + a 404 — match the Ollama behavior and append it.""" + config = AppConfig( + embeddings=EmbeddingsConfig( + model=EmbeddingModelConfig( + provider="vllm", + name="Qwen/Qwen3-VL-Embedding-8B", + vector_dim=4096, + base_url="http://my-vllm:8000", + ), + ), + ) + embedder = get_embedder(config) + base_url = embedder._base_url # type: ignore[attr-defined] # ty: ignore[unresolved-attribute] + assert base_url.endswith("/v1") + + +def test_vllm_embedder_does_not_double_append_v1(): + """If the user already includes /v1 we leave it alone.""" + config = AppConfig( + embeddings=EmbeddingsConfig( + model=EmbeddingModelConfig( + provider="vllm", + name="Qwen/Qwen3-VL-Embedding-8B", + vector_dim=4096, + base_url="http://my-vllm:8000/v1", + ), + ), + ) + embedder = get_embedder(config) + base_url = embedder._base_url.rstrip("/") # type: ignore[attr-defined] # ty: ignore[unresolved-attribute] + assert base_url.endswith("/v1") + assert not base_url.endswith("/v1/v1")