json.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import json
  2. from datetime import datetime
  3. from json_repair import repair_json
  4. from openhands.core.exceptions import LLMResponseError
  5. from openhands.events.event import Event
  6. from openhands.events.serialization import event_to_dict
  7. def my_default_encoder(obj):
  8. """Custom JSON encoder that handles datetime and event objects"""
  9. if isinstance(obj, datetime):
  10. return obj.isoformat()
  11. if isinstance(obj, Event):
  12. return event_to_dict(obj)
  13. return json.JSONEncoder().default(obj)
  14. def dumps(obj, **kwargs):
  15. """Serialize an object to str format"""
  16. return json.dumps(obj, default=my_default_encoder, **kwargs)
  17. def loads(json_str, **kwargs):
  18. """Create a JSON object from str"""
  19. try:
  20. return json.loads(json_str, **kwargs)
  21. except json.JSONDecodeError:
  22. pass
  23. depth = 0
  24. start = -1
  25. for i, char in enumerate(json_str):
  26. if char == '{':
  27. if depth == 0:
  28. start = i
  29. depth += 1
  30. elif char == '}':
  31. depth -= 1
  32. if depth == 0 and start != -1:
  33. response = json_str[start : i + 1]
  34. try:
  35. json_str = repair_json(response)
  36. return json.loads(json_str, **kwargs)
  37. except (json.JSONDecodeError, ValueError, TypeError) as e:
  38. raise LLMResponseError(
  39. 'Invalid JSON in response. Please make sure the response is a valid JSON object.'
  40. ) from e
  41. raise LLMResponseError('No valid JSON object found in response.')