| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- const openAi = require('openai');
- const axios = require('axios');
- //查询用户信息
- exports.chartai = async (req, res) => {
- const openai = new openAi({
- baseURL: 'https://api.deepseek.com',
- apiKey: 'sk-124eacfb93c9459a9abeaf511df20502'
- });
- try {
- const { prompt } = req.body;
- if (!prompt) {
- // return res.status(400).json({ error: 'Prompt is required' });
- return res.rescc("Prompt is required", 400);
- }
- // 调用 DeepSeek API
- // const response = await openai.createChatCompletion({
- // model: 'deepseek-chat', // 模型名称
- // messages: [{ role: 'user', content: prompt }],
- // max_tokens: 50, // 生成的最大 token 数量
- // temperature: 0.7, // 控制生成内容的随机性
- // stream: false, // 是否启用流式传输(这里关闭流式传输)
- // });
- //直接使用deepseek提供的api---需要购买token
- // const response = await openai.chat.completions.create({
- // messages: [{ role: "system", content: prompt }],
- // model: "deepseek-chat",
- // });
- // // 返回 API 响应
- // console.log("response====>>>", response)
- // res.rescc("对话成功", 200, response);
- //使用ollama提供的api--免费
- //1. 生成文本(Generate Text)--- POST /api/generate --- 向模型发送提示词(prompt),并获取生成的文本。
- // const ollamaResponse = await axios.post('http://127.0.0.1:11434/api/generate', {
- // model: 'deepseek-r1:8b', // 替换为实际的模型名称
- // prompt,
- // stream: false // 不启用流式响应
- // });
- //2. 多轮对话(Chat)--- POST /api/chat --- 支持多轮对话,模型会记住上下文。
- const ollamaResponse = await axios.post('http://127.0.0.1:11434/api/chat', {
- model: 'deepseek-r1:8b', // 替换为实际的模型名称
- messages: [
- { "role": "user", "content": prompt }
- ],
- stream: false // 不启用流式响应
- });
- //3.多模态输入(上传文件) --- POST /api/run --- 运行模型并处理多模态输入(如图片)
- // const ollamaResponse = await axios.post('http://127.0.0.1:11434/api/run', {
- // model: 'deepseek-r1:8b', // 替换为实际的模型名称
- // prompt,
- // file: "/path/to/image.png",
- // stream: false // 不启用流式响应
- // });
- // 返回 API 响应
- console.log("response====>>>", ollamaResponse)
- res.rescc("对话成功", 200, ollamaResponse.data);
- } catch (error) {
- console.error('Error calling DeepSeek API:', error.response ? error.response.data : error.message);
- // res.status(500).json({ error: 'Failed to call DeepSeek API' });
- res.rescc("Failed to call DeepSeek API");
- }
- }
- //ollama流方式返回
- exports.chartaiStream = async (req, res) => {
- // 设置 SSE 响应头
- res.setHeader('Content-Type', 'text/event-stream');
- res.setHeader('Cache-Control', 'no-cache');
- res.setHeader('Connection', 'keep-alive');
- const { prompt } = req.query;
- try {
- // 调用 Ollama 的 API
- const ollamaStream = await axios({
- method: 'post',
- url: 'http://127.0.0.1:11434/api/generate', // 替换为实际 Ollama 地址
- data: {
- model: 'deepseek-r1:8b', // 指定模型名称
- prompt, // 示例输入
- stream: true, // 开启流式响应
- },
- responseType: 'stream',
- });
- // 将 Ollama 的流式数据转发给前端
- ollamaStream.data.on('data', (chunk) => {
- const message = chunk.toString(); // 假设 Ollama 返回的是字符串数据
- res.write(`data: ${message}\n\n`); // 推送给前端
- });
- // 监听 Ollama 流结束
- ollamaStream.data.on('end', () => {
- console.log('Ollama 流结束');
- res.write(`data: [END]`);
- // res.end();
- });
- // 监听客户端断开连接
- req.on('close', () => {
- console.log('客户端断开连接');
- ollamaStream.data.destroy(); // 停止 Ollama 流
- res.end();
- });
- } catch (error) {
- console.error('调用 Ollama API 出错:', error.message);
- res.status(500).end();
- }
- }
- //PPT流方式返回
- exports.chartAiPPTStream = async (req, res) => {
- // 设置 SSE 响应头
- res.setHeader('Content-Type', 'text/event-stream');
- res.setHeader('Cache-Control', 'no-cache');
- res.setHeader('Connection', 'keep-alive');
- const { prompt } = req.query;
- try {
- const pptOnline = await axios({
- method: 'post',
- url: 'https://api.coze.cn/v3/chat',
- headers: {
- "Authorization": "Bearer pat_fGccMIbg8Z9wJkSHBbRic6RFNV4Pn5VFjnFYisYH7O75SOn9UMkhKQKQkuP8Sc0I",
- "Content-Type": "application/json"
- },
- data: {
- "bot_id": "7494094750929666059",
- "user_id": "111",
- "stream": true,
- "additional_messages": [
- {
- "content": prompt,
- "content_type": "text",
- "role": "user",
- "type": "question"
- }
- ]
- },
- responseType: 'stream'
- });
- // 将 Ollama 的流式数据转发给前端
- pptOnline.data.on('data', (chunk) => {
- const message = chunk.toString(); // 假设 Ollama 返回的是字符串数据
- if (message.indexOf("event:conversation.message.completed") > -1) {
- const msg = message.replace(/event:conversation.message.completed/g, '')
- res.write(`data: ${msg}\n\n`); // 推送给前端
- } else if (message.indexOf("[DONE]") > -1) {
- console.log("message===>>>", message)
- console.log("messagetypeof===>>>", (typeof message))
- res.write(`data: ${message}\n\n`); // 推送给前端
- }
- });
- // 监听 Ollama 流结束
- pptOnline.data.on('end', () => {
- console.log('Ollama 流结束');
- // res.end();
- });
- // 监听客户端断开连接
- req.on('close', () => {
- console.log('客户端断开连接');
- pptOnline.data.destroy(); // 停止 Ollama 流
- res.end();
- });
- } catch (error) {
- console.error('调用 Ollama API 出错:', error.message);
- res.status(500).end();
- }
- }
|