英伟达发布开源大模型Nemotron 3 Super

Streaming 流式输出实战:用 OpenAI SDK 兼容接口实现逐字打印

Streaming · 流式输出 · OpenAI SDK · 教程 · SSE阅读时间:8 分钟发表时间:2026.07.08
Streaming 流式输出实战:用 OpenAI SDK 兼容接口实现逐字打印

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 兼容层是统一的。

前置准备

  1. 注册 Code0 账号:https://console.code0.ai/console/dashboard
  2. 获取 API Key(控制台 → API Keys → 创建)
  3. 安装 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-8gpt-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.contentNoneType 错误? → 必须判空。首尾 chunk 的 content 常为 None
  • Q: 想中途取消生成? → 前端 es.close(),后端在生成器里捕获客户端断开即可停止拉流,未生成的部分不会计费。
  • Q: 换个模型试试? → 只改 model 字段。Code0 上 300+ 模型的流式接口在 OpenAI 兼容层是统一的,代码不用动。

小结

流式输出是提升 AI 应用体验最直接的一步,代码改动极小——一个 stream=True 加一层 SSE 转发就够了。用 Code0 的 OpenAI 兼容接口,你还能在同一套流式代码里自由切换底层模型。去 控制台 拿个 Key 就能开跑。