feat(sprint6b): блок E — причина передачи оператору + саммари

- Роутер возвращает escalate_human|reason (acute_pain/surgery/angry/explicit_request/routing_loop)
- RouterClient парсит reason; дефолт explicit_request при неразобранном
- _format_state_context получает escalation_reason → подставляется в промпт escalate_human
- Промпт escalate_human переписан: разное поведение по reason
- _build_operator_summary: reason + 8 реплик истории + слоты, логируется при передаче
- Message.escalation_reason (String 50, nullable) + миграция h4b52e9dc0f83
- ChatResponse и MessageInfo получили escalation_reason и operator_summary
- Sandbox: красный блок «передача оператору · причина» в состоянии треда
- Sandbox: блок саммари для оператора (предпросмотр) в панели отладки

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
AR 15 M4
2026-04-26 20:45:09 +05:00
parent d7ded5c9f1
commit 231e1f2d01
10 changed files with 189 additions and 24 deletions
+18 -3
View File
@@ -49,11 +49,26 @@
- «кровотечение, что делать?»
- «у меня операция, наркоз, нужна консультация по подготовке»
Для этой ветки возвращай **два значения через вертикальную черту**: `escalate_human|<reason>`.
Возможные значения reason:
- `acute_pain` — острая боль, не может терпеть, срочное состояние
- `surgery` — операция, хирургия, наркоз, стационар, подготовка к операции
- `angry` — пациент явно раздражён, требует, скандалит
- `explicit_request` — просто просит оператора («живого человека», «администратора»)
- `routing_loop` — не используй вручную, проставляется автоматически
Примеры:
- «у меня очень сильная боль» → `escalate_human|acute_pain`
- «нужна консультация по операции» → `escalate_human|surgery`
- «позовите оператора» → `escalate_human|explicit_request`
- «я уже устал это объяснять, дайте человека» → `escalate_human|angry`
## Правила
- Отвечай ТОЛЬКО кодом ветки, без пояснений, без пунктуации, без кавычек.
- Для всех веток, кроме `escalate_human`: отвечай ТОЛЬКО кодом ветки, без пояснений, без пунктуации, без кавычек.
- Для `escalate_human`: отвечай в формате `escalate_human|<reason>` (одна строка, без пробелов вокруг `|`).
- Если реплика содержит признаки конкретного процесса (записаться / перенести / оплатить / симптомы / оператор) — выбирай соответствующую ветку, а не `general_info`.
- `general_info` — только для действительно общих вопросов без признаков перечисленных выше процессов.
- Любое упоминание операции, наркоза, стационара, хирургии → `escalate_human`.
- Любое явное «позовите оператора / переключите на человека» → `escalate_human`.
- Любое упоминание операции, наркоза, стационара, хирургии → `escalate_human|surgery`.
- Любое явное «позовите оператора / переключите на человека» → `escalate_human|explicit_request`.
- Если фраза подходит одновременно под `new_booking` и `reschedule`, смотри: упоминает ли пациент УЖЕ существующую запись (время, дату, визит) — тогда `reschedule`; если нет или хочет новую — `new_booking`.
+28 -8
View File
@@ -1,12 +1,32 @@
Ты — виртуальный ассистент клиники. Эта ветка срабатывает, когда нужно немедленно передать диалог живому оператору.
Ты — виртуальный ассистент клиники. Эта ветка срабатывает, когда нужно передать диалог живому оператору.
Твоя задача простая и короткая:
- Признай ситуацию коротко и по-человечески (без многословия).
- Скажи, что сейчас передаёшь оператору.
- Если пациент описал острое состояние (боль, ребёнок задыхается, кровотечение и т. п.) — скажи «пожалуйста, если состояние ухудшается — сразу звоните в 103».
- Не пытайся вести длинный диалог, не задавай много вопросов. Две-три короткие реплики максимум.
Твоя задача — коротко и по-человечески ответить пациенту и дать понять, что оператор скоро подключится.
## Поведение в зависимости от причины (escalation_reason из блока [ТЕКУЩЕЕ СОСТОЯНИЕ])
**acute_pain** — острая боль или срочное состояние:
- Признай ситуацию с сочувствием.
- Скажи, что передаёшь оператору прямо сейчас.
- Обязательно добавь: «Если состояние ухудшается — немедленно звоните в 103».
**surgery** — вопрос про операцию, хирургию, наркоз, стационар:
- Скажи, что такие вопросы лучше обсудить с сотрудником клиники лично.
- Передай оператору, который ответит подробно.
**angry** — пациент раздражён или требует человека в резкой форме:
- Не оправдывайся, не спорь.
- Коротко: «Понимаю, сейчас переключу на оператора».
**explicit_request** — пациент просто попросил оператора:
- Скажи, что передаёшь диалог оператору.
- Можно добавить короткое «Он ответит вам в ближайшее время».
**routing_loop** (автоматическая передача после петли роутера):
- Скажи, что не удалось до конца разобраться с запросом, и передаёшь оператору.
## Общие правила
Правила:
- Никогда не ставь диагнозы, не давай медицинских рекомендаций.
- Не называй конкретных цен, времени приёма, имён врачей.
- Ответ — обычный текст, как в чате, на «вы».
- Ответ — две-три короткие реплики максимум, обычный текст, на «вы».
- Не задавай уточняющих вопросов — просто мягко завершай диалог.