Anthropic-format
POST /v1/messages tager en anmodning i Anthropic Messages-formatet og svarer i samme format, streamet eller ej. Brug det med Anthropic SDK og med værktøjer bygget på den, f.eks. Claude Code: angiv base-URL'en, brug din Shannon API-nøgle, og angiv et Shannon-model-id.
POST https://api.shannon-ai.com/v1/messages
Peg Anthropic SDK på Shannon-base-URL'en. SDK'en tilføjer /v1/messages og sender din nøgle 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 besked, hvis content er en liste af blokke. Find blokkene via deres type: når modellen ræsonnerede, er den første blok thinking, og teksten kommer efter 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
}
} Headers
| Header | Værdi | Beskrivelse |
|---|---|---|
x-api-key | YOUR_API_KEY | Din API-nøgle. Authorization: Bearer YOUR_API_KEY accepteres i stedet. |
content-type | application/json | Påkrævet. |
anthropic-version | 2023-06-01 | Accepteres, ikke påkrævet. Anthropic SDK sender 2023-06-01; svaret har samme format uanset værdien. |
anthropic-beta | Accepteres, ikke påkrævet. | |
x-request-id | Valgfri. Dit eget id for anmodningen. Det kommer uændret tilbage i svaret; uden det har svaret et id på 12 hexadecimale tegn. |
Anmodningsfelter
Kun messages er påkrævet. Kolonnen Anvendes af angiver de modeller, hvor et felt ændrer svaret. De hostede open-weight-modeller er de tolv id'er på modellisten; Shannon 3-familien er shannon-3, shannon-3-pro, shannon-3.1 og shannon-3.1-pro. Modeller og priser
| Felt | Type | Standard | Beskrivelse | Anvendes af |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Et Shannon-model-id fra modellisten. Send det med hver anmodning. Der skelnes ikke mellem store og små bogstaver. Ethvert andet navn returnerer 400 unknown model, så et værktøj, der sender sine egne modelnavne, skal sættes til et Shannon-id. | Alle modeller |
messages | array | Påkrævet. Samtalen med den ældste besked først, med rollerne user og assistant. Se Beskeder og indholdsblokke nedenfor. | Alle modeller | |
system | string | array | Instruktioner til modellen: en streng eller et array af tekstblokke. Se System prompt nedenfor. | Hostede open-weight-modeller, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Øvre grænse for svaret, i tokens. Valgfri på dette endpoint; Anthropic SDK sender den altid. En værdi uden for 1 til 65,536 flyttes ind i det interval. Det er også det beløb, der reserveres fra din saldo, mens anmodningen kører. | Hostede open-weight-modeller, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true sender svaret som server-sent events. Se Streaming nedenfor. | Alle modeller |
temperature | number | Samplingtemperatur. På de hostede open-weight-modeller holdes værdierne mellem 0 og 2. | Hostede open-weight-modeller, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus sampling. | Hostede open-weight-modeller | |
stop_sequences | array | Op til 4 strenge. Svaret slutter før den første, der forekommer. stop_reason forbliver end_turn. | Hostede open-weight-modeller | |
tools | array | De værktøjer, modellen må kalde, hver som {"name", "description", "input_schema"}. Se Værktøjer nedenfor. | Alle modeller | |
tool_choice | object | {"type": "auto"} lader modellen bestemme, {"type": "any"} får den til at kalde et værktøj, {"type": "tool", "name": "…"} får den til at kalde netop det værktøj. | Hostede open-weight-modeller | |
thinking | object | Hvor meget modellen ræsonnerer, før den svarer. Se Thinking nedenfor. | Hostede open-weight-modeller | |
web_search | boolean | false | Et Shannon-tillæg til formatet: true lader modellen søge på nettet, før den svarer. | shannon-1.6-*, shannon-2-*, Shannon 3-familien |
Uden max_tokens er værdien 4,096, og 65,536 på shannon-coder-1.
Markørerne metadata, top_k, service_tier og cache_control på blokke accepteres, så eksisterende klientkode kører uændret. De ændrer ikke svaret; prompt caching på de hostede open-weight-modeller er automatisk.
Et JSON-svar efter et skema bestilles med response_format på Chat Completions og med text.format på Responses. Strukturerede outputs
En anmodning med system prompt og thinking
Denne anmodning sender en system prompt, et thinking-budget, en temperatur og en stopsekvens. Den bruger en hostet open-weight-model, som anvender dem alle.
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 open-weight-modeller rapporterer usage de tokens, der er læst fra prompt-cachen, adskilt fra de øvrige input-tokens.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} System prompt
system er en streng eller et array af tekstblokke på formen [{"type": "text", "text": "…"}]. Blokkenes tekster sammenføjes med et linjeskift.
Den anvendes af de hostede open-weight-modeller, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro og shannon-coder-1. Med et id fra Shannon 3-familien skal du lægge instruktioner, der skal overholdes, i brugerbeskeden.
Beskeder og indholdsblokke
En besked har en role, user eller assistant, og et content. content er en streng eller et array af blokke.
| Blok | Beskrivelse | Tilgængelig på |
|---|---|---|
{"type": "text", "text": "…"} | Tekst. | Alle modeller |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | Et billede i en user-besked, som base64 eller via URL. | Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro og de hostede open-weight-modeller, der angiver billedinput |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Et dokument (PDF, Word, PowerPoint eller Excel) i en user-besked, som base64 eller via URL. | Shannon 3-familien |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | I en assistant-besked: et værktøjskald, som modellen foretog i et tidligere svar. | Alle modeller |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | I en user-besked: resultatet af det kald. content er en streng eller en liste af tekstblokke. | Alle modeller |
Du kan sende content fra et tidligere svar tilbage uændret: blokkene text og tool_use læses, blokkene thinking springes over.
På Shannon-niveauerne læses billeder og dokumenter fra den sidste user-besked. Størrelser og grænser har deres egen side. Billeder og filer
Thinking
De hostede open-weight-modeller afbilder thinking på en reasoning effort. Uden feltet er effort høj.
| Form | budget_tokens | Effekt |
|---|---|---|
{"type": "disabled"} | Ingen reasoning. Svaret har ingen thinking-blok. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Lav effort. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Middel effort. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Høj effort. |
En model, der ræsonnerer, returnerer sin reasoning som en blok {"type": "thinking", "thinking": "…"} foran teksten. De Shannon-niveauer, der ræsonnerer, sender den også.
Effort-niveauerne er beskrevet på deres egen side. Reasoning effort
Værktøjer
Et værktøj er en funktion, som din kode kører. Beskriv hvert enkelt med et name, en description og et input_schema. Når modellen vil bruge et værktøj, indeholder svaret en tool_use-blok, og stop_reason er tool_use.
En værktøjsdefinition 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, der kalder det:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Kør værktøjet, og send derefter anmodningen igen med kaldet og en tool_result-blok tilføjet til 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 | Anvendes af |
|---|---|---|
{"type": "auto"} | Modellen afgør, om den vil kalde et værktøj. Dette er standarden. | Alle modeller |
{"type": "any"} | Modellen skal kalde et af værktøjerne. | Hostede open-weight-modeller |
{"type": "tool", "name": "…"} | Modellen skal kalde det angivne værktøj. | Hostede open-weight-modeller |
Kun værktøjer med et input_schema læses. Websøgning er ikke et værktøj på dette endpoint: sæt feltet web_search.
Værktøjsløkken er beskrevet fuldt ud på sin egen side. Funktionskald
Svaret
| Felt | Type | Beskrivelse | Sendt af |
|---|---|---|---|
id | string | msg_ efterfulgt af 32 hexadecimale tegn. | Alle modeller |
type | string | Altid message. | Alle modeller |
role | string | Altid assistant. | Alle modeller |
model | string | Det kanoniske id for den model, der svarede. | Alle modeller |
content | array | Svarets blokke i denne rækkefølge: thinking, når modellen ræsonnerede, text og derefter én tool_use per værktøjskald. | Alle modeller |
stop_reason | string | Hvorfor svaret sluttede. Se værdierne nedenfor. | Alle modeller |
usage | object | input_tokens og output_tokens. | Alle modeller |
sources | array | Kun på en anmodning med web_search: true, hvis søgning fandt noget: de resultater, modellen fik, hver med index, title og url. [1] i svaret er posten med index 1. I en stream kommer det med message_delta-hændelsen. | shannon-1.6-*, shannon-2-*, Shannon 3-familien |
usage.cache_read_input_tokens | integer | cache_read_input_tokens er den del af prompten, der er læst fra cachen; input_tokens er resten. cache_creation_input_tokens er altid 0. | Hostede open-weight-modeller |
Svarblokke
| Blok | Beskrivelse |
|---|---|
{"type": "thinking", "thinking": "…"} | Modellens reasoning. Der er intet signature-medlem. |
{"type": "text", "text": "…"} | Svarteksten. Den kan være tom, når svaret er et værktøjskald. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Et værktøjskald. input er et JSON-objekt. Send resultatet tilbage med samme id. |
stop_reason
| stop_reason | Beskrivelse | Sendt af |
|---|---|---|
end_turn | Modellen afsluttede sit svar, eller en af dine stop_sequences forekom. | Alle modeller |
tool_use | Svaret indeholder ét eller flere værktøjskald. | Alle modeller |
max_tokens | Svaret blev afbrudt ved outputgrænsen. | Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, i streams |
Streaming
Sæt stream til true for server-sent events. Hver ramme har en event:-linje med hændelsens navn og en data:-linje med et JSON-objekt, der gentager navnet i type. Stream-hjælperne i Anthropic SDK læser disse hændelser for 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ændelserne i den rækkefølge, de kommer:
| Hændelse | Data | Hvornår |
|---|---|---|
message_start | message | Altid først. message indeholder id, rolle, model, et tomt content og en usage, der starter ved nul. |
content_block_start | index, content_block | En blok åbnes. content_block er en tom text- eller thinking-blok eller en tool_use-blok med sit id og name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | Et stykke af reasoning, for en thinking-blok. |
content_block_delta | index, delta {"type": "text_delta", "text"} | Et stykke af svaret, for en text-blok. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Argumenterne til et værktøjskald, komplette i én delta, for en tool_use-blok. |
content_block_stop | index | Blokken med dette index er færdig. |
message_delta | delta {stop_reason, stop_sequence}, usage | Svarets afslutning: delta.stop_reason og anmodningens usage. |
message_stop | Altid sidst. |
Blokke nummereres med index i den rækkefølge, de åbnes, og én blok er færdig, før den næste åbnes. Læs hver blok efter dens type, ikke efter dens nummer: en stream kan først åbne en tom text-blok, derefter thinking-blokken og levere svaret i en senere 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
| Sendt af | Beskrivelse |
|---|---|
Shannon 3-familien, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | En ping-hændelse med dataene {"type": "ping"} hvert 15. sekund. |
| Hostede open-weight-modeller | En kommentarlinje : keepalive hvert 15. sekund, mens modellen arbejder. |
En stream, der fejler
En fejl, efter at streamen er startet, er en error-hændelse med samme body som et fejlsvar: {"type": "error", "error": {"type", "message"}}. De afsluttende hændelser, message_delta og message_stop, følger stadig. Behandl svaret som mislykket, og send anmodningen igen.
Fejl
Fejl bruger Anthropics fejlindhold: type er error, og objektet error indeholder en type og en message. Tabellen viser, hvad dette endpoint oftest returnerer. Den fulde liste med, hvad der kan prøves igen, har sin egen side. Fejlhåndtering
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Type | Besked | Hvornår |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Der blev ikke sendt nogen API-nøgle, eller nøglen er ukendt eller tilbagekaldt. |
400 | invalid_request_error | unknown model: <id> | model er ikke et Shannon-model-id. |
400 | invalid_request_error | No user message provided | Shannon-niveauer: anmodningen har ingen brugertekst og ingen tools. |
400 | invalid_request_error | <id> does not accept image input | Et billede blev sendt til en hostet open-weight-model uden billedinput. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages mangler, eller et felt har den forkerte JSON-type. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens er større end det, der er tilbage af din saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: mere end 120 anmodninger på ét minut på din konto. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: din plans Shannon Coder-kald for det aktuelle 4-timers vindue er brugt. |
500 | server_error | The model backend failed to answer. Please retry. | Modellen gav ikke noget svar. Send anmodningen igen. |
502 | api_error | The model backend failed to answer. Please retry. | Modellen gav ikke noget svar. Send anmodningen igen. |
Tælling af tokens
POST /v1/messages/count_tokens tager samme body som en beskedanmodning (model, system, messages, tools) og returnerer {"input_tokens": n}: antallet af input-tokens, som anmodningen ville blive afregnet for. Den tæller for de hostede open-weight-modeller, er gratis og tælles ikke med i 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} Tælling har sin egen side med plain-text-endpointet og grænserne. Tælling af tokens