コンテンツへスキップ
Anthropic 形式

Anthropic 形式

POST /v1/messages は、Anthropic Messages 形式のリクエストを受け取り、ストリーミングの有無にかかわらず同じ形式で応答します。Anthropic SDK や、Claude Code のようにそれを基にしたツールで使えます。ベース URL を設定し、Shannon の API キーを使い、Shannon のモデル ID を指定してください。

POST https://api.shannon-ai.com/v1/messages

Anthropic SDK を Shannon のベース URL に向けます。SDK が /v1/messages を付加し、x-api-key ヘッダーでキーを送信します。

import anthropic

client = anthropic.Anthropic(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com",
)

message = client.messages.create(
    model="shannon-3",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Say hello in one sentence."}],
)

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

応答は、content がブロックのリストになっているメッセージです。ブロックは type で見分けてください。モデルが推論した場合は、最初のブロックが thinking で、テキストはその後に来ます。

200 JSON
{
  "id": "msg_5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
  "type": "message",
  "role": "assistant",
  "model": "shannon-3",
  "content": [
    {
      "type": "thinking",
      "thinking": "The user wants a greeting in one sentence. Keep it short and friendly."
    },
    {
      "type": "text",
      "text": "Hello, it is good to meet you."
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 1184,
    "output_tokens": 46
  }
}

ヘッダー

ヘッダー 値 説明
x-api-key YOUR_API_KEY API キー。代わりに Authorization: Bearer YOUR_API_KEY も使えます。
content-type application/json 必須。
anthropic-version 2023-06-01 受け付けますが、必須ではありません。Anthropic SDK は 2023-06-01 を送信します。値に関係なく、応答の形式は同じです。
anthropic-beta 受け付けますが、必須ではありません。
x-request-id 任意。リクエストに付ける独自の ID。応答にそのまま返されます。指定しない場合、応答には 十六進数 12 文字の ID が付きます。

リクエストフィールド

必須なのは messages だけです。適用モデル 列は、そのフィールドが応答に影響するモデルを示します。ホスト型オープンウェイトモデルとは、モデルリストにある十二個の ID のことです。Shannon 3 ファミリーは shannon-3、shannon-3-pro、shannon-3.1、shannon-3.1-pro です。 モデルと料金

フィールド 型 デフォルト 説明 適用モデル
model string shannon-1.6-lite モデルリストにある Shannon のモデル ID。リクエストごとに送信してください。大文字小文字は区別されません。それ以外の名前では 400 の unknown model が返されるため、独自のモデル名を送信するツールは Shannon の ID を使うよう設定する必要があります。 すべてのモデル
messages array 必須。 会話。古いメッセージから順に、user と assistant のロールで並べます。下記の「メッセージとコンテンツブロック」を参照してください。 すべてのモデル
system string | array モデルへの指示。文字列、またはテキストブロックの配列です。下記の「システムプロンプト」を参照してください。 ホスト型オープンウェイトモデル、shannon-1.6-*、shannon-2-*、shannon-coder-1
max_tokens integer 4096 応答の上限(トークン数)。このエンドポイントでは省略可能ですが、Anthropic SDK は常に送信します。1〜65,536 の範囲外の値は、その範囲内に丸められます。リクエストの実行中に残高から確保しておく量でもあります。 ホスト型オープンウェイトモデル、shannon-1.6-lite、shannon-1.6-pro、shannon-coder-1
stream boolean false true を指定すると、応答を server-sent events として送信します。下記の「ストリーミング」を参照してください。 すべてのモデル
temperature number サンプリング温度。ホスト型オープンウェイトモデルでは、値は 0〜2 の範囲に収められます。 ホスト型オープンウェイトモデル、shannon-1.6-lite、shannon-1.6-pro、shannon-coder-1
top_p number Nucleus サンプリング。 ホスト型オープンウェイトモデル
stop_sequences array 最大 4 個の文字列。最初に現れたものの手前で回答が終了します。stop_reason は end_turn のままです。 ホスト型オープンウェイトモデル
tools array モデルが呼び出せるツール。それぞれ {"name", "description", "input_schema"} の形式で指定します。下記の「ツール」を参照してください。 すべてのモデル
tool_choice object {"type": "auto"} はモデルに判断させ、{"type": "any"} はいずれかのツールを必ず呼び出させ、{"type": "tool", "name": "…"} は指定したツールを呼び出させます。 ホスト型オープンウェイトモデル
thinking object モデルが回答する前にどれだけ推論するか。下記の「思考」を参照してください。 ホスト型オープンウェイトモデル
web_search boolean false この形式への Shannon 独自の追加:true を指定すると、モデルは回答前にウェブを検索できます。 shannon-1.6-*、shannon-2-*、Shannon 3 ファミリー

max_tokens を指定しない場合は 4,096、shannon-coder-1 では 65,536 です。

既存のクライアントコードをそのまま動かせるよう、metadata、top_k、service_tier、およびブロック上の cache_control マーカーは受け付けられます。これらは応答を変えません。ホスト型オープンウェイトモデルのプロンプトキャッシュは自動です。

スキーマに従った JSON の回答は、Chat Completions では response_format、Responses では text.format で要求します。 構造化出力

システムプロンプトと思考を指定したリクエスト

このリクエストは、システムプロンプト、思考バジェット、temperature、停止シーケンスを送信します。これらすべてを適用するホスト型オープンウェイトモデルを使用しています。

import anthropic

client = anthropic.Anthropic(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com",
)

message = client.messages.create(
    model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
    max_tokens=4096,
    system="You are a physics teacher. Answer in two sentences.",
    thinking={"type": "enabled", "budget_tokens": 2048},
    temperature=0.3,
    stop_sequences=["\n\n"],
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

for block in message.content:
    if block.type == "thinking":
        print("reasoning:", block.thinking)
    elif block.type == "text":
        print("answer:", block.text)
print(message.usage)

ホスト型オープンウェイトモデルでは、usage にプロンプトキャッシュから読み取ったトークンが、その他の入力トークンとは別に報告されます。

200 JSON
{
  "usage": {
    "input_tokens": 31,
    "cache_read_input_tokens": 0,
    "cache_creation_input_tokens": 0,
    "output_tokens": 62
  }
}

システムプロンプト

system は文字列、または [{"type": "text", "text": "…"}] の形式のテキストブロックの配列です。ブロックのテキストは改行で連結されます。

ホスト型オープンウェイトモデル、shannon-1.6-lite、shannon-1.6-pro、shannon-2-lite、shannon-2-pro、shannon-coder-1 で適用されます。Shannon 3 ファミリーの ID では、必ず守らせたい指示をユーザーメッセージに入れてください。

メッセージとコンテンツブロック

メッセージには role(user または assistant)と content があります。content は文字列、またはブロックの配列です。

ブロック 説明 利用可能なモデル
{"type": "text", "text": "…"} テキスト。 すべてのモデル
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}
{"type": "image", "source": {"type": "url", "url": "…"}}
user メッセージ内の画像。base64 または URL で指定します。 Shannon 3 ファミリー、shannon-1.6-lite、shannon-1.6-pro、および画像入力に対応するホスト型オープンウェイトモデル
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} user メッセージ内のドキュメント(PDF、Word、PowerPoint、Excel)。base64 または URL で指定します。 Shannon 3 ファミリー
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} assistant メッセージ内:以前の応答でモデルが行ったツール呼び出し。 すべてのモデル
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} user メッセージ内:その呼び出しの結果。content は文字列、またはテキストブロックのリストです。 すべてのモデル

