#29912 [Bug]: Internal-user max_budget blocks zero-cost models ā _PROXY_MaxBudgetLimiter ignores skip_budget_checks
### Check for existing issues
- [x] I have searched the existing issues and checked that my issue is not a duplicate.
### What happened?
## Problem When an **internal user** (the LiteLLM user a virtual key belongs to) exceeds their `max_budget`, requests to **zero-cost models** (input + output cost == 0, e.g. self-hosted / on-prem models) are rejected with:
429 "Max budget limit reached." even though zero-cost models are supposed to bypass budget enforcement. Every *other* budget path (key / team / end-user) already exempts zero-cost models via `skip_budget_checks` / `_is_model_cost_zero` in `common_checks()`. The internal-user path does not.
## Root cause The personal-budget pre-call hook `_PROXY_MaxBudgetLimiter.async_pre_call_hook` (`litellm/proxy/hooks/max_budget_limiter.py`) enforces the user budget for **every** request and never consults the model's cost or `skip_budget_checks`. So a zero-cost model is blocked at this hook even though `common_checks()` would have exempted it.
It blocks with the hook's message `"Max budget limit reached."` (429), distinct from the `common_checks` message `"ExceededBudget: User=⦠over budget"` ā confirming the block cā¦