From a209ef1ae23e6c1ddd8ab8f9cef903c2f076cf04 Mon Sep 17 00:00:00 2001 From: akhater Date: Mon, 30 Mar 2026 11:32:10 +0300 Subject: [PATCH] fix: parse query params from base_url in OpenAI embeddings client (#735) * fix: parse query params from base_url in OpenAI embeddings client The OpenAI-compatible LLM provider already parses query parameters (e.g. ?api-version=xxx for Azure OpenAI) from the base_url and passes them as default_query to the OpenAI client. However, the OpenAI embeddings provider did not do this, causing Azure OpenAI embeddings to fail with 404 errors at runtime. This applies the same URL parsing logic from the LLM provider to the embeddings provider, enabling Azure OpenAI embeddings to work correctly. * ci: add workflow to build fork Docker image * ci: add slim image build (no local models) * ci: remove fork build workflow per review request --------- Co-authored-by: Antoine Khater --- .../hindsight_api/engine/embeddings.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/hindsight-api-slim/hindsight_api/engine/embeddings.py b/hindsight-api-slim/hindsight_api/engine/embeddings.py index 7ba9b1bd..37d446c6 100644 --- a/hindsight-api-slim/hindsight_api/engine/embeddings.py +++ b/hindsight-api-slim/hindsight_api/engine/embeddings.py @@ -13,6 +13,7 @@ import logging import os import warnings from abc import ABC, abstractmethod +from urllib.parse import parse_qs, urlparse, urlunparse import httpx @@ -426,9 +427,19 @@ class OpenAIEmbeddings(Embeddings): logger.info(f"Embeddings: initializing OpenAI provider with model {self.model}{base_url_msg}") # Build client kwargs, only including base_url if set (for Azure or custom endpoints) + # Parse query parameters from base_url (e.g. ?api-version=xxx for Azure OpenAI) + # and pass them as default_query so they're included in every request. client_kwargs = {"api_key": self.api_key, "max_retries": self.max_retries} if self.base_url: - client_kwargs["base_url"] = self.base_url + parsed = urlparse(self.base_url) + if parsed.query: + clean_url = urlunparse(parsed._replace(query="")) + client_kwargs["base_url"] = clean_url + default_query = {k: v[0] for k, v in parse_qs(parsed.query).items()} + client_kwargs["default_query"] = default_query + self.base_url = clean_url + else: + client_kwargs["base_url"] = self.base_url self._client = OpenAI(**client_kwargs) # Try to get dimension from known models, otherwise do a test embedding