FallbackModel previously delegated to is_retryable_provider_error, whose
retryable status set ({429, 500, 502, 503, 504}) excludes auth errors.
401/403 from the first model would re-raise immediately, defeating the
point of configuring a fallback chain.
New default: any Exception triggers fallback. BaseException subclasses
(KeyboardInterrupt, SystemExit, asyncio.CancelledError) still propagate
because route() catches `except Exception` only. Mid-stream errors
unchanged — `started` guard re-raises to avoid corrupting partial output.
is_retryable_provider_error is kept as a public helper for callers who
want the conservative behavior:
FallbackModel(..., fallback_on=is_retryable_provider_error)
Tests updated to reflect new default + cover 401, ValueError, and
CancelledError cases.
Also: README cleanup
- Drop "2.0 beta" banner
- Fix non-existent model ids (gemini-2.5-pro-preview, cerebras/llama-3.1-8b)
- Document FallbackModel (tolevel export, previously undocumented)
- Fix session chaining example: parent_id= kwarg, not run_context=
- Rewrite evals section to match actual YAML schema and run_eval API
- Add missing validators (not_null, gte, lte, flow validators)
- Update provider list and repo structure (voice, codegen, errors.py)