import { OpenAI } from 'openai'; import pool from '../config/db.js'; // 初始化 OpenAI API const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, baseURL: process.env.OPENAI_API_URL, }); // 获取用户数据作为系统提示词 const getUserDataForPrompt = async (userId) => { try { // 获取用户的待办事项 const [tasks] = await pool.query('SELECT * FROM tasks WHERE user_id = ?', [userId]); // 获取用户的时间安排 const [schedules] = await pool.query('SELECT * FROM schedules WHERE user_id = ?', [userId]); return { tasks, schedules }; } catch (error) { console.error('获取用户数据失败:', error); return { tasks: [], schedules: [] }; } }; // @desc 与AI对话 // @route POST /api/ai/chat // @access Private const chatWithAI = async (req, res) => { try { const { message } = req.query; // 从查询参数获取消息 const userId = req.user.id; // 获取用户数据 const userData = await getUserDataForPrompt(userId); // 准备系统提示词 const systemPrompt = `你是一个任务管理助手。以下是用户的当前任务和时间安排数据: 任务数据: ${JSON.stringify(userData.tasks, null, 2)} 时间安排数据: ${JSON.stringify(userData.schedules, null, 2)} 请基于上述数据帮助用户回答问题、提供建议或分析他们的任务和时间安排。保持简洁、友好和有帮助性的回答。`; // 创建流式响应 const stream = await openai.chat.completions.create({ model: process.env.OPENAI_MODEL_NAME, messages: [ { role: 'system', content: systemPrompt }, { role: 'user', content: message } ], stream: true, }); // 设置响应头 res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 流式发送响应 for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ''; if (content) { res.write(`data: ${JSON.stringify({ content })}\n\n`); } } res.write('data: [DONE]\n\n'); res.end(); } catch (error) { console.error(error); res.status(500).json({ message: '服务器错误' }); } }; // @desc 列举待完成事项 // @route GET /api/ai/list-incomplete-tasks // @access Private const listIncompleteTasks = async (req, res) => { try { const userId = req.user.id; // 获取用户数据 const userData = await getUserDataForPrompt(userId); // 准备系统提示词 const systemPrompt = `你是一个任务管理助手。以下是用户的当前任务和时间安排数据: 任务数据: ${JSON.stringify(userData.tasks, null, 2)} 时间安排数据: ${JSON.stringify(userData.schedules, null, 2)} 请列举出所有未完成的任务,按照预计完成时间排序,并给出简短的建议。`; // 创建流式响应 const stream = await openai.chat.completions.create({ model: process.env.OPENAI_MODEL_NAME, messages: [ { role: 'system', content: systemPrompt }, { role: 'user', content: '请列举我所有未完成的任务,并提供一些建议。' } ], stream: true, }); // 设置响应头 res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 流式发送响应 for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ''; if (content) { res.write(`data: ${JSON.stringify({ content })}\n\n`); } } res.write('data: [DONE]\n\n'); res.end(); } catch (error) { console.error(error); res.status(500).json({ message: '服务器错误' }); } }; // @desc 推荐新的事件 // @route GET /api/ai/recommend-events // @access Private const recommendEvents = async (req, res) => { try { const userId = req.user.id; // 获取用户数据 const userData = await getUserDataForPrompt(userId); // 准备系统提示词 const systemPrompt = `你是一个任务管理助手。以下是用户的当前任务和时间安排数据: 任务数据: ${JSON.stringify(userData.tasks, null, 2)} 时间安排数据: ${JSON.stringify(userData.schedules, null, 2)} 请基于用户当前的任务和时间安排,推荐2-3个新的事件或活动,这些事件应该有助于提高用户的工作效率或生活质量。`; // 创建流式响应 const stream = await openai.chat.completions.create({ model: process.env.OPENAI_MODEL_NAME, messages: [ { role: 'system', content: systemPrompt }, { role: 'user', content: '请根据我的任务和时间安排,推荐一些新的事件或活动。' } ], stream: true, }); // 设置响应头 res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 流式发送响应 for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ''; if (content) { res.write(`data: ${JSON.stringify({ content })}\n\n`); } } res.write('data: [DONE]\n\n'); res.end(); } catch (error) { console.error(error); res.status(500).json({ message: '服务器错误' }); } }; // @desc 综合分析 // @route GET /api/ai/comprehensive-analysis // @access Private const comprehensiveAnalysis = async (req, res) => { try { const userId = req.user.id; // 获取用户数据 const userData = await getUserDataForPrompt(userId); // 准备系统提示词 const systemPrompt = `你是一个任务管理助手。以下是用户的当前任务和时间安排数据: 任务数据: ${JSON.stringify(userData.tasks, null, 2)} 时间安排数据: ${JSON.stringify(userData.schedules, null, 2)} 请对用户的任务和时间安排进行全面分析,包括: 1. 工作负载分析:任务数量、重要程度分布、截止日期分布 2. 时间利用分析:空闲时间、重复活动、潜在冲突 3. 效率提升建议:如何更好地安排任务和时间 4. 习惯和模式:从数据中可以看出的习惯和模式 请提供具体、可操作的建议。`; // 创建流式响应 const stream = await openai.chat.completions.create({ model: process.env.OPENAI_MODEL_NAME, messages: [ { role: 'system', content: systemPrompt }, { role: 'user', content: '请对我的任务和时间安排进行全面分析。' } ], stream: true, }); // 设置响应头 res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 流式发送响应 for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ''; if (content) { res.write(`data: ${JSON.stringify({ content })}\n\n`); } } res.write('data: [DONE]\n\n'); res.end(); } catch (error) { console.error(error); res.status(500).json({ message: '服务器错误' }); } }; export { chatWithAI, listIncompleteTasks, recommendEvents, comprehensiveAnalysis };