1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| from typing import Callable
class ConversationStateMachine: """对话状态机""" def __init__(self, state_manager: ThreadSafeStateManager): self.state_manager = state_manager self.state_handlers = {} self.transitions = {} self._setup_transitions() self._setup_handlers() def _setup_transitions(self): """设置状态转换规则""" self.transitions = { "initial": { "订单查询": "waiting_order_id", "退款申请": "waiting_refund_info" }, "waiting_order_id": { "提供订单号": "processing_order" }, "processing_order": { "查询完成": "completed" } } def _setup_handlers(self): """设置状态处理器""" def initial_handler(user_id: str, message: str, context: dict) -> str: if "订单" in message or "查询" in message: self.state_manager.update_user_state(user_id, "waiting_order_id", {"request_type": "order_query"}) return "请提供您的订单号(格式如:ORDER123456)" elif "退款" in message: self.state_manager.update_user_state(user_id, "waiting_refund_info", {"request_type": "refund"}) return "请提供您要退款的订单号" return "您好!请问有什么可以帮助您的吗?" def waiting_order_id_handler(user_id: str, message: str, context: dict) -> str: import re order_pattern = r'ORDER\d+' match = re.search(order_pattern, message.upper()) if match: order_id = match.group() self.state_manager.update_user_state(user_id, "processing_order", {"order_id": order_id}) return f"正在为您查询订单 {order_id} 的详细信息..." return "请提供正确的订单号格式(如:ORDER123456)" def processing_order_handler(user_id: str, message: str, context: dict) -> str: order_id = context.get("order_id", "未知") self.state_manager.update_user_state(user_id, "completed", {"result": f"订单{order_id}查询成功"}) return f"订单 {order_id} 查询完成!状态:已发货。还有其他需要帮助的吗?" self.state_handlers = { "initial": initial_handler, "waiting_order_id": waiting_order_id_handler, "processing_order": processing_order_handler } def process_message(self, user_id: str, message: str) -> str: """处理用户消息""" user_state = self.state_manager.get_user_state(user_id) current_step = user_state.current_step context = user_state.context if current_step in self.state_handlers: response = self.state_handlers[current_step](user_id, message, context) else: response = "抱歉,系统出现异常,请重新开始对话。" self.state_manager.update_user_state(user_id, "initial", {}) return response
|