daren/apps/common/services/chat_service.py
2025-05-23 19:25:35 +08:00

118 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 []