接口总览
一个网关,三种兼容协议。把 OpenAI、Anthropic 或 Gemini 客户端指向 Asale,改掉 base URL 和密钥,其余代码原样不动。
Asale 网关同时用三种协议应答。你的客户端已经会说哪一种,就继续用哪一种——SDK、请求体、流式解析全部保留,只改两行:base URL 和密钥。
本页的内容三种协议通用。各自的接口清单与可直接运行的示例见:
- OpenAI 兼容 ——
chat/completions、responses - Anthropic 兼容 ——
messages - Gemini 兼容 ——
generateContent
Base URL
三种协议的 base URL 截断深度不同,因为各家客户端往后拼接的路径不同。用你手上那个 SDK 对应的那一行。
| 协议 | Base URL | 实际请求的接口 |
|---|---|---|
| OpenAI | https://gw.asale.ai/v1 | POST /v1/chat/completions |
| Anthropic | https://gw.asale.ai | POST /v1/messages |
| Gemini | https://gw.asale.ai | POST /v1beta/models/{model}:generateContent |
gw.asale.ai 是推理网关;api.asale.ai 是控制台接口(会话、钱包、行情),它不接受 sk-asale- 密钥,把推理请求发过去只会拿到 404。
鉴权
三个请求头,各对应一种协议,好让各家 SDK 不改代码就能通过鉴权。任意一个在任意接口上都有效。
Authorization: Bearer sk-asale-...
x-api-key: sk-asale-...
x-goog-api-key: sk-asale-...
密钥在 API 密钥页面管理:注册时自动生成一把,之后可以新建、命名、设置有效期、停用而不删除,副本丢了也能重新查看。
每个账号有一把标记为默认的密钥。它是桌面客户端买入时写给各 AI 工具的那一把,与你自己发起的请求无关——后者用你实际发送的那把密钥鉴权。
模型
模型名是平台的,不是某一家厂商的型号表。直接问网关能匹配到什么:
curl https://gw.asale.ai/v1/models -H "Authorization: Bearer $ASALE_API_KEY"
{
"object": "list",
"data": [
{ "id": "claude-sonnet-4-5", "object": "model", "owned_by": "anthropic", "context_length": 200000 }
]
}
目录里有、但此刻没人在卖的模型,返回的是 503 no_supply 而不是 404——名字是对的,只是这一秒没有供给。市场页面可以看到哪些模型有流动性。
流式
服务端推送事件(SSE),保持各协议原生的事件格式,不做二次封装:OpenAI 与 Anthropic 用 stream: true,Gemini 用 :streamGenerateContent。现有的流式解析代码无需改动。
一个请求要花多少
请求发出前,网关会按你声明的 max_tokens 乘以该模型的输出价冻结一笔预估;响应结束后按真实用量计价,差额立即退回可用余额。
以下情况不计费:请求出错、用量返回为零、你中途断开。计量细节见用量计费。
错误
所有失败都是同一种 JSON,配上对应的 HTTP 状态码:
{
"error": {
"message": "insufficient balance",
"code": "payment_required",
"key": "errors.wallet.insufficientBalance"
}
}
请按 code 分支,不要按 message——文案会被翻译和改写。
| 状态码 | code | 怎么处理 |
|---|---|---|
| 401 | unauthorized | 密钥缺失、格式不对或不存在。检查请求头和密钥。 |
| 403 | forbidden | 密钥被停用,或账号被限制交易。 |
| 402 | payment_required | 去钱包充值。 |
| 429 | rate_limited | 退避重试,Retry-After 说明等多久。 |
| 503 | no_supply | 这一刻没人在卖这个模型。稍后重试,或换一个模型。 |
| 502 | upstream | 承接请求的上游失败了,可以安全重试。 |
密钥过期返回 401 且 key 为 errors.apiKey.expired,被停用返回 403 且为 errors.apiKey.disabled——两者的修复方式不同,所以状态码也不同。
频率限制
每把密钥各有自己的每分钟请求数与每分钟 token 数上限,超过任一项返回 429 并带 Retry-After。上限是按密钥算的,所以把负载拆到两把密钥上,额度也会跟着拆开。