本文へスキップ
Markdown で表示

OpenAI SDK

Kiln は OpenAI Chat Completions API を提供しているため、公式の OpenAI クライアントは間に何も挟まずに接続できます。変更する値は base URL、キー、モデル ID の 3 つです。

インストール

bash
pip install openai

接続

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.bricksum.com/v1",
    api_key=os.environ["KILN_API_KEY"],  # sk-bk-...
)

resp = client.chat.completions.create(
    model="qwen3-32b",
    messages=[{"role": "user", "content": "Write a haiku about kilns."}],
    max_tokens=800,
)
print(resp.choices[0].message.content)

ツール呼び出し

tool_choice を "auto" にした往復 1 回の例です。モデルがツールを要求したらコードが実行し、その結果を tool メッセージとして返します。すべてのツールに description が必要で、description のないツールはモデルサーバーが 400 で拒否します。

python
import json, os
from openai import OpenAI

client = OpenAI(base_url="https://api.bricksum.com/v1", api_key=os.environ["KILN_API_KEY"])
tools = [{"type": "function", "function": {
    "name": "get_weather",
    "description": "Current weather for a city",  # required
    "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
}}]
messages = [{"role": "user", "content": "What's the weather in Seoul?"}]
first = client.chat.completions.create(model="qwen3-32b", messages=messages,
                                       tools=tools, tool_choice="auto", max_tokens=800)
reply = first.choices[0].message
# The model may answer without a tool call, and one reply can carry several.
if reply.tool_calls:
    messages.append(reply)
    for call in reply.tool_calls:
        messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps({"temp_c": 27})})
    final = client.chat.completions.create(model="qwen3-32b", messages=messages, max_tokens=800)
    print(final.choices[0].message.content)
else:
    print(reply.content)

Kiln での違い

  • usage.cost は OpenAI のスキーマにない Kiln はすべてのレスポンスの usage オブジェクトに USD 建ての cost を追加します。OpenAI クライアントは usage を OpenAI のスキーマどおりに型付けしており、そのスキーマにこのフィールドはないため、型を広げるまで TypeScript は resp.usage.cost を受け付けません。値そのものはどちらの場合でもレスポンスに含まれます。
  • reasoning トークンも max_tokens に含まれる モデルは回答の前に reasoning を行い、そのトークンも課金され max_tokens に含まれます。上限が小さいと message が空のまま finish_reason が "length" で返るため、両方が収まる余裕を確保してください。例の 800 はこのモデルで測定していない初期値のため、content が空で finish_reason が "length" なら増やしてください。

base URL、認証、すべてのエンドポイントが共通で受け取るリクエストパラメータ、レスポンスの形式、ストリーミング、エラーコードは、どの SDK を使っても同じです。これらは API リファレンスに一度だけまとめています。 上の呼び出しが到達するエンドポイントは Chat completionsです。 モデル ID は API が現在提供しているものである必要があります。一覧の取得方法と、目的の ID が一覧にない場合の対処は モデル のページにあります。 SDK に関係なくこのモデルが対応していない機能は OpenAI からの移行 のページにまとめています。

メモ
このページのスニペットは 2026-09-21 に openai 3.16.2 (Python), openai 7.20.0 (Node), openai-go v3.64.0 の環境で Kiln API に対して実行し、動作を確認しています。 未確認の項目: その実行は gpt-oss-120b で行いました。ページは現在 qwen3-32b を使っており、このモデルではまだ再実行していません。ツール呼び出しタブのすべての呼び出しに応答するループはその実行の後に追加されたもので、API に対して実行していません。