daren/apps/common/services/chat_service.py

118 lines
4.0 KiB
Python
Raw Normal View History

2025-05-23 19:25:35 +08:00
# 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 []