123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- 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 };
|