ドキュメント

ドキュメント

チャット補完

Kunavoの/v1/chat/completionsエンドポイントは、ClaudeおよびGPTファミリー向けにOpenAIのChat Completionsプロトコルで通信します。ストリーミング、ツール、JSON出力は同じSDKで利用できます。reasoning_effortの作用はファミリーによって異なり、このページではその違いを説明します。

エンドポイント:POST /v1/chat/completions。ストリーミングや任意のtool_calls/reasoning_tokensフィールドを含め、リクエストとレスポンスの形式はOpenAIのChat Completions APIと完全に一致します。

基本的な呼び出し

resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[
        {"role": "system", "content": "You are a senior staff engineer."},
        {"role": "user", "content": "Pros and cons of postgres LISTEN/NOTIFY for a job queue?"},
    ],
    max_tokens=800,
)
print(resp.choices[0].message.content)

パラメーター

OpenAIの標準パラメーターはすべて受け付けられます。プロバイダーによっては、一部のパラメーターが適用されません。トランスレーターは各上流プロバイダーがサポートするものを転送します。

パラメーター種類注記
model文字列(必須)/v1/modelsで有効になっている任意のスラッグ。
messages配列(必須)標準のOpenAIメッセージ形式。
temperature0..2サンプリング温度。デフォルトは1。この表に記載されたモデルには効果がありません。
top_p0..1nucleus sampling。同じく、温度と同様の例外があります。
max_tokensint出力上限。両方が指定された場合はmax_completion_tokensが優先されます。GPTモデルでは推論トークンもこの上限に含まれます。Claudeへのリクエストでどちらも指定されない場合、4,096が適用されます。
streamboolSSEとしてチャンクをストリーミングします。詳細は以下を参照してください。
toolsarray関数/ツールの定義。ClaudeとGPTはいずれもツールの使用に対応しています。
tool_choiceauto|none|named特定のツールを強制するか、モデルに選択させます。
response_formatobjectJSON出力。Claudeではjson_schemaが強制され、json_objectは強制されません。各ファミリーの詳細はJSON出力を参照してください。
reasoning_effortstringGPTモデルのみ — reasoning.effortとして転送されます。Claudeには転送されません。推論を参照してください。
seedint対応モデルで決定論的サンプリングを行います。
stopstring|array強制停止シーケンス。
Claude Fable 5.1、Claude Fable 5、Claude Opus 5.5、Claude Opus 5、Claude Opus 4.8、Claude Opus 4.7、Claude Sonnet 5ではtemperature、top_p、top_kを受け付けません。Kunavoは、ベンダーからの400エラーをそのまま返す代わりに、これらのモデルへのリクエストから3つの項目を削除します。そのため、これらのモデルでは効果がありません。

ストリーミング

stream=Trueを設定します。KunavoはOpenAIと完全に同じ形式でサーバー送信イベントを出力します。各チャンクはchoices[0].delta.contentを含むchat.completion.chunkです。最後に使用量ペイロードがdata: [DONE]とともに届きます。

stream = client.chat.completions.create(
    model="claude-haiku-4-5",
    messages=[{"role": "user", "content": "Explain B-trees in one paragraph."}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)
すべてのチャットモデルでストリーミングを利用できます。Claude(上流がAnthropicプロトコル)の場合、AnthropicのイベントストリームをOpenAIのdelta形式にその場で変換します。お使いのSDK側で違いを意識する必要はありません。

ツール/関数呼び出し

プロバイダーを問わず、ツール呼び出しを利用できます。ツールをJSONスキーマで定義すると、モデルはメッセージ内のtool_callsを返します。その後、ツールを実行し、結果をrole: "tool"メッセージとして返します。

tools = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Get current weather for a city",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string"},
                "unit": {"type": "string", "enum": ["c", "f"]},
            },
            "required": ["city"],
        },
    },
}]

resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
    tools=tools,
    tool_choice="auto",
)

# Inspect tool calls the model wants to make
for call in resp.choices[0].message.tool_calls or []:
    print(call.function.name, call.function.arguments)

JSON出力(response_format)

response_formatはJSON出力を要求します。ファミリーごとに異なる上流の仕組みに変換されるため、保証される内容はモデルファミリーによって異なります。

