# メッセージ (Anthropic)

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

```http
POST /v1/messages
```

[Anthropic Messages API](https://docs.anthropic.com/en/api/messages) 形式のリクエストを受け付けます。リクエストは内部の OpenAI 互換形式に変換されて処理され、レスポンスは Anthropic 形式に戻してから返却されます。

これにより、コードを変更することなく Anthropic SDK を ai& と組み合わせて使えます。

<Aside type="note">
  これは互換アダプタです。リクエストパラメータをフルに使う場合は、[チャット補完](/ja/api/chat-completions/)
  を直接使用してください。
</Aside>

## 使い方

<Tabs>
  <TabItem label="Python">
    ```python
    from anthropic import Anthropic

    client = Anthropic(
        api_key="sk-your-api-key",
        base_url="https://api.aiand.com",
    )

    message = client.messages.create(
        model="google/gemma-4-31b-it",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello!"}],
    )

    print(message.content[0].text)
    ```

  </TabItem>
  <TabItem label="JavaScript">
    ```javascript
    import Anthropic from "@anthropic-ai/sdk";

    const client = new Anthropic({
      apiKey: "sk-your-api-key",
      baseURL: "https://api.aiand.com",
    });

    const message = await client.messages.create({
      model: "google/gemma-4-31b-it",
      max_tokens: 1024,
      messages: [{ role: "user", content: "Hello!" }],
    });

    console.log(message.content[0].text);
    ```

  </TabItem>
</Tabs>

## 仕組み

1. リクエストが Anthropic Messages 形式で到着
2. ai& がそれを OpenAI 形式に変換して推論を実行
3. レスポンスを Anthropic 形式に戻して返却

ストリーミングにも対応しています。認証は他のエンドポイントと同じく `Authorization: Bearer` ヘッダを使用します。

## サポートされるパラメータ

Anthropic Messages API の標準パラメータを受け付けます。基となるモデルに対応する機能がないパラメータは、以下の例外を除き無視されます。

- **`tools`** — クライアントツール(type が `custom`、または type なし)は function tool に変換されます。Anthropic のサーバーサイドツール(`web_search_*`、`web_fetch_*`、`code_execution_*`、`tool_search_*` など)は Anthropic の API 内部で実行されるため提供できません。Anthropic 定義のクライアントツール(`bash_*`、`text_editor_*`、`computer_*` など)には Anthropic 以外のモデルが従える `input_schema` がないため、カスタムツールとして送信してください。Anthropic 定義のツール type を含むリクエストは、ツール名を示す `400 invalid_request_error` で拒否されます。
- **`tool_choice`** — `auto`、`any`、`none`、`tool` が対応付けられ、`disable_parallel_tool_use: true` は `parallel_tool_calls: false` になります。
- **`output_config.effort` と `thinking`** — `output_config.effort` は reasoning のレベルを指定し、`thinking: { "type": "disabled" }` は `none` を公開している名前付きの推論モデルで reasoning を無効にします。例外は [reasoning](#reasoning) を参照してください。
- **`tool_result` 内の画像** — vision 対応モデルでは、ツール結果内の画像はそのターンのツール結果の後に続く user メッセージとしてモデルに渡され、それぞれ `tool_use_id` でラベル付けされます。テキストのみのモデルでは、ツールのテキストに `[Image omitted…]` のプレースホルダーが入ります。

## エラー

このエンドポイントのエラーは Anthropic のエンベロープ `{"type":"error","error":{"type":"…","message":"…"},"request_id":"…"}` を使用し、型名も Anthropic のもの(`invalid_request_error`、`authentication_error`、`permission_error`、`not_found_error`、`rate_limit_error`、`api_error` など)です。モデルのコンテキストウィンドウを超えるリクエストは、メッセージが `prompt is too long` で始まり `capability_rejected: prompt_too_long` トークンを含む `400` となります。これは Claude Code の自動圧縮が検出する文言です。

## キープアライブ

ストリーミング応答が 15 秒間アイドルになると、キープアライブが送られます。`message_start` の前は SSE のコメント行、その後は `ping` イベントです。バイト数でストールを検出するクライアント(Claude Code は 300 秒の無通信で中断します)でも、長い推論の間、接続が維持されます。

## reasoning

`thinking` ブロックは reasoning のレベルを指定するものではありません (`budget_tokens` も `enabled` も当社の effort スケールには対応しません)。そのため、深さは原則モデル自身のデフォルトに委ねられます。レベルを指定するには、モデルが公開している [`reasoning_efforts`](/ja/models/catalog/) のいずれかを `reasoning_effort` として送信するか、Claude Code が `/effort` で送信する Anthropic 本来の `output_config: { "effort": "…" }` を使用してください。両方がある場合は明示的な `reasoning_effort` が優先されます。扱いはどちらも `/v1/chat/completions` と同一で、モデルの一覧にないレベルは一つ上のレベル(なければ最も高いレベル)で実行され(送信したレベルより高コストになる場合があります)、effort の語彙にない値は送信したフィールド名を示す `400` となり、適用されたレベルは [`X-Reasoning-Effort`](/ja/reference/response-headers/) で返されます。

例外は `thinking: { "type": "disabled" }` です。これは「reasoning を一切行わない」という、当社のスケールで表現できる唯一の指定であるため、`reasoning_effort: "none"` として適用し、その確認として `X-Reasoning-Effort: none` を返します。`output_config.effort` より優先されるので、thinking を無効にしたリクエストが、そのフィールドの effort で課金されることはありません。`none` を公開していない推論モデルでは、明示的な `reasoning_effort` `none` と同じ文で、`thinking` を指す `400` になります。エラー文は [エラー](/ja/errors/#reasoning-をオフにする) にあります。`reasoning_effort` を併せて送信した場合はそちらが適用され、ブロックはレスポンス形式の制御のみに使われます。`reasoning` 機能を持たないモデルでは、抑制する対象がないため無視されます。

予約名 [`auto`](/ja/models/auto/) では、このブロックはいずれの場合もレベルを指定しません。`auto` は effort を一切受け付けないため、reasoning を無効化したい場合はモデルを直接指定してください。`auto` では Claude Code の `output_config.effort` は拒否せず無視されます。

`thinking` が制御するのは、その reasoning を返すかどうかです。`thinking: { "type": "enabled" }` (`"adaptive"` も同様に受け付けます) を送信すると、reasoning は text ブロックの前に `thinking` コンテンツブロックとして返され、ストリーミングでは `thinking_delta` イベントとして流れます。指定しない場合は回答のみが返ります。

当社が返す `thinking` ブロックに `signature` は含まれません。署名する上流が存在しないため、Anthropic 本家の API にそのまま送り返すと拒否されます。ai& に送り返す場合は問題ありません。リクエストに含まれる `thinking` ブロックはモデルに到達する前に破棄されます。

reasoning モデルの中には、回答全体を reasoning の中に書き、メッセージ本文を空のまま返すものがあります。そうしたレスポンスは `thinking` を要求したかどうかに関わらず通常の `text` ブロックとして返されるため、成功レスポンスには必ず 1 つ以上のコンテンツブロックが含まれます。

## 画像入力

画像コンテンツブロックは vision 対応モデルでサポートされます。Anthropic の 3 つのソースタイプすべて (`base64`、`url`、および [`POST /v1/files`](/ja/api/files/) で取得した `file_id` を参照する `file`) が動作します。ワイヤーフォーマットの詳細は [Anthropic のコンテンツブロックドキュメント](https://docs.anthropic.com/en/api/messages#content-blocks) を参照してください。`vision` capability を持たないモデルへのリクエストは、推論実行前に `400 invalid_request_error` で拒否されます。`url` ソースは [URL の要件](/ja/capabilities/vision/#url-の要件) を満たす必要があります。

## ドキュメント入力

PDF の `document` ブロックは vision 対応モデルでサポートされます。ソースは `base64` (`media_type: "application/pdf"`) と、`purpose: "document"` でアップロードしたファイルを参照する `file` です。各ページは画像としてモデルに渡され、`tool_result` 内の PDF はツール結果内の画像と同じように扱われます。`base64` の PDF は `document` ファイルとして保存されて再利用され、制限は [Chat Completions](/ja/api/chat-completions/) のインライン PDF と同じです。ただし[ゼロデータリテンション](/ja/organizations/zero-data-retention/)の組織では、保存されずメモリ上で描画され、[専用の制限](/ja/organizations/zero-data-retention/#インライン-pdf)が適用されます。`text` と `content` ソースはテキストとしてモデルに渡されます。`url` ソースは取得されませんが、[URL の要件](/ja/capabilities/vision/#url-の要件) を満たさない場合はリクエストが拒否されます。
