"""Чат по §22-форсайту участка (#957). Step 1 детерминированный + Step 2 LLM tool-loop. Под-модули: • retrieval — read-only достаёт персистентный SiteFinderReport участка. • intents — роутинг RU-вопроса в intent + шаблонный RU-ответ (Step-1, FALLBACK). • tools — read-only секционные tool'ы (срезы загруженного report_dict). • safe_payload — §19-гейт: единственная сборка исходящего SafePayload (аллоулист). • orchestrator — LLM tool-loop + RU-проза поверх отчёта; при сбое LLM → Step-1 fallback. LLM-слой ОПЦИОНАЛЬНЫЙ: при llm_enabled=False или любом сбое возвращается детерм. Step-1. """ from __future__ import annotations from app.services.chat.intents import render_answer, route_intent from app.services.chat.orchestrator import ChatResult, orchestrate_chat from app.services.chat.retrieval import get_report_for_chat __all__ = [ "ChatResult", "get_report_for_chat", "orchestrate_chat", "render_answer", "route_intent", ]