LLM-саммари динамики для врача только по структурированным данным карточки (SPEC §7 п.4). build_structured(card) детерминированно агрегирует PatientCard в числа и флаги без текста пациента и без имени. build_summary(card) отдаёт это в gateway.summarize_for_doctor и возвращает 3–5 строк. Есть запасной шаблон (config/texts/summary.yaml), правило «безопасность первой строкой» и кэш под поллинг дашборда.
uv run pytest -q tests/test_llm_summary.py
uv run python -c "import asyncio; from app.api import fixtures; from app.llm.summary import build_summary; print(asyncio.run(build_summary(fixtures.andrey_card())))"
Для lane B (#12): card.summary = await build_summary(card).
Чек-лист
rebase на origin/dev
make lint + make test зелёные
лог в issue (### YYYY-MM-DD)
нет ПДн в логах, нет реальных данных, нет секретов
общие файлы не тронуты
## Что меняется
LLM-саммари динамики для врача только по структурированным данным карточки (SPEC §7 п.4). `build_structured(card)` детерминированно агрегирует `PatientCard` в числа и флаги без текста пациента и без имени. `build_summary(card)` отдаёт это в `gateway.summarize_for_doctor` и возвращает 3–5 строк. Есть запасной шаблон (`config/texts/summary.yaml`), правило «безопасность первой строкой» и кэш под поллинг дашборда.
Closes #19
## Зона
A
## Как проверить
```
uv run pytest -q tests/test_llm_summary.py
uv run python -c "import asyncio; from app.api import fixtures; from app.llm.summary import build_summary; print(asyncio.run(build_summary(fixtures.andrey_card())))"
```
Для lane B (#12): `card.summary = await build_summary(card)`.
## Чек-лист
- [x] rebase на origin/dev
- [x] make lint + make test зелёные
- [x] лог в issue (### YYYY-MM-DD)
- [x] нет ПДн в логах, нет реальных данных, нет секретов
- [x] общие файлы не тронуты
build_structured() aggregates a PatientCard into scores, flags and
adherence (no patient text, no names); build_summary() sends it through
the LLM gateway, falls back to a config-driven template, keeps an open
acute alert first and caches per (token, provider, data hash).
Refs #19
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
LLM-саммари динамики для врача только по структурированным данным карточки (SPEC §7 п.4).
build_structured(card)детерминированно агрегируетPatientCardв числа и флаги без текста пациента и без имени.build_summary(card)отдаёт это вgateway.summarize_for_doctorи возвращает 3–5 строк. Есть запасной шаблон (config/texts/summary.yaml), правило «безопасность первой строкой» и кэш под поллинг дашборда.Closes #19
Зона
A
Как проверить
Для lane B (#12):
card.summary = await build_summary(card).Чек-лист