Socrates_docker / llm_utility.py
alesamodio's picture
first push
433f3f1
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 {}