# OpenAI 格式的工具

URL: https://docs.router.ezat.io/zh/tools/openai-tools

> 把可以自定义 OpenAI base URL 的工具和库（Cline、Continue、LangChain、Vercel AI SDK、LiteLLM）指向 EZAT Router。

## 何时阅读本页

你使用的工具或库支持 OpenAI 的 API 格式，并允许修改 base URL。本页先给出所有这类工具都需要的三个值，再给出我们验证过的工具的设置。在你自己的代码中使用，见 [OpenAI 兼容 API](https://docs.router.ezat.io/zh/openai/base-url.md)。

## 三个值

| 设置 | 值 |
| --- | --- |
| Base URL（也叫 API base、endpoint 或 server URL） | `https://api.router.ezat.io/openai/v1` |
| API key | 你的 EZAT key（`ezat_sk_…`） |
| 模型 | [模型](https://docs.router.ezat.io/zh/models.md)中的一个 id，例如 `anthropic/claude-sonnet-5-5` |

- Base URL 以 `/v1` 结尾。工具会自己在后面加上 `/chat/completions`。
- 工具必须使用 **Chat Completions**。EZAT 还没有 OpenAI 的 Responses API，所以只调用 `/responses` 的工具会收到 `404`。OpenAI 的 Codex CLI 就是这样：它的自定义 provider 只支持 Responses API。
- 如果工具要求填写模型的上下文窗口或输出上限：从[模型](https://docs.router.ezat.io/zh/models.md)页面获取。
- 工具调用、流式输出和图片都可用。EZAT 上没有 embeddings、图片生成和音频。

配置工具之前，可以先用这三个值列出模型，检查它们是否正确：

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

## Cline

在编辑器的 Cline 面板中打开设置（齿轮图标）：

| 字段 | 值 |
| --- | --- |
| API Provider | OpenAI Compatible |
| Base URL | `https://api.router.ezat.io/openai/v1` |
| API Key | 你的 EZAT key |
| Model ID | `anthropic/claude-sonnet-5-5`，或[模型](https://docs.router.ezat.io/zh/models.md)中的其他 id |

在 Model Configuration 下，根据[模型](https://docs.router.ezat.io/zh/models.md)页面设置 Context Window 和 Max Output Tokens；如果要发送图片，打开 Image Support。

## Continue

在 Continue 的 `config.yaml` 中添加一个模型：

```yaml title="config.yaml"
models:
  - name: EZAT Router
    provider: openai
    model: anthropic/claude-sonnet-5-5
    apiBase: https://api.router.ezat.io/openai/v1
    apiKey: ezat_sk_…
    useResponsesApi: false
```

`useResponsesApi: false` 让 Continue 使用 Chat Completions。含有 key 的文件不要纳入版本控制。

## LangChain

Python，使用 `langchain-openai` 包：

```python
import os

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="anthropic/claude-sonnet-5-5",
    base_url="https://api.router.ezat.io/openai/v1",
    api_key=os.environ["EZAT_API_KEY"],
)
print(llm.invoke("Say hello in five words.").content)
```

- 不要设置 `use_responses_api=True`，并避免使用会让 `ChatOpenAI` 切换到 Responses API 的功能。
- LangChain 的文档说明，`ChatOpenAI` 面向的是 OpenAI 自己的 API，不会保留其他提供方返回的非标准响应字段。回答、工具调用和标准 token 数都属于标准字段。

## Vercel AI SDK

使用 `@ai-sdk/openai` 时，用 EZAT 的 base URL 创建一个 provider，并使用 `.chat()`：provider 默认的模型工厂调用的是 Responses API，而 `.chat()` 调用的是 Chat Completions。

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

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

const { text } = await generateText({
  model: ezat.chat("anthropic/claude-sonnet-5-5"),
  prompt: "Say hello in five words.",
});
console.log(text);
```

`@ai-sdk/openai-compatible` 也可以使用，并且始终使用 Chat Completions。它的 `includeUsage: true` 选项会在流中请求 token 数：

```ts
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";

const ezat = createOpenAICompatible({
  name: "ezat",
  baseURL: "https://api.router.ezat.io/openai/v1",
  apiKey: process.env.EZAT_API_KEY,
  includeUsage: true,
});
const model = ezat("anthropic/claude-sonnet-5-5");
```

## LiteLLM

在 Python SDK 中，给模型加上 `openai/` 前缀，让 LiteLLM 把 EZAT 当作 OpenAI 兼容端点，并把 base URL 作为 `api_base` 传入：

```python
import os

from litellm import completion

response = completion(
    model="openai/anthropic/claude-sonnet-5-5",
    api_base="https://api.router.ezat.io/openai/v1",
    api_key=os.environ["EZAT_API_KEY"],
    messages=[{"role": "user", "content": "Say hello in five words."}],
)
print(response.choices[0].message.content)
```

在 LiteLLM proxy 的 `config.yaml` 中，`os.environ/…` 会从环境变量读取 key：

```yaml title="config.yaml"
model_list:
  - model_name: ezat-default
    litellm_params:
      model: openai/anthropic/claude-sonnet-5-5
      api_base: https://api.router.ezat.io/openai/v1
      api_key: os.environ/EZAT_API_KEY
```

`api_base` 保持原样，以 `/v1` 结尾；LiteLLM 会补上路径的其余部分。

## 未列出的工具

任何允许设置自定义 OpenAI base URL、API key 和模型名称，并调用 Chat Completions 的工具，用上面三个值应该都能使用。如果某个工具还提供可以自定义 base URL 的 Anthropic provider，你也可以改用它，配合 `https://api.router.ezat.io` 使用（见 [Anthropic Messages API](https://docs.router.ezat.io/zh/anthropic/messages.md)）。

## 给 AI agent 的说明

1. Base URL 为 `https://api.router.ezat.io/openai/v1`，key 来自 `EZAT_API_KEY`，模型 id 来自 `GET https://api.router.ezat.io/openai/v1/models`。
2. 把工具配置为使用 Chat Completions。不要选择 Responses API 模式；只支持 Responses API 的工具（包括 OpenAI 的 Codex CLI）无法使用。
3. 不要把 key 写进会被提交的文件。工具支持环境变量或 secret 引用时，优先使用它们。
4. 先用上面的 curl 请求确认，再怀疑工具本身。