Anthropic формат
POST /v1/messages прима барање во форматот Anthropic Messages и одговара во истиот формат, со streaming или без. Користете го со Anthropic SDK и со алатки изградени врз него, како Claude Code: поставете го основниот URL, користете го вашиот Shannon API клуч и наведете ид на Shannon модел.
POST https://api.shannon-ai.com/v1/messages
Насочете го Anthropic SDK-то кон основниот URL на Shannon. 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 | Опционално. Ваш сопствен ид за барањето. Се враќа непроменет во одговорот; без него одговорот носи ид од 12 хексадецимални знаци. |
Полиња на барањето
Задолжително е само messages. Колоната Го применуваат ги именува моделите на кои полето го менува одговорот. Хостираните open-weight модели се дванаесетте ид-а од листата на модели; семејството Shannon 3 се shannon-3, shannon-3-pro, shannon-3.1 и shannon-3.1-pro. Модели и цени
| Поле | Тип | Стандардно | Опис | Го применуваат |
|---|---|---|---|---|
model | string | shannon-1.6-lite | ID на Shannon модел од листата на модели. Испратете го со секое барање. Совпаѓањето не прави разлика меѓу големи и мали букви. Секое друго име враќа 400 unknown model, па алатка што испраќа свои имиња на модели мора да се постави на Shannon ид. | Сите модели |
messages | array | Задолжително. Разговорот, прво најстарата порака, со улогите user и assistant. Видете Пораки и блокови на содржина подолу. | Сите модели | |
system | string | array | Упатства за моделот: стринг или низа од текстуални блокови. Видете System prompt подолу. | Хостирани open-weight модели, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Горна граница на одговорот, во токени. Опционално на овој endpoint; Anthropic SDK-то секогаш го испраќа. Вредност надвор од 1 до 65,536 се поместува во тој опсег. Тоа е и количината што се одвојува од вашето салдо додека барањето трае. | Хостирани open-weight модели, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true го испраќа одговорот како server-sent events. Видете Streaming подолу. | Сите модели |
temperature | number | Температура на семплирање. На хостираните open-weight модели вредностите се држат помеѓу 0 и 2. | Хостирани open-weight модели, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus семплирање. | Хостирани open-weight модели | |
stop_sequences | array | До 4 стринга. Одговорот завршува пред првиот што ќе се појави. stop_reason останува end_turn. | Хостирани open-weight модели | |
tools | array | Алатките што моделот може да ги повика, секоја како {"name", "description", "input_schema"}. Видете Алатки подолу. | Сите модели | |
tool_choice | object | {"type": "auto"} му дозволува на моделот да одлучи, {"type": "any"} го тера да повика алатка, {"type": "tool", "name": "…"} го тера да ја повика таа алатка. | Хостирани open-weight модели | |
thinking | object | Колку моделот размислува пред да одговори. Видете Thinking подолу. | Хостирани open-weight модели | |
web_search | boolean | false | Додаток на Shannon кон форматот: true му дозволува на моделот да пребарува на веб пред да одговори. | shannon-1.6-*, shannon-2-*, семејството Shannon 3 |
Без max_tokens вредноста е 4,096, а 65,536 на shannon-coder-1.
metadata, top_k, service_tier и маркерите cache_control на блоковите се прифаќаат за постоечкиот клиентски код да работи непроменет. Не го менуваат одговорот; prompt caching на хостираните open-weight модели е автоматско.
JSON одговор според schema се бара со response_format на Chat Completions и со text.format на Responses. Структурирани излези
Барање со system prompt и thinking
Ова барање испраќа system prompt, thinking буџет, температура и стоп секвенца. Користи хостиран open-weight модел, кој ги применува сите.
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?"}]
}' На хостираните open-weight модели usage ги пријавува токените прочитани од prompt кешот одделно од останатите влезни токени.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} System prompt
system е стринг или низа од текстуални блокови во облик [{"type": "text", "text": "…"}]. Текстовите на блоковите се спојуваат со прекин на ред.
Го применуваат хостираните open-weight модели, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro и shannon-coder-1. Со ид од семејството Shannon 3, ставете ги упатствата што мора да важат во корисничката порака.
Пораки и блокови на содржина
Пораката има 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 и хостираните open-weight модели што наведуваат слика како влез |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Документ (PDF, Word, PowerPoint или Excel) во порака user, како 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
Хостираните open-weight модели го преведуваат thinking во напор на reasoning. Без полето напорот е висок.
| Облик | budget_tokens | Ефект |
|---|---|---|
{"type": "disabled"} | Без reasoning. Одговорот нема блок thinking. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Низок напор. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Среден напор. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Висок напор. |
Модел што размислува го враќа своето размислување како блок {"type": "thinking", "thinking": "…"} пред текстот. Нивоата на Shannon што размислуваат го испраќаат исто така.
Напорите се опишани на нивна страница. Напор на reasoning
Алатки
Алатката е функција што ја извршува вашиот код. Опишете ја секоја со 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"} | Моделот мора да повика една од алатките. | Хостирани open-weight модели |
{"type": "tool", "name": "…"} | Моделот мора да ја повика наведената алатка. | Хостирани open-weight модели |
Се читаат само алатки со input_schema. Веб пребарувањето не е алатка на овој endpoint: поставете го полето web_search.
Циклусот на алатки е целосно опишан на своја страница. Повик на функции
Одговорот
| Поле | Тип | Опис | Го испраќа |
|---|---|---|---|
id | string | msg_ проследено со 32 хексадецимални знаци. | Сите модели |
type | string | Секогаш message. | Сите модели |
role | string | Секогаш assistant. | Сите модели |
model | string | Каноничниот ид на моделот што одговорил. | Сите модели |
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. Во stream доаѓа со настанот message_delta. | shannon-1.6-*, shannon-2-*, семејството Shannon 3 |
usage.cache_read_input_tokens | integer | cache_read_input_tokens е делот од prompt-от прочитан од кешот; input_tokens е остатокот. cache_creation_input_tokens е секогаш 0. | Хостирани open-weight модели |
Блокови на одговорот
| Блок | Опис |
|---|---|
{"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, во потоци |
Streaming
Поставете stream на true за server-sent events. Секој фрејм има ред event: со името на настанот и ред data: со JSON објект што го повторува името во type. Помошните streaming функции на 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 ги содржи ид-то, улогата, моделот, празна content и usage што започнува од нула. |
content_block_start | index, content_block | Се отвора блок. content_block е празен блок text или thinking, или блок tool_use со неговите id и name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | Парче од reasoning-от, за блок 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 по редот на отворање, а еден блок е завршен пред да се отвори следниот. Читајте го секој блок по неговиот тип, а не по бројот: streaming може прво да отвори празен блок 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"} Keep-alive
| Го испраќа | Опис |
|---|---|
Семејството Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Настан ping со податоците {"type": "ping"}, на секои 15 секунди. |
| Хостирани open-weight модели | Коментар ред : keepalive, на секои 15 секунди додека моделот работи. |
Streaming што не успева
Грешка по започнување на streaming-от е настан error со исто тело како одговор со грешка: {"type": "error", "error": {"type", "message"}}. Завршните настани, message_delta и message_stop, сепак следуваат. Сметајте го одговорот за неуспешен и испратете го барањето повторно.
Грешки
Грешките го користат Anthropic телото на грешка: type е error, а објектот error содржи type и message. Табелата ги наведува грешките што овој endpoint најчесто ги враќа. Целосната листа, со тоа што да се повтори, има своја страница. Ракување со грешки
{
"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 модел. |
400 | invalid_request_error | No user message provided | Нивоа на Shannon: барањето нема кориснички текст и нема tools. |
400 | invalid_request_error | <id> does not accept image input | Слика е испратена до хостиран open-weight модел без поддршка за слика на влез. |
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. | Flood protection: повеќе од 120 барања во една минута на вашата сметка. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: повиците на Shannon Coder од вашиот план за тековниот 4-часовен прозорец се искористени. |
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}: бројот на влезни токени што би се наплатиле за барањето. Брои за хостираните open-weight модели, бесплатно е и не се брои во 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} Броењето има своја страница, со endpoint-от за обичен текст и лимитите. Броење токени