docs: план Спринта 2 — диалог с памятью + отдельная страница «Песочница»

Уточнения к плану Спринта 2 по итогам обсуждения:

- Вторая отладочная страница /sandbox вместо расширения текущей (старый
  Debug UI остаётся нетронутым).
- Все диалоги сохраняются навсегда, видны в левой колонке; можно открыть
  старый тред, переименовать, удалить. Имя треда — автоматом по первой
  реплике, с возможностью поменять.
- Стек хранилища: SQLite + SQLAlchemy 2.0 async + Alembic. Выбор под
  будущий рост (мульти-пользователи, мульти-промпты, несколько спец-RAG).
- В таблицу threads сразу заводим nullable-колонки user_id и
  agent_config_id — чтобы Спринты 3+ не тащили миграции задним числом.
- Набор эндпоинтов расширен: GET/PATCH/DELETE /threads, GET /threads/{id}.

В бэклог: хранение исходных файлов для переиндексации без повторной
загрузки.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
AR 15 M4
2026-04-23 09:50:42 +05:00
parent a7f78d71b2
commit ccc3dde978
+33 -8
View File
@@ -43,23 +43,47 @@
## Спринт 2. Многошаговый диалог с памятью треда ## Спринт 2. Многошаговый диалог с памятью треда
### Цель ### Цель
Перейти от одиночного `/query` к полноценному диалогу: агент помнит историю, оператор ведёт разговор из 5+ реплик. На тестовой странице добавляется режим «чат», рядом с режимом «одиночный вопрос» из Спринта 1. Перейти от одиночного `/query` к полноценному диалогу: агент помнит историю, оператор ведёт разговор из 5+ реплик. Текущую страницу отладки (одиночный вопрос) оставляем без изменений, добавляем **вторую отладочную страницу** — «Песочница» со списком всех сохранённых диалогов.
### Статус: ⏳ Запланирован ### Статус: ⏳ Запланирован
### Задачи ### Задачи
- [ ] Хранилище диалогов (SQLite): `threads`, `messages`
- [ ] Эндпоинт `POST /chat`: принимает `thread_id`, `text` → возвращает ответ агента + источники + `assembled_prompt` **Хранилище:**
- [ ] Базовый системный промпт (хардкод для старта): роль, тон клиники, что можно и нельзя - [ ] Стек: SQLite + SQLAlchemy 2.0 (async, ORM-стиль) + Alembic для миграций
- [ ] Сборка контекста: история треда + RAG-чанки - [ ] Таблицы:
- [ ] Веб-страница расширена режимом «Песочница»: - `threads` (id, name, user_id nullable, agent_config_id nullable, created_at, updated_at)
- [ ] левая колонка — чат (оператор пишет как пациент, видит ответы агента) - `messages` (id, thread_id FK, role, text, sources_json, assembled_prompt, created_at)
- Колонки `user_id` и `agent_config_id` заводим сразу nullable — под будущие Спринты 3+ (мульти-пользователи, мульти-промпты), чтобы не тащить миграции задним числом
- [ ] Первая миграция Alembic с этими двумя таблицами
- [ ] Все диалоги сохраняются навсегда (никакого авто-удаления)
- [ ] Имя треда генерируется автоматически по первой реплике пациента + дата; оператор может переименовать вручную
**Эндпоинты:**
- [ ] `POST /chat` — принимает `thread_id` (или создаёт новый если не передан) + `text` → возвращает ответ агента + источники со score + `assembled_prompt`
- [ ] `GET /threads` — список всех диалогов (id, name, created_at, messages_count, превью первой реплики)
- [ ] `GET /threads/{id}` — тред целиком с историей сообщений
- [ ] `PATCH /threads/{id}` — переименовать тред
- [ ] `DELETE /threads/{id}` — удалить тред со всеми сообщениями
**Сборка ответа:**
- [ ] Базовый системный промпт (хардкод для старта): роль агента, тон клиники, что можно и нельзя
- [ ] Сборка контекста для LLM: системный промпт + история треда + RAG-чанки по последней реплике
**Веб-интерфейс:**
- [ ] В шапке обеих страниц — ссылки «Отладка» (текущая `/`) / «Песочница» (новая `/sandbox`)
- [ ] Текущий `static/index.html` остаётся без изменений
- [ ] Новая страница `static/sandbox.html` на отдельном маршруте `/sandbox`:
- [ ] левая колонка — список сохранённых диалогов: превью, дата, кнопка «переименовать», кнопка «удалить», кнопка «новый тред»
- [ ] центральная колонка — сам чат (оператор пишет как пациент, видит ответы агента, история подгружается при клике на тред из списка)
- [ ] правая колонка — retrieved-чанки со score + собранный промпт по последней реплике - [ ] правая колонка — retrieved-чанки со score + собранный промпт по последней реплике
- [ ] кнопка «сбросить тред»
### Критерий готовности ### Критерий готовности
- [ ] Оператор может провести диалог из 5+ реплик, агент помнит контекст - [ ] Оператор может провести диалог из 5+ реплик, агент помнит контекст
- [ ] Все диалоги сохраняются и видны в левой колонке после перезагрузки страницы
- [ ] Оператор может открыть старый диалог, переименовать его, удалить
- [ ] В правой колонке видно, что нашёл RAG и что улетело в LLM на последнем шаге - [ ] В правой колонке видно, что нашёл RAG и что улетело в LLM на последнем шаге
- [ ] Старая страница отладки (`/`) работает как раньше, ничего не сломано
--- ---
@@ -143,3 +167,4 @@
- Автосинхронизация wiki - Автосинхронизация wiki
- Перевод правил из свободного текста в структурированный список (pattern → instruction) - Перевод правил из свободного текста в структурированный список (pattern → instruction)
- Мультипользовательский режим (несколько операторов одновременно настраивают) - Мультипользовательский режим (несколько операторов одновременно настраивают)
- Хранение исходных файлов (`./data/uploads/{document_id}.{ext}` + `source_path` в метаданных Chroma) — чтобы переиндексировать без повторной загрузки и показывать оператору оригинал документа