# 快速开始

URL: https://docs.router.ezat.io/zh/quickstart

> 注册、充值、创建 API key，并用 curl、Python 或 TypeScript 发送第一个请求。

## 何时阅读本页

用本页在几分钟内从零开始，完成一个能跑通的请求。页面最后给出了用 Anthropic SDK 和 OpenAI SDK 发送同一请求的写法。

## 开始之前

你需要一张用于充值的银行卡，以及 curl、Python 3 或 Node.js 中的任意一个。

## 设置账户和 key

<Steps>
<Step>

### 登录

打开 `https://router.ezat.io/zh`，选择**开始使用**或**登录**。可以用 GitHub 或 Google 登录，也可以输入邮箱后选择**发送验证码**，再输入邮件中的 6 位验证码。首次登录会创建你的账户。

你的账户一开始有一个以你命名的组织，你是它的所有者。组织持有你的余额、key 和用量（见[组织和成员](https://docs.router.ezat.io/zh/organizations.md)）。

</Step>
<Step>

### 充值

如果当前有注册赠送额度，登录页面上会写明，这笔额度会加到你第一个组织的余额中。否则余额从零开始，在你充值之前，请求都会被拒绝并返回 `402`。

1. 在侧边栏打开**账单**。当前余额显示在顶部。
2. 在**充值**下选择一个金额，或者选择**自定义**并输入金额（5 到 5,000 美元）。
3. 选择**前往支付**，在 Stripe 的页面上付款。

付款几秒钟后额度就会到账。额度永不过期。所有者、管理员和财务可以充值；请求如何计费见[计费方式](https://docs.router.ezat.io/zh/billing.md)。

</Step>
<Step>

### 创建 API key

1. 打开 **API Key**，选择**创建 key**。
2. 填写一个好认的**名称**，比如会使用这个 key 的应用或机器。你还可以设置**消费上限**，在**可用模型**中把 key 限定为部分模型，或者在**有效期**中选择何时过期。见 [API key](https://docs.router.ezat.io/zh/api-keys.md)。
3. 选择**创建 key**。
4. 在**保存你的 key** 中复制 key，并保存在安全的地方，比如密码管理器。然后选择**我已保存这个 key**。

<Callout type="warn" title="完整的 key 只显示一次">
EZAT Router 只保存它的哈希值。如果你丢失了 key，请创建一个新的，并吊销旧的。
</Callout>

</Step>
<Step>

### 把 key 放进环境变量

本文档中的每个示例都从 `EZAT_API_KEY` 读取 key：

```bash title="Terminal"
export EZAT_API_KEY="ezat_sk_…"
```

把 `ezat_sk_…` 换成你自己的 key。这条 export 只在当前终端会话中有效；要长期保留，把这一行加到你的 shell 配置文件中（例如 `~/.zshrc` 或 `~/.bashrc`），或者使用你的密钥管理工具。不要把 key 提交到 git，也不要放进前端代码（见[认证](https://docs.router.ezat.io/zh/authentication.md)）。

</Step>
</Steps>

## 发送第一个请求

下面用 curl 调用 Anthropic Messages API：

```bash tab="curl" test
curl --fail-with-body -sS https://api.router.ezat.io/v1/messages \
  -H "x-api-key: $EZAT_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-5-5",
    "max_tokens": 64,
    "messages": [{"role": "user", "content": "Say hello in five words."}]
  }'
```

响应是一条标准的 Anthropic message。其中 `model` 字段是你发送的名称，`usage` 字段给出了计费所依据的 token 数。几秒钟内，这个请求也会出现在**用量**页面上。

如果返回的是错误，响应体会说明原因。常见的是 `401`（key 没有设置或不正确）和 `402`（没有余额）。见[故障排查](https://docs.router.ezat.io/zh/troubleshooting.md)。

## 列出模型

```bash tab="curl" test
curl --fail-with-body -sS https://api.router.ezat.io/v1/models \
  -H "x-api-key: $EZAT_API_KEY"
```

每个条目的 `id` 就是你作为 `model` 发送的值。id 的格式是 `author/model`，例如 `anthropic/claude-sonnet-5-5`。Anthropic 自己的模型名称也可以用。所有 id、它们的其他名称和限制见[模型](https://docs.router.ezat.io/zh/models.md)。

## 使用 SDK

Anthropic SDK 无需修改即可使用：把 base URL 设为 `https://api.router.ezat.io`，并使用你的 EZAT Router key。用 `pip install anthropic` 或 `npm install @anthropic-ai/sdk` 安装。

```python tab="Python" test
import os

import anthropic

client = anthropic.Anthropic(
    base_url="https://api.router.ezat.io",
    api_key=os.environ["EZAT_API_KEY"],
)

message = client.messages.create(
    model="anthropic/claude-sonnet-5-5",
    max_tokens=64,
    messages=[{"role": "user", "content": "Say hello in five words."}],
)
print("".join(block.text for block in message.content if block.type == "text"))
```

```ts tab="TypeScript" test
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({
  baseURL: "https://api.router.ezat.io",
  apiKey: process.env.EZAT_API_KEY,
});

const message = await client.messages.create({
  model: "anthropic/claude-sonnet-5-5",
  max_tokens: 64,
  messages: [{ role: "user", content: "Say hello in five words." }],
});

for (const block of message.content) {
  if (block.type === "text") console.log(block.text);
}
```

### 使用 OpenAI SDK

如果你的代码或工具使用 OpenAI 的格式，请使用兼容 OpenAI 的 base URL `https://api.router.ezat.io/openai/v1`，key 不变。用 `pip install openai` 或 `npm install openai` 安装 SDK。

```python tab="Python" test
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://api.router.ezat.io/openai/v1",
    api_key=os.environ["EZAT_API_KEY"],
)

completion = client.chat.completions.create(
    model="anthropic/claude-sonnet-5-5",
    max_tokens=64,
    messages=[{"role": "user", "content": "Say hello in five words."}],
)
print(completion.choices[0].message.content)
```

```ts tab="TypeScript" test
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.router.ezat.io/openai/v1",
  apiKey: process.env.EZAT_API_KEY,
});

const completion = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-5-5",
  max_tokens: 64,
  messages: [{ role: "user", content: "Say hello in five words." }],
});
console.log(completion.choices[0].message.content);
```

兼容 OpenAI 的 API 支持哪些内容，见 [Chat Completions](https://docs.router.ezat.io/zh/openai/chat-completions.md)。

## 下一步

<Cards>
  <Card title="Claude Code" href="/tools/claude-code">
    设置两个环境变量，Claude Code 就会使用你的余额运行。
  </Card>
  <Card title="OpenAI 格式的工具" href="/tools/openai-tools">
    Cursor、Cline、LangChain 以及其他可以填写 OpenAI base URL 的工具。
  </Card>
  <Card title="Anthropic Messages" href="/anthropic/messages">
    流式输出、token 计数、提示缓存（prompt caching）和请求头。
  </Card>
  <Card title="API key" href="/api-keys">
    消费上限、模型列表、有效期和吊销。
  </Card>
  <Card title="计费方式" href="/billing">
    一个请求花多少钱，余额如何变化。
  </Card>
  <Card title="错误" href="/reference/errors">
    所有错误类型，以及是否应该重试。
  </Card>
</Cards>

## 给 AI agent 的说明

1. 不要替用户注册、付款或创建 key：这些由用户本人在控制台 `https://router.ezat.io/zh` 中完成。
2. 询问用户哪个环境变量保存了他们的 key（按惯例是 `EZAT_API_KEY`）。不要让用户把 key 粘贴到对话里，也不要打印它。
3. 用 `GET https://api.router.ezat.io/v1/models`（请求头 `x-api-key: $EZAT_API_KEY`）检查 key。`200` 表示可用；`401` 表示 key 缺失、输错或已被吊销。
4. 用列表中的一个模型 id，向 `POST https://api.router.ezat.io/v1/messages` 发送一个小请求（`max_tokens` 不超过 64）。`402` 表示组织没有余额：告诉用户在**账单**页面充值，然后停止，不要重试。
5. Anthropic 格式的客户端用 `https://api.router.ezat.io`，OpenAI 格式的客户端用 `https://api.router.ezat.io/openai/v1`。不要在前者后面加 `/v1`。