要实现实时逐字显示ai回复,后端必须支持流式输出:火山引擎需选用标注“支持流式响应”或含/stream路径的接口;fastapi可用streamingresponse封装异步流或手动构造sse格式;前端fetch需读取body.reader并逐帧解析json提取content追加显示。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在前端页面上实时看到AI回复逐字出现,而不是等整段文字生成完才一次性显示,必须让后端API支持流式输出。火山引擎的多数大模型和语音类服务(如DeepSeek、豆包语音、双向TTS)原生提供流式能力,但需严格按协议封装响应,否则前端fetch拿不到分块数据。
确认服务是否支持流式
打开火山引擎控制台 → 进入对应服务(如「大模型推理」或「语音合成」)→ 查看API文档中是否明确标注“支持流式响应”或出现 【stream=true】 参数选项。若文档里只有 /v1/chat/completions 这类路径且无stream字段,说明该接入点不支持流式,需切换到标注了 bidirection 或 /stream 后缀的专用接口。
不支持流式的接入点强行加 stream=true 会导致400错误或静默失败,不会报错但前端收不到任何数据。
后端启用流式传输(以FastAPI为例)
方法一:使用StreamingResponse返回迭代器
在路由函数中,用async def定义接口,调用火山引擎SDK时传入 stream=True,再将返回的异步生成器包装为StreamingResponse:
from fastapi import Response
from fastapi.responses import StreamingResponse
import httpx
async def chat_stream():
async with httpx.AsyncClient() as client:
async with client.stream("POST", "https://ark.cn-beijing.volces.com/api/v4/chat/completions",
headers={"Authorization": f"Bearer {VOLC_API_KEY}"},
json={"model": "deepseek-chat", "messages": [...], "stream": True}) as resp:
async for chunk in resp.aiter_bytes():
yield chunk
方法二:手动构造SSE格式(兼容性更强)
若SDK不直接暴露流式迭代器,可手动解析火山引擎返回的每帧JSON,按Server-Sent Events标准拼接:
每条数据必须以 data: 开头,结尾双换行;遇到 [DONE] 时发送 event: close 并终止连接。
【关键】必须设置 response.headers["Content-Type"] = "text/event-stream; charset=utf-8",否则浏览器fetch会等待完整响应才触发ondata。
前端用fetch接收流式数据
第一步:发起fetch请求,指定method: 'POST',body携带含stream: true的JSON
第二步:获取response.body.getReader(),进入循环读取
第三步:对每次read()返回的value,用TextDecoder().decode()转成字符串,再用JSON.parse()提取content字段
注意:火山引擎流式响应中,每个chunk是独立JSON对象,不是JSON数组,不能一次性parse整个流。必须逐帧解码,否则会因JSON格式错误中断解析。
第四步:将提取出的文字追加到页面元素innerHTML末尾,实现打字机效果
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











