Anthropic
POST /v1/messages na-anabata request n'usoro Anthropic Messages ma zaa n'otu usoro ahụ, streamed ma ọ bụ na streamed. Jiri ya na Anthropic SDK na tools e wuru na ya, dị ka Claude Code: setịpụ base URL, jiri Shannon API key gị ma kpọọ Shannon model id.
POST https://api.shannon-ai.com/v1/messages
Gbanwee Anthropic SDK ka ọ gaa Shannon base URL. SDK na-agbakwunye /v1/messages ma zipu key gị na header 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."}]
}' Azịza bụ ozi nke content ya bụ ndepụta blocks. Chọta blocks site na type ha: mgbe model chere echiche, block mbụ bụ thinking ma text na-abịa n'azụ ya.
{
"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 | Uru | Nkọwa |
|---|---|---|
x-api-key | YOUR_API_KEY | API key gị. A na-anabata Authorization: Bearer YOUR_API_KEY n'ọnọdụ ya. |
content-type | application/json | Achọrọ. |
anthropic-version | 2023-06-01 | A na-anabata ya, a chọghị ya. Anthropic SDK na-ezipụ 2023-06-01; azịza nwere otu usoro n'agbanyeghị uru ahụ. |
anthropic-beta | A na-anabata ya, a chọghị ya. | |
x-request-id | Nhọrọ. Id nke gị maka request ahụ. Ọ na-alọghachi n'azịza na-agbanwebeghị; na-enweghị ya, azịza nwere id nke mkpụrụedemede hexadecimal 12. |
Request fields
Naanị messages ka a chọrọ. Ogidi Ndị na-etinye ya na-akpọ aha model ndị field na-agbanwe azịza na ha. Hosted open-weight models bụ id iri na abụọ nke ndepụta model; ezinụlọ Shannon 3 bụ shannon-3, shannon-3-pro, shannon-3.1 na shannon-3.1-pro. Models & ọnụahịa
| Field | Ụdị | Default | Nkọwa | Ndị na-etinye ya |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Shannon model id sitere na ndepụta model. Zipu ya na request ọ bụla. Nhọrọ anaghị eche mkpụrụedemede nta ma ọ bụ nnukwu. Aha ọ bụla ọzọ na-eweghachi 400 unknown model, yabụ tool na-ezipụ aha model nke ya ga-ekwesị ka e setịpụ ya na Shannon id. | Model niile |
messages | array | Chọrọ. Mkparịta ụka, ozi kacha ochie buru ụzọ, nwere roles user na assistant. Lee Messages na content blocks n'okpuru. | Model niile | |
system | string | array | Ntụziaka maka model: string, ma ọ bụ array nke text blocks. Lee System prompt n'okpuru. | Hosted open-weight models, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
max_tokens | integer | 4096 | Oke elu nke azịza, na tokens. Nhọrọ n'endpoint a; Anthropic SDK na-ezipụ ya mgbe niile. A na-edozi uru dị n'èzí 1 ruo 65,536 ka ọ banye n'oke ahụ. Ọ bụkwa ọnụọgụ a na-ewepụta n'ime balance gị mgbe request na-aga. | Hosted open-weight models, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
stream | boolean | false | true na-ezipụ azịza dị ka server-sent events. Lee Streaming n'okpuru. | Model niile |
temperature | number | Sampling temperature. Na hosted open-weight models a na-edebe uru n'agbata 0 na 2. | Hosted open-weight models, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | Nucleus sampling. | Hosted open-weight models | |
stop_sequences | array | Ruo strings 4. Azịza na-akwụsị tupu nke mbụ pụtara. stop_reason na-anọgide end_turn. | Hosted open-weight models | |
tools | array | Tools model nwere ike ịkpọ, nke ọ bụla dị ka {"name", "description", "input_schema"}. Lee Tools n'okpuru. | Model niile | |
tool_choice | object | {"type": "auto"} na-ahapụ model ka ọ kpebie, {"type": "any"} na-eme ka ọ kpọọ tool, {"type": "tool", "name": "…"} na-eme ka ọ kpọọ tool ahụ. | Hosted open-weight models | |
thinking | object | Ole model na-eche tupu ọ zaa. Lee Thinking n'okpuru. | Hosted open-weight models | |
web_search | boolean | false | Mgbakwunye Shannon na usoro ahụ: true na-ahapụ model ka ọ chọọ n'ịntanetị tupu ọ zaa. | shannon-1.6-*, shannon-2-*, ezinụlọ Shannon 3 |
Na-enweghị max_tokens uru bụ 4,096, na 65,536 na shannon-coder-1.
A na-anabata metadata, top_k, service_tier na cache_control markers n'elu blocks ka koodu client dị adị na-agba n'enweghị mgbanwe. Ha anaghị agbanwe azịza; prompt caching na hosted open-weight models na-eme site n'onwe ya.
A na-arịọ azịza JSON nke schema site na response_format na Chat Completions na text.format na Responses. Mmepụta ahaziri
Request nwere system prompt na thinking
Request a na-eziga system prompt, thinking budget, temperature na stop sequence. Ọ na-eji hosted open-weight model, nke na-etinye ha niile.
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?"}]
}' Na hosted open-weight models usage na-akọ tokens e sitere na prompt cache gụọ dị iche na input tokens ndị ọzọ.
{
"usage": {
"input_tokens": 31,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"output_tokens": 62
}
} System prompt
system bụ string, ma ọ bụ array nke text blocks n'udi [{"type": "text", "text": "…"}]. A na-ejikọta text nke blocks site na ahịrị ọhụrụ.
Hosted open-weight models, shannon-1.6-lite, shannon-1.6-pro, shannon-2-lite, shannon-2-pro na shannon-coder-1 na-etinye ya. Na id nke ezinụlọ Shannon 3, tinye ntụziaka ndị ga-adịgide n'ime ozi user.
Ozi na content blocks
Ozi nwere role, user ma ọ bụ assistant, na content. content bụ string, ma ọ bụ array nke blocks.
| Block | Nkọwa | Dị na |
|---|---|---|
{"type": "text", "text": "…"} | Text. | Model niile |
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": "…"}}{"type": "image", "source": {"type": "url", "url": "…"}} | Foto n'ime ozi user, dị ka base64 ma ọ bụ site na URL. | Ezinụlọ Shannon 3, shannon-1.6-lite, shannon-1.6-pro, na hosted open-weight models ndị depụtara image input |
{"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Akwụkwọ (PDF, Word, PowerPoint ma ọ bụ Excel) n'ime ozi user, dị ka base64 ma ọ bụ site na URL. | Ezinụlọ Shannon 3 |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | N'ime ozi assistant: oku tool nke model mere n'azịza gara aga. | Model niile |
{"type": "tool_result", "tool_use_id": "toolu_…", "content": "…"} | N'ime ozi user: nsonaazụ oku ahụ. content bụ string, ma ọ bụ ndepụta nke text blocks. | Model niile |
Ị nwere ike iziga content nke azịza gara aga ka ọ dị: a na-agụ blocks text na tool_use, a na-agafe blocks thinking.
Na ọkwa Shannon, a na-agụ foto na akwụkwọ site na ozi user ikpeazụ. Nha na oke nwere peeji nke ha. Images na files
Thinking
Hosted open-weight models na-ahazi thinking ka ọ bụrụ reasoning effort. Na-enweghị field ahụ effort bụ high.
| Udi | budget_tokens | Mmetụta |
|---|---|---|
{"type": "disabled"} | Enweghị reasoning. Azịza enweghị thinking block. | |
{"type": "enabled", "budget_tokens": 2048} | ≤ 2,048 | Effort dị ala. |
{"type": "enabled", "budget_tokens": 8192} | ≤ 8,192 | Effort etiti. |
{"type": "enabled", "budget_tokens": 16000} | > 8,192 | Effort dị elu. |
Model na-eche echiche na-eweghachi reasoning ya dị ka block {"type": "thinking", "thinking": "…"} n'ihu text. Ọkwa Shannon na-eche echiche na-ezipụkwa ya.
A kọwara efforts n'peeji nke ha. Reasoning effort
Tools
Tool bụ function koodu gị na-agba. Kọwaa nke ọ bụla site na name, description na input_schema. Mgbe model chọrọ tool, azịza nwere tool_use block ma stop_reason bụ tool_use.
Nkọwa tool n'ime tools:
[
{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] content nke azịza na-akpọ ya:
[
{
"type": "text",
"text": ""
},
{
"type": "tool_use",
"id": "toolu_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"name": "get_weather",
"input": {
"city": "Paris"
}
}
] Gbaa tool ahụ, mgbe ahụ zipu request ọzọ nwere oku ahụ na tool_result block agbakwunyere na 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
| Udi | Mmetụta | Ndị na-etinye ya |
|---|---|---|
{"type": "auto"} | Model na-ekpebi ma ọ ga-akpọ tool. Nke a bụ default. | Model niile |
{"type": "any"} | Model ga-akpọ otu n'ime tools. | Hosted open-weight models |
{"type": "tool", "name": "…"} | Model ga-akpọ tool nke e kpọrọ aha. | Hosted open-weight models |
A na-agụ naanị tools nwere input_schema. Web search abụghị tool n'endpoint a: setịpụ field web_search.
A kọwara tool loop nke ọma n'peeji nke ya. Oku ọrụ
Azịza
| Field | Ụdị | Nkọwa | Onye zitere |
|---|---|---|---|
id | string | msg_ sochiri mkpụrụedemede hexadecimal 32. | Model niile |
type | string | Mgbe niile message. | Model niile |
role | string | Mgbe niile assistant. | Model niile |
model | string | Canonical id nke model zara. | Model niile |
content | array | Blocks nke azịza, n'usoro a: thinking mgbe model chere echiche, text, mgbe ahụ otu tool_use kwa oku tool. | Model niile |
stop_reason | string | Ihe mere azịza ji kwụsị. Lee uru ndị dị n'okpuru. | Model niile |
usage | object | input_tokens na output_tokens. | Model niile |
sources | array | Naanị na request nwere web_search: true nke search ya chọtara ihe: results e nyere model, nke ọ bụla nwere index, title na url. [1] n'azịza bụ entry nwere index 1. Na stream ọ na-abịa ya na event message_delta. | shannon-1.6-*, shannon-2-*, ezinụlọ Shannon 3 |
usage.cache_read_input_tokens | integer | cache_read_input_tokens bụ akụkụ nke prompt e sitere na cache gụọ; input_tokens bụ ndị fọdụrụ. cache_creation_input_tokens bụ 0 mgbe niile. | Hosted open-weight models |
Blocks nke azịza
| Block | Nkọwa |
|---|---|
{"type": "thinking", "thinking": "…"} | Reasoning nke model. Enweghị member signature. |
{"type": "text", "text": "…"} | Text nke azịza ahụ. Ọ nwere ike ịbụ ihe efu mgbe azịza bụ oku tool. |
{"type": "tool_use", "id": "toolu_…", "name": "…", "input": {…}} | Oku tool. input bụ JSON object. Zighachi nsonaazụ ya site na otu id. |
stop_reason
| stop_reason | Nkọwa | Onye zitere |
|---|---|---|
end_turn | Model mechiri azịza ya, ma ọ bụ otu n'ime stop_sequences gị pụtara. | Model niile |
tool_use | Azịza nwere otu oku tool ma ọ bụ karịa. | Model niile |
max_tokens | E bipụrụ azịza ahụ na oke output. | Ezinụlọ Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1, n'ime streams |
Streaming
Setịpụ stream na true maka server-sent events. Frame ọ bụla nwere ahịrị event: nwere aha event na ahịrị data: nwere JSON object na-emeghachi aha ahụ na type. Stream helpers nke Anthropic SDK na-agụ events ndị a maka gị:
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."}]
}' Events ndị ahụ, n'usoro ha si abịa:
| Event | Data | Mgbe |
|---|---|---|
message_start | message | Mgbe niile bụ nke mbụ. message nwere id, role, model, content efu na usage malitere na efu. |
content_block_start | index, content_block | Block na-emeghe. content_block bụ text ma ọ bụ thinking block efu, ma ọ bụ tool_use block nwere id na name ya. |
content_block_delta | index, delta {"type": "thinking_delta", "thinking"} | Otu akụkụ nke reasoning, maka thinking block. |
content_block_delta | index, delta {"type": "text_delta", "text"} | Otu akụkụ nke azịza, maka text block. |
content_block_delta | index, delta {"type": "input_json_delta", "partial_json"} | Arguments nke oku tool, zuru ezu n'otu delta, maka tool_use block. |
content_block_stop | index | Block nwere index a zuru ezu. |
message_delta | delta {stop_reason, stop_sequence}, usage | Ọgwụgwụ azịza: delta.stop_reason, na usage nke request. |
message_stop | Mgbe niile bụ nke ikpeazụ. |
A na-edepụta blocks site na index n'usoro ha si meghee, ma otu block zuru ezu tupu nke ọzọ emeghee. Gụọ block ọ bụla site na ụdị ya, ọ bụghị site na nọmba ya: stream nwere ike imeghe text block efu buru ụzọ, mgbe ahụ thinking block, ma weta azịza n'ime text block nke dị n'azụ.
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
| Onye zitere | Nkọwa |
|---|---|
Ezinụlọ Shannon 3, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | ping event nwere data {"type": "ping"}, kwa sekọnd 15. |
| Hosted open-weight models | Ahịrị nkọwa : keepalive, kwa sekọnd 15 mgbe model na-arụ ọrụ. |
Stream na-ada
Ọdịda mgbe stream malitechara bụ error event nwere otu body dị ka error reply: {"type": "error", "error": {"type", "message"}}. Events mmechi, message_delta na message_stop, ka na-eso. Lee azịza ahụ dị ka nke dara ma zipu request ahụ ọzọ.
Njehie
Njehie na-eji Anthropic error body: type bụ error, ma error object nwere type na message. Tebụl a depụtara ihe endpoint a na-eweghachi n'ọtụtụ oge. Ndepụta zuru ezu, na ihe a ga-anwa ọzọ, nwere peeji nke ya. Njikwa njehie
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Ụdị | Ozi | Mgbe |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Ezipụghị API key, ma ọ bụ key ahụ amaghị ama ma ọ bụ akagbuola ya. |
400 | invalid_request_error | unknown model: <id> | model abụghị Shannon model id. |
400 | invalid_request_error | No user message provided | Ọkwa Shannon: request enweghị user text na enweghị tools. |
400 | invalid_request_error | <id> does not accept image input | Ezigara foto na hosted open-weight model na-enweghị image input. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages na-efu, ma ọ bụ field nwere JSON type ezighi ezi. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens karịrị ihe fọdụrụ na balance gị. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: karịa request 120 n'ime otu nkeji n'akaụntụ gị. |
429 | rate_limit_error | Shannon Coder call quota reached. Upgrade your plan at shannon-ai.com/plan | shannon-coder-1: eriela oku Shannon Coder nke plan gị maka windo awa 4 nke ugbu a. |
500 | server_error | The model backend failed to answer. Please retry. | Model emepụtaghị azịza. Zipu request ahụ ọzọ. |
502 | api_error | The model backend failed to answer. Please retry. | Model emepụtaghị azịza. Zipu request ahụ ọzọ. |
Ịgụ tokens
POST /v1/messages/count_tokens na-anabata otu body dị ka request ozi (model, system, messages, tools) ma weghachi {"input_tokens": n}: ọnụọgụ input tokens a ga-akwụ ụgwọ maka request ahụ. Ọ na-agụ maka hosted open-weight models, ọ bụ n'efu, flood protection anaghịkwa agụ ya.
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} Ịgụ nwere peeji nke ya, nwere plain-text endpoint na oke. Ịgụ tokens