utils.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from openhands.core.logger import openhands_logger as logger
  2. from openhands.events.action.action import Action
  3. from openhands.events.action.empty import NullAction
  4. from openhands.events.event import Event
  5. from openhands.events.observation.commands import CmdOutputObservation
  6. from openhands.events.observation.empty import NullObservation
  7. from openhands.events.observation.observation import Observation
  8. def get_pairs_from_events(events: list[Event]) -> list[tuple[Action, Observation]]:
  9. """Return the history as a list of tuples (action, observation)."""
  10. tuples: list[tuple[Action, Observation]] = []
  11. action_map: dict[int, Action] = {}
  12. observation_map: dict[int, Observation] = {}
  13. # runnable actions are set as cause of observations
  14. # (MessageAction, NullObservation) for source=USER
  15. # (MessageAction, NullObservation) for source=AGENT
  16. # (other_action?, NullObservation)
  17. # (NullAction, CmdOutputObservation) background CmdOutputObservations
  18. for event in events:
  19. if event.id is None or event.id == -1:
  20. logger.debug(f'Event {event} has no ID')
  21. if isinstance(event, Action):
  22. action_map[event.id] = event
  23. if isinstance(event, Observation):
  24. if event.cause is None or event.cause == -1:
  25. logger.debug(f'Observation {event} has no cause')
  26. if event.cause is None:
  27. # runnable actions are set as cause of observations
  28. # NullObservations have no cause
  29. continue
  30. observation_map[event.cause] = event
  31. for action_id, action in action_map.items():
  32. observation = observation_map.get(action_id)
  33. if observation:
  34. # observation with a cause
  35. tuples.append((action, observation))
  36. else:
  37. tuples.append((action, NullObservation('')))
  38. for cause_id, observation in observation_map.items():
  39. if cause_id not in action_map:
  40. if isinstance(observation, NullObservation):
  41. continue
  42. if not isinstance(observation, CmdOutputObservation):
  43. logger.debug(f'Observation {observation} has no cause')
  44. tuples.append((NullAction(), observation))
  45. return tuples.copy()