feat(sprint2): страница «Песочница» + навигация между страницами
Завершающий кусок Спринта 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) <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -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"],
|
||||
|
||||
Reference in New Issue
Block a user