Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions astrbot/core/provider/sources/openai_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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")

Expand Down Expand Up @@ -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")

Expand Down