Sync history to stream (#2640)

* add event to stream before budget check

* make the budget check before the step

* Update opendevin/controller/agent_controller.py

Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk>

---------

Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk>
This commit is contained in:
Engel Nyst
2024-06-29 23:19:00 +02:00
committed by GitHub
parent b4f63ae076
commit 4b1cc56682

View File

@@ -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)