Tokens gateway যত API error code ফেরত দেয়, এই পেজে সবগুলোর তালিকা আছে: কোনটার মানে কী, আর retry করা যাবে কি না। আপনার code-এ branch করবেন code field দেখে। message পড়ার জন্য মানুষের, ওটা বদলে যেতে পারে।
Error JSON-এর গড়ন#
OpenAI-style endpoint-গুলোতে (/v1/chat/completions, /v1/completions, /v1/responses, /v1/embeddings, /v1/models) gateway নিজে যে error তৈরি করে, সেগুলো দেখতে OpenAI-এর error-এর মতো:
{
"error": {
"message": "Prepaid wallet balance is insufficient for this request. Top up your wallet in the dashboard: https://tokens.bd/dashboard/billing",
"type": "insufficient_quota",
"code": "insufficient_credits",
"param": null,
"request_id": "8f0c7a4e-2b1d-4c55-9a51-3f7e2d9b6c10"
}
}| Field | নোট |
|---|---|
code | স্থির, machine যা পড়তে পারে। এটাই ব্যবহার করুন। |
type | বড় শ্রেণি: authentication_error, permission_denied_error, insufficient_quota, rate_limit_error, invalid_request_error, api_error, server_error বা tokens_error। |
message | মানুষের পড়ার জন্য। billing-এর error-এ billing-এর link থাকে। |
request_id | x-tokens-request-id header-এর মানই। প্রতিটা response-এর x-tokens-request-id header-এও এটা থাকে। |
/v1/messages আর /v1/messages/count_tokens-এ প্রতিটা error-ই Anthropic-এর গড়নে আসে, error-টা Tokens তুলুক বা upstream provider: {"type": "error", "error": {"type": "...", "message": "...", "code": "..."}, "request_id": "..."}। Anthropic-এর গড়নের সাথে Tokens code যোগ করে দেয়, তাই নিচের code ধরে আপনি আগের মতোই branch করতে পারবেন। provider-এর ভেতরের তথ্য ফাঁস না হওয়ার জন্য upstream error-এর message বদলে একটা সাধারণ message বসিয়ে দেওয়া হয়। তবে HTTP status আর code থেকে error-টা কোন ধরনের, তা বোঝা যায়।
Error code-এর তালিকা#
| Status | Code | অর্থ | কী করবেন |
|---|---|---|---|
| 400 | invalid_request | model নেই (বা Content-Type: application/json নেই), n 1 থেকে 4-এর বাইরে, অথবা upstream request body ফিরিয়ে দিয়েছে | request ঠিক করুন। upstream ফিরিয়ে দিলে দেখুন আপনার পাঠানো parameter ওই model সাপোর্ট করে কি না |
| 400 | model_not_available | model catalog-এ আছে, কিন্তু এখন serve করা যাচ্ছে না | GET /v1/models থেকে অন্য model বেছে নিন |
| 400 | endpoint_not_supported_for_model | এই model যে provider-গুলো serve করে, তাদের কেউই এই endpoint-এর উত্তর দিতে পারে না (যেমন chat model-এ /v1/responses, /v1/completions বা embeddings) | /v1/chat/completions ব্যবহার করুন, নয়তো অন্য model বেছে নিন |
| 401 | missing_api_key | Authorization: Bearer বা x-api-key header নেই | যে environment-এ tool চলছে, সেখানে TOKENS_API_KEY set করুন |
| 401 | invalid_api_key | key চেনা যাচ্ছে না | key আবার copy করুন, নয়তো নতুন একটা বানান |
| 401/403 | upstream_auth_error | upstream provider gateway-র credential মানেনি। দোষটা আপনার key-এর নয় | পরে আবার চেষ্টা করুন বা model বদলান। request id সহ জানান |
| 402 | insufficient_credits | plan-এর credit আর Wallet মিলিয়েও request-এর খরচ কুলায় না | billing-এ টাকা যোগ বা renew করুন, অথবা max_tokens কমান |
| 402 | no_funding | চালু কোনো plan নেই, Wallet-এও ব্যালান্স নেই | plan নিন বা টাকা যোগ করুন |
| 402 | outstanding_debt | আগের usage-এর কারণে ব্যালান্স মাইনাসে চলে গেছে | টাকা যোগ করে সেটা মিটিয়ে দিন |
| 402 | member_cap_reached | Team অ্যাকাউন্ট (চালু থাকলে): আপনার member-এর মাসিক cap শেষ | আপনার team admin-কে বলুন |
| 403 | key_inactive | key revoke বা rotate হয়ে গেছে | এখনকার secret ব্যবহার করুন |
| 403 | key_expired | key-র মেয়াদ পেরিয়ে গেছে | নতুন key বানান |
| 403 | account_suspended | অ্যাকাউন্ট suspend করা আছে | Support-এর সাথে যোগাযোগ করুন |
| 403 | model_not_allowed_on_key | এই key-র allowed তালিকায় model-টা নেই | তালিকার কোনো model ব্যবহার করুন, নয়তো অন্য key নিন |
| 403 | monthly_spend_cap_exceeded | key-র মাসিক spend cap শেষ (check-এ এই request-এর সবচেয়ে খারাপ ক্ষেত্রের খরচও ধরা হয়) | max_tokens কমান, নতুন মাসের জন্য অপেক্ষা করুন, বা অন্য key নিন |
| 403 | tier_permission_denied | আপনার plan-এ এই model নেই, আর Wallet-এও ব্যালান্স নেই | plan upgrade করুন, নয়তো pay-as-you-go-র জন্য Wallet-এ টাকা যোগ করুন |
| 404 | model_not_found | model id অচেনা বা বন্ধ (upstream model চিনতে না পারলেও এটাই আসে) | GET /v1/models থেকে হুবহু id-টা দেখে নিন |
| 404 | unsupported_endpoint | path বা method সাপোর্ট করা endpoint-এর কোনোটাই নয় | endpoint-এর তালিকার জন্য models and usage দেখুন |
| 404 | anthropic_protocol_disabled | এই deployment-এ Messages API (/v1/messages) বন্ধ করা আছে | তার বদলে Chat Completions ব্যবহার করুন |
| 413 | request_entity_too_large | body 10 MB-এর বেশি | context বা attachment ছোট করুন |
| 429 | rate_limited | মিনিটে request-এর সীমা শেষ | Retry-After যত সেকেন্ড বলে, তত সেকেন্ড অপেক্ষা করুন |
| 429 | concurrency_limit | আপনার অ্যাকাউন্টে একসাথে চলা request বেশি হয়ে গেছে | Retry-After (2 সেকেন্ড) পর্যন্ত অপেক্ষা করুন, বা parallelism কমান |
| 429 | window_exhausted | plan-এর কোনো usage window (5-hour, weekly বা monthly) শেষ | reset পর্যন্ত অপেক্ষা করুন (Retry-After), নয়তো plan upgrade করুন |
| 429 | model_limit_reached | এই billing period-এ আপনার plan-এ এই model-এর বরাদ্দ শেষ, অন্য model-গুলো ঠিকই চলবে | model বদলান, নয়তো reset পর্যন্ত অপেক্ষা করুন (Retry-After, message-এ তারিখ দেখানো হয়) |
| 429 | rate_limit_exceeded | failover-এর সব উপায় শেষ হওয়ার পর upstream provider আমাদের rate limit করেছে | backoff দিয়ে retry করুন। Retry-After থাকলে মানুন |
| 500 | lookup_failed, admission_error, catalog_error, usage_unavailable | আমাদের দিকের ভেতরের error | backoff দিয়ে একবার-দুবার retry করুন, তাতে না হলে support-এ জানান |
| 502 | upstream_unreachable | এই model-এর কোনো upstream-এর সাথেই connect করা যায়নি | backoff দিয়ে retry করুন, status দেখুন |
| 5xx | upstream_error | upstream server error ফেরত দিয়েছে (status সরাসরি পাঠানো হয়েছে) | backoff দিয়ে retry করুন |
| 503 | no_upstream_available | এই model-এর জন্য এখন কোনো upstream configure করা নেই | অন্য model চেষ্টা করুন, status দেখুন |
| 503 | model_not_priced | model-এর দাম ঠিক করা নেই, তাই বিল করা যায় না | অন্য model চেষ্টা করুন আর বিষয়টা জানান |
| 504 | upstream_timeout | upstream 600 সেকেন্ডের মধ্যে সাড়া দেয়নি, বা request পাঠানোর পর connection ভেঙে গেছে | একবার retry করুন, আর request ছোট করা যায় কি না ভাবুন |
gateway আপনাকে কিছু ফেরত দেওয়ার আগেই 429, 502, 503, 504 আর connection error হলে অন্য upstream source-এ failover করে নেয়। তাই আপনি যদি upstream error দেখেন, তার মানে ওই model-এর সব configured source-ই fail করেছে, নয়তো শেষটা করেছে।
Request id আর support ticket#
প্রতিটা response-এ, সফল হোক বা error, দুটো header থাকে:
| Header | Value |
|---|---|
x-tokens-request-id | এই request-এর জন্য gateway-র id। এটা সব সময় আমরাই বানাই। |
x-request-id | আপনি নিজের x-request-id পাঠালে সেটাই, না পাঠালে x-tokens-request-id-এর মতোই |
নিজের x-request-id পাঠালে আমাদের id আর আপনার log মেলাতে সুবিধা হয়। OpenAI Python SDK-তে header পড়তে চাইলে:
raw = client.chat.completions.with_raw_response.create(
model="deepseek/deepseek-v4.1-flash",
messages=[{"role": "user", "content": "ping"}],
)
print(raw.headers.get("x-tokens-request-id"))
completion = raw.parse()curl-এ header দেখতে -i যোগ করুন। support-এ ticket খোলার সময় এই জিনিসগুলো দিন: x-tokens-request-id, সময় (timezone সহ), endpoint, model আর status code। API key কখনো দেবেন না। আমরা request id ধরে usage-এর metadata রাখি, prompt-এর content রাখি না। তাই id থেকেই আপনার request খুঁজে বের করা যায়। আরও জানতে support দেখুন।
Retry-র নির্দেশিকা#
| Retry | Codes |
|---|---|
হ্যাঁ, Retry-After-এর পরে | rate_limited, concurrency_limit, rate_limit_exceeded |
| হ্যাঁ, exponential backoff দিয়ে | upstream_unreachable, upstream_error, upstream_timeout, সব 500 error |
| শুধু reset-এর সময় পার হলে, loop-এ নয় | window_exhausted, model_limit_reached (Retry-After কয়েক দিনও হতে পারে) |
| না, আগে কিছু ঠিক করুন | সব 400, 401, 402, 403, 404 ও 413 error |
কাজে দেয় এমন backoff: প্রায় 1 সেকেন্ড দিয়ে শুরু করুন, প্রতি চেষ্টায় দ্বিগুণ করুন, সাথে একটু random jitter যোগ করুন, 30 সেকেন্ডে সীমা টানুন, আর 4 বা 5 বার চেষ্টার পর থামুন। Retry-After থাকলে অন্তত ততক্ষণ অপেক্ষা করুন। retry মানেই নতুন request, সফল হলে তার বিল হয়। আবার OpenAI আর Anthropic SDK এই error-গুলোর কিছু নিজেরাই retry করে, তাই নিজের loop বসানোর আগে max_retries দেখে নিন। পুরো backoff উদাহরণ rate limits পেজে আছে, আর agent-এর নির্দিষ্ট সমস্যার সমাধান troubleshooting পেজে।