Anthropic‑formaat
POST /v1/messages accepteert een aanvraag in het Anthropic Messages-formaat en antwoordt in hetzelfde formaat, gestreamd of niet. Gebruik het met de Anthropic SDK en met tools die erop zijn gebouwd, zoals Claude Code: stel de basis-URL in, gebruik je Shannon API-sleutel en geef een Shannon model-id op.
POST https://api.shannon-ai.com/v1/messages
Wijs de Anthropic SDK naar de Shannon-basis-URL. De SDK voegt /v1/messages toe en stuurt je sleutel mee in de x-api-key-header.
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."}]
}' Het antwoord is een bericht waarvan content een lijst met blokken is. Zoek de blokken op hun type: als het model heeft geredeneerd, is het eerste blok thinking en volgt de tekst daarna.
{
"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
}
} Headers
| Header | Waarde | Beschrijving |
|---|---|---|
x-api-key | YOUR_API_KEY | Je API-sleutel. Authorization: Bearer YOUR_API_KEY wordt in plaats daarvan geaccepteerd. |
content-type | application/json | Verplicht. |
anthropic-version | 2023-06-01 | Geaccepteerd, niet verplicht. De Anthropic SDK stuurt 2023-06-01; het antwoord heeft hetzelfde formaat, ongeacht de waarde. |
anthropic-beta | Geaccepteerd, niet verplicht. | |
x-request-id | Optioneel. Je eigen id voor de aanvraag. Hij komt ongewijzigd terug in het antwoord; zonder deze header bevat het antwoord een id van 12 hexadecimale tekens. |
Request-velden
Alleen messages is verplicht. De kolom Toegepast door noemt de modellen waarop een veld het antwoord verandert. De gehoste open-weight modellen zijn de twaalf id's uit de modellijst; de Shannon 3-familie is shannon-3, shannon-3-pro, shannon-3.1 en shannon-3.1-pro. Modellen en prijzen
| Veld | Type | Standaard | Beschrijving | Toegepast door |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Een Shannon model-id uit de modellijst. Stuur het mee met elke aanvraag. Hoofdletters maken niet uit. Elke andere naam geeft 400 unknown model terug, dus een tool die zijn eigen modelnamen verstuurt, moet op een Shannon-id worden ingesteld. | Alle modellen |
messages | array | Verplicht. Het gesprek, oudste bericht eerst, met de rollen user en assistant. Zie Berichten en contentblokken hieronder. | Alle modellen | |
system | string | array | Instructies voor het model: een string of een array van tekstblokken. Zie Systeemprompt hieronder. | Gehoste open-weight modellen, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Bovengrens van het antwoord, in tokens. Optioneel op dit endpoint; de Anthropic SDK stuurt het altijd mee. Een waarde buiten 1 tot 65,536 wordt naar dat bereik verplaatst. Het is ook het bedrag dat van je saldo wordt gereserveerd zolang de aanvraag loopt. | Gehoste open-weight modellen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true stuurt het antwoord als server-sent events. Zie Streaming hieronder. | Alle modellen |
temperature | number | Sampling-temperatuur. Op de gehoste open-weight modellen blijven waarden tussen 0 en 2. | Gehoste open-weight modellen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus sampling. | Gehoste open-weight modellen | |
stop_sequences | array | Maximaal 4 strings. Het antwoord eindigt vóór de eerste die voorkomt. stop_reason blijft end_turn. | Gehoste open-weight modellen | |
tools | array | De tools die het model mag aanroepen, elk als {"name", "description", "input_schema"}. Zie Tools hieronder. | Alle modellen | |
tool_choice | object | {"type": "auto"} laat het model beslissen, {"type": "any"} laat het een tool aanroepen, {"type": "tool", "name": "…"} laat het die tool aanroepen. | Gehoste open-weight modellen | |
thinking | object | Hoeveel het model redeneert voordat het antwoordt. Zie Thinking hieronder. | Gehoste open-weight modellen | |
web_search | boolean | false | Een Shannon-toevoeging aan het formaat: true laat het model het web doorzoeken voordat het antwoordt. | shannon-1.6-*, shannon-2-*, Shannon 3-familie |
Zonder max_tokens is de waarde 4,096, en 65,536 op shannon-coder-1.
metadata, top_k, service_tier en cache_control-markeringen op blokken worden geaccepteerd, zodat bestaande clientcode ongewijzigd draait. Ze veranderen het antwoord niet; prompt caching op de gehoste open-weight modellen gebeurt automatisch.
Een JSON-antwoord volgens een schema vraag je aan met response_format bij Chat Completions en met text.format bij Responses. Gestructureerde outputs
Een aanvraag met een systeemprompt en thinking
Deze aanvraag stuurt een systeemprompt, een thinking-budget, een temperatuur en een stopsequentie mee. Ze gebruikt een gehost open-weight model, dat ze allemaal toepast.
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?"}]
}' Op de gehoste open-weight modellen meldt usage de tokens die uit de prompt cache zijn gelezen apart van de andere inputtokens.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} Systeemprompt
system is een string, of een array van tekstblokken in de vorm [{"type": "text", "text": "…"}]. De teksten van de blokken worden samengevoegd met een regeleinde.
Wordt toegepast door de gehoste open-weight modellen, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro en shannon-coder-1. Zet bij een id uit de Shannon 3-familie instructies die moeten gelden in het gebruikersbericht.
Berichten en contentblokken
Een bericht heeft een role, user of assistant, en een content. content is een string of een array van blokken.
| Blok | Beschrijving | Beschikbaar op |
|---|---|---|
{"type": "text", "text": "…"} | Tekst. | Alle modellen |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | Een afbeelding in een user-bericht, als base64 of via URL. | Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro en de gehoste open-weight modellen met afbeeldingen als input |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Een document (PDF, Word, PowerPoint of Excel) in een user-bericht, als base64 of via URL. | Shannon 3-familie |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | In een assistant-bericht: een toolcall die het model in een eerder antwoord deed. | Alle modellen |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | In een user-bericht: het resultaat van die call. content is een string of een lijst met tekstblokken. | Alle modellen |
Je kunt de content van een eerder antwoord ongewijzigd terugsturen: text- en tool_use-blokken worden gelezen, thinking-blokken worden overgeslagen.
Op de Shannon-tiers worden afbeeldingen en documenten uit het laatste user-bericht gelezen. Groottes en limieten hebben een eigen pagina. Afbeeldingen en bestanden
Thinking
De gehoste open-weight modellen koppelen thinking aan een reasoning effort. Zonder het veld is de effort hoog.
| Vorm | budget_tokens | Effect |
|---|---|---|
{"type": "disabled"} | Geen reasoning. Het antwoord bevat geen thinking-blok. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Lage effort. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Gemiddelde effort. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Hoge effort. |
Een model dat redeneert, geeft zijn reasoning terug als blok {"type": "thinking", "thinking": "…"} vóór de tekst. De Shannon-tiers die redeneren, sturen het ook mee.
De efforts worden beschreven op hun eigen pagina. Reasoning effort
Tools
Een tool is een functie die jouw code uitvoert. Beschrijf elke tool met een name, een description en een input_schema. Als het model een tool wil, bevat het antwoord een tool_use-blok en is stop_reason gelijk aan tool_use.
Een tooldefinitie in tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] De content van een antwoord dat de tool aanroept:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Voer de tool uit en stuur de aanvraag daarna opnieuw, met de call en een tool_result-blok toegevoegd aan 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
| Vorm | Effect | Toegepast door |
|---|---|---|
{"type": "auto"} | Het model beslist zelf of het een tool aanroept. Dit is de standaard. | Alle modellen |
{"type": "any"} | Het model moet een van de tools aanroepen. | Gehoste open-weight modellen |
{"type": "tool", "name": "…"} | Het model moet de genoemde tool aanroepen. | Gehoste open-weight modellen |
Alleen tools met een input_schema worden gelezen. Web search is op dit endpoint geen tool: stel het veld web_search in.
De toolloop wordt volledig beschreven op een eigen pagina. Function calling
Het antwoord
| Veld | Type | Beschrijving | Verzonden door |
|---|---|---|---|
id | string | msg_ gevolgd door 32 hexadecimale tekens. | Alle modellen |
type | string | Altijd message. | Alle modellen |
role | string | Altijd assistant. | Alle modellen |
model | string | Het canonieke id van het model dat antwoordde. | Alle modellen |
content | array | De blokken van het antwoord, in deze volgorde: thinking als het model heeft geredeneerd, text, daarna één tool_use per toolcall. | Alle modellen |
stop_reason | string | Waarom het antwoord eindigde. Zie de waarden hieronder. | Alle modellen |
usage | object | input_tokens en output_tokens. | Alle modellen |
sources | array | Alleen bij een aanvraag met web_search: true waarvan de zoekopdracht iets vond: de resultaten die het model kreeg, elk met index, title en url. [1] in het antwoord is het item met index 1. In een stream komt het mee met het event message_delta. | shannon-1.6-*, shannon-2-*, Shannon 3-familie |
usage.cache_read_input_tokens | integer | cache_read_input_tokens is het deel van de prompt dat uit de cache is gelezen; input_tokens is de rest. cache_creation_input_tokens is altijd 0. | Gehoste open-weight modellen |
Antwoordblokken
| Blok | Beschrijving |
|---|---|
{"type": "thinking", "thinking": "…"} | De reasoning van het model. Er is geen signature-lid. |
{"type": "text", "text": "…"} | De antwoordtekst. Kan leeg zijn als het antwoord een toolcall is. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Een toolcall. input is een JSON-object. Stuur het resultaat terug met dezelfde id. |
stop_reason
| stop_reason | Beschrijving | Verzonden door |
|---|---|---|
end_turn | Het model heeft zijn antwoord afgerond, of een van je stop_sequences kwam voor. | Alle modellen |
tool_use | Het antwoord bevat een of meer toolcalls. | Alle modellen |
max_tokens | Het antwoord is afgekapt bij de outputlimiet. | Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, in streams |
Streaming
Stel stream in op true voor server-sent events. Elk frame heeft een event:-regel met de naam van het event en een data:-regel met een JSON-object dat de naam herhaalt in type. De stream-helpers van de Anthropic SDK lezen deze events voor je:
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."}]
}' De events, in de volgorde waarin ze binnenkomen:
| Event | Data | Wanneer |
|---|---|---|
message_start | message | Altijd eerst. message bevat het id, de rol, het model, een lege content en een usage die op nul begint. |
content_block_start | index, content_block | Een blok opent. content_block is een leeg text- of thinking-blok, of een tool_use-blok met zijn id en name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | Een stuk van de reasoning, voor een thinking-blok. |
content_block_delta | index, delta {"type": "text_delta", "text"} | Een stuk van het antwoord, voor een text-blok. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | De argumenten van een toolcall, compleet in één delta, voor een tool_use-blok. |
content_block_stop | index | Het blok met deze index is compleet. |
message_delta | delta {stop_reason, stop_sequence}, usage | Het einde van het antwoord: delta.stop_reason en de usage van de aanvraag. |
message_stop | Altijd laatst. |
Blokken worden genummerd met index in de volgorde waarin ze openen, en een blok is compleet voordat het volgende opent. Lees elk blok op type, niet op nummer: een stream kan eerst een leeg text-blok openen, dan het thinking-blok, en het antwoord leveren in een later text-blok.
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
| Verzonden door | Beschrijving |
|---|---|
Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | Een ping-event met de data {"type": "ping"}, elke 15 seconden. |
| Gehoste open-weight modellen | Een commentaarregel : keepalive, elke 15 seconden terwijl het model werkt. |
Een stream die mislukt
Een fout nadat de stream is begonnen, is een error-event met dezelfde body als een foutantwoord: {"type": "error", "error": {"type", "message"}}. De afsluitende events, message_delta en message_stop, volgen nog steeds. Beschouw het antwoord als mislukt en stuur de aanvraag opnieuw.
Fouten
Fouten gebruiken de Anthropic-foutbody: type is error en het object error bevat een type en een message. De tabel toont wat dit endpoint het vaakst teruggeeft. De volledige lijst, met wat je opnieuw moet proberen, heeft een eigen pagina. Foutafhandeling
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Type | Bericht | Wanneer |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Er is geen API-sleutel verzonden, of de sleutel is onbekend of ingetrokken. |
400 | invalid_request_error | unknown model: <id> | model is geen Shannon model-id. |
400 | invalid_request_error | No user message provided | Shannon-tiers: de aanvraag bevat geen gebruikerstekst en geen tools. |
400 | invalid_request_error | <id> does not accept image input | Er is een afbeelding verzonden naar een gehost open-weight model zonder afbeeldingen als input. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages ontbreekt, of een veld heeft het verkeerde JSON-type. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens is groter dan wat er van je saldo over is. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: meer dan 120 aanvragen in één minuut op je account. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: de Shannon Coder-calls van je plan voor het huidige venster van 4 uur zijn op. |
500 | server_error | The model backend failed to answer. Please retry. | Het model gaf geen antwoord. Verstuur de aanvraag opnieuw. |
502 | api_error | The model backend failed to answer. Please retry. | Het model gaf geen antwoord. Verstuur de aanvraag opnieuw. |
Tokens tellen
POST /v1/messages/count_tokens accepteert dezelfde body als een berichtaanvraag (model, system, messages, tools) en geeft {"input_tokens": n} terug: het aantal inputtokens dat voor de aanvraag in rekening zou worden gebracht. Het telt voor de gehoste open-weight modellen, is gratis en wordt niet meegeteld door 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} Tellen heeft een eigen pagina, met het plain-text endpoint en de limieten. Tokens tellen