# Claude Sonnet 4.6 — /chat/completions

Claude Sonnet 4.6（Anthropic）の対話 API です。性能と速度のバランスに優れ、日常の対話、コーディング、エージェントに向いています。コンテキストウィンドウは約 200K トークンで、画像入力とツール呼び出しに対応し、OpenAI 互換 API と Anthropic ネイティブ API の両方で提供しています。

**エンドポイント:** `POST https://nezhagate.com/v1/chat/completions`

## クイックスタート

2 ステップで動きます：まずリクエストを送信し、次にストリーミングで回答を受け取ります。YOUR_API_KEY をご自身のキーに置き換えれば、下のコマンドはそのまま実行できます。エンドポイントは OpenAI の Chat Completions と同じなので、既存の OpenAI のコードは `base_url` と `model` を変えるだけで使えます。

**ステップ 1 · リクエストを送信**

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": "光合成を一文で説明してください"}]}'
```

レスポンス（HTTP 200）

```
{
  "id": "chatcmpl-7f3c9a1e2b4d6f8a",
  "object": "chat.completion",
  "created": 1791281400,
  "model": "claude-sonnet-4-6",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "光合成とは、植物が日光を使って二酸化炭素と水から糖をつくり、酸素を放出するしくみです。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 18,
    "completion_tokens": 42,
    "total_tokens": 60
  }
}
```

`message.content` が回答、`usage` はこのリクエストで課金されるトークン数です。プロンプトキャッシュの課金方法は、下の「プロンプトキャッシュ」をご覧ください。

**ステップ 2 · ストリーミングで受け取る（推奨）**

```
curl -N https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "stream": true, "messages": [{"role": "user", "content": "光合成を一文で説明してください"}]}'
```

ストリームは標準的な SSE です。各チャンクの本文は `choices[0].delta.content` に入り、最後のチャンクに `usage` が付き、`data: [DONE]` で終わります。回答が長い場合や思考モデルでは、ストリーミングを使ってください。ストリーミングしないリクエストは約 10 分で切断されます。

**Python（OpenAI SDK）**

```
from openai import OpenAI

client = OpenAI(base_url="https://nezhagate.com/v1", api_key="YOUR_API_KEY")

# 1. 一問一答
resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "光合成を一文で説明してください"}],
)
print(resp.choices[0].message.content)

# 2. ストリーミング
stream = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "光合成を一文で説明してください"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
```

**Anthropic SDK（ネイティブ API）でも呼び出せます**

```
import anthropic

