JuliusBrussee/caveman · error

rewriter: %s: status %d: %s

Error message

rewriter: %s: status %d: %s

What it means

The rewriter provider returned a non-2xx HTTP status. The body is read (bounded by maxErrorBody) and included so the caller can see the provider's error detail; common causes are invalid API key, rate limiting, or a bad model name at the rewriter provider.

Source

Thrown at rewriter/provider.go:202

	}

	resp, err := c.doer(req)
	if err != nil {
		return nil, fmt.Errorf("rewriter: %s: %w", endpoint, err)
	}
	// An injected doer is caller code; a nil response or body must surface as an
	// error rather than a panic inside the proxy hot path.
	if resp == nil {
		return nil, fmt.Errorf("rewriter: %s: nil response", endpoint)
	}
	if resp.Body == nil {
		resp.Body = http.NoBody
	}
	defer resp.Body.Close()

	if resp.StatusCode < 200 || resp.StatusCode > 299 {
		detail, _ := io.ReadAll(io.LimitReader(resp.Body, maxErrorBody))
		return nil, fmt.Errorf("rewriter: %s: status %d: %s", endpoint, resp.StatusCode, strings.TrimSpace(string(detail)))
	}
	raw, err := io.ReadAll(io.LimitReader(resp.Body, maxProviderResponseBody+1))
	if err != nil {
		return nil, fmt.Errorf("rewriter: read response: %w", err)
	}
	if len(raw) > maxProviderResponseBody {
		return nil, fmt.Errorf("rewriter: response exceeds %d bytes", maxProviderResponseBody)
	}
	return raw, nil
}

View on GitHub (pinned to 766dce6b13)

Solutions

  1. Check the status and body detail: fix credentials for 401/403, retry after backoff on 429/5xx
  2. Rate-limit or disable the rewriter if the provider keeps rejecting requests
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at rewriter/provider.go:202 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of JuliusBrussee/caveman@766dce6b13 (2026-08-18). Data as JSON: /api/errors/fbcf8b462c3e4d26. Report an issue: GitHub.