import re from openhands.controller.action_parser import ActionParser from openhands.events.action import ( Action, AgentFinishAction, CmdRunAction, IPythonRunCellAction, MessageAction, ) class CodeActSWEActionParserFinish(ActionParser): """Parser action: - AgentFinishAction() - end the interaction """ def __init__( self, ): self.finish_command = None def check_condition(self, action_str: str) -> bool: self.finish_command = re.search(r'.*', action_str, re.DOTALL) return self.finish_command is not None def parse(self, action_str: str) -> Action: assert ( self.finish_command is not None ), 'self.finish_command should not be None when parse is called' thought = action_str.replace(self.finish_command.group(0), '').strip() return AgentFinishAction(thought=thought) class CodeActSWEActionParserCmdRun(ActionParser): """Parser action: - CmdRunAction(command) - bash command to run - AgentFinishAction() - end the interaction """ def __init__( self, ): self.bash_command = None def check_condition(self, action_str: str) -> bool: self.bash_command = re.search( r'(.*?)', action_str, re.DOTALL ) return self.bash_command is not None def parse(self, action_str: str) -> Action: assert ( self.bash_command is not None ), 'self.bash_command should not be None when parse is called' thought = action_str.replace(self.bash_command.group(0), '').strip() # a command was found command_group = self.bash_command.group(1).strip() if command_group.strip() == 'exit': return AgentFinishAction() return CmdRunAction(command=command_group, thought=thought) class CodeActSWEActionParserIPythonRunCell(ActionParser): """Parser action: - IPythonRunCellAction(code) - IPython code to run """ def __init__( self, ): self.python_code = None self.jupyter_kernel_init_code: str = 'from agentskills import *' def check_condition(self, action_str: str) -> bool: self.python_code = re.search( r'(.*?)', action_str, re.DOTALL ) return self.python_code is not None def parse(self, action_str: str) -> Action: assert ( self.python_code is not None ), 'self.python_code should not be None when parse is called' code_group = self.python_code.group(1).strip() thought = action_str.replace(self.python_code.group(0), '').strip() return IPythonRunCellAction( code=code_group, thought=thought, kernel_init_code=self.jupyter_kernel_init_code, ) class CodeActSWEActionParserMessage(ActionParser): """Parser action: - MessageAction(content) - Message action to run (e.g. ask for clarification) """ def __init__( self, ): pass def check_condition(self, action_str: str) -> bool: # We assume the LLM is GOOD enough that when it returns pure natural language # it wants to talk to the user return True def parse(self, action_str: str) -> Action: return MessageAction(content=action_str, wait_for_response=True)