以前の応答の content はそのまま送り返せます。text ブロックと tool_use ブロックは読み取られ、thinking ブロックはスキップされます。

Shannon ティアでは、画像とドキュメントは最後の user メッセージから読み取られます。サイズと上限については別のページを参照してください。 画像とファイル

思考

ホスト型オープンウェイトモデルは、thinking を推論 effort に対応付けます。このフィールドがない場合、effort は high になります。

形式 budget_tokens 効果
{"type": "disabled"} 推論なし。応答に thinking ブロックは含まれません。
{"type": "enabled", "budget_tokens": 2048} ≤ 2,048 低 effort。
{"type": "enabled", "budget_tokens": 8192} ≤ 8,192 中 effort。
{"type": "enabled", "budget_tokens": 16000} > 8,192 高 effort。

推論するモデルは、テキストの前に {"type": "thinking", "thinking": "…"} というブロックとして推論を返します。推論する Shannon ティアも同様に送信します。

effort の詳細は専用のページで説明しています。 推論 effort

ツール

ツールは、お使いのコードが実行する関数です。それぞれを name、description、input_schema で記述します。モデルがツールを必要とすると、応答に tool_use ブロックが含まれ、stop_reason は tool_use になります。

tools 内のツール定義:

tools
[
  {
    "name": "get_weather",
    "description": "Current weather for a city.",
    "input_schema": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        }
      },
      "required": [
        "city"
      ]
    }
  }
]

