From ccc3dde978c37e9ca801f0d533bf4e23cf9c874d Mon Sep 17 00:00:00 2001 From: AR 15 M4 Date: Thu, 23 Apr 2026 09:50:42 +0500 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BF=D0=BB=D0=B0=D0=BD=20=D0=A1=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D1=82=D0=B0=202=20=E2=80=94=20=D0=B4=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D0=B3=20=D1=81=20=D0=BF=D0=B0=D0=BC=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=D1=8E=20+=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20=C2=AB=D0=9F=D0=B5=D1=81=D0=BE=D1=87=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Уточнения к плану Спринта 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) --- SPRINTS.md | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/SPRINTS.md b/SPRINTS.md index 9ffb001..61caa02 100644 --- a/SPRINTS.md +++ b/SPRINTS.md @@ -43,23 +43,47 @@ ## Спринт 2. Многошаговый диалог с памятью треда ### Цель -Перейти от одиночного `/query` к полноценному диалогу: агент помнит историю, оператор ведёт разговор из 5+ реплик. На тестовой странице добавляется режим «чат», рядом с режимом «одиночный вопрос» из Спринта 1. +Перейти от одиночного `/query` к полноценному диалогу: агент помнит историю, оператор ведёт разговор из 5+ реплик. Текущую страницу отладки (одиночный вопрос) оставляем без изменений, добавляем **вторую отладочную страницу** — «Песочница» со списком всех сохранённых диалогов. ### Статус: ⏳ Запланирован ### Задачи -- [ ] Хранилище диалогов (SQLite): `threads`, `messages` -- [ ] Эндпоинт `POST /chat`: принимает `thread_id`, `text` → возвращает ответ агента + источники + `assembled_prompt` -- [ ] Базовый системный промпт (хардкод для старта): роль, тон клиники, что можно и нельзя -- [ ] Сборка контекста: история треда + RAG-чанки -- [ ] Веб-страница расширена режимом «Песочница»: - - [ ] левая колонка — чат (оператор пишет как пациент, видит ответы агента) + +**Хранилище:** +- [ ] Стек: SQLite + SQLAlchemy 2.0 (async, ORM-стиль) + Alembic для миграций +- [ ] Таблицы: + - `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 + собранный промпт по последней реплике - - [ ] кнопка «сбросить тред» ### Критерий готовности - [ ] Оператор может провести диалог из 5+ реплик, агент помнит контекст +- [ ] Все диалоги сохраняются и видны в левой колонке после перезагрузки страницы +- [ ] Оператор может открыть старый диалог, переименовать его, удалить - [ ] В правой колонке видно, что нашёл RAG и что улетело в LLM на последнем шаге +- [ ] Старая страница отладки (`/`) работает как раньше, ничего не сломано --- @@ -143,3 +167,4 @@ - Автосинхронизация wiki - Перевод правил из свободного текста в структурированный список (pattern → instruction) - Мультипользовательский режим (несколько операторов одновременно настраивают) +- Хранение исходных файлов (`./data/uploads/{document_id}.{ext}` + `source_path` в метаданных Chroma) — чтобы переиндексировать без повторной загрузки и показывать оператору оригинал документа