Backup-bdg/OpenHands
0
1from openhands.core.logger import openhands_logger as logger2from openhands.events.action.action import Action3from openhands.events.action.empty import NullAction4from openhands.events.event import Event5from openhands.events.observation import (6 CmdOutputObservation,7 NullObservation,8 Observation,9)10 11 12def get_pairs_from_events(events: list[Event]) -> list[tuple[Action, Observation]]:13 """Return the history as a list of tuples (action, observation).14 15 This function is a compatibility function for evals reading and visualization working with old histories."""16 tuples: list[tuple[Action, Observation]] = []17 action_map: dict[int, Action] = {}18 observation_map: dict[int, Observation] = {}19 20 # runnable actions are set as cause of observations21 # (MessageAction, NullObservation) for source=USER22 # (MessageAction, NullObservation) for source=AGENT23 # (other_action?, NullObservation)24 # (NullAction, CmdOutputObservation) background CmdOutputObservations25 26 for event in events:27 if event.id is None or event.id == -1:28 logger.debug(f'Event {event} has no ID')29 30 if isinstance(event, Action):31 action_map[event.id] = event32 33 if isinstance(event, Observation):34 if event.cause is None or event.cause == -1:35 logger.debug(f'Observation {event} has no cause')36 37 if event.cause is None:38 # runnable actions are set as cause of observations39 # NullObservations have no cause40 continue41 42 observation_map[event.cause] = event43 44 for action_id, action in action_map.items():45 observation = observation_map.get(action_id)46 if observation:47 # observation with a cause48 tuples.append((action, observation))49 else:50 tuples.append((action, NullObservation('')))51 52 for cause_id, observation in observation_map.items():53 if cause_id not in action_map:54 if isinstance(observation, NullObservation):55 continue56 if not isinstance(observation, CmdOutputObservation):57 logger.debug(f'Observation {observation} has no cause')58 tuples.append((NullAction(), observation))59 60 return tuples.copy()61 