xtekky/gpt4free · error · ResponseStatusError
Response {response.status_code}: {'HTML content' if is_html
Error message
Response {response.status_code}: {'HTML content' if is_html else message} What it means
Sync fallback branch: every non-ok status not matched by the specific branches (429/402, 401, fingerprinted 403, 502, 504, 400-bad-key) raises ResponseStatusError, substituting 'HTML content' when the body is HTML (content-type text/html or body starts with <!DOCTYPE).
Source
Thrown at g4f/requests/raise_for_status.py:120
if message is None or is_html:
if response.status_code == 520:
message = "Unknown error (Cloudflare)"
if response.status_code in (429, 402):
raise RateLimitError(f"Response {response.status_code}: {message}")
if response.status_code == 401:
raise MissingAuthError(f"Response {response.status_code}: {message}")
if response.status_code == 403 and is_cloudflare(response.text):
raise CloudflareError(f"Response {response.status_code}: Cloudflare detected")
elif response.status_code == 403 and is_openai(response.text):
raise MissingAuthError(f"Response {response.status_code}: OpenAI Bot detected")
elif response.status_code == 502:
raise ResponseStatusError(f"Response {response.status_code}: Bad Gateway")
elif response.status_code == 504:
raise RateLimitError(f"Response {response.status_code}: Gateway Timeout ")
elif response.status_code == 400 and "API key not valid" in message:
raise MissingAuthError(f"Response {response.status_code}: Invalid API key")
else:
raise ResponseStatusError(
f"Response {response.status_code}: {'HTML content' if is_html else message}"
)
View on GitHub (pinned to 973504e177)
Solutions
- Parse the status code from the message to find the real cause.
- Update g4f to the latest release for current provider endpoints.
- For 5xx, retry later or switch provider.
- For 400, check model name and message payload against the provider API.
Defensive patterns
Strategy: try-catch
Type guard
from g4f.errors import ResponseStatusError, CloudflareError, RateLimitError
def is_generic_status(err: BaseException) -> bool:
return isinstance(err, ResponseStatusError) and not isinstance(err, (CloudflareError, RateLimitError)) Try / catch
from g4f.errors import ResponseStatusError
try:
resp = g4f.ChatCompletion.create(model, messages)
except ResponseStatusError as e:
status = int(str(e).split(':')[0].split()[-1])
if status >= 500:
time.sleep(5); resp = g4f.ChatCompletion.create(model, messages)
else:
raise Prevention
- Extract the status code from the message to choose handling
- Update g4f when providers change endpoints (404)
- Validate model names and message shapes (400)
- Retry 5xx only, and only a bounded number of times
When it happens
Trigger: Sync g4f calls returning 400 (validation), 404 (moved/removed endpoint), 405, 500, 503, or any HTML error page without a known fingerprint.
Common situations: Provider API changed shape (404/400) after an update; upstream 500/503 during incidents; stale g4f version targeting dead endpoints.
Related errors
- Response {response.status}: {'HTML content' if is_html else
- Install "websocket-client" package: pip install websocket-cl
- Response {response.status_code}: {message}
- Response {response.status_code}: Cloudflare detected
- Response {response.status_code}: OpenAI Bot detected
AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14).
Data as JSON: /api/errors/c1407be44a7e896d.
Report an issue: GitHub.