{"record":{"id":"c82f6ed431dc875c","repo":"xtekky/gpt4free","slug":"gemini-stream-was-idle-for-idle-timeout-g-second","errorCode":null,"errorMessage":"Gemini stream was idle for {idle_timeout:g} seconds","messagePattern":"Gemini stream was idle for (.+?) seconds","errorType":"exception","errorClass":"ResponseError","httpStatus":null,"severity":"error","filePath":"g4f/Provider/needs_auth/Gemini.py","lineNumber":230,"sourceCode":"\nasync def _iter_response_lines(\n    content,\n    idle_timeout: float | None = None,\n) -> AsyncIterator[str]:\n    buffer = b\"\"\n    iterator = content.iter_any().__aiter__()\n    while True:\n        try:\n            next_chunk = iterator.__anext__()\n            chunk = (\n                await asyncio.wait_for(next_chunk, timeout=idle_timeout)\n                if idle_timeout is not None\n                else await next_chunk\n            )\n        except StopAsyncIteration:\n            break\n        except asyncio.TimeoutError as exc:\n            raise ResponseError(\n                f\"Gemini stream was idle for {idle_timeout:g} seconds\"\n            ) from exc\n        buffer += chunk\n        while b\"\\n\" in buffer:\n            line, buffer = buffer.split(b\"\\n\", 1)\n            yield line.decode(\"utf-8\", errors=\"replace\")\n    if buffer:\n        yield buffer.decode(\"utf-8\", errors=\"replace\")\n\n\ndef _resolve_model(model: str, think_override: int = None) -> tuple[str, bool]:\n    requested_model = model\n    think_mode = think_override\n    if \"@think=\" in model:\n        model, think_value = model.rsplit(\"@think=\", 1)\n        requested_model = model\n        try:\n            think_mode = int(think_value)","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/Provider/needs_auth/Gemini.py#L212-L248","documentation":"ResponseError raised by g4f/Provider/needs_auth/Gemini.py while reading the Gemini response stream: an asyncio.wait_for around each chunk read with idle_timeout expired, meaning no bytes arrived from the server for idle_timeout seconds. It guards against hangs when Gemini stalls (network drop, server-side pause) so callers see a definite error instead of an eternal await.","triggerScenarios":"Streaming a long Gemini response where the connection goes silent — e.g. extended thinking-mode pauses that exceed idle_timeout, flaky proxy/VPN dropping the socket, or Gemini server-side stall — for longer than the configured idle_timeout.","commonSituations":"Default idle timeout too small for slow reasoning models; mobile/unstable networks; corporate proxies that buffer then time out; very long generations with sparse keep-alive data.","solutions":["Increase the idle timeout (pass a larger idle_timeout value when calling the provider) to tolerate slow thinking models.","Retry the request — transient stalls often succeed on a second attempt.","Remove buffering proxies from the path or disable VPN for the streaming connection.","Use a shorter max_tokens or split very long prompts to keep chunks flowing."],"exampleFix":"# before\nstream = Gemini.create_async_generator(model=\"gemini-2.5-pro\", messages=msgs, idle_timeout=5)\n# ResponseError: Gemini stream was idle for 5 seconds\n\n# after\nstream = Gemini.create_async_generator(model=\"gemini-2.5-pro\", messages=msgs, idle_timeout=120)","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"from g4f.errors import ResponseError\n\nasync def gemini_stream_with_retry(model, messages, idle_timeout=60, retries=2):\n    for i in range(retries + 1):\n        try:\n            return [c async for c in Gemini.create_async_generator(\n                model=model, messages=messages, idle_timeout=idle_timeout)]\n        except ResponseError as e:\n            if \"idle\" not in str(e) or i == retries:\n                raise\n            idle_timeout *= 2","preventionTips":["Set idle_timeout generously (60s+) for thinking/slow models.","Retry once with a doubled timeout before surfacing the error to users.","Keep streaming connections off buffering proxies."],"tags":["timeout","streaming","gemini","network"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}