Asale

接口总览

一个网关,三种兼容协议。把 OpenAI、Anthropic 或 Gemini 客户端指向 Asale,改掉 base URL 和密钥,其余代码原样不动。

Asale 网关同时用三种协议应答。你的客户端已经会说哪一种,就继续用哪一种——SDK、请求体、流式解析全部保留,只改两行:base URL 和密钥。

本页的内容三种协议通用。各自的接口清单与可直接运行的示例见:

Base URL

三种协议的 base URL 截断深度不同,因为各家客户端往后拼接的路径不同。用你手上那个 SDK 对应的那一行。

协议Base URL实际请求的接口
OpenAIhttps://gw.asale.ai/v1POST /v1/chat/completions
Anthropichttps://gw.asale.aiPOST /v1/messages
Geminihttps://gw.asale.aiPOST /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怎么处理
401unauthorized密钥缺失、格式不对或不存在。检查请求头和密钥。
403forbidden密钥被停用,或账号被限制交易。
402payment_required钱包充值。
429rate_limited退避重试,Retry-After 说明等多久。
503no_supply这一刻没人在卖这个模型。稍后重试,或换一个模型。
502upstream承接请求的上游失败了,可以安全重试。

密钥过期返回 401keyerrors.apiKey.expired,被停用返回 403 且为 errors.apiKey.disabled——两者的修复方式不同,所以状态码也不同。

频率限制

每把密钥各有自己的每分钟请求数与每分钟 token 数上限,超过任一项返回 429 并带 Retry-After。上限是按密钥算的,所以把负载拆到两把密钥上,额度也会跟着拆开。