From f211f2335e8ddefc2b94690332636c8d7a32a2fe Mon Sep 17 00:00:00 2001 From: Izayoi9 Date: Tue, 24 Mar 2026 01:25:29 +0800 Subject: [PATCH 1/2] fix: auto-append /v1 to embedding_api_base in OpenAI embedding provider (#6855) When users configure `embedding_api_base` without the `/v1` suffix, the OpenAI SDK does not auto-complete it, causing request path errors. Co-Authored-By: Claude Opus 4.6 (1M context) --- astrbot/core/provider/sources/openai_embedding_source.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/astrbot/core/provider/sources/openai_embedding_source.py b/astrbot/core/provider/sources/openai_embedding_source.py index 2b62d865c2..7b2845bd22 100644 --- a/astrbot/core/provider/sources/openai_embedding_source.py +++ b/astrbot/core/provider/sources/openai_embedding_source.py @@ -27,6 +27,8 @@ def __init__(self, provider_config: dict, provider_settings: dict) -> None: api_base = provider_config.get( "embedding_api_base", "https://api.openai.com/v1" ).strip() + if api_base and not api_base.endswith("/v1") and not api_base.endswith("/v1/"): + api_base = api_base.rstrip("/") + "/v1" logger.info(f"[OpenAI Embedding] {provider_id} Using API Base: {api_base}") self.client = AsyncOpenAI( api_key=provider_config.get("embedding_api_key"), From 7a0ede738e317db91aa8cc685dc6fa77d19ad1cc Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Wed, 25 Mar 2026 17:20:00 +0800 Subject: [PATCH 2/2] fix: ensure API base URL for OpenAI embedding ends with /v1 or /v4 --- .../provider/sources/openai_embedding_source.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/astrbot/core/provider/sources/openai_embedding_source.py b/astrbot/core/provider/sources/openai_embedding_source.py index 7b2845bd22..9bf127766f 100644 --- a/astrbot/core/provider/sources/openai_embedding_source.py +++ b/astrbot/core/provider/sources/openai_embedding_source.py @@ -24,11 +24,15 @@ def __init__(self, provider_config: dict, provider_settings: dict) -> None: if proxy: logger.info(f"[OpenAI Embedding] {provider_id} Using proxy: {proxy}") http_client = httpx.AsyncClient(proxy=proxy) - api_base = provider_config.get( - "embedding_api_base", "https://api.openai.com/v1" - ).strip() - if api_base and not api_base.endswith("/v1") and not api_base.endswith("/v1/"): - api_base = api_base.rstrip("/") + "/v1" + api_base = ( + provider_config.get("embedding_api_base", "https://api.openai.com/v1") + .strip() + .rstrip("/") + .rstrip("/embeddings") + ) + if api_base and not api_base.endswith("/v1") and not api_base.endswith("/v4"): + # /v4 see #5699 + api_base = api_base + "/v1" logger.info(f"[OpenAI Embedding] {provider_id} Using API Base: {api_base}") self.client = AsyncOpenAI( api_key=provider_config.get("embedding_api_key"),