ファミリーjson_schemajson_object
Claude強制されます。Anthropicの構造化出力(output_config.format)として送信され、応答は指定したスキーマに従います。Kunavoが提供するすべてのClaudeモデルで確認済み(2026-09-24)。強制されません。Anthropicにはスキーマを指定しないJSONモードがないため、この指定は受け付けられますが無視されます。応答が説明文やコードフェンスから始まる場合があります。
GPTResponses APIのtext.formatとして転送されますが、現在の上流プロバイダーではすべてのリクエストに適用されません。解析前に検証してください。text.formatとして転送されます。
import json

resp = client.chat.completions.create(
    model="claude-haiku-4-5",
    messages=[{"role": "user", "content": "Jane Doe <jane@example.com> wants the Pro plan."}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "signup",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "email": {"type": "string"},
                    "plan": {"type": "string", "enum": ["free", "pro", "enterprise"]},
                },
                "required": ["name", "email", "plan"],
                "additionalProperties": False,
            },
        },
    },
)
signup = json.loads(resp.choices[0].message.content)  # constrained to the schema

Claudeでは次の4点に注意してください。

  • スキーマはほぼ記述されたままAnthropicに送られます。AnthropicはオブジェクトにadditionalProperties: falseを必要とするため、Kunavoはプロパティが定義されたオブジェクトにこれを追加します。Pydanticのmodel_json_schema()が生成するような、未設定の状態にします。Anthropicが引き続き受け付けず、問題を示す400エラーを返すケースは、オブジェクトがオープンな状態の場合(additionalPropertiesがfalse以外に設定されている、またはプロパティが定義されておらずadditionalPropertiesも未設定)と、oneOfの場合です。後者にはanyOfを使用してください。その他のケースはAnthropicの構造化出力のページを参照してください。
  • strictとnameは無視されます。Anthropicは受け付けたスキーマを、strictの指定にかかわらずすべて強制適用します。
  • スキーマは最後のassistantメッセージ(prefill)と併用できません。Anthropicは400エラーを返します。
  • max_tokensがオブジェクトの途中で尽きるとJSONはそこで途切れ、finish_reasonは"length"になります。

ビジョン/マルチモーダル入力

vision機能を持つモデルは画像コンテンツブロックを受け付けます。HTTPS URLまたはdata:のbase64 URIを使用してください。

# Pass an image URL or a base64 data URI as part of a multimodal message
resp = client.chat.completions.create(
    model="claude-haiku-4-5",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "What's in this image?"},
            {"type": "image_url", "image_url": {
                "url": "https://example.com/cat.jpg"
            }},
        ],
    }],
)
print(resp.choices[0].message.content)

カタログ内のビジョン対応モデルにはClaude Opus 5.5が含まれます。その他のモデルについてはモデル一覧を参照してください。

https画像の場合、Kunavoがファイルをダウンロードしてモデルにインラインで渡します。一部の上流プロバイダーは画像URLだけでは処理しないためです。制限:リクエストあたり画像16枚、画像1枚あたり5 MB、合計20 MB、ダウンロード1回あたり10秒。取得できない画像はスキップせず、その画像を示すエラーを返します。

推論

このエンドポイントで推論制御がどのように作用するかは、ファミリーによって異なります。各ファミリーのリクエストは異なる上流APIに変換されるためです。

ファミリーreasoning_effort使用量における推論トークン
GPTGPT-6 Astra、GPT-6 Sol、GPT-6 Luna、GPT-5.6 Sol、GPT-5.6 Terra、GPT-5.5ではResponses APIのreasoning.effortとして、値をそのまま転送します。受け付けられる値はモデル固有です。GPT-6 SolおよびGPT-6 Lunaでは、noneで推論が無効になり、maxが最上位です。completion_tokensに含めて計上され、completion_tokens_details.reasoning_tokensとして内訳が示されます。出力料金で請求されます。
Claude転送されません。Anthropicへのリクエストは固定されたフィールド一覧 — model、max_tokens、messages、stream、temperature、top_p、top_k、stop、tools、tool_choice、response_format — を基に構築されるため、reasoning_effort、thinking、およびその一覧に含まれないその他の項目は、ここでは削除されます。内訳はありません。Anthropicはthinkingの内容をoutput_tokensの中に含めて計上し、completion_tokensで報告します。
# GPT models: reasoning_effort is forwarded as the Responses API's
# reasoning.effort. Reasoning tokens are part of completion_tokens.
resp = client.chat.completions.create(
    model="gpt-6-sol",
    messages=[{"role": "user", "content": "Plan a 3-week MLOps migration."}],
    reasoning_effort="high",
)
details = resp.usage.completion_tokens_details   # absent when no reasoning ran
print(details.reasoning_tokens if details else 0)
Claudeの拡張思考はネイティブMessages API経由で行われ、thinkingは翻訳されずそのままAnthropicに渡されます。

