---
title: "Anthropic SDK"
description: "用 Anthropic 官方 SDK（Python 与 TypeScript）调用 pirouter，base URL 填 https://api.pirouter.ai（不带 /v1），API key 换成 pirouter 的 key。本页说明怎么安装、配置、验证，以及常见报错怎么处理，包括环境里的 ANTHROPIC_AUTH_TOKEN 导致的 401。"
canonical: "https://pirouter.ai/zh/docs/integrations/anthropic-sdk"
last-updated: "2026-10-17"
lang: "zh"
source: "content/docs/zh/integrations/anthropic-sdk.mdx"
---

# Anthropic SDK

用 Anthropic 官方 SDK（Python 与 TypeScript）调用 pirouter，base URL 填 https://api.pirouter.ai（不带 /v1），API key 换成 pirouter 的 key。本页说明怎么安装、配置、验证，以及常见报错怎么处理，包括环境里的 ANTHROPIC_AUTH_TOKEN 导致的 401。

Anthropic 官方 SDK 不需要插件就能调用 pirouter：创建客户端时把 base URL 换成 pirouter 的地址，把 key 换成 pirouter 的 key，其余代码不用改。

## 前提

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

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

- Python 3.10 及以上，或 Node.js 20 及以上。
- 安装 SDK：

Python:

```bash
pip install anthropic
```

TypeScript:

```bash
pnpm add @anthropic-ai/sdk
```

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

## 配置

创建客户端时传两项：`base_url`（TypeScript 是 `baseURL`）填 `https://api.pirouter.ai`，不带 `/v1`，SDK 会自己拼上 `/v1/messages`；`api_key`（TypeScript 是 `apiKey`）填你的 pirouter key。

SDK 把 key 放在 `x-api-key` 请求头里发出。`Authorization` 头为空时，网关读的就是这个头。

Python:

```python
import os
import anthropic

client = anthropic.Anthropic(
    base_url="https://api.pirouter.ai",
    api_key=os.environ["PIROUTER_API_KEY"],
)

message = client.messages.create(
    model="anthropic/claude-sonnet-5.5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}],
)
print(message.content[0].text)
```

TypeScript:

```ts
import Anthropic from '@anthropic-ai/sdk'

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

const message = await client.messages.create({
  model: 'anthropic/claude-sonnet-5.5',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Hello!' }],
})
console.log(message.content[0].text)
```

模型 ID 写 `vendor/model` 全名。能用哪些模型，见[模型与协议](https://pirouter.ai/zh/docs/models.md#每个模型接受哪些协议)的协议表里 Anthropic 一列：除 Claude 外，还有几家的模型接受 Anthropic 协议。

### 用环境变量

不传参数创建客户端时，SDK 读 `ANTHROPIC_BASE_URL` 和 `ANTHROPIC_API_KEY` 两个环境变量。设置一次，代码里写 `anthropic.Anthropic()`（TypeScript 是 `new Anthropic()`）即可：

`~/.zshrc`:

```bash
export ANTHROPIC_BASE_URL="https://api.pirouter.ai"
export ANTHROPIC_API_KEY="$PIROUTER_API_KEY"
```

### 流式输出

用 `client.messages.stream(...)` 发请求，文字随事件陆续到达：

Python:

```python
import os
import anthropic

client = anthropic.Anthropic(
    base_url="https://api.pirouter.ai",
    api_key=os.environ["PIROUTER_API_KEY"],
)

with client.messages.stream(
    model="anthropic/claude-sonnet-5.5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
print()
```

TypeScript:

```ts
import Anthropic from '@anthropic-ai/sdk'

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

const stream = client.messages.stream({
  model: 'anthropic/claude-sonnet-5.5',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Hello!' }],
})
stream.on('text', (text) => process.stdout.write(text))
await stream.finalMessage()
console.log()
```

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

## 验证

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

Python:

```bash
python main.py
```

TypeScript:

```bash
node main.mjs
```

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

打开控制台的 **日志**，请求发出后几秒，这次请求出现在列表里，**端点** 一栏是 `/v1/messages`。每个响应都带 `X-Pi-Trace-Id` 响应头，它和日志详情里的 **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`。

### 代码里传了 key，仍然返回 401

先看环境里有没有 `ANTHROPIC_AUTH_TOKEN`，用 Claude Code 的机器上常有这个变量：

```bash
echo "$ANTHROPIC_AUTH_TOKEN"
```

有值时，TypeScript SDK 即使在代码里传了 `apiKey`，也会把它放进 `Authorization: Bearer` 请求头一起发出；Python SDK 在代码没传 `api_key` 时读它。网关先读 `Authorization`，那里有值就不再看 `x-api-key`，值不是 pirouter key 就返回 `401`。

修法是运行前去掉这个变量，或者把它也设成 pirouter 的 key：

```bash
unset ANTHROPIC_AUTH_TOKEN
```

### base URL 带了 /v1

base URL 填成 `https://api.pirouter.ai/v1` 时，SDK 拼出来的路径是 `/v1/v1/messages`，请求失败。去掉 `/v1`，填 `https://api.pirouter.ai`。

### 422 validation\_failed

返回 `422`，错误码 `validation_failed`，`message` 以 "This model is not served on the endpoint you called." 开头：这个模型不接受 Anthropic 协议，例如 `openai/gpt-6-sol`。`message` 后半句列出它提供的端点。换一个协议表里 Anthropic 一列为「支持」的模型，或者改用 [OpenAI SDK](https://pirouter.ai/zh/docs/integrations/openai-sdk.md)。

## 目前没有验证的用法

- 网关只提供 `POST /v1/messages`。`client.messages.count_tokens` 用的 `POST /v1/messages/count_tokens` 目前没有，调用返回 `400` 和 `model is required`。
- Message Batches（`client.messages.batches`）目前没有。