ツールを呼び出す応答の content:

200 content
[
  {
    "type": "text",
    "text": ""
  },
  {
    "type": "tool_use",
    "id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "name": "get_weather",
    "input": {
      "city": "Paris"
    }
  }
]

ツールを実行し、呼び出しと tool_result ブロックを messages に追加して、もう一度リクエストを送信します。

messages
[
  {
    "role": "user",
    "content": "What is the weather in Paris?"
  },
  {
    "role": "assistant",
    "content": [
      {
        "type": "tool_use",
        "id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
        "name": "get_weather",
        "input": {
          "city": "Paris"
        }
      }
    ]
  },
  {
    "role": "user",
    "content": [
      {
        "type": "tool_result",
        "tool_use_id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
        "content": "{\"temperature_c\": 18, \"sky\": \"cloudy\"}"
      }
    ]
  }
]

tool_choice

形式 効果 適用モデル
{"type": "auto"} ツールを呼び出すかどうかはモデルが判断します。これがデフォルトです。 すべてのモデル
{"type": "any"} モデルはいずれかのツールを必ず呼び出します。 ホスト型オープンウェイトモデル
{"type": "tool", "name": "…"} モデルは指定されたツールを必ず呼び出します。 ホスト型オープンウェイトモデル

input_schema を持つツールだけが読み取られます。このエンドポイントではウェブ検索はツールではありません。web_search フィールドを設定してください。

ツールループの詳細は、専用のページで説明しています。 関数呼び出し

応答

フィールド 型 説明 送信元
id string msg_ の後ろに 32 桁の十六進数が続きます。 すべてのモデル
type string 常に message。 すべてのモデル
role string 常に assistant。 すべてのモデル
model string 応答したモデルの正式な ID。 すべてのモデル
content array 応答のブロック。順序は次のとおりです:モデルが推論した場合は thinking、次に text、その後にツール呼び出しごとにひとつの tool_use。 すべてのモデル
stop_reason string 応答が終了した理由。下記の値を参照してください。 すべてのモデル
usage object input_tokens と output_tokens。 すべてのモデル
sources array 検索で何かが見つかった web_search: true のリクエストにのみ含まれます。モデルに渡された結果で、それぞれ index、title、url を持ちます。回答中の [1] は index が 1 のエントリです。ストリームでは message_delta イベントと一緒に届きます。 shannon-1.6-*、shannon-2-*、Shannon 3 ファミリー
usage.cache_read_input_tokens integer cache_read_input_tokens はキャッシュから読み取ったプロンプトの部分、input_tokens はその残りです。cache_creation_input_tokens は常に 0 です。 ホスト型オープンウェイトモデル

応答ブロック

ブロック 説明
{"type": "thinking", "thinking": "…"} モデルの推論。signature メンバーはありません。
{"type": "text", "text": "…"} 回答のテキスト。応答がツール呼び出しの場合は空になることがあります。
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} ツール呼び出し。input は JSON オブジェクトです。結果は同じ id を付けて送り返してください。

stop_reason

stop_reason 説明 送信元
end_turn モデルが回答を終えたか、stop_sequences のいずれかが現れました。 すべてのモデル
tool_use 応答に ひとつ以上のツール呼び出しが含まれます。 すべてのモデル
max_tokens 出力上限で応答が打ち切られました。 Shannon 3 ファミリー、shannon-1.6-lite、shannon-1.6-pro、shannon-coder-1(ストリーム時)

ストリーミング

server-sent events を使うには stream を true に設定します。各フレームには、イベント名を示す event: 行と、type に同じ名前を持つ JSON オブジェクトを含む data: 行があります。Anthropic SDK のストリームヘルパーが、これらのイベントを代わりに読み取ります。

import anthropic

client = anthropic.Anthropic(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com",
)

