| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 | # Redis对话管理系统 - 无效conversation_id处理改进示例# 这个文件展示了如何改进处理无效对话ID的逻辑from typing import Optional, Tuple, Dictclass ImprovedRedisConversationManager:    """改进版的Redis对话管理器 - 专注于无效ID处理"""        def resolve_conversation_id(self, user_id: str, conversation_id_input: Optional[str],                               continue_conversation: bool) -> Tuple[str, Dict]:        """        智能解析对话ID - 改进版                Args:            user_id: 用户ID            conversation_id_input: 用户请求的对话ID            continue_conversation: 是否继续最近对话                    Returns:            tuple: (conversation_id, status_info)            status_info包含:            - status: "existing" | "new" | "invalid_id_new" | "no_permission"            - message: 状态说明            - requested_id: 原始请求的ID(如果有)        """                # 1. 如果指定了conversation_id,验证后使用        if conversation_id_input:            validation_result = self._validate_conversation_access(conversation_id_input, user_id)                        if validation_result["valid"]:                print(f"[REDIS_CONV] 使用指定对话: {conversation_id_input}")                return conversation_id_input, {                    "status": "existing",                    "message": "继续已有对话"                }            else:                # 根据不同的无效原因返回不同的状态                if validation_result["reason"] == "not_found":                    print(f"[WARN] 对话不存在: {conversation_id_input},创建新对话")                    new_conversation_id = self.create_conversation(user_id)                    return new_conversation_id, {                        "status": "invalid_id_new",                        "message": "您请求的对话不存在或已过期,已为您创建新对话",                        "requested_id": conversation_id_input,                        "reason": "not_found"                    }                elif validation_result["reason"] == "no_permission":                    print(f"[WARN] 无权访问对话: {conversation_id_input},创建新对话")                    new_conversation_id = self.create_conversation(user_id)                    return new_conversation_id, {                        "status": "no_permission",                        "message": "您没有权限访问该对话,已为您创建新对话",                        "requested_id": conversation_id_input,                        "reason": "no_permission"                    }                # 2. 如果要继续最近对话        if continue_conversation:            recent_conversation = self._get_recent_conversation(user_id)            if recent_conversation:                print(f"[REDIS_CONV] 继续最近对话: {recent_conversation}")                return recent_conversation, {                    "status": "existing",                    "message": "继续最近对话"                }                # 3. 创建新对话        new_conversation_id = self.create_conversation(user_id)        print(f"[REDIS_CONV] 创建新对话: {new_conversation_id}")        return new_conversation_id, {            "status": "new",            "message": "创建新对话"        }        def _validate_conversation_access(self, conversation_id: str, user_id: str) -> Dict:        """        验证对话访问权限                Returns:            dict: {                "valid": bool,                "reason": "not_found" | "no_permission" | None            }        """        # 这里是示例实现        # 实际实现需要查询Redis                # 检查对话是否存在        if not self._conversation_exists(conversation_id):            return {"valid": False, "reason": "not_found"}                # 检查用户权限        if not self._user_has_permission(conversation_id, user_id):            return {"valid": False, "reason": "no_permission"}                return {"valid": True, "reason": None}        def _conversation_exists(self, conversation_id: str) -> bool:        """检查对话是否存在"""        # 示例实现 - 根据ID模拟不同场景        if "not_exist" in conversation_id:            return False        return True        def _user_has_permission(self, conversation_id: str, user_id: str) -> bool:        """检查用户是否有权限访问对话"""        # 示例实现 - 根据ID模拟不同场景        if "other_user" in conversation_id:            return False        return True        def _get_recent_conversation(self, user_id: str) -> Optional[str]:        """获取用户最近的对话"""        # 示例实现        return None        def create_conversation(self, user_id: str) -> str:        """创建新对话"""        # 示例实现        import uuid        from datetime import datetime        timestamp = int(datetime.now().timestamp())        return f"conv_{timestamp}_{uuid.uuid4().hex[:8]}"# 使用示例def demo_usage():    """演示如何使用改进版的对话管理器"""        manager = ImprovedRedisConversationManager()        # 场景1:请求不存在的对话    print("=== 场景1:请求不存在的对话 ===")    conv_id, status = manager.resolve_conversation_id(        user_id="user_123",        conversation_id_input="conv_not_exist",        continue_conversation=False    )    print(f"返回的对话ID: {conv_id}")    print(f"状态信息: {status}")    print()        # 场景2:请求无权限的对话    print("=== 场景2:请求无权限的对话 ===")    conv_id, status = manager.resolve_conversation_id(        user_id="user_456",        conversation_id_input="conv_belongs_to_other_user",        continue_conversation=False    )    print(f"返回的对话ID: {conv_id}")    print(f"状态信息: {status}")    print()        # 场景3:创建新对话    print("=== 场景3:创建新对话 ===")    conv_id, status = manager.resolve_conversation_id(        user_id="user_789",        conversation_id_input=None,        continue_conversation=False    )    print(f"返回的对话ID: {conv_id}")    print(f"状态信息: {status}")# API响应增强示例def enhanced_ask_agent_response(conversation_status: Dict) -> Dict:    """展示如何在API响应中包含对话状态信息"""        # 基础响应    response = {        "success": True,        "code": 200,        "message": "操作成功",        "data": {            "response": "这是AI的回答...",            "type": "DATABASE",            "conversation_id": "conv_1234567890_abc123",            "user_id": "user_123"        }    }        # 添加对话状态信息    response["data"].update({        "conversation_status": conversation_status["status"],        "conversation_message": conversation_status["message"],        "requested_conversation_id": conversation_status.get("requested_id")    })        return response# 前端处理示例(JavaScript风格的Python代码)def frontend_handling_example():    """展示前端如何处理不同的对话状态"""        # 模拟API响应    api_responses = [        {            "data": {                "conversation_status": "invalid_id_new",                "conversation_message": "您请求的对话不存在或已过期,已为您创建新对话",                "requested_conversation_id": "conv_old_123"            }        },        {            "data": {                "conversation_status": "no_permission",                "conversation_message": "您没有权限访问该对话,已为您创建新对话",                "requested_conversation_id": "conv_other_user"            }        },        {            "data": {                "conversation_status": "existing",                "conversation_message": "继续已有对话"            }        }    ]        # 处理不同状态    for response in api_responses:        status = response["data"]["conversation_status"]        message = response["data"]["conversation_message"]                if status == "invalid_id_new":            print(f"⚠️ 警告通知: {message}")            print(f"  原请求ID: {response['data'].get('requested_conversation_id')}")            print("  [更新本地conversation_id]")                    elif status == "no_permission":            print(f"🚫 权限通知: {message}")            print(f"  原请求ID: {response['data'].get('requested_conversation_id')}")            print("  [清除本地无效的conversation_id]")                    elif status == "existing":            print(f"✅ 成功: {message}")                    print()if __name__ == "__main__":    # 运行演示    demo_usage()    print("\n" + "="*50 + "\n")        # 展示API响应增强    print("=== API响应增强示例 ===")    status_info = {        "status": "invalid_id_new",        "message": "您请求的对话不存在或已过期,已为您创建新对话",        "requested_id": "conv_old_123"    }    enhanced_response = enhanced_ask_agent_response(status_info)    import json    print(json.dumps(enhanced_response, indent=2, ensure_ascii=False))        print("\n" + "="*50 + "\n")        # 展示前端处理    print("=== 前端处理示例 ===")    frontend_handling_example() 
 |