Format Anthropic
POST /v1/messages menerima permintaan dalam format Anthropic Messages dan menjawab dalam format yang sama, dengan streaming atau tidak. Gunakan dengan SDK Anthropic dan tool yang dibangun di atasnya, seperti Claude Code: atur base URL, gunakan API key Shannon Anda, dan sebutkan id model Shannon.
POST https://api.shannon-ai.com/v1/messages
Arahkan SDK Anthropic ke base URL Shannon. SDK menambahkan /v1/messages dan mengirim kunci Anda di header 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."}]
}' Balasan adalah pesan yang content-nya berupa daftar blok. Temukan blok berdasarkan type-nya: jika model bernalar, blok pertama adalah thinking dan teks datang setelahnya.
{
"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
}
} Header
| Header | Nilai | Deskripsi |
|---|---|---|
x-api-key | YOUR_API_KEY | Kunci API Anda. Authorization: Bearer YOUR_API_KEY diterima sebagai penggantinya. |
content-type | application/json | Wajib. |
anthropic-version | 2023-06-01 | Diterima, tidak wajib. SDK Anthropic mengirim 2023-06-01; balasan berformat sama apa pun nilainya. |
anthropic-beta | Diterima, tidak wajib. | |
x-request-id | Opsional. Id Anda sendiri untuk permintaan. Id ini dikembalikan tanpa perubahan pada balasan; tanpanya, balasan membawa id berisi 12 karakter heksadesimal. |
Field permintaan
Hanya messages yang wajib. Kolom Diterapkan oleh menyebutkan model tempat sebuah field mengubah balasan. Model open-weight hosted adalah dua belas id dalam daftar model; keluarga Shannon 3 adalah shannon-3, shannon-3-pro, shannon-3.1, dan shannon-3.1-pro. Model & harga
| Field | Tipe | Default | Deskripsi | Diterapkan oleh |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Id model Shannon dari daftar model. Kirim di setiap permintaan. Pencocokan tidak membedakan huruf besar dan kecil. Nama lain mengembalikan 400 unknown model, jadi tool yang mengirim nama modelnya sendiri harus diatur ke id Shannon. | Semua model |
messages | array | Wajib. Percakapan, dari pesan terlama, dengan role user dan assistant. Lihat Pesan dan blok konten di bawah. | Semua model | |
system | string | array | Instruksi untuk model: string, atau array blok teks. Lihat System prompt di bawah. | Model open-weight hosted, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Batas atas balasan, dalam token. Opsional di endpoint ini; SDK Anthropic selalu mengirimkannya. Nilai di luar rentang 1 sampai 65,536 dipindahkan ke dalam rentang itu. Nilai ini juga jumlah yang dicadangkan dari saldo Anda selama permintaan berjalan. | Model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true mengirim balasan sebagai server-sent events. Lihat Streaming di bawah. | Semua model |
temperature | number | Temperature sampling. Pada model open-weight hosted, nilai dijaga di antara 0 dan 2. | Model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus sampling. | Model open-weight hosted | |
stop_sequences | array | Hingga 4 string. Jawaban berakhir sebelum string pertama yang muncul. stop_reason tetap end_turn. | Model open-weight hosted | |
tools | array | Tool yang boleh dipanggil model, masing-masing sebagai {"name", "description", "input_schema"}. Lihat Tools di bawah. | Semua model | |
tool_choice | object | {"type": "auto"} membiarkan model memutuskan, {"type": "any"} membuatnya memanggil sebuah tool, {"type": "tool", "name": "…"} membuatnya memanggil tool tersebut. | Model open-weight hosted | |
thinking | object | Seberapa banyak model bernalar sebelum menjawab. Lihat Thinking di bawah. | Model open-weight hosted | |
web_search | boolean | false | Tambahan dari Shannon pada format ini: true membiarkan model mencari di web sebelum menjawab. | shannon-1.6-*, shannon-2-*, keluarga Shannon 3 |
Tanpa max_tokens, nilainya 4,096, dan 65,536 pada shannon-coder-1.
metadata, top_k, service_tier, dan penanda cache_control pada blok diterima agar kode klien yang ada berjalan tanpa perubahan. Semuanya tidak mengubah balasan; prompt caching pada model open-weight hosted berjalan otomatis.
Jawaban JSON sesuai schema diminta dengan response_format di Chat Completions dan dengan text.format di Responses. Output Terstruktur
Permintaan dengan system prompt dan thinking
Permintaan ini mengirim system prompt, anggaran thinking, temperature, dan stop sequence. Permintaan ini memakai model open-weight hosted, yang menerapkan semuanya.
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?"}]
}' Pada model open-weight hosted, usage melaporkan token yang dibaca dari prompt cache secara terpisah dari token input lainnya.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} System prompt
system berupa string, atau array blok teks dalam bentuk [{"type": "text", "text": "…"}]. Teks dari blok-blok digabungkan dengan pemisah baris.
Diterapkan oleh model open-weight hosted, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro, dan shannon-coder-1. Dengan id keluarga Shannon 3, taruh instruksi yang harus dipatuhi ke dalam pesan user.
Pesan dan blok konten
Sebuah pesan memiliki role, yaitu user atau assistant, dan content. content berupa string atau array blok.
| Blok | Deskripsi | Tersedia di |
|---|---|---|
{"type": "text", "text": "…"} | Teks. | Semua model |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | Gambar dalam pesan user, sebagai base64 atau lewat URL. | Keluarga Shannon 3, shannon-1.6-lite, shannon-1.6-pro, dan model open-weight hosted yang mencantumkan input gambar |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Dokumen (PDF, Word, PowerPoint, atau Excel) dalam pesan user, sebagai base64 atau lewat URL. | Keluarga Shannon 3 |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Dalam pesan assistant: panggilan tool yang dibuat model pada balasan sebelumnya. | Semua model |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | Dalam pesan user: hasil dari panggilan tersebut. content berupa string atau daftar blok teks. | Semua model |
Anda dapat mengirim kembali content dari balasan sebelumnya apa adanya: blok text dan tool_use dibaca, blok thinking dilewati.
Pada tingkat Shannon, gambar dan dokumen dibaca dari pesan user terakhir. Ukuran dan batas dibahas di halaman tersendiri. Gambar dan file
Thinking
Model open-weight hosted memetakan thinking ke reasoning effort. Tanpa field ini, effort-nya tinggi.
| Bentuk | budget_tokens | Efek |
|---|---|---|
{"type": "disabled"} | Tanpa penalaran. Balasan tidak memiliki blok thinking. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Effort rendah. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Effort menengah. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Effort tinggi. |
Model yang bernalar mengembalikan penalarannya sebagai blok {"type": "thinking", "thinking": "…"} di depan teks. Tingkat Shannon yang bernalar juga mengirimkannya.
Setiap effort dijelaskan di halaman tersendiri. Reasoning effort
Tools
Tool adalah fungsi yang dijalankan kode Anda. Deskripsikan masing-masing dengan name, description, dan input_schema. Ketika model menginginkan tool, balasan berisi blok tool_use dan stop_reason bernilai tool_use.
Definisi tool di tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] content dari balasan yang memanggilnya:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Jalankan tool, lalu kirim permintaan sekali lagi dengan panggilan itu dan blok tool_result yang ditambahkan ke 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
| Bentuk | Efek | Diterapkan oleh |
|---|---|---|
{"type": "auto"} | Model memutuskan apakah akan memanggil tool. Ini default-nya. | Semua model |
{"type": "any"} | Model harus memanggil salah satu tool. | Model open-weight hosted |
{"type": "tool", "name": "…"} | Model harus memanggil tool yang disebutkan namanya. | Model open-weight hosted |
Hanya tool dengan input_schema yang dibaca. Pencarian web bukan tool di endpoint ini: atur field web_search.
Loop tool dijelaskan lengkap di halaman tersendiri. Pemanggilan fungsi
Balasan
| Field | Tipe | Deskripsi | Dikirim oleh |
|---|---|---|---|
id | string | msg_ diikuti 32 karakter heksadesimal. | Semua model |
type | string | Selalu message. | Semua model |
role | string | Selalu assistant. | Semua model |
model | string | Id kanonis dari model yang menjawab. | Semua model |
content | array | Blok-blok balasan, dalam urutan ini: thinking jika model bernalar, text, lalu satu tool_use untuk setiap panggilan tool. | Semua model |
stop_reason | string | Alasan balasan berakhir. Lihat nilai-nilai di bawah. | Semua model |
usage | object | input_tokens dan output_tokens. | Semua model |
sources | array | Hanya pada permintaan dengan web_search: true yang pencariannya menemukan sesuatu: hasil yang diberikan kepada model, masing-masing dengan index, title, dan url. [1] dalam jawaban adalah entri dengan index 1. Dalam stream, field ini datang bersama event message_delta. | shannon-1.6-*, shannon-2-*, keluarga Shannon 3 |
usage.cache_read_input_tokens | integer | cache_read_input_tokens adalah bagian prompt yang dibaca dari cache; input_tokens adalah sisanya. cache_creation_input_tokens selalu 0. | Model open-weight hosted |
Blok balasan
| Blok | Deskripsi |
|---|---|
{"type": "thinking", "thinking": "…"} | Penalaran model. Tidak ada member signature. |
{"type": "text", "text": "…"} | Teks jawaban. Bisa kosong ketika balasannya berupa panggilan tool. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Panggilan tool. input adalah objek JSON. Kirim hasilnya kembali dengan id yang sama. |
stop_reason
| stop_reason | Deskripsi | Dikirim oleh |
|---|---|---|
end_turn | Model menyelesaikan jawabannya, atau salah satu stop_sequences Anda muncul. | Semua model |
tool_use | Balasan berisi satu panggilan tool atau lebih. | Semua model |
max_tokens | Balasan terpotong pada batas output. | Keluarga Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, dalam stream |
Streaming
Atur stream ke true untuk server-sent events. Setiap frame memiliki baris event: berisi nama event dan baris data: berisi objek JSON yang mengulang nama itu di type. Helper stream pada SDK Anthropic membaca event ini untuk Anda:
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."}]
}' Event, dalam urutan kedatangannya:
| Event | Data | Kapan |
|---|---|---|
message_start | message | Selalu pertama. message berisi id, role, model, content kosong, dan usage yang dimulai dari nol. |
content_block_start | index, content_block | Sebuah blok dibuka. content_block adalah blok text atau thinking yang kosong, atau blok tool_use dengan id dan name-nya. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | Potongan penalaran, untuk blok thinking. |
content_block_delta | index, delta {"type": "text_delta", "text"} | Potongan jawaban, untuk blok text. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Argumen panggilan tool, lengkap dalam satu delta, untuk blok tool_use. |
content_block_stop | index | Blok dengan index ini sudah selesai. |
message_delta | delta {stop_reason, stop_sequence}, usage | Akhir balasan: delta.stop_reason, dan usage dari permintaan. |
message_stop | Selalu terakhir. |
Blok diberi nomor menurut index dalam urutan pembukaannya, dan satu blok selesai sebelum blok berikutnya dibuka. Baca setiap blok menurut tipenya, bukan nomornya: sebuah stream bisa membuka blok text kosong lebih dulu, lalu blok thinking, dan menyampaikan jawaban di blok text yang datang kemudian.
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"} Keep-alive
| Dikirim oleh | Deskripsi |
|---|---|
Keluarga Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Event ping dengan data {"type": "ping"}, setiap 15 detik. |
| Model open-weight hosted | Baris komentar : keepalive, setiap 15 detik selama model bekerja. |
Stream yang gagal
Kegagalan setelah stream dimulai berupa event error dengan isi yang sama seperti balasan error: {"type": "error", "error": {"type", "message"}}. Event penutup, message_delta dan message_stop, tetap menyusul. Anggap balasan gagal dan kirim permintaan sekali lagi.
Error
Error memakai isi error Anthropic: type bernilai error, dan objek error berisi type serta message. Tabel mencantumkan apa yang paling sering dikembalikan endpoint ini. Daftar lengkap, beserta apa yang perlu dicoba ulang, ada di halaman tersendiri. Penanganan kesalahan
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Tipe | Pesan | Kapan |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Kunci API tidak dikirim, atau kunci tidak dikenal atau sudah dicabut. |
400 | invalid_request_error | unknown model: <id> | model bukan id model Shannon. |
400 | invalid_request_error | No user message provided | Tingkat Shannon: permintaan tidak memiliki teks pengguna dan tidak memiliki tools. |
400 | invalid_request_error | <id> does not accept image input | Gambar dikirim ke model open-weight hosted yang tidak mendukung input gambar. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages tidak ada, atau sebuah field memiliki tipe JSON yang salah. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens lebih besar daripada sisa saldo Anda. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: lebih dari 120 permintaan dalam satu menit pada akun Anda. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: panggilan Shannon Coder dari paket Anda untuk jendela 4 jam saat ini sudah habis. |
500 | server_error | The model backend failed to answer. Please retry. | Model tidak menghasilkan balasan. Kirim permintaan sekali lagi. |
502 | api_error | The model backend failed to answer. Please retry. | Model tidak menghasilkan balasan. Kirim permintaan sekali lagi. |
Menghitung token
POST /v1/messages/count_tokens menerima body yang sama dengan permintaan pesan (model, system, messages, tools) dan mengembalikan {"input_tokens": n}: jumlah token input yang akan ditagihkan untuk permintaan tersebut. Penghitungan berlaku untuk model open-weight hosted, gratis, dan tidak dihitung oleh flood protection.
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} Penghitungan punya halaman sendiri, lengkap dengan endpoint teks biasa dan batasnya. Penghitungan token