with client.messages.stream(
    model="shannon-3",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain server-sent events in three sentences."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
    message = stream.get_final_message()

print()
print(message.stop_reason, message.usage)

イベントが届く順序は次のとおりです。

イベント データ 発生条件
message_start message 常に最初に届きます。message には、ID、ロール、モデル、空の content、ゼロから始まる usage が入ります。
content_block_start index, content_block ブロックが開きます。content_block は空の text または thinking ブロック、あるいは id と name を持つ tool_use ブロックです。
content_block_delta index, delta {"type": "thinking_delta", "thinking"} thinking ブロックの、推論の一部。
content_block_delta index, delta {"type": "text_delta", "text"} text ブロックの、回答の一部。
content_block_delta index, delta {"type": "input_json_delta", "partial_json"} tool_use ブロックのツール呼び出しの引数。ひとつのデルタに全体が含まれます。
content_block_stop index この index のブロックが完了しました。
message_delta delta {stop_reason, stop_sequence}, usage 応答の終わり:delta.stop_reason と、リクエストの usage。
message_stop 常に最後に届きます。

ブロックは開いた順に index で番号が付けられ、次のブロックが開く前に前のブロックは完了します。各ブロックは番号ではなく型で読み取ってください。ストリームは最初に空の text ブロックを開き、次に thinking ブロックを開いて、回答を後続の text ブロックで届けることがあります。

200 text/event-stream
event: message_start
data: {"type":"message_start","message":{"id":"msg_5f0c…","type":"message","role":"assistant","model":"shannon-3","content":[],"usage":{"input_tokens":0,"output_tokens":0}}}

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

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

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"thinking","thinking":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"thinking_delta","thinking":"Three sentences: what it is, how it is framed, why it is used."}}

event: ping
data: {"type": "ping"}

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

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

event: content_block_delta
data: {"type":"content_block_delta","index":2,"delta":{"type":"text_delta","text":"Server-sent events let a server push text over one HTTP reply."}}

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

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":1190,"output_tokens":84}}

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

キープアライブ

送信元 説明
Shannon 3 ファミリー、shannon-1.6-lite、shannon-1.6-pro、shannon-coder-1 データが {"type": "ping"} の ping イベント。15 秒ごとに送信されます。
ホスト型オープンウェイトモデル コメント行 : keepalive。モデルの処理中、15 秒ごとに送信されます。

失敗するストリーム

ストリーム開始後の失敗は、エラー応答と同じボディを持つ error イベントとして届きます:{"type": "error", "error": {"type", "message"}}。その後も、終了イベントの message_delta と message_stop は続きます。応答は失敗として扱い、リクエストをもう一度送信してください。

エラー

エラーは Anthropic のエラーボディ形式を使います。type は error で、error オブジェクトに type と message が入ります。表には、このエンドポイントが最もよく返すものを載せています。再試行の可否を含む完全な一覧は、専用のページにあります。 エラー処理

400 JSON
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "unknown model: no-such-model"
  }
}
ステータス タイプ メッセージ 発生条件
401 authentication_error Missing authentication
Invalid API key
API キーが送信されていないか、キーが不明または無効化されています。
400 invalid_request_error unknown model: <id> model が Shannon のモデル ID ではありません。
400 invalid_request_error No user message provided Shannon ティア:リクエストにユーザーのテキストも tools もありません。
400 invalid_request_error <id> does not accept image input 画像入力に対応していないホスト型オープンウェイトモデルに画像が送信されました。
422 invalid_request_error Failed to deserialize the JSON body into the target type: … messages がないか、フィールドの JSON 型が正しくありません。
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_tokens が残高の残りより大きくなっています。
429 rate_limit_error Too many requests. Retry in <n>s. フラッド保護:アカウントで一分間に 120 を超えるリクエストがありました。
429 rate_limit_error Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan shannon-coder-1:現在の 4 時間枠で、ご利用プランの Shannon Coder の呼び出し回数を使い切りました。
500 server_error The model backend failed to answer. Please retry. モデルが応答を生成しませんでした。リクエストをもう一度送信してください。
502 api_error The model backend failed to answer. Please retry. モデルが応答を生成しませんでした。リクエストをもう一度送信してください。

トークンのカウント

POST /v1/messages/count_tokens はメッセージリクエストと同じボディ(model、system、messages、tools)を受け取り、{"input_tokens": n} を返します。これはそのリクエストで課金される入力トークン数です。ホスト型オープンウェイトモデルで利用でき、無料で、フラッド保護の対象にもなりません。

import anthropic

client = anthropic.Anthropic(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com",
)

count = client.messages.count_tokens(
    model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
    system="You are a physics teacher. Answer in two sentences.",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(count.input_tokens)

カウントについては、プレーンテキスト用エンドポイントと上限を含めた専用ページがあります。 トークンカウント