接口总览
一个网关,三种兼容协议。把 OpenAI、Anthropic 或 Gemini 客户端指向 Asale,改掉 base URL 和密钥,其余代码原样不动。
Asale 网关同时用三种协议应答。你的客户端已经会说哪一种,就继续用哪一种——SDK、请求体、流式解析全部保留,只改两行:base URL 和密钥。
本页的内容三种协议通用。各自的接口清单与可直接运行的示例见:
- OpenAI 兼容 ——
chat/completions、responses - Anthropic 兼容 ——
messages - Gemini 兼容 ——
generateContent - 钱包余额 API —— 用 API 密钥查询余额、最近消费和密钥用量
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。例外是钱包余额 API:它只靠密钥鉴权,不需要登录态。
鉴权
三个请求头,各对应一种协议,好让各家 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。上限是按密钥算的,所以把负载拆到两把密钥上,额度也会跟着拆开。
查余额
完整说明见钱包余额 API。
本页其余内容都是 gw.asale.ai 的接口。这一个是 api.asale.ai 的,而且是控制台接口里唯一一个只靠密钥鉴权、不需要登录态的——因为"我还剩多少、这把密钥花了多少"是一个只手握密钥的脚本也该能自己问清楚的问题,不该非要借一次登录态才能问。
GET https://api.asale.ai/api/v1/me/wallet/balance
Authorization: Bearer sk-asale-...
x-api-key、x-goog-api-key 在这里同样有效,跟网关上一样。
{
"balance": 4820000,
"frozen": 150000,
"payable": 0,
"debt": 0,
"unit": "micro_usdt",
"recent_consumption": [
{ "task_id": "t_...", "model": "claude-sonnet-4-5", "amount_usdt": 1200, "created_ts": 1760000000 }
],
"recent_consumption_window_hours": 24,
"api_key": {
"id": 42,
"label": "ci-bot",
"rpm_limit": 60,
"tpm_limit": 100000,
"max_ratio_pct": 80,
"budget_usdt": null,
"budget_remaining_usdt": null,
"spent_usdt": 0,
"calls": 318,
"in_tokens": 905120,
"out_tokens": 221004,
"settled_usdt": 184230,
"list_usdt": 240310
}
}
balance/frozen/payable/debt和钱包页面上是同一组数字,单位是 micro-USDT。recent_consumption是这个账号最近 24 小时内已结算的请求,最多 200 条——不按这一把密钥过滤,所以跟你翻这段时间账号自己的历史记录看到的是同一批。api_key是这把密钥自己的状态:设在它上面的限频、有没有花费上限,以及它付过的每一笔请求累计下来的总量。
这是给脚本看的一次性快照,不是分页列表——它回答的是"现在是什么状态",不是"列出我最近 N 次调用"。密钥不存在、过期或被停用时,报错方式跟网关一样:401/403,对应上面错误表里的 code。