解决从deepseek接口获取的流式响应输出到前端都是undefined的问题

在这里插入图片描述
你的前端 EventSource 代码遇到了 undefined 连续输出 的问题,通常是因为:

  1. AI 返回的内容被拆成了单个字符,导致前端 JSON.parse(event.data).content 获取到的是单个字符,而 undefined 可能是因为某些数据块没有 content 字段。
  2. 前端拼接字符串时,错误地处理了 undefined,导致 undefined 被拼接到页面上。

✅ 解决方案

1️⃣ 修正后端(确保 AI 输出的是 “块” 而不是单个字符)

你的 AI 可能逐字符返回内容,需要在后端 合并成合理的块,然后以 SSE 格式输出:

import jsondef generate_category_description(messages, client):"""调用 DeepSeek API 并流式返回符合 SSE 格式的 JSON"""response = client.chat.completions.create(model="deepseek-chat",messages=messages,response_format={"type": "json_object"},stream=True  # 设置为 True,以便接收流式数据)buffer = ""  # 临时存储数据,防止单字符输出for chunk in response:if not chunk.choices:continue  # 跳过空数据content = chunk.choices[0].delta.content or ""  # 取 AI 返回的内容buffer += content  # 逐步累积内容if len(buffer) >= 10:  # 只有在积累到 10 个字符后才发送print(buffer, end='', flush=True)  # 实时流式输出到控制台yield f"data: {json.dumps({'content': buffer})}\n\n"buffer = ""  # 发送后清空 buffer# 发送剩余的内容(如果有的话)if buffer:yield f"data: {json.dumps({'content': buffer})}\n\n"

2️⃣ 修正前端(处理 undefined 并正确拼接流式数据)

你的 EventSource 代码没有正确处理 undefined,需要修正:

async function generateCategoryDesc() {const eventSource = new EventSource("/generate_category_desc_stream");let contentBuffer = ""; // 存储完整的内容eventSource.onmessage = (event) => {try {console.log("Raw event data:", event.data);const data = JSON.parse(event.data);if (data.content) {  // 确保 content 存在contentBuffer += data.content; // 拼接完整内容document.getElementById("editArea").innerHTML = contentBuffer; // 更新页面}} catch (err) {console.error("JSON parse error:", err, "Raw event data:", event.data);}};eventSource.onerror = (err) => {console.error("EventSource failed:", err);eventSource.close();};eventSource.onopen = () => {console.log("SSE connection opened.");};
}

🔥 关键修正

后端:

  • 确保 buffer 缓冲字符,防止逐字符发送
  • 积累到足够字符后才 yield,防止前端 undefined 乱拼接
  • 如果 AI 只返回一个字符,后端会等到 10 个字符后才发送

前端:

  • 检查 data.content 是否为 undefined,避免拼接 undefined
  • 修正 EventSource 解析逻辑,确保流式数据完整
  • 修正 contentBuffer 逻辑,确保拼接的数据正确

🚀 结果

  • 流式 AI 输出不会拆成单个字符
  • 前端不会出现 undefined
  • 文本会按块(10 字符)更新到 editArea
  • AI 生成的内容仍然是流式的,不影响流式体验

现在试试看,你的 editArea 应该会正常流式更新,而不会出现 undefinedundefinedundefined 的问题了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VLLM专题(二十七)—使用 Kubernetes

在Kubernetes上部署vLLM是一种可扩展且高效的方式来服务机器学习模型。本指南将引导您使用原生Kubernetes部署vLLM。 此外,您还可以使用以下任意一种方式将vLLM部署到Kubernetes: HelmInftyAI/llmazKServekubernetes-sigs/lwsmeta-llama/llama-stacksubstratusai/kubeaivllm…

前缀和 之 哈希表 之 和 的奇偶与倍数

文章目录 930.和相同的二元子数组523.连续的子数组和 求解连续子数组的和的问题,常常会使用到这个前缀和的思路,当然当数组存在单调性的时候,可以考虑使用不定长滑动窗口,在这里解释一下,何为数组的和存在这个单调性&a…

Docker Compose 和 Kubernetes(K8s)对比

Docker Compose 和 Kubernetes(K8s)在某些方面有相似的功能,但它们的 核心用途和适用场景不同。以下是它们的主要区别和联系: 1. Docker Compose 和 Kubernetes 的区别 对比项Docker ComposeKubernetes(K8s&#xff0…

晶艺代理,100V3.5A高耐压LA1823完全替换MP9487--启烨科技有限公司

晶艺品牌LA1823是异步降压转换器,COT控制,PFM工作模式, 150KHz/ 250KHz/ 450KHz ,开关频率可调节,输入电压4.5~100V,2A平均电流,峰值电流3.5A,采用ESOP8封装。 晶艺LA1823的特性: 4.…

PLC控制柜在技术创新驱动中功能演进 尤劲恩科技

在智能制造体系中,PLC控制柜不仅承担着传统设备控制的基础功能,更通过工业以太网、PROFIBUS等现场总线技术,构建起分布式控制系统(DCS)。这种拓扑结构使生产线具备实时数据采集、远程监控和智能决策能力,显…

【JavaEE】Spring Boot 日志

目录 一、日志概述二、使用日志2.1 打印日志2.2 日志框架2.2.1 门面 / 外观 模式 2.3 日志级别2.3.1 六大分类2.3.2 使用 2.4 日志级别配置2.5 日志的持久化2.6 日志文件分割2.7 日志文件格式2.8 Slf4j 简单打印日志 一、日志概述 ⽇志主要是为了发现问题, 分析问题, 定位问题…

代码随想录算法训练营第34天 | 62.不同路径 63. 不同路径 II 整数拆分 不同的二叉搜索树 (跳过)

62.不同路径 62. 不同路径 - 力扣(LeetCode) 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 代码随想录 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_b…

uniapp APP权限弹框

效果图 第一步 新建一个页面,设置透明 {"path": "pages/permissionDisc/permissionDisc","style": {"navigationBarTitleText": "","navigationStyle": "custom","app-plus": {&…

网络安全证书培训机构有哪些

一、前言少叙 记得刚入行的时候,想考一个证书来装装门面,结果发现费用太高了,比当时一个月的工资都高,感叹网络安全这帮人真舍得花钱,遂放弃。后来入职网络安全公司,考了一个CISP,在工作中逐渐…

torch.argsorttorch.gather

文章目录 1. 举例说明2. pytorch 代码 1. 举例说明 torch.argsort 的作用是可以将矩阵中的元素进行从小到大排序,得到对应的序号。假设我们有一个向量a表示如下 a [ 8 , 7 , 6 , 9 , 7 ] \begin{equation} a[8,7,6,9,7] \end{equation} a[8,7,6,9,7]​​ 那么从小…

JSON数据格式介绍

2.5 JSON 2.5.1.JSON格式的用途 在开发中凡是涉及到『跨平台数据传输』,JSON格式一定是首选 2.5.2.JSON格式的说明 1.JSON数据两端要么是{},要么是[] {}定义JSON对象[]定义JSON数组 2.JSON对象的格式是:json {key:value,key:value,...,ke…

(性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化

目录 性能测试工具 性能测试工具 jemeter环境搭建 jmeter的常用目录介绍 jmeter修改语言和主题--jmeter界面的汉化 jmeter元件 jmeter元件和组件的介绍 jmeter的作用域原则 jmeter的执行顺序 案例:执行顺序 jmeter使用案例 jmeter线程组的介绍 jmeter…

Qt程序基于共享内存读写CodeSys的变量

文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值6.Qt读写CodeSys的共享内存 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中&#xff0c…

大模型架构全景解析:从Transformer到未来计算范式

1. Transformer 架构 核心模型 GPT-4、BERT、T5、LLaMA、通义千问、文心ERNIE 关键技术 多头注意力:GPT-4 使用 96 头注意力位置编码创新:LLaMA 采用 RoPE(旋转位置编码),Claude 3 引入 ALiBi归一化优化&#xff1…

AI第一天 自我理解笔记--微调大模型

目录 1. 确定目标:明确任务和数据 2. 选择预训练模型 3. 数据预处理 (1) 数据清洗与格式化 (2) 划分数据集 (3) 数据加载与批处理 4. 构建微调模型架构 (1) 加载预训练模型 (2) 修改模型尾部(适配任务) (3) 冻结部分层(可…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分…

[C++面试] 关于deque

一、入门 1、deque与vector的区别 deque的迭代器包含以下信息: 当前缓冲区指针(current_buffer)当前元素在缓冲区内的位置(current)中控器的位置(map) 每次移动迭代器时,需检查是…

服务性能防腐体系:基于自动化压测的熔断机制

01# 背景 在系统架构的演进过程中,项目初始阶段都会通过压力测试构建安全护城河,此时的服务性能与资源水位保持着黄金比例关系。然而在业务高速发展时期,每个冲刺周期都被切割成以业务需求为单位的开发单元,压力测试逐渐从必选项…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序,虽然不是特别复杂的游戏,但是是第一次写,肯定要记录一下了,哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏,类似下…

【k8s002】k8s健康检查与故障诊断

k8s健康检查与故障诊断 ‌一、集群状态检查‌ ‌检查节点健康状态‌ kubectl get nodes -o wide # 查看节点状态及基本信息 kubectl describe node <node-name> # 分析节点详细事件&#xff08;如资源不足、网络异常&#xff09; kubectl top nodes …