Spaces:
Running
Running
| import json, re, ast | |
| from typing import Any | |
| try: | |
| from json_repair import repair_json | |
| HAS_JSON_REPAIR = True | |
| except ImportError: | |
| HAS_JSON_REPAIR = False | |
| def safe_parse_json(raw: str) -> Any: | |
| """ | |
| Attempt to parse JSON from an LLM response, regardless of format issues. | |
| Tries multiple strategies until one succeeds. | |
| Returns Python object (dict/list) or {} if nothing works. | |
| """ | |
| # 1. Direct parse | |
| try: | |
| return json.loads(raw) | |
| except Exception: | |
| pass | |
| # 2. Regex extract array or object | |
| try: | |
| match = re.search(r"(\[.*\])", raw, re.DOTALL) | |
| if match: | |
| return json.loads(match.group(1)) | |
| match = re.search(r"(\{.*\})", raw, re.DOTALL) | |
| if match: | |
| return json.loads(match.group(1)) | |
| except Exception: | |
| pass | |
| # 3. Repair JSON if library is available | |
| if HAS_JSON_REPAIR: | |
| try: | |
| repaired = repair_json(raw) | |
| return json.loads(repaired) | |
| except Exception: | |
| pass | |
| # 4. Try Python literal_eval (handles single quotes) | |
| try: | |
| return ast.literal_eval(raw) | |
| except Exception: | |
| pass | |
| # 5. Fallback: return empty | |
| return {} | |