json.py 1.6 KB

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