Anthropic format
POST /v1/messages prima zahtev u Anthropic Messages formatu i odgovara u istom formatu, strimovano ili ne. Koristite ga sa Anthropic SDK-om i alatima izgrađenim na njemu, kao što je Claude Code: podesite osnovni URL, koristite svoj Shannon API ključ i navedite id Shannon modela.
POST https://api.shannon-ai.com/v1/messages
Usmerite Anthropic SDK na Shannon osnovni URL. SDK dodaje /v1/messages i šalje vaš ključ u zaglavlju 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."}]
}' Odgovor je poruka čiji je content lista blokova. Blokove pronađite po njihovom type: kada je model rezonovao, prvi blok je thinking, a tekst dolazi posle njega.
{
"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
}
} Zaglavlja
| Zaglavlje | Vrednost | Opis |
|---|---|---|
x-api-key | YOUR_API_KEY | Vaš API ključ. Umesto njega se prihvata Authorization: Bearer YOUR_API_KEY. |
content-type | application/json | Obavezno. |
anthropic-version | 2023-06-01 | Prihvata se, nije obavezno. Anthropic SDK šalje 2023-06-01; odgovor ima isti format bez obzira na vrednost. |
anthropic-beta | Prihvata se, nije obavezno. | |
x-request-id | Opciono. Vaš sopstveni id zahteva. Vraća se nepromenjen u odgovoru; bez njega odgovor nosi id od 12 heksadecimalnih znakova. |
Polja zahteva
Obavezan je samo messages. Kolona Primenjuju navodi modele na kojima polje menja odgovor. Hostovani open-weight modeli su dvanaest id-jeva sa liste modela; porodica Shannon 3 su shannon-3, shannon-3-pro, shannon-3.1 i shannon-3.1-pro. Modeli i cene
| Polje | Tip | Podrazumevano | Opis | Primenjuju |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Id Shannon modela sa liste modela. Šaljite ga uz svaki zahtev. Poređenje ne razlikuje velika i mala slova. Svako drugo ime vraća 400 unknown model, pa alat koji šalje sopstvena imena modela morate podesiti na Shannon id. | Svi modeli |
messages | array | Obavezno. Razgovor, najstarija poruka prvo, sa ulogama user i assistant. Pogledajte Poruke i blokovi sadržaja ispod. | Svi modeli | |
system | string | array | Uputstva za model: string ili niz tekstualnih blokova. Pogledajte System prompt ispod. | Hostovani open-weight modeli, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Gornja granica odgovora, u tokenima. Opciono na ovom endpointu; Anthropic SDK ga uvek šalje. Vrednost van opsega od 1 do 65,536 pomera se u taj opseg. To je i iznos koji se izdvaja sa vašeg stanja dok zahtev traje. | Hostovani open-weight modeli, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true šalje odgovor kao server-sent events. Pogledajte Streaming ispod. | Svi modeli |
temperature | number | Temperatura uzorkovanja. Na hostovanim open-weight modelima vrednosti se drže između 0 i 2. | Hostovani open-weight modeli, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus uzorkovanje. | Hostovani open-weight modeli | |
stop_sequences | array | Do 4 stringa. Odgovor se završava pre prvog koji se pojavi. stop_reason ostaje end_turn. | Hostovani open-weight modeli | |
tools | array | Alati koje model sme da pozove, svaki kao {"name", "description", "input_schema"}. Pogledajte Alati ispod. | Svi modeli | |
tool_choice | object | {"type": "auto"} prepušta odluku modelu, {"type": "any"} tera ga da pozove alat, {"type": "tool", "name": "…"} tera ga da pozove taj alat. | Hostovani open-weight modeli | |
thinking | object | Koliko model rezonuje pre nego što odgovori. Pogledajte Thinking ispod. | Hostovani open-weight modeli | |
web_search | boolean | false | Shannon dodatak formatu: true dozvoljava modelu da pretraži web pre nego što odgovori. | shannon-1.6-*, shannon-2-*, porodica Shannon 3 |
Bez max_tokens vrednost je 4,096, a na shannon-coder-1 65,536.
metadata, top_k, service_tier i cache_control oznake na blokovima se prihvataju da bi postojeći klijentski kod radio nepromenjen. Ne menjaju odgovor; keširanje promptova na hostovanim open-weight modelima je automatsko.
JSON odgovor prema šemi traži se pomoću response_format na Chat Completions i pomoću text.format na Responses. Strukturirani izlazi
Zahtev sa system promptom i thinkingom
Ovaj zahtev šalje system prompt, thinking budžet, temperaturu i stop sekvencu. Koristi hostovani open-weight model, koji primenjuje sve to.
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?"}]
}' Na hostovanim open-weight modelima usage prijavljuje tokene pročitane iz keša promptova odvojeno od ostalih ulaznih tokena.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} System prompt
system je string ili niz tekstualnih blokova u obliku [{"type": "text", "text": "…"}]. Tekstovi blokova se spajaju prelomom reda.
Primenjuju ga hostovani open-weight modeli, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro i shannon-coder-1. Sa id-jem iz porodice Shannon 3 stavite uputstva koja moraju da važe u korisničku poruku.
Poruke i blokovi sadržaja
Poruka ima role, user ili assistant, i content. content je string ili niz blokova.
| Blok | Opis | Dostupno na |
|---|---|---|
{"type": "text", "text": "…"} | Tekst. | Svi modeli |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | Slika u user poruci, kao base64 ili preko URL-a. | Porodica Shannon 3, shannon-1.6-lite, shannon-1.6-pro i hostovani open-weight modeli koji navode sliku na ulazu |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Dokument (PDF, Word, PowerPoint ili Excel) u user poruci, kao base64 ili preko URL-a. | Porodica Shannon 3 |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | U assistant poruci: poziv alata koji je model uputio u ranijem odgovoru. | Svi modeli |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | U user poruci: rezultat tog poziva. content je string ili lista tekstualnih blokova. | Svi modeli |
content ranijeg odgovora možete poslati nazad nepromenjen: blokovi text i tool_use se čitaju, blokovi thinking se preskaču.
Na Shannon nivoima slike i dokumenti se čitaju iz poslednje user poruke. Veličine i ograničenja imaju svoju stranicu. Slike i fajlovi
Thinking
Hostovani open-weight modeli preslikavaju thinking u napor pri zaključivanju. Bez tog polja napor je visok.
| Oblik | budget_tokens | Efekat |
|---|---|---|
{"type": "disabled"} | Bez rezonovanja. Odgovor nema thinking blok. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Nizak napor. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Srednji napor. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Visok napor. |
Model koji rezonuje vraća svoje rezonovanje kao blok {"type": "thinking", "thinking": "…"} ispred teksta. Shannon nivoi koji rezonuju šalju ga takođe.
Nivoi napora opisani su na svojoj stranici. Napor pri zaključivanju
Alati
Alat je funkcija koju izvršava vaš kod. Opišite svaki pomoću name, description i input_schema. Kada model želi alat, odgovor sadrži tool_use blok, a stop_reason je tool_use.
Definicija alata u tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] content odgovora koji ga poziva:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Pokrenite alat, zatim ponovo pošaljite zahtev sa pozivom i tool_result blokom dodatim u 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
| Oblik | Efekat | Primenjuju |
|---|---|---|
{"type": "auto"} | Model odlučuje da li će pozvati alat. Ovo je podrazumevano. | Svi modeli |
{"type": "any"} | Model mora da pozove jedan od alata. | Hostovani open-weight modeli |
{"type": "tool", "name": "…"} | Model mora da pozove imenovani alat. | Hostovani open-weight modeli |
Čitaju se samo alati sa input_schema. Web pretraga nije alat na ovom endpointu: postavite polje web_search.
Petlja alata je u celini opisana na svojoj stranici. Pozivanje funkcija
Odgovor
| Polje | Tip | Opis | Šalje |
|---|---|---|---|
id | string | msg_ iza kog sledi 32 heksadecimalna znaka. | Svi modeli |
type | string | Uvek message. | Svi modeli |
role | string | Uvek assistant. | Svi modeli |
model | string | Kanonski id modela koji je odgovorio. | Svi modeli |
content | array | Blokovi odgovora, ovim redom: thinking kada je model rezonovao, text, zatim po jedan tool_use za svaki poziv alata. | Svi modeli |
stop_reason | string | Zašto je odgovor završen. Pogledajte vrednosti ispod. | Svi modeli |
usage | object | input_tokens i output_tokens. | Svi modeli |
sources | array | Samo na zahtevu sa web_search: true čija je pretraga nešto našla: rezultati koji su dati modelu, svaki sa index, title i url. [1] u odgovoru je unos sa index 1. U streamu stiže sa događajem message_delta. | shannon-1.6-*, shannon-2-*, porodica Shannon 3 |
usage.cache_read_input_tokens | integer | cache_read_input_tokens je deo prompta pročitan iz keša; input_tokens je ostatak. cache_creation_input_tokens je uvek 0. | Hostovani open-weight modeli |
Blokovi odgovora
| Blok | Opis |
|---|---|
{"type": "thinking", "thinking": "…"} | Rezonovanje modela. Nema člana signature. |
{"type": "text", "text": "…"} | Tekst odgovora. Može biti prazan kada je odgovor poziv alata. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Poziv alata. input je JSON objekat. Rezultat vratite sa istim id. |
stop_reason
| stop_reason | Opis | Šalje |
|---|---|---|
end_turn | Model je završio odgovor, ili se pojavila jedna od vaših stop_sequences. | Svi modeli |
tool_use | Odgovor sadrži jedan ili više poziva alata. | Svi modeli |
max_tokens | Odgovor je presečen na ograničenju izlaza. | Porodica Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, u streamovima |
Streaming
Postavite stream na true za server-sent events. Svaki frame ima liniju event: sa imenom događaja i liniju data: sa JSON objektom koji ponavlja ime u type. Stream helperi Anthropic SDK-a čitaju ove događaje umesto vas:
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."}]
}' Događaji, redom kojim stižu:
| Događaj | Podaci | Kada |
|---|---|---|
message_start | message | Uvek prvi. message sadrži id, ulogu, model, prazan content i usage koji počinje od nule. |
content_block_start | index, content_block | Blok se otvara. content_block je prazan text ili thinking blok, ili tool_use blok sa svojim id i name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | Deo rezonovanja, za thinking blok. |
content_block_delta | index, delta {"type": "text_delta", "text"} | Deo odgovora, za text blok. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Argumenti poziva alata, kompletni u jednom delta-u, za tool_use blok. |
content_block_stop | index | Blok sa ovim index je završen. |
message_delta | delta {stop_reason, stop_sequence}, usage | Kraj odgovora: delta.stop_reason i usage zahteva. |
message_stop | Uvek poslednji. |
Blokovi su numerisani pomoću index redom kojim se otvaraju, i jedan blok je završen pre nego što se otvori sledeći. Čitajte svaki blok po njegovom tipu, a ne po broju: stream može prvo da otvori prazan text blok, zatim thinking blok, a odgovor isporuči u kasnijem text bloku.
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
| Šalje | Opis |
|---|---|
Porodica Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Događaj ping sa podatkom {"type": "ping"}, na svakih 15 sekundi. |
| Hostovani open-weight modeli | Komentarska linija : keepalive, na svakih 15 sekundi dok model radi. |
Stream koji ne uspe
Greška nakon početka streama stiže kao error događaj sa istim telom kao odgovor sa greškom: {"type": "error", "error": {"type", "message"}}. Završni događaji, message_delta i message_stop, i dalje slede. Smatrajte odgovor neuspelim i pošaljite zahtev ponovo.
Greške
Greške koriste Anthropic telo greške: type je error, a objekat error sadrži type i message. Tabela navodi šta ovaj endpoint najčešće vraća. Kompletna lista, sa uputstvom šta ponoviti, ima svoju stranicu. Upravljanje greškama
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Tip | Poruka | Kada |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | API ključ nije poslat, ili je ključ nepoznat ili opozvan. |
400 | invalid_request_error | unknown model: <id> | model nije id Shannon modela. |
400 | invalid_request_error | No user message provided | Shannon nivoi: zahtev nema korisnički tekst i nema tools. |
400 | invalid_request_error | <id> does not accept image input | Slika je poslata hostovanom open-weight modelu bez podrške za sliku na ulazu. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages nedostaje, ili polje ima pogrešan JSON tip. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens je veći od onoga što je preostalo na vašem stanju. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Zaštita od flooda (flood protection): više od 120 zahteva u jednom minutu na vašem nalogu. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: pozivi Shannon Coder vašeg plana za trenutni 4-časovni period su iskorišćeni. |
500 | server_error | The model backend failed to answer. Please retry. | Model nije proizveo odgovor. Pošaljite zahtev ponovo. |
502 | api_error | The model backend failed to answer. Please retry. | Model nije proizveo odgovor. Pošaljite zahtev ponovo. |
Brojanje tokena
POST /v1/messages/count_tokens prima isto telo kao zahtev za poruku (model, system, messages, tools) i vraća {"input_tokens": n}: broj ulaznih tokena koji bi zahtev naplatio. Važi za hostovane open-weight modele, besplatan je i ne računa se u zaštitu od flooda (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} Brojanje ima svoju stranicu, sa endpointom za običan tekst i ograničenjima. Brojanje tokena