# apps/common/services/chat_service.py import logging import json from uuid import uuid4 from django.db import transaction from apps.user.models import User from apps.chat.models import ChatHistory logger = logging.getLogger(__name__) class ChatService: @transaction.atomic def create_chat_record(self, user, data, conversation_id=None): """创建聊天记录,供chat、gmail、feishu模块复用""" try: # 验证必填字段 if 'question' not in data: raise ValueError("缺少必填字段: question") # 如果未提供conversation_id,生成新的 if not conversation_id: conversation_id = str(uuid4()) logger.info(f"生成新的会话ID: {conversation_id}") # 创建metadata metadata = { 'model_id': data.get('model_id', '7a214d0e-e65e-11ef-9f4a-0242ac120006'), } # 设置标题 title = data.get('title', 'New chat') # 创建用户问题记录 question_record = ChatHistory.objects.create( user=user, knowledge_base_id="b680a4fa-37be-11f0-a7cb-0242ac120002", # 使用默认知识库ID conversation_id=conversation_id, title=title, role='user', content=data['question'], metadata=metadata ) return question_record, conversation_id, metadata, [], [] except Exception as e: logger.error(f"创建聊天记录失败: {str(e)}") raise def get_conversation_detail(self, user, conversation_id): """获取会话详情,供chat、gmail、feishu模块复用""" try: # 查询会话记录 messages = ChatHistory.objects.filter( conversation_id=conversation_id, user=user, is_deleted=False ).order_by('created_at') if not messages.exists(): raise ValueError("对话不存在或无权限") # 构建消息列表 message_list = [ { 'id': str(msg.id), 'parent_id': msg.parent_id, 'role': msg.role, 'content': msg.content, 'created_at': msg.created_at.strftime('%Y-%m-%d %H:%M:%S'), 'metadata': msg.metadata } for msg in messages ] return { 'conversation_id': conversation_id, 'messages': message_list } except Exception as e: logger.error(f"获取会话详情失败: {str(e)}") raise def can_user_access_conversation(self, user, conversation_id): """检查用户是否有权限访问指定的对话""" return ChatHistory.objects.filter( conversation_id=conversation_id, user=user, is_deleted=False ).exists() def format_chat_response(self, chat_history_list): """格式化聊天历史记录为前端需要的格式""" try: result = [] for item in chat_history_list: formatted_item = { "id": str(item.id), "conversation_id": str(item.conversation_id), "role": item.role, "content": item.content, "created_at": item.created_at.strftime('%Y-%m-%d %H:%M:%S'), "title": item.title } # 添加parent_id如果存在 if item.parent_id: formatted_item["parent_id"] = str(item.parent_id) result.append(formatted_item) return result except Exception as e: logger.error(f"格式化聊天响应失败: {e}") return []