#31118 extra_body can override the request `model` across all providers, bypassing proxy model-access/budget checks
## Summary
The shared completion path in `BaseLLMHTTPHandler` merges caller-controlled `extra_body` into the request body after `transform_request()` runs, at `litellm/llms/custom_httpx/llm_http_handler.py`:
```python if extra_body is not None: data = {**data, **extra_body} ```
Because this merge happens with `extra_body` taking precedence, a caller can set `extra_body: {"model": "<some-other-model>"}` and override the `model` field that the provider transform produced. For any OpenAI-compatible provider that reads `model` from the JSON body (OpenAI, Azure, Groq, Deepseek, Cloudflare's `/ai/v1` endpoint, and others), the upstream provider then executes the model named in `extra_body`, not the one the request was authorized and budgeted against.
Proxy model-access and budget enforcement runs at the auth layer on the top-level `model` parameter, before the request reaches any provider transform, and never inspects `extra_body`. So a key scoped to a cheap or allow-listed model could run a different, more expensive, or non-allowed model while accounting is tracked against the original `model`.
## Why this is filed separately
This came up as a review finding on #31053 (Cloudfl…