diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index b19f3460dd..e3ad9aaa70 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -181,6 +181,15 @@ def _is_invalid_attachment_error(self, error: Exception) -> bool: return True return False + @staticmethod + def _clean_gemini_tool_list(schema: Any) -> Any: + """非破坏性地递归移除 JSON Schema 中的 examples 字段,以适配 Gemini。""" + if isinstance(schema, dict): + return {k: ProviderOpenAIOfficial._clean_gemini_tool_list(v) for k, v in schema.items() if k != "examples"} + if isinstance(schema, list): + return [ProviderOpenAIOfficial._clean_gemini_tool_list(i) for i in schema] + return schema + @classmethod def _encode_image_file_to_data_url( cls, @@ -527,6 +536,10 @@ async def _query(self, payloads: dict, tools: ToolSet | None) -> LLMResponse: omit_empty_parameter_field=omit_empty_param_field, ) if tool_list: + # 清洗Gemini中的examples字段 + model_basename = model.split("/")[-1] if "/" in model else model + if model_basename.startswith("gemini"): + tool_list = self._clean_gemini_tool_list(tool_list) payloads["tools"] = tool_list payloads["tool_choice"] = payloads.get("tool_choice", "auto") @@ -599,6 +612,10 @@ async def _query_stream( omit_empty_parameter_field=omit_empty_param_field, ) if tool_list: + # 清洗Gemini中的examples字段 + model_basename = model.split("/")[-1] if "/" in model else model + if model_basename.startswith("gemini"): + tool_list = self._clean_gemini_tool_list(tool_list) payloads["tools"] = tool_list payloads["tool_choice"] = payloads.get("tool_choice", "auto")