102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
![]() |
import logging
|
||
|
from django.conf import settings
|
||
|
from datetime import datetime
|
||
|
from apps.accounts.models import UserGoal
|
||
|
from apps.gmail.models import GmailConversation, ConversationSummary
|
||
|
from apps.chat.models import ChatHistory
|
||
|
from apps.common.services.ai_service import AIService
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
def get_active_goal(user):
|
||
|
"""
|
||
|
获取用户最新的活跃目标
|
||
|
|
||
|
Args:
|
||
|
user: 用户对象
|
||
|
|
||
|
Returns:
|
||
|
UserGoal: 用户目标对象或None
|
||
|
"""
|
||
|
return UserGoal.objects.filter(user=user, is_active=True).order_by('-updated_at').first()
|
||
|
|
||
|
def get_conversation_summary(conversation_id):
|
||
|
"""
|
||
|
获取对话摘要
|
||
|
|
||
|
Args:
|
||
|
conversation_id: 对话ID
|
||
|
|
||
|
Returns:
|
||
|
str: 摘要内容或None
|
||
|
"""
|
||
|
try:
|
||
|
# 先检查持久化存储的摘要
|
||
|
try:
|
||
|
conversation = GmailConversation.objects.get(conversation_id=conversation_id)
|
||
|
summary = ConversationSummary.objects.get(conversation=conversation)
|
||
|
return summary.content
|
||
|
except (GmailConversation.DoesNotExist, ConversationSummary.DoesNotExist):
|
||
|
pass
|
||
|
|
||
|
# 如果没有持久化的摘要,尝试生成简单摘要
|
||
|
chat_history = ChatHistory.objects.filter(conversation_id=conversation_id).order_by('-created_at')[:5]
|
||
|
if not chat_history:
|
||
|
return None
|
||
|
|
||
|
# 生成简单摘要(最近几条消息)
|
||
|
messages = []
|
||
|
for msg in chat_history:
|
||
|
if len(messages) < 3: # 只取最新的3条
|
||
|
role = "用户" if msg.role == "user" else "达人"
|
||
|
content = msg.content
|
||
|
if len(content) > 100:
|
||
|
content = content[:100] + "..."
|
||
|
messages.append(f"{role}: {content}")
|
||
|
|
||
|
if messages:
|
||
|
return "最近对话: " + " | ".join(reversed(messages))
|
||
|
return None
|
||
|
except Exception as e:
|
||
|
logger.error(f"获取对话摘要失败: {str(e)}")
|
||
|
return None
|
||
|
|
||
|
def get_last_message(conversation_id):
|
||
|
"""
|
||
|
获取对话中最后一条对方发送的消息
|
||
|
|
||
|
Args:
|
||
|
conversation_id: 对话ID
|
||
|
|
||
|
Returns:
|
||
|
str: 最后一条消息内容或None
|
||
|
"""
|
||
|
try:
|
||
|
# 获取对话中最后一条对方(达人)发送的消息
|
||
|
last_message = ChatHistory.objects.filter(
|
||
|
conversation_id=conversation_id,
|
||
|
role='assistant' # 达人的消息
|
||
|
).order_by('-created_at').first()
|
||
|
|
||
|
if last_message:
|
||
|
return last_message.content
|
||
|
return None
|
||
|
except Exception as e:
|
||
|
logger.error(f"获取最后一条消息失败: {str(e)}")
|
||
|
return None
|
||
|
|
||
|
def generate_recommended_reply(user, goal_description, conversation_summary, last_message):
|
||
|
"""
|
||
|
根据用户目标、对话摘要和最后一条消息生成推荐话术
|
||
|
|
||
|
Args:
|
||
|
user: 用户对象
|
||
|
goal_description: 用户目标描述
|
||
|
conversation_summary: 对话摘要
|
||
|
last_message: 达人最后发送的消息内容
|
||
|
|
||
|
Returns:
|
||
|
tuple: (推荐话术内容, 错误信息)
|
||
|
"""
|
||
|
# 直接调用AIService生成回复
|
||
|
return AIService.generate_email_reply(goal_description, conversation_summary, last_message)
|