| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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'<finish>.*</finish>', 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'<execute_bash>(.*?)</execute_bash>', 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'<execute_ipython>(.*?)</execute_ipython>', 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)
|