#33204 [Bug]: Auto-router async_pre_routing_hook runs semantic-router synchronously on the event loop โ blocks the proxy under concurrency
## What happens
`AutoRouter.async_pre_routing_hook` (`litellm/router_strategy/auto_router/auto_router.py`) calls semantic-router's synchronous `__call__` โ `routelayer(text=message_content)` โ directly on the asyncio event loop, with no `await` / `asyncio.to_thread` / `run_in_executor` / async encoder. That call performs a **blocking HTTP embedding request**.
Additionally, the first request through the hook builds the entire route layer synchronously (`SemanticRouter(...)`, `auto_sync="local"`, embedding every configured utterance) inline on the loop, guarded only by a bare `if routelayer is None:` โ no lock, so concurrent cold-start requests race and rebuild.
## Impact
Serially this is just added latency. Under concurrency, every routing embedding call freezes the whole worker: in-flight streams stall and requests serialize. It's very visible with clients that fan out parallel requests through an `auto_router/*` alias.
## The fix already exists next door
The complexity router solved exactly this: `complexity_router.py` builds its index under `self._semantic_routelayer_lock = asyncio.Lock()` via `await asyncio.to_thread(self._get_or_create_semantic_routelayer)` (added in #328โฆ