WIP-CHECKPOINT[auth-refactor]: 固化工程师崩溃前部分成果 + 同树其他未提交WIP(仅源码,不含密钥/二进制)-- 待重激活工程师续作
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
"""add knowledge iteration tables: conversation_annotations and knowledge_suggestions
|
||||
|
||||
Revision ID: 043_knowledge_iteration
|
||||
Revises: 042_add_employee_avatar_updated_at
|
||||
Create Date: 2026-07-06
|
||||
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = '043_knowledge_iteration'
|
||||
down_revision: Union[str, None] = '042_add_employee_avatar_updated_at'
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# --------------------------------------------------------------------------
|
||||
# 1. 创建会话标注表 conversation_annotations
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'conversation_annotations',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('conversation_id', sa.String(36), nullable=False, index=True),
|
||||
sa.Column('agent_id', sa.String(36), nullable=False),
|
||||
sa.Column('message_id', sa.String(36), nullable=False),
|
||||
sa.Column('feedback', sa.String(20), nullable=False),
|
||||
sa.Column('comment', sa.Text(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_annotation_conversation', 'conversation_annotations', ['conversation_id'])
|
||||
op.create_index('idx_annotation_message', 'conversation_annotations', ['message_id'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 2. 创建知识库优化建议表 knowledge_suggestions
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'knowledge_suggestions',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('suggestion_type', sa.String(20), nullable=False, server_default='new_faq'),
|
||||
sa.Column('status', sa.String(20), nullable=False, server_default='pending', index=True),
|
||||
sa.Column('title', sa.String(256), nullable=False),
|
||||
sa.Column('content', sa.Text(), nullable=False),
|
||||
sa.Column('category', sa.String(64), nullable=False, server_default='其他'),
|
||||
sa.Column('tags', sa.JSON(), nullable=False, server_default='[]'),
|
||||
sa.Column('source_type', sa.String(30), nullable=False),
|
||||
sa.Column('source_data', sa.JSON(), nullable=True),
|
||||
sa.Column('reason', sa.Text(), nullable=True),
|
||||
sa.Column('reject_reason', sa.Text(), nullable=True),
|
||||
sa.Column('reviewer_id', sa.String(36), nullable=True),
|
||||
sa.Column('reviewed_at', sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_suggestion_status', 'knowledge_suggestions', ['status'])
|
||||
op.create_index('idx_suggestion_type', 'knowledge_suggestions', ['suggestion_type'])
|
||||
op.create_index('idx_suggestion_created', 'knowledge_suggestions', ['created_at'])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_table('knowledge_suggestions')
|
||||
op.drop_table('conversation_annotations')
|
||||
@@ -0,0 +1,174 @@
|
||||
"""add automation tables (阶段5 自动化闭环): auto_sessions / auto_actions /
|
||||
auto_approval_tickets / auto_scenario_configs / auto_rule_versions /
|
||||
auto_action_logs / auto_mapping_cache
|
||||
|
||||
Revision ID: 044_automation
|
||||
Revises: 043_knowledge_iteration
|
||||
Create Date: 2026-07-10
|
||||
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = '044_automation'
|
||||
down_revision: Union[str, None] = '043_knowledge_iteration'
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# --------------------------------------------------------------------------
|
||||
# 1. 自动化处置会话 auto_sessions
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_sessions',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('conversation_id', sa.String(36), nullable=True, index=True),
|
||||
sa.Column('employee_id', sa.String(64), nullable=False, index=True),
|
||||
sa.Column('agent_id', sa.String(64), nullable=True, index=True),
|
||||
sa.Column('scenario_key', sa.String(64), nullable=True, index=True),
|
||||
sa.Column('status', sa.String(20), nullable=False, server_default='created', index=True),
|
||||
sa.Column('mode', sa.String(20), nullable=False, server_default='real_exec'),
|
||||
sa.Column('confidence', sa.Float(), nullable=False, server_default='0.0'),
|
||||
sa.Column('intent', sa.JSON(), nullable=True),
|
||||
sa.Column('current_action_id', sa.String(36), nullable=True),
|
||||
sa.Column('title', sa.String(256), nullable=False, server_default=''),
|
||||
sa.Column('auto_close_at', sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column('resolved_at', sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column('closed_by', sa.String(64), nullable=True),
|
||||
sa.Column('meta', sa.JSON(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_session_employee', 'auto_sessions', ['employee_id'])
|
||||
op.create_index('idx_auto_session_status', 'auto_sessions', ['status'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 2. 处置动作 auto_actions
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_actions',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('session_id', sa.String(36), nullable=False, index=True),
|
||||
sa.Column('action_index', sa.Integer(), nullable=False, server_default='0'),
|
||||
sa.Column('action_type', sa.String(64), nullable=False, server_default=''),
|
||||
sa.Column('adapter', sa.String(32), nullable=False, server_default=''),
|
||||
sa.Column('risk_level', sa.String(16), nullable=False, server_default='read'),
|
||||
sa.Column('title', sa.String(256), nullable=False, server_default=''),
|
||||
sa.Column('description', sa.Text(), nullable=False, server_default=''),
|
||||
sa.Column('status', sa.String(20), nullable=False, server_default='pending', index=True),
|
||||
sa.Column('payload', sa.JSON(), nullable=True),
|
||||
sa.Column('result', sa.JSON(), nullable=True),
|
||||
sa.Column('error', sa.Text(), nullable=True),
|
||||
sa.Column('approved_by', sa.String(64), nullable=True),
|
||||
sa.Column('approved_at', sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_action_session', 'auto_actions', ['session_id'])
|
||||
op.create_index('idx_auto_action_status', 'auto_actions', ['status'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 3. 审批单 auto_approval_tickets
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_approval_tickets',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('action_id', sa.String(36), nullable=False, index=True),
|
||||
sa.Column('session_id', sa.String(36), nullable=False, index=True),
|
||||
sa.Column('approver_id', sa.String(64), nullable=True),
|
||||
sa.Column('channel', sa.String(16), nullable=False, server_default='agent'),
|
||||
sa.Column('status', sa.String(20), nullable=False, server_default='pending', index=True),
|
||||
sa.Column('reason', sa.Text(), nullable=True),
|
||||
sa.Column('decision_note', sa.Text(), nullable=True),
|
||||
sa.Column('decided_at', sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_approval_action', 'auto_approval_tickets', ['action_id'])
|
||||
op.create_index('idx_auto_approval_session', 'auto_approval_tickets', ['session_id'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 4. 场景配置 auto_scenario_configs
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_scenario_configs',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('scenario_key', sa.String(64), nullable=False, unique=True, index=True),
|
||||
sa.Column('name', sa.String(128), nullable=False, server_default=''),
|
||||
sa.Column('description', sa.Text(), nullable=False, server_default=''),
|
||||
sa.Column('enabled', sa.Boolean(), nullable=False, server_default=sa.true()),
|
||||
sa.Column('trigger_conditions', sa.JSON(), nullable=True),
|
||||
sa.Column('actions', sa.JSON(), nullable=True),
|
||||
sa.Column('approval_strategy', sa.JSON(), nullable=True),
|
||||
sa.Column('current_version_id', sa.String(36), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_scenario_key', 'auto_scenario_configs', ['scenario_key'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 5. 规则版本 auto_rule_versions
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_rule_versions',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('scenario_key', sa.String(64), nullable=False, index=True),
|
||||
sa.Column('version', sa.Integer(), nullable=False, server_default='1'),
|
||||
sa.Column('content', sa.JSON(), nullable=True),
|
||||
sa.Column('status', sa.String(20), nullable=False, server_default='draft', index=True),
|
||||
sa.Column('canary_percent', sa.Integer(), nullable=False, server_default='100'),
|
||||
sa.Column('created_by', sa.String(64), nullable=True),
|
||||
sa.Column('remark', sa.Text(), nullable=False, server_default=''),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_rule_version_scenario', 'auto_rule_versions', ['scenario_key'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 6. 外部调用审计日志 auto_action_logs
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_action_logs',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('session_id', sa.String(36), nullable=True, index=True),
|
||||
sa.Column('action_id', sa.String(36), nullable=True, index=True),
|
||||
sa.Column('employee_id', sa.String(64), nullable=True),
|
||||
sa.Column('event', sa.String(128), nullable=False, server_default=''),
|
||||
sa.Column('direction', sa.String(8), nullable=False, server_default='out'),
|
||||
sa.Column('system', sa.String(32), nullable=False, server_default='internal'),
|
||||
sa.Column('request', sa.JSON(), nullable=True),
|
||||
sa.Column('response', sa.JSON(), nullable=True),
|
||||
sa.Column('status', sa.String(32), nullable=False, server_default=''),
|
||||
sa.Column('latency_ms', sa.Integer(), nullable=True),
|
||||
sa.Column('error', sa.Text(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_action_log_session', 'auto_action_logs', ['session_id'])
|
||||
op.create_index('idx_auto_action_log_action', 'auto_action_logs', ['action_id'])
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 7. 映射缓存 auto_mapping_cache
|
||||
# --------------------------------------------------------------------------
|
||||
op.create_table(
|
||||
'auto_mapping_cache',
|
||||
sa.Column('id', sa.String(36), primary_key=True),
|
||||
sa.Column('employee_id', sa.String(64), nullable=False, index=True),
|
||||
sa.Column('source', sa.String(32), nullable=False, server_default='lianruan'),
|
||||
sa.Column('mapped_data', sa.JSON(), nullable=True),
|
||||
sa.Column('expires_at', sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
op.create_index('idx_auto_mapping_employee', 'auto_mapping_cache', ['employee_id'])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_table('auto_mapping_cache')
|
||||
op.drop_table('auto_action_logs')
|
||||
op.drop_table('auto_rule_versions')
|
||||
op.drop_table('auto_scenario_configs')
|
||||
op.drop_table('auto_approval_tickets')
|
||||
op.drop_table('auto_actions')
|
||||
op.drop_table('auto_sessions')
|
||||
Reference in New Issue
Block a user