quickstart

阅读约 8 分钟

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 以获取内置多轮循环和工具执行
© 2026 OpenRouter.help
查看官方英文原件