|
from openhands.events.action import (
|
|
Action,
|
|
AgentFinishAction,
|
|
AgentRejectAction,
|
|
BrowseInteractiveAction,
|
|
BrowseURLAction,
|
|
CmdRunAction,
|
|
FileReadAction,
|
|
FileWriteAction,
|
|
MessageAction,
|
|
)
|
|
from openhands.events.action.action import ActionConfirmationStatus
|
|
from openhands.events.serialization import (
|
|
event_from_dict,
|
|
event_to_dict,
|
|
event_to_memory,
|
|
)
|
|
|
|
|
|
def serialization_deserialization(
|
|
original_action_dict, cls, max_message_chars: int = 10000
|
|
):
|
|
action_instance = event_from_dict(original_action_dict)
|
|
assert isinstance(
|
|
action_instance, Action
|
|
), 'The action instance should be an instance of Action.'
|
|
assert isinstance(
|
|
action_instance, cls
|
|
), f'The action instance should be an instance of {cls.__name__}.'
|
|
|
|
|
|
serialized_action_dict = event_to_dict(action_instance)
|
|
|
|
|
|
serialized_action_dict.pop('message')
|
|
assert (
|
|
serialized_action_dict == original_action_dict
|
|
), 'The serialized action should match the original action dict.'
|
|
|
|
|
|
serialized_action_memory = event_to_memory(action_instance, max_message_chars)
|
|
original_memory_dict = original_action_dict.copy()
|
|
|
|
|
|
original_memory_dict.pop('id', None)
|
|
original_memory_dict.pop('timestamp', None)
|
|
if 'args' in original_memory_dict:
|
|
original_memory_dict['args'].pop('blocking', None)
|
|
original_memory_dict['args'].pop('confirmation_state', None)
|
|
|
|
|
|
assert (
|
|
serialized_action_memory == original_memory_dict
|
|
), 'The serialized action in memory should match the original action dict.'
|
|
|
|
|
|
def test_event_props_serialization_deserialization():
|
|
original_action_dict = {
|
|
'id': 42,
|
|
'source': 'agent',
|
|
'timestamp': '2021-08-01T12:00:00',
|
|
'action': 'message',
|
|
'args': {
|
|
'content': 'This is a test.',
|
|
'image_urls': None,
|
|
'wait_for_response': False,
|
|
},
|
|
}
|
|
serialization_deserialization(original_action_dict, MessageAction)
|
|
|
|
|
|
def test_message_action_serialization_deserialization():
|
|
original_action_dict = {
|
|
'action': 'message',
|
|
'args': {
|
|
'content': 'This is a test.',
|
|
'image_urls': None,
|
|
'wait_for_response': False,
|
|
},
|
|
}
|
|
serialization_deserialization(original_action_dict, MessageAction)
|
|
|
|
|
|
def test_agent_finish_action_serialization_deserialization():
|
|
original_action_dict = {'action': 'finish', 'args': {'outputs': {}, 'thought': ''}}
|
|
serialization_deserialization(original_action_dict, AgentFinishAction)
|
|
|
|
|
|
def test_agent_reject_action_serialization_deserialization():
|
|
original_action_dict = {'action': 'reject', 'args': {'outputs': {}, 'thought': ''}}
|
|
serialization_deserialization(original_action_dict, AgentRejectAction)
|
|
|
|
|
|
def test_cmd_run_action_serialization_deserialization():
|
|
original_action_dict = {
|
|
'action': 'run',
|
|
'args': {
|
|
'blocking': False,
|
|
'command': 'echo "Hello world"',
|
|
'is_input': False,
|
|
'thought': '',
|
|
'hidden': False,
|
|
'confirmation_state': ActionConfirmationStatus.CONFIRMED,
|
|
},
|
|
}
|
|
serialization_deserialization(original_action_dict, CmdRunAction)
|
|
|
|
|
|
def test_browse_url_action_serialization_deserialization():
|
|
original_action_dict = {
|
|
'action': 'browse',
|
|
'args': {'thought': '', 'url': 'https://www.example.com'},
|
|
}
|
|
serialization_deserialization(original_action_dict, BrowseURLAction)
|
|
|
|
|
|
def test_browse_interactive_action_serialization_deserialization():
|
|
original_action_dict = {
|
|
'action': 'browse_interactive',
|
|
'args': {
|
|
'thought': '',
|
|
'browser_actions': 'goto("https://www.example.com")',
|
|
'browsergym_send_msg_to_user': '',
|
|
},
|
|
}
|
|
serialization_deserialization(original_action_dict, BrowseInteractiveAction)
|
|
|
|
|
|
def test_file_read_action_serialization_deserialization():
|
|
original_action_dict = {
|
|
'action': 'read',
|
|
'args': {
|
|
'path': '/path/to/file.txt',
|
|
'start': 0,
|
|
'end': -1,
|
|
'thought': 'None',
|
|
'impl_source': 'default',
|
|
'translated_ipython_code': '',
|
|
},
|
|
}
|
|
serialization_deserialization(original_action_dict, FileReadAction)
|
|
|
|
|
|
def test_file_write_action_serialization_deserialization():
|
|
original_action_dict = {
|
|
'action': 'write',
|
|
'args': {
|
|
'path': '/path/to/file.txt',
|
|
'content': 'Hello world',
|
|
'start': 0,
|
|
'end': 1,
|
|
'thought': 'None',
|
|
},
|
|
}
|
|
serialization_deserialization(original_action_dict, FileWriteAction)
|
|
|
|
|
|
def test_legacy_serialization():
|
|
original_action_dict = {
|
|
'action': 'run',
|
|
'args': {
|
|
'blocking': False,
|
|
'command': 'echo "Hello world"',
|
|
'thought': '',
|
|
'hidden': False,
|
|
'confirmation_state': ActionConfirmationStatus.CONFIRMED,
|
|
'keep_prompt': False,
|
|
},
|
|
}
|
|
event = event_from_dict(original_action_dict)
|
|
assert isinstance(event, Action)
|
|
assert isinstance(event, CmdRunAction)
|
|
assert event.command == 'echo "Hello world"'
|
|
assert event.hidden is False
|
|
assert not hasattr(event, 'keep_prompt')
|
|
|
|
event_dict = event_to_dict(event)
|
|
assert 'keep_prompt' not in event_dict['args']
|
|
assert (
|
|
event_dict['args']['confirmation_state'] == ActionConfirmationStatus.CONFIRMED
|
|
)
|
|
assert event_dict['args']['blocking'] is False
|
|
assert event_dict['args']['command'] == 'echo "Hello world"'
|
|
assert event_dict['args']['thought'] == ''
|
|
assert event_dict['args']['is_input'] is False
|
|
|