json_in_md_parser.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import json
  2. from core.llm_generator.output_parser.errors import OutputParserError
  3. def parse_json_markdown(json_string: str) -> dict:
  4. # Get json from the backticks/braces
  5. json_string = json_string.strip()
  6. starts = ["```json", "```", "``", "`", "{"]
  7. ends = ["```", "``", "`", "}"]
  8. end_index = -1
  9. for s in starts:
  10. start_index = json_string.find(s)
  11. if start_index != -1:
  12. if json_string[start_index] != "{":
  13. start_index += len(s)
  14. break
  15. if start_index != -1:
  16. for e in ends:
  17. end_index = json_string.rfind(e, start_index)
  18. if end_index != -1:
  19. if json_string[end_index] == "}":
  20. end_index += 1
  21. break
  22. if start_index != -1 and end_index != -1 and start_index < end_index:
  23. extracted_content = json_string[start_index:end_index].strip()
  24. print("content:", extracted_content, start_index, end_index)
  25. parsed = json.loads(extracted_content)
  26. else:
  27. raise Exception("Could not find JSON block in the output.")
  28. return parsed
  29. def parse_and_check_json_markdown(text: str, expected_keys: list[str]) -> dict:
  30. try:
  31. json_obj = parse_json_markdown(text)
  32. except json.JSONDecodeError as e:
  33. raise OutputParserError(f"Got invalid JSON object. Error: {e}")
  34. for key in expected_keys:
  35. if key not in json_obj:
  36. raise OutputParserError(
  37. f"Got invalid return object. Expected key `{key}` to be present, but got {json_obj}"
  38. )
  39. return json_obj