Interactions retries ignore the documented `initial_delay` and `max_delay` defaults

Open Beginner friendly
#3,317 1 comment 0 reactions 1 assignee View on GitHub

Maintainers usually reply within 1 day

@Venkaiahbabuneelam is already working on this.

Since Nov 9, 2026.

  • #3318 by @Sun-Wukhan — open

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
68/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
python

Research direction

Read types.py around the HttpRetryOptions defaults and _gaos/google_genai.py around _DEFAULT_INITIAL_INTERVAL_MS, then compare those with the retry defaults in _api_client. The issue reports different retry delays and jitter for client.interactions and client.models; decide whether Interactions should use the shared defaults, and verify the retry schedules with the provided no-network repro.

Written by the indexing model from the issue text.

Description

priority: p2 status:awaiting user response type: bug

client.interactions backs off half as long as client.models when initial_delay and max_delay are left unset, so the same HttpRetryOptions give two different retry schedules in one client.

Repro at afb10e8 (3.0.0), with no network and no real key:

import time, httpx2
from google import genai
from google.genai import types

stamps = []
def handler(request):
    stamps.append(time.monotonic())
    return httpx2.Response(503, json={"error": {"code": 503, "message": "unavailable", "status": "UNAVAILABLE"}})

def gaps():
    return [round(b - a, 1) for a, b in zip(stamps, stamps[1:])]

retry = types.HttpRetryOptions(attempts=4, jitter=0)  # jitter=0 keeps the gaps exact; delays left unset
client = genai.Client(
    api_key="test",
    http_options=types.HttpOptions(
        retry_options=retry, httpx_client=httpx2.Client(transport=httpx2.MockTransport(handler))
    ),
)
for name, call in [
    ("models.generate_content", lambda: client.models.generate_content(model="gemini-3.8-flash", contents="hi")),
    ("interactions.create", lambda: client.interactions.create(model="gemini-3.8-flash", input="hi")),
]:
    stamps.clear()
    try:
        call()
    except Exception as e:
        print(f"{name}: {len(stamps)} requests, gaps {gaps()} s, {type(e).__name__}")
$ python repro.py
models.generate_content: 4 requests, gaps [1.0, 2.0, 4.0] s, ServerError
interactions.create: 4 requests, gaps [0.5, 1.0, 2.0] s, InternalServerError

HttpRetryOptions documents initial_delay as "If not specified, default to 1.0 second" and max_delay as "default to 60.0 seconds" (types.py:2671-2678). The comment above _DEFAULT_INITIAL_INTERVAL_MS in _gaos/google_genai.py calls 0.5 s and 8 s the default, so one of the two contracts is wrong. An unset jitter differs too: Interactions takes up to 25% off each delay, while client.models adds up to 1 s. #3263 already moved the unset attempts onto _api_client._RETRY_ATTEMPTS. I checked the sync client only.

I'd take all three from _api_client (_RETRY_INITIAL_DELAY, _RETRY_MAX_DELAY, _RETRY_JITTER) in the same way. Or are 0.5 s and 8 s meant to stay specific to Interactions?

Dominant language
Python
Stars
4.1k
Forks
1.1k
Avg merge
1d 20h
Merged PRs (30d)
90

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from googleapis/python-genai

All issues in googleapis/python-genai

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.