diff --git a/opendevin/controller/agent_controller.py b/opendevin/controller/agent_controller.py index 3055022cad..95b6edd9eb 100644 --- a/opendevin/controller/agent_controller.py +++ b/opendevin/controller/agent_controller.py @@ -108,7 +108,7 @@ class AgentController: 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}, Max budget: {self.max_budget_per_task}' + 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) @@ -222,6 +222,8 @@ class AgentController: max_iterations=self.state.max_iterations, num_of_chars=self.state.num_of_chars, delegate_level=self.state.delegate_level + 1, + # metrics should be shared between parent and child + metrics=self.state.metrics, ) logger.info(f'[Agent Controller {self.id}]: start delegate') self.delegate = AgentController( @@ -230,6 +232,7 @@ class AgentController: event_stream=self.event_stream, max_iterations=self.state.max_iterations, max_chars=self.max_chars, + max_budget_per_task=self.max_budget_per_task, initial_state=state, is_delegate=True, ) @@ -308,12 +311,15 @@ class AgentController: logger.info(action, extra={'msg_type': 'ACTION'}) - await self.update_state_after_step() if action.runnable: self._pending_action = action 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) diff --git a/opendevin/core/metrics.py b/opendevin/core/metrics.py index 8bfe4e5524..7b45cf0b87 100644 --- a/opendevin/core/metrics.py +++ b/opendevin/core/metrics.py @@ -44,3 +44,6 @@ class Metrics: for key, value in metrics.items(): logs += f'{key}: {value}\n' return logs + + def __repr__(self): + return f'Metrics({self.get()}'