使用JavaScript的api直接在前端问答速度虽然快但是有token直接暴露的风险。
现在使用nodejs也可以快速进行流式输出并且可以隐藏用户敏感信息。
const express = require('express');
const axios = require('axios');
const app = express();
const port = 3000;
//启动服务node index.js
app.get('/test', async (req, res) => {
try {
// 设置流式响应头(保持不变)
res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
const userQuestion = req.query.questions || '默认问题:你好!';
const response = await axios({
method: 'POST',
url: 'https://api.siliconflow.cn/v1/chat/completions',
headers: {
Authorization: `Bearer sk-hviawrviufltkrmrqcutzljhvcjlsjcwtvvxjimwjlclcakv`,
'Content-Type': 'application/json'
},
data: {
model: "Qwen/Qwen2.5-72B-Instruct",
messages: [{ role: "user", content: userQuestion }],
stream: true,
max_tokens: 2048,
stop: ["END"]
},
responseType: 'stream'
});
let buffer = ''; // 新增:内容缓冲区
let shouldStop = false; // 新增:停止标志
response.data.on('data', (chunk) => {
if (shouldStop) return;
const lines = chunk.toString('utf8').split('\n').filter(line => line.trim() !== '');
lines.forEach(line => {
if (line.startsWith('data: ') && line !== 'data: [DONE]') {
try {
const jsonData = JSON.parse(line.replace(/^data: /, ''));
if (jsonData.choices?.[0]?.delta?.content) {
const content = jsonData.choices[0].delta.content;
// 修正2:客户端检测停止词
buffer += content;
if (buffer.includes('END')) {
shouldStop = true;
// 发送END前的有效内容
const validContent = buffer.split('END')[0];
// 发送流式输出结果
res.write(validContent);
res.end();
return;
}
res.write(content);
}
} catch (error) {
console.error('处理错误:', error);
}
}
});
});
response.data.on('end', () => {
if (!shouldStop) res.end();
});
} catch (error) {
console.error('请求出错:', error);
res.status(500).json({ error: '服务器内部错误' });
}
});
app.listen(port, () => {
console.log(`Example app listening on http://localhost:${port}`);
});