コンテンツにスキップ

メッセージ (Anthropic)

POST /v1/messages

Anthropic Messages API 形式のリクエストを受け付けます。リクエストは内部の OpenAI 互換形式に変換されて処理され、レスポンスは Anthropic 形式に戻してから返却されます。

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

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)
  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 を参照してください。
  • 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 秒の無通信で中断します)でも、長い推論の間、接続が維持されます。

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

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

予約名 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 で取得した file_id を参照する file) が動作します。ワイヤーフォーマットの詳細は Anthropic のコンテンツブロックドキュメント を参照してください。vision capability を持たないモデルへのリクエストは、推論実行前に 400 invalid_request_error で拒否されます。url ソースは URL の要件 を満たす必要があります。

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