はじめに
CanalAPIは600以上のLLM・画像・音声モデルを統合したゲートウェイです。OpenAI互換クライアントを使い、base_urlをhttps://api.canalapi.com/v1に向けてキーを渡すだけで利用できます。
クイックスタート
必要なものは2つだけ:APIキー(コンソールから取得)とモデルスラッグです。最もシンプルなリクエスト例:
# Any OpenAI-compatible client works — just swap the base URL
curl https://api.canalapi.com/v1/chat/completions \
-H "Authorization: Bearer $CANAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-4-sonnet",
"messages": [{"role":"user","content":"Hello"}]
}'レスポンス
{
"id": "chatcmpl_8K2m3",
"object": "chat.completion",
"created": 1745078400,
"model": "claude-4-sonnet",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "Hi there!" },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 8, "completion_tokens": 3, "total_tokens": 11 }
}認証
認証が必要なエンドポイントでは Authorization: Bearer <key>(OpenAI / 汎用スタイル)と x-api-key: <key>(Anthropic SDKスタイル)の両方を受け付けます。両方が指定された場合はAuthorizationが優先されます。キーはca_sk_live_プレフィックスで始まり、コンソールから環境ごと(開発 / ステージング / 本番)に独立して作成できます。
チャット補完POST/v1/chat/completions
チャット補完を作成します。OpenAIのchat/completionsと完全互換 — 同じパラメータ、同じレスポンス形式で、上流チャネルを自動選択します。
リクエストボディ
| フィールド | 型 | 説明 |
|---|---|---|
| model必須 | string | モデルスラッグ。/v1/modelsを呼ぶか料金ページで最新の利用可能モデルを確認できます。 |
| messages必須 | array | { role, content }オブジェクトの配列。ロールはsystem、user、assistantをサポート。 |
| stream任意 | boolean | trueの場合、SSEでトークンをストリーム返却。デフォルト:false。 |
| temperature任意 | number | 0〜2。高いほど多様な出力。デフォルト値はモデル依存。 |
| max_tokens任意 | integer | 補完トークン数の上限。デフォルト値はモデル依存。 |
| tools任意 | array | Function Calling用のツール定義。リクエストスキーマはOpenAI / Anthropic純正と同形式。 |
ストリーミング例
stream = client.chat.completions.create(
model="claude-4-sonnet",
messages=[{"role": "user", "content": "Write a haiku."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")エンドポイント一覧
すべてのエンドポイントは同じキーと認証方式を共有します。現在ライブのOpenAI互換 / ベンダーネイティブのエンドポイントは以下のとおりです:
| メソッド | パス | 用途 |
|---|---|---|
| POST | /v1/embeddings | テキスト埋め込み(OpenAI Embeddings互換) |
| POST | /v1/images/generations | 画像生成(DALL·E互換。/editsと/variationsも対応) |
| POST | /v1/audio/transcriptions | 音声テキスト変換(Whisper互換。/audio/translationsも対応) |
| POST | /v1/audio/speech | テキスト読み上げ(TTS) |
| POST | /v1/moderations | コンテンツモデレーション(通常無料) |
| POST | /v1/responses | OpenAI Responses API互換エンドポイント |
| POST | /v1/messages | Anthropic Messages APIのネイティブエンドポイント(Claude SDK直接対応。count_tokensは無料) |
| GET | /v1/models | 利用可能なモデル一覧の取得(公開・認証不要) |
| GET | /v1/dashboard/billing/credit_grants | OpenAI互換のアカウント残高サマリー |
リクエストパラメータとベンダー固有フィールドは上流APIの仕様に準拠します。CanalAPIは標準フィールドをすべて転送します。
エラーとリトライ
CanalAPIは標準HTTPステータスコードを使用し、エラー応答はOpenAI形式 { error: { message, type, code } } に従います。上流5xxエラー時には正常なチャネルへ自動リトライ — ルーティングプールが枯渇した場合のみエラーが返されます。
| コード | 意味 | 対処法 |
|---|---|---|
| 400 | bad_request | リクエストボディを確認 — 無効なmodelまたは不正なmessages形式の可能性があります。 |
| 401 | unauthenticated | キーが欠落、無効、または失効しています。コンソールで新しいキーを作成してください。 |
| 402 | insufficient_balance | 残高不足です。チャージしてから再試行してください。 |
| 429 | rate_limited | レート制限を超過しました。Retry-AfterとX-RateLimit-*ヘッダーに従ってバックオフしてください。 |
| 502/503 | upstream_error | すべての上流が利用不可で、すでに自動リトライ済みです。継続する場合はサポートへご連絡ください。 |
SDK連携
CanalAPIは独自のSDKを提供せず、主要ベンダー公式SDKと完全互換です — base URLとキーをCanalAPIに切り替えるだけで、既存コードはそのまま動作します。
pip install openai • npm i openaipip install anthropic • npm i @anthropic-ai/sdk