プロンプトキャッシュ

長いsystemプロンプト、参照ドキュメント、few-shotブロックなど、安定したプレフィックスは上流でキャッシュし、後続の呼び出しで入力料金のごく一部の料金で再利用できます。キャッシュヒットは使用量オブジェクトのprompt_tokens_details.cached_tokensに表示されます。

GPTモデルは自動的にキャッシュするため、リクエストを変更する必要はありません。cached_tokensはprompt_tokensの内訳であり、割引されたキャッシュ読み取り料金で請求されます。

Claudeがキャッシュするのはcache_controlブレークポイントまでで、長いプロンプトではこのエンドポイントがブレークポイントを代わりに設定します。設定先は、システムプロンプト、ツール定義、そして会話にアシスタントのターンが含まれていれば最後のメッセージです。プレフィックスを自分で選ぶには、以下のようにコンテンツブロックにcache_controlを付けてください。Kunavoはお客様のブレークポイントを保持し、空いている位置にだけ独自のブレークポイントを追加します。

# Claude caches prefixes you mark with cache_control. Attach it to a content
# block; later calls reusing that prefix read it at ~10% of the input price.
resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": LONG_DOCUMENT,            # the stable, reused prefix
                "cache_control": {"type": "ephemeral"},
            },
            {"type": "text", "text": "Summarize the document above."},
        ],
    }],
)
print(resp.usage.prompt_tokens_details.cached_tokens)
Claude のプロンプトキャッシュを完全に制御するには、システムプロンプトとツール定義のキャッシュ、複数のブレークポイント、ネイティブの cache_creation_input_tokens / cache_read_input_tokens 使用量フィールドに対応した ネイティブ Messages API を使用してください。 このエンドポイントでもシステムプロンプトとツール定義をキャッシュでき、1つのリクエストに複数のブレークポイントを指定でき、キャッシュへの書き込みはcache_creation_input_tokens、キャッシュからの読み出しはprompt_tokens_details.cached_tokensとして報告されます。ネイティブエンドポイントだけが行うのは、ブレークポイントを追加せずにリクエスト本文をそのまま渡すことです。

使用量オブジェクト

すべてのレスポンス(およびストリーミングの最終チャンク)には、usage オブジェクトが含まれます。

フィールド意味
prompt_tokens課金対象となった入力トークン数。キャッシュされたトークンを含みます。
prompt_tokens_details.cached_tokensキャッシュされた入力。prompt_tokens の一部で、キャッシュ読み取り料金の割引レートで課金されます。
completion_tokens請求した出力トークン。GPTモデルでは推論トークンを含み、ClaudeではAnthropicのoutput_tokensです。
completion_tokens_details.reasoning_tokensGPT モデルの場合、completion_tokens に占める推論トークン数です。0 の場合は出力されず、Claude では報告されません。
total_tokensprompt_tokens + completion_tokens。

Ollama の OpenAI 互換 API — /v1/chat/completions

Ollama は、http://localhost:11434/v1 にある OpenAI 互換 API を通じてローカルモデルを提供し、このページで説明する同じ /chat/completions 契約を実装しています。そのため、クライアント側では両者を置き換えて使用できます。Ollama の v1 API 向けに書かれたコードは、ベース URL とモデルを変更するだけで Kunavo に対して実行できます。

from openai import OpenAI

# Before — Ollama's OpenAI-compatible API, local models
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",                       # ignored locally
)
resp = client.chat.completions.create(
    model="llama3.2",
    messages=[{"role": "user", "content": "Summarize this changelog."}],
)

# After — the same call against hosted frontier models.
# Two lines changed. Everything below them is untouched.
client = OpenAI(
    base_url="https://api.kunavo.com/v1",   # <- was localhost:11434/v1
    api_key=os.environ["KUNAVO_API_KEY"],
)
resp = client.chat.completions.create(
    model="claude-sonnet-5",  # <- was llama3.2
    messages=[{"role": "user", "content": "Summarize this changelog."}],
)

プロバイダーを切り替えると通常問題になる部分も、ここでは問題になりません。ワイヤ形式が同じだからです。

