import requests import logging import json from django.conf import settings from datetime import datetime logger = logging.getLogger(__name__) class AIService: """ 通用AI服务类,提供对不同AI模型的统一调用接口 """ @staticmethod def call_silicon_cloud_api(messages, model="deepseek-ai/DeepSeek-V3", max_tokens=512, temperature=0.7): """ 调用SiliconCloud API Args: messages: 消息列表,格式为[{"role": "user", "content": "..."}, ...] model: 使用的模型名称,默认为DeepSeek-V3 max_tokens: 最大生成token数 temperature: 温度参数,控制创造性 Returns: tuple: (生成内容, 错误信息) """ try: # 获取API密钥 api_key = getattr(settings, 'SILICON_CLOUD_API_KEY', '') if not api_key: return None, "未配置Silicon Cloud API密钥" url = "https://api.siliconflow.cn/v1/chat/completions" payload = { "model": model, "stream": False, "max_tokens": max_tokens, "temperature": temperature, "top_p": 0.7, "top_k": 50, "frequency_penalty": 0.5, "n": 1, "stop": [], "messages": messages } headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } # 设置代理(如果配置了) proxies = None proxy_url = getattr(settings, 'PROXY_URL', None) if proxy_url: proxies = { "http": proxy_url, "https": proxy_url } # 发送请求 logger.info(f"正在调用SiliconCloud API,模型: {model}") response = requests.post(url, json=payload, headers=headers, proxies=proxies) if response.status_code != 200: logger.error(f"API请求失败,状态码: {response.status_code},响应: {response.text}") return None, f"API请求失败,状态码: {response.status_code}" result = response.json() # 从API响应中提取内容 if 'choices' in result and result['choices']: content = result['choices'][0]['message']['content'].strip() return content, None else: logger.error(f"API响应格式错误: {result}") return None, "API响应格式错误,无法提取内容" except requests.exceptions.RequestException as e: logger.error(f"API请求异常: {str(e)}") return None, f"API请求异常: {str(e)}" except Exception as e: logger.error(f"调用AI服务失败: {str(e)}") return None, f"调用AI服务失败: {str(e)}" @staticmethod def generate_email_reply(goal_description, conversation_summary, last_message): """ 生成邮件回复话术 Args: goal_description: 用户目标描述 conversation_summary: 对话摘要 last_message: 达人最后发送的消息内容 Returns: tuple: (推荐话术内容, 错误信息) """ try: # 验证必要参数 if not goal_description or not last_message: return None, "缺少必要参数:目标描述或最后消息" # 准备提示信息 prompt = f""" 请为用户提供一条回复达人邮件的推荐话术,帮助用户实现销售目标。 用户目标:{goal_description} 对话摘要:{conversation_summary or '无对话摘要'} 达人最后发送的消息: {last_message} 要求: 1. 回复应当专业礼貌,并围绕用户目标展开 2. 提供有说服力的话术,推动促成合作 3. 不超过200字 4. 直接给出回复内容,不要包含任何额外解释 """ messages = [ { "role": "system", "content": "你是一名专业的邮件回复助手,你的任务是生成有效的销售话术,帮助用户实现销售目标。" }, { "role": "user", "content": prompt } ] # 调用通用API方法 return AIService.call_silicon_cloud_api( messages, model="Pro/deepseek-ai/DeepSeek-R1", max_tokens=512, temperature=0.7 ) except Exception as e: logger.error(f"生成回复话术失败: {str(e)}") return None, f"生成回复话术失败: {str(e)}" @staticmethod def generate_conversation_summary(conversation_history): """ 生成对话摘要 Args: conversation_history: 对话历史记录列表 Returns: tuple: (摘要内容, 错误信息) """ try: if not conversation_history: return None, "无对话历史,无法生成摘要" # 构造对话历史文本 conversation_text = "\n\n".join([ f"**{'用户' if msg.get('is_from_user', False) else '达人'}**: {msg.get('content', '')}" for msg in conversation_history ]) # 准备提示信息 prompt = f""" 请对以下用户与达人之间的对话内容进行总结: {conversation_text} 要求: 1. 总结应包含双方主要讨论的话题和关键点 2. 特别关注产品详情、价格谈判、合作意向等商务要点 3. 简明扼要,不超过200字 4. 直接给出总结内容,不要包含任何额外解释 """ messages = [ { "role": "system", "content": "你是一名专业的对话总结助手,擅长提取商务沟通中的关键信息。" }, { "role": "user", "content": prompt } ] # 调用通用API方法 return AIService.call_silicon_cloud_api( messages, model="Pro/deepseek-ai/DeepSeek-R1", max_tokens=512, temperature=0.5 ) except Exception as e: logger.error(f"生成对话摘要失败: {str(e)}") return None, f"生成对话摘要失败: {str(e)}"