> ## Documentation Index
> Fetch the complete documentation index at: https://docs.laozhang.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Claude API（Anthropic Messages）の使い方

> LaoZhang APIをAnthropic Messages形式で呼び出します。/v1/messagesのヘッダー、cURLとPython SDKの例、コンテンツブロック、ストリーミング、ツール、エラー対応をまとめています。

Claudeプロトコルは、AnthropicのMessages API形式です。Anthropic SDKやClaude Codeは、ベースURLを変更し、LaoZhang APIのキーを使うだけで接続できます。

| 項目 | 内容 |
| - | - |
| エンドポイント | `POST https://api.laozhang.ai/v1/messages` |
| ヘッダー | `Authorization: Bearer` にAPIキー、加えて `anthropic-version: 2023-06-01` |
| 必須の本文フィールド | `model`、`messages`、`max_tokens` |
| レスポンス | `content[]` の型付きブロック |
| SDKのベースURL | Anthropic Python SDKの `base_url` を `https://api.laozhang.ai` にする |
| 例のモデル | `glm-5.2` |

```text theme={null}
POST https://api.laozhang.ai/v1/messages
```

アプリケーションがOpenAI SDKを使っている場合は、代わりに[OpenAIプロトコル](https://docs.laozhang.ai/ja/api-reference/chat-completions.md)を使ってください。以下のモデルは、どちらの形式でも呼び出せます。2つの形式はリクエストとレスポンスの構造が異なるため、クライアントごとにどちらか一方を選びます。

## モデルを選ぶ

[モデルカタログ](https://docs.laozhang.ai/ja/models.md)の**Endpoints**列にAnthropic Messagesが含まれるモデルを使います。2026年10月18日時点の公開価格では、次のモデルが該当します。

* Claudeモデル：`claude-sonnet-5-5`、`claude-opus-5-5` など11種類。`default` トークングループで掲載されています。全モデルと価格は、[モデルカタログ](https://docs.laozhang.ai/ja/models.md)のAnthropicのセクションを参照してください。
* `glm-5.2`：このページの例で使います。`default` トークングループで掲載されており、このプロトコルでは公式のMessages APIとほぼ同じように動作します。
* `deepseek-v4-pro`
* `deepseek-v4-flash`

> [!NOTE]
>
> **Claudeモデルは2026年10月18日から再び利用できます。** 切り替える前に、下の「Claudeモデルの制限」を読んでください。詳細は[お知らせ](https://docs.laozhang.ai/en/announcements/claude-models-2026-10.md)にあります。

モデルIDは、製品名やBedrock、Vertex AIのIDから組み立てずに、カタログまたは[コンソールの料金ページ](https://api.laozhang.ai/account/pricing)から正確にコピーしてください。

### Claudeモデルの制限

Claudeモデルは、ストリーミング、ツール使用、adaptive thinking、5分と1時間のプロンプトキャッシュ、画像入力に対応しています。Anthropic自身のAPIとは、次の点が異なります。

* **出力の長さ：** 1回のレスポンスは32,768トークンが上限です。これより大きい `max_tokens` は上限に切り詰められます。
* **PDFとドキュメント：** `document` コンテンツブロックには対応していません。先にテキストを抽出し、`text` ブロックで送ってください。
* **サーバーツール：** `web_search`、`web_fetch`、`code_execution` などのAnthropicのサーバーツールには対応していません。宣言したリクエストは400を返します。
* **その他のエンドポイント：** `/v1/messages/count_tokens`、Message Batches、Files APIは利用できません。
* **停止シーケンス：** 停止シーケンスに一致したときは、`stop_reason` が `end_turn`、`stop_sequence` が `null` になります。
* **Haikuの長いプロンプト：** `claude-haiku-5-5` のプロンプトがキャッシュの読み書きを含めて100,000トークンを超えると、リクエスト全体がカタログの段階料金にある長いコンテキストの料金で課金されます。

## メッセージを送る

[トークン管理](https://api.laozhang.ai/token)でAPIキーを作成します。課金方式は、従量優先（推奨。コンソールの表示は「按量优先」）または従量課金（「按量计费」）にしてください。作成したキーは、ターミナルで環境変数に設定します。

```bash theme={null}
export LAOZHANG_API_KEY="YOUR_LAOZHANG_API_KEY"
```

> [tab] cURL
>
> ```bash theme={null}
> curl --fail-with-body --max-time 120 \
>   "https://api.laozhang.ai/v1/messages" \
>   -H "Authorization: Bearer $LAOZHANG_API_KEY" \
>   -H "anthropic-version: 2023-06-01" \
>   -H "content-type: application/json" \
>   -d '{
>     "model": "glm-5.2",
>     "max_tokens": 1024,
>     "system": "あなたは簡潔に答えるアシスタントです。",
>     "messages": [
>       {"role": "user", "content": "「connected」とだけ返信してください"}
>     ]
>   }'
> ```

> [tab] Python
>
> `python -m pip install anthropic` でSDKをインストールします。
>
> ```python theme={null}
> import os
> from anthropic import Anthropic
>
> client = Anthropic(
>     api_key=os.environ["LAOZHANG_API_KEY"],
>     base_url="https://api.laozhang.ai",
>     timeout=120.0,
>     max_retries=0,
> )
> message = client.messages.create(
>     model="glm-5.2",
>     max_tokens=1024,
>     system="あなたは簡潔に答えるアシスタントです。",
>     messages=[{"role": "user", "content": "「connected」とだけ返信してください"}],
> )
> for block in message.content:
>     if block.type == "text":
>         print(block.text)
> ```

回答は `connected` になります。

SDKはAPIキーと `anthropic-version` ヘッダーを自動で送り、ベースURLに `/v1/messages` を付加します。`base_url` には `/v1` を含めないでください。

システムプロンプトは、`system` ロールのメッセージではなく、トップレベルの `system` フィールドに指定します。

`messages` は `user` と `assistant` のターンが交互に並びます。会話を続けるには、これまでのターンに続けて新しい `user` メッセージを送ります。

## レスポンスを読み取る

読み取るフィールドだけを残したレスポンスの例です。

```json theme={null}
{
  "type": "message",
  "role": "assistant",
  "model": "glm-5.2",
  "content": [
    {"type": "text", "text": "connected"}
  ],
  "stop_reason": "end_turn",
  "usage": {"input_tokens": 21, "output_tokens": 4}
}
```

`content` はブロックのリストで、1つのレスポンスに複数のブロックが入ることがあります。`content[0]` がテキストだと決めつけず、各ブロックを `type` で判断して読み取ってください。

| ブロックの型 | 内容 | 対応 |
| - | - | - |
| `text` | `text` に入った回答 | 表示または保存する。 |
| `thinking` | `thinking` に入ったモデルの推論 | 表示する回答には含めない。 |
| `tool_use` | `id`、`name`、`input` を持つツール呼び出し | ツールを実行し、`tool_result` を返す。 |

`stop_reason` は、回答が終わった理由を示します。

* `end_turn`：回答が完了した。
* `max_tokens`：出力の上限で途中で切れた。
* `tool_use`：モデルがツールの結果を待っている。

トークン数は `usage` に入ります。リクエストごとの課金額は[呼び出しログ](https://docs.laozhang.ai/en/faq/call-logs.md)で確認できます。

## レスポンスをストリーミングする

`"stream": true` を追加すると、回答をserver-sent eventsとして受け取れます。

テキストは、`delta.type` が `text_delta` の `content_block_delta` イベントで届き、ストリームは `message_stop` イベントで終わります。

> [tab] cURL
>
> `-N` を付けると、cURLの出力バッファリングが無効になり、イベントが届くたびに表示されます。
>
> ```bash theme={null}
> curl --fail-with-body -N --max-time 300 \
>   "https://api.laozhang.ai/v1/messages" \
>   -H "Authorization: Bearer $LAOZHANG_API_KEY" \
>   -H "anthropic-version: 2023-06-01" \
>   -H "content-type: application/json" \
>   -d '{
>     "model": "glm-5.2",
>     "max_tokens": 1024,
>     "stream": true,
>     "messages": [
>       {"role": "user", "content": "変数名を付けるときのコツを3つ、短く教えてください。"}
>     ]
>   }'
> ```

> [tab] Python
>
> ```python theme={null}
> import os
> from anthropic import Anthropic
>
> client = Anthropic(
>     api_key=os.environ["LAOZHANG_API_KEY"],
>     base_url="https://api.laozhang.ai",
>     timeout=300.0,
>     max_retries=0,
> )
> with client.messages.stream(
>     model="glm-5.2",
>     max_tokens=1024,
>     messages=[{"role": "user", "content": "変数名を付けるときのコツを3つ、短く教えてください。"}],
> ) as stream:
>     for text in stream.text_stream:
>         print(text, end="", flush=True)
> print()
> ```

ストリーミングのレスポンスは、次の順序で届きます。必要なフィールドだけに省略しています。

```text theme={null}
event: message_start
data: {"type":"message_start","message":{"type":"message","role":"assistant","content":[]}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"1. 変数名は"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"}}

event: message_stop
data: {"type":"message_stop"}
```

ストリームを読み取るときの注意点です。

* ブロックの `index` ごとに `text_delta` を連結すると、回答を再構成できます。
* thinkingとツールの入力は別のdeltaタイプで届きます。ストリームに `ping` イベントが含まれることもあるため、扱わないイベントタイプは読み飛ばしてください。
* Pythonの `text_stream` はテキストだけを返し、`message_stop` のあとで終了します。
* `message_stop` の前に接続が閉じた場合は、回答が途中で終わったものとして扱ってください。

## ツールを使う

`tools` 配列で定義したツールは、LaoZhang APIではなく、お使いのアプリケーションで実行されます。回答が `stop_reason: "tool_use"` で止まったら、次の手順で進めます。

1. 各 `tool_use` ブロックの `id`、`name`、`input` を読み取る。
2. 対応する関数を、自分のコードで実行する。
3. アシスタントのターンをそのまま付けて、次のリクエストを送る。続けて、呼び出しごとに1つの `tool_result` ブロックを持つ `user` ターンを追加する。`tool_use_id` は、対応する呼び出しの `id` と一致させる。

この続きのリクエストの `messages` 配列は、次のようになります。

```json theme={null}
[
  {"role": "user", "content": "パリの天気は？"},
  {"role": "assistant", "content": [
    {"type": "tool_use", "id": "toolu_01", "name": "get_weather", "input": {"city": "Paris"}}
  ]},
  {"role": "user", "content": [
    {"type": "tool_result", "tool_use_id": "toolu_01", "content": "18°C、くもり"}
  ]}
]
```

次のループは、Python SDKでやり取り全体を実行します。天気を返す関数を宣言し、モデルから求められたらローカルで実行して、結果を返します。モデルがテキストで回答するまで繰り返します。

```python theme={null}
import os
from anthropic import Anthropic

client = Anthropic(
    api_key=os.environ["LAOZHANG_API_KEY"],
    base_url="https://api.laozhang.ai",
    timeout=120.0,
    max_retries=0,
)
tools = [{
    "name": "get_weather",
    "description": "都市の現在の天気を取得する",
    "input_schema": {
        "type": "object",
        "properties": {"city": {"type": "string", "description": "都市名"}},
        "required": ["city"],
    },
}]


def get_weather(city):
    # 天気サービスの呼び出しなど、自分の処理に置き換える
    return f"{city}：くもり、18°C"


messages = [{"role": "user", "content": "パリの天気は？"}]
for _ in range(5):
    message = client.messages.create(
        model="glm-5.2",
        max_tokens=1024,
        tools=tools,
        messages=messages,
    )
    tool_uses = [block for block in message.content if block.type == "tool_use"]
    if not tool_uses:
        break
    messages.append({"role": "assistant", "content": message.content})
    results = []
    for block in tool_uses:
        if block.name == "get_weather":
            output = get_weather(**block.input)
        else:
            output = f"不明なツール：{block.name}"
        results.append({
            "type": "tool_result",
            "tool_use_id": block.id,
            "content": output,
        })
    messages.append({"role": "user", "content": results})

print("".join(block.text for block in message.content if block.type == "text"))
```

続きのリクエストにも毎回同じ `tools` を送り、アシスタントのターンは返ってきたとおりに保持してください。

`web_search_*` や `code_execution_*` などのAnthropicのサーバーツールは、ゲートウェイでは実行されません。Claudeモデルは、これらを宣言したリクエストを400エラーで拒否します。

それ以外のモデルは、検索やコードを実行せず、通常の `tool_use` ブロックとして呼び出しを返します。この呼び出しはクライアントツールと同じようにアプリケーション側で処理するか、これらのツールをリクエストから外してください。

## Claude Codeで使う

Claude Codeは、Anthropic Messages形式を使います。

* `ANTHROPIC_BASE_URL` を `https://api.laozhang.ai`（`/v1` を付けないホストのルート）に設定します。
* **Endpoints** にAnthropic Messagesが含まれるモデルを選びます。`claude-sonnet-5-5` や `glm-5.2` などで、どちらも `default` トークングループで利用できます。
* `default` グループで、課金方式が従量優先のトークンを使います。以前に `Claude Code` グループ（旧claude\_code）で作成したトークンは引き続き使えます。新しいトークンにこのグループは必要ありません。

`~/.claude/settings.json` の完全な例は、[LaoZhang APIでのClaude Code設定](https://docs.laozhang.ai/en/scenarios/programming/claude-code.md)を参照してください。Claude Codeが400 ValidationExceptionを返す場合は、[Claude Codeの400 ValidationExceptionの対処](https://docs.laozhang.ai/en/faq/claude-code-aws-400-validation-error.md)を参照してください。

## トラブルシューティング

* **401：** `Authorization: Bearer` ヘッダーを確認してください。使うのは、アカウントのAccessTokenではなく、[トークン管理](https://api.laozhang.ai/token)で作成したモデル用のAPIキーです。
* **`max_tokens` に触れた400：** `max_tokens` を追加してください。Chat Completionsと違い、Messagesのリクエストでは必須です。
* **リクエストURLに `/v1/v1/messages` が含まれる：** SDKのベースURLが `/v1` で終わっています。`https://api.laozhang.ai` に設定してください。
* **404、またはモデルが見つからない：** モデルIDを正確に確認し、[モデルカタログ](https://docs.laozhang.ai/ja/models.md)で、お使いのトークングループにAnthropic Messagesが表示されているか確認してください。
* **Claude Codeが `400 ValidationException` または `Extra inputs are not permitted` を返す：** [Claude Codeの400 ValidationExceptionの対処](https://docs.laozhang.ai/en/faq/claude-code-aws-400-validation-error.md)に従ってください。
* **Claudeモデルで `web_search` などのサーバーツールを宣言して400になる：** `tools` からサーバーツールを外してください。検索はアプリケーション側で実行し、結果を `tool_result` ブロックとして返します。
* **upstream-busyのメッセージ付きの529：** ピーク時に処理能力が不足しています。少し待ってから再試行してください。Anthropic SDKは、既定で529を自動的に再試行します。

タイムアウトや5xxエラーが出たときは、再送する前に[呼び出しログ](https://api.laozhang.ai/log)を確認してください。Pythonの例では、再試行のタイミングをアプリケーション側で決められるように、自動リトライを無効にしています。

## 関連ドキュメント

* [Anthropic Messages APIリファレンス](https://platform.claude.com/docs/en/api/messages/create)
* [Anthropicのストリーミングリファレンス](https://platform.claude.com/docs/en/build-with-claude/streaming)
* [Anthropicのツール使用の概要](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview)
* [Anthropicのモデル一覧](https://platform.claude.com/docs/en/models/overview)
* [OpenAIプロトコル：Chat Completions](https://docs.laozhang.ai/ja/api-reference/chat-completions.md)
* [モデルの提供状況と権限](https://docs.laozhang.ai/en/faq/model-availability.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.