ドキュメント
チャット補完
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/ |
messages | 配列(必須) | 標準のOpenAIメッセージ形式。 |
temperature | 0..2 | サンプリング温度。デフォルトは1。この表に記載されたモデルには効果がありません。 |
top_p | 0..1 | nucleus sampling。同じく、温度と同様の例外があります。 |
max_tokens | int | 出力上限。両方が指定された場合はmax_が優先されます。GPTモデルでは推論トークンもこの上限に含まれます。Claudeへのリクエストでどちらも指定されない場合、4,096が適用されます。 |
stream | bool | SSEとしてチャンクをストリーミングします。詳細は以下を参照してください。 |
tools | array | 関数/ツールの定義。ClaudeとGPTはいずれもツールの使用に対応しています。 |
tool_choice | auto| | 特定のツールを強制するか、モデルに選択させます。 |
response_ | object | JSON出力。Claudeではjson_が強制され、json_は強制されません。各ファミリーの詳細はJSON出力を参照してください。 |
reasoning_ | string | GPTモデルのみ — reasoning.として転送されます。Claudeには転送されません。推論を参照してください。 |
seed | int | 対応モデルで決定論的サンプリングを行います。 |
stop | string|array | 強制停止シーケンス。 |
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)ツール/関数呼び出し
プロバイダーを問わず、ツール呼び出しを利用できます。ツールを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_schema | json_object |
|---|---|---|
| Claude | 強制されます。Anthropicの構造化出力(output_)として送信され、応答は指定したスキーマに従います。Kunavoが提供するすべてのClaudeモデルで確認済み(2026-09-24)。 | 強制されません。Anthropicにはスキーマを指定しないJSONモードがないため、この指定は受け付けられますが無視されます。応答が説明文やコードフェンスから始まる場合があります。 |
| GPT | Responses APIのtext.として転送されますが、現在の上流プロバイダーではすべてのリクエストに適用されません。解析前に検証してください。 | text.として転送されます。 |
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 schemaClaudeでは次の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_ | 使用量における推論トークン |
|---|---|---|
| GPT | GPT-6 Astra、GPT-6 Sol、GPT-6 Luna、GPT-5.6 Sol、GPT-5.6 Terra、GPT-5.5ではResponses APIのreasoning.として、値をそのまま転送します。受け付けられる値はモデル固有です。GPT-6 SolおよびGPT-6 Lunaでは、noneで推論が無効になり、maxが最上位です。 | completion_に含めて計上され、completion_として内訳が示されます。出力料金で請求されます。 |
| Claude | 転送されません。Anthropicへのリクエストは固定されたフィールド一覧 — model、max_、messages、stream、temperature、top_、top_、stop、tools、tool_、response_ — を基に構築されるため、reasoning_、thinking、およびその一覧に含まれないその他の項目は、ここでは削除されます。 | 内訳はありません。Anthropicはthinkingの内容をoutput_の中に含めて計上し、completion_で報告します。 |
# 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)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)cache_creation_input_tokens / cache_read_input_tokens 使用量フィールドに対応した ネイティブ Messages API を使用してください。 このエンドポイントでもシステムプロンプトとツール定義をキャッシュでき、1つのリクエストに複数のブレークポイントを指定でき、キャッシュへの書き込みはcache_creation_input_tokens、キャッシュからの読み出しはprompt_tokens_details.cached_tokensとして報告されます。ネイティブエンドポイントだけが行うのは、ブレークポイントを追加せずにリクエスト本文をそのまま渡すことです。使用量オブジェクト
すべてのレスポンス(およびストリーミングの最終チャンク)には、usage オブジェクトが含まれます。
| フィールド | 意味 |
|---|---|
prompt_ | 課金対象となった入力トークン数。キャッシュされたトークンを含みます。 |
prompt_ | キャッシュされた入力。prompt_ |
completion_ | 請求した出力トークン。GPTモデルでは推論トークンを含み、ClaudeではAnthropicのoutput_ |
completion_ | GPT モデルの場合、completion_ |
total_tokens | prompt_ |
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 v1 | Kunavo v1 |
|---|---|---|
| エンドポイントパス | /v1/ | /v1/ |
| ストリーミング | SSE、chat. | 同一 — delta の形状も同じ |
| ツール呼び出し | tools / tool_calls | Claude と GPT で同一 |
| 画像入力 | マルチモーダルなローカルモデルでの image_url ブロック | 同じブロック。URLまたはbase64データURI |
| api_key | プレースホルダー。無視されます | 有効な Kunavo キー |
| model | 取得したタグ(llama3.2) | ホスト型スラッグ(claude-sonnet-5) |
| 使用量の追加情報 | トークン数のみ | cached_ |
| チャット以外 | 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を参照してください。