Explorar o código

修复redis api的bug.

wangxq hai 1 semana
pai
achega
8a2d5e325f
Modificáronse 3 ficheiros con 81 adicións e 3 borrados
  1. 2 2
      app_config.py
  2. 33 1
      citu_app.py
  3. 46 0
      common/redis_conversation_manager.py

+ 2 - 2
app_config.py

@@ -181,8 +181,8 @@ REDIS_DB = 0
 REDIS_PASSWORD = None
 
 # 缓存开关配置
-ENABLE_CONVERSATION_CONTEXT = False      # 是否启用对话上下文
-ENABLE_QUESTION_ANSWER_CACHE = False     # 是否启用问答结果缓存
+ENABLE_CONVERSATION_CONTEXT = True      # 是否启用对话上下文
+ENABLE_QUESTION_ANSWER_CACHE = True     # 是否启用问答结果缓存
 ENABLE_EMBEDDING_CACHE = True           # 是否启用embedding向量缓存
 
 # TTL配置(单位:秒)

+ 33 - 1
citu_app.py

@@ -1563,6 +1563,38 @@ def get_user_conversations(user_id: str):
     try:
         limit = request.args.get('limit', USER_MAX_CONVERSATIONS, type=int)
         conversations = redis_conversation_manager.get_conversations(user_id, limit)
+
+        # 为每个对话动态获取标题(第一条用户消息)
+        for conversation in conversations:
+            conversation_id = conversation['conversation_id']
+            
+            try:
+                # 获取所有消息,然后取第一条用户消息作为标题
+                messages = redis_conversation_manager.get_conversation_messages(conversation_id)
+                
+                if messages and len(messages) > 0:
+                    # 找到第一条用户消息(按时间顺序)
+                    first_user_message = None
+                    for message in messages:
+                        if message.get('role') == 'user':
+                            first_user_message = message
+                            break
+                    
+                    if first_user_message:
+                        title = first_user_message.get('content', '对话').strip()
+                        # 限制标题长度,保持整洁
+                        if len(title) > 50:
+                            conversation['conversation_title'] = title[:47] + "..."
+                        else:
+                            conversation['conversation_title'] = title
+                    else:
+                        conversation['conversation_title'] = "对话"
+                else:
+                    conversation['conversation_title'] = "空对话"
+                    
+            except Exception as e:
+                print(f"[WARNING] 获取对话标题失败 {conversation_id}: {str(e)}")
+                conversation['conversation_title'] = "对话"
         
         return jsonify(success_response(
             response_text="获取用户对话列表成功",
@@ -1606,7 +1638,7 @@ def get_conversation_context(conversation_id: str):
     """获取对话上下文(格式化用于LLM)"""
     try:
         count = request.args.get('count', CONVERSATION_CONTEXT_COUNT, type=int)
-        context = redis_conversation_manager.get_context(conversation_id, count)
+        context = redis_conversation_manager.get_context_for_display(conversation_id, count)
         
         return jsonify(success_response(
             response_text="获取对话上下文成功",

+ 46 - 0
common/redis_conversation_manager.py

@@ -268,6 +268,52 @@ class RedisConversationManager:
         except Exception as e:
             print(f"[ERROR] 获取上下文失败: {str(e)}")
             return ""
+        
+    def get_context_for_display(self, conversation_id: str, count: Optional[int] = None) -> str:
+        """获取对话上下文用于UI显示(不受ENABLE_CONVERSATION_CONTEXT配置影响),
+        仅供UI显示使用,不用于提交上下文给LLM       
+        """
+        if not self.is_available():
+            return ""
+        
+        try:
+            if count is None:
+                count = CONVERSATION_CONTEXT_COUNT
+            
+            # 获取最近的消息(count*2 因为包含用户和助手消息)
+            message_count = count * 2
+            messages = self.redis_client.lrange(
+                f"conversation:{conversation_id}:messages",
+                0, message_count - 1
+            )
+            
+            if not messages:
+                return ""
+            
+            # 解析消息并构建上下文(按时间正序)
+            context_parts = []
+            for msg_json in reversed(messages):  # Redis返回倒序,需要反转
+                try:
+                    msg_data = json.loads(msg_json)
+                    role = msg_data.get("role", "")
+                    content = msg_data.get("content", "")
+                    
+                    if role == "user":
+                        context_parts.append(f"User: {content}")
+                    elif role == "assistant":
+                        context_parts.append(f"Assistant: {content}")
+                        
+                except json.JSONDecodeError:
+                    continue
+            
+            context = "\n".join(context_parts)
+            print(f"[REDIS_CONV] 获取显示上下文成功: {len(context_parts)}条消息")
+            return context
+            
+        except Exception as e:
+            print(f"[ERROR] 获取显示上下文失败: {str(e)}")
+            return ""
+    
     
     def get_conversation_messages(self, conversation_id: str, limit: Optional[int] = None) -> List[Dict]:
         """获取对话的消息列表"""