Skip to content
Draft
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
27 changes: 26 additions & 1 deletion marker/services/gemini.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,31 @@ def img_to_bytes(self, img: PIL.Image.Image):
img.save(image_bytes, format="WEBP")
return image_bytes.getvalue()

@staticmethod
def _get_retry_delay(error: APIError) -> float | None:
details = getattr(error, "details", None)
if not isinstance(details, dict):
return None
# Response may nest under 'error' key or be flat
error_details = (
details.get("error", {}).get("details")
or details.get("details")
)
if not isinstance(error_details, list):
return None
for entry in error_details:
if not isinstance(entry, dict):
continue
if not entry.get("@type", "").endswith("RetryInfo"):
continue
delay_str = entry.get("retryDelay", "")
if isinstance(delay_str, str) and delay_str.endswith("s"):
try:
return float(delay_str[:-1])
except ValueError:
continue
return None

def get_google_client(self, timeout: int):
raise NotImplementedError

Expand Down Expand Up @@ -101,7 +126,7 @@ def __call__(
)
break
else:
wait_time = tries * self.retry_wait_time
wait_time = self._get_retry_delay(e) or tries * self.retry_wait_time
logger.warning(
f"APIError: {e}. Retrying in {wait_time} seconds... (Attempt {tries}/{total_tries})",
)
Expand Down
Loading