本文へスキップ
Markdown で表示

OpenAI からの移行

Kiln は OpenAI 形式のエンドポイントを提供しているため、3 つの値を変更するだけで既存の OpenAI クライアントから接続できます。このページでは、変更する項目、まだ効果がない項目、本番トラフィックを移す前の確認項目をまとめます。

クライアントの設定

同じ呼び出しの変更前と変更後です。異なるのは base_url、API キー、モデル ID の 3 つだけです。

変更前(OpenAI)
from openai import OpenAI

client = OpenAI(api_key="sk-...")
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Write a haiku about kilns."}],
    max_tokens=800,
)
変更後(Kiln)
from openai import OpenAI

client = OpenAI(api_key="sk-bk-...", base_url="https://api.bricksum.com/v1")
resp = client.chat.completions.create(
    model="qwen3-32b",
    messages=[{"role": "user", "content": "Write a haiku about kilns."}],
    max_tokens=800,
)
  • base_url は Kiln のエンドポイントを指します。パスは SDK が付けるため、/chat/completions を自分で付けないでください。
  • API キーはコンソールで発行した Kiln のキーです。OpenAI のキーは使用できません。
  • モデル ID は Kiln のカタログの値です。カタログにない ID は 404 で拒否されます。

既知の制限

現在のサービングスタックは、OpenAI のパラメータすべてに対応しているわけではありません。以下の点にご注意ください。

  • response_format(json_object / json_schema)は未対応です。リクエストは受け付けられますが、content が空で返されます。JSON が必要な場合はプロンプトで指示し、クライアント側でパース・検証してください。
  • stop シーケンスはまだ適用されません。stop 文字列の後も生成が続きます。
  • tool_choice: required・関数指定と parallel_tool_calls は、モデルページの対応機能表で「対応」となっているモデルでのみ適用されます。qwen3-32b では、強制的なツール選択が明確なエラーなしに失敗します(2026-09-26 実測)。tool_choice を "required" にすると本文が平文 "Internal Server Error" の HTTP 500 が返り、関数を指定すると arguments が空の 200(finish_reason "stop")が返ります。どちらも 4xx ではないため、再試行では解決しません。tool_choice は "auto" のみを送ってください。 qwen3-32b では parallel_tool_calls の設定が適用されません。これは応答のツール呼び出しが 1 つだけという意味ではありません。parallel_tool_calls: false を送っても、1 つの応答に複数のツール呼び出しが含まれることがあります。tool_calls のすべての項目に、それぞれ tool メッセージで応答してください。description のない関数は 400 で拒否されます。
  • finish_reason: "length"(max_tokens による打ち切り)の場合、非ストリーミングのレスポンスで content が空になることがあります。max_tokens に余裕を持たせるか、ストリーミングを使用してください。
  • ゲートウェイはリクエストを 60 分後に終了します。非ストリーミングのリクエストは完了するまでバイトを送信せず、ネットワークエッジがそのような接続を約 100 秒後に切断することがあります。長い生成は stream: true で送信してください。

自動・強制・並列のツール選択にどのモデルが対応しているかは、 モデル ページの対応機能表にモデルごとに記載しています。

チェックリスト

  1. base_url、API キー、モデル ID を変更します。
  2. コード内の response_format と stop を探し、上記のとおり置き換えます。
  3. max_tokens に余裕を持たせ、長い生成は stream: true で送信します。
  4. エラー処理は message の文言ではなく、HTTP ステータスと error.code で分岐させます。
  5. 429 と 5xx はバックオフでリトライし、レスポンスに x-ratelimit-reset があればその値を読みます。
  6. 本番トラフィックを移す前に、1 つのモデル ID でテストを実行します。

ステータスコードとリトライの規則は、 エラー と レート制限 を参照してください。