""" Conversation Scripts Handler Manages predefined scripts for standard conversation scenarios """ import os import pandas as pd from typing import Dict, Optional class ConversationScripts: """Handler for conversation scripts and standard responses""" def __init__(self, scripts_file: Optional[str] = None): self.scripts = {} self.scripts_file = scripts_file # Default built-in scripts (fallback) self._load_default_scripts() # Load from file if provided if scripts_file and os.path.exists(scripts_file): self._load_scripts_from_file(scripts_file) print(f"✅ Loaded conversation scripts from {scripts_file}") else: print("⚠️ Using default built-in scripts") def _load_default_scripts(self): """Load default conversation scripts""" self.scripts = { "greeting": """Xin chào! Em là Trợ lý ảo Viettelpay Pro sẵn sàng hỗ trợ Anh/chị! Hiện tại, Trợ lý ảo đang trong giai đoạn thử nghiệm hỗ trợ nghiệp vụ cước viễn thông, thẻ cào và thẻ game với các nội dung sau: - Hướng dẫn sử dụng - Chính sách phí bán hàng - Tìm hiểu quy định hủy giao dịch - Hướng dẫn xử lý một số lỗi thường gặp. Anh/Chị vui lòng bấm vào từng chủ đề để xem chi tiết. Nếu thông tin chưa đáp ứng nhu cầu, Anh/Chị hãy đặt lại câu hỏi để em tiếp tục hỗ trợ ạ!""", "out_of_scope": """Cảm ơn Anh/chị đã đặt câu hỏi! Trợ lý ảo Viettelpay Pro đang thử nghiệm và cập nhật kiến thức nghiệp vụ để hỗ trợ Anh/chị tốt hơn. Vì vậy, rất tiếc nhu cầu hiện tại của Anh/chị nằm ngoài khả năng hỗ trợ của Trợ lý ảo. Để được hỗ trợ chính xác và đầy đủ hơn, Anh/chị vui lòng gửi yêu cầu hỗ trợ tại đây""", "human_request_attempt_1": """Anh/Chị vui lòng chia sẻ thêm nội dung cần hỗ trợ, Em rất mong được giải đáp trực tiếp để tiết kiệm thời gian của Anh/Chị ạ!""", "human_request_attempt_2": """Rất tiếc! Hiện tại hệ thống chưa có Tư vấn viên hỗ trợ trực tuyến. Tuy nhiên, Anh/chị vẫn có thể yêu cầu hỗ trợ được trợ giúp qua các hình thức sau: 📌 1. Đặt câu hỏi ngay tại đây, Trợ lý ảo ViettelPay Pro luôn sẵn sàng hỗ trợ Anh/chị trong phạm vi nghiệp vụ thử nghiệm (nghiệp vụ cước viễn thông, thẻ cào, thẻ game): ✅ Hướng dẫn sử dụng ✅ Chính sách phí bán hàng ✅ Tìm hiểu về quy định hủy giao dịch ✅ Hướng dẫn xử lý một số lỗi thường gặp. 📌 2. Tìm hiểu thông tin nghiệp vụ tại mục: 📚 Hướng dẫn, hỗ trợ: Các video hướng dẫn nghiệp vụ 💡Thông báo: Các tin tức nghiệp vụ và tin nâng cấp hệ thống/tin sự cố. 📌 3. Gửi yêu cầu hỗ trợ tại đây Hoặc gọi Tổng đài 1789 nhánh 5 trong trường hợp khẩn cấp""", "confirmation_check": """Anh/Chị có thắc mắc thêm vấn đề nào liên quan đến nội dung em vừa cung cấp không ạ?""", "closing": """Hy vọng những thông tin vừa rồi đã đáp ứng nhu cầu của Anh/chị. Nếu cần hỗ trợ thêm, Anh/Chị hãy đặt câu hỏi để em tiếp tục hỗ trợ ạ! 🌟 Chúc Anh/chị một ngày thật vui và thành công!""", "ask_for_clarity": """Em chưa hiểu rõ yêu cầu của Anh/chị. Anh/chị có thể chia sẻ cụ thể hơn được không ạ?""", "empathy_error": """Em hiểu Anh/chị đang gặp khó khăn với lỗi này. Để hỗ trợ Anh/chị tốt nhất, em sẽ tìm hiểu và đưa ra hướng giải quyết cụ thể.""", } def _load_scripts_from_file(self, file_path: str): """Load scripts from CSV file (kich_ban.csv format)""" try: df = pd.read_csv(file_path) # Map CSV scenarios to script keys scenario_mapping = { "Chào hỏi": "greeting", "Trao đổi thông tin chính": "out_of_scope", # First occurrence "Trước khi kết thúc phiên": "confirmation_check", "Kết thúc": "closing", } for _, row in df.iterrows(): scenario_type = row.get("Loại kịch bản", "") situation = row.get("Tình huống", "") script = row.get("Kịch bản chốt", "") # Handle specific mappings if scenario_type == "Chào hỏi": self.scripts["greeting"] = script elif scenario_type == "Trao đổi thông tin chính": if "ngoài nghiệp vụ" in situation: self.scripts["out_of_scope"] = script elif "gặp tư vấn viên" in situation: if "Lần 1" in script: self.scripts["human_request_attempt_1"] = ( script.split("Lần 1:")[1].split("Lần 2:")[0].strip() ) if "Lần 2" in script: self.scripts["human_request_attempt_2"] = script.split( "Lần 2:" )[1].strip() elif "không đủ ý" in situation: self.scripts["ask_for_clarity"] = ( "Em chưa hiểu rõ yêu cầu của Anh/chị. Anh/chị có thể chia sẻ cụ thể hơn được không ạ?" ) elif "lỗi" in situation: self.scripts["empathy_error"] = ( "Em hiểu Anh/chị đang gặp khó khăn với lỗi này." ) elif scenario_type == "Trước khi kết thúc phiên": self.scripts["confirmation_check"] = script elif scenario_type == "Kết thúc": self.scripts["closing"] = script except Exception as e: print(f"⚠️ Error loading scripts from file: {e}") print("Using default scripts instead") def get_script(self, script_type: str) -> Optional[str]: """Get script by type""" return self.scripts.get(script_type) def has_script(self, script_type: str) -> bool: """Check if script exists""" return script_type in self.scripts def get_all_script_types(self) -> list: """Get all available script types""" return list(self.scripts.keys()) def add_script(self, script_type: str, script_content: str): """Add or update a script""" self.scripts[script_type] = script_content def get_stats(self) -> dict: """Get statistics about loaded scripts""" return { "total_scripts": len(self.scripts), "script_types": list(self.scripts.keys()), "source": "file" if self.scripts_file else "default", } # Usage example if __name__ == "__main__": # Test with default scripts scripts = ConversationScripts() print("📊 Scripts Stats:", scripts.get_stats()) # Test specific scripts greeting = scripts.get_script("greeting") print(f"\n👋 Greeting Script:\n{greeting}") # Test loading from file (if available) try: scripts_with_file = ConversationScripts( "./viettelpay_docs/processed/kich_ban.csv" ) print(f"\n📊 File-based Scripts Stats: {scripts_with_file.get_stats()}") except Exception as e: print(f"File loading test failed: {e}")