Langsung ke konten
Format Anthropic

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)

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.

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
  }
}

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)

Pada model open-weight hosted, usage melaporkan token yang dibaca dari prompt cache secara terpisah dari token input lainnya.

200 JSON
{
  "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:

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:

200 content
[
  {
    "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:

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)

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.

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"}

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

400 JSON
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "unknown model: no-such-model"
  }
}
Status Tipe Pesan Kapan
401 authentication_error Missing authentication
Invalid 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)

Penghitungan punya halaman sendiri, lengkap dengan endpoint teks biasa dan batasnya. Penghitungan token