feat(bot): dialog engine — scrub → safety → FSM → monitoring, consent, age gate, crisis
CI / ruff · pytest (pull_request) Successful in 25s
CI / ruff · pytest (pull_request) Successful in 25s
- Engine.handle registered via register_engine; lexicon-first safety (no LLM on ACUTE), fixed crisis script once per open crisis, POSSIBLE → C-SSRS screen - FSM registry (@state/@on_enter/@trigger) with auto-loaded flows; core flow: new → consent → age_gate → module onboarding → idle, crisis, consent_revoked - reusable scale session (buttons, extract_item + clarify, item 9 / C-SSRS buttons-only, crisis flags), execution of monitoring dialog actions, texts in config/texts/dialog.yaml Refs #10 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
# Тексты диалогового движка (issue #10): согласие, возраст, меню, кризис, шкалы, отзыв согласия.
|
||||
# СТАТУС: черновик, утверждает психиатр (#8).
|
||||
#
|
||||
# Правила текстов: без диагнозов и названий расстройств; без советов по дозам; не обещать конфиденциальность
|
||||
# сверх реальной; не использовать слова «учёт», «контроль», «психиатрический надзор» (проверяется тестом).
|
||||
# Кризисный скрипт — в crisis.yaml (отправляется дословно, LLM не вызывается).
|
||||
|
||||
status: "черновик, утверждает психиатр (#8)"
|
||||
|
||||
settings:
|
||||
# Повторный C-SSRS по сигналу POSSIBLE не чаще, чем раз в N часов (сигнал всё равно пишется в safety_events).
|
||||
cssrs_cooldown_hours: 24
|
||||
# Сколько последних safety-событий хранить в dialog_state.data["safety_events"].
|
||||
max_safety_events: 50
|
||||
# Флаги шкал (config/scales/*.yaml), при которых сессия шкалы сразу уходит в кризисный путь.
|
||||
crisis_flags: [phq9_item9_positive, cssrs_high]
|
||||
# Шкала-скрининг суицидального риска (POSSIBLE и положительный п.9 PHQ-9 → эта шкала).
|
||||
risk_screen_scale: cssrs_screen
|
||||
|
||||
commands:
|
||||
# Текстовые команды отзыва согласия (сравниваются после приведения к нижнему регистру).
|
||||
revoke: ["/revoke", "отозвать согласие", "отзываю согласие"]
|
||||
|
||||
consent:
|
||||
version: "v1-draft-2026-10-03"
|
||||
text: |-
|
||||
Здравствуйте! Я — цифровой помощник, который сопровождает вас между визитами к врачу: напоминаю о приёме препарата, спрашиваю о самочувствии и передаю важное вашему лечащему врачу.
|
||||
|
||||
Прежде чем начать, мне нужно ваше согласие на обработку персональных данных, в том числе сведений о здоровье (152-ФЗ «О персональных данных», ст. 9 и 10).
|
||||
|
||||
• Что обрабатывается: ваши ответы о самочувствии, сне, приёме препарата и результаты коротких опросников. Перед автоматической обработкой из сообщений удаляются имена, телефоны и другие личные данные.
|
||||
• Кто видит данные: только ваш лечащий врач. Данные хранятся в России и не передаются третьим лицам без вашего согласия, кроме случаев, прямо предусмотренных законом.
|
||||
• Я не ставлю диагнозов и не заменяю врача. Решения о лечении принимает только врач.
|
||||
• Участие добровольное. Отказ никак не влияет на вашу медицинскую помощь.
|
||||
• Отозвать согласие можно в любой момент в один шаг: кнопкой «Отозвать согласие» или командой /revoke.
|
||||
|
||||
Я не служба экстренной помощи. Если вам угрожает опасность прямо сейчас — звоните 112.
|
||||
accept: "Согласен(на)"
|
||||
decline: "Не согласен(на)"
|
||||
refused: |-
|
||||
Понимаю, это ваше право. Без согласия я не обрабатываю и не сохраняю ваши сообщения. Ваше лечение у врача продолжается как обычно.
|
||||
Если передумаете — нажмите кнопку ниже или отправьте /start.
|
||||
reconsider: "Я передумал(а)"
|
||||
code_invalid: "Код подключения не найден или уже использован. Пожалуйста, уточните код у вашего врача и отправьте его ещё раз."
|
||||
|
||||
age_gate:
|
||||
question: "Уточните, пожалуйста: вам уже исполнилось 18 лет? Можно нажать кнопку или написать год рождения (например, 1990)."
|
||||
adult: "Да, мне 18 или больше"
|
||||
minor: "Нет, мне меньше 18"
|
||||
unclear: "Не удалось понять ответ. Нажмите кнопку или напишите год рождения четырьмя цифрами, например 1990."
|
||||
minor_stop: |-
|
||||
Спасибо, что ответили. Этот помощник рассчитан на взрослых, поэтому дальше я не смогу с вами работать и не сохраняю ваши ответы.
|
||||
Если вам тяжело или нужна поддержка — позвоните на Детский телефон доверия 8-800-2000-122 (бесплатно, анонимно, круглосуточно) или расскажите взрослому, которому доверяете: родителям, учителю, школьному психологу.
|
||||
Если есть угроза жизни прямо сейчас — звоните 112.
|
||||
|
||||
idle:
|
||||
welcome: |-
|
||||
Спасибо, всё готово! Я буду на связи каждый день: напомню о препарате и спрошу о самочувствии. Если захотите что-то рассказать — просто напишите или выберите кнопку ниже.
|
||||
menu_prompt: "Чем могу помочь?"
|
||||
buttons:
|
||||
checkin: "Как я сегодня"
|
||||
med_question: "Вопрос о лекарстве"
|
||||
contact_doctor: "Связаться с врачом"
|
||||
revoke: "Отозвать согласие"
|
||||
# Заглушки кнопок меню; ветки ветерана (#36/#37) и med_qa (#15) подменяют их своими триггерами.
|
||||
stub_checkin: "Короткий опрос о самочувствии скоро появится здесь. А пока можно просто написать, как вы себя чувствуете сегодня."
|
||||
stub_med_question: "Напишите ваш вопрос о препарате. Я отвечаю только по официальной инструкции, а если ответа в ней нет — передам вопрос врачу."
|
||||
contact_doctor_ack: "Я отметил вашу просьбу связаться с врачом — она появится в вашей карточке у врача. Если ситуация срочная, звоните 112."
|
||||
visit_stub: "Онлайн-запись появится здесь позже. Пока вы можете записаться к своему врачу через регистратуру клиники."
|
||||
|
||||
revoked:
|
||||
confirm: |-
|
||||
Согласие отозвано. Я больше не буду писать вам и обрабатывать ваши сообщения, а ваши данные помечены к удалению.
|
||||
Если передумаете — отправьте /start. Если вам угрожает опасность — звоните 112.
|
||||
|
||||
crisis:
|
||||
# Повторный острый сигнал в уже открытом кризисе: скрипт второй раз не шлём, только это + ресурсы.
|
||||
repeat: "Я рядом. Ваш врач уже уведомлён. Если вам угрожает опасность прямо сейчас — позвоните:"
|
||||
# Любое другое сообщение, пока кризис открыт (до подтверждения врача).
|
||||
hold: "Я на связи и читаю вас. Ваш врач в курсе и свяжется с вами. Если станет хуже — звоните 112 или на телефон доверия 8-800-2000-122."
|
||||
# Врач подтвердил кризисный алерт (doctor_ack): выходим из кризиса.
|
||||
closed: "Ваш врач получил сообщение и в курсе вашей ситуации. Спасибо, что остаётесь на связи. Если снова станет тяжело — напишите мне в любой момент."
|
||||
|
||||
scale:
|
||||
intro: "Несколько коротких вопросов ({count}). {instruction}"
|
||||
question: "{n}/{total}. {text}"
|
||||
clarify: "Не совсем понял ответ. Выберите, пожалуйста, вариант кнопкой или опишите, как часто это было."
|
||||
buttons_only: "На этот вопрос, пожалуйста, ответьте кнопкой."
|
||||
done: "Спасибо, ответы сохранены. Ваш врач увидит результаты."
|
||||
risk_screen_intro: "Спасибо, что поделились. Мне важно задать несколько коротких вопросов, чтобы лучше понять, как вы сейчас."
|
||||
|
||||
safety_plan:
|
||||
title: "Ваш план безопасности:"
|
||||
# Шаблон Стэнли–Брауна, если план ещё не составлен с врачом на визите.
|
||||
template:
|
||||
- "Мои тревожные сигналы: что я замечаю, когда становится хуже."
|
||||
- "Что помогает мне самому: прогулка, душ, дыхание, любимое дело."
|
||||
- "Люди и места, которые отвлекают: к кому можно пойти."
|
||||
- "Кому позвонить, если тяжело: близкий человек, сослуживец."
|
||||
- "Специалисты: ваш врач, телефон доверия 8-800-2000-122, экстренные службы 112."
|
||||
- "Безопасная среда: оружие и лишние лекарства — на хранение близкому человеку."
|
||||
means_restriction: "Если дома есть оружие или запас лекарств — попросите близкого человека временно хранить их у себя."
|
||||
|
||||
reach_out:
|
||||
silence: "Давно не было вестей от вас. Как вы? Можно ответить одним словом — мне важно знать, что с вами всё в порядке."
|
||||
missed_doses: "Заметил, что несколько приёмов препарата пропущено. Всё ли в порядке? Если что-то мешает — расскажите, я передам врачу."
|
||||
default: "Хотел узнать, как вы. Напишите пару слов, когда будет удобно."
|
||||
|
||||
visit:
|
||||
button: "Записаться к врачу раньше"
|
||||
|
||||
unavailable: |-
|
||||
Сейчас у меня технические неполадки, и я не могу сохранить ваше сообщение. Пожалуйста, напишите чуть позже.
|
||||
Если вам плохо прямо сейчас — звоните 112 или на телефон доверия 8-800-2000-122.
|
||||
Reference in New Issue
Block a user