从等待30秒到首字1秒 - 用Node.js流式调用AI模型,把体感延迟降下来
为什么独立开发者应该关心“流式”
先说一组我自己项目里的前后对比(个人实测,非供应商数据):
- 非流式调用:一段约800字的生成任务,用户盯着空白加载动画等待20~35秒,中途流失率明显偏高;
- 流式调用:首字延迟通常在1秒左右,文字逐段出现,用户感知的“响应时间”从30秒级降到1秒级。
对独立开发者和小团队来说,这个改动几乎没有成本——只是换一种读取响应的方式,服务器算力、API计费逻辑都不变(具体计费规则以官网价格页为准),但产品体验是质变。尤其是客服回复、文章摘要、代码解释这类长文本场景,流式几乎是必选项。
Node.js 天生就是干这个的:事件驱动、异步I/O,处理流式数据是它的主场。这篇文章带你从注册到跑通第一段代码,全程不超过15分钟。
第一步:注册并获取 API Key
- 打开 ThisToken.AI 的注册页面(文末有链接),用邮箱注册一个账号;
- 登录后进入控制台,在「API Keys」页面创建一个新密钥;
- 立刻复制并保存——密钥通常只完整显示一次,丢了只能重新生成。
安全提醒:不要把 Key 写死在代码里提交到 Git 仓库。推荐用环境变量:
export THISTOKEN_API_KEY="sk-你的密钥"Windows 用户可以用 set 或写在 .env 文件里配合 dotenv 使用。
第二步:理解流式到底“流”的是什么
普通调用:请求 → 等模型把整段生成完 → 一次性返回完整结果。
流式调用:请求 → 服务端以 SSE(Server-Sent Events)格式把生成过程逐块推送回来 → 每收到一块就立刻展示一块。
对前端用户来说,就是从“转圈圈”变成“打字机效果”。而你要做的代码改动,核心只有一处:把“等完整响应”改成“监听数据块事件”。
第三步:跑通第一段代码
创建项目并安装依赖(这里用 OpenAI 兼容的 SDK,只需换 baseURL 即可接入 ThisToken.AI):
mkdir stream-demo && cd stream-demo
npm init -y
npm install openai创建 index.js,完整代码如下,可直接复制运行:
import OpenAI from "openai";
// 关键:通过 baseURL 指向 ThisToken.AI 的接口地址
const client = new OpenAI({
apiKey: process.env.THISTOKEN_API_KEY,
baseURL: "https://api.thistoken.ai/v1",
});
async function main() {
const stream = await client.chat.completions.create({
model: "gpt-4o-mini", // 模型名称以控制台支持列表为准
messages: [{ role: "user", content: "用三段话解释什么是SSE流式传输" }],
stream: true, // 核心开关:开启流式
});
const start = Date.now();
let firstChunkTime = null;
let full = "";
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content ?? "";
if (delta && !firstChunkTime) {
firstChunkTime = ((Date.now() - start) / 1000).toFixed(2);
console.log(`\n[首字延迟: ${firstChunkTime}s]\n`);
}
process.stdout.write(delta); // 逐块打印,打字机效果
full += delta;
}
console.log(`\n\n[总耗时: ${((Date.now() - start) / 1000).toFixed(2)}s,共 ${full.length} 字]`);
}
main().catch(console.error);运行:
node index.js如果一切正常,你会先看到 [首字延迟: x.xx秒],然后文字一段段“流”出来——这就是流式的全部核心。对比一下你之前非流式调用同样问题的等待时间,体感差异一目了然。
这段代码额外打印了首字延迟和总耗时。建议你保留这两个指标,接入业务后持续观察——它是衡量用户体验最直接的数字。
常见踩坑清单
- 忘了设
baseURL:SDK 默认请求官方地址,密钥会直接报错。务必确认baseURL: "https://api.thistoken.ai/v1"。 stream: true没写:返回的是完整 JSON 对象而不是迭代器,for await会报错。- 在 Express 里直接
res.send():想在 Web 服务里转发流,需要设置响应头Content-Type: text/event-stream并用res.write()逐块写出,最后res.end()。 - 密钥泄露:再次强调,环境变量管理,别提交到仓库。
接到你的真实项目里
跑通 Demo 之后,接入现有项目通常只需半天以内的改造:把原来“调用→等待→返回”的接口改成流式透传,前端用 fetch + ReadableStream 接收即可。以我自己的经验,改造一个已有的长文本功能,从动手到上线大约2小时;换来的是用户侧等待体感从半分钟降到1秒——这可能是你性价比最高的一次技术升级。
现在就去注册一个账号,把上面那段代码跑起来:https://api.thistoken.ai/register
---
想直接跑通示例?访问 https://api.thistoken.ai/register 注册 ThisToken.AI,获取 API Key 后即可开始。