Skip to content
Open
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion src/converter/openai2gemini.py
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,16 @@ def _clean_schema_for_gemini(schema: Any, root_schema: Optional[Dict[str, Any]]
# 10. 去重 required 数组
if "required" in result and isinstance(result["required"], list):
result["required"] = list(dict.fromkeys(result["required"])) # 保持顺序去重


# Gemini OpenAPI 规范要求:enum 元素必须为 TYPE_STRING
if "enum" in result:
enum_val = result.get("enum")
if isinstance(enum_val, list):
if result.get("type") == "BOOLEAN" or any(isinstance(x, bool) for x in enum_val):
result.pop("enum", None)
else:
result["enum"] = [str(x) for x in enum_val]

return result


Expand Down Expand Up @@ -769,6 +778,15 @@ def _clean_schema_for_parameters_json_schema(
else:
result.pop("required", None)

# Gemini OpenAPI 规范要求:enum 元素必须为 TYPE_STRING
if "enum" in result:
enum_val = result.get("enum")
if isinstance(enum_val, list):
if result.get("type") == "boolean" or any(isinstance(x, bool) for x in enum_val):
result.pop("enum", None)
else:
result["enum"] = [str(x) for x in enum_val]

return result


Expand Down
32 changes: 32 additions & 0 deletions tests/test_openai2gemini_tool_calls.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,35 @@ def test_convert_openai_request_merges_adjacent_same_role_contents():
assert "text" in part_types




def test_clean_schema_removes_boolean_enum_and_stringifies_enum():
"""测试 Gemini schema 清洗:移除 boolean 类型的 enum,并将非字符串 enum 转换为字符串"""
from src.converter.openai2gemini import (
_clean_schema_for_gemini,
_clean_schema_for_parameters_json_schema,
)

schema_params = {
"type": "object",
"properties": {
"is_active": {"type": "boolean", "enum": [True, False]},
"status_code": {"type": "integer", "enum": [200, 404, 500]},
"tag": {"type": "string", "enum": ["a", "b"]},
},
}
cleaned_params = _clean_schema_for_parameters_json_schema(schema_params)
assert "enum" not in cleaned_params["properties"]["is_active"]
assert cleaned_params["properties"]["status_code"]["enum"] == ["200", "404", "500"]
assert cleaned_params["properties"]["tag"]["enum"] == ["a", "b"]

schema_gemini = {
"type": "object",
"properties": {
"flag": {"type": "boolean", "enum": [True, False]},
"code": {"type": "integer", "enum": [1, 2]},
},
}
cleaned_gemini = _clean_schema_for_gemini(schema_gemini)
assert "enum" not in cleaned_gemini["properties"]["flag"]
assert cleaned_gemini["properties"]["code"]["enum"] == ["1", "2"]
Loading