feat(bot): LLM gateway with GigaChat and offline mock providers
CI / ruff · pytest (pull_request) Successful in 23s

Single entry point app/llm/gateway.py: extract_item, extract_checkin,
risk_classify, phrase, summarize_for_doctor. Two-level design:
LLMProvider (transport, GigaChat) and LLMTasks (PromptedTasks over a
provider, or rule-based MockTasks). Shared policy in the gateway:
assert_scrubbed backstop, confidence threshold 0.5, risk failure -> NONE,
forbidden-output filter with config/texts/phrases.yaml fallbacks.

Refs #7

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 15:00:41 +03:00
co-authored by Claude Opus 5.5
parent 84317bcfce
commit 924a51c483
12 changed files with 1419 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
# Шаблоны реплик бота (зона clinical вычитывает формулировки).
# Используются (1) как базовый смысл, который GigaChat перефразирует, (2) как ответ mock-провайдера,
# (3) как запасной ответ, если LLM недоступна или её ответ не прошёл фильтр запретов.
# Подстановки {name} берутся из контекста FSM; отсутствующие подставляются пустой строкой.
# Правила текстов: без диагнозов, без советов по дозам, без обещаний конфиденциальности сверх реальной.
phrases:
default: "Спасибо, что поделились. Я на связи и передам важное вашему врачу."
greeting: "Здравствуйте! Я помогу вам на время лечения: буду напоминать о приёме препарата и спрашивать о самочувствии. Всё важное увижу не только я, но и ваш врач."
med_reminder: "Напоминаю о приёме препарата {drug}. Отметьте, пожалуйста, когда примете."
med_taken_ack: "Отлично, отметил приём. Спасибо!"
checkin_ack: "Спасибо, записал. Хорошего вам дня."
ask_clarify: "Не совсем понял ваш ответ. Можете выбрать вариант кнопкой или описать чуть подробнее?"
support: "Спасибо, что рассказываете, как вы. Такие дни бывают, и хорошо, что вы продолжаете отмечать самочувствие."
side_effect_ack: "Спасибо, что сообщили о самочувствии. Я отмечу это для вашего врача."
nausea_info: "Тошнота часто встречается в первые дни приёма и, по инструкции к препарату, обычно проходит за 1–2 недели. Ваш врач назначил приём после еды. Если станет хуже — сообщите, я передам врачу."
quit_intent: "Понимаю, что сейчас тяжело. Эффект таких препаратов обычно наступает не сразу, а через несколько недель. Пожалуйста, не прекращайте приём самостоятельно — я сообщу вашему врачу, чтобы он с вами связался."
alcohol_info: "Спасибо, что честно рассказали. В инструкции к препарату есть предупреждение о совместном приёме с алкоголем, а алкоголь сам по себе ухудшает сон. Я передам это врачу и предложу записаться на приём пораньше."
sleep_support: "Спасибо, что рассказали про сон. Я отмечу это, и ваш врач увидит, как вы спите."
book_visit_offer: "Предлагаю записаться к врачу пораньше. Выбрать удобное время можно кнопкой ниже."
doctor_notified: "Я передал информацию вашему врачу. Он свяжется с вами."
# Шаблон саммари для врача (только по структурированным данным).
summary:
empty: "Нет данных за период."
labels:
period: "Период"
therapy_day: "День терапии"
drug: "Препарат"
phq9: "PHQ-9"
pcl5: "PCL-5"
gad7: "GAD-7"
mood: "Настроение (0–10)"
adherence: "Приверженность"
missed_doses: "Пропуски приёма"
side_effects: "Побочные эффекты"
sleep: "Сон"
nightmares: "Кошмары"
alcohol: "Алкоголь"
quit_intent: "Намерение прекратить приём"
alerts: "Алерты"