from typing import Any import pandas as pd from evaluation.utils.shared import assert_and_raise from openhands.core.logger import openhands_logger as logger from openhands.events.action import CmdRunAction from openhands.events.observation import ( CmdOutputObservation, ErrorObservation, ) from openhands.runtime.base import Runtime from openhands.utils.shutdown_listener import sleep_if_should_continue def complete_runtime( runtime: Runtime, instance: pd.Series, ) -> dict[str, Any]: """Complete the runtime and export the git patch for SWE-bench-Live.""" logger.info('-' * 30) logger.info('BEGIN Runtime Completion Fn') logger.info('-' * 30) obs: CmdOutputObservation workspace_dir_name = instance.instance_id action = CmdRunAction(command=f'cd /workspace/{workspace_dir_name}') action.set_hard_timeout(600) logger.info(action) obs = runtime.run_action(action) logger.info(obs, extra={'msg_type': 'OBSERVATION'}) assert_and_raise( isinstance(obs, CmdOutputObservation) and obs.exit_code == 0, f'Failed to cd to /workspace/{workspace_dir_name}: {str(obs)}', ) action = CmdRunAction(command='git config --global core.pager ""') action.set_hard_timeout(600) logger.info(action, extra={'msg_type': 'ACTION'}) obs = runtime.run_action(action) logger.info(obs, extra={'msg_type': 'OBSERVATION'}) assert_and_raise( isinstance(obs, CmdOutputObservation) and obs.exit_code == 0, f'Failed to git config --global core.pager "": {str(obs)}', ) action = CmdRunAction(command='git add -A') action.set_hard_timeout(600) logger.info(action, extra={'msg_type': 'ACTION'}) obs = runtime.run_action(action) logger.info(obs, extra={'msg_type': 'OBSERVATION'}) assert_and_raise( isinstance(obs, CmdOutputObservation) and obs.exit_code == 0, f'Failed to git add -A: {str(obs)}', ) n_retries = 0 git_patch = None while n_retries < 5: action = CmdRunAction( command=f'git diff --no-color --cached {instance["base_commit"]}', ) action.set_hard_timeout(100 + 10 * n_retries) logger.info(action, extra={'msg_type': 'ACTION'}) obs = runtime.run_action(action) logger.info(obs, extra={'msg_type': 'OBSERVATION'}) n_retries += 1 if isinstance(obs, CmdOutputObservation): if obs.exit_code == 0: git_patch = obs.content.strip() break else: logger.info('Failed to get git diff, retrying...') sleep_if_should_continue(10) elif isinstance(obs, ErrorObservation): logger.error(f'Error occurred: {obs.content}. Retrying...') sleep_if_should_continue(10) else: assert_and_raise(False, f'Unexpected observation type: {str(obs)}') assert_and_raise(git_patch is not None, 'Failed to get git diff (None)') logger.info('-' * 30) logger.info('END Runtime Completion Fn') logger.info('-' * 30) return {'git_patch': git_patch}