From 22ac40450f183150c08184fc1892ae123a127aef Mon Sep 17 00:00:00 2001 From: AR 15 M4 Date: Thu, 23 Apr 2026 10:37:57 +0500 Subject: [PATCH] =?UTF-8?q?feat(sprint2):=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D0=B0=20=C2=AB=D0=9F=D0=B5=D1=81=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D0=B0=C2=BB=20+=20=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Завершающий кусок Спринта 2 — UI для ведения диалогов. static/sandbox.html: - Трёхколоночная раскладка во всю высоту экрана. - Слева: список сохранённых диалогов (имя, дата последнего обновления, счётчик сообщений, превью первой реплики), кнопка «+ новый»; на каждой карточке — «переименовать» (prompt) и «удалить» (confirm). - Центр: чат в привычной стилистике (пузыри, user справа, assistant слева), Enter — отправить, Shift+Enter — перенос строки. Заголовок сверху показывает имя активного треда. - Справа: отладка ответа — найденные фрагменты со score в процентах + собранный промпт в моноширинном блоке на светлом фоне. - При отправке первой реплики тред создаётся автоматически, API возвращает thread_id и thread_name — дальше реплики уходят в тот же тред. static/index.html: в шапке добавлены ссылки «Отладка» / «Песочница», подсветка активной страницы; тот же стиль nav-ссылок продублирован в sandbox.html. routers/chat: detail сообщения ошибки теперь включает тип исключения (удобнее при диагностике), trace пишется через logger.exception. SPRINTS.md: Спринт 2 помечен как закрытый. Co-Authored-By: Claude Opus 4.7 (1M context) --- SPRINTS.md | 2 +- routers/chat.py | 2 +- static/index.html | 20 +- static/sandbox.html | 628 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 649 insertions(+), 3 deletions(-) create mode 100644 static/sandbox.html diff --git a/SPRINTS.md b/SPRINTS.md index 61caa02..8200703 100644 --- a/SPRINTS.md +++ b/SPRINTS.md @@ -45,7 +45,7 @@ ### Цель Перейти от одиночного `/query` к полноценному диалогу: агент помнит историю, оператор ведёт разговор из 5+ реплик. Текущую страницу отладки (одиночный вопрос) оставляем без изменений, добавляем **вторую отладочную страницу** — «Песочница» со списком всех сохранённых диалогов. -### Статус: ⏳ Запланирован +### Статус: ✅ Закрыт ### Задачи diff --git a/routers/chat.py b/routers/chat.py index 5e228e1..2715c07 100644 --- a/routers/chat.py +++ b/routers/chat.py @@ -35,7 +35,7 @@ async def chat(req: ChatRequest, session: AsyncSession = Depends(get_session)): raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.exception("Chat failed") - raise HTTPException(status_code=500, detail=f"Chat error: {e}") + raise HTTPException(status_code=500, detail=f"Chat error [{type(e).__name__}]: {e}") return ChatResponse( thread_id=result["thread_id"], diff --git a/static/index.html b/static/index.html index 6d5d7d8..98326cc 100644 --- a/static/index.html +++ b/static/index.html @@ -62,6 +62,20 @@ .dot.ok { background: var(--ok); } .dot.warn { background: var(--warn); } .dot.err { background: var(--err); } + .nav { + display: flex; + gap: 4px; + } + .nav-link { + text-decoration: none; + color: var(--muted); + padding: 6px 12px; + border-radius: 6px; + font-size: 13px; + font-weight: 500; + } + .nav-link:hover { background: var(--chip-bg); color: var(--fg); } + .nav-link.active { background: var(--accent); color: #fff; } .stats { margin-left: auto; font-size: 13px; @@ -324,7 +338,11 @@
-

Chat Agent for Patients — Debug

+

Chat Agent for Patients

+ проверяю…
diff --git a/static/sandbox.html b/static/sandbox.html new file mode 100644 index 0000000..4902621 --- /dev/null +++ b/static/sandbox.html @@ -0,0 +1,628 @@ + + + + + +Chat Agent for Patients — Песочница + + + + +
+

Chat Agent for Patients

+ + проверяю… +
+ +
+ + + +
+
+
— выберите диалог слева или начните новый —
+
+
+
Здесь появятся сообщения диалога.
Напишите что-нибудь снизу, чтобы начать.
+
+
+ + +
+
+ + + +
+ +
+ + + + +