当前位置: 首页 > news >正文

硅基流动nodejs流式输出

使用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-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`,
        '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}`);
});


http://www.dtcms.com/a/48597.html

相关文章:

  • 文本挖掘+情感分析+主题建模+K-Meas聚类+词频统计+词云(景区游客评论情感分析)
  • 刚安装docker并启动docker服务: systemctl restart docker报错解决
  • 反向代理以及其使用场景
  • Linux12-UDP\
  • MAC 本地搭建部署 dify(含 github访问超时+Docker镜像源拉取超时解决方案)
  • 网络安全有必要学编程吗?
  • MIPI接口:(4)MIPI CSI-2协议详解(上)
  • list的两个实现类
  • 关于android studio设备镜像的设置
  • 《基于Hadoop的青岛市旅游景点游客行为分析系统设计与实现》开题报告
  • 2025国家护网HVV高频面试题总结来了03(题目+回答)
  • Java-实现PDF合同模板填写内容并导出PDF文件
  • 【二.提示词工程与实战应用篇】【1.提示词工程入门:AI对话的艺术】
  • 魔发奇缘,3D发型生成新突破!TANGLED:利用任意样式和视点的图像生成 3D 发束
  • debian/control中的包关系
  • Tomcat-web服务器介绍以及安装部署
  • 【音视频】H265解码Nalu后封装rtp包
  • 项目准备(flask+pyhon+MachineLearning)- 1
  • SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式
  • ZYNQ-PL实践课堂(五)IP核之FIFO
  • unity pico开发 五 UI交互
  • PyTorch GPU显存管理与大规模张量操作
  • 虚拟网络IP设置
  • Focal Loss (聚焦损失) :解决类别不平衡与难易样本的利器,让模型学会“重点学习”
  • LINUX网络基础 - 网络编程套接字,UDP与TCP
  • Tauri跨平台开发问题及解决方案深度解析(React版)
  • 学生管理信息系统的需求分析与设计
  • 基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)
  • 新一代信息技术:从技术范畴到未来趋势的全景洞察
  • 千峰React:组件与逻辑封装(下)