From 92c0d6f5c83efc52e9cbe3c89068d3668e202e68 Mon Sep 17 00:00:00 2001 From: tin-berri Date: Tue, 29 Sep 2026 15:17:14 -0700 Subject: [PATCH] fix(router): bind Claude Code background sessions to their auto-router (#43767) Claude Code background sessions (claude --bg) stamp x-app: cli-bg on every request, including main-loop turns. The session router binding only accepted x-app: cli, so a background session never bound and its subagents' concrete-model calls bypassed the router. The binding write already requires the requested model to resolve to a pre-routing strategy, so background side calls naming plain models still never bind. Since f6eff1bde0 removed the clear path, the x-app check guarded nothing else. Co-authored-by: Claude Opus 5.5 --- litellm/router.py | 2 -- tests/unit/test_router/test_router.py | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index a98631b7f97..c18dfea1a36 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -13716,8 +13716,6 @@ class Router: self._stamp_or_clear_metadata_key(request_kwargs, "model_group", bound_model) return bound_registered_model - if self._request_header(request_kwargs, "x-app") != "cli": - return registered_model_name if self._select_pre_routing_strategy(registered_model_name, request_kwargs) is None: return registered_model_name await self._claude_code_session_router_cache.async_set_cache( diff --git a/tests/unit/test_router/test_router.py b/tests/unit/test_router/test_router.py index d4f9924dd13..0aedfce3598 100644 --- a/tests/unit/test_router/test_router.py +++ b/tests/unit/test_router/test_router.py @@ -11515,15 +11515,16 @@ class TestClaudeCodeSubagentSessionRouterBinding: } @pytest.mark.asyncio - async def test_subagent_concrete_model_uses_the_main_sessions_router(self): + @pytest.mark.parametrize("app", ["cli", "cli-bg"]) + async def test_subagent_concrete_model_uses_the_main_sessions_router(self, app): router = self._router() await router.acompletion( model="smart-router", messages=[{"role": "user", "content": "main turn"}], - **self._request_kwargs(), + **self._request_kwargs(app=app), ) - subagent_kwargs = self._request_kwargs(agent_id="agent-1234") + subagent_kwargs = self._request_kwargs(app=app, agent_id="agent-1234") response = await router.acompletion( model="expensive-model",