Anthropic‑format
POST /v1/messages tar emot en begäran i Anthropic Messages-formatet och svarar i samma format, streamat eller inte. Använd det med Anthropic SDK och med verktyg byggda på den, till exempel Claude Code: ange bas-URL, använd din Shannon API-nyckel och ange ett Shannon-modell-id.
POST https://api.shannon-ai.com/v1/messages
Peka Anthropic SDK mot Shannons bas-URL. SDK:n lägger till /v1/messages och skickar din nyckel i headern 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 är ett meddelande vars content är en lista med block. Hitta blocken via deras type: när modellen resonerade är det första blocket thinking och texten kommer efter det.
{
"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 | Värde | Beskrivning |
|---|---|---|
x-api-key | YOUR_API_KEY | Din API-nyckel. Authorization: Bearer YOUR_API_KEY accepteras i stället. |
content-type | application/json | Obligatoriskt. |
anthropic-version | 2023-06-01 | Accepteras, krävs inte. Anthropic SDK skickar 2023-06-01; svaret har samma format oavsett värde. |
anthropic-beta | Accepteras, krävs inte. | |
x-request-id | Valfritt. Ditt eget id för begäran. Det kommer tillbaka oförändrat i svaret; utan det har svaret ett id på 12 hexadecimala tecken. |
Begäranfält
Endast messages är obligatoriskt. Kolumnen Tillämpas av anger de modeller där ett fält ändrar svaret. De hostade open-weight-modellerna är de tolv id:n i modellistan; Shannon 3-familjen är shannon-3, shannon-3-pro, shannon-3.1 och shannon-3.1-pro. Modeller och priser
| Fält | Typ | Standard | Beskrivning | Tillämpas av |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Ett Shannon-modell-id från modellistan. Skicka det med varje begäran. Matchningen är inte skiftlägeskänslig. Alla andra namn ger 400 unknown model, så ett verktyg som skickar egna modellnamn måste ställas in på ett Shannon-id. | Alla modeller |
messages | array | Obligatoriskt. Konversationen, äldsta meddelandet först, med rollerna user och assistant. Se Meddelanden och innehållsblock nedan. | Alla modeller | |
system | string | array | Instruktioner till modellen: en sträng eller en array av textblock. Se Systemprompt nedan. | Hostade open-weight-modeller, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Övre gräns för svaret, i tokens. Valfritt på den här endpointen; Anthropic SDK skickar det alltid. Ett värde utanför 1 till 65,536 flyttas in i det intervallet. Det är också det belopp som reserveras från din balans medan begäran körs. | Hostade open-weight-modeller, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true skickar svaret som server-sent events. Se Streaming nedan. | Alla modeller |
temperature | number | Samplingstemperatur. På de hostade open-weight-modellerna hålls värdena mellan 0 och 2. | Hostade open-weight-modeller, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus-sampling. | Hostade open-weight-modeller | |
stop_sequences | array | Upp till 4 strängar. Svaret slutar före den första som förekommer. stop_reason förblir end_turn. | Hostade open-weight-modeller | |
tools | array | De verktyg som modellen får anropa, vart och ett som {"name", "description", "input_schema"}. Se Verktyg nedan. | Alla modeller | |
tool_choice | object | {"type": "auto"} låter modellen avgöra, {"type": "any"} får den att anropa ett verktyg, {"type": "tool", "name": "…"} får den att anropa just det verktyget. | Hostade open-weight-modeller | |
thinking | object | Hur mycket modellen resonerar innan den svarar. Se Thinking nedan. | Hostade open-weight-modeller | |
web_search | boolean | false | Ett Shannon-tillägg till formatet: true låter modellen söka på webben innan den svarar. | shannon-1.6-*, shannon-2-*, Shannon 3-familjen |
Utan max_tokens är värdet 4,096, och 65,536 på shannon-coder-1.
metadata, top_k, service_tier och cache_control-markeringar på block accepteras så att befintlig klientkod körs oförändrad. De ändrar inte svaret; prompt-caching på de hostade open-weight-modellerna är automatisk.
Ett JSON-svar enligt ett schema begärs med response_format i Chat Completions och med text.format i Responses. Strukturerade utdata
En begäran med systemprompt och thinking
Den här begäran skickar en systemprompt, en thinking-budget, en temperatur och en stoppsekvens. Den använder en hostad open-weight-modell, som tillämpar alla dessa.
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 hostade open-weight-modellerna rapporterar usage de tokens som lästs från promptcachen separat från övriga inputtokens.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} Systemprompt
system är en sträng eller en array av textblock i formen [{"type": "text", "text": "…"}]. Blockens texter sammanfogas med ett radbrytningstecken.
Den tillämpas av de hostade open-weight-modellerna, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro och shannon-coder-1. Med ett id i Shannon 3-familjen ska instruktioner som måste gälla läggas i användarmeddelandet.
Meddelanden och innehållsblock
Ett meddelande har en role, user eller assistant, och ett content. content är en sträng eller en array av block.
| Block | Beskrivning | Tillgänglig på |
|---|---|---|
{"type": "text", "text": "…"} | Text. | Alla modeller |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | En bild i ett user-meddelande, som base64 eller via URL. | Shannon 3-familjen, shannon-1.6-lite, shannon-1.6-pro och de hostade open-weight-modeller som anger bildinput |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Ett dokument (PDF, Word, PowerPoint eller Excel) i ett user-meddelande, som base64 eller via URL. | Shannon 3-familjen |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | I ett assistant-meddelande: ett verktygsanrop som modellen gjorde i ett tidigare svar. | Alla modeller |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | I ett user-meddelande: resultatet av det anropet. content är en sträng eller en lista med textblock. | Alla modeller |
Du kan skicka tillbaka content från ett tidigare svar som det är: text- och tool_use-block läses, thinking-block hoppas över.
På Shannon-nivåerna läses bilder och dokument från det sista user-meddelandet. Storlekar och gränser har en egen sida. Bilder och filer
Thinking
De hostade open-weight-modellerna mappar thinking till en resonemangsansträngning. Utan fältet är ansträngningen hög.
| Form | budget_tokens | Effekt |
|---|---|---|
{"type": "disabled"} | Inget resonemang. Svaret har inget thinking-block. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Låg ansträngning. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Medelhög ansträngning. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Hög ansträngning. |
En modell som resonerar returnerar sitt resonemang som ett block {"type": "thinking", "thinking": "…"} före texten. De Shannon-nivåer som resonerar skickar det också.
Ansträngningsnivåerna beskrivs på sin egen sida. Resonemangsansträngning
Verktyg
Ett verktyg är en funktion som din kod kör. Beskriv varje verktyg med ett name, en description och ett input_schema. När modellen vill använda ett verktyg innehåller svaret ett tool_use-block och stop_reason är tool_use.
En verktygsdefinition i tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] content i ett svar som anropar det:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Kör verktyget och skicka sedan begäran igen, med anropet och ett tool_result-block tillagda 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 | Tillämpas av |
|---|---|---|
{"type": "auto"} | Modellen avgör om den ska anropa ett verktyg. Detta är standard. | Alla modeller |
{"type": "any"} | Modellen måste anropa ett av verktygen. | Hostade open-weight-modeller |
{"type": "tool", "name": "…"} | Modellen måste anropa det namngivna verktyget. | Hostade open-weight-modeller |
Endast verktyg med ett input_schema läses. Webbsökning är inget verktyg på den här endpointen: sätt fältet web_search.
Verktygsloopen beskrivs i sin helhet på sin egen sida. Funktionsanrop
Svaret
| Fält | Typ | Beskrivning | Skickas av |
|---|---|---|---|
id | string | msg_ följt av 32 hexadecimala tecken. | Alla modeller |
type | string | Alltid message. | Alla modeller |
role | string | Alltid assistant. | Alla modeller |
model | string | Kanoniskt id för modellen som svarade. | Alla modeller |
content | array | Svarets block, i den här ordningen: thinking när modellen resonerade, text, därefter ett tool_use per verktygsanrop. | Alla modeller |
stop_reason | string | Varför svaret tog slut. Se värdena nedan. | Alla modeller |
usage | object | input_tokens och output_tokens. | Alla modeller |
sources | array | Bara på en begäran med web_search: true vars sökning fann något: de resultat som modellen fick, vart och ett med index, title och url. [1] i svaret är posten med index 1. I en ström kommer det med händelsen message_delta. | shannon-1.6-*, shannon-2-*, Shannon 3-familjen |
usage.cache_read_input_tokens | integer | cache_read_input_tokens är den del av prompten som lästs från cachen; input_tokens är resten. cache_creation_input_tokens är alltid 0. | Hostade open-weight-modeller |
Svarsblock
| Block | Beskrivning |
|---|---|
{"type": "thinking", "thinking": "…"} | Modellens resonemang. Det finns ingen signature-medlem. |
{"type": "text", "text": "…"} | Svarstexten. Den kan vara tom när svaret är ett verktygsanrop. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Ett verktygsanrop. input är ett JSON-objekt. Skicka tillbaka resultatet med samma id. |
stop_reason
| stop_reason | Beskrivning | Skickas av |
|---|---|---|
end_turn | Modellen avslutade sitt svar, eller en av dina stop_sequences förekom. | Alla modeller |
tool_use | Svaret innehåller ett eller flera verktygsanrop. | Alla modeller |
max_tokens | Svaret avbröts vid outputgränsen. | Shannon 3-familjen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, i strömmar |
Streaming
Sätt stream till true för server-sent events. Varje ram har en event:-rad med händelsens namn och en data:-rad med ett JSON-objekt som upprepar namnet i type. Strömhjälparna i Anthropic SDK läser de här händelserna åt dig:
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."}]
}' Händelserna, i den ordning de kommer:
| Händelse | Data | När |
|---|---|---|
message_start | message | Alltid först. message innehåller id, roll, modell, ett tomt content och en usage som börjar på noll. |
content_block_start | index, content_block | Ett block öppnas. content_block är ett tomt text- eller thinking-block, eller ett tool_use-block med sitt id och name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | En bit av resonemanget, för ett thinking-block. |
content_block_delta | index, delta {"type": "text_delta", "text"} | En bit av svaret, för ett text-block. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Argumenten till ett verktygsanrop, kompletta i ett enda delta, för ett tool_use-block. |
content_block_stop | index | Blocket med detta index är färdigt. |
message_delta | delta {stop_reason, stop_sequence}, usage | Svarets slut: delta.stop_reason och begärans usage. |
message_stop | Alltid sist. |
Block numreras med index i den ordning de öppnas, och ett block är färdigt innan nästa öppnas. Läs varje block efter dess typ, inte efter dess nummer: en ström kan först öppna ett tomt text-block, sedan thinking-blocket, och leverera svaret i ett senare text-block.
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
| Skickas av | Beskrivning |
|---|---|
Shannon 3-familjen, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | En ping-händelse med data {"type": "ping"}, var 15:e sekund. |
| Hostade open-weight-modeller | En kommentarsrad : keepalive, var 15:e sekund medan modellen arbetar. |
En ström som misslyckas
Ett fel efter att strömmen har startat är en error-händelse med samma kropp som ett felsvar: {"type": "error", "error": {"type", "message"}}. De avslutande händelserna, message_delta och message_stop, följer ändå. Behandla svaret som misslyckat och skicka begäran igen.
Fel
Fel använder Anthropics felkropp: type är error, och error-objektet innehåller en type och ett message. Tabellen listar det som den här endpointen oftast returnerar. Den fullständiga listan, med vad som ska försökas igen, har en egen sida. Felhantering
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Typ | Meddelande | När |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Ingen API-nyckel skickades, eller så är nyckeln okänd eller återkallad. |
400 | invalid_request_error | unknown model: <id> | model är inte ett Shannon-modell-id. |
400 | invalid_request_error | No user message provided | Shannon-nivåer: begäran har ingen användartext och inga tools. |
400 | invalid_request_error | <id> does not accept image input | En bild skickades till en hostad open-weight-modell utan bildinput. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages saknas, eller ett fält har fel JSON-typ. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens är större än vad som återstår av din balans. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: fler än 120 begäranden på en minut på ditt konto. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: de Shannon Coder-anrop som din plan ger för det aktuella 4-timmarsfönstret är förbrukade. |
500 | server_error | The model backend failed to answer. Please retry. | Modellen gav inget svar. Skicka begäran igen. |
502 | api_error | The model backend failed to answer. Please retry. | Modellen gav inget svar. Skicka begäran igen. |
Räkna tokens
POST /v1/messages/count_tokens tar samma kropp som en meddelandebegäran (model, system, messages, tools) och returnerar {"input_tokens": n}: antalet inputtokens som begäran skulle debiteras. Det räknar för de hostade open-weight-modellerna, är gratis och räknas inte 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} Räkningen har en egen sida, med endpointen för ren text och gränserna. Tokenräkning