This commit is contained in:
ChuXun
2025-10-19 20:28:31 +08:00
parent c81f8a8b03
commit eaab9a762a
100 changed files with 23416 additions and 0 deletions

185
utils/aiService.js Normal file
View File

@@ -0,0 +1,185 @@
/**
* 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
};