# Anthropic SDK (Python ও TypeScript)

> Official Anthropic Python ও TypeScript SDK-কে base URL https://tokens.bd দিয়ে Tokens-এ লাগান, তারপর Tokens catalog-এর যেকোনো model দিয়ে messages.create আর stream চালান।

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](/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](/docs/curl) পেজ দেখুন)।

সাধারণ text-এর বাইরের সুবিধাগুলো নির্ভর করে আপনি কোন model বেছেছেন তার ওপর। Tool use, extended thinking আর prompt caching শুধু সেখানেই চলে যেখানে ভেতরের model ও provider সেটা সাপোর্ট করে। এগুলোর কোনোটার ওপর ভরসা করার আগে [/models](/models)-এ model-এর পেজটা দেখে নিন।

## Python

```bash
pip install --upgrade anthropic
export TOKENS_API_KEY="tok_live_your_key"
```

```python title="hello_anthropic.py"
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 করুন

```python
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 লাগে।

```bash
npm install @anthropic-ai/sdk
```

```ts title="hello-anthropic.ts"
import 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 করুন

```ts
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` পড়ে নেয়:

```bash
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](/docs/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` আলাদা করতে চাইলে সেটা পড়ুন।

```python
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](/docs/errors) পেজে, আর request-এর format আছে [Messages](/docs/messages) পেজে।

---
Page: https://tokens.bd/bn/docs/anthropic-sdk
