Report Builder: Form Constructor + AI Chat
Статус: MVP готов, нужно тестирование и доработка
Дата начала: 2026-03-28
Проект: c10r.io (c10r.io)
Ветка: текущая (изменения не закоммичены)
Что сделано
Новые файлы
| Файл | Статус | Описание |
|---|
app/ws/[wsid]/reports/components/ReportBuilder.tsx | DONE | Контейнер: FormConstructor (слева) + ReportChat (справа, ResizablePanel collapsible) + ResultTable (внизу) |
app/ws/[wsid]/reports/components/FormConstructor.tsx | DONE | Form-конструктор с collapsible секциями: Source, Mode toggle (Fields/Measures), Fields picker, Measures, Group By, Filters, Sort, Limit |
app/ws/[wsid]/reports/components/ReportChat.tsx | DONE | AI чат: streaming SSE, starter suggestions, парсинг DataConfig из ```json блоков, кнопка очистки, badge "Applied" |
app/ws/[wsid]/reports/components/ResultTable.tsx | DONE | Извлечённая таблица результатов (из старого ReportConstructor) |
app/ws/[wsid]/reports/components/report-config-utils.ts | DONE | Общие типы (DataConfig, EntityInfo, ChatMessage), configToUI/uiToConfig, parseDataConfigFromMarkdown, константы |
app/api/ws/[wsid]/reports/[id]/chat/route.ts | DONE | API endpoint: streaming через LangChain, system prompt с entity registry, сохранение сообщений в отчёт |
config/prompts/report-builder.md | DONE | System prompt для AI: роль, схема DataConfig, правила, плейсхолдеры {ENTITY_REGISTRY} и {CURRENT_CONFIG} |
Изменённые файлы
| Файл | Что изменено |
|---|
app/ws/[wsid]/reports/[id]/page.tsx | Import ReportConstructor → ReportBuilder, добавлен chatMessages в тип ReportDetail |
modules/workspace/report/model.ts | Добавлен IReportChatMessage, ChatMessageSchema, chatMessages[] в IReport + ReportSchema |
modules/workspace/report/controller.ts | addChatMessages(), clearChatMessages(), chatMessages в getReport() |
modules/workspace/report/index.ts | Экспорт addChatMessages, clearChatMessages |
app/api/ws/[wsid]/reports/[id]/route.ts | PATCH поддерживает chatMessages: [] для очистки чата |
messages/en/reports.json | Ключи: constructor.section*, constructor.mode*, chat.* |
messages/ru/reports.json | Ключи: constructor.section*, constructor.mode*, chat.* |
Файлы к удалению (после проверки)
| Файл | Статус |
|---|
app/ws/[wsid]/reports/components/ReportConstructor.tsx | Нигде не импортируется, можно удалить |
Что сделано (тестирование 2026-03-28)
Исправленные баги
Тесты пройдены
Что НЕ сделано (TODO)
Желательно
Косметика
Архитектура
┌──────────────────────────────────────────────────────────┐
│ page.tsx (header: name, description) │
├────────────────────────────┬─────────────────────────────┤
│ FormConstructor │ ReportChat (ResizablePanel) │
│ │ collapsible, resizeFrom=left │
│ ▸ Source [dropdown] │ │
│ ▸ Mode [Fields|Measures] │ 🤖 Опиши что хочешь узнать │
│ ▸ Fields / Measures │ 👤 message... │
│ ▸ Group By │ 🤖 response + [Applied ✓] │
│ ▸ Filters │ │
│ ▸ Sort / Limit │ [________________] [Send] │
│ [▶ Calculate] │ │
├────────────────────────────┴─────────────────────────────┤
│ ResultTable (full width) │
└──────────────────────────────────────────────────────────┘
Data flow
FormConstructor ──onChange──→ ReportBuilder (useState<DataConfig>) ←──onConfigChange── ReportChat
│ │
├── debounced save → PATCH /api/reports/{id}
├── immediate save (AI) → PATCH /api/reports/{id}
└── Calculate → POST /api/reports/{id}/calculate
│
ReportChat → POST /api/reports/{id}/chat ──stream──→ parse ```json → onConfigChange
└── saves messages to report.chatMessages
Ключевые решения
- Единый DataConfig state в ReportBuilder — обе панели читают и пишут в него
- AI чат сохраняется в отчёте (report.chatMessages) — персистентный, с кнопкой очистки
- JSON из ответа AI парсится через regex
json... → parseDataConfigFromMarkdown()
- System prompt включает полный entity registry (все 11 сущностей с полями) + текущий DataConfig
- Temperature 0.3 для AI чата (ниже чем основной chat 0.7) — для более предсказуемого JSON
Как запустить и проверить
cd /Users/m/a/kompot/c10r.io
npm run dev
- Открыть https://localhost:3000/ws/{wsid}/reports
- Создать или открыть существующий отчёт
- Проверить левую панель (FormConstructor): выбрать source, добавить fields, filters
- Проверить правую панель (ReportChat): написать "покажи количество контактов по компаниям"
- Проверить Calculate → таблица результатов
- Свернуть/развернуть чат-панель
- Очистить чат → сообщения удаляются
Контекст для продолжения
- Старый конструктор:
ReportConstructor.tsx — sentence builder с чипами ("Show me [X] from [Y]"). Нигде не используется, можно удалить
- Pipeline builder:
modules/workspace/report/pipeline-builder.ts — НЕ менялся, конвертирует DataConfig → MongoDB aggregation
- Entity registry:
modules/workspace/report/entity-registry.ts — НЕ менялся, 11 сущностей с полями/связями
- Существующий AI chat:
app/api/ws/[wsid]/chat/route.ts — основной чат с tools, report chat сделан проще (без tools)
- ResizablePanel:
app/components/ResizablePanel.tsx — компонент с drag-resize, collapsible, localStorage persistence