[backend][B] Адаптеры: mis_mock, esia_mock, ГРЛС-выдержки, notify, outbox #14
Notifications
Due Date
No due date set.
Blocks
Depends on
#12 [backend][B] API этапа 1: реальная реализация вместо фикстур
MedITron/PTSRaiAgent
Reference: MedITron/PTSRaiAgent#14
Reference in New Issue
Block a user
Описание
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.Зона и владение файлами
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.pyArxip222): одноразовый код подключения через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.Заметки/решения
/start→ bind, затем состояниеnewдвижка) — поэтому после погашения код ещё 15 минут возвращает того же пациента, потом отклоняется.prescriptionsнет колонки instructions —MisMockберётschedule["instructions"], если сид её туда положит.tests/test_llm_med_qa.py::test_default_registry_has_no_dataпереписан: теперь явно подставляетNoDrugInfo(тест сам ожидал смену поведения после #14).integrations.outbox—TelegramOutbox(fallback=MemoryOutbox), а/dialog/{token}/outboxдренирует толькоMemoryOutbox→ консоль получит пусто. Стоит дренироватьbox.fallback, если это TelegramOutbox.[backend] Адаптеры: mis_mock, esia_mock, grls (выдержки), notifyto [backend][B] Адаптеры: mis_mock, esia_mock, ГРЛС-выдержки, notify, outbox