Tokens একটা Anthropic-compatible Messages API দেয়, তাই official Anthropic SDK-গুলো মাত্র একটা বদলেই চলে: base URL। আপনার code যদি আগে থেকেই messages.create দিয়ে লেখা থাকে, সেটা যেমন আছে তেমনই রাখুন। শুধু model string বদলালেই provider বদলে যাবে।
Anthropic SDK-র base URL: https://tokens.bd#
Base URL দিন https://tokens.bd, /v1 ছাড়া। SDK নিজেই শেষে /v1/messages জুড়ে নেয়। https://tokens.bd/v1 দিলে request চলে যাবে /v1/v1/messages-এ, আর 404 দিয়ে fail করবে।
| Setting | Value |
|---|---|
| Base URL | https://tokens.bd |
| API key | আপনার Tokens key (tok_live_...) |
| Model | /models থেকে যেকোনো ID, যেমন deepseek/deepseek-v4.1-flash |
SDK key পাঠায় x-api-key হিসেবে। Tokens সেটাও নেয়, Authorization: Bearer-ও নেয়।
কোন কোন model চলবে#
Tokens catalog-এর যেকোনো model চলবে, শুধু Claude-এর নয়। অন্য provider-এর model-এর জন্য Anthropic format-এ request পাঠালে gateway request আর response দুটোই অনুবাদ করে দেয়। ফলে আপনার code দুই ক্ষেত্রেই সাধারণ Anthropic Message object আর stream event পায়। আপনার key দিয়ে কোন ID চলবে তা দেখতে GET https://tokens.bd/v1/models call করুন (cURL পেজ দেখুন)।
সাধারণ text-এর বাইরের সুবিধাগুলো নির্ভর করে আপনি কোন model বেছেছেন তার ওপর। Tool use, extended thinking আর prompt caching শুধু সেখানেই চলে যেখানে ভেতরের model ও provider সেটা সাপোর্ট করে। এগুলোর কোনোটার ওপর ভরসা করার আগে /models-এ model-এর পেজটা দেখে নিন।
Python#
pip install --upgrade anthropic
export TOKENS_API_KEY="tok_live_your_key"import os
import anthropic
client = anthropic.Anthropic(
base_url="https://tokens.bd",
api_key=os.environ["TOKENS_API_KEY"],
)
message = client.messages.create(
model="deepseek/deepseek-v4.1-flash",
max_tokens=512,
system="You are a concise senior engineer.",
messages=[{"role": "user", "content": "When is a B-tree index the wrong choice?"}],
)
for block in message.content:
if block.type == "text":
print(block.text)
print(message.usage)Anthropic-এর সরাসরি API-র মতোই Messages API-তে max_tokens দেওয়া বাধ্যতামূলক।
Python SDK দিয়ে stream করুন#
with client.messages.stream(
model="deepseek/deepseek-v4.1-flash",
max_tokens=1024,
messages=[{"role": "user", "content": "Write a bash one-liner that finds the 10 largest files."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
print("\n", final.usage)Async client হলো anthropic.AsyncAnthropic, argument একই। সেক্ষেত্রে async with client.messages.stream(...) আর async for text in stream.text_stream ব্যবহার করুন।
TypeScript#
Anthropic TypeScript SDK চালাতে Node.js 20 বা তার পরের version লাগে।
npm install @anthropic-ai/sdkimport Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://tokens.bd",
apiKey: process.env.TOKENS_API_KEY,
});
const message = await client.messages.create({
model: "deepseek/deepseek-v4.1-flash",
max_tokens: 512,
messages: [{ role: "user", content: "Explain optimistic locking in three sentences." }],
});
for (const block of message.content) {
if (block.type === "text") console.log(block.text);
}TypeScript SDK দিয়ে stream করুন#
const stream = client.messages
.stream({
model: "deepseek/deepseek-v4.1-flash",
max_tokens: 1024,
messages: [{ role: "user", content: "Draft a short commit message for a null-check fix." }],
})
.on("text", (text) => process.stdout.write(text));
const final = await stream.finalMessage();
console.log("\n", final.usage);শুধু raw event দরকার হলে আর memory কম খরচ করতে চাইলে client.messages.create({ ..., stream: true }) ব্যবহার করুন। এটা একটা async iterable ফেরত দেয়।
Code-এর বদলে environment variable#
Argument ছাড়া client বানালে দুটো SDK-ই ANTHROPIC_API_KEY আর ANTHROPIC_BASE_URL পড়ে নেয়:
export ANTHROPIC_BASE_URL="https://tokens.bd"
export ANTHROPIC_API_KEY="$TOKENS_API_KEY"যে shell-এ Claude Code বা অন্য Anthropic-based tool-ও চালান, সেখানে এটা করতে সাবধান থাকবেন, কারণ ওরাও একই variable পড়ে। Claude Code-এর নিজস্ব setup আছে, যেখানে ~/.claude/settings.json-এ ANTHROPIC_AUTH_TOKEN দিতে হয়। সেটা আছে Claude Code পেজে।
Error আর retry#
SDK-গুলো তাদের চেনা APIError subclass-ই raise করে (401-এর জন্য AuthenticationError, 403-এর জন্য PermissionDeniedError, 429-এর জন্য RateLimitError, ইত্যাদি)। /v1/messages-এর প্রতিটি error Anthropic-এর গঠনে আসে: {"type": "error", "error": {"type", "message", "code"}}। Tokens নিজে যে error দেয় (ভুল key, credit, plan-এর সীমা), তাতেও error.code থাকে। তাই insufficient_credits আর window_exhausted আলাদা করতে চাইলে সেটা পড়ুন।
try:
client.messages.create(model="deepseek/deepseek-v4.1-flash", max_tokens=64,
messages=[{"role": "user", "content": "hi"}])
except anthropic.APIStatusError as e:
print(e.status_code, e.response.headers.get("x-tokens-request-id"), e.body)Support ticket-এ x-tokens-request-id header-এর মানটা অবশ্যই দিন। দুটো SDK-ই default-এ 429 আর 5xx-এ দুইবার retry করে। এখানে সেটা ঠিকই আছে, তবে 429 window_exhausted-এ Retry-After-এর সময় পার না হওয়া পর্যন্ত retry সফল হবে না। Code আর তার সমাধান আছে Errors পেজে, আর request-এর format আছে Messages পেজে।