Anthropic
POST /v1/messages neem 'n versoek in die Anthropic Messages-formaat en antwoord in dieselfde formaat, gestroom of nie. Gebruik dit met die Anthropic SDK en met gereedskap daarop gebou, soos Claude Code: stel die basis-URL, gebruik jou Shannon API-sleutel en noem 'n Shannon-model-id.
POST https://api.shannon-ai.com/v1/messages
Rig die Anthropic SDK na die Shannon-basis-URL. Die SDK voeg /v1/messages by en stuur jou sleutel in die 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."}]
}' Die antwoord is 'n boodskap waarvan die content 'n lys blokke is. Vind die blokke volgens hul type: wanneer die model geredeneer het, is die eerste blok thinking en die teks kom 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 | Beskrywing |
|---|---|---|
x-api-key | YOUR_API_KEY | Jou API-sleutel. Authorization: Bearer YOUR_API_KEY word in sy plek aanvaar. |
content-type | application/json | Verpligtend. |
anthropic-version | 2023-06-01 | Aanvaar, nie verpligtend nie. Die Anthropic SDK stuur 2023-06-01; die antwoord het dieselfde formaat ongeag die waarde. |
anthropic-beta | Aanvaar, nie verpligtend nie. | |
x-request-id | Opsioneel. Jou eie id vir die versoek. Dit kom ongewysig terug op die antwoord; daarsonder dra die antwoord 'n id van 12 heksadesimale karakters. |
Versoekvelde
Slegs messages is verpligtend. Die kolom Toegepas deur noem die modelle waarop 'n veld die antwoord verander. Die gehuisveste oopgewig-modelle is die twaalf id's van die modellys; die Shannon 3-familie is shannon-3, shannon-3-pro, shannon-3.1 en shannon-3.1-pro. Modelle en pryse
| Veld | Tipe | Verstek | Beskrywing | Toegepas deur |
|---|---|---|---|---|
model | string | shannon-1.6-lite | 'n Shannon-model-id uit die modellys. Stuur dit met elke versoek. Ooreenstemming is nie hooflettergevoelig nie. Enige ander naam gee 400 unknown model terug, so 'n hulpmiddel wat sy eie modelname stuur, moet op 'n Shannon-id gestel word. | Alle modelle |
messages | array | Verpligtend. Die gesprek, oudste boodskap eerste, met die rolle user en assistant. Sien Boodskappe en inhoudblokke hieronder. | Alle modelle | |
system | string | array | Instruksies vir die model: 'n string, of 'n skikking van teksblokke. Sien Stelselprompt hieronder. | Gehuisveste oopgewig-modelle, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Boonste limiet van die antwoord, in tokens. Opsioneel op hierdie eindpunt; die Anthropic SDK stuur dit altyd. 'n Waarde buite 1 tot 65,536 word in daardie reeks geskuif. Dit is ook die hoeveelheid wat van jou balans opsy gesit word terwyl die versoek loop. | Gehuisveste oopgewig-modelle, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true stuur die antwoord as server-sent events. Sien Streaming hieronder. | Alle modelle |
temperature | number | Steekproef-temperatuur. Op die gehuisveste oopgewig-modelle word waardes tussen 0 en 2 gehou. | Gehuisveste oopgewig-modelle, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus-steekproefneming. | Gehuisveste oopgewig-modelle | |
stop_sequences | array | Tot 4 stringe. Die antwoord eindig voor die eerste een wat verskyn. stop_reason bly end_turn. | Gehuisveste oopgewig-modelle | |
tools | array | Die gereedskap wat die model mag oproep, elk as {"name", "description", "input_schema"}. Sien Gereedskap hieronder. | Alle modelle | |
tool_choice | object | {"type": "auto"} laat die model besluit, {"type": "any"} laat dit 'n gereedskap oproep, {"type": "tool", "name": "…"} laat dit daardie gereedskap oproep. | Gehuisveste oopgewig-modelle | |
thinking | object | Hoeveel die model redeneer voor dit antwoord. Sien Thinking hieronder. | Gehuisveste oopgewig-modelle | |
web_search | boolean | false | 'n Shannon-toevoeging tot die formaat: true laat die model die web deursoek voor dit antwoord. | shannon-1.6-*, shannon-2-*, Shannon 3-familie |
Sonder max_tokens is die waarde 4,096, en 65,536 op shannon-coder-1.
metadata, top_k, service_tier en cache_control-merkers op blokke word aanvaar sodat bestaande kliëntkode ongewysig loop. Hulle verander nie die antwoord nie; prompt caching op die gehuisveste oopgewig-modelle is outomaties.
'n JSON-antwoord volgens 'n skema word gevra met response_format op Chat Completions en met text.format op Responses. Gestruktureerde uitvoer
'n Versoek met 'n stelselprompt en thinking
Hierdie versoek stuur 'n stelselprompt, 'n thinking-begroting, 'n temperatuur en 'n stopvolgorde. Dit gebruik 'n gehuisveste oopgewig-model, wat almal toepas.
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 die gehuisveste oopgewig-modelle rapporteer usage die tokens wat uit die prompt-kas gelees is apart van die ander insettokens.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} Stelselprompt
system is 'n string, of 'n skikking van teksblokke in die vorm [{"type": "text", "text": "…"}]. Die tekste van die blokke word met 'n reëlbreuk verbind.
Dit word toegepas deur die gehuisveste oopgewig-modelle, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro en shannon-coder-1. Met 'n Shannon 3-familie-id, sit instruksies wat moet geld in die gebruikersboodskap.
Boodskappe en inhoudblokke
'n Boodskap het 'n role, user of assistant, en 'n content. content is 'n string, of 'n skikking van blokke.
| Blok | Beskrywing | Beskikbaar op |
|---|---|---|
{"type": "text", "text": "…"} | Teks. | Alle modelle |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | 'n Beeld in 'n user-boodskap, as base64 of per URL. | Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro, en die gehuisveste oopgewig-modelle wat beeldinset lys |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | 'n Dokument (PDF, Word, PowerPoint of Excel) in 'n user-boodskap, as base64 of per URL. | Shannon 3-familie |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | In 'n assistant-boodskap: 'n gereedskapoproep wat die model in 'n vorige antwoord gemaak het. | Alle modelle |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | In 'n user-boodskap: die resultaat van daardie oproep. content is 'n string, of 'n lys teksblokke. | Alle modelle |
Jy kan die content van 'n vorige antwoord ongewysig terugstuur: text- en tool_use-blokke word gelees, thinking-blokke word oorgeslaan.
Op die Shannon-vlakke word beelde en dokumente uit die laaste user-boodskap gelees. Groottes en limiete het hul eie bladsy. Beelde en lêers
Thinking
Die gehuisveste oopgewig-modelle koppel thinking aan 'n redeneringspoging. Sonder die veld is die poging hoog.
| Vorm | budget_tokens | Effek |
|---|---|---|
{"type": "disabled"} | Geen redenering nie. Die antwoord het geen thinking-blok nie. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Lae poging. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Medium poging. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Hoë poging. |
'n Model wat redeneer, gee sy redenering terug as 'n blok {"type": "thinking", "thinking": "…"} voor die teks. Die Shannon-vlakke wat redeneer, stuur dit ook.
Die pogings word op hul eie bladsy beskryf. Redeneringspoging
Gereedskap
'n Gereedskap is 'n funksie wat jou kode uitvoer. Beskryf elkeen met 'n name, 'n description en 'n input_schema. Wanneer die model 'n gereedskap wil hê, bevat die antwoord 'n tool_use-blok en stop_reason is tool_use.
'n Gereedskapdefinisie in tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] Die content van 'n antwoord wat dit oproep:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Voer die gereedskap uit, stuur dan die versoek weer met die oproep en 'n tool_result-blok bygevoeg by 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 | Effek | Toegepas deur |
|---|---|---|
{"type": "auto"} | Die model besluit of dit 'n gereedskap oproep. Dit is die verstek. | Alle modelle |
{"type": "any"} | Die model moet een van die gereedskap oproep. | Gehuisveste oopgewig-modelle |
{"type": "tool", "name": "…"} | Die model moet die genoemde gereedskap oproep. | Gehuisveste oopgewig-modelle |
Slegs gereedskap met 'n input_schema word gelees. Websoektog is nie 'n gereedskap op hierdie eindpunt nie: stel die web_search-veld.
Die gereedskaplus word volledig op sy eie bladsy beskryf. Funksie-oproepe
Die antwoord
| Veld | Tipe | Beskrywing | Gestuur deur |
|---|---|---|---|
id | string | msg_ gevolg deur 32 heksadesimale karakters. | Alle modelle |
type | string | Altyd message. | Alle modelle |
role | string | Altyd assistant. | Alle modelle |
model | string | Die kanonieke id van die model wat geantwoord het. | Alle modelle |
content | array | Die blokke van die antwoord, in hierdie volgorde: thinking wanneer die model geredeneer het, text, dan een tool_use per gereedskapoproep. | Alle modelle |
stop_reason | string | Hoekom die antwoord geëindig het. Sien die waardes hieronder. | Alle modelle |
usage | object | input_tokens en output_tokens. | Alle modelle |
sources | array | Net op 'n versoek met web_search: true waarvan die soektog iets gevind het: die resultate wat aan die model gegee is, elk met index, title en url. [1] in die antwoord is die inskrywing met index 1. In 'n stroom kom dit saam met die message_delta-gebeurtenis. | shannon-1.6-*, shannon-2-*, Shannon 3-familie |
usage.cache_read_input_tokens | integer | cache_read_input_tokens is die deel van die prompt wat uit die kas gelees is; input_tokens is die res. cache_creation_input_tokens is altyd 0. | Gehuisveste oopgewig-modelle |
Antwoordblokke
| Blok | Beskrywing |
|---|---|
{"type": "thinking", "thinking": "…"} | Die model se redenering. Daar is geen signature-lid nie. |
{"type": "text", "text": "…"} | Die antwoordteks. Dit kan leeg wees wanneer die antwoord 'n gereedskapoproep is. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | 'n Gereedskapoproep. input is 'n JSON-objek. Stuur die resultaat terug met dieselfde id. |
stop_reason
| stop_reason | Beskrywing | Gestuur deur |
|---|---|---|
end_turn | Die model het sy antwoord voltooi, of een van jou stop_sequences het verskyn. | Alle modelle |
tool_use | Die antwoord bevat een of meer gereedskapoproepe. | Alle modelle |
max_tokens | Die antwoord is by die uitvoerlimiet afgesny. | Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, in strome |
Streaming
Stel stream op true vir server-sent events. Elke raam het 'n event:-reël met die naam van die gebeurtenis en 'n data:-reël met 'n JSON-objek wat die naam in type herhaal. Die stroomhulpmiddels van die Anthropic SDK lees hierdie gebeurtenisse vir jou:
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."}]
}' Die gebeurtenisse, in die volgorde waarin hulle aankom:
| Gebeurtenis | Data | Wanneer |
|---|---|---|
message_start | message | Altyd eerste. message bevat die id, die rol, die model, 'n leë content en 'n usage wat by nul begin. |
content_block_start | index, content_block | 'n Blok maak oop. content_block is 'n leë text- of thinking-blok, of 'n tool_use-blok met sy id en name. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | 'n Stuk van die redenering, vir 'n thinking-blok. |
content_block_delta | index, delta {"type": "text_delta", "text"} | 'n Stuk van die antwoord, vir 'n text-blok. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Die argumente van 'n gereedskapoproep, volledig in een delta, vir 'n tool_use-blok. |
content_block_stop | index | Die blok met hierdie index is voltooi. |
message_delta | delta {stop_reason, stop_sequence}, usage | Die einde van die antwoord: delta.stop_reason, en die usage van die versoek. |
message_stop | Altyd laaste. |
Blokke word volgens index genommer in die volgorde waarin hulle oopmaak, en een blok is voltooi voor die volgende oopmaak. Lees elke blok volgens sy tipe, nie volgens sy nommer nie: 'n stroom kan eers 'n leë text-blok oopmaak, dan die thinking-blok, en die antwoord in 'n latere text-blok lewer.
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
| Gestuur deur | Beskrywing |
|---|---|
Shannon 3-familie, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | 'n ping-gebeurtenis met die data {"type": "ping"}, elke 15 sekondes. |
| Gehuisveste oopgewig-modelle | 'n Kommentaarreël : keepalive, elke 15 sekondes terwyl die model werk. |
'n Stroom wat misluk
'n Mislukking nadat die stroom begin het, is 'n error-gebeurtenis met dieselfde liggaam as 'n foutantwoord: {"type": "error", "error": {"type", "message"}}. Die sluitingsgebeurtenisse, message_delta en message_stop, volg steeds. Beskou die antwoord as misluk en stuur die versoek weer.
Foute
Foute gebruik die Anthropic-foutliggaam: type is error, en die error-objek bevat 'n type en 'n message. Die tabel lys wat hierdie eindpunt die meeste teruggee. Die volledige lys, met wat om weer te probeer, het sy eie bladsy. Fouthantering
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Tipe | Boodskap | Wanneer |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Geen API-sleutel is gestuur nie, of die sleutel is onbekend of herroep. |
400 | invalid_request_error | unknown model: <id> | model is nie 'n Shannon-model-id nie. |
400 | invalid_request_error | No user message provided | Shannon-vlakke: die versoek het geen gebruikersteks en geen tools nie. |
400 | invalid_request_error | <id> does not accept image input | 'n Beeld is na 'n gehuisveste oopgewig-model gestuur wat nie beeldinset het nie. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages ontbreek, of 'n veld het die verkeerde JSON-tipe. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens is groter as wat van jou balans oor is. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Vloedbeskerming: meer as 120 versoeke in een minuut op jou rekening. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: jou plan se Shannon Coder-oproepe vir die huidige 4-uur-venster is opgebruik. |
500 | server_error | The model backend failed to answer. Please retry. | Die model het nie 'n antwoord gelewer nie. Stuur die versoek weer. |
502 | api_error | The model backend failed to answer. Please retry. | Die model het nie 'n antwoord gelewer nie. Stuur die versoek weer. |
Tokens tel
POST /v1/messages/count_tokens neem dieselfde liggaam as 'n boodskapversoek (model, system, messages, tools) en gee {"input_tokens": n} terug: die aantal insettokens wat vir die versoek gehef sou word. Dit tel vir die gehuisveste oopgewig-modelle, dit is gratis en dit word nie deur vloedbeskerming getel nie.
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} Tel het sy eie bladsy, met die platteks-eindpunt en die limiete. Tokens tel