openai.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. const openAi = require('openai');
  2. const axios = require('axios');
  3. //查询用户信息
  4. exports.chartai = async (req, res) => {
  5. const openai = new openAi({
  6. baseURL: 'https://api.deepseek.com',
  7. apiKey: 'sk-124eacfb93c9459a9abeaf511df20502'
  8. });
  9. try {
  10. const { prompt } = req.body;
  11. if (!prompt) {
  12. // return res.status(400).json({ error: 'Prompt is required' });
  13. return res.rescc("Prompt is required", 400);
  14. }
  15. // 调用 DeepSeek API
  16. // const response = await openai.createChatCompletion({
  17. // model: 'deepseek-chat', // 模型名称
  18. // messages: [{ role: 'user', content: prompt }],
  19. // max_tokens: 50, // 生成的最大 token 数量
  20. // temperature: 0.7, // 控制生成内容的随机性
  21. // stream: false, // 是否启用流式传输(这里关闭流式传输)
  22. // });
  23. //直接使用deepseek提供的api---需要购买token
  24. // const response = await openai.chat.completions.create({
  25. // messages: [{ role: "system", content: prompt }],
  26. // model: "deepseek-chat",
  27. // });
  28. // // 返回 API 响应
  29. // console.log("response====>>>", response)
  30. // res.rescc("对话成功", 200, response);
  31. //使用ollama提供的api--免费
  32. //1. 生成文本(Generate Text)--- POST /api/generate --- 向模型发送提示词(prompt),并获取生成的文本。
  33. // const ollamaResponse = await axios.post('http://127.0.0.1:11434/api/generate', {
  34. // model: 'deepseek-r1:8b', // 替换为实际的模型名称
  35. // prompt,
  36. // stream: false // 不启用流式响应
  37. // });
  38. //2. 多轮对话(Chat)--- POST /api/chat --- 支持多轮对话,模型会记住上下文。
  39. const ollamaResponse = await axios.post('http://127.0.0.1:11434/api/chat', {
  40. model: 'deepseek-r1:8b', // 替换为实际的模型名称
  41. messages: [
  42. { "role": "user", "content": prompt }
  43. ],
  44. stream: false // 不启用流式响应
  45. });
  46. //3.多模态输入(上传文件) --- POST /api/run --- 运行模型并处理多模态输入(如图片)
  47. // const ollamaResponse = await axios.post('http://127.0.0.1:11434/api/run', {
  48. // model: 'deepseek-r1:8b', // 替换为实际的模型名称
  49. // prompt,
  50. // file: "/path/to/image.png",
  51. // stream: false // 不启用流式响应
  52. // });
  53. // 返回 API 响应
  54. console.log("response====>>>", ollamaResponse)
  55. res.rescc("对话成功", 200, ollamaResponse.data);
  56. } catch (error) {
  57. console.error('Error calling DeepSeek API:', error.response ? error.response.data : error.message);
  58. // res.status(500).json({ error: 'Failed to call DeepSeek API' });
  59. res.rescc("Failed to call DeepSeek API");
  60. }
  61. }
  62. //ollama流方式返回
  63. exports.chartaiStream = async (req, res) => {
  64. // 设置 SSE 响应头
  65. res.setHeader('Content-Type', 'text/event-stream');
  66. res.setHeader('Cache-Control', 'no-cache');
  67. res.setHeader('Connection', 'keep-alive');
  68. const { prompt } = req.query;
  69. try {
  70. // 调用 Ollama 的 API
  71. const ollamaStream = await axios({
  72. method: 'post',
  73. url: 'http://127.0.0.1:11434/api/generate', // 替换为实际 Ollama 地址
  74. data: {
  75. model: 'deepseek-r1:8b', // 指定模型名称
  76. prompt, // 示例输入
  77. stream: true, // 开启流式响应
  78. },
  79. responseType: 'stream',
  80. });
  81. // 将 Ollama 的流式数据转发给前端
  82. ollamaStream.data.on('data', (chunk) => {
  83. const message = chunk.toString(); // 假设 Ollama 返回的是字符串数据
  84. res.write(`data: ${message}\n\n`); // 推送给前端
  85. });
  86. // 监听 Ollama 流结束
  87. ollamaStream.data.on('end', () => {
  88. console.log('Ollama 流结束');
  89. res.write(`data: [END]`);
  90. // res.end();
  91. });
  92. // 监听客户端断开连接
  93. req.on('close', () => {
  94. console.log('客户端断开连接');
  95. ollamaStream.data.destroy(); // 停止 Ollama 流
  96. res.end();
  97. });
  98. } catch (error) {
  99. console.error('调用 Ollama API 出错:', error.message);
  100. res.status(500).end();
  101. }
  102. }
  103. //PPT流方式返回
  104. exports.chartAiPPTStream = async (req, res) => {
  105. // 设置 SSE 响应头
  106. res.setHeader('Content-Type', 'text/event-stream');
  107. res.setHeader('Cache-Control', 'no-cache');
  108. res.setHeader('Connection', 'keep-alive');
  109. const { prompt } = req.query;
  110. try {
  111. const pptOnline = await axios({
  112. method: 'post',
  113. url: 'https://api.coze.cn/v3/chat',
  114. headers: {
  115. "Authorization": "Bearer pat_fGccMIbg8Z9wJkSHBbRic6RFNV4Pn5VFjnFYisYH7O75SOn9UMkhKQKQkuP8Sc0I",
  116. "Content-Type": "application/json"
  117. },
  118. data: {
  119. "bot_id": "7494094750929666059",
  120. "user_id": "111",
  121. "stream": true,
  122. "additional_messages": [
  123. {
  124. "content": prompt,
  125. "content_type": "text",
  126. "role": "user",
  127. "type": "question"
  128. }
  129. ]
  130. },
  131. responseType: 'stream'
  132. });
  133. // 将 Ollama 的流式数据转发给前端
  134. pptOnline.data.on('data', (chunk) => {
  135. const message = chunk.toString(); // 假设 Ollama 返回的是字符串数据
  136. if (message.indexOf("event:conversation.message.completed") > -1) {
  137. const msg = message.replace(/event:conversation.message.completed/g, '')
  138. res.write(`data: ${msg}\n\n`); // 推送给前端
  139. } else if (message.indexOf("[DONE]") > -1) {
  140. console.log("message===>>>", message)
  141. console.log("messagetypeof===>>>", (typeof message))
  142. res.write(`data: ${message}\n\n`); // 推送给前端
  143. }
  144. });
  145. // 监听 Ollama 流结束
  146. pptOnline.data.on('end', () => {
  147. console.log('Ollama 流结束');
  148. // res.end();
  149. });
  150. // 监听客户端断开连接
  151. req.on('close', () => {
  152. console.log('客户端断开连接');
  153. pptOnline.data.destroy(); // 停止 Ollama 流
  154. res.end();
  155. });
  156. } catch (error) {
  157. console.error('调用 Ollama API 出错:', error.message);
  158. res.status(500).end();
  159. }
  160. }