# 推論

Source: https://aiand-docs-staging.pages.dev/ja/capabilities/reasoning/

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

## Chat Completions

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

```json
"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` で届きます。

```text
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}],...}
```

```python
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="")
```

<Aside>
  `delta.content` だけを表示するクライアントでは、モデルが推論している間は何も表示されません。これは推論の段階であり、ストリームが止まっているわけではありません。`max_tokens` は推論と回答の合計に適用されるため、上限が低いと推論の途中で応答が終わり、`finish_reason: "length"` で `content` が空になることがあります。
</Aside>

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

## Responses

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

## Messages

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

## 推論レベル

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