# チャット補完

Source: https://aiand-docs-staging.pages.dev/ja/api/chat-completions/

```http
POST /v1/chat/completions
```

指定した会話に対してモデル応答を生成します。[OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat/create) と完全互換です。

## リクエストボディ

| パラメータ              | 型                 | 必須   | 説明                                                                                                                                            |
| ----------------------- | ------------------ | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `model`                 | string             | はい   | モデル ID ([モデル](/ja/api/models/) を参照)                                                                                                    |
| `messages`              | array              | はい   | 会話メッセージ ([メッセージタイプ](#メッセージタイプ) を参照)                                                                                   |
| `stream`                | boolean            | いいえ | SSE で部分デルタをストリーミング。デフォルト: `false`                                                                                           |
| `stream_options`        | object             | いいえ | `{ "include_usage": true }` で最終ストリームイベントにトークン数を含める                                                                        |
| `temperature`           | number             | いいえ | サンプリング温度 (0〜2)。デフォルトはモデル依存                                                                                                 |
| `top_p`                 | number             | いいえ | Nucleus サンプリングの閾値 (0より大きく1以下)                                                                                                               |
| `n`                     | integer            | いいえ | 生成する選択肢の数 (1〜128)                                                                                                                     |
| `max_tokens`            | integer            | いいえ | 生成する最大トークン数 (非推奨 — `max_completion_tokens` を使用)                                                                                |
| `max_completion_tokens` | integer            | いいえ | 推論トークンを含む生成トークン数の上限                                                                                                          |
| `stop`                  | string \| string[] | いいえ | 最大 4 つの停止シーケンス                                                                                                                       |
| `frequency_penalty`     | number             | いいえ | 頻度ペナルティ (-2〜2)                                                                                                                          |
| `presence_penalty`      | number             | いいえ | 出現ペナルティ (-2〜2)                                                                                                                          |
| `logprobs`              | boolean            | いいえ | 出力トークンの対数確率を返す                                                                                                                    |
| `top_logprobs`          | integer            | いいえ | 位置ごとに最も可能性の高いトークン数 (0〜20)                                                                                                    |
| `response_format`       | object             | いいえ | `{ "type": "text" }`、`{ "type": "json_object" }`、または `{ "type": "json_schema", "json_schema": {...} }`                                     |
| `seed`                  | integer            | いいえ | 決定論的サンプリングのためのシード                                                                                                              |
| `tools`                 | array              | いいえ | モデルが呼び出し可能な関数ツール                                                                                                                |
| `tool_choice`           | string \| object   | いいえ | `"none"`、`"auto"`、`"required"`、または特定のツール                                                                                            |
| `parallel_tool_calls`   | boolean            | いいえ | 並列関数呼び出しを許可                                                                                                                          |
| `reasoning_effort`      | string             | いいえ | モデルごとに異なります。[`GET /v1/models`](/ja/models/catalog/) の `reasoning_efforts` を参照してください。モデルの一覧にないレベルは一つ上のレベル(なければ最も高いレベル)で実行され、送信したレベルより高コストになる場合があります。適用されたレベルは `X-Reasoning-Effort` で返されます。effort の語彙にない値は拒否されます |
| `top_k`                 | integer            | いいえ | Top-k サンプリング (プロバイダ依存)                                                                                                             |
| `repetition_penalty`    | number             | いいえ | 繰り返しペナルティ (プロバイダ依存)                                                                                                             |
| `user`                  | string             | いいえ | 不正利用追跡用のエンドユーザー識別子                                                                                                            |

モデルが reasoning をオフにできるのは、その levels に `none` が含まれる場合だけです。`none` を公開していないモデルへ `reasoning_effort` に `none` を送ると 400 になります。エラー文は [エラー](/ja/errors/#reasoning-をオフにする) にあります。

### メッセージタイプ

#### システムメッセージ

```json
{ "role": "system", "content": "You are a helpful assistant." }
```

#### ユーザーメッセージ

```json
{ "role": "user", "content": "What is the capital of France?" }
```

ユーザーメッセージはマルチモーダルなコンテンツ配列も受け付けます:

```json
{
  "role": "user",
  "content": [
    { "type": "text", "text": "What's in this image?" },
    { "type": "image_url", "image_url": { "url": "https://...", "detail": "auto" } }
  ]
}
```

対応するコンテンツタイプ: `text`、`image_url`、`video_url`、`audio_url`、`input_audio`、`file`。

`image_url`、`video_url`、`audio_url`、`file.file_url` の URL は [URL の要件](/ja/capabilities/vision/#url-の要件) を満たす必要があります。

画像については、インラインの base64 ではなく [Files API](/ja/api/files/) でアップロードして `file_id` で参照することを推奨します。マルチターンの会話やリトライ時に、クライアントからバイト列を再送する必要がなくなります:

```json
{
  "role": "user",
  "content": [
    { "type": "text", "text": "What's in this image?" },
    { "type": "file", "file": { "file_id": "file-abc123" } }
  ]
}
```

モデルは対応する capability (例: `vision`) を持つ必要があります。持たない場合、リクエストは `400 model_capability_mismatch` で拒否されます。

PDF は、OpenAI SDK や Vercel AI SDK と同じ形でインライン送信することもできます (OpenCode は PDF 添付をこの形で送ります):

```json
{
  "type": "file",
  "file": { "filename": "report.pdf", "file_data": "data:application/pdf;base64,JVBERi0x..." }
}
```

インライン PDF は、[Files API](/ja/api/files/) にアップロードした場合と同じく `purpose: "document"` のファイルとして保存されます。ファイル一覧に表示され、30 日後に期限切れになります。同じ PDF を含む以降のリクエストはそのファイルを再利用するため、ページ画像への変換を待つのは最初のリクエストだけです。モデルには `vision` capability が必要で、PDF は 100 ページまで、以前のリクエストで保存されていない PDF はリクエストあたり 16 MiB までです（以前のリクエストで保存済みの PDF は数えません）。これを超える場合は、PDF を `purpose: "document"` で Files API にアップロードし、`file_id` で参照してください。[ゼロデータリテンション](/ja/organizations/zero-data-retention/)の組織はファイルをアップロードできないため、インライン PDF は保存されずメモリ上で描画され、制限は[インライン PDF](/ja/organizations/zero-data-retention/#インライン-pdf)のとおりです。モデルに `vision` capability が必要な点は変わりません。

#### アシスタントメッセージ

```json
{ "role": "assistant", "content": "The capital of France is Paris." }
```

#### ツールメッセージ

```json
{ "role": "tool", "tool_call_id": "call_abc123", "content": "{\"result\": 42}" }
```

## レスポンス

```json
{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1700000000,
  "model": "google/gemma-4-31b-it",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello! How can I help you today?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 10,
    "completion_tokens": 9,
    "total_tokens": 19
  }
}
```

### 使用量 (usage)

| フィールド                  | 型      | 説明                                       |
| --------------------------- | ------- | ------------------------------------------ |
| `prompt_tokens`             | integer | 入力で消費したトークン数                   |
| `completion_tokens`         | integer | 生成された出力トークン数                   |
| `total_tokens`              | integer | 入力と出力の合計                           |
| `prompt_tokens_details`     | object  | 任意。`{ cached_tokens, audio_tokens }`    |
| `completion_tokens_details` | object  | 任意。`{ reasoning_tokens, audio_tokens }` |

### 推論

推論モデルは、推論を `message.reasoning_content` と `message.reasoning` (ストリーミングでは `delta.reasoning_content` と `delta.reasoning`) にも返します。両者には同じテキストが入ります。詳しくは [推論](/ja/capabilities/reasoning/) を参照してください。

## ストリーミング

`stream: true` を指定すると、Server-Sent Events として部分的な応答を受け取れます。

```bash
curl https://api.aiand.com/v1/chat/completions \
  -H "Authorization: Bearer sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-31b-it",
    "stream": true,
    "messages": [{"role": "user", "content": "Count to 5"}]
  }'
```

各イベントは JSON チャンクを含む `data:` 行で構成されます。ストリームは `data: [DONE]` で終了します。

最終イベントにトークン使用量を含めるには:

```json
{
  "stream": true,
  "stream_options": { "include_usage": true }
}
```

## ツール呼び出し

リクエストでツールを定義すると、モデルがそれらを呼び出すかを選択できます:

```json
{
  "model": "google/gemma-4-31b-it",
  "messages": [{ "role": "user", "content": "What's the weather in Tokyo?" }],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get current weather for a location",
        "parameters": {
          "type": "object",
          "properties": {
            "location": { "type": "string" }
          },
          "required": ["location"]
        }
      }
    }
  ]
}
```

モデルがツールを呼び出すと、レスポンスには `tool_calls` が含まれます:

```json
{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "tool_calls": [
          {
            "id": "call_abc123",
            "type": "function",
            "function": {
              "name": "get_weather",
              "arguments": "{\"location\": \"Tokyo\"}"
            }
          }
        ]
      },
      "finish_reason": "tool_calls"
    }
  ]
}
```

実行結果は `tool` メッセージとして返送し、会話を継続します。
