# Final Answer Composer Spec ## 1. Назначение `answerComposer` преобразует нормализованные retrieval results в один user-facing ответ на русском языке. Реализация: - `backend/src/services/answerComposer.ts` Вход: - `userMessage` - `routeSummary` - `retrievalResults[]` (уже в unified schema) Выход: - `assistant_reply` (текст для пользователя) - `reply_type` - `fallback_type` ## 2. Приоритеты ответа Порядок разрешения: 1. `out_of_scope` fallback. 2. `clarification` fallback (если factual результатов нет). 3. `error`, если есть только ошибки retrieval. 4. `empty`, если запрос валиден, но найдено 0 результатов. 5. `partial`, если есть полезные данные, но покрытие неполное. 6. `factual`, если есть корректные результаты без fallback-конфликта. ## 3. Типы ответов ### `factual` - данные найдены; - даётся краткий итог + компактная сводка. ### `empty` - корректный запрос, но выдача пустая. ### `partial` - часть вопроса обработана; - часть недоступна/пустая/ошибочная. ### `clarification` - нужно уточнение периода/документа/счёта/контрагента. ### `out_of_scope` - запрос не относится к учётному контуру компании. ### `error` - техническая ошибка retrieval. ## 4. Контентные правила User-facing текст: - только русский; - без route names; - без `trace`, `fallback_type`, `planned routes`; - без служебного planner/debug языка. Технические детали живут только в `debug` payload. ## 5. Форматирование factual-ответа Composer умеет кратко форматировать несколько типов retrieval: - `chain`: акцент на цепочки контрагент/документы/операции. - `ranking`: топ/ранжирование. - `list`: список записей (в т.ч. риск-объекты). - `object/summary`: компактный факт-блок. Если результатов много, выдаётся только верхняя часть (top-N), остальное остаётся в debug payload.