Spaces:
Sleeping
Sleeping
File size: 1,096 Bytes
98ceb88 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import json
import re
def _strip_fences(text: str) -> str:
text = text.strip()
text = re.sub(r"^```(?:json)?\s*\n?", "", text, flags=re.MULTILINE)
text = re.sub(r"\n?```\s*$", "", text, flags=re.MULTILINE)
return text.strip()
def _extract_first_json(text: str):
"""Try to pull the first {...} or [...] block from noisy text."""
for pattern in (r"\{[\s\S]*\}", r"\[[\s\S]*\]"):
match = re.search(pattern, text)
if match:
try:
return json.loads(match.group())
except json.JSONDecodeError:
pass
return None
def parse_json(text: str):
"""
Defensively parse model JSON output.
Returns parsed dict/list, or {"error": "...", "raw": "..."} on failure.
Never raises.
"""
cleaned = _strip_fences(text)
try:
return json.loads(cleaned)
except json.JSONDecodeError:
pass
recovered = _extract_first_json(cleaned)
if recovered is not None:
return recovered
return {"error": "Could not parse model output as JSON.", "raw": text[:600]}
|