Files
ZhiQiXiaoYuan/utils/aiService.js
ChuXun eaab9a762a 1
2025-10-19 20:28:31 +08:00

186 lines
5.4 KiB
JavaScript
Raw Permalink 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.
/**
* AI服务 - DeepSeek API集成
* 提供智能对话、场景化提示词等功能
*/
const API_BASE_URL = 'https://api.deepseek.com';
const API_KEY = 'sk-0bdae24178904e5d9e59598cf4ecace6'; // 请替换为实际的API密钥
/**
* 场景化提示词模板
*/
const SCENARIO_PROMPTS = {
study_method: {
name: '学习方法咨询',
systemPrompt: '你是一位经验丰富的学习顾问,擅长根据学生的具体情况提供个性化的学习方法建议。请用简洁、实用的语言回答,每个建议都要具体可执行。'
},
course_advice: {
name: '课程建议',
systemPrompt: '你是一位专业的课程规划师,擅长根据学生的兴趣和目标推荐合适的课程。请提供具体的选课建议,包括课程难度、学习顺序等。'
},
post_summary: {
name: '帖子总结',
systemPrompt: '你是一位擅长信息提炼的助手,能够快速总结论坛帖子的核心内容。请用简洁的语言概括要点,突出关键信息。'
},
study_plan: {
name: '学习计划',
systemPrompt: '你是一位时间管理专家,擅长制定科学合理的学习计划。请根据学生的时间和目标,制定详细的、可执行的学习计划。'
},
problem_explain: {
name: '问题讲解',
systemPrompt: '你是一位耐心的老师,擅长用通俗易懂的方式讲解复杂问题。请分步骤讲解,确保学生能够理解每个环节。'
}
};
/**
* 调用DeepSeek Chat API
* @param {Array} messages - 消息历史数组
* @param {String} scenarioId - 场景ID(可选)
* @returns {Promise<String>} AI回复内容
*/
async function chat(messages, scenarioId = null) {
try {
// 构建请求消息
const requestMessages = [];
// 添加系统提示词(如果有场景)
if (scenarioId && SCENARIO_PROMPTS[scenarioId]) {
requestMessages.push({
role: 'system',
content: SCENARIO_PROMPTS[scenarioId].systemPrompt
});
} else {
// 默认系统提示词
requestMessages.push({
role: 'system',
content: '你是一位智能学习助手,名叫"启思AI",寓意"启迪思维,智慧学习"。你致力于帮助大学生更好地学习和成长,提供个性化的学习指导。请用友好、专业且富有启发性的语言回答问题,让学生在获得答案的同时也能学会独立思考。'
});
}
// 添加对话历史
messages.forEach(msg => {
requestMessages.push({
role: msg.role,
content: msg.content
});
});
// 调用API
return new Promise((resolve, reject) => {
wx.request({
url: `${API_BASE_URL}/chat/completions`,
method: 'POST',
header: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
data: {
model: 'deepseek-chat',
messages: requestMessages,
stream: false,
temperature: 0.7,
max_tokens: 2000
},
timeout: 30000,
success: (res) => {
if (res.statusCode === 200 && res.data.choices && res.data.choices.length > 0) {
const reply = res.data.choices[0].message.content;
resolve(reply);
} else {
reject(new Error('API返回格式错误'));
}
},
fail: (err) => {
reject(err);
}
});
});
} catch (error) {
console.error('AI服务调用失败:', error);
throw error;
}
}
/**
* 获取场景列表
* @returns {Array} 场景列表
*/
function getScenarios() {
return [
{
id: 'study_method',
name: '学习方法',
icon: '📚',
prompt: '你好!我想了解一些高效的学习方法,有什么建议吗?'
},
{
id: 'course_advice',
name: '课程建议',
icon: '🎯',
prompt: '我想请教一下选课方面的建议。'
},
{
id: 'post_summary',
name: '帖子总结',
icon: '📝',
prompt: '请帮我总结一下这个帖子的主要内容。'
},
{
id: 'study_plan',
name: '学习计划',
icon: '📅',
prompt: '能帮我制定一个学习计划吗?'
},
{
id: 'problem_explain',
name: '问题讲解',
icon: '💡',
prompt: '我有一个问题不太理解,能帮我讲解一下吗?'
}
];
}
/**
* 错误处理 - 返回友好的错误提示
* @param {Error} error - 错误对象
* @returns {String} 错误提示文本
*/
function getErrorMessage(error) {
console.error('AI服务错误:', error);
// 域名不在白名单
if (error.errMsg && error.errMsg.includes('url not in domain list')) {
return '⚠️ API域名未配置\n\n请在开发者工具中\n详情 → 本地设置 → 勾选"不校验合法域名"\n\n或在小程序后台添加:\nhttps://api.deepseek.com';
}
if (error.errMsg && error.errMsg.includes('timeout')) {
return '网络超时,请检查网络连接后重试 🌐';
}
if (error.errMsg && error.errMsg.includes('fail')) {
return '网络请求失败,请稍后重试 📡';
}
if (error.statusCode === 401) {
return 'API密钥无效,请联系管理员 🔑';
}
if (error.statusCode === 429) {
return '请求过于频繁,请稍后再试 ⏰';
}
if (error.statusCode === 500) {
return '服务器繁忙,请稍后重试 🔧';
}
return '抱歉,AI助手暂时无法回复,请稍后重试 😢';
}
module.exports = {
chat,
getScenarios,
getErrorMessage,
SCENARIO_PROMPTS
};