# Anthropic থেকে Tokens-এ চলে আসুন

> Anthropic Messages API-র app Tokens-এ আনুন: /v1 ছাড়া base URL, key header, model id, কোন Anthropic-only feature চলে আর কোনটা চলে না, error ও limit-এর তফাত, পরীক্ষা আর rollback।

আপনার 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](/docs/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 পেজ](/docs/anthropic-sdk) আর [Claude Code](/docs/claude-code)।

যা একই থাকে:

- `POST /v1/messages`-এর request আর response-এর গড়ন: `system`, `messages`, content block, `max_tokens` (এখনও বাধ্যতামূলক), `tools`, `tool_choice`, `stop_sequences` আর `usage` object।
- 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-version` header। এটা provider-এর কাছে forward হয়, আর আপনি না পাঠালে default `2023-06-01` ধরা হয়।
- `/v1/messages`-এর error body Anthropic-এর shape-এই আসে, তাই SDK একই exception class তোলে।

## আগে আর পরে

:::code-tabs

```diff title="Python"
 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)
```

```diff title="Node.js"
 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);
```

```diff title="curl"
-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-এ উত্তর দেয়:

```python
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](/models)-এ। কোনটা নেবেন বুঝতে সাহায্য করবে [কোন model বেছে নেবেন](/docs/choosing-a-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 বেছে নেবেন](/docs/choosing-a-model) আর [Messages](/docs/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](/docs/rate-limits) পেজে প্রতি মিনিটে token-এর কোনো সীমা লেখা নেই। বেশি key বানালে এর কোনোটাই বাড়ে না।

- 429-এ `retry-after` আসে সেকেন্ডে। `anthropic-ratelimit-*` header আসে না। Plan window-র অবস্থা দেখতে `GET /v1/tokens/usage` poll করুন।
- Anthropic-এর দুটো SDK-ই default-এ 429 আর 5xx দুবার retry করে আর `retry-after` মানে। কিন্তু `window_exhausted` আর `model_limit_reached` মানে কয়েক ঘণ্টা বা কয়েক দিনও হতে পারে, তাই এগুলো retry করে লাভ নেই। নিজে নিয়ন্ত্রণ চাইলে `max_retries=0` (TypeScript-এ `maxRetries: 0`) দিন আর retry নিজে সামলান। কীভাবে, তা [rate limit](/docs/rate-limits)-এর 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](/docs/errors) পেজে।

| 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](/models)-এ model-এর পেজের সঙ্গে মিলিয়ে দেখুন।

### Request id header আলাদা

Anthropic `request-id` header ফেরত দেয়, আর SDK সেটা `_request_id` হিসেবে দেখায়। Tokens ওই header পাঠায় না, তাই `_request_id` হয় `None`। এর বদলে `x-tokens-request-id` পড়ুন:

```python
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](/docs/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 দেখতে পায়। দেখুন [নিরাপত্তা ও গোপনীয়তা](/docs/security-and-privacy)।
- **Billing।** Tokens USD বা BDT-তে বিল করে, plan বা Wallet থেকে, প্রতিটা model-এর catalog-দামে। দেখুন [plan, credit আর Wallet](/docs/plans-and-wallet)।
- **Claude Code আর অন্য agent।** Anthropic protocol-এ চলা agent-এর setup আলাদা। দেখুন [Claude Code](/docs/claude-code)।

## নিরাপদে বদলটা পরীক্ষা করুন

1. **দ্বিতীয় একটা key বানান** [/dashboard/keys](/dashboard/keys)-এ, **কম monthly spend cap** আর **allowed-models তালিকা** দিয়ে, যাতে শুধু যে model-গুলো পরীক্ষা করছেন সেগুলোই থাকে। এ দুটোর কোনোটাই পরে edit করা যায় না। Cap-এর হিসাবে Tokens প্রতিটা request-এর সবচেয়ে খারাপ ক্ষেত্রের খরচ ধরে।
2. **Base URL, key আর model id configuration থেকে পড়ুন।** Anthropic-এর দুটো SDK-ই এই তিনটা মান environment variable থেকে নিতে পারে, তাই code না বদলেই deploy করে switch করা যায়।
3. **কিছুদিন দুটোই চালান।** 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](/docs/usage-and-alerts)-এর খরচ মেলান।                                    |
| Error                            | `error.code` ধরে গুনুন।                                                                                        |

4. **ধীরে ধীরে বাড়ান**, feature flag বা শতাংশ দিয়ে। Production key-টা পুরোপুরি switch করার আগেই পছন্দের cap দিয়ে বানিয়ে নিন, কারণ rotation বা revoke সঙ্গে সঙ্গে কার্যকর হয়।

## আগের অবস্থায় ফিরে যাওয়া

1. Tokens পুরো একটা billing cycle production traffic সামলানোর আগে পর্যন্ত আপনার Anthropic key আর billing চালু রাখুন।
2. পুরোনো base URL (অথবা `ANTHROPIC_BASE_URL` unset করে), key আর model id configuration-এ ফিরিয়ে দিন, তারপর deploy করুন বা flag উল্টে দিন।
3. যে Tokens key আর লাগবে না, সেটা [/dashboard/keys](/dashboard/keys)-এ revoke করুন। Wallet-এর ব্যালান্স আপনার অ্যাকাউন্টেই থাকে। দেখুন [refund policy](/refund-policy)।

Files বা Batches API ব্যবহার করলে ওই অংশগুলো কখনো Anthropic ছাড়েনি, তাই সেগুলো ফেরানোর কিছু নেই।

## এরপর কোথায় যাবেন

- [Messages](/docs/messages): header, streaming event আর translation-এর নিয়ম।
- [Anthropic SDK](/docs/anthropic-sdk): Python ও TypeScript setup।
- [Error](/docs/errors) আর [Rate limit](/docs/rate-limits)।
- [OpenAI থেকে চলে আসা](/docs/migrate-from-openai) আর [OpenRouter থেকে চলে আসা](/docs/migrate-from-openrouter)।

সূত্র, October 2026-এ দেখা: Anthropic-এর [API overview](https://platform.claude.com/docs/en/api/overview), [errors](https://platform.claude.com/docs/en/api/errors), [rate limits](https://platform.claude.com/docs/en/api/rate-limits), [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), [citations](https://platform.claude.com/docs/en/build-with-claude/citations), [List Models](https://platform.claude.com/docs/en/api/models/list) আর [anthropic-sdk-python](https://github.com/anthropics/anthropic-sdk-python) ও [anthropic-sdk-typescript](https://github.com/anthropics/anthropic-sdk-typescript)-এর source। Tokens-এর আচরণ নেওয়া gateway-এর কোড আর ওপরে দেওয়া পেজগুলো থেকে। এটা কোনো live Anthropic অ্যাকাউন্টের বিরুদ্ধে পরীক্ষা করা হয়নি।

---
Page: https://tokens.bd/bn/docs/migrate-from-anthropic
