コンテンツにスキップ

推論

推論モデルは、回答の前に推論を書き出します。これらのモデルは GET /v1/models の capabilities に reasoning を含みます。推論トークンは出力トークンとして課金され、usage では reasoning_tokens として別に集計されます。

推論は content と並んで、reasoning_content と reasoning の 2 つの名前で返ります。両者には常に同じテキストが入ります。フィールド名はエンジンやクライアントライブラリによって異なるため、すべてのモデルが両方を返します。クライアントが想定する方を読んでください。

"message": {
"role": "assistant",
"content": "391",
"reasoning_content": "17 × 23 = 17 × 20 + 17 × 3 = 340 + 51 = 391.",
"reasoning": "17 × 23 = 17 × 20 + 17 × 3 = 340 + 51 = 391."
}

ストリーミングでは、まず両方のフィールドを持つ delta で推論が届き、その後に回答が delta.content で届きます。

data: {"choices":[{"index":0,"delta":{"reasoning_content":"17 × 23","reasoning":"17 × 23"},"finish_reason":null}],...}
data: {"choices":[{"index":0,"delta":{"content":"391"},"finish_reason":null}],...}
stream = client.chat.completions.create(
model="moonshotai/kimi-k3",
messages=[{"role": "user", "content": "17 × 23 は?"}],
stream=True,
)
for chunk in stream:
if not chunk.choices:
continue
delta = chunk.choices[0].delta
reasoning = getattr(delta, "reasoning_content", None)
if reasoning:
print(reasoning, end="")
if delta.content:
print(delta.content, end="")

以降のターンで推論を送り返す必要はありません。送信した assistant ターンに両方のフィールドが値を持つ場合は、reasoning_content が使われます。

推論は、メッセージより前に reasoning タイプの出力アイテムとして返ります。モデルが推論テキストを返す場合は content[].text(タイプ reasoning_text)に入り、要約が生成される場合は代わりに summary[].text に入ります。usage では output_tokens_details.reasoning_tokens に集計されます。

thinking: { "type": "enabled" }(または同じく扱われる "adaptive")を指定すると推論を受け取れます。推論はテキストより前の thinking コンテンツブロックとして返ります。ストリーミングでは、delta.type が thinking_delta の content_block_delta イベントで届きます。指定しない場合は回答のみが返ります。ただし、モデルが応答全体を推論の中に書いた場合、そのターンは通常の text ブロックとして返ります。詳しくは Messages を参照してください。

推論レベルは、Chat Completions では reasoning_effort、Responses では reasoning.effort、Messages では reasoning_effort または output_config.effort で指定します。各モデルが受け付けるレベルは GET /v1/models の reasoning_efforts に記載されています。適用されたレベルは X-Reasoning-Effort で返ります。レベルの検証方法は、各エンドポイントのページを参照してください。