---
title: "Vercel AI SDK"
description: "用 Vercel AI SDK（TypeScript）调用 pirouter：通过 @ai-sdk/openai 的 createOpenAI 把 baseURL 指向 https://api.pirouter.ai/v1，配合 generateText 与 streamText 使用。本页说明怎么安装、配置、验证，以及常见报错怎么处理。"
canonical: "https://pirouter.ai/zh/docs/integrations/vercel-ai-sdk"
last-updated: "2026-10-17"
lang: "zh"
source: "content/docs/zh/integrations/vercel-ai-sdk.mdx"
---

# Vercel AI SDK

用 Vercel AI SDK（TypeScript）调用 pirouter：通过 @ai-sdk/openai 的 createOpenAI 把 baseURL 指向 https://api.pirouter.ai/v1，配合 generateText 与 streamText 使用。本页说明怎么安装、配置、验证，以及常见报错怎么处理。

Vercel AI SDK 通过它的 OpenAI provider（`@ai-sdk/openai`）调用 pirouter：用 `createOpenAI` 建一个指向 pirouter 的 provider，之后照常用 `generateText`、`streamText`。

## 前提

- 一把 pirouter API key。还没有的话，按[快速开始](https://pirouter.ai/zh/docs/quickstart.md)创建一个，并存进环境变量：

```bash
export PIROUTER_API_KEY="sk-pi-..."
```

- Node.js 22 及以上。
- 安装 SDK 和 OpenAI provider：

```bash
pnpm add ai @ai-sdk/openai zod
```

示例用了顶层 `await`，把文件存成 `.mjs`，或者在 `package.json` 里设 `"type": "module"`。

## 配置

`createOpenAI` 传两项：`baseURL` 填 `https://api.pirouter.ai/v1`，`apiKey` 填你的 pirouter key。provider 把 key 放在 `Authorization: Bearer` 请求头里发出，网关从这个头读 key。

```ts
import { createOpenAI } from '@ai-sdk/openai'
import { generateText } from 'ai'

const pirouter = createOpenAI({
  baseURL: 'https://api.pirouter.ai/v1',
  apiKey: process.env.PIROUTER_API_KEY,
})

const { text } = await generateText({
  model: pirouter.chat('openai/gpt-6-sol'),
  prompt: 'Hello!',
})
console.log(text)
```

示例用 `pirouter.chat(...)` 选模型，请求发到 Chat Completions。直接写 `pirouter(...)` 时，provider 默认改发到 Responses。两个端点网关都提供：`POST /v1/chat/completions` 和 `POST /v1/responses`。

模型 ID 写 `vendor/model` 全名。能用的模型与 OpenAI SDK 相同，见[模型与协议](https://pirouter.ai/zh/docs/models.md#每个模型接受哪些协议)的协议表里 OpenAI 一列。

### 流式输出

用 `streamText`，从 `textStream` 逐段读出文字：

```ts
import { createOpenAI } from '@ai-sdk/openai'
import { streamText } from 'ai'

const pirouter = createOpenAI({
  baseURL: 'https://api.pirouter.ai/v1',
  apiKey: process.env.PIROUTER_API_KEY,
})

const result = streamText({
  model: pirouter.chat('openai/gpt-6-sol'),
  prompt: 'Hello!',
})
for await (const text of result.textStream) {
  process.stdout.write(text)
}
console.log()
```

你应该看到回复一段一段地打印出来。

## 验证

把上面 `generateText` 的示例存成 `main.mjs`，然后运行：

```bash
node main.mjs
```

你应该看到模型的一句回复。

打开控制台的 **日志**，请求发出后几秒，这次请求出现在列表里，**端点** 一栏是 `/v1/chat/completions`。日志详情里的 **Trace ID** 与这次响应的 `X-Pi-Trace-Id` 响应头是同一个值。

## 排障

### 401 invalid\_api\_key

返回 `401`，错误码 `invalid_api_key`，`message` 是 "You didn't provide an API key. Provide it in an Authorization header using Bearer auth (Authorization: Bearer YOUR\_KEY)."：请求没带上 key，或者带的不是以 `sk-pi-` 开头的 pirouter key。确认运行代码的那个终端里设置了 `PIROUTER_API_KEY`。不传 `apiKey` 时 provider 会改读 `OPENAI_API_KEY`，那里通常是 OpenAI 的 key。

### 400 model is required

返回 `400`，错误码 `invalid_request`，`message` 是 `model is required`：`baseURL` 多半填成了 `https://api.pirouter.ai`，漏了 `/v1`。这时请求的路径不是网关提供的端点，网关从中取不到模型。把 `baseURL` 改成 `https://api.pirouter.ai/v1`。

### 422 validation\_failed

返回 `422`，错误码 `validation_failed`，`message` 以 "This model is not served on the endpoint you called." 开头：这个模型不在你调用的端点上提供，例如生图模型。`message` 后半句列出它提供的端点；换一个在 OpenAI 协议下提供文本生成的模型。

## 目前没有验证的用法

- 用 `pirouter(...)`（Responses 端点）做多轮对话没有验证过。多轮对话请用 `pirouter.chat(...)`，每一轮把完整的消息历史发过去。
- Anthropic provider（`@ai-sdk/anthropic`）与 Google provider（`@ai-sdk/google`）指向 pirouter 的配置没有验证过，本页不给出。要用 Claude 或 Gemini 模型，用上面的 OpenAI provider，或者改用 [Anthropic SDK](https://pirouter.ai/zh/docs/integrations/anthropic-sdk.md)、[Google GenAI SDK](https://pirouter.ai/zh/docs/integrations/google-genai-sdk.md)。
