- POST /dialog/{token}/events/stream: Server-Sent Events with the agent's steps («Смотрю вашу карту ЕМИАС…»,
«Ищу в клинических рекомендациях…»), the answer as the model writes it (OpenRouter stream=true), then the
final replies (same as /events, incl. the forbidden-output filter and sources). X-Accel-Buffering: no.
- Web: free-text messages use the stream — a live bubble with steps, typing dots and a cursor; falls back to
the plain request if the stream breaks.
- Phones: the bottom tab bar gets «Чат» (it had no way back to the chat).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Веб-приложение пациента
Ещё один канал к тому же движку диалога, что и Telegram-бот (ADR-004): согласие, онбординг, шкалы, чек-ины и
кризисный скрипт приходят из app/dialog через /api/v1/dialog/{token}/.... Бот продолжает работать параллельно.
Запуск
make up # или: uv run uvicorn app.main:app --port 8000
cd web && npm install
npm run dev # http://localhost:5173 — /api проксируется на :8000
Интерфейс открывается на :5173; на :8000 работает только API (/docs).
Вход
| Способ | Что происходит | API |
|---|---|---|
| ЕМИАС (демо) | одноразовый код от врача → токен пациента, привязка к врачу; или синтетический демо-пациент | POST /auth/emias, POST /auth/emias/demo |
| Анонимно | случайный токен, в identity-БД ничего не пишется, врач не привязан | POST /auth/anonymous |
Реальная авторизация ЕМИАС/ЕСИА подключается как IdentityProvider (app/integrations/emias_mock.py) без
изменений во фронтенде.
Структура (под перенос в мобильное приложение)
src/theme/tokens.css цвета, шрифт, отступы — единственный источник; три цвета = три направления сервиса
src/content/ru.ts все тексты интерфейса (тексты диалога — в config/texts/, их отдаёт движок)
src/api/ типы-зеркала контрактов бэкенда и клиент
src/session/store.ts хранение сессии за интерфейсом: localStorage → Capacitor Preferences/Keychain
src/dialog/ общий разговор с движком (DialogContext) и выбор вида экрана по ответу движка (step.ts)
src/screens/ экраны по docs/mock: вход A1–A3, фокус-экран /flow (A4–A6, B, D, E1–E3, E5, G2–G4),
«Сегодня» C1/C2, «Лекарства» E4, «Врач» F, «Профиль» H, «Сообщения» I1
Как устроены экраны
Логика сценариев живёт только в движке диалога. Экран /flow берёт последний ответ движка и рисует его
как отдельный экран мокапа: вопрос анкеты с прогрессом «Вопрос n из N», шкала 0–10, свободный текст,
напоминание о лекарстве, согласие, кризисный экран. Новый сценарий в движке появится в вебе без правок фронтенда.
Данные для «Сегодня» и «Лекарства» — GET /api/v1/me/{token}/today (дозы на сегодня, отметки за неделю,
следующий визит, время по демо-часам).
Анкеты, дневник и модуль «Лекарства»
- Анкеты этапа 1 (C-SSRS, PHQ-2/PHQ-9, фильтр травмы, TSQ, PCL-5, RUS-AUDIT-S/RUS-AUDIT) и дневник этапа 2 —
тот же фокус-экран. Пункт распознаётся по кнопкам
iq:…; чип раздела, «Вопрос n из N» (для адаптивных форм — без «из N»), период, «Продолжить позже», «Мне нужна помощь сейчас», пропуск необязательных пунктов, ввод часов сна, шкалы 0–10 с подписями концов, таблица стандартных порций для п. 2 RUS-AUDIT (из утверждённого бланка, без калькулятора). Метаданные —GET /api/v1/instruments/catalog. - Анкеты включаются только в демо:
INTAKE_DEMO=1(вместе сDEMO_CLOCK). Клинический замок вconfig/intake_runtime.yamlне трогается. Пока нет подписанной политики маршрутизации и формы C-SSRS «с последнего контакта», завершённый опрос и дневник уходят на оценку специалиста — UI показывает это отдельным экраном. - Карточка препарата
/meds/:ref— справочникdata/meds/meds_reference.json(собираетсяscripts/build_meds_reference.pyпо КР Минздрава: депрессия 2024, ПТСР 2023): когда ждать эффекта (с днём лечения), сколько принимать, что может беспокоить, когда срочно к врачу, «не прекращать самостоятельно». Дозы не показываются. Черновик — вычитывает психиатр.GET /api/v1/meds/reference. - «Сообщить о побочном эффекте» доступно всегда (
med:side_effects:<доза или дата>), карточка «День N лечения» на «Сегодня» — в 1-й, 7-й и 14-й день.
Мобильная версия: mobile-first вёрстка, safe-area, hash-роутинг и относительные пути сборки — dist/ оборачивается
Capacitor без изменений (VITE_API_BASE = абсолютный адрес API).
Известные ограничения прототипа
- Токен пациента используется как учётные данные сессии; в проде — короткоживущие серверные сессии.
- Подбор кодов не ограничен по частоте.
- В демо нет сида кодов подключения: для показа используйте демо-пациента.