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) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com",
});
const message = await client.messages.create({
model: "shannon-3",
max_tokens: 1024,
messages: [{ role: "user", content: "Say hello in one sentence." }],
});
for (const block of message.content) {
if (block.type === "text") console.log(block.text);
} curl https://api.shannon-ai.com/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "shannon-3",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Say hello in one sentence."}]
}' 応答は、content がブロックのリストになっているメッセージです。ブロックは type で見分けてください。モデルが推論した場合は、最初のブロックが thinking で、テキストはその後に来ます。
{
"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) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com",
});
const message = await 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 (const block of message.content) {
if (block.type === "thinking") console.log("reasoning:", block.thinking);
if (block.type === "text") console.log("answer:", block.text);
}
console.log(message.usage); curl https://api.shannon-ai.com/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{
"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?"}]
}' ホスト型オープンウェイトモデルでは、usage にプロンプトキャッシュから読み取ったトークンが、その他の入力トークンとは別に報告されます。
{
"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 内のツール定義:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] ツールを呼び出す応答の content:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] ツールを実行し、呼び出しと tool_result ブロックを 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) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com",
});
const stream = client.messages.stream({
model: "shannon-3",
max_tokens: 1024,
messages: [{ role: "user", content: "Explain server-sent events in three sentences." }],
});
stream.on("text", (text) => process.stdout.write(text));
const message = await stream.finalMessage();
console.log("\n", message.stop_reason, message.usage); curl -N https://api.shannon-ai.com/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "shannon-3",
"max_tokens": 1024,
"stream": true,
"messages": [{"role": "user", "content": "Explain server-sent events in three sentences."}]
}' イベントが届く順序は次のとおりです。
| イベント | データ | 発生条件 |
|---|---|---|
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 ブロックで届けることがあります。
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 が入ります。表には、このエンドポイントが最もよく返すものを載せています。再試行の可否を含む完全な一覧は、専用のページにあります。 エラー処理
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | ステータス | タイプ | メッセージ | 発生条件 |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid 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) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com",
});
const count = await client.messages.countTokens({
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?" }],
});
console.log(count.input_tokens); curl https://api.shannon-ai.com/v1/messages/count_tokens \
-H "x-api-key: YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{
"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?"}]
}'
# {"input_tokens": 31} カウントについては、プレーンテキスト用エンドポイントと上限を含めた専用ページがあります。 トークンカウント