| """LLM JSON cevaplarını güvenli parse etme yardımcıları. | |
| LLM'ler bazen ```json ... ``` markdown code fence ile sarar veya | |
| JSON öncesi/sonrası açıklama metni ekler. Bu helper bu varyasyonları temizler. | |
| """ | |
| import json | |
| import re | |
| _FENCE_RE = re.compile(r"^```(?:json)?\s*|\s*```$", re.IGNORECASE | re.MULTILINE) | |
| def parse_llm_json(text: str) -> dict | None: | |
| """LLM cevabından JSON dict çıkar; başarısızsa None döner.""" | |
| if not text: | |
| return None | |
| s = text.strip() | |
| # Markdown code fence'i kaldır | |
| s = _FENCE_RE.sub("", s).strip() | |
| # Direkt dene | |
| try: | |
| return json.loads(s) | |
| except Exception: | |
| pass | |
| # İlk { ... } bloğunu yakalamayı dene | |
| match = re.search(r"\{[\s\S]*\}", s) | |
| if match: | |
| try: | |
| return json.loads(match.group()) | |
| except Exception: | |
| return None | |
| return None | |