API 参考
Echo Token Station 的接入地址和认证、各 SDK 和工具的接入地址、可用的端点、格式转换、流式输出和主要参数。
Echo 的 API 支持 OpenAI 格式和 Anthropic 格式。本页说明端点(按功能区分的调用地址)、认证、流式输出和主要参数。请求和响应的细节,以各厂商的 API 文档为准。
接入地址与认证
| 格式 | 接入地址(base URL) | 发送密钥的请求头 |
|---|---|---|
| OpenAI 格式 | https://token.echohub.io/v1 | Authorization: Bearer 密钥 |
| Anthropic 格式 | https://token.echohub.io | x-api-key: 密钥 或 Authorization: Bearer 密钥 |
x-api-key请求头可以用在 Anthropic 格式的端点(/v1/messages,以及返回 Anthropic 格式列表的/v1/models)。其他端点使用Authorization请求头- Anthropic 格式还要发送
anthropic-version请求头(例:2023-06-01)。Anthropic 的 SDK 会自动发送 - 只支持 HTTPS 通信
- 调用路径里没有
/v1时,即使密钥正确也会返回 HTTP 404(不是 JSON,是网站的 HTML 页面)。有两个/v1时返回 HTTP 404(JSON 的Invalid URL)
各 SDK 和工具的接入地址
有的 SDK 要在接入地址里带上 /v1,有的 SDK 会自己加 /v1。「确认」一栏的「已确认」表示 2026-09-27 在 Echo 的验证环境中确认过调用,「未确认」表示依据各工具的官方文档。
| SDK、工具 | 要设置的项目 | 值 | 确认 |
|---|---|---|---|
| OpenAI SDK(Python、Node.js) | base_url、baseURL | https://token.echohub.io/v1 | 已确认 |
| Anthropic SDK(Python、Node.js) | base_url、baseURL | https://token.echohub.io | 已确认 |
Vercel AI SDK @ai-sdk/openai-compatible | baseURL | https://token.echohub.io/v1。要接收 token 数,还要指定 includeUsage: true | 已确认 |
Vercel AI SDK @ai-sdk/openai | baseURL | https://token.echohub.io/v1。默认是 Responses API,用 .chat() 时是 Chat Completions API | 已确认 |
Vercel AI SDK @ai-sdk/anthropic | baseURL | https://token.echohub.io/v1。和 Anthropic SDK 不同,要带上 /v1 | 已确认 |
LangChain ChatOpenAI | base_url(TypeScript 是 configuration.baseURL) | https://token.echohub.io/v1 | 已确认 |
LangChain ChatAnthropic | base_url(TypeScript 是 clientOptions.baseURL) | https://token.echohub.io | 已确认 |
LlamaIndex OpenAILike | api_base | https://token.echohub.io/v1。还要指定 is_chat_model=True 和 context_window | 已确认 |
LlamaIndex Anthropic | base_url | https://token.echohub.io。模型名只能用 LlamaIndex 认识的名称 | 已确认 |
| Claude Code | 环境变量 ANTHROPIC_BASE_URL | https://token.echohub.io(Claude Code) | 已确认 |
| Codex CLI | config.toml 的 base_url | https://token.echohub.io/v1、wire_api = "responses"(Codex CLI) | 已确认 |
| Cursor、Cline、Dify、Continue、Roo Code、n8n | Base URL 等接入地址的项目 | https://token.echohub.io/v1 | 未确认 |
端点一览
| 方法和路径 | 格式 | 能做的事 | 提供的模型 |
|---|---|---|---|
POST /v1/chat/completions | OpenAI | 生成对话的后续(Chat Completions API) | 模型一览 |
POST /v1/responses | OpenAI | 生成响应(Responses API) | 模型一览 |
POST /v1/messages | Anthropic | 生成对话的后续(Messages API) | 模型一览 |
GET /v1/models | OpenAI、Anthropic | 返回这把密钥能用的模型列表 | — |
POST /v1/embeddings | OpenAI | 把文字转换成数值序列(嵌入) | 模型一览 |
POST /v1/completions | OpenAI | 生成文字的后续(旧格式的 Completions API) | 模型一览 |
POST /v1/images/generations | OpenAI | 生成图片 | 模型一览 |
POST /v1/audio/speech | OpenAI | 把文字转成语音 | 模型一览 |
POST /v1/moderations | OpenAI | 判断文字是否违反使用政策 | 模型一览 |
POST /v1/videos | OpenAI | 提交视频生成任务 | 视频生成 |
GET /v1/videos/{任务 ID} | OpenAI | 返回视频生成的进度 | — |
GET /v1/videos/{任务 ID}/content | OpenAI | 返回生成好的视频文件 | — |
不能用的功能
| 功能 | 状态 |
|---|---|
计算 token 数(POST /v1/messages/count_tokens) | 不支持。返回 HTTP 404 |
文件(/v1/files)、Batch API(/v1/batches)、微调 | 不支持。POST /v1/batches 返回 HTTP 404,GET /v1/files 返回 HTTP 400 |
图片变体(POST /v1/images/variations) | 不支持 |
Gemini 格式(/v1beta/models/...) | 不支持。返回 HTTP 401 |
获取余额(/v1/dashboard/billing/...) | 不支持。返回 HTTP 404。余额请在控制台查看 |
单个模型的信息(GET /v1/models/{モデル ID}) | 有时返回不正确的结果。即使是在提供中的模型,也可能以 HTTP 200 返回 does not exist 的错误正文。确认模型请使用 GET /v1/models |
未确认运行情况的功能
| 功能 | 状态 |
|---|---|
POST /v1/responses/compact | 原样传给上游 API。未确认响应 |
语音转文字(POST /v1/audio/transcriptions) | 未确认 |
实时 API(/v1/realtime) | 未确认 |
模型 ID
在请求的 model 里填要调用的模型 ID。Echo 的模型 ID 写法与提供方 API 里使用的名称相同(例:deepseek-flash、claude-sonnet-5)。正式的 ID 列在模型一览的各模型页面。
这把密钥能用的模型 ID,也可以用 GET /v1/models 获取。同时带上 x-api-key 和 anthropic-version 两个请求头时返回 Anthropic 格式的列表,否则返回 OpenAI 格式的列表。
curl "https://token.echohub.io/v1/models" \
-H "Authorization: Bearer $ECHO_API_KEY"格式与模型的组合
也可以用与模型提供方不同的格式调用。这时,Echo 的服务器会转换请求和响应的格式。转换后,有些参数会不起作用,响应的项目也可能和各厂商的规范不同。建议用与提供方相同的格式调用。
| 模型 | 推荐的格式 |
|---|---|
| Claude(Anthropic) | Anthropic 格式(/v1/messages) |
| OpenAI | OpenAI 格式(/v1/chat/completions 或 /v1/responses) |
| 其他 | OpenAI 格式(/v1/chat/completions) |
转换时会变的地方(2026-09-27 在 Echo 的验证环境中确认):
| 组合 | 会变的地方 |
|---|---|
用 /v1/chat/completions 调用 Claude 的模型 | response_format(结构化输出)不起作用。reasoning_effort 会换成 Claude 的思考(thinking)设置。不指定 max_tokens 时是 8,192。输入 token 数按包含缓存部分的 OpenAI 算法返回 |
用 /v1/responses 调用 Claude、Gemini 的模型 | 可以调用,但响应的项目与 OpenAI 的规范有一部分不同 |
用 /v1/messages 调用 OpenAI、Gemini 的模型 | 文字、工具调用、流式输出可以使用。响应的项目与 Anthropic 的规范有一部分不同 |
| 所有组合 | 响应的 usage 里可能有各厂商规范之外的项目。请不要使用这些项目 |
在 Cline、Cursor、Dify 这类只用 OpenAI 格式的工具里调用 Claude 的模型时,也会经过这种转换。
用 curl 调用 Anthropic 格式
curl "https://token.echohub.io/v1/messages" \
-H "x-api-key: $ECHO_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "日本の首都はどこですか?"}]
}'用 Responses API 调用
import os
from openai import OpenAI
client = OpenAI(
base_url="https://token.echohub.io/v1",
api_key=os.environ["ECHO_API_KEY"],
)
response = client.responses.create(
model="gpt-6-sol",
input="日本の首都はどこですか?",
)
print(response.output_text)流式输出
流式输出是一边让模型生成回答、一边一点一点接收的方式。在请求里加上 "stream": true,会以 SSE(一条一条接收服务器发来的数据的机制)返回。Echo 会把上游 API 发来的数据按顺序转发,不会攒起来。
| 格式 | 收到的方式 |
|---|---|
| OpenAI 格式(Chat Completions) | 连续收到 data: {...} 行,最后收到 data: [DONE]。把 stream_options 的 include_usage 设为 true,会在 [DONE] 之前收到 token 数 |
| OpenAI 格式(Responses API) | 收到 response.created、response.output_text.delta、response.completed 等事件 |
| Anthropic 格式 | 按 message_start、content_block_start、content_block_delta、content_block_stop、message_delta、message_stop 的顺序收到。中间可能有 ping。token 数在 message_delta 里 |
回答过程中上游 API 返回错误或连接断开时的收到方式和确认方法,见错误与处理的「流式输出中途停止时」。
curl -N "https://token.echohub.io/v1/chat/completions" \
-H "Authorization: Bearer $ECHO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-flash",
"stream": true,
"stream_options": {"include_usage": true},
"messages": [{"role": "user", "content": "自己紹介を 3 文でしてください。"}]
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://token.echohub.io/v1",
api_key=os.environ["ECHO_API_KEY"],
)
stream = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "自己紹介を 3 文でしてください。"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://token.echohub.io/v1",
apiKey: process.env.ECHO_API_KEY,
});
const stream = await client.chat.completions.create({
model: "deepseek-flash",
messages: [{ role: "user", content: "自己紹介を 3 文でしてください。" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}import os
import anthropic
client = anthropic.Anthropic(
base_url="https://token.echohub.io",
api_key=os.environ["ECHO_API_KEY"],
)
with client.messages.stream(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "自己紹介を 3 文でしてください。"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://token.echohub.io",
apiKey: process.env.ECHO_API_KEY,
});
const stream = client.messages.stream({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "自己紹介を 3 文でしてください。" }],
});
stream.on("text", (text) => {
process.stdout.write(text);
});
await stream.finalMessage();主要参数
能用的参数和值的范围因模型而异。以各厂商的文档为准。
Chat Completions(POST /v1/chat/completions)
| 参数 | 必填 | 说明 |
|---|---|---|
model | 必填 | 模型 ID |
messages | 必填 | 对话记录。role(system、user、assistant 等)和 content 的组合 |
stream | 设为 true 时流式输出 | |
stream_options | 设为 {"include_usage": true} 时,在流式输出的最后收到 token 数 | |
max_completion_tokens | 输出 token 数的上限。旧的 max_tokens 在 OpenAI 已不推荐使用 | |
temperature、top_p | 输出的随机程度 | |
stop | 让输出停止的字符串 | |
tools、tool_choice | 工具调用(模型调用外部函数的功能)的定义和选择方式 | |
response_format | JSON 等输出的格式。对 Claude 的模型不起作用(见上面的「格式与模型的组合」) | |
reasoning_effort | 推理(回答前思考的过程)的深度。只限支持的模型 |
Messages(POST /v1/messages)
| 参数 | 必填 | 说明 |
|---|---|---|
model | 必填 | 模型 ID |
messages | 必填 | 对话记录。role(user、assistant)和 content 的组合 |
max_tokens | 必填 | 输出 token 数的上限 |
system | 系统提示词(给模型的前提指示) | |
stream | 设为 true 时流式输出 | |
temperature、top_p、top_k | 输出的随机程度。Anthropic 的文档里,新模型不推荐使用 temperature 和 top_k | |
stop_sequences | 让输出停止的字符串 | |
tools、tool_choice | 工具调用的定义和选择方式 | |
thinking | 扩展思考(回答前思考的过程)的设置。只限支持的模型 | |
metadata | 附加在请求上的信息,例如区分使用者的 ID。Echo 不做修改地传给上游 |
inference_geo、service_tier、speed 这 3 个参数,Echo 会先去掉再传给上游。处理地区是每个模型固定的(数据处理)。
Responses(POST /v1/responses)
| 参数 | 必填 | 说明 |
|---|---|---|
model | 必填 | 模型 ID |
input | 输入。字符串或对话的数组 | |
instructions | 给系统的指示 | |
stream | 设为 true 时流式输出 | |
max_output_tokens | 输出 token 数的上限 | |
tools、tool_choice | 工具调用的定义和选择方式 | |
reasoning | 推理的设置。只限支持的模型 | |
store | 是否让上游 API 保存响应。Echo 不做修改地传过去。在 OpenAI 的 API 里,不指定时是 true(保存) | |
previous_response_id | 作为之前某个响应的后续处理(经 Echo 时的运行情况未确认) |
嵌入
curl "https://token.echohub.io/v1/embeddings" \
-H "Authorization: Bearer $ECHO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "[埋め込みモデルの ID]", "input": "東京は日本の首都です。"}'能用于嵌入的模型可以在模型一览查看。数值数组和 base64 两种格式都能接收。
余额、使用情况和上限
- 余额和使用情况请在控制台查看(API 密钥与使用情况)。目前没有通过 API 获取余额的方法
- 每把密钥的使用上限、速率限制、请求大小的上限见上限与速率限制