client = anthropic.Anthropic(base_url="https://nezhagate.com/anthropic", api_key="YOUR_API_KEY")
msg = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "光合成を一文で説明してください"}],
)
print(next(b.text for b in msg.content if b.type == "text"))
```

Anthropic SDK の `base_url` は `/anthropic` までを指定します。`/v1/messages` は SDK が自動で付け加えます。キーは上と同じものです。

## 認証
```
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
```

## 仕様早見表

| コンテキストウィンドウ | ~200K トークン |
| --- | --- |
| 入力 | テキスト、画像 |
| 思考 | 既定ではオフ。ネイティブ API でオンにでき、要約も受け取れます |
| ツール呼び出し | 対応（OpenAI の `tools` 形式） |
| ウェブ検索 | 対応（`web_search: true`。検索自体は無料） |
| エンドポイント | /v1/chat/completions · /anthropic/v1/messages |
| ストリーミング | 対応（`stream: true`、SSE） |
| 課金方法 | トークン単位：入力、出力（思考を含む）、キャッシュヒットをそれぞれの料金で課金し、失敗は課金されません |

## リクエストパラメータ

`POST /v1/chat/completions` のリクエスト本文（JSON）で、OpenAI の Chat Completions と同じです。よく使うパラメータと、このモデルでの実際の動作は次のとおりです：

| パラメータ | 種別 | 必須 | 説明 |
| --- | --- | --- | --- |
| model | string | はい | モデル ID：`claude-sonnet-4-6`。 |
| messages | array | はい | 会話のメッセージの配列です。各メッセージは `role`（`system` / `user` / `assistant` / `tool`）と `content` を持ちます。`content` は文字列、または `text` と `image_url` のパーツからなる配列です（画像入力については下記を参照）。複数ターンの対話では、これまでの履歴をすべて順番どおりに送ってください。 |
| stream | boolean | いいえ | `true` にすると SSE でストリーミングし、最後のチャンクに `usage` が付きます。既定は `false` です。 |
| max_tokens | integer | いいえ | 出力の上限で、思考トークンも含みます。小さすぎると、モデルが回答を書く前に上限を使い切ることがあり、その場合ゲートウェイは 400 `max_tokens_too_small` を返し、課金はしません（512 以上を推奨）。一部のモデルでは、小さすぎる値は回答を最後まで書ける下限まで自動で引き上げられます。その場合も、課金は実際の使用量の分だけです。 |
| temperature / top_p | number | いいえ | サンプリングパラメータで、送ったとおりモデルに渡されます（`temperature` は 0〜2）。思考モデルでは反映されないことがあります。 |
| tools / tool_choice | array / string | いいえ | OpenAI 標準形式の関数呼び出しです。モデルが関数を呼び出すときは `finish_reason: "tool_calls"` と `tool_calls` を返します。詳しくは下記をご覧ください。 |
| web_search | boolean | いいえ | `true` にすると、まずウェブ検索を行い、その結果を参考資料としてモデルに渡します。詳しくは下記をご覧ください。 |

そのほかの OpenAI のパラメータ（`stop`、`seed`、`user` など）は送ったとおりモデルに渡されます。反映されるかどうかはモデルによります。

## 料金

トークン単位で課金します。下の表は 100 万トークンあたりの最新の料金です。プロンプトキャッシュに書き込まれたトークンはキャッシュ書き込み料金、キャッシュヒットした分はキャッシュヒット料金で課金されます。課金されるのは成功したリクエストの実際の使用量だけです。1 クレジット = $0.005 です。

| 種類 | USD / 100 万トークン | クレジット / 100 万トークン |
| --- | --- | --- |
| 入力 | $1.50 | 300 |
| 出力（思考を含む） | $7.50 | 1500 |
| キャッシュヒット | $0.15 | 30 |
| キャッシュ書き込み | $1.875 | 375 |

たとえば、入力 2,000 トークン、出力 1,000 トークン（思考を含む）のリクエストは約 $0.0105 です。

## 思考

既定では思考せずに直接回答します。思考をオンにして要約を受け取るには、ネイティブ API（`/anthropic`）を使い、リクエストに `"thinking": {"type": "adaptive", "display": "summarized"}` を含めてください。

思考トークンは出力トークンとして数えられ、出力料金で課金されます。

## プロンプトキャッシュ

マーカーを付けなくても、長いプロンプトは自動でキャッシュに書き込まれることがあり（キャッシュ書き込み料金で課金）、その後、同じ先頭部分が繰り返されるとキャッシュヒット料金で課金されます。ネイティブ API（`/anthropic`）では、システムプロンプトやメッセージのブロックに `"cache_control": {"type": "ephemeral"}` を付けて、キャッシュする位置を自分で指定できます。Claude Code はこれを自動で行います。

ネイティブ API では、キャッシュのトークン数を `usage.cache_creation_input_tokens`（書き込み）と `usage.cache_read_input_tokens`（ヒット）で返し、課金はこの数値に基づきます。

## 画像入力

`content` の配列に `image_url` のパーツを入れます。推奨は base64 の data URI（`data:image/png;base64,...`）で、どの回線でも読み込めます。公開されている画像のリンクは回線側でダウンロードする必要があり、まれに取得できない、またはタイムアウトする回線があります。画像はモデル提供元の規則に従って入力トークンに換算されます。

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": [{"type": "text", "text": "この画像には何が写っていますか"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}}]}]}'
```

## ツール呼び出し（Function Calling）

