Quickstart: Build a Chat App
发送你的第一条消息并通过 OpenRouter SDK 流式传输响应
原文链接:https://openrouter.ai/docs/cookbook/get-started/quickstart
目标:通过构建一个通过 OpenRouter 发送消息和流式传输响应的 TypeScript 聊天应用来学习 OpenRouter 的基础知识。
结果:一个工作的多轮对话循环,可以通过更改单个字符串与平台上 600+ 模型中的任何一个对话。
前置条件
- Node.js 18+ 已安装
- OpenRouter API key — 在 openrouter.ai/settings/keys 创建一个或设置一个新的 Stripe project
1. 创建项目并安装 SDK
设置一个新的 Node.js 项目并添加 OpenRouter 客户端 SDK。SDK 仅为 ESM,因此将包类型设置为 module。安装 tsx 以便你可以直接运行 TypeScript 示例。
mkdir openrouter-chat && cd openrouter-chat
npm init -y
npm pkg set type=module
npm install @openrouter/sdk
npm install --save-dev tsx
2. 发送你的第一条消息
创建 chat.ts,其中包含客户端实例和单个 chat completion 请求。apiKey 从环境变量读取,这样你就永远不会硬编码凭据。
import { OpenRouter } from '@openrouter/sdk';
const client = new OpenRouter({
apiKey: process.env.OPENROUTER_API_KEY,
});
const completion = await client.chat.send({
chatRequest: {
model: 'google/gemini-3.1-flash-lite',
messages: [
{ role: 'user', content: 'Say hello in one sentence.' },
],
},
});
console.log(completion.choices[0]?.message.content);
console.log({
promptTokens: completion.usage?.promptTokens,
completionTokens: completion.usage?.completionTokens,
});
使用你的 API key 运行它:
OPENROUTER_API_KEY=sk-or-v1-... npx tsx chat.ts
你应该会看到一条文本响应打印到控制台。SDK 以驼峰命名法字段(如 promptTokens 和 completionTokens)返回 token 使用情况。completion.choices 数组遵循 Chat Completions 响应的相同形状。
3. 流式传输响应
流式传输在生成时返回文本,而不是等待完整响应。传递 stream: true 并迭代返回的异步可迭代对象。每个 chunk 包含一个新文本片段的 delta。
import { OpenRouter } from '@openrouter/sdk';
const client = new OpenRouter({
apiKey: process.env.OPENROUTER_API_KEY,
});
const stream = await client.chat.send({
chatRequest: {
model: 'google/gemini-3.1-flash-lite',
messages: [
{ role: 'user', content: 'Explain how routers work in three sentences.' },
],
stream: true,
},
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}
console.log();
文本现在增量打印。请参阅 Streaming 参考以了解完整的 SSE 事件格式。
4. 添加多轮对话
多轮通过在每次请求时发送完整的消息历史来工作。模型使用所有先前的消息作为上下文。在下一次调用之前,将每个用户输入和助手响应追加到 messages 数组。
import { OpenRouter } from '@openrouter/sdk';
import * as readline from 'node:readline';
const client = new OpenRouter({
apiKey: process.env.OPENROUTER_API_KEY,
});
const messages: { role: 'user' | 'assistant'; content: string }[] = [];
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
function ask(): void {
rl.question('You: ', async (input) => {
if (input.toLowerCase() === 'exit') {
rl.close();
return;
}
messages.push({ role: 'user', content: input });
const stream = await client.chat.send({
chatRequest: {
model: 'google/gemini-3.1-flash-lite',
messages,
stream: true,
},
});
let response = '';
process.stdout.write('Assistant: ');
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) {
process.stdout.write(delta);
response += delta;
}
}
console.log();
messages.push({ role: 'assistant', content: response });
ask();
});
}
ask();
运行文件并输入消息。模型会记住之前的轮次,因为每次请求都会发送完整的消息数组。输入 exit 退出。
5. 交换模型
OpenRouter 通过一个 API 让你访问数百个模型。更改模型字符串以切换 providers——无需其他代码更改。
// 使用 OpenAI 最新的聊天模型
model: 'openai/gpt-chat-latest',
// 使用 Anthropic Claude Sonnet 最新版
model: '~anthropic/claude-sonnet-latest',
// 使用免费模型
model: 'openrouter/free',
在 openrouter.ai/models 浏览所有可用模型,或以编程方式查询 Models API。
检查你的工作
npx tsx chat.ts向控制台打印流式响应- 多轮对话保持跨轮次的上下文(询问引用先前答案的后续问题)
- 更改模型字符串会切换到不同的 provider,无需其他代码更改
- 非流式响应包含带有 promptTokens 和 completionTokens 的 usage 对象
下一步
- 将编码 agent 连接到 OpenRouter
- 探索 Agent SDK 以获取内置多轮循环和工具执行