from dataclasses import dataclass, field from typing import Any from openhands.core.schema import ActionType from openhands.events.action.action import Action @dataclass class ChangeAgentStateAction(Action): """Fake action, just to notify the client that a task state has changed.""" agent_state: str thought: str = '' action: str = ActionType.CHANGE_AGENT_STATE @property def message(self) -> str: return f'Agent state changed to {self.agent_state}' @dataclass class AgentSummarizeAction(Action): summary: str action: str = ActionType.SUMMARIZE @property def message(self) -> str: return self.summary def __str__(self) -> str: ret = '**AgentSummarizeAction**\n' ret += f'SUMMARY: {self.summary}' return ret @dataclass class AgentFinishAction(Action): """An action where the agent finishes the task. Attributes: outputs (dict): The outputs of the agent, for instance "content". thought (str): The agent's explanation of its actions. action (str): The action type, namely ActionType.FINISH. """ outputs: dict[str, Any] = field(default_factory=dict) thought: str = '' action: str = ActionType.FINISH @property def message(self) -> str: if self.thought != '': return self.thought return "All done! What's next on the agenda?" @dataclass class AgentRejectAction(Action): outputs: dict = field(default_factory=dict) thought: str = '' action: str = ActionType.REJECT @property def message(self) -> str: msg: str = 'Task is rejected by the agent.' if 'reason' in self.outputs: msg += ' Reason: ' + self.outputs['reason'] return msg @dataclass class AgentDelegateAction(Action): agent: str inputs: dict thought: str = '' action: str = ActionType.DELEGATE @property def message(self) -> str: return f"I'm asking {self.agent} for help with this task."