From 06a0a78f980e4a9802b80f6a7cc66d3f8844a586 Mon Sep 17 00:00:00 2001 From: Rat0323 <261020116+Rat0323@users.noreply.github.com> Date: Tue, 16 Jun 2026 00:04:59 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(embedding):=20=E4=BF=AE=E5=A4=8D=20Open?= =?UTF-8?q?AI=20=E5=85=BC=E5=AE=B9=E6=8E=A5=E5=8F=A3=E7=BB=B4=E5=BA=A6?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=AF=BC=E8=87=B4=20SiliconFlow=20=E7=AD=89?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=95=86=E6=8A=A5=20400=20=E5=8F=8A=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=AF=AF=E6=8A=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sources/openai_embedding_source.py | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/astrbot/core/provider/sources/openai_embedding_source.py b/astrbot/core/provider/sources/openai_embedding_source.py index 126a41fdaf..c68d902db0 100644 --- a/astrbot/core/provider/sources/openai_embedding_source.py +++ b/astrbot/core/provider/sources/openai_embedding_source.py @@ -70,28 +70,13 @@ def _embedding_kwargs(self) -> dict: kwargs = {} if "embedding_dimensions" in self.provider_config: try: - kwargs["dimensions"] = int(self.provider_config["embedding_dimensions"]) + dim_val = int(self.provider_config["embedding_dimensions"]) + if dim_val > 0: + kwargs["dimensions"] = dim_val except (ValueError, TypeError): logger.warning( f"embedding_dimensions in embedding configs is not a valid integer: '{self.provider_config['embedding_dimensions']}', ignored." ) - - # Fix: SiliconFlow provider does not support dimensions parameter, except for Qwen models. - provider_api_base = self.provider_config.get("embedding_api_base") - provider_id = self.provider_config.get("id", "unknown_id") - if ( - provider_api_base - # Hard-code SiliconFlow API Base Prefix and Model Name, as it's just a temporary workaround. - and provider_api_base.strip().startswith("https://api.siliconflow.cn") - and not self.model.lower().startswith("qwen") - ): - # For SiliconFlow and Non-Qwen models, dimensions parameter is not supported. so remove it. - removed_dimensions = kwargs.pop("dimensions", None) - if removed_dimensions is not None: - # Log a warning message if dimensions parameter is removed. - logger.warning( - f"dimensions not supported for model '{self.model}' of provider '{provider_id}' as SiliconFlow does not support this parameter for non-Qwen models: '{removed_dimensions}'." - ) return kwargs def get_dim(self) -> int: From 3c4ac170ddc17633f1652715cebc9f14efeba57d Mon Sep 17 00:00:00 2001 From: Rat0323 <261020116+Rat0323@users.noreply.github.com> Date: Tue, 16 Jun 2026 00:09:47 +0800 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20=E9=87=87=E7=BA=B3=20MIMO=20?= =?UTF-8?q?=E5=AE=A1=E6=9F=A5=E5=BB=BA=E8=AE=AE=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BD=8E=E7=BA=A7=E5=88=AB=E6=97=A5=E5=BF=97=E4=B8=8E=E9=98=B2?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sources/openai_embedding_source.py | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/astrbot/core/provider/sources/openai_embedding_source.py b/astrbot/core/provider/sources/openai_embedding_source.py index c68d902db0..0dfdae9c70 100644 --- a/astrbot/core/provider/sources/openai_embedding_source.py +++ b/astrbot/core/provider/sources/openai_embedding_source.py @@ -69,14 +69,22 @@ def _embedding_kwargs(self) -> dict: """构建嵌入请求的可选参数""" kwargs = {} if "embedding_dimensions" in self.provider_config: - try: - dim_val = int(self.provider_config["embedding_dimensions"]) - if dim_val > 0: - kwargs["dimensions"] = dim_val - except (ValueError, TypeError): - logger.warning( - f"embedding_dimensions in embedding configs is not a valid integer: '{self.provider_config['embedding_dimensions']}', ignored." - ) + dim_setting = self.provider_config["embedding_dimensions"] + if dim_setting is not None and str(dim_setting).strip() != "": + try: + dim_val = int(dim_setting) + # 只有明确指定维度且大于0时才携带参数。 + if dim_val > 0: + kwargs["dimensions"] = dim_val + else: + # 留空或填 0 隐式丢弃此参数,用于规避 SiliconFlow、vLLM 等严格校验平台报 HTTP 400 + logger.debug( + f"embedding_dimensions '{dim_val}' is <= 0, omitted to ensure compatibility with strict providers." + ) + except (ValueError, TypeError): + logger.warning( + f"embedding_dimensions in embedding configs is not a valid integer: '{dim_setting}', ignored." + ) return kwargs def get_dim(self) -> int: From 1cecd4368091879afde8f5ca51d8a398b8c7c00a Mon Sep 17 00:00:00 2001 From: Rat0323 <261020116+Rat0323@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:37:49 +0800 Subject: [PATCH 3/3] feat: optimize embedding dimension validation and parameter handling - Allow automatic dimension inference when configured_dim is 0 to prevent blocking new KB creation. - Filter out dimensions parameter in OpenAI embedding requests when value is 0 to improve compatibility with providers like SiliconFlow. --- .../sources/openai_embedding_source.py | 41 +++++++++++-------- .../services/knowledge_base_service.py | 6 ++- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/astrbot/core/provider/sources/openai_embedding_source.py b/astrbot/core/provider/sources/openai_embedding_source.py index 0dfdae9c70..9f87897ac8 100644 --- a/astrbot/core/provider/sources/openai_embedding_source.py +++ b/astrbot/core/provider/sources/openai_embedding_source.py @@ -69,22 +69,31 @@ def _embedding_kwargs(self) -> dict: """构建嵌入请求的可选参数""" kwargs = {} if "embedding_dimensions" in self.provider_config: - dim_setting = self.provider_config["embedding_dimensions"] - if dim_setting is not None and str(dim_setting).strip() != "": - try: - dim_val = int(dim_setting) - # 只有明确指定维度且大于0时才携带参数。 - if dim_val > 0: - kwargs["dimensions"] = dim_val - else: - # 留空或填 0 隐式丢弃此参数,用于规避 SiliconFlow、vLLM 等严格校验平台报 HTTP 400 - logger.debug( - f"embedding_dimensions '{dim_val}' is <= 0, omitted to ensure compatibility with strict providers." - ) - except (ValueError, TypeError): - logger.warning( - f"embedding_dimensions in embedding configs is not a valid integer: '{dim_setting}', ignored." - ) + try: + dim_val = int(self.provider_config["embedding_dimensions"]) + if dim_val > 0: + kwargs["dimensions"] = dim_val + except (ValueError, TypeError): + logger.warning( + f"embedding_dimensions in embedding configs is not a valid integer: '{self.provider_config['embedding_dimensions']}', ignored." + ) + + # Fix: SiliconFlow provider does not support dimensions parameter, except for Qwen models. + provider_api_base = self.provider_config.get("embedding_api_base") + provider_id = self.provider_config.get("id", "unknown_id") + if ( + provider_api_base + # Hard-code SiliconFlow API Base Prefix and Model Name, as it's just a temporary workaround. + and provider_api_base.strip().startswith("https://api.siliconflow.cn") + and not self.model.lower().startswith("qwen") + ): + # For SiliconFlow and Non-Qwen models, dimensions parameter is not supported. so remove it. + removed_dimensions = kwargs.pop("dimensions", None) + if removed_dimensions is not None: + # Log a warning message if dimensions parameter is removed. + logger.warning( + f"dimensions not supported for model '{self.model}' of provider '{provider_id}' as SiliconFlow does not support this parameter for non-Qwen models: '{removed_dimensions}'." + ) return kwargs def get_dim(self) -> int: diff --git a/astrbot/dashboard/services/knowledge_base_service.py b/astrbot/dashboard/services/knowledge_base_service.py index ad2121c9aa..77f8c6c6ba 100644 --- a/astrbot/dashboard/services/knowledge_base_service.py +++ b/astrbot/dashboard/services/knowledge_base_service.py @@ -304,9 +304,11 @@ async def create_kb(self, data: object) -> tuple[dict[str, Any], str]: ) try: vec = await provider.get_embedding("astrbot") - if len(vec) != provider.get_dim(): + actual_dim = len(vec) + configured_dim = provider.get_dim() + if configured_dim != 0 and actual_dim != configured_dim: raise ValueError( - f"嵌入向量维度不匹配,实际是 {len(vec)},然而配置是 {provider.get_dim()}", + f"嵌入向量维度不匹配,实际是 {actual_dim},然而配置是 {configured_dim}", ) except Exception as exc: raise KnowledgeBaseServiceError(f"测试嵌入模型失败: {exc!s}") from exc