fix(gemini): preserve fileData content parts (#7479)

* fix(gemini): preserve fileData content parts

* test(gemini): cover media-only fileData messages
This commit is contained in:
絜矩
2026-09-15 22:52:07 +08:00
committed by GitHub
parent c6ff78650e
commit 7b79662372
2 changed files with 73 additions and 0 deletions

View File

@@ -599,6 +599,14 @@ class GeminiCompletion(BaseLLM):
mime_type=inline["mimeType"],
)
)
elif "fileData" in item:
file_data = item["fileData"]
parts.append(
types.Part.from_uri(
file_uri=file_data["fileUri"],
mime_type=file_data["mimeType"],
)
)
else:
parts.append(types.Part.from_text(text=str(item)))
else:

View File

@@ -500,6 +500,71 @@ def test_gemini_message_formatting():
assert formatted_contents[1].role == "model"
@pytest.mark.parametrize(
"file_uri",
[
"https://storage.googleapis.com/example/image.jpg",
"gs://example-bucket/image.jpg",
],
)
def test_gemini_message_formatting_preserves_file_data(file_uri):
"""Test that Gemini file references are preserved in their original order."""
llm = LLM(model="google/gemini-2.0-flash-001")
formatted_contents, _ = llm._format_messages_for_gemini(
[
{
"role": "user",
"content": [
{"text": "Before"},
{
"fileData": {
"fileUri": file_uri,
"mimeType": "image/jpeg",
}
},
{"text": "After"},
],
}
]
)
parts = formatted_contents[0].parts
assert parts[0].text == "Before"
assert parts[1].file_data is not None
assert parts[1].file_data.file_uri == file_uri
assert parts[1].file_data.mime_type == "image/jpeg"
assert parts[2].text == "After"
def test_gemini_message_formatting_preserves_file_data_without_text():
"""Test that a message containing only a file reference is preserved."""
llm = LLM(model="google/gemini-2.0-flash-001")
file_uri = "gs://example-bucket/image.jpg"
formatted_contents, _ = llm._format_messages_for_gemini(
[
{
"role": "user",
"content": [
{
"fileData": {
"fileUri": file_uri,
"mimeType": "image/jpeg",
}
}
],
}
]
)
parts = formatted_contents[0].parts
assert len(parts) == 1
assert parts[0].file_data is not None
assert parts[0].file_data.file_uri == file_uri
assert parts[0].file_data.mime_type == "image/jpeg"
def test_gemini_message_formatting_appends_user_turn_after_trailing_model_turn():
"""
Gemini's generateContent API rejects a request whose history ends on a