429 is normal, not exceptional
You will hit 429s. Not because you did something wrong, but because rate limits exist. The right reaction is exponential backoff with jitter, not panic. The wrong reaction is to retry tightly (which makes it worse) or to surface the error directly to the user.
Fallback chains across models
If Pro is rate-limited, Flash usually isn't. If Flash is, Flash-Lite usually isn't. Build a chain that walks down the cost ladder on rate-limit failures.
Fallback chains across providers
Cross-provider fallback (Gemini → OpenAI → Claude) is the next layer. Same shape: try, on failure switch, log, surface.
Safety blocks aren't retries
finishReason: SAFETY means the model filtered the output. Retrying the same prompt will get the same result. Either rephrase, loosen safety thresholds (only if the use case warrants), or surface a graceful message to the user.