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

  1. Parse the status code from the message to find the real cause.
  2. Update g4f to the latest release for current provider endpoints.
  3. For 5xx, retry later or switch provider.
  4. 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

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


AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14). Data as JSON: /api/errors/c1407be44a7e896d. Report an issue: GitHub.