আপনার app যদি Anthropic Messages API call করে, Tokens-এ আসতে তিনটা জিনিস বদলাতে হয়: base URL, API key আর model id। Tokens Anthropic-এর format-এই POST /v1/messages, streaming আর POST /v1/messages/count_tokens চালায়, তাই Anthropic SDK আর আপনার message-handling কোড যেমন আছে তেমনই চলবে। সাবধানে দেখতে হবে শুধু Anthropic-only feature-গুলো (prompt caching, thinking, citations, Files ও Batches API)। এগুলো কাজ করবে কি না, তা নির্ভর করে আপনার বেছে নেওয়া model-টা কোন provider চালায় তার ওপর।
কী বদলায়, কী একই থাকে#
| Setting | Anthropic | Tokens | কোথায় সেট করবেন |
|---|---|---|---|
| Base URL | https://api.anthropic.com (SDK-র default) | https://tokens.bd, /v1 ছাড়া | base_url (Python) বা baseURL (Node.js), অথবা ANTHROPIC_BASE_URL |
| API key | Anthropic-এর key | API keys থেকে নেওয়া tok_live_... | api_key বা apiKey, অথবা ANTHROPIC_API_KEY |
| Model id | Anthropic-এর id | /models থেকে provider/model ধাঁচের alias | প্রতিটা request-এর model field-এ |
anthropic-workspace-id | একটা workspace বেছে নেয় | ব্যবহার হয় না। সরিয়ে দিন। | Client option-এ |
SDK নিজেই /v1/messages জুড়ে নেয়, তাই base URL হবে শুধু host। এর জায়গায় https://tokens.bd/v1 বসালে request চলে যাবে /v1/v1/messages-এ, আর 404 আসবে। তবে curl দিয়ে নিজে endpoint call করলে কথা আলাদা: তখন পুরো URL হলো https://tokens.bd/v1/messages।
Anthropic-এর Python আর TypeScript SDK কোডে কিছু না দিলে ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN আর ANTHROPIC_BASE_URL পড়ে নেয় (SDK-র source দেখে নেওয়া, October 2026)। যে shell-এ Claude Code বা একই variable পড়ে এমন অন্য tool-ও চালান, সেখানে সাবধান থাকুন। দেখুন Anthropic SDK পেজ আর Claude Code।
যা একই থাকে:
POST /v1/messages-এর request আর response-এর গড়ন:system,messages, content block,max_tokens(এখনও বাধ্যতামূলক),tools,tool_choice,stop_sequencesআরusageobject।- Server-Sent Events streaming, event-এর নামও একই (
message_start,content_block_delta,message_stop)।client.messages.stream(...)চলে। - Authentication। key যায়
x-api-key-তে (SDK এটাই পাঠায়) অথবাAuthorization: Bearer-এ, তাই SDK-র auth-এ হাত দিতে হবে না। দুটো একসাথে এলে Bearer header জেতে। anthropic-versionheader। এটা provider-এর কাছে forward হয়, আর আপনি না পাঠালে default2023-06-01ধরা হয়।/v1/messages-এর error body Anthropic-এর shape-এই আসে, তাই SDK একই exception class তোলে।
আগে আর পরে#
import os
import anthropic
-client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
+client = anthropic.Anthropic(
+ base_url="https://tokens.bd",
+ api_key=os.environ["TOKENS_API_KEY"],
+)
message = client.messages.create(
- model="your-claude-model",
+ model="deepseek/deepseek-v4.1-flash",
max_tokens=512,
messages=[{"role": "user", "content": "Explain idempotency keys in two sentences."}],
)
print(message.content[0].text) import Anthropic from "@anthropic-ai/sdk";
-const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
+const client = new Anthropic({
+ baseURL: "https://tokens.bd",
+ apiKey: process.env.TOKENS_API_KEY,
+});
const message = await client.messages.create({
- model: "your-claude-model",
+ model: "deepseek/deepseek-v4.1-flash",
max_tokens: 512,
messages: [{ role: "user", content: "Explain idempotency keys in two sentences." }],
});
console.log(message.content[0].text);-curl https://api.anthropic.com/v1/messages \
- -H "x-api-key: $ANTHROPIC_API_KEY" \
+curl https://tokens.bd/v1/messages \
+ -H "x-api-key: $TOKENS_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
- "model": "your-claude-model",
+ "model": "deepseek/deepseek-v4.1-flash",
"max_tokens": 512,
"messages": [{"role": "user", "content": "Explain idempotency keys in two sentences."}]
}'Model id বেছে নিন#
Anthropic-এর id আর Tokens-এর id আলাদা দুটো তালিকা। Tokens-এর id হলো provider/model ধাঁচের alias, আর সেটা provider-এর নিজের id-র সঙ্গে সবসময় মেলে না। তালিকা Anthropic SDK-ই দেখিয়ে দেবে, কারণ request-এ anthropic-version থাকলে GET /v1/models Anthropic-এর format-এ উত্তর দেয়:
for m in client.models.list():
print(m.id, m.display_name)curl-এ এই shape পেতে anthropic-version পাঠান। শুধু Authorization: Bearer থাকলে OpenAI-র list shape আসে। দুই ক্ষেত্রেই তালিকায় থাকে কেবল সেই model, যা এই key দিয়ে call করা যায়। তাই allowed-models তালিকা দেওয়া key, বা plan অথবা Wallet ব্যালান্স নেই এমন অ্যাকাউন্ট কম model দেখবে।
Anthropic format-এ অন্য maker-এর model-ও চলে, শুধু Claude নয়। এটা সুবিধা, কিন্তু একই সঙ্গে model বদলও: উত্তর, tool-call-এর আচরণ আর token count আলাদা হবে। দাম, context window আর capability আছে /models-এ। কোনটা নেবেন বুঝতে সাহায্য করবে কোন model বেছে নেবেন।
কোন provider model চালায়, তার ওপর feature নির্ভর করে#
Tokens-এর প্রতিটা model এক বা একাধিক provider চালায়। Provider নিজেই Messages API বুঝলে আপনার request শুধু model id বদলে তার কাছে যায়, তাই thinking block, prompt caching আর anthropic-beta feature অক্ষত অবস্থায় ফেরত আসে। এমন provider থাকলে Tokens সেটাকেই পছন্দ করে। কোনো model শুধু OpenAI format-এর provider-এর কাছে থাকলে Tokens আপনার Messages request-কে chat completions request বানিয়ে পাঠায়, আর উত্তরটা আবার Messages format-এ ফিরিয়ে দেয়। কোন model-এর বেলায় কোনটা ঘটবে, catalog তা বলে না। তাই যে feature-এর ওপর নির্ভর করেন, সেটা বেছে নেওয়া model-এই পরীক্ষা করে নিন।
Translation যা বহন করে: system (text হিসেবে, সব জুড়ে একটা system message), messages-এর text, image, tool_use ও tool_result block, max_tokens, stop_sequences, temperature, top_p, stream, tools আর tool_choice। বাকি সব copy হয় না।
| Anthropic feature | Provider নিজে Messages বোঝে | Translate করা model |
|---|---|---|
| Streaming, client tools, images | সরাসরি যায় | চলে (translate হয়ে) |
Prompt caching (cache_control) | সরাসরি যায়। usage-এ provider যে cache count জানায় তা থাকে। | Marker বাদ পড়ে। Caching থাকলে সেটা provider-এর নিজস্ব, আপনার হাতে নয়। |
Extended বা adaptive thinking | সরাসরি যায় | Parameter বাদ পড়ে। thinking block আসে না। |
document block আর citations | সরাসরি যায় | Document block বাদ পড়ে। citation আসে না। |
| Anthropic-defined server tool (web search, code execution, computer use) | যেমন পাঠিয়েছেন তেমনই provider-এর কাছে যায়। Tokens এগুলো নিজে চালায় না, তাই চলবে কি না তা provider-এর ওপর। | প্রতিটা tools entry function tool হয়ে যায়, তাই এগুলো চলে না। |
anthropic-beta header | Forward হয় | কোনো প্রভাব নেই |
top_k, metadata | সরাসরি যায় | বাদ পড়ে |
Tokens-এর billing provider-এর দেওয়া usage-এর সংখ্যা পড়ে, আর catalog-এ cache-read rate থাকলে cached input সেই দামে ধরা হয়। Prompt caching টাকাও বাঁচায় শুধু সেই model-এ, যার provider এটা সাপোর্ট করে। দেখুন কোন model বেছে নেবেন আর Messages।
যে endpoint আর feature Tokens-এ নেই#
Tokens Anthropic-এর এই endpoint-গুলো চালায়: POST /v1/messages, POST /v1/messages/count_tokens আর GET /v1/models। বাকি যেকোনো path-এ 404 unsupported_endpoint আসে, Anthropic-এর error shape-এ (not_found_error)।
| Anthropic API | Tokens-এ |
|---|---|
Message Batches (/v1/messages/batches) | সাপোর্ট নেই। request এক এক করে পাঠান, অথবা নিজের queue চালান। |
Files API (/v1/files) | সাপোর্ট নেই। ছবি আর document inline base64 হিসেবে পাঠান, অথবা image URL দিন। content block-এ file_id থাকলে তা কাজ করতে পারে না। |
| Skills, Managed Agents, Agents, Sessions | সাপোর্ট নেই। |
GET /v1/models/{id} (models.retrieve) | সাপোর্ট নেই। তালিকা এনে filter করুন। |
Models API-র capabilities, lifecycle field | ফেরত আসে না। তালিকায় থাকে type, id, display_name আর created_at। pagination নেই: has_more সবসময় false। |
POST /v1/messages/count_tokens | সাপোর্ট করে। নিচে দেখুন। |
Token count করা#
POST /v1/messages/count_tokens একটা Messages request-এর body নেয় (max_tokens ছাড়া) আর ফেরত দেয় {"input_tokens": N}। এটা model চালায় না, আর এর জন্য কখনো বিল হয় না। যে provider model চালায় সে নিজে token গুনতে পারলে আপনি তার সঠিক সংখ্যা পান। না পারলে Tokens আন্দাজ করে (প্রতি token-এ প্রায় চার অক্ষর, সঙ্গে প্রতিটা ছবি আর প্রতিটা turn-এর জন্য একটা নির্দিষ্ট পরিমাণ) আর response header-এ x-tokens-estimated: true বসিয়ে দেয়। এই আন্দাজ শুধু budget ধরার কাজে লাগান।
যে তফাতগুলো ঝামেলা করতে পারে#
Rate limit#
Anthropic প্রতিটা model class-এর জন্য প্রতি মিনিটে request, input token আর output token আলাদা করে সীমা বাঁধে, আর anthropic-ratelimit-* header-এ তা জানায়। Tokens সীমা বাঁধে প্রতি অ্যাকাউন্টে প্রতি মিনিটে request (default 60, বা আপনার plan-এর মান) আর প্রতি অ্যাকাউন্টে একসাথে চলা request-এ (plan থাকলে 10, না থাকলে 3)। rate limit পেজে প্রতি মিনিটে token-এর কোনো সীমা লেখা নেই। বেশি key বানালে এর কোনোটাই বাড়ে না।
- 429-এ
retry-afterআসে সেকেন্ডে।anthropic-ratelimit-*header আসে না। Plan window-র অবস্থা দেখতেGET /v1/tokens/usagepoll করুন। - Anthropic-এর দুটো SDK-ই default-এ 429 আর 5xx দুবার retry করে আর
retry-afterমানে। কিন্তুwindow_exhaustedআরmodel_limit_reachedমানে কয়েক ঘণ্টা বা কয়েক দিনও হতে পারে, তাই এগুলো retry করে লাভ নেই। নিজে নিয়ন্ত্রণ চাইলেmax_retries=0(TypeScript-এmaxRetries: 0) দিন আর retry নিজে সামলান। কীভাবে, তা rate limit-এর backoff উদাহরণে দেখানো আছে। - অনেকগুলো stream একসাথে চালালে আগে
concurrency_limit-এ আটকাতে পারেন। কাজের parallelism কমিয়ে রাখুন।
Error#
/v1/messages-এর error Anthropic-এর shape-এ আসে: {"type": "error", "error": {"type", "message"}}। Tokens নিজে যে error তোলে (key, credit, plan ও limit-এর error), তাতে error.code যোগ হয় আর একটা request_id থাকে। কারণ আলাদা করতে error.code পড়ুন। পুরো তালিকা error পেজে।
| Situation | Anthropic | Tokens |
|---|---|---|
| Credit শেষ | 402 billing_error | 402 billing_error, code insufficient_credits, no_funding বা outstanding_debt |
| আপনার বেঁধে দেওয়া spend limit | 400 invalid_request_error, কিছু workspace-এ 429 | 403 permission_error, key-র cap-এর বেলায় code monthly_spend_cap_exceeded |
| Key-র সমস্যা | 401 authentication_error, 403 permission_error | একই type, সঙ্গে invalid_api_key, key_inactive, key_expired-এর মতো code |
| Rate limit | 429 rate_limit_error | 429 rate_limit_error, code rate_limited, concurrency_limit বা window_exhausted |
| Provider-এর গোলমাল | 500 api_error, 529 overloaded_error | 502 upstream_unreachable, 503 no_upstream_available, 504 upstream_timeout |
| Request বড় হয়ে গেলে | 32 MB-এ 413 request_too_large | 10 MB-এ 413 (code request_entity_too_large) |
SDK 403 retry করে না। আপনার কোড spend-limit-এর 400 বা 429 দেখে "থামো আর জানাও" করে থাকলে, Tokens-এর 403 monthly_spend_cap_exceeded-কেও একই আচরণে বেঁধে দিন।
Provider-এর নিজের error text বদলে একটা সাধারণ message বসে যায়। তাই কোনো parameter সাপোর্ট না করলে যে 400 আসে, সেটা বলে না কোন parameter। request-টা /models-এ model-এর পেজের সঙ্গে মিলিয়ে দেখুন।
Request id header আলাদা#
Anthropic request-id header ফেরত দেয়, আর SDK সেটা _request_id হিসেবে দেখায়। Tokens ওই header পাঠায় না, তাই _request_id হয় None। এর বদলে x-tokens-request-id পড়ুন:
raw = client.messages.with_raw_response.create(
model="deepseek/deepseek-v4.1-flash",
max_tokens=64,
messages=[{"role": "user", "content": "ping"}],
)
print(raw.headers.get("x-tokens-request-id"))
message = raw.parse()Provider-এর response header-এর মধ্যে Tokens শুধু একটা ছোট তালিকা এগিয়ে দেয় (content-type, cache-control আর retry-after), তাই anthropic-organization-id, anthropic-workspace-id আর rate-limit header-গুলো আপনার কাছে পৌঁছায় না। Support request খোঁজে x-tokens-request-id দিয়ে।
Output সীমা আর credit reservation#
Anthropic max_tokens-কে output-token rate limit-এর হিসাবে ধরে না, তাই অনেক app এটা বড় করে বসিয়ে রাখে। Tokens request এগিয়ে দেওয়ার আগে max_tokens ধরে সবচেয়ে খারাপ ক্ষেত্রের খরচটা আলাদা করে রেখে দেয় (reserve করে)। ব্যালান্স কম থাকলে বা key cap-এর কাছাকাছি থাকলে বড় max_tokens ফিরিয়ে দেওয়া হতে পারে। ব্যালান্স কম থাকলে Tokens এটা আপনার সামর্থ্য অনুযায়ী কমিয়েও দিতে পারে (16-এর নিচে কখনো নয়), আর তখন উত্তর শেষ হয় stop_reason: "max_tokens" নিয়ে। বিল হয় যত token সত্যিই লেগেছে তার, reservation-এর নয়। max_tokens ততটাই দিন, যতটা দরকার।
আরও কিছু তফাত#
- CORS নেই। Browser থেকে call fail করবে। Tokens-কে server থেকে call করুন।
- Body-র আকার। 10 MB পর্যন্ত, Anthropic-এ 32 MB। বড় base64 ছবি বা PDF এই হিসাবে পড়ে।
- Latency। Tokens একটা বাড়তি network hop যোগ করে।
- গোপনীয়তা। Tokens usage-এর metadata রাখে, prompt-এর লেখা নয়। তবে যে provider model চালায়, সে prompt দেখতে পায়। দেখুন নিরাপত্তা ও গোপনীয়তা।
- Billing। Tokens USD বা BDT-তে বিল করে, plan বা Wallet থেকে, প্রতিটা model-এর catalog-দামে। দেখুন plan, credit আর Wallet।
- Claude Code আর অন্য agent। Anthropic protocol-এ চলা agent-এর setup আলাদা। দেখুন Claude Code।
নিরাপদে বদলটা পরীক্ষা করুন#
- দ্বিতীয় একটা key বানান /dashboard/keys-এ, কম monthly spend cap আর allowed-models তালিকা দিয়ে, যাতে শুধু যে model-গুলো পরীক্ষা করছেন সেগুলোই থাকে। এ দুটোর কোনোটাই পরে edit করা যায় না। Cap-এর হিসাবে Tokens প্রতিটা request-এর সবচেয়ে খারাপ ক্ষেত্রের খরচ ধরে।
- Base URL, key আর model id configuration থেকে পড়ুন। Anthropic-এর দুটো SDK-ই এই তিনটা মান environment variable থেকে নিতে পারে, তাই code না বদলেই deploy করে switch করা যায়।
- কিছুদিন দুটোই চালান। log করা request আবার চালান (replay), অথবা live traffic-এর একটা অংশ mirror করে Tokens-এর উত্তর ফেলে দিন। তারপর তুলনা করুন:
| Check | কীভাবে |
|---|---|
| Quality | নিজের prompt বা eval চালান। আলাদা model মানে আলাদা উত্তর। |
| Prompt caching | একই prefix দিয়ে দ্বিতীয় call-এ usage.cache_read_input_tokens পড়ুন। শূন্য মানে এই model-এ cache hit হয়নি। |
| Thinking, citations, server tool | প্রতিটা ব্যবহার করে এমন একটা করে request ঠিক ওই model-এ পাঠান। দেখুন response-এ আশা করা block এসেছে কি না। |
| Tool call | tool_use-এর input আপনার schema-র সঙ্গে মেলে কি না। |
stop_reason | আগের চেয়ে বেশি max_tokens মানে এই model-এর জন্য সীমাটা বেশি কম। |
| একটা কাজ শেষ করার খরচ | Anthropic-এর invoice-এর সঙ্গে usage-এর খরচ মেলান। |
| Error | error.code ধরে গুনুন। |
- ধীরে ধীরে বাড়ান, feature flag বা শতাংশ দিয়ে। Production key-টা পুরোপুরি switch করার আগেই পছন্দের cap দিয়ে বানিয়ে নিন, কারণ rotation বা revoke সঙ্গে সঙ্গে কার্যকর হয়।
আগের অবস্থায় ফিরে যাওয়া#
- Tokens পুরো একটা billing cycle production traffic সামলানোর আগে পর্যন্ত আপনার Anthropic key আর billing চালু রাখুন।
- পুরোনো base URL (অথবা
ANTHROPIC_BASE_URLunset করে), key আর model id configuration-এ ফিরিয়ে দিন, তারপর deploy করুন বা flag উল্টে দিন। - যে Tokens key আর লাগবে না, সেটা /dashboard/keys-এ revoke করুন। Wallet-এর ব্যালান্স আপনার অ্যাকাউন্টেই থাকে। দেখুন refund policy।
Files বা Batches API ব্যবহার করলে ওই অংশগুলো কখনো Anthropic ছাড়েনি, তাই সেগুলো ফেরানোর কিছু নেই।
এরপর কোথায় যাবেন#
- Messages: header, streaming event আর translation-এর নিয়ম।
- Anthropic SDK: Python ও TypeScript setup।
- Error আর Rate limit।
- OpenAI থেকে চলে আসা আর OpenRouter থেকে চলে আসা।
সূত্র, October 2026-এ দেখা: Anthropic-এর API overview, errors, rate limits, prompt caching, citations, List Models আর anthropic-sdk-python ও anthropic-sdk-typescript-এর source। Tokens-এর আচরণ নেওয়া gateway-এর কোড আর ওপরে দেওয়া পেজগুলো থেকে। এটা কোনো live Anthropic অ্যাকাউন্টের বিরুদ্ধে পরীক্ষা করা হয়নি।