{"record":{"id":"13ea33620763c25a","repo":"xtekky/gpt4free","slug":"response-response-status-code-gateway-timeout","errorCode":null,"errorMessage":"Response {response.status_code}: Gateway Timeout ","messagePattern":"Response (.+?): Gateway Timeout ","errorType":"exception","errorClass":"RateLimitError","httpStatus":504,"severity":"error","filePath":"g4f/requests/raise_for_status.py","lineNumber":116,"sourceCode":"        is_html = response.headers.get(\"content-type\", \"\").startswith(\n            \"text/html\"\n        ) or response.text.startswith(\"<!DOCTYPE\")\n        message = response.text\n    if message is None or is_html:\n        if response.status_code == 520:\n            message = \"Unknown error (Cloudflare)\"\n    if response.status_code in (429, 402):\n        raise RateLimitError(f\"Response {response.status_code}: {message}\")\n    if response.status_code == 401:\n        raise MissingAuthError(f\"Response {response.status_code}: {message}\")\n    if response.status_code == 403 and is_cloudflare(response.text):\n        raise CloudflareError(f\"Response {response.status_code}: Cloudflare detected\")\n    elif response.status_code == 403 and is_openai(response.text):\n        raise MissingAuthError(f\"Response {response.status_code}: OpenAI Bot detected\")\n    elif response.status_code == 502:\n        raise ResponseStatusError(f\"Response {response.status_code}: Bad Gateway\")\n    elif response.status_code == 504:\n        raise RateLimitError(f\"Response {response.status_code}: Gateway Timeout \")\n    elif response.status_code == 400 and \"API key not valid\" in message:\n        raise MissingAuthError(f\"Response {response.status_code}: Invalid API key\")\n    else:\n        raise ResponseStatusError(\n            f\"Response {response.status_code}: {'HTML content' if is_html else message}\"\n        )\n","sourceCodeStart":98,"sourceCodeEnd":123,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/requests/raise_for_status.py#L98-L123","documentation":"Sync variant: HTTP 504 Gateway Timeout is reclassified as RateLimitError, mirroring the async path. g4f treats a timing-out gateway as saturation, so callers can apply the same backoff logic as for 429.","triggerScenarios":"Sync g4f calls where long generations exceed the provider gateway's upstream timeout, or the backend queue is saturated.","commonSituations":"Big max_tokens on slow providers; provider under load; non-streaming requests that idle past proxy timeout.","solutions":["Retry with backoff (same handling as RateLimitError).","Lower max_tokens or split the task.","Enable streaming to keep the connection alive.","Move to a faster provider."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":"from g4f.errors import RateLimitError\ndef is_gateway_timeout(err: BaseException) -> bool:\n    return isinstance(err, RateLimitError) and 'Gateway Timeout' in str(err)","tryCatchPattern":"from g4f.errors import RateLimitError\ntry:\n    resp = g4f.ChatCompletion.create(model, messages)\nexcept RateLimitError as e:\n    if 'Gateway Timeout' in str(e):\n        resp = g4f.ChatCompletion.create(model, messages, max_tokens=512)  # smaller, retry\n    else:\n        time.sleep(60)\n        resp = g4f.ChatCompletion.create(model, messages)","preventionTips":["Distinguish 'Gateway Timeout' from 429 within RateLimitError","Cap max_tokens on slow providers","Use streaming for long outputs","Fail over after repeated timeouts"],"tags":["http-504","gateway-timeout","rate-limit","sync"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}