`tools` に JSON Schema で関数を記述します。モデルが関数を呼び出すと判断したときは `finish_reason: "tool_calls"` を返し、`message.tool_calls` に関数名と引数（JSON 文字列）が入ります。

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": "上海の今の天気はどうですか"}], "tools": [{"type": "function", "function": {"name": "get_weather", "description": "Current weather of a city", "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}}]}'
```

関数を実行したら、その結果を `role: "tool"` のメッセージとして、対応する `tool_call_id` を付けて会話に追加し、もう一度リクエストを送ってください。モデルはそれをもとに最終的な回答を返します。`tool_choice` には `auto`、`none`、`required`、または特定の関数を指定できます。

## ウェブ検索

リクエストに `"web_search": true` を加えます（または `tools` に `{"type": "web_search"}` を入れます）。ゲートウェイはまず会話の内容をもとにウェブをリアルタイムで検索し、最大 5 件の結果とそのリンクを参考資料としてモデルに渡します。モデルはそれを踏まえて回答し、出典を示します。検索自体は無料で、参考資料は入力トークンとして課金されます。

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "web_search": true, "messages": [{"role": "user", "content": "今日の主なテクノロジーニュースは何ですか"}]}'
```

## Anthropic ネイティブ API（/anthropic）

- エンドポイントは `https://nezhagate.com/anthropic/v1/messages` で、リクエストとレスポンスは Anthropic の Messages 形式です。ストリーミングのイベント、ツール呼び出し（`tool_use` / `tool_result`）、画像ブロックはすべて Anthropic と同じなので、Anthropic SDK や Claude Code をそのまま使えます。

- 認証には `x-api-key: YOUR_API_KEY` を使います（`Authorization: Bearer` も使えます）。キーは `/v1` と同じものです。`anthropic-version` と `anthropic-beta` ヘッダーは送ったとおりに転送されます。`max_tokens` は必須です。

- ここで使えるのは Claude モデルだけで、ほかのモデルを指定すると 404 `not_found_error` が返ります。このほか、`POST /anthropic/v1/messages/count_tokens`（トークン数の計算、無料）と `GET /anthropic/v1/models` も使えます。

- 思考をオンにするには `"thinking": {"type": "adaptive", "display": "summarized"}` を指定します（思考がオンのとき、`temperature` は 1 にする必要があります）。

- エラーは Anthropic の形式 `{"type": "error", "error": {"type": ..., "message": ...}}` で返ります。残高が足りないときは 402 `billing_error` になります。

- このエンドポイントでは、ウェブ検索は既定でオフです（Claude Code が毎ターン繰り返し送る先頭部分を変えてしまい、キャッシュが効かなくなるのを防ぐためです）。オンにするには `x-web-search: 1` ヘッダーを付けてください。

```
curl https://nezhagate.com/anthropic/v1/messages \
  -H "x-api-key: YOUR_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "max_tokens": 1024, "messages": [{"role": "user", "content": "光合成を一文で説明してください"}]}'
```

