要实现千问ai回复的打字机效果,必须开启流式输出:api调用需设stream:true,后端按sse协议返回data:xxx\n\n格式数据,前端用eventsource或fetch+readablestream接收并逐字符渲染。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你想让千问AI的回复像打字机一样逐字出现,而不是等十几秒后突然弹出整段文字,就必须开启流式输出功能。这需要前后端协同配置,缺一不可,且任意一环设置错误都会导致流式失效,变成传统“卡顿式”响应。
确认API接口支持stream参数
调用千问API时,必须显式传入 【stream: true】 字段,否则服务端默认按非流式模式处理,即使你前端用EventSource监听也收不到分块数据。
使用 DashScope SDK 时,在 Generation.call() 中添加 stream=True 参数;若直接调用 REST API,则需在 JSON 请求体中加入 "stream": true 字段。
注意:不是所有模型都支持流式。qwen-turbo、qwen-plus、qwen-max 均支持,但 qwen-14b-chat 等部分开源模型镜像可能不支持,调用前请查阅对应模型文档。
后端返回必须符合SSE协议格式
方法一:使用 Spring Boot + SseEmitter
控制器方法需标注 produces = MediaType.TEXT_EVENT_STREAM_VALUE,并返回 SseEmitter 对象;每次调用 emitter.send(SseEmitter.event().data(chunk)) 推送文本块;最后必须调用 emitter.complete() 关闭连接,否则浏览器会一直等待。
方法二:使用 Python FastAPI + StreamingResponse
定义生成器函数,每 yield 一个字符串片段(如 yield f"data: {text}\n\n"),并设置 response_media_type="text/event-stream";关键点是每段数据末尾必须有 【两个连续换行符 \n\n】,否则前端 EventSource 无法正确解析事件边界。
方法三:Node.js 代理层手动构造
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
设置 res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); 向客户端 write 数据时,严格按 data:xxx\n\n 格式输出;务必调用 res.flush() 强制推送,否则数据会滞留在缓冲区。
前端接收与渲染流式数据
第一步:选择通信方式
若后端端点只支持 GET 且无需认证头,用原生 EventSource 最简单:const es = new EventSource('/api/stream');
第二步:处理跨域与认证
如果需要携带 Authorization 或 Cookie,EventSource 无法满足——它不支持自定义 headers。此时必须改用 fetch + ReadableStream:发起 POST 请求时带上 headers,再通过 response.body.getReader() 读取流。
第三步:逐块解码与清理
服务端推送的 data:hello\n\n 需要去掉 data: 前缀和末尾 \n\n;用 TextDecoder.decode(chunk.value, {stream: true}) 解码 UTF-8;遇到空行或重复 data: 字段要跳过,否则会导致 DOM 插入乱码。
第四步:实现打字机效果
不要直接把整块文本 append 到页面——那样就失去流式意义。应将每个 chunk 拆成单字符或按中文标点切分,用 requestAnimationFrame 控制插入节奏,避免阻塞渲染线程。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










