#35329 [Bug]: Azure async handler converts asyncio.CancelledError into AzureOpenAIError(500) — cancellation is swallowed and Router fallbacks run to completion
### What happened?
The Azure async chat-completion handler catches `asyncio.CancelledError` and re-raises it as `AzureOpenAIError(status_code=500)`:
https://github.com/BerriAI/litellm/blob/main/litellm/llms/azure/azure.py#L462
```python except asyncio.CancelledError as e: ## LOGGING logging_obj.post_call(...) raise AzureOpenAIError(status_code=500, message=str(e)) ```
`CancelledError` is a `BaseException` (Python 3.8+) specifically so libraries don't treat task cancellation as an operational failure. Converting it into a provider 500 breaks cancellation semantics:
1. **Plain `litellm.acompletion`**: cancelling the task raises `litellm.APIError: AzureException APIError` instead of propagating `CancelledError`. 2. **Router with `fallbacks`**: it's worse — the fake 500 triggers the fallback deployment, which **runs to completion** (Python delivers cancellation only once, and it was consumed). The "cancelled" call returns a successful response from the fallback deployment several seconds later. The caller cannot cancel the request at all, and pays for a completion it explicitly abandoned. 3. **Router cooldowns**: every cancellation counts as an azure deployment failure…