Files
tgit/app/llm/parsing.py
T
ElebobaandClaude Opus 5.5 ab988e6ed0 feat(llm): провайдер за протоколом — OpenAI-совместимый API и mock, фабрика по конфигу
- LLMProvider: complete(messages, schema) -> LLMResult (текст, разобранный JSON, токены)
- openai_compat: /chat/completions, structured output через response_format json_schema,
  JSON из ```-обёртки тоже разбирается; ретраи на 429/5xx и сетевые ошибки, 4xx — сразу ошибка
- mock: детерминированные правила для тестов и демо без сети
- LLMSettings (LLM_PROVIDER/BASE_URL/MODEL/API_KEY…), CLI python -m app.llm.cli

Refs #17

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:06:30 +03:00

19 lines
520 B
Python

import json
import re
from typing import Any
_FENCE = re.compile(r"^```(?:json)?\s*(.*?)\s*```$", re.DOTALL)
def parse_json_object(text: str) -> dict[str, Any] | None:
"""Best effort: models sometimes wrap JSON in ``` fences even when asked not to."""
candidate = text.strip()
fenced = _FENCE.match(candidate)
if fenced:
candidate = fenced.group(1)
try:
value = json.loads(candidate)
except ValueError:
return None
return value if isinstance(value, dict) else None