77from pydantic_ai import Agent
88from pydantic_ai .common_tools .tavily import tavily_search_tool
99from pydantic_ai .messages import ModelMessage , ModelResponse , ThinkingPart
10+ from pydantic_ai .settings import ModelSettings
11+ from pydantic_ai .usage import UsageLimitExceeded , UsageLimits
1012
1113from assistant .core .models import ModelFactory
1214from assistant .core .schemas import Deps , ExperimentDefinition , OrchestrationResult , RouterOutput
@@ -71,6 +73,7 @@ def _create_experiment_creator_agent(self) -> Agent[Deps, ExperimentDefinition]:
7173 instructions = load_prompt ("experiment_creator_instructions.md" ).render (),
7274 output_type = ExperimentDefinition ,
7375 deps_type = Deps ,
76+ model_settings = ModelSettings (max_tokens = 10_000 ),
7477 tools = [
7578 retrieve_metrics_docs ,
7679 ],
@@ -89,6 +92,7 @@ def _create_internal_database_agent(self) -> Agent[Deps, str]:
8992 instructions = load_prompt ("sql_expert_instructions.md" ).render (),
9093 output_type = str ,
9194 deps_type = Deps ,
95+ model_settings = ModelSettings (max_tokens = 10_000 ),
9296 tools = [
9397 retrieve_internal_db ,
9498 ],
@@ -108,6 +112,7 @@ def _create_experiment_analyst_agent(self) -> Agent[Deps, str]:
108112 instructions = load_prompt ("experiment_analyst_instructions.md" ).render (),
109113 output_type = str ,
110114 deps_type = Deps ,
115+ model_settings = ModelSettings (max_tokens = 20_000 ),
111116 tools = [
112117 get_expanto_app_context ,
113118 ],
@@ -127,6 +132,7 @@ def _create_internet_search_agent(self) -> Agent[Deps, str]:
127132 instructions = load_prompt ("internet_search_instructions.md" ).render (),
128133 output_type = str ,
129134 deps_type = Deps ,
135+ model_settings = ModelSettings (max_tokens = 10_000 ),
130136 tools = [tavily_search_tool (self .tavily_api_key )],
131137 )
132138
@@ -139,6 +145,7 @@ def _create_expanto_assistant(self) -> Agent[Deps, str]:
139145 instructions = "Use as many tool call as you needed" ,
140146 output_type = str ,
141147 deps_type = Deps ,
148+ model_settings = ModelSettings (max_tokens = 20_000 ),
142149 tools = [
143150 retrieve_relevant_docs ,
144151 retrieve_codebase_docs ,
@@ -160,6 +167,7 @@ def _create_universal_agent(self) -> Agent[Deps, str]:
160167 "Use any tools if you need to answer user question or execute user task" ,
161168 output_type = str ,
162169 deps_type = Deps ,
170+ model_settings = ModelSettings (max_tokens = 20_000 ),
163171 tools = [
164172 retrieve_metrics_docs ,
165173 retrieve_relevant_docs ,
@@ -247,7 +255,17 @@ async def process(self, user_input: str, deps: Deps, message_history: list[Any])
247255 selected_agent = self .agent_manager .get_agent (route_id = route_output .route_id )
248256 logger .info (f"Router decision: { route_output .route_id } → Selected: { selected_agent .name } " )
249257 try :
250- response = await selected_agent .run (user_input , deps = deps , message_history = message_history )
258+ usage_limits = UsageLimits (
259+ request_limit = 5 ,
260+ )
261+ response = await selected_agent .run (
262+ user_input , deps = deps , message_history = message_history , usage_limits = usage_limits
263+ )
264+ except UsageLimitExceeded :
265+ response = await selected_agent .run (
266+ "You working too long. Return final answer" , deps = deps , message_history = message_history
267+ )
268+
251269 except Exception as e :
252270 logger .error (f"Agent { selected_agent .name } failed: { e } " )
253271 logger .info ("Falling back to Multipurpose agent" )
0 commit comments