Anthropic-format
POST /v1/messages tar en forespørsel i Anthropic Messages-formatet og svarer i samme format, strømmet eller ikke. Bruk det med Anthropic-SDK-en og verktøy bygget på den, som Claude Code: sett base-URL-en, bruk Shannon API-nøkkelen din og oppgi en Shannon-modell-id.
POST https://api.shannon-ai.com/v1/messages
Pek Anthropic-SDK-en mot Shannon-base-URL-en. SDK-en legger til /v1/messages og sender nøkkelen din i headeren 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."}]
}' Svaret er en melding der content er en liste med blokker. Finn blokkene etter type: når modellen resonnerte, er den første blokken thinking, og teksten kommer etter den.
{
"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
}
} Headere
| Header | Verdi | Beskrivelse |
|---|---|---|
x-api-key | YOUR_API_KEY | API-nøkkelen din. Authorization: Bearer YOUR_API_KEY godtas i stedet. |
content-type | application/json | Påkrevd. |
anthropic-version | 2023-06-01 | Godtas, ikke påkrevd. Anthropic-SDK-en sender 2023-06-01; svaret har samme format uansett verdi. |
anthropic-beta | Godtas, ikke påkrevd. | |
x-request-id | Valgfritt. Din egen id for forespørselen. Den kommer tilbake uendret i svaret; uten den får svaret en id på 12 heksadesimale tegn. |
Forespørselsfelt
Bare messages er påkrevd. Kolonnen Brukes av nevner modellene der et felt endrer svaret. De hostede åpne vektmodellene er de tolv id-ene i modelllisten; Shannon 3-familien er shannon-3, shannon-3-pro, shannon-3.1 og shannon-3.1-pro. Modeller og priser
| Felt | Type | Standard | Beskrivelse | Brukes av |
|---|---|---|---|---|
model | string | shannon-1.6-lite | En Shannon-modell-id fra modelllisten. Send den med hver forespørsel. Det skilles ikke mellom store og små bokstaver. Alle andre navn gir 400 unknown model, så et verktøy som sender egne modellnavn, må settes til en Shannon-id. | Alle modeller |
messages | array | Påkrevd. Samtalen, eldste melding først, med rollene user og assistant. Se Meldinger og innholdsblokker nedenfor. | Alle modeller | |
system | string | array | Instruksjoner til modellen: en streng eller en matrise av tekstblokker. Se Systemprompt nedenfor. | Hostede åpne vektmodeller, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Øvre grense for svaret, i tokens. Valgfritt på dette endepunktet; Anthropic-SDK-en sender det alltid. En verdi utenfor 1 til 65,536 flyttes inn i dette området. Det er også beløpet som settes av fra saldoen din mens forespørselen kjører. | Hostede åpne vektmodeller, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true sender svaret som server-sent events. Se Strømming nedenfor. | Alle modeller |
temperature | number | Samplingtemperatur. På de hostede åpne vektmodellene holdes verdiene mellom 0 og 2. | Hostede åpne vektmodeller, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus sampling. | Hostede åpne vektmodeller | |
stop_sequences | array | Opptil 4 strenger. Svaret avsluttes før den første som dukker opp. stop_reason forblir end_turn. | Hostede åpne vektmodeller | |
tools | array | Verktøyene modellen kan kalle, hvert som {"name", "description", "input_schema"}. Se Verktøy nedenfor. | Alle modeller | |
tool_choice | object | {"type": "auto"} lar modellen bestemme, {"type": "any"} får den til å kalle et verktøy, {"type": "tool", "name": "…"} får den til å kalle akkurat det verktøyet. | Hostede åpne vektmodeller | |
thinking | object | Hvor mye modellen resonnerer før den svarer. Se Tenking nedenfor. | Hostede åpne vektmodeller | |
web_search | boolean | false | Et Shannon-tillegg til formatet: true lar modellen søke på nettet før den svarer. | shannon-1.6-*, shannon-2-*, Shannon 3-familien |
Uten max_tokens er verdien 4,096, og 65,536 på shannon-coder-1.
metadata, top_k, service_tier og cache_control-markører på blokker godtas slik at eksisterende klientkode kjører uendret. De endrer ikke svaret; prompt-caching på de hostede åpne vektmodellene er automatisk.
Et JSON-svar etter et skjema bes om med response_format på Chat Completions og med text.format på Responses. Strukturerte utdata
En forespørsel med systemprompt og tenking
Denne forespørselen sender en systemprompt, et tenkebudsjett, en temperatur og en stoppsekvens. Den bruker en hostet åpen vektmodell, som anvender alle disse.
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?"}]
}' På de hostede åpne vektmodellene rapporterer usage tokens lest fra prompt-cachen separat fra de andre input-tokens.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} Systemprompt
system er en streng eller en matrise av tekstblokker på formen [{"type": "text", "text": "…"}]. Tekstene i blokkene settes sammen med et linjeskift.
Den brukes av de hostede åpne vektmodellene, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro og shannon-coder-1. Med en id fra Shannon 3-familien setter du instruksjoner som må gjelde, i brukermeldingen.
Meldinger og innholdsblokker
En melding har en role, user eller assistant, og et content. content er en streng eller en matrise av blokker.
| Blokk | Beskrivelse | Tilgjengelig på |
|---|---|---|
{"type": "text", "text": "…"} | Tekst. | Alle modeller |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | Et bilde i en user-melding, som base64 eller via URL. | Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro og de hostede åpne vektmodellene som støtter bilde som input |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Et dokument (PDF, Word, PowerPoint eller Excel) i en user-melding, som base64 eller via URL. | Shannon 3-familien |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | I en assistant-melding: et verktøykall modellen gjorde i et tidligere svar. | Alle modeller |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | I en user-melding: resultatet av det kallet. content er en streng eller en liste med tekstblokker. | Alle modeller |
Du kan sende content fra et tidligere svar tilbake som det er: blokkene text og tool_use leses, thinking-blokker hoppes over.
På Shannon-nivåene leses bilder og dokumenter fra den siste user-meldingen. Størrelser og grenser har sin egen side. Bilder og filer
Tenking
De hostede åpne vektmodellene kobler thinking til et resonneringsnivå. Uten feltet er nivået høyt.
| Form | budget_tokens | Effekt |
|---|---|---|
{"type": "disabled"} | Ingen resonnering. Svaret har ingen thinking-blokk. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Lav innsats. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Middels innsats. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Høy innsats. |
En modell som resonnerer, returnerer resonneringen som en blokk {"type": "thinking", "thinking": "…"} foran teksten. Shannon-nivåene som resonnerer, sender den også.
Innsatsnivåene er beskrevet på sin egen side. Resonneringsinnsats
Verktøy
Et verktøy er en funksjon koden din kjører. Beskriv hvert verktøy med name, description og input_schema. Når modellen vil bruke et verktøy, inneholder svaret en tool_use-blokk og stop_reason er tool_use.
En verktøydefinisjon i tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] content i et svar som kaller det:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Kjør verktøyet, og send deretter forespørselen på nytt med kallet og en tool_result-blokk lagt til i 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
| Form | Effekt | Brukes av |
|---|---|---|
{"type": "auto"} | Modellen bestemmer om den kaller et verktøy. Dette er standard. | Alle modeller |
{"type": "any"} | Modellen må kalle ett av verktøyene. | Hostede åpne vektmodeller |
{"type": "tool", "name": "…"} | Modellen må kalle det navngitte verktøyet. | Hostede åpne vektmodeller |
Bare verktøy med en input_schema leses. Nettsøk er ikke et verktøy på dette endepunktet: sett feltet web_search.
Verktøysløyfen er beskrevet fullstendig på sin egen side. Funksjonskall
Svaret
| Felt | Type | Beskrivelse | Sendt av |
|---|---|---|---|
id | string | msg_ etterfulgt av 32 heksadesimale tegn. | Alle modeller |
type | string | Alltid message. | Alle modeller |
role | string | Alltid assistant. | Alle modeller |
model | string | Den kanoniske id-en til modellen som svarte. | Alle modeller |
content | array | Blokkene i svaret, i denne rekkefølgen: thinking når modellen resonnerte, text, deretter én tool_use per verktøykall. | Alle modeller |
stop_reason | string | Hvorfor svaret tok slutt. Se verdiene nedenfor. | Alle modeller |
usage | object | input_tokens og output_tokens. | Alle modeller |
sources | array | Bare på en forespørsel med web_search: true der søket fant noe: resultatene modellen fikk, hvert med index, title og url. [1] i svaret er oppføringen med index 1. I en strøm kommer det med hendelsen message_delta. | shannon-1.6-*, shannon-2-*, Shannon 3-familien |
usage.cache_read_input_tokens | integer | cache_read_input_tokens er delen av prompten som ble lest fra cachen; input_tokens er resten. cache_creation_input_tokens er alltid 0. | Hostede åpne vektmodeller |
Svarblokker
| Blokk | Beskrivelse |
|---|---|
{"type": "thinking", "thinking": "…"} | Modellens resonnering. Det finnes ikke noe signature-medlem. |
{"type": "text", "text": "…"} | Svarteksten. Den kan være tom når svaret er et verktøykall. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Et verktøykall. input er et JSON-objekt. Send resultatet tilbake med samme id. |
stop_reason
| stop_reason | Beskrivelse | Sendt av |
|---|---|---|
end_turn | Modellen fullførte svaret sitt, eller en av dine stop_sequences dukket opp. | Alle modeller |
tool_use | Svaret inneholder ett eller flere verktøykall. | Alle modeller |
max_tokens | Svaret ble kuttet ved output-grensen. | Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, i strømmer |
Strømming
Sett stream til true for server-sent events. Hver ramme har en event:-linje med navnet på hendelsen og en data:-linje med et JSON-objekt som gjentar navnet i type. Strøm-hjelperne i Anthropic-SDK-en leser disse hendelsene for deg:
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."}]
}' Hendelsene, i den rekkefølgen de kommer:
| Hendelse | Data | Når |
|---|---|---|
message_start | message | Alltid først. message inneholder id, rolle, modell, et tomt content og en usage som starter på null. |
content_block_start | index, content_block | En blokk åpnes. content_block er en tom text- eller thinking-blokk, eller en tool_use-blokk med id og name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | En del av resonneringen, for en thinking-blokk. |
content_block_delta | index, delta {"type": "text_delta", "text"} | En del av svaret, for en text-blokk. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Argumentene til et verktøykall, komplette i én delta, for en tool_use-blokk. |
content_block_stop | index | Blokken med denne index er ferdig. |
message_delta | delta {stop_reason, stop_sequence}, usage | Slutten på svaret: delta.stop_reason og usage for forespørselen. |
message_stop | Alltid sist. |
Blokker nummereres med index i den rekkefølgen de åpnes, og én blokk er ferdig før den neste åpnes. Les hver blokk etter typen, ikke etter nummeret: en strøm kan først åpne en tom text-blokk, deretter thinking-blokken, og levere svaret i en senere text-blokk.
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
| Sendt av | Beskrivelse |
|---|---|
Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | En ping-hendelse med dataene {"type": "ping"}, hvert 15. sekund. |
| Hostede åpne vektmodeller | En kommentarlinje : keepalive, hvert 15. sekund mens modellen jobber. |
En strøm som feiler
En feil etter at strømmen har startet, er en error-hendelse med samme kropp som et feilsvar: {"type": "error", "error": {"type", "message"}}. De avsluttende hendelsene, message_delta og message_stop, kommer likevel etterpå. Behandle svaret som mislykket og send forespørselen på nytt.
Feil
Feil bruker Anthropics feilkropp: type er error, og error-objektet har en type og en message. Tabellen viser det dette endepunktet oftest returnerer. Den fullstendige listen, med hva som kan prøves på nytt, har sin egen side. Feilhåndtering
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Type | Melding | Når |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Ingen API-nøkkel ble sendt, eller nøkkelen er ukjent eller tilbakekalt. |
400 | invalid_request_error | unknown model: <id> | model er ikke en Shannon-modell-id. |
400 | invalid_request_error | No user message provided | Shannon-nivåer: forespørselen har ingen brukertekst og ingen tools. |
400 | invalid_request_error | <id> does not accept image input | Et bilde ble sendt til en hostet åpen vektmodell uten støtte for bilde som input. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages mangler, eller et felt har feil JSON-type. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens er større enn det som er igjen av saldoen din. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: mer enn 120 forespørsler i løpet av ett minutt på kontoen din. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: Shannon Coder-kallene i planen din for gjeldende 4-timersvindu er brukt opp. |
500 | server_error | The model backend failed to answer. Please retry. | Modellen ga ikke noe svar. Send forespørselen på nytt. |
502 | api_error | The model backend failed to answer. Please retry. | Modellen ga ikke noe svar. Send forespørselen på nytt. |
Telling av tokens
POST /v1/messages/count_tokens tar samme kropp som en meldingsforespørsel (model, system, messages, tools) og returnerer {"input_tokens": n}: antall input-tokens forespørselen ville bli belastet for. Det gjelder for de hostede åpne vektmodellene, er gratis og telles ikke av 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} Telling har sin egen side, med ren tekst-endepunktet og grensene. Token-telling