[Claude Code で使う →](https://nezhagate.com/ja/docs/integrations/claude-code)

## 回線と安定性

- どのモデルも複数の回線で提供しています。ある回線がエラーになったり、タイムアウトしたり、混み合っていたりすると、ゲートウェイは内容を返し始める前に次の回線へ自動で切り替えます。再試行する必要はなく、二重に課金されることもありません。

- ストリーミングは、出力が始まった後は回線を切り替えません。途中で切れた場合は、切れるまでに生成された分が課金されます（[課金と返金](https://nezhagate.com/ja/docs/guide/billing) を参照）。

- すべての回線が混み合っているときは、ゲートウェイが `Retry-After` 付きで 429 を返します。その秒数だけ待ってから再試行してください。失敗したリクエストは課金されません。各モデルの状態は [サービス状態](https://nezhagate.com/ja/status) で確認できます。

## エラーと返金

エラーは `error` オブジェクト（`message`、`type`、`code`、`param`）で返ります。判定には HTTP ステータスコードと `code` を使い、`message` の文面では判定しないでください。失敗したリクエストは課金されません。完全な一覧は [エラーコード](https://nezhagate.com/ja/docs/guide/errors) をご覧ください。

| HTTP | code | 原因 | 対処 |
| --- | --- | --- | --- |
| 400 | invalid_messages / invalid_role / invalid_max_tokens | 対話リクエストの `messages` がない・空・形式が正しくない、`role` が許可された値ではない、または `max_tokens` が正の整数ではありません。`param` が該当するフィールドを示します。 | `param` が示すフィールドを直してください。 |
| 400 | model_not_found | モデル ID のつづりが違う・`model` がない・そのモデルをこのエンドポイントでは使えない（たとえば対話モデルで画像のエンドポイントを呼び出した）のいずれかです。 | `GET /v1/models` または [API リファレンス](https://nezhagate.com/ja/docs/api) にあるモデル ID を使ってください。 |
| 400 | max_tokens_too_small | 推論モデルが `max_tokens` をすべて思考に使い切り、回答を書けませんでした（ストリーミングしない対話）。 | `max_tokens` を増やしてから再試行してください。 |
| 4xx | invalid_request | モデル提供元がリクエストを拒否しました（コンテキストが長すぎる、対応していないパラメータがあるなど）。ステータスコードと `message` はモデル提供元が返したまま渡され、`code` はモデル提供元の値です。 | `message` の内容に沿ってリクエストを変更してください。 |
| 401 | invalid_api_key | キーが存在しない・削除された・無効化されているか、アカウントが停止されています。 | コンソールの「API Keys」ページでキーを確認してください。 |
| 402 | insufficient_quota | このリクエストの分を確保するだけの残高がありません。ゲートウェイはまずリクエストにかかりうる最大の費用を確保するため、同時に多くの呼び出しを送ったときにも起こることがあります。 | 一度に多くの呼び出しを送った直後なら、数秒待って再試行してください。そうでなければチャージしてください。 |
| 403 | permission_denied | そのモデルがキーのモデル許可リストに入っていません。 | 許可リストにあるモデルを使うか、コンソールで許可リストを変更してください。 |
| 429 | rate_limit_exceeded | このキーに設定した 1 分あたりのリクエスト数の上限を超えました（直近 60 秒で数えます）。`Retry-After` ヘッダーは付きません。 | 数秒待ってから再試行するか、コンソールでこのキーの上限を引き上げてください。 |
| 429 | rate_limit_exceeded | このモデルのすべての回線が混み合っていて、リクエストは送られませんでした。対話エンドポイントでのみ発生し、画像と動画のタスクは拒否されずに順番待ちになります。OpenAI 互換のエンドポイントでは `Retry-After` が付きます。 | `Retry-After` の秒数だけ待ってから再試行してください。 |
| 502 | upstream_timeout | 回線がタイムアウトしました（最初のトークンがなかなか返ってこない場合を含みます）。 | 再試行してください。長い回答には `stream: true` を使ってください。 |
| 502 | upstream_unavailable | 回線でエラーが起きたか、一時的に利用できません。 | しばらくしてから再試行してください。 |
| 502 | upstream_busy | モデル提供元がレート制限をかけています。モデル提供元の 429 をそのまま 429 として返すことはなく、代わりにこの 502 を返します。 | しばらくしてから再試行してください。 |
| 502 | empty_completion | モデル提供元が空の内容を返しました。リクエストの内容に対する判定ではありません。 | 再試行してください。 |
| 503 | model_maintenance | モデルのメンテナンス中で、リクエストを受け付けていません。その間、別のモデルが代わりに回答することもありません。 | メンテナンスが終わってから再試行してください。状況は [サービス状態](https://nezhagate.com/ja/status) で確認できます。 |

ストリーミングで出力が始まった後にエラーが起きても、ステータスコードは変わりません。エラーは `error` を含むデータ行としてストリーム内に届くか、ストリームが（`data: [DONE]` なしで）そのまま終わります。いずれの場合も、途中で切れたものとして扱ってください。
