test_observation_serialization.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from openhands.events.observation import (
  2. CmdOutputObservation,
  3. Observation,
  4. )
  5. from openhands.events.serialization import (
  6. event_from_dict,
  7. event_to_dict,
  8. event_to_memory,
  9. event_to_trajectory,
  10. )
  11. def serialization_deserialization(
  12. original_observation_dict, cls, max_message_chars: int = 10000
  13. ):
  14. observation_instance = event_from_dict(original_observation_dict)
  15. assert isinstance(
  16. observation_instance, Observation
  17. ), 'The observation instance should be an instance of Action.'
  18. assert isinstance(
  19. observation_instance, cls
  20. ), 'The observation instance should be an instance of CmdOutputObservation.'
  21. serialized_observation_dict = event_to_dict(observation_instance)
  22. serialized_observation_trajectory = event_to_trajectory(observation_instance)
  23. serialized_observation_memory = event_to_memory(
  24. observation_instance, max_message_chars
  25. )
  26. assert (
  27. serialized_observation_dict == original_observation_dict
  28. ), 'The serialized observation should match the original observation dict.'
  29. assert (
  30. serialized_observation_trajectory == original_observation_dict
  31. ), 'The serialized observation trajectory should match the original observation dict.'
  32. original_observation_dict.pop('message', None)
  33. original_observation_dict.pop('id', None)
  34. original_observation_dict.pop('timestamp', None)
  35. assert (
  36. serialized_observation_memory == original_observation_dict
  37. ), 'The serialized observation memory should match the original observation dict.'
  38. # Additional tests for various observation subclasses can be included here
  39. def test_observation_event_props_serialization_deserialization():
  40. original_observation_dict = {
  41. 'id': 42,
  42. 'source': 'agent',
  43. 'timestamp': '2021-08-01T12:00:00',
  44. 'observation': 'run',
  45. 'message': 'Command `ls -l` executed with exit code 0.',
  46. 'extras': {
  47. 'exit_code': 0,
  48. 'command': 'ls -l',
  49. 'command_id': 3,
  50. 'hidden': False,
  51. 'interpreter_details': '',
  52. },
  53. 'content': 'foo.txt',
  54. }
  55. serialization_deserialization(original_observation_dict, CmdOutputObservation)
  56. def test_command_output_observation_serialization_deserialization():
  57. original_observation_dict = {
  58. 'observation': 'run',
  59. 'extras': {
  60. 'exit_code': 0,
  61. 'command': 'ls -l',
  62. 'command_id': 3,
  63. 'hidden': False,
  64. 'interpreter_details': '',
  65. },
  66. 'message': 'Command `ls -l` executed with exit code 0.',
  67. 'content': 'foo.txt',
  68. }
  69. serialization_deserialization(original_observation_dict, CmdOutputObservation)