API の概要
ゲートウェイは 1 つ、互換方言は 3 つ。OpenAI・Anthropic・Gemini のクライアントを Asale に向け、base URL とキーを変えるだけで、残りのコードはそのままです。
Asale のゲートウェイは 3 種類のワイヤ形式で応答します。いま使っているクライアントが話す形式をそのまま使えます——SDK もリクエストボディもストリーム処理もそのまま、変えるのは 2 行だけ:base URL とキーです。
このページの内容は 3 方言に共通です。エンドポイントと実行可能なサンプルは各ページにあります:
- 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 はコンソール API(セッション・ウォレット・マーケット情報)で、sk-asale- キーは受け付けません。推論リクエストを送っても 404 が返ります。
認証
方言ごとに 1 つずつ、計 3 つのヘッダー。各ベンダーの SDK が手を加えずに認証できるようにするためです。どのヘッダーもどのエンドポイントでも有効です。
Authorization: Bearer sk-asale-...
x-api-key: sk-asale-...
x-goog-api-key: sk-asale-...
キーは API キー画面で管理します。登録時に 1 本自動発行され、追加・命名・有効期限の設定・削除せずに無効化ができ、控えを失くしても読み直せます。
アカウントごとに 1 本がデフォルトです。これはデスクトップアプリが購入時に各 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 }
]
}
カタログにはあるが今この瞬間に売り手がいないモデルは、404 ではなく 503 no_supply を返します——名前は正しく、供給がないだけです。流動性はマーケットで確認できます。
ストリーミング
Server-Sent Events を、各方言のイベント形式のまま返します(再フレーミングなし)。OpenAI と Anthropic は stream: true、Gemini は :streamGenerateContent です。既存のストリームパーサーはそのまま動きます。
1 回のリクエストの料金
リクエスト送信前に、宣言された 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 と errors.apiKey.expired、無効化されたキーは 403 と errors.apiKey.disabled を返します。対処が違うので、ステータスも分けてあります。
レート制限
キーごとに 1 分あたりのリクエスト数とトークン数の上限があります。どちらかを超えると Retry-After 付きの 429 が返ります。上限はキー単位なので、処理を 2 本のキーに分ければ枠も分かれます。