#28599 [Bug] Streaming requests bypass content_policy_fallbacks: 4xx filter in streaming_handler raises ContentPolicyViolationError directly
## Summary
In streaming requests, `litellm.exceptions.ContentPolicyViolationError` is currently treated as a non-retriable client error and raised directly, bypassing both `fallbacks` and `content_policy_fallbacks`. The non-streaming path handles CPV correctly; only the streaming code path has the bug.
## Where
`litellm/litellm_core_utils/streaming_handler.py`, `CustomStreamWrapper._handle_stream_fallback_error`:
```python # Raise non-retriable client errors directly (skip fallback). # Exception: 429 (rate-limit) IS retriable/transient — allow it # through so the Router can switch to a different model group. if ( mapped_status_code is not None and 400 <= mapped_status_code < 500 and mapped_status_code != 429 ): raise mapped_exception ```
`ContentPolicyViolationError` has `status_code = 400`, so this branch fires and raises directly. The `raise MidStreamFallbackError(...)` further down is never reached, the router's fallback chain never engages, and the conversation 500s.
## Why this matters
`content_policy_fallbacks` is documented as the canonical way to route around provider content-moderation rejections (DashScope/Qwen "inappropriate content", Azure OpenAI …