VPS-এ Claude API দিয়ে প্রথম Python app তৈরি করুন
Ubuntu 24.04 VPS-এ Claude API key নিরাপদে সংরক্ষণ করে streaming-সহ Python log explainer বানান। typed error handling, systemd এবং খরচ নিয়ন্ত্রণও শিখুন।
আপনি যা তৈরি করছেন
একটি নতুন Ubuntu 24.04 VPS-এ একটি command-line tool। এতে একটি error message বা log-এর অংশ pipe করলে এটি সাধারণ ইংরেজিতে diagnosis ফেরত দেয়: journalctl -u nginx -n 50 | explain। কোডটি প্রায় ষাট লাইনের Python। এতে একটি বাস্তব Claude API application-এর প্রয়োজনীয় বিষয়গুলো অনুশীলন করা হয়: সঠিকভাবে সংরক্ষিত key, একটি virtualenv, SDK-এর response shape, streaming, typed exception chain এবং একটি systemd unit, যাতে আপনার সরাসরি হস্তক্ষেপ ছাড়াই এটি চলে।
আমি ইচ্ছা করেই এই project বেছে নিয়েছি। অধিকাংশ "first API app" tutorial-এ এমন chatbot তৈরি করতে বলা হয়, যা আপনি আর কখনও খুলবেন না। একটি log explainer প্রথম দিন থেকেই server-এ কাজে লাগে। এটি beginners যে দুটি বিষয়ে সবচেয়ে বেশি ভুল করে, সেগুলোও অনুশীলন করায়: response object সঠিকভাবে পড়া এবং খরচ নিয়ন্ত্রণ করা। API প্রতি token অনুযায়ী বিল করে। আপনি যে সীমা নির্ধারণ করেন, তার বাইরে কোনো ceiling নেই। তাই এখানে cost control পরে যোগ করার বিষয় নয়; এটি design-এর একটি input। একই discipline পরে কাজে লাগে, যখন আপনি tmux-এ এই একই VPS-এ Claude Code চালানো শুরু করবেন।
Console থেকে একটি API key সংগ্রহ করুন
API access Anthropic Console-এর platform.claude.com-এ পরিচালনা করা হয়। সাইন আপ করার পর Settings → API Keys-এর অধীনে একটি key তৈরি করুন; documentation-এর লিংক সরাসরি platform.claude.com/settings/keys-এ নিয়ে যায়। Console আপনাকে key-এর নাম দিতে, expiration নির্বাচন করতে এবং এটি আপনার নিজের account বা একটি service account-এর সঙ্গে যুক্ত করতে বলবে। Production service এবং একাধিক ব্যক্তি ব্যবহার করে এমন যেকোনো কিছুর জন্য Anthropic service account key ব্যবহারের পরামর্শ দেয়। Key-টি একবারই দেখানো হয়, sk-ant- দিয়ে শুরু হয় এবং পরে আর পুনরুদ্ধার করা যায় না। তাই সঙ্গে সঙ্গে copy করুন, অথবা এটি delete করে নতুন করে তৈরি করুন।
খরচের বিষয়ে: October 2026 অনুযায়ী API-এর জন্য কোনো চলমান free tier নেই। Anthropic-এর pricing documentation অনুযায়ী নতুন ব্যবহারকারীরা পরীক্ষামূলক ব্যবহারের জন্য অল্প পরিমাণ free credit পান। সঠিক পরিমাণ signup-এর সময় Console-এ যা দেখায় সেটিই প্রযোজ্য। এই credit শেষ হয়ে গেলে request সফল হওয়ার আগে account-এ অর্থ যোগ করতে হবে। এটি claude.ai subscription থেকে আলাদা, এবং API key থাকলেই chat app ব্যবহার করা যায় না। Pro plan-এ API credit অন্তর্ভুক্ত নয়। তবে Max এবং Team plan-এ এটি অন্তর্ভুক্ত আছে: October 2026 অনুযায়ী Max 5x-এ মাসে $100 এবং Max 20x-এ $200। Team plan-এ প্রতি Standard seat-এর জন্য $20 এবং প্রতি Premium seat-এর জন্য $100 পাওয়া যায়, সর্বোচ্চ $500 পর্যন্ত। claude.ai-এর billing settings থেকে একটি Console organization link করে এই credit দাবি করতে হয়। অব্যবহৃত credit প্রতিটি billing cycle-এর শেষে মেয়াদোত্তীর্ণ হয় এবং Claude Code-এর খরচে ব্যবহার করা যায় না। বিস্তারিত জানতে পড়ুন Max এবং Team-এর মাসিক API credit কীভাবে কাজ করে। Subscription এবং API-এর মধ্যে নির্বাচন করার আগে এই trade-off আলাদা বিষয় হিসেবে বিবেচনা করতে হবে: আপনার আসলে কোন Claude plan প্রয়োজন।
একটি নির্দিষ্ট project বা server-এর মধ্যে সীমাবদ্ধ করে key তৈরি করুন। কোনো key ফাঁস হলে, এবং যথেষ্ট সময় গেলে এমন ঘটনা ঘটবেই, আপনার মালিকানাধীন অন্য সবকিছু অচল না করে সেটি revoke করতে পারবেন।
.bashrc-এ key রাখবেন না
স্বাভাবিকভাবে প্রথমে export ANTHROPIC_API_KEY=sk-ant-...-কে ~/.bashrc-এ বসানোর কথা মনে হতে পারে। তা করবেন না। এতে 3টি পৃথক সমস্যা হয়:
- প্রতিটি process এটি উত্তরাধিকার সূত্রে পায়। আপনার login shell-এ export করা environment variable আপনার চালু করা সবকিছুর মধ্যে ছড়িয়ে পড়ে—web app, crash reporter, যা সুবিধামতো তার environment bug report-এ লিখে দেয়, এমনকি কেউ চালু রাখা
phpinfo()page-ও। ফলে key-এর exposure surface হয়ে যায় “এই user কখনও চালানো প্রতিটি জিনিস।” - আপনি এটি লিখলে তা
~/.bash_history-এ জমা হয়। একবার হাতে export চালালেই key একটি plaintext file-এ স্থায়ীভাবে থেকে যায় এবং আপনার home directory-এর প্রতিটি backup-এ sync হয়। - systemd-এর প্রয়োজনের সময় এটি সেখানে থাকে না। Service আপনার
.bashrcপড়ে না। তাই script-টিকে unit-এ রূপান্তর করার সময় এই পদ্ধতি ব্যর্থ হয়, সাধারণত সকাল 6টায় একটি রহস্যজনক 401 হিসেবে।
Server-এ সঠিক পদ্ধতি হলো 600 permission-সহ একটি dedicated environment file তৈরি করা এবং শুধু প্রয়োজনীয় process দিয়ে সেটি load করানো:
sudo mkdir -p /opt/explain
sudo install -m 600 -o root -g root /dev/null /etc/claude-explain.env
printf 'ANTHROPIC_API_KEY=sk-ant-YOUR-KEY-HERE\n' | sudo tee /etc/claude-explain.env >/dev/nullEditor-এর swap file-এ key না রাখতে চাইলে editor-এর পরিবর্তে printf থেকে tee ব্যবহার করুন। যেভাবেই তৈরি করুন, ls -l /etc/claude-explain.env দিয়ে যাচাই করুন যে এটি -rw------- পড়ে এবং file-টির owner root। Interactive shell-এ wrapper-এর মাধ্যমে প্রতিবার চালানোর সময় key দেওয়া হয় (নিচে দেখুন), আর systemd এটি EnvironmentFile=-এর মাধ্যমে পায়। root privilege কমানোর আগে file পড়ে, তাই service user-এর এতে read access প্রয়োজন হয় না। Key কখনও code, git, ps output বা shell history-তে দেখা যায় না।
venv-এ SDK ইনস্টল করুন
Ubuntu 24.04 PEP 668 enforcement-সহ Python 3.12 সরবরাহ করে। তাই system interpreter-এ সরাসরি pip install anthropic চালালে error: externally-managed-environment দিয়ে ব্যর্থ হয়। এটি OS-এর প্রত্যাশিত আচরণ। virtualenv ব্যবহার করুন:
sudo apt update && sudo apt install -y python3-venv
sudo python3 -m venv /opt/explain/venv
sudo /opt/explain/venv/bin/pip install anthropicসার্ভারে activation করার প্রয়োজন নেই। সরাসরি /opt/explain/venv/bin/python চালালে সব সময় venv-এর package ব্যবহার হবে।
প্রথম কল এবং response সঠিকভাবে পড়া
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from the environment
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1000,
messages=[{"role": "user", "content": "Explain what a systemd unit file is in three sentences."}],
)
for block in response.content:
if block.type == "text":
print(block.text)এই 12টি লাইনের দুটি বিষয় API-এর মূল ধারণাটি বোঝার জন্য সবচেয়ে গুরুত্বপূর্ণ। প্রথমত, anthropic.Anthropic() কোনো argument ছাড়া চালালে environment থেকে key পড়ে; এটিকে কখনো string literal হিসেবে পাঠাবেন না। দ্বিতীয়ত, response.content একটি content block-এর list, string নয়। এটিকে সরাসরি print করলে প্রথমবারের ব্যবহারকারীরা সাধারণত এমন output পান:
[TextBlock(citations=None, text='A systemd unit file is...', type='text')]এটি কোনো bug নয়; এটি object-এর repr। Response-এ একাধিক block type থাকতে পারে—text, tool call এবং thinking। তাই প্রতিটি block iterate করুন এবং .text ব্যবহার করার আগে block.type == "text" পরীক্ষা করুন। Opus 5.5-এ প্রথম call থেকেই এটি গুরুত্বপূর্ণ: thinking সবসময় সক্রিয় থাকে। তাই সহজ request-এ model thinking এড়িয়ে না গেলে list-এর শুরুতে thinking block থাকে, যার text ডিফল্টভাবে খালি। আর response.content[0].text আপনার answer নয়। প্রথম দিন থেকেই এই loop যুক্ত করলে “এটি garbage print করছে” ধরনের একটি সম্পূর্ণ বিভ্রান্তির শ্রেণি এড়ানো যায়।
সঠিক model ID claude-opus-5-5 ব্যবহার করুন। 4.6 generation থেকে model ID-তে date থাকে না, এবং dateless ID-ই pinned snapshot। তাই বর্তমান model-এর ID-এর শেষে date suffix যোগ করার পুরোনো অভ্যাস বা পুরোনো blog post-এর নির্দেশ অনুসরণ করবেন না; এতে 404 হয়, যা নিচে ব্যাখ্যা করা হয়েছে। পুরোনো model-গুলোতে নিয়মটি উল্টো: Haiku 4.5-এর canonical ID হলো dated claude-haiku-4-5-20251001।
প্রকৃত টুল: ব্যাখ্যা
এখানে সম্পূর্ণ প্রোগ্রামটি দেওয়া হলো। এটি stdin থেকে ইনপুট নিয়ে stream করে diagnosis আউটপুট দেয় এবং error সামলে নেয়:
#!/usr/bin/env python3
"""explain: pipe an error or log excerpt in, get a diagnosis out."""
import sys
import anthropic
MODEL = "claude-opus-5-5"
def main() -> int:
text = sys.stdin.read().strip()
if not text:
print("usage: journalctl -u nginx -n 50 | explain", file=sys.stderr)
return 1
client = anthropic.Anthropic()
try:
with client.messages.stream(
model=MODEL,
max_tokens=4096,
system=(
"You are a senior Linux sysadmin. The user pipes you server "
"logs or error output. Name the most likely cause outright, "
"then give the commands to confirm and fix it. Be terse."
),
messages=[{"role": "user", "content": text}],
) as stream:
for chunk in stream.text_stream:
print(chunk, end="", flush=True)
print()
except anthropic.RateLimitError as e:
retry_after = e.response.headers.get("retry-after", "60")
print(f"rate limited; retry in {retry_after}s", file=sys.stderr)
return 2
except anthropic.APIStatusError as e:
print(f"API error {e.status_code}: {e.message}", file=sys.stderr)
return 2
except anthropic.APIConnectionError:
print("network error reaching the API", file=sys.stderr)
return 2
return 0
if __name__ == "__main__":
sys.exit(main())এটি /opt/explain/explain.py নামে সংরক্ষণ করুন। এরপর interactive ব্যবহারের জন্য key লোড করে এমন একটি wrapper যোগ করুন:
sudo tee /usr/local/bin/explain >/dev/null <<'EOF'
#!/bin/sh
set -a; . /etc/claude-explain.env; set +a
exec /opt/explain/venv/bin/python /opt/explain/explain.py "$@"
EOF
sudo chmod 755 /usr/local/bin/explain(Wrapper-টি sudo-এর মাধ্যমে চালাতে হবে, অথবা env file-এ এমন group দিতে হবে যার সদস্য আপনার admin user। ফাইলের permission 644 করে দেওয়ার বদলে কোন পদ্ধতি ব্যবহার করবেন, তা ইচ্ছাকৃতভাবে নির্ধারণ করুন।)
Streaming ব্যবহারের কারণ। client.messages.stream token আসার সঙ্গে সঙ্গে তা print করে, পুরো generation শেষ হওয়া পর্যন্ত নীরব থাকে না। এটি দীর্ঘ output-এর ক্ষেত্রে HTTP timeout এড়াতেও সাহায্য করে। একই কারণে SDK non-streaming call-এ খুব বড় max_tokens value গ্রহণ করতে অস্বীকার করে। text_stream শুধু answer text দেয়। Opus 5.5-এ default thinking display চালু থাকলেও কোনো thinking text stream করা হয় না। ফলে output পরিষ্কার থাকে। পরে assembled object প্রয়োজন হলে with block-এর মধ্যে stream.get_final_message() call করুন।
Exception-এর ক্রমের কারণ। SDK typed exception তৈরি করে এবং সেগুলো সবচেয়ে নির্দিষ্ট exception থেকে শুরু করে সাজানো থাকে। RateLimitError একটি 429 response এবং এতে retry-after header থাকে, যা কতক্ষণ অপেক্ষা করতে হবে তা জানায়। APIStatusError অন্যান্য non-2xx response সামলায়। Server-side সমস্যার জন্য e.status_code >= 500 পরীক্ষা করুন। APIConnectionError বোঝায় যে request কোনো response-ই পায়নি। Retry loop তৈরির আগে মনে রাখুন: SDK নিজেই 429 এবং 5xx error retry করে। Default হিসেবে exponential backoff সহ এটি দুইবার retry করে (client-এ max_retries)। আপনার except চালু হওয়ার সময় retry শেষ হয়ে যায়। তাই CLI-তে সঠিক পদক্ষেপ হলো error জানিয়ে exit করা, sleep করে পুনরায় request পাঠিয়ে server-এর ওপর চাপ না বাড়ানো।
খরচ নিয়ন্ত্রণ
এটির জন্য আলাদা section প্রয়োজন, কারণ আপনি নিজে যে সীমা নির্ধারণ করেন তার বাইরে API-তে কোনো built-in মাসিক cap নেই। এখানে প্রতিটি ভুল নীরবে জমা হতে থাকে।
max_tokens প্রতি call-এর সর্বোচ্চ খরচ নির্ধারণ করে। Opus 5.5-এ output token-এর দাম input token-এর দামের পাঁচ গুণ। max_tokens নির্ধারণ করে model সর্বোচ্চ কতটি token তৈরি করতে পারবে। নিয়ন্ত্রণের বাইরে চলে যাওয়া prompt-এর output খরচ আপনার নির্ধারিত সীমার বেশি হতে পারে না। 5.5 model-এ এই cap-এর মধ্যে thinking-ও অন্তর্ভুক্ত। Thinking token max_tokens-এর মধ্যে গণনা হয় এবং output হিসেবে বিল হয়, যদিও thinking text আপনাকে ফেরত দেওয়া হয় না। কাজ অনুযায়ী সীমা নির্ধারণ করুন। 4,096 একটি সংক্ষিপ্ত log diagnosis-এর জন্য যথেষ্ট thinking-এর জায়গা রাখে। Classification task-এর জন্য এর চেয়ে অনেক কম প্রয়োজন। stop_reason: "max_tokens" দিয়ে response মাঝপথে থেমে গেলে সীমাটি খুব কম নির্ধারণ করা হয়েছে। তখন সচেতনভাবে সীমা বাড়ান, অথবা effort setting কমিয়ে দিন যাতে model কম চিন্তা করে। অযথা বিশাল সীমা ব্যবহার করবেন না।
পাঠানোর আগে count করুন। Input-এর জন্যও খরচ হয়, আর log সাধারণত বড় হয়। API-তে একটি counting endpoint আছে, যা বিনামূল্যে ব্যবহার করা যায়। এর rate limit আলাদা এবং message creation-এর rate limit-এর সঙ্গে যুক্ত নয়:
count = client.messages.count_tokens(
model="claude-opus-5-5",
messages=[{"role": "user", "content": big_log_text}],
)
print(count.input_tokens)ভুল করে 2 GB log tool-এর মাধ্যমে পাঠানো ঠেকাতে এটি ব্যবহার করুন। আপনি যে model-টি সত্যিই call করবেন, সেটিই দিন। Claude 4.7 এবং পরবর্তী model-গুলো নতুন tokenizer ব্যবহার করে, যা একই text-এর জন্য আগের Claude model-এর তুলনায় প্রায় 30% বেশি token তৈরি করে। এর জন্য tiktoken ব্যবহার করবেন না। এটি OpenAI-এর tokenizer, Claude-এর নয়। তাই এর count আপনার বিলের সঙ্গে মিলবে না।
আনুগত্যের ভিত্তিতে নয়, task অনুযায়ী model বাছুন। October 2026 অনুযায়ী, Opus 5.5 (claude-opus-5-5)-এর দাম প্রতি million input token-এ $4 এবং প্রতি million output token-এ $20। Haiku 5.5 (claude-haiku-5-5)-এর দাম 100,000 token পর্যন্ত prompt-এর জন্য $0.10/$0.50। এর বেশি হলে দাম $0.50/$2.50। এতে 1M context রয়েছে। Sonnet 5.5 (claude-sonnet-5-5)-এর দাম মাঝামাঝি, $2/$10। উদাহরণ হিসেবে, 2,000-token log excerpt এবং 500-token answer-এর খরচ Opus-এ প্রায় $0.018 এবং Haiku-তে $0.00045। এর সঙ্গে model-এর thinking-এর খরচ যোগ হবে, যা output হিসেবে বিল হয়। Output quality যাচাই করার সময় Opus দিয়ে শুরু করুন। এরপর একই prompt Haiku-তে পরীক্ষা করুন। বেশি volume-এর সাধারণ transformation-এর ক্ষেত্রে ফল প্রায় একই হতে পারে, অথচ প্রতি token-এর দাম এক-চল্লিশাংশ। Budget-এ এগুলো স্থায়ীভাবে লেখার আগে pricing page-এ বর্তমান দাম যাচাই করুন।
যে কাজ অপেক্ষা করতে পারে, তার জন্য Batches ব্যবহার করুন। Batches API asynchronous উপায়ে request process করে এবং standard price-এর 50%-এ কাজ করে। বেশিরভাগ batch এক ঘণ্টার মধ্যে সম্পন্ন হয়। Nightly digest, backfill, bulk classification এবং যেসব কাজের জন্য কোনো মানুষকে অপেক্ষা করতে হয় না, সেগুলো এখানে পাঠান।
পুনরাবৃত্ত context-এর জন্য prompt caching ব্যবহার করুন। প্রতিটি call-এ একই বড় system prompt বা runbook পাঠালে সেটিকে cacheable হিসেবে চিহ্নিত করুন:
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1000,
system=[{
"type": "text",
"text": RUNBOOK_TEXT, # the same 30K tokens on every call
"cache_control": {"type": "ephemeral"},
}],
messages=[{"role": "user", "content": question}],
)
print(response.usage.cache_read_input_tokens) # non-zero from the second call on5-minute TTL-এ cache write-এর খরচ input price-এর 1.25 গুণ। Opus 5.5 এবং Sonnet 5.5-এ cache read-এর খরচ 0.05 গুণ। বেশিরভাগ অন্য model-এ এটি 0.1 গুণ। তাই একই window-এর মধ্যে দ্বিতীয় call-এই প্রথম call-এর খরচ উঠে আসে। এখানে 2টি বিষয় মনে রাখুন। Cached prefix-কে প্রতি model-এর minimum সীমা পূরণ করতে হবে। Opus 5.5-এ এই সীমা 512 token। তাই খুব ছোট system prompt নীরবে cache নাও হতে পারে। আর identical call-গুলোর মধ্যে cache_read_input_tokens শূন্য থাকলে বুঝবেন প্রতি request-এ prefix-এর কোনো অংশ বদলাচ্ছে। সাধারণত timestamp এর কারণ হয়।
কোন বিষয় input হিসেবে গণনা হয়, তা মনে রাখুন। System prompt, tool definition এবং multi-turn conversation-এ প্রতি turn-এ পুনরায় পাঠানো সম্পূর্ণ history—সবই input token হিসেবে বিল হয়। যে chat loop history কখনও trim করে না, তার খরচ quadratic হারে বাড়ে। Conversational কিছু তৈরি করার আগে সম্পূর্ণ হিসাব বোঝা জরুরি: Claude token usage এবং billing আসলে কীভাবে যোগ হয়।
systemd-এর অধীনে চালান
Environment file ব্যবহারের এই শৃঙ্খলার ফল হলো: প্রতিদিন সকালে আগের দিনের error-এর সারসংক্ষেপ তৈরি করা একটি timer।
# /etc/systemd/system/log-digest.service
[Unit]
Description=Daily error-log digest via the Claude API
[Service]
Type=oneshot
User=explain
Group=systemd-journal
EnvironmentFile=/etc/claude-explain.env
ExecStart=/bin/sh -c 'journalctl -p err --since yesterday | /opt/explain/venv/bin/python /opt/explain/explain.py >> /var/log/log-digest.txt'# /etc/systemd/system/log-digest.timer
[Unit]
Description=Run the log digest every morning
[Timer]
OnCalendar=06:15
Persistent=true
[Install]
WantedBy=timers.targetsudo useradd -r -s /usr/sbin/nologin explain
sudo touch /var/log/log-digest.txt && sudo chown explain /var/log/log-digest.txt
sudo systemctl daemon-reload
sudo systemctl enable --now log-digest.timer
sudo systemctl start log-digest.service # test it once, right nowলক্ষ করুন, EnvironmentFile= ব্যবহার করলে কী সুবিধা হয়: systemd unprivileged explain user-এ স্যুইচ করার আগেই root-owned, mode-600 file পড়ে। ফলে process variable-টি পায়, কিন্তু user key file পড়তে পারে না। systemd-journal group log access দেয়। Manual systemctl start দিয়ে পরীক্ষা করুন এবং journalctl -u log-digest.service পড়ুন। Typo ধরার জন্য 06:15 পর্যন্ত অপেক্ষা করবেন না। এই pattern shell pipeline-এর সীমা ছাড়িয়ে গেলে একই key-in-env-file পদ্ধতি একই box-এ Claude-চালিত n8n workflow-এ সরাসরি ব্যবহার করা যায়।
ব্যর্থতার ধরন এবং আপনি যে স্ট্রিংগুলো দেখবেন
সঠিক key-তে 401। Exception-এ দেখা যাবে:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}আপনার shell-এ key কাজ করলেও service 401 দিলে বুঝবেন service key-টি পায়নি। মনে রাখুন, systemd .bashrc পড়ে না; EnvironmentFile= সঠিক path নির্দেশ করছে কি না পরীক্ষা করুন। অন্যান্য কারণের মধ্যে রয়েছে env file-এ paste করা quote (ANTHROPIC_API_KEY="sk-ant-..."; systemd quote বাদ রাখে, কিন্তু অস্বাভাবিকভাবে quote করলে আপনার shell wrapper-এর . file quote-গুলো value-এর মধ্যে রেখে দেয়), শেষে থাকা whitespace, গত সপ্তাহে Console-এ revoke করা key, অথবা key তৈরির সময় নির্ধারণ করা expiration-এ পৌঁছে যাওয়া key।
Model typo-এর কারণে 404। এর সবচেয়ে সাধারণ ধরন হলো এমন model ID-তে date suffix যোগ করা, যার dated form নেই:
anthropic.NotFoundError: Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-opus-5-5-20260922'}, 'request_id': 'req_011CSJqymAvNw4bT3qmDdMbA'}বর্তমান প্রজন্মের ID-গুলো হুবহু লিখতে হবে: claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5, claude-fable-5-1। 4.6 generation-এর আগের model-গুলো ব্যতিক্রম: claude-haiku-4-5 হলো dated ID claude-haiku-4-5-20251001-এর একটি সুবিধাজনক alias, এবং উভয় form কাজ করে। ID মুখস্থ করে বা পুরোনো tutorial থেকে নয়, models documentation থেকে copy করুন।
429 rate_limit_error। Error type string হলো rate_limit_error এবং response-এ অপেক্ষার seconds-সহ retry-after header থাকে। Exception দেখার আগেই SDK backoff সহ দুবার retry করেছে। তাই বারবার 429 পাওয়ার অর্থ আপনার sustained rate সত্যিই tier-এর সীমা ছাড়িয়ে যাচ্ছে। কাজগুলো batch করুন বা সময়ের মধ্যে ছড়িয়ে দিন। Retry loop আরও ঘন করবেন না।
Text-এর বদলে object print হয়। Output দেখতে এমন হবে: [TextBlock(citations=None, text='...', type='text')]। আপনি blocks iterate করে block.type == "text" হওয়া block-গুলো থেকে .text পড়ার বদলে response.content print করেছেন। উপরের প্রতিটি SDK example-এ এটি সঠিকভাবে করা হয়েছে; loop-টি copy করুন।
error: externally-managed-environment। আপনি Ubuntu 24.04-এর system Python-এ pip install চালিয়েছেন। venv ব্যবহার করুন। যে server গুরুত্বপূর্ণ, সেখানে কখনও --break-system-packages ব্যবহার করবেন না।
উত্তর কেটে যায়। response.stop_reason == "max_tokens" বোঝায়, model output cap-এ পৌঁছে মাঝপথে থেমে গেছে। এটি প্রত্যাশিত আচরণ। Cap ইচ্ছাকৃতভাবে বাড়ান এবং মনে রাখুন, 5.5 model-এ thinking একই cap থেকে ব্যয় হয়।
প্রথম app কাজ করার পরে, Claude দিয়ে একটি AI agent তৈরি করা একই API call-গুলোকে এমন agent-এ রূপ দেয়, যা tools ব্যবহার করে।
FAQ
Claude API ব্যবহার করে পরীক্ষা করতে কত খরচ হয়?
এই ধরনের একটি টুলের জন্য খরচ সত্যিই খুব কম। October 2026 অনুযায়ী, Opus 5.5-এর মূল্য প্রতি million input token-এ $4 এবং প্রতি million output token-এ $20। তাই একটি সাধারণ log diagnosis-এ কয়েক হাজার token input এবং কয়েকশ token output হলে, thinking token-এর খরচ ধরার আগে ব্যয় প্রায় দুই cent। thinking token output হিসেবে বিল হয়। Haiku 5.5-এ ($0.10/$0.50) একই খরচ এক tenth cent-এরও কম। প্রতিদিনের digest চালালে এক মাসের খরচ এক কাপ coffee-এর চেয়েও কম। ঝুঁকি প্রতি call-এর মূল্য নয়; ঝুঁকি হলো সীমাহীন loop এবং সীমাহীন max_tokens। এই কারণেই এই guide-এ দুটিই স্পষ্টভাবে নির্ধারণ করা হয়েছে।
Claude API-এর কি কোনো free tier আছে?
October 2026 অনুযায়ী চলমান কোনো free tier নেই। Anthropic-এর pricing documentation অনুযায়ী, নতুন ব্যবহারকারীরা API পরীক্ষা করার জন্য অল্প পরিমাণ free credit পান। এটি একবারের trial। signup-এর সময় Console-এ সঠিক পরিমাণ দেখানো হয়। এরপর আপনাকে account-এ অর্থ যোগ করতে হবে। Max এবং Team subscriber-রা ব্যতিক্রম। তাদের plan-এ মাসিক API credit অন্তর্ভুক্ত থাকে, যা উপরে ব্যাখ্যা করা হয়েছে। আপনার লক্ষ্য যদি frontier quality-এর বদলে প্রতি request-এ শূন্য marginal cost হয়, তাহলে বিকল্প হলো Ollama দিয়ে open-weight model self-host করা এবং token-এর বদলে RAM-এর জন্য অর্থ ব্যয় করা।
সার্ভারে API key কীভাবে নিরাপদ রাখব?
কখনো code-এ রাখবেন না, git-এ রাখবেন না, .bashrc থেকে export করবেন না, এবং এমন shell-এ type করবেন না যেখানে history এটি সংরক্ষণ করবে। 600 permission-সহ root-owned file-এ এটি রাখুন। প্রতি process-এর জন্য আলাদাভাবে load করুন। Interactive ব্যবহারের জন্য একটি wrapper script এবং systemd-এর জন্য EnvironmentFile= ব্যবহার করুন। প্রতি server বা project-এর জন্য একটি করে key নির্ধারণ করুন, যাতে কোনো key ফাঁস হলে সেটি revoke করা সহজ হয়। কোনো paste site বা git commit-এ key চলে গেলে সঙ্গে সঙ্গে Console-এ সেটি revoke করুন। Commit মুছে ফেললেও key-এর ফাঁস বন্ধ হয় না।
কোন Claude model দিয়ে শুরু করা উচিত?
আপনি output যথেষ্ট ভালো কি না এবং তার ওপর ভিত্তি করে build করা যাবে কি না মূল্যায়ন করার সময় claude-opus-5-5 দিয়ে শুরু করুন। এতে ধারণাটির পূর্ণ quality যাচাই করতে পারবেন। Hobby volume-এ খরচের পার্থক্য কয়েক cent মাত্র। Prompt স্থির হয়ে গেলে আপনার প্রকৃত input claude-haiku-5-5-এ আবার চালান। Summarization, classification এবং log triage-এর জন্য এটি প্রতি token-এর এক fortieth খরচে প্রায়ই যথেষ্ট ভালো ফল দেয়। Default হিসেবে নয়, measurement-এর ভিত্তিতে Haiku বা Sonnet-এ পরিবর্তন করুন।