[backend][B] Адаптеры: mis_mock, esia_mock, ГРЛС-выдержки, notify, outbox #14

Closed
opened 2026-10-03 14:38:55 +03:00 by Eleboba · 0 comments
Owner

Описание

SPEC §9: всё внешнее — за Protocol из app/integrations/base.py, в демо — моки.

Желаемый результат

  • mis_mock.py: назначения из data/meds/mis_prescriptions.json + запись из «Подключить пациента».
  • esia_mock.py: подтверждение по коду подключения (connect_codes).
  • grls.py + data/meds/grls/*.yaml: выдержки для сертралина, пароксетина, эсциталопрама, флуоксетина (+ празозин/миртазапин, если успеваем): частые побочки и сроки, отсроченный эффект, алкоголь, «не отменять резко», источник.
  • notify.py: Notifier → событие для дашборда (лента алертов) + Telegram-чат врача, если задан DOCTOR_NOTIFY_CHAT_ID.
  • Outbox для веб-консоли: очередь исходящих реплик по токену (in-memory / таблица).

Зона и владение файлами

Lane B (backend) — владеет: app/api/** (кроме schemas.py), app/services/**, app/scheduler/**, app/integrations/** (кроме base.py), app/db/**, scripts/**, data/**, tests/test_api*.py, tests/test_services*.py, tests/test_scheduler*.py, tests/test_seed*.py, tests/test_integrations*.py.

Замороженные контракты (менять только отдельным мелким PR с пингом всех): app/core/types.py, app/dialog/contracts.py, app/api/schemas.py, app/integrations/base.py, app/services/contracts.py, app/main.py, app/config.py, config/modules.yaml, config/rules.yaml, config/scales/*, pyproject.toml/uv.lock, docker-compose.yml, Makefile.


Лог выполнения

2026-10-04

2026-10-04

Что сделано

  • app/integrations/__init__.py: setup() выполняется при импорте пакета (main.py заморожен), идемпотентен, заменяет только in-memory дефолты из base.py (тестовые фейки и TelegramOutbox не трогает); файлы и БД открываются лениво.
  • mis_mock.py — MisMock: назначения из таблицы prescriptions клинической БД, запасной источник — data/meds/mis_prescriptions.json (синтетика, ключ — токен; персоны кабинета tok-andrey … tok-pavel).
  • connect_code.py — ConnectCodeIdentity (вместо esia_mock, чтобы не конфликтовать с emias_mock.py Arxip222): одноразовый код подключения через identity_repo.redeem_connect_code → VerifiedPerson(token, doctor_id).
  • grls.py + data/meds/grls/*.yaml — GrlsExcerpts: синтетические пересказы инструкций (сертралин, пароксетин, эсциталопрам, флуоксетин + миртазапин, празозин), все 7 разделов med_qa, источник «ГРЛС, инструкция по медицинскому применению, раздел …», шапка «сверить с действующей инструкцией ГРЛС».
  • notify.py — CompositeNotifier: лента в памяти (recent(since_id, doctor_id), монотонные id) + Telegram-чат врача при DOCTOR_NOTIFY_CHAT_ID и TG_BOT_TOKEN (aiogram Bot лениво, ошибки только в лог). Текст: уровень + причина правила + короткий id пациента (6 символов токена), без ПДн.

Результат

  • tests/test_integrations.py — 28 тестов (sqlite in-memory для БД-адаптеров, идемпотентность setup, med_qa end-to-end на реальной выдержке сертралина: дни 2/5/10). Весь набор: 807 passed.

Заметки/решения

  • Код подключения проверяется дважды за один флоу (Telegram /start → bind, затем состояние new движка) — поэтому после погашения код ещё 15 минут возвращает того же пациента, потом отклоняется.
  • В таблице prescriptions нет колонки instructions — MisMock берёт schedule["instructions"], если сид её туда положит.
  • tests/test_llm_med_qa.py::test_default_registry_has_no_data переписан: теперь явно подставляет NoDrugInfo (тест сам ожидал смену поведения после #14).
  • Для #12: при запущенном Telegram integrations.outbox — TelegramOutbox(fallback=MemoryOutbox), а /dialog/{token}/outbox дренирует только MemoryOutbox → консоль получит пусто. Стоит дренировать box.fallback, если это TelegramOutbox.
  • Тексты ГРЛС — пересказ для прототипа, требуют сверки с действующими инструкциями (празозин в инструкции — антигипертензивное, при кошмарах назначается вне показаний).
## Описание SPEC §9: всё внешнее — за Protocol из `app/integrations/base.py`, в демо — моки. ## Желаемый результат - `mis_mock.py`: назначения из `data/meds/mis_prescriptions.json` + запись из «Подключить пациента». - `esia_mock.py`: подтверждение по коду подключения (`connect_codes`). - `grls.py` + `data/meds/grls/*.yaml`: выдержки для сертралина, пароксетина, эсциталопрама, флуоксетина (+ празозин/миртазапин, если успеваем): частые побочки и сроки, отсроченный эффект, алкоголь, «не отменять резко», источник. - `notify.py`: `Notifier` → событие для дашборда (лента алертов) + Telegram-чат врача, если задан `DOCTOR_NOTIFY_CHAT_ID`. - Outbox для веб-консоли: очередь исходящих реплик по токену (in-memory / таблица). ## Зона и владение файлами **Lane B (backend)** — владеет: `app/api/**` (кроме `schemas.py`), `app/services/**`, `app/scheduler/**`, `app/integrations/**` (кроме `base.py`), `app/db/**`, `scripts/**`, `data/**`, `tests/test_api*.py`, `tests/test_services*.py`, `tests/test_scheduler*.py`, `tests/test_seed*.py`, `tests/test_integrations*.py`. **Замороженные контракты** (менять только отдельным мелким PR с пингом всех): `app/core/types.py`, `app/dialog/contracts.py`, `app/api/schemas.py`, `app/integrations/base.py`, `app/services/contracts.py`, `app/main.py`, `app/config.py`, `config/modules.yaml`, `config/rules.yaml`, `config/scales/*`, `pyproject.toml`/`uv.lock`, `docker-compose.yml`, `Makefile`. --- ## Лог выполнения ### 2026-10-04 ### 2026-10-04 **Что сделано** - `app/integrations/__init__.py`: `setup()` выполняется при импорте пакета (main.py заморожен), идемпотентен, заменяет только in-memory дефолты из `base.py` (тестовые фейки и TelegramOutbox не трогает); файлы и БД открываются лениво. - `mis_mock.py` — `MisMock`: назначения из таблицы `prescriptions` клинической БД, запасной источник — `data/meds/mis_prescriptions.json` (синтетика, ключ — токен; персоны кабинета `tok-andrey` … `tok-pavel`). - `connect_code.py` — `ConnectCodeIdentity` (вместо `esia_mock`, чтобы не конфликтовать с `emias_mock.py` Arxip222): одноразовый код подключения через `identity_repo.redeem_connect_code` → `VerifiedPerson(token, doctor_id)`. - `grls.py` + `data/meds/grls/*.yaml` — `GrlsExcerpts`: синтетические пересказы инструкций (сертралин, пароксетин, эсциталопрам, флуоксетин + миртазапин, празозин), все 7 разделов med_qa, источник «ГРЛС, инструкция по медицинскому применению, раздел …», шапка «сверить с действующей инструкцией ГРЛС». - `notify.py` — `CompositeNotifier`: лента в памяти (`recent(since_id, doctor_id)`, монотонные id) + Telegram-чат врача при `DOCTOR_NOTIFY_CHAT_ID` и `TG_BOT_TOKEN` (aiogram Bot лениво, ошибки только в лог). Текст: уровень + причина правила + короткий id пациента (6 символов токена), без ПДн. **Результат** - `tests/test_integrations.py` — 28 тестов (sqlite in-memory для БД-адаптеров, идемпотентность setup, med_qa end-to-end на реальной выдержке сертралина: дни 2/5/10). Весь набор: 807 passed. **Заметки/решения** - Код подключения проверяется дважды за один флоу (Telegram `/start` → bind, затем состояние `new` движка) — поэтому после погашения код ещё 15 минут возвращает того же пациента, потом отклоняется. - В таблице `prescriptions` нет колонки instructions — `MisMock` берёт `schedule["instructions"]`, если сид её туда положит. - `tests/test_llm_med_qa.py::test_default_registry_has_no_data` переписан: теперь явно подставляет `NoDrugInfo` (тест сам ожидал смену поведения после #14). - Для #12: при запущенном Telegram `integrations.outbox` — `TelegramOutbox(fallback=MemoryOutbox)`, а `/dialog/{token}/outbox` дренирует только `MemoryOutbox` → консоль получит пусто. Стоит дренировать `box.fallback`, если это TelegramOutbox. - Тексты ГРЛС — пересказ для прототипа, требуют сверки с действующими инструкциями (празозин в инструкции — антигипертензивное, при кошмарах назначается вне показаний).
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-03 14:38:55 +03:00
Eleboba added the P0size/0.5backendfeature labels 2026-10-03 14:38:55 +03:00
Eleboba changed title from [backend] Адаптеры: mis_mock, esia_mock, grls (выдержки), notify to [backend][B] Адаптеры: mis_mock, esia_mock, ГРЛС-выдержки, notify, outbox 2026-10-03 15:16:33 +03:00
Eleboba added size/1lane/Bstage/veterans and removed size/0.5 labels 2026-10-03 15:16:35 +03:00
Eleboba self-assigned this 2026-10-04 12:23:06 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#14