@@ -104,18 +104,24 @@ class AgenticLLMOverrides:
104104 temperature : float | None = None
105105 top_p : float | None = None
106106 max_tokens : int | None = None
107+ # Per-role enable_thinking override set by the query router (see
108+ # query_router.build_thinking_overrides). Maps role name (planner / task /
109+ # seed_gen / synthesis) → desired thinking bool for this request only.
110+ # A role absent from the dict keeps its server-wide AGENTIC_*_LLM_ENABLE_THINKING
111+ # default. None means "router inactive — no thinking override".
112+ enable_thinking_by_role : dict [str , bool ] | None = None
107113 # Per-request cache: maps cache key → built LLM client. Key is "__shared__"
108114 # when model/endpoint is overridden (all 4 roles collapse to one client);
109115 # otherwise it's the role name (planner / task / seed_gen / synthesis) so
110116 # each role gets its own client with that role's configured model/endpoint
111117 # but the request-provided generation params applied.
112118 # Mutable; not part of equality / hashing.
113- _built_llms : dict [str , Any ] = field (
114- default_factory = dict , repr = False , compare = False
115- )
119+ _built_llms : dict [str , Any ] = field (default_factory = dict , repr = False , compare = False )
116120
117121 def has_any_override (self ) -> bool :
118122 """True if at least one non-None override is set."""
123+ if self .enable_thinking_by_role :
124+ return True
119125 return any (
120126 v is not None
121127 for v in (
@@ -319,9 +325,7 @@ def _make_role_llm(
319325 temperature = _resolve_role_generation_param (
320326 role_cfg , fallback_cfg , rag_config , "temperature"
321327 )
322- top_p = _resolve_role_generation_param (
323- role_cfg , fallback_cfg , rag_config , "top_p"
324- )
328+ top_p = _resolve_role_generation_param (role_cfg , fallback_cfg , rag_config , "top_p" )
325329 max_tokens = _resolve_role_generation_param (
326330 role_cfg , fallback_cfg , rag_config , "max_tokens"
327331 )
0 commit comments