Anthropic format
POST /v1/messages prima zahtjev u Anthropic Messages formatu i odgovara u istom formatu, streamovano ili ne. Koristite ga s Anthropic SDK-om i alatima izgrađenim na njemu, kao što je Claude Code: postavite osnovni URL, koristite svoj Shannon API ključ i navedite Shannon id modela.
POST https://api.shannon-ai.com/v1/messages
Usmjerite 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 razmišljao, prvi blok je thinking, a tekst dolazi poslije 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 | Vrijednost | Opis |
|---|---|---|
x-api-key | YOUR_API_KEY | Vaš API ključ. Umjesto 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 vrijednost. |
anthropic-beta | Prihvata se, nije obavezno. | |
x-request-id | Opcionalno. Vaš vlastiti id zahtjeva. Vraća se nepromijenjen u odgovoru; bez njega odgovor nosi id od 12 heksadecimalnih znakova. |
Polja zahtjeva
Obavezan je samo messages. Kolona Primjenjuje navodi modele na kojima polje mijenja odgovor. Hostirani open-weight modeli su dvanaest idova s liste modela; porodica Shannon 3 su shannon-3, shannon-3-pro, shannon-3.1 i shannon-3.1-pro. Modeli i cijene
| Polje | Tip | Zadano | Opis | Primjenjuje |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Shannon id modela s liste modela. Šaljite ga uz svaki zahtjev. Poređenje ne razlikuje velika i mala slova. Svako drugo ime vraća 400 unknown model, pa alat koji šalje vlastita imena modela treba podesiti na Shannon id. | Svi modeli |
messages | array | Obavezno. Razgovor, najstarija poruka prva, s ulogama user i assistant. Pogledajte Poruke i blokovi sadržaja u nastavku. | Svi modeli | |
system | string | array | Instrukcije za model: string ili niz tekstualnih blokova. Pogledajte System prompt u nastavku. | Hostirani open-weight modeli, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Gornja granica odgovora, u tokenima. Opcionalno na ovom endpointu; Anthropic SDK ga uvijek šalje. Vrijednost izvan raspona od 1 do 65,536 pomjera se u taj raspon. To je i iznos koji se odvaja sa vašeg stanja dok zahtjev traje. | Hostirani 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 u nastavku. | Svi modeli |
temperature | number | Temperatura uzorkovanja. Na hostiranim open-weight modelima vrijednosti se drže između 0 i 2. | Hostirani open-weight modeli, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus sampling. | Hostirani open-weight modeli | |
stop_sequences | array | Do 4 stringa. Odgovor se završava prije prvog koji se pojavi. stop_reason ostaje end_turn. | Hostirani open-weight modeli | |
tools | array | Alati koje model smije pozvati, svaki kao {"name", "description", "input_schema"}. Pogledajte Alati u nastavku. | Svi modeli | |
tool_choice | object | {"type": "auto"} prepušta odluku modelu, {"type": "any"} tjera ga da pozove alat, {"type": "tool", "name": "…"} tjera ga da pozove taj alat. | Hostirani open-weight modeli | |
thinking | object | Koliko model razmišlja prije nego odgovori. Pogledajte Thinking u nastavku. | Hostirani open-weight modeli | |
web_search | boolean | false | Shannon dodatak formatu: true omogućava modelu da pretraži web prije nego odgovori. | shannon-1.6-*, shannon-2-*, porodica Shannon 3 |
Bez max_tokens vrijednost je 4,096, a na shannon-coder-1 65,536.
metadata, top_k, service_tier i cache_control oznake na blokovima se prihvataju kako bi postojeći klijentski kod radio nepromijenjen. Ne mijenjaju odgovor; keširanje promptova na hostiranim 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
Zahtjev sa system promptom i thinkingom
Ovaj zahtjev šalje system prompt, thinking budžet, temperaturu i stop sekvencu. Koristi hostirani open-weight model, koji primjenjuje sve njih.
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 hostiranim open-weight modelima usage odvojeno od ostalih ulaznih tokena prijavljuje tokene pročitane iz keša promptova.
{
"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 spajaju se prijelomom reda.
Primjenjuju ga hostirani open-weight modeli, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro i shannon-coder-1. Uz id iz porodice Shannon 3, instrukcije koje moraju važiti stavite 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 putem URL-a. | Porodica Shannon 3, shannon-1.6-lite, shannon-1.6-pro i hostirani open-weight modeli koji navode ulaz slike |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Dokument (PDF, Word, PowerPoint ili Excel) u user poruci, kao base64 ili putem URL-a. | Porodica Shannon 3 |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | U assistant poruci: poziv alata koji je model napravio 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 onakav kakav jeste: blokovi text i tool_use se čitaju, blokovi thinking se preskaču.
Na Shannon nivoima slike i dokumenti se čitaju iz zadnje user poruke. Veličine i ograničenja imaju vlastitu stranicu. Slike i datoteke
Thinking
Hostirani open-weight modeli preslikavaju thinking u reasoning effort. Bez ovog polja effort je high.
| Oblik | budget_tokens | Efekat |
|---|---|---|
{"type": "disabled"} | Bez reasoninga. Odgovor nema thinking blok. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Nizak effort. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Srednji effort. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Visok effort. |
Model koji rezonuje vraća svoj reasoning kao blok {"type": "thinking", "thinking": "…"} ispred teksta. Shannon nivoi koji rezonuju šalju ga također.
Effort nivoi su opisani na vlastitoj stranici. Reasoning effort
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 zahtjev s pozivom i tool_result blokom dodanim 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 | Primjenjuje |
|---|---|---|
{"type": "auto"} | Model odlučuje hoće li pozvati alat. Ovo je zadano. | Svi modeli |
{"type": "any"} | Model mora pozvati jedan od alata. | Hostirani open-weight modeli |
{"type": "tool", "name": "…"} | Model mora pozvati imenovani alat. | Hostirani open-weight modeli |
Čitaju se samo alati s input_schema. Web pretraga nije alat na ovom endpointu: postavite polje web_search.
Petlja alata je u cijelosti opisana na vlastitoj stranici. Pozivanje funkcija
Odgovor
| Polje | Tip | Opis | Šalje |
|---|---|---|---|
id | string | msg_ iza kojeg slijedi 32 heksadecimalna znaka. | Svi modeli |
type | string | Uvijek message. | Svi modeli |
role | string | Uvijek assistant. | Svi modeli |
model | string | Kanonski id modela koji je odgovorio. | Svi modeli |
content | array | Blokovi odgovora, ovim redoslijedom: thinking kada je model razmišljao, text, zatim po jedan tool_use za svaki poziv alata. | Svi modeli |
stop_reason | string | Zašto je odgovor završio. Pogledajte vrijednosti u nastavku. | Svi modeli |
usage | object | input_tokens i output_tokens. | Svi modeli |
sources | array | Samo na zahtjevu s web_search: true čija je pretraga nešto našla: rezultati koji su dati modelu, svaki s index, title i url. [1] u odgovoru je unos s index 1. U streamu dolazi s događajem message_delta. | shannon-1.6-*, shannon-2-*, porodica Shannon 3 |
usage.cache_read_input_tokens | integer | cache_read_input_tokens je dio prompta pročitan iz keša; input_tokens je ostatak. cache_creation_input_tokens je uvijek 0. | Hostirani open-weight modeli |
Blokovi odgovora
| Blok | Opis |
|---|---|
{"type": "thinking", "thinking": "…"} | Reasoning 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 pošaljite nazad s 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 prekinut 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: s imenom događaja i liniju data: s JSON objektom koji ponavlja ime u type. Stream helperi Anthropic SDK-a čitaju ove događaje umjesto 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, redoslijedom kojim stižu:
| Događaj | Podaci | Kada |
|---|---|---|
message_start | message | Uvijek 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"} | Dio reasoninga, za thinking blok. |
content_block_delta | index, delta {"type": "text_delta", "text"} | Dio odgovora, za text blok. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Argumenti poziva alata, kompletni u jednoj delti, za tool_use blok. |
content_block_stop | index | Blok s ovim index je završen. |
message_delta | delta {stop_reason, stop_sequence}, usage | Kraj odgovora: delta.stop_reason i usage zahtjeva. |
message_stop | Uvijek zadnji. |
Blokovi su numerisani pomoću index redoslijedom otvaranja, a jedan blok je završen prije nego što se otvori sljedeći. Svaki blok čitajte po njegovom tipu, a ne po broju: stream može prvo otvoriti prazan text blok, zatim thinking blok, a odgovor isporučiti 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 | ping događaj s podacima {"type": "ping"}, svakih 15 sekundi. |
| Hostirani open-weight modeli | Linija komentara : keepalive, svakih 15 sekundi dok model radi. |
Stream koji ne uspije
Greška nakon što je stream počeo je error događaj s istim tijelom kao odgovor s greškom: {"type": "error", "error": {"type", "message"}}. Završni događaji, message_delta i message_stop, ipak slijede. Smatrajte odgovor neuspjelim i pošaljite zahtjev ponovo.
Greške
Greške koriste Anthropic tijelo greške: type je error, a objekat error sadrži type i message. Tabela navodi šta ovaj endpoint najčešće vraća. Potpuna lista, s tim šta ponoviti, ima vlastitu 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 poslan, ili je ključ nepoznat ili opozvan. |
400 | invalid_request_error | unknown model: <id> | model nije Shannon id modela. |
400 | invalid_request_error | No user message provided | Shannon nivoi: zahtjev nema korisnički tekst i nema tools. |
400 | invalid_request_error | <id> does not accept image input | Slika je poslana hostiranom open-weight modelu bez ulaza slike. |
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. | Flood zaštita: više od 120 zahtjeva u jednoj minuti na vašem računu. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: iskorišteni su Shannon Coder pozivi vašeg plana za trenutni 4-satni prozor. |
500 | server_error | The model backend failed to answer. Please retry. | Model nije dao odgovor. Pošaljite zahtjev ponovo. |
502 | api_error | The model backend failed to answer. Please retry. | Model nije dao odgovor. Pošaljite zahtjev ponovo. |
Brojanje tokena
POST /v1/messages/count_tokens prima isto tijelo kao zahtjev za poruku (model, system, messages, tools) i vraća {"input_tokens": n}: broj ulaznih tokena koji bi se naplatili za zahtjev. Radi za hostirane open-weight modele, besplatno je i ne broji se u flood zaštitu.
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 vlastitu stranicu, s plain-text endpointom i ograničenjima. Brojanje tokena