# ============================================================================= # 企微IT智能服务台 — 阶段5 自动化闭环 常量定义 # ============================================================================= # 说明:集中定义自动化引擎的 WS 事件名、执行模式、风险等级、会话/动作状态、 # 映射源优先级、以及自动化专用错误码。 # # 约定说明(重要,与架构设计的一致性取舍): # 1. 统一响应格式沿用项目既有 {code: int, data: {}, message: str}, # 因此架构文档中的错误码段 AUT-001~AUT-0xx 在此以数值形式落地为 4001~40xx, # WS 的 automation.error 事件同样携带该数值 code。 # 2. WS 事件名统一以 automation. 为前缀(架构约定)。 # ============================================================================= # -------------------------------------------------------------------------- # WebSocket 事件名(前缀 automation.) # -------------------------------------------------------------------------- AUTOMATION_WS_PROGRESS = "automation.progress" # 进度推送(步骤开始/完成) AUTOMATION_WS_ACTION_REQUIRED = "automation.action_required" # 需要坐席审批 / 员工二次确认 AUTOMATION_WS_RESOLVED = "automation.resolved" # 处置成功,等待/已关单 AUTOMATION_WS_TAKEOVER = "automation.takeover" # 转人工接管 AUTOMATION_WS_ERROR = "automation.error" # 异常(转人工 + 通知) AUTOMATION_WS_EVENTS = { "progress": AUTOMATION_WS_PROGRESS, "action_required": AUTOMATION_WS_ACTION_REQUIRED, "resolved": AUTOMATION_WS_RESOLVED, "takeover": AUTOMATION_WS_TAKEOVER, "error": AUTOMATION_WS_ERROR, } # -------------------------------------------------------------------------- # 执行模式(双模式执行引擎) # -------------------------------------------------------------------------- AUTOMATION_MODE_PLAN_ONLY = "plan_only" # 仅生成处置方案,不真正执行外部动作 AUTOMATION_MODE_REAL_EXEC = "real_exec" # 真正执行外部系统动作 # -------------------------------------------------------------------------- # 风险等级 # -------------------------------------------------------------------------- AUTOMATION_RISK_READ = "read" # 只读:默认可自动执行 AUTOMATION_RISK_LOW = "low" # 低风险写操作:默认可自动执行 AUTOMATION_RISK_HIGH = "high" # 高危:必须审批或员工 H5 二次确认 # 默认可自动执行的风险等级集合(其余必须走审批/确认) AUTOMATION_AUTO_EXECUTABLE_RISKS = {AUTOMATION_RISK_READ, AUTOMATION_RISK_LOW} # -------------------------------------------------------------------------- # 会话状态机 # -------------------------------------------------------------------------- AUTOMATION_SESSION_CREATED = "created" AUTOMATION_SESSION_RUNNING = "running" AUTOMATION_SESSION_PAUSED = "paused" # 等待审批/确认时挂起 AUTOMATION_SESSION_RESOLVED = "resolved" # 处置成功,等待静默关单/员工确认 AUTOMATION_SESSION_CLOSED = "closed" # 已关单 AUTOMATION_SESSION_HANDOFF = "handoff" # 已转人工 AUTOMATION_SESSION_ERROR = "error" # 终态集合(不再流转) AUTOMATION_SESSION_TERMINAL_STATES = { AUTOMATION_SESSION_CLOSED, AUTOMATION_SESSION_HANDOFF, AUTOMATION_SESSION_ERROR, } # -------------------------------------------------------------------------- # 动作状态机 # -------------------------------------------------------------------------- AUTOMATION_ACTION_PENDING = "pending" AUTOMATION_ACTION_RUNNING = "running" AUTOMATION_ACTION_SUCCESS = "success" AUTOMATION_ACTION_FAILED = "failed" AUTOMATION_ACTION_SKIPPED = "skipped" AUTOMATION_ACTION_AWAIT_APPROVAL = "await_approval" AUTOMATION_ACTION_APPROVED = "approved" AUTOMATION_ACTION_REJECTED = "rejected" # -------------------------------------------------------------------------- # 映射源与优先级(联软主,eHR 兜底;aTrust 密钥未到后置) # -------------------------------------------------------------------------- MAPPING_SOURCES = ["lianruan", "atrust", "ehr"] MAPPING_SOURCE_PRIORITY = { "lianruan": 0, # 联软终端安全管理(主,支持 strusername 直接映射) "atrust": 1, # 零信任 / aTrust(密钥未到,预留占位) "ehr": 2, # 北森 EHR 静态映射(兜底) } # 静默关单 Redis TTL(秒):处置成功后 10 分钟内员工无异议则自动关单 AUTOMATION_SILENT_CLOSE_TTL = 600 # -------------------------------------------------------------------------- # 自动化错误码(数值,沿用项目 {code:int} 约定) # 架构文档 AUT-001~AUT-0xx → 4001~40xx # -------------------------------------------------------------------------- class AutomationErrorCode: SCENARIO_NOT_FOUND = 4001 # 场景未启用或未配置 INTENT_FAILED = 4002 # 意图识别失败 EXTERNAL_CALL_FAILED = 4003 # 外部系统调用失败 ACTION_REJECTED = 4004 # 动作被拒绝(风险/需审批未通过) SESSION_NOT_FOUND = 4005 # 自动化会话不存在 APPROVAL_REJECTED = 4006 # 审批被驳回 TIMEOUT_HANDOFF = 4007 # 超时自动接管 EMPLOYEE_DECLINED = 4008 # 员工拒绝/未二次确认 CONFIG_ERROR = 4009 # 配置错误(阈值/场景/映射) MAPPING_FAILED = 4010 # 终端/员工映射失败 INVALID_MODE = 4011 # 非法执行模式 ROLLBACK_FAILED = 4012 # 回滚补偿失败 AUTOMATION_ERROR_MESSAGES = { AutomationErrorCode.SCENARIO_NOT_FOUND: "场景未启用或未配置", AutomationErrorCode.INTENT_FAILED: "意图识别失败", AutomationErrorCode.EXTERNAL_CALL_FAILED: "外部系统调用失败", AutomationErrorCode.ACTION_REJECTED: "动作被拒绝(需审批或高危)", AutomationErrorCode.SESSION_NOT_FOUND: "自动化会话不存在", AutomationErrorCode.APPROVAL_REJECTED: "审批被驳回", AutomationErrorCode.TIMEOUT_HANDOFF: "处置超时,已自动转人工", AutomationErrorCode.EMPLOYEE_DECLINED: "员工未确认或已拒绝", AutomationErrorCode.CONFIG_ERROR: "自动化配置错误", AutomationErrorCode.MAPPING_FAILED: "终端/员工映射失败", AutomationErrorCode.INVALID_MODE: "非法的执行模式", AutomationErrorCode.ROLLBACK_FAILED: "回滚补偿失败", } def automation_error_message(code: int) -> str: """根据自动化错误码返回默认中文消息。""" return AUTOMATION_ERROR_MESSAGES.get(code, "自动化处理异常") # =========================================================================== # 复杂场景重构第一阶段 — 新增常量 # =========================================================================== # -------------------------------------------------------------------------- # 全局意图常量 # -------------------------------------------------------------------------- GLOBAL_INTENT_PAUSE = "pause" GLOBAL_INTENT_RESUME_TASK = "resume_task" GLOBAL_INTENT_CORRECT = "correct" GLOBAL_INTENT_SUPPLEMENT = "supplement" GLOBAL_INTENT_NONE = None # -------------------------------------------------------------------------- # 新增 WS 事件名(暂停/恢复/超时关闭/信息更正/信息补充) # -------------------------------------------------------------------------- AUTOMATION_WS_PAUSED = "automation.paused" AUTOMATION_WS_RESUMED = "automation.resumed" AUTOMATION_WS_TIMEOUT_CLOSED = "automation.timeout_closed" AUTOMATION_WS_INFO_CORRECTED = "automation.info_corrected" AUTOMATION_WS_INFO_SUPPLEMENTED = "automation.info_supplemented" # 扩展 WS 事件集合 AUTOMATION_WS_EVENTS.update({ "paused": AUTOMATION_WS_PAUSED, "resumed": AUTOMATION_WS_RESUMED, "timeout_closed": AUTOMATION_WS_TIMEOUT_CLOSED, "info_corrected": AUTOMATION_WS_INFO_CORRECTED, "info_supplemented": AUTOMATION_WS_INFO_SUPPLEMENTED, }) # -------------------------------------------------------------------------- # 超时配置 # -------------------------------------------------------------------------- PAUSE_TIMEOUT_HOURS = 24 PAUSE_TIMEOUT_SECONDS = 24 * 3600 RESUME_POINT_REDIS_TTL = 25 * 3600 # 恢复点 Redis TTL(25小时,比超时多1小时兜底) # -------------------------------------------------------------------------- # Redis key 模板 # -------------------------------------------------------------------------- REDIS_KEY_RESUME_POINT = "auto:resume_point:{session_id}" REDIS_KEY_PAUSED_SESSIONS = "auto:paused_sessions:{employee_id}" # -------------------------------------------------------------------------- # 全局意图关键词(Dify 不可用时兜底) # -------------------------------------------------------------------------- GLOBAL_INTENT_KEYWORDS: dict = { "pause": ["先去开会", "等会继续", "先处理别的", "暂停", "我去忙一下", "晚点再说"], "resume_task": ["继续", "继续刚才", "好了继续吧", "接着来", "恢复", "回来了"], "correct": ["刚才说错了", "不是", "应该是", "更正", "说错了"], "supplement": ["再补充一下", "顺便说一下", "还有", "对了补充", "另外"], } # -------------------------------------------------------------------------- # 信息项修饰符 # -------------------------------------------------------------------------- INFO_MODIFIER_FIXED = "固定" # 动作执行后锁定,不可更正 INFO_MODIFIER_INCREMENTAL = "增量" # 补充时追加而非覆盖 INFO_MODIFIER_EXPLICIT = "明确" # 用户明确提供的值 INFO_MODIFIER_IMPLICIT = "隐含" # 从上下文推断的值 INFO_MODIFIER_REPEAT = "复述" # 更正后需向员工发送确认消息 INFO_MODIFIER_REQUIRED = "必需" # 流程阻塞项,未填写时不可继续执行 # -------------------------------------------------------------------------- # 新增错误码 # -------------------------------------------------------------------------- AutomationErrorCode.SESSION_NOT_PAUSABLE = 4013 # 会话不可暂停(终态) AutomationErrorCode.SESSION_NOT_RESUMABLE = 4014 # 会话不可恢复(已关闭/超时) AutomationErrorCode.INFO_ITEM_LOCKED = 4015 # 信息项已锁定 AutomationErrorCode.MULTIPLE_PAUSED_SESSIONS = 4016 # 多个暂停会话需选择 AutomationErrorCode.COMPRESSION_FAILED = 4017 # 上下文压缩失败(已降级截断) AutomationErrorCode.UNDO_LIMIT_EXCEEDED = 4018 # 撤销次数超限 AutomationErrorCode.BATCH_CORRECT_FAILED = 4019 # 批量更正失败(事务回滚) AUTOMATION_ERROR_MESSAGES.update({ AutomationErrorCode.SESSION_NOT_PAUSABLE: "会话不可暂停(终态)", AutomationErrorCode.SESSION_NOT_RESUMABLE: "会话不可恢复(已关闭/超时)", AutomationErrorCode.INFO_ITEM_LOCKED: "信息项已锁定,不可更正", AutomationErrorCode.MULTIPLE_PAUSED_SESSIONS: "存在多个暂停会话,需选择要恢复的任务", AutomationErrorCode.COMPRESSION_FAILED: "上下文压缩失败,已降级为截断处理", AutomationErrorCode.UNDO_LIMIT_EXCEEDED: "撤销次数超限,最多可撤销5次更正", AutomationErrorCode.BATCH_CORRECT_FAILED: "批量更正失败,已回滚全部更正", })