機能Ollama v1Kunavo v1
エンドポイントパス/v1/chat/completions/v1/chat/completions
ストリーミングSSE、chat.completion.chunk同一 — delta の形状も同じ
ツール呼び出しtools / tool_callsClaude と GPT で同一
画像入力マルチモーダルなローカルモデルでの image_url ブロック同じブロック。URLまたはbase64データURI
api_keyプレースホルダー。無視されます有効な Kunavo キー
model取得したタグ(llama3.2)ホスト型スラッグ(claude-sonnet-5)
使用量の追加情報トークン数のみcached_tokens と reasoning_tokens を追加
チャット以外completions、embeddingsさらに画像、動画、音声のエンドポイント
両方を使いますか?base_url、model、キーを環境変数から読み込み、環境ごとに切り替えてください。オフラインでの反復開発にはローカルモデル、品質を重視する場合はホスト型モデルを使い、コードパスは1つに保てます。Ollama の OpenAI 互換インターフェースが実装している機能と実装していない機能を含む詳しい手順は、Ollama OpenAI 互換 API ガイドをご覧ください。

OllamaのOpenAI互換/v1/chat/completionsエンドポイントの公式ドキュメントはどこにありますか?

OllamaはOpenAI互換レイヤーを、自身のリポジトリ内のdocs/openai.mdで説明しています。これは、ローカルサーバーが実装するOpenAIフィールドについての正式なリファレンスです。このページは、Kunavoのホスト型/v1/chat/completionsエンドポイントに対応するリファレンスです。上記では同じOpenAI Chat Completionsの仕様をフィールドごとに説明しているため、2つのインターフェースを直接比較できます。要点としては、リクエストとレスポンスの形式は同じです。Ollamaはローカルにプルしたモデルに対してhttp://localhost:11434/v1で提供し、Kunavoはホスト型のClaudeおよびGPTモデルに対してhttps://api.kunavo.com/v1で提供します。

Kunavoの/v1/chat/completionsはOllamaのOpenAI APIと互換性がありますか?

はい。どちらも同じOpenAI Chat Completions仕様を実装しているため、Ollamaのhttp://localhost:11434/v1向けに作成したクライアントは、変更せずにhttps://api.kunavo.com/v1で動作します。リクエストフィールド(messages、temperature、max_tokens、stream、tools、tool_choice、response_format、stop、seed)とレスポンスフィールド(choices[].message、ストリーム時のchoices[].delta、usage)は一致します。違いはホスト型モデルに伴うものです。api_keyにはプレースホルダーではなく実際のキーを指定し、modelにはllama3.2のようなプル済みタグではなくclaude-sonnet-5などのホスト型スラッグを指定します。またusageには、ローカルモデルが報告しないcached_tokensとreasoning_tokensが含まれます。

Ollamaアプリをホスト型のClaudeまたはGPTに移行するにはどうすればよいですか?

2行を変更します。base_urlをhttp://localhost:11434/v1からhttps://api.kunavo.com/v1に、modelをローカルタグからホスト型スラッグに変更してください。Ollamaが無視するプレースホルダーの代わりに、実際のKunavoキーを渡します。SSEとtool_callsの形式は同一なので、ストリーミング、ツール呼び出し、ビジョンのコードパスを変更する必要はありません。

開発にはOllamaを、本番環境にはホスト型モデルを使い続けることはできますか?

はい。よくある構成です。base URL、モデル、キーを環境変数から読み込み、環境ごとに切り替えてください。どちらも同じOpenAIプロトコルに対応しているため、保守するコードパスを増やす必要はありません。オフラインでの反復開発にはローカルのLlamaまたはQwenを、品質を重視する場面ではホスト型のClaudeまたはGPTを使えます。ツール定義とストリーミングハンドラーはそのまま共通で使用できます。

KunavoがOllamaの互換インターフェースに追加するOpenAIエンドポイントはどれですか?

OllamaのOpenAI互換インターフェースは、/chat/completions、/completions、/embeddings、/modelsに対応しています。Kunavoでは同じキーでメディアエンドポイントも利用できます。/v1/images/generations、/v1/images/edits、/v1/video/generations、/v1/videos、/v1/audio/musicに加え、ネイティブAnthropicの/v1/messagesエンドポイントでClaudeを利用できます。反対に、注意点が2つあります。/v1/audio/speech、/v1/audio/transcriptions、/v1/embeddingsはワイヤ形式として実装されていますが、現在は背後で有効になっているモデルがないため、現時点では成功しません。またOllamaとは異なり、Kunavoはモデルをローカルで実行しません。呼び出し可能なものを確認する際は、常にGET /v1/modelsを参照してください。

次に確認する項目