|
|
@@ -99,13 +99,6 @@ class AgentController:
|
|
|
self.state.updated_info = []
|
|
|
# update metrics especially for cost
|
|
|
self.state.metrics = self.agent.llm.metrics
|
|
|
- if self.max_budget_per_task is not None:
|
|
|
- current_cost = self.state.metrics.accumulated_cost
|
|
|
- if current_cost > self.max_budget_per_task:
|
|
|
- await self.report_error(
|
|
|
- f'Task budget exceeded. Current cost: {current_cost:.2f}, Max budget: {self.max_budget_per_task:.2f}'
|
|
|
- )
|
|
|
- await self.set_agent_state_to(AgentState.ERROR)
|
|
|
|
|
|
async def report_error(self, message: str, exception: Exception | None = None):
|
|
|
"""
|
|
|
@@ -258,9 +251,9 @@ class AgentController:
|
|
|
if delegate_state == AgentState.ERROR:
|
|
|
# close the delegate upon error
|
|
|
await self.delegate.close()
|
|
|
+ self.delegate = None
|
|
|
+ self.delegateAction = None
|
|
|
await self.report_error('Delegator agent encounters an error')
|
|
|
- # propagate error state until an agent or user can handle it
|
|
|
- await self.set_agent_state_to(AgentState.ERROR)
|
|
|
return
|
|
|
delegate_done = delegate_state in (AgentState.FINISHED, AgentState.REJECTED)
|
|
|
if delegate_done:
|
|
|
@@ -300,6 +293,18 @@ class AgentController:
|
|
|
await self.set_agent_state_to(AgentState.ERROR)
|
|
|
return
|
|
|
|
|
|
+ if self.max_budget_per_task is not None:
|
|
|
+ current_cost = self.state.metrics.accumulated_cost
|
|
|
+ if current_cost > self.max_budget_per_task:
|
|
|
+ await self.report_error(
|
|
|
+ f'Task budget exceeded. Current cost: {current_cost:.2f}, Max budget: {self.max_budget_per_task:.2f}'
|
|
|
+ )
|
|
|
+ await self.set_agent_state_to(AgentState.ERROR)
|
|
|
+ return
|
|
|
+
|
|
|
+ if self.state.agent_state == AgentState.ERROR:
|
|
|
+ return
|
|
|
+
|
|
|
self.update_state_before_step()
|
|
|
action: Action = NullAction()
|
|
|
try:
|
|
|
@@ -319,13 +324,11 @@ class AgentController:
|
|
|
else:
|
|
|
await self.add_history(action, NullObservation(''))
|
|
|
|
|
|
- await self.update_state_after_step()
|
|
|
- if self.state.agent_state == AgentState.ERROR:
|
|
|
- return
|
|
|
-
|
|
|
if not isinstance(action, NullAction):
|
|
|
await self.event_stream.add_event(action, EventSource.AGENT)
|
|
|
|
|
|
+ await self.update_state_after_step()
|
|
|
+
|
|
|
if self._is_stuck():
|
|
|
await self.report_error('Agent got stuck in a loop')
|
|
|
await self.set_agent_state_to(AgentState.ERROR)
|