231e1f2d01
- Роутер возвращает 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>
31 lines
1.0 KiB
Python
31 lines
1.0 KiB
Python
"""add escalation_reason to messages (Спринт 6b блок E)
|
|
|
|
Revision ID: h4b52e9dc0f83
|
|
Revises: g3a71d4fc285
|
|
Create Date: 2026-04-26 10:00:00.000000
|
|
|
|
Причина передачи оператору: acute_pain / surgery / angry /
|
|
explicit_request / routing_loop. Хранится на реплике ассистента,
|
|
в которой ветка escalate_human первый раз ответила в треде.
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
revision: str = 'h4b52e9dc0f83'
|
|
down_revision: Union[str, None] = 'g3a71d4fc285'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
with op.batch_alter_table('messages', recreate='always') as batch:
|
|
batch.add_column(sa.Column('escalation_reason', sa.String(50), nullable=True))
|
|
|
|
|
|
def downgrade() -> None:
|
|
with op.batch_alter_table('messages', recreate='always') as batch:
|
|
batch.drop_column('escalation_reason')
|