Asale

Anthropic 互換 API

公式 Anthropic SDK から Asale ゲートウェイの Messages API を呼び出します。base URL とキーを変えるだけで、リクエストボディはそのままです。

Anthropic 方言は Claude Code とすべての anthropic SDK が話す形式です。クライアントの base URL をゲートウェイに向けるだけで、残りのコードはそのままです。

キー・モデル・課金・エラーコードはまず概要を参照してください。ここでは Anthropic 固有の部分だけを扱います。

接続情報

Base URLhttps://gw.asale.ai
認証ヘッダーx-api-key: sk-asale-...
SDK 環境変数ANTHROPIC_API_KEYANTHROPIC_BASE_URL

base URL はホストまでです。Anthropic のクライアントは /v1/messages を自分で付けるため、https://gw.asale.ai/v1 を渡すと /v1/v1/messages になり 404 になります。

Authorization: Bearer しか知らないクライアント向けに、そのヘッダーも受け付けます。

エンドポイント

メソッドパス備考
POST/v1/messages主となるもの。
POST/v1/messages/count_tokens推定値であり、ベンダーのトークナイザによる正確な数ではありません(後述)。

anthropic-version: 2023-06-01 は上流と同様に送ってください。SDK が自動で付けます。

呼び出す

curl https://gw.asale.ai/v1/messages \
  -H "x-api-key: $ASALE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-5",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Hello"}]
  }'
# pip install anthropic
import os
from anthropic import Anthropic

client = Anthropic(
    api_key=os.environ["ASALE_API_KEY"],
    base_url="https://gw.asale.ai",
)

msg = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
)
print(msg.content[0].text)
// npm i @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({
  apiKey: process.env.ASALE_API_KEY,
  baseURL: "https://gw.asale.ai",
});

const msg = await client.messages.create({
  model: "claude-sonnet-4-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Hello" }],
});
console.log(msg.content[0].text);

ストリーミング

stream: true で Anthropic のイベント列——message_startcontent_block_deltamessage_deltamessage_stop——がそのまま Server-Sent Events として届きます。

with client.messages.stream(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "5 まで数えて"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

システムプロンプト・ツール・thinking

  • system はそのまま通ります。プロンプト末尾のキャッシュ区切り——エージェント系クライアントが必ず設定し、もっとも効果の大きいもの——も含みます。
  • tools / tool_use / tool_result はネイティブの形のまま通ります。
  • thinking はモデルが対応していれば使えます。thinking ブロックの signature は、同じワイヤ形式で処理された場合にのみ返されます。別ベンダー経由で処理された場合は、署名を捏造せず返しません。

トークン数を数える

POST /v1/messages/count_tokens が返すのはヒューリスティックな推定値です。文字種で重み付けし(ラテン文字は約 4 文字/トークン、CJK は約 1.5 文字/トークン)、メッセージごとの枠組み分を加算します:

{ "input_tokens": 1234 }

これは「数えないと送信しない」クライアントのために用意されています。トークン単位の予算には使わないでください——正確な値にはベンダー自身のトークナイザが必要で、ゲートウェイはそれを実行しません。課金の根拠は実測の使用量であり、この数値ではありません。

実務上の注意

  • max_tokens は Messages API の必須項目であり、残高確保額の計算根拠でもあります。大きめでも損はしません——応答完了後に差額が戻ります。
  • モデル名はプラットフォームのものです。 一覧は OpenAI パスの GET /v1/models、供給の有無はマーケットで確認できます。
  • リクエストボディの上限は 16 MiB です。