Skip to content

Commit 89bab98

Browse files
authored
fix(models/gemini): handle non-JSON error messages from Gemini API (#1062)
1 parent 9f10595 commit 89bab98

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/strands/models/gemini.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,13 @@ async def stream(
408408
if not error.message:
409409
raise
410410

411-
message = json.loads(error.message)
411+
try:
412+
message = json.loads(error.message) if error.message else {}
413+
except json.JSONDecodeError as e:
414+
logger.warning("error_message=<%s> | Gemini API returned non-JSON error", error.message)
415+
# Re-raise the original ClientError (not JSONDecodeError) and make the JSON error the explicit cause
416+
raise error from e
417+
412418
match message["error"]["status"]:
413419
case "RESOURCE_EXHAUSTED" | "UNAVAILABLE":
414420
raise ModelThrottledException(error.message) from error

tests/strands/models/test_gemini.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import logging
23
import unittest.mock
34

45
import pydantic
@@ -621,3 +622,18 @@ async def test_structured_output(gemini_client, model, messages, model_id, weath
621622
"model": model_id,
622623
}
623624
gemini_client.aio.models.generate_content.assert_called_with(**exp_request)
625+
626+
627+
@pytest.mark.asyncio
628+
async def test_stream_handles_non_json_error(gemini_client, model, messages, caplog, alist):
629+
error_message = "Invalid API key"
630+
gemini_client.aio.models.generate_content_stream.side_effect = genai.errors.ClientError(
631+
error_message, {"message": error_message}
632+
)
633+
634+
with caplog.at_level(logging.WARNING):
635+
with pytest.raises(genai.errors.ClientError, match=error_message):
636+
await alist(model.stream(messages))
637+
638+
assert "Gemini API returned non-JSON error" in caplog.text
639+
assert f"error_message=<{error_message}>" in caplog.text

0 commit comments

Comments
 (0)