loop.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import asyncio
  2. from openhands.controller import AgentController
  3. from openhands.core.logger import openhands_logger as logger
  4. from openhands.core.schema import AgentState
  5. from openhands.runtime.base import Runtime
  6. async def run_agent_until_done(
  7. controller: AgentController,
  8. runtime: Runtime,
  9. end_states: list[AgentState],
  10. ):
  11. """
  12. run_agent_until_done takes a controller and a runtime, and will run
  13. the agent until it reaches a terminal state.
  14. Note that runtime must be connected before being passed in here.
  15. """
  16. controller.agent_task = asyncio.create_task(controller.start_step_loop())
  17. def status_callback(msg_type, msg_id, msg):
  18. if msg_type == 'error':
  19. logger.error(msg)
  20. if controller:
  21. controller.state.last_error = msg
  22. asyncio.create_task(controller.set_agent_state_to(AgentState.ERROR))
  23. else:
  24. logger.info(msg)
  25. if hasattr(runtime, 'status_callback') and runtime.status_callback:
  26. raise ValueError(
  27. 'Runtime status_callback was set, but run_agent_until_done will override it'
  28. )
  29. if hasattr(controller, 'status_callback') and controller.status_callback:
  30. raise ValueError(
  31. 'Controller status_callback was set, but run_agent_until_done will override it'
  32. )
  33. runtime.status_callback = status_callback
  34. controller.status_callback = status_callback
  35. while controller.state.agent_state not in end_states:
  36. await asyncio.sleep(1)
  37. if not controller.agent_task.done():
  38. controller.agent_task.cancel()
  39. try:
  40. await controller.agent_task
  41. except asyncio.CancelledError:
  42. pass