186 lines
5.4 KiB
JavaScript
186 lines
5.4 KiB
JavaScript
/**
|
||
* 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
|
||
};
|