1
This commit is contained in:
185
utils/aiService.js
Normal file
185
utils/aiService.js
Normal 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
|
||||
};
|
||||
Reference in New Issue
Block a user