Streaming 流式输出实战:用 OpenAI SDK 兼容接口实现逐字打印
本站为独立第三方技术服务平台,提供多模型 API 聚合接入服务,与 Anthropic、OpenAI、Google 等模型提供商无任何关联、授权或合作关系。
TL;DR
- 流式输出(Streaming)让模型边生成边返回,用户不用等整段回答生成完,体验接近 ChatGPT 那种"逐字冒出来"。
- 用 OpenAI SDK 只需加一个
stream=True参数,接入 Code0 只改base_url。 - 本文给出 Python、JavaScript 两端完整代码,以及前后端打通的 SSE 转发思路和异常处理要点。
- 换模型只改
model字段——Claude、GPT、Gemini 的流式接口在 OpenAI 兼容层是统一的。
前置准备
- 注册 Code0 账号:https://console.code0.ai/console/dashboard

- 获取 API Key(控制台 → API Keys → 创建)
- 安装 SDK:
pip install openai # Python npm install openai # Node.js
为什么要用流式输出
一段长回答,模型可能要生成几秒到几十秒。非流式模式下,用户盯着空白屏幕干等,直到全部生成完才一次性显示——体感很差,还容易让人以为卡死了。
流式模式下,模型每生成一小块(一个或几个 token)就立即返回,前端逐字渲染。首字延迟大幅缩短,用户第一时间看到反馈。对话类、写作类、代码生成类应用几乎都该开流式。
步骤拆解
步骤 1:填写接入参数
-
Base URL:
https://hk.code0.ai/v1 -
API Key: 你在控制台获取的 Key

-
Model:
claude-opus-4-8或gpt-5.4(按需选择)
步骤 2:Python 端逐 token 打印
关键就是 stream=True,然后遍历返回的 chunk:
from openai import OpenAI
client = OpenAI(
base_url="https://hk.code0.ai/v1",
api_key="sk-你的Key", # 在 console.code0.ai 获取
)
stream = client.chat.completions.create(
model="claude-opus-4-8", # 换 gpt-5.4 / gemini-3-pro 只改这行
messages=[{"role": "user", "content": "用三句话解释什么是流式输出"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True) # flush 确保逐字刷新到终端
print()
注意两点:delta.content 可能为 None(首个 chunk 或结束 chunk),要判空;flush=True 保证终端立即刷新,不然会被缓冲攒着一起显示。
步骤 3:JavaScript / Node.js 端
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://hk.code0.ai/v1",
apiKey: "sk-你的Key",
});
const stream = await client.chat.completions.create({
model: "claude-opus-4-8",
messages: [{ role: "user", content: "用三句话解释什么是流式输出" }],
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}
步骤 4:前后端打通(SSE 转发)
真实 Web 应用里,API Key 不能暴露给前端,所以要在后端做一层转发:后端接收模型的流,再通过 SSE(Server-Sent Events)推给浏览器。
FastAPI 示例:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from openai import OpenAI
app = FastAPI()
client = OpenAI(base_url="https://hk.code0.ai/v1", api_key="sk-你的Key")
@app.get("/chat")
def chat(q: str):
def event_stream():
stream = client.chat.completions.create(
model="claude-opus-4-8",
messages=[{"role": "user", "content": q}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
yield f"data: {delta}\n\n" # SSE 格式
yield "data: [DONE]\n\n"
return StreamingResponse(event_stream(), media_type="text/event-stream")
前端用原生 EventSource 接收:
const es = new EventSource("/chat?q=你好");
es.onmessage = (e) => {
if (e.data === "[DONE]") { es.close(); return; }
document.getElementById("output").textContent += e.data;
};
完整代码示例
把 Python 后端和前端拼起来就是一个最小可用的流式聊天页。核心逻辑就三块:stream=True 拿到流、后端 yield 转 SSE、前端 EventSource 逐条渲染。
常见问题
- Q: 输出不是逐字出现,而是一次性全出来?
→ 检查
flush=True(终端)或后端有没有做缓冲。有些反向代理会缓冲 SSE,需要关掉对应 buffering。 - Q:
delta.content报NoneType错误? → 必须判空。首尾 chunk 的 content 常为None。 - Q: 想中途取消生成?
→ 前端
es.close(),后端在生成器里捕获客户端断开即可停止拉流,未生成的部分不会计费。 - Q: 换个模型试试?
→ 只改
model字段。Code0 上 300+ 模型的流式接口在 OpenAI 兼容层是统一的,代码不用动。
小结
流式输出是提升 AI 应用体验最直接的一步,代码改动极小——一个 stream=True 加一层 SSE 转发就够了。用 Code0 的 OpenAI 兼容接口,你还能在同一套流式代码里自由切换底层模型。去 控制台 拿个 Key 就能开跑。



