Ubuntu 24.04 VPS-এ Claude API দিয়ে প্রথম অ্যাপ
Ubuntu 24.04 VPS-এ Claude API কী নিরাপদে রেখে Python লগ-ব্যাখ্যাকারী অ্যাপ বানানোর টিউটোরিয়াল। স্ট্রিমিং, টাইপড এরর হ্যান্ডলিং ও খরচ নিয়ন্ত্রণ সব ধাপে বাংলায় বুঝিয়ে দেওয়া হয়েছে।
আপনি যা তৈরি করছেন
একটি সম্পূর্ণ নতুন Ubuntu 24.04 VPS-এ একটি কমান্ড-লাইন টুল। আপনি এতে একটি এরর মেসেজ বা লগের একটি অংশ পাইপ করে দিলে এটি সহজ ইংরেজিতে একটি রোগনির্ণয় ফেরত দেবে: journalctl -u nginx -n 50 | explain। এটি মাত্র ষাট লাইনের Python কোড। তবে এটি একটি বাস্তব Claude API অ্যাপ্লিকেশনের প্রয়োজনীয় সব উপাদান অন্তর্ভুক্ত করে — সঠিকভাবে সংরক্ষিত একটি কী, একটি virtualenv, SDK-এর রেসপন্স স্ট্রাকচার, স্ট্রিমিং, টাইপড এক্সেপশন চেইন, এবং একটি systemd ইউনিট যাতে এটি আপনার ছাড়াই চলতে পারে।
আমি ইচ্ছাকৃতভাবেই এই প্রজেক্টটি বেছে নিয়েছি। বেশিরভাগ "প্রথম API অ্যাপ" টিউটোরিয়ালে এমন একটি চ্যাটবট বানানো হয় যা আপনি আর কখনো খুলবেন না। একটি লগ ব্যাখ্যাকারী টুল প্রথম দিন থেকেই সার্ভারে কাজে লাগে। এটি আপনাকে দুটি বিষয়ের মধ্য দিয়ে যেতে বাধ্য করে যা নতুনরা সত্যিই ভুল করে: রেসপন্স অবজেক্ট সঠিকভাবে পড়া এবং খরচ নিয়ন্ত্রণ করা। API প্রতি টোকেন অনুযায়ী বিল কাটে, আর আপনি যা নির্ধারণ করেছেন তা ছাড়া এর কোনো ঊর্ধ্বসীমা নেই। তাই এখানে খরচ নিয়ন্ত্রণ একটি ডিজাইনের অংশ, পরে ভাবার বিষয় নয় — একই শৃঙ্খলা তখনও গুরুত্বপূর্ণ যখন আপনি এগিয়ে গিয়ে একই VPS-এ tmux-এ Claude Code চালানোর কাজ করবেন।
কনসোল থেকে একটি API কী নিন
API অ্যাক্সেস platform.claude.com-এ Anthropic কনসোলে পরিচালিত হয় — সাইন আপ করুন, তারপর Settings → API Keys-এর অধীনে একটি কী তৈরি করুন (ডকুমেন্টেশন সরাসরি platform.claude.com/settings/keys-এ লিঙ্ক করে)। কীটি একবার দেখানো হয়, এটি sk-ant- দিয়ে শুরু হয়, এবং পুনরুদ্ধার করা যায় না — অবিলম্বে এটি কপি করুন অথবা মুছে আবার তৈরি করুন।
টাকা সম্পর্কে: 2026 সালের জুলাই পর্যন্ত API-এর জন্য কোনো চলমান ফ্রি টিয়ার নেই। Anthropic-এর প্রাইসিং ডকুমেন্টে বলা হয়েছে যে নতুন ব্যবহারকারীরা পরীক্ষা করার জন্য সামান্য পরিমাণ ফ্রি ক্রেডিট পান; সঠিক পরিমাণটি সাইন আপের সময় কনসোলে যা দেখায় তাই, এবং এটি শেষ হয়ে গেলে আপনাকে অ্যাকাউন্টে টাকা যোগ করতে হবে, তারপরেই অনুরোধ সফল হবে। এটি claude.ai সাবস্ক্রিপশন থেকে আলাদা — একটি Pro বা Max প্ল্যানে API ক্রেডিট অন্তর্ভুক্ত নেই, এবং একটি API কী আপনাকে চ্যাট অ্যাপ দেয় না। আপনি যদি সাবস্ক্রিপশন এবং API-এর মধ্যে তুলনা করেন, সেই বিষয়টি আলাদা: আপনার আসলে কোন Claude প্ল্যান প্রয়োজন।
কীটি একটি নির্দিষ্ট প্রজেক্ট বা সার্ভারের জন্য সীমাবদ্ধ করে তৈরি করুন। যখন একটি কী লিক হয় — এবং যথেষ্ট সময় পার হলে এটি ঘটবে — আপনি নিজের বাকি সবকিছু না ভেঙে সেটি বাতিল করতে চাইবেন।
কীটি .bashrc এর বাইরে রাখুন
স্বতঃস্ফূর্ত পদক্ষেপ হল export ANTHROPIC_API_KEY=sk-ant-... কে ~/.bashrc এ রাখা। এটি করবেন না। এতে তিনটি আলাদা সমস্যা দেখা দেয়:
- প্রতিটি প্রসেস এটি উত্তরাধিকার সূত্রে পায়। আপনার লগইন শেলে এক্সপোর্ট করা একটি এনভায়রনমেন্ট ভেরিয়েবল আপনি যা শুরু করবেন সবকিছুতে ছড়িয়ে পড়ে — ওয়েব অ্যাপ, ক্র্যাশ রিপোর্টার (যা একটি বাগ রিপোর্টে নিজের এনভায়রনমেন্ট ঢেলে দেয়), এবং কেউ চালু রেখে যাওয়া
phpinfo()পেজ। কী-এর ফাঁসের পরিধি হয়ে দাঁড়ায় "এই ইউজার যা কখনো চালায় সবকিছু।" - টাইপ করলে তা
~/.bash_historyএ চলে যায়। একবার হাতে export চালালে আপনার কী চিরকালের জন্য একটি প্লেইনটেক্সট ফাইলে বসে থাকে, এবং আপনার হোম ডিরেক্টরির প্রতিটি ব্যাকআপে সিঙ্ক হয়। - systemd যখন এটি প্রয়োজন, তখন এটি সেখানে থাকে না। সার্ভিসগুলো আপনার
.bashrcপড়ে না, তাই স্ক্রিপ্টকে যখন আপনি একটি ইউনিটে উন্নীত করেন ঠিক তখনই এই পদ্ধতিটি ব্যর্থ হয় — সাধারণত ভোর 6টায় একটি রহস্যময় 401 এরর হিসেবে।
সার্ভারে সঠিক পদ্ধতি হল 600 পারমিশন সহ একটি আলাদা এনভায়রনমেন্ট ফাইল, যা কেবল এটি প্রয়োজন এমন প্রসেসই লোড করে:
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/nullকীটি এডিটর সোয়াপ ফাইলের বাইরে রাখতে চাইলে এডিটরের বদলে printf থেকে tee ব্যবহার করুন; যেকোনো উপায়ে, ls -l /etc/claude-explain.env দিয়ে যাচাই করুন যে এটি -rw------- পড়ে এবং root-এর মালিকানাধীন। ইন্টারঅ্যাকটিভ শেলগুলো একটি র্যাপারের মাধ্যমে (নিচে দেওয়া হল) প্রতি-বার কী পায়, এবং systemd এটি EnvironmentFile= এর মাধ্যমে পায় — root প্রিভিলেজ ছেড়ে দেওয়ার আগে ফাইলটি পড়ে, তাই সার্ভিস ইউজারের এটি পড়ার কোনো প্রয়োজন হয় না। কী কোডে, git-এ, ps আউটপুটে, বা শেল হিস্ট্রিতে কখনো দেখা যায় না।
একটি venv-এ SDK ইনস্টল করুন
Ubuntu 24.04-এ Python 3.12 এবং PEP 668 প্রয়োগ পাওয়া যায়, তাই সিস্টেম ইন্টারপ্রেটারের বিরুদ্ধে একটি নগ্ন 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সার্ভারে কোনো অ্যাক্টিভেশন প্রক্রিয়ার প্রয়োজন নেই: /opt/explain/venv/bin/python সরাসরি কল করলে সর্বদা venv-এর প্যাকেজগুলো ব্যবহার করে।
প্রথম কল, এবং সঠিকভাবে প্রতিক্রিয়া পড়া
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from the environment
response = client.messages.create(
model="claude-opus-4-8",
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)এই বারোটি লাইনের মধ্যে দুটি বিষয় API-এর মূল ধারণাটি বহন করে। প্রথমত, কোনো আর্গুমেন্ট ছাড়া anthropic.Anthropic() পরিবেশ থেকে কী পড়ে — এটি কখনোই স্ট্রিং লিটারেল হিসেবে পাস করবেন না। দ্বিতীয়ত, response.content একটি কন্টেন্ট ব্লকের তালিকা, স্ট্রিং নয়। এটি সরাসরি প্রিন্ট করলে আপনি নতুন ব্যবহারকারীদের সেই পরিচিত আউটপুট পাবেন:
[TextBlock(citations=None, text='A systemd unit file is...', type='text')]এটি কোনো বাগ নয়; এটি অবজেক্টের repr। প্রতিক্রিয়ায় একাধিক ব্লক টাইপ থাকতে পারে (টেক্সট, টুল কল, থিংকিং), তাই .text স্পর্শ করার আগে আপনি পুনরাবৃত্তি করেন এবং block.type == "text" যাচাই করেন। প্রথম দিনেই এই লুপটি যুক্ত করুন এবং "এটি আবর্জনা প্রিন্ট করছে" — এই পুরো শ্রেণীর বিভ্রান্তি কখনোই ঘটবে না।
সঠিক মডেল আইডি claude-opus-4-8 ব্যবহার করুন। বর্তমান প্রজন্মের আইডিগুলো তারিখহীন — একটি তারিখ সাফিক্স যুক্ত করতে আপনাকে বলে এমন পুরোনো অভ্যাস (বা পুরোনো ব্লগ পোস্ট) এড়িয়ে চলুন; এটি একটি 404 তৈরি করে, যা নিচে আলোচনা করা হয়েছে।
আসল টুল: explain
এখানে সম্পূর্ণ প্রোগ্রামটি দেওয়া হলো — stdin থেকে ইনপুট নেয়, স্ট্রিম করে ডায়াগনসিস আউটপুট দেয়, এবং ত্রুটি সামলায়:
#!/usr/bin/env python3
"""explain: pipe an error or log excerpt in, get a diagnosis out."""
import sys
import anthropic
MODEL = "claude-opus-4-8"
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=1500,
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 নামে সংরক্ষণ করুন। এরপর ইন্টারঅ্যাকটিভ ব্যবহারের জন্য একটি র্যাপার যোগ করুন যা কী লোড করে:
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(র্যাপারটি sudo এর মাধ্যমে চালাতে হবে, অথবা env ফাইলের গ্রুপ হতে হবে এমন একটি যেখানে আপনার admin ব্যবহারকারী আছে — ফাইলটিকে 644 এ শিথিল করার বদলে যেকোনো একটি বেছে নিন।)
স্ট্রিমিং কেন। client.messages.stream টোকেনগুলো আসার সাথে সাথে প্রিন্ট করে, পুরো জেনারেশন শেষ না হওয়া পর্যন্ত নীরব থাকে না। এটি দীর্ঘ আউটপুটে HTTP টাইমআউট এড়ায় — ঠিক এই কারণেই নন-স্ট্রিমিং কলে SDK অত্যন্ত বড় max_tokens মানগুলো প্রত্যাখ্যান করে। যদি পরে আপনার অ্যাসেম্বল করা অবজেক্ট প্রয়োজন হয়, with ব্লকের ভেতরে stream.get_final_message() কল করুন।
এই এক্সেপশন ক্রম কেন। SDK টাইপ করা এক্সেপশন থ্রো করে, সবচেয়ে নির্দিষ্টটি আগে: RateLimitError হলো একটি 429 এবং এটি একটি retry-after হেডার বহন করে যা জানায় কতক্ষণ অপেক্ষা করতে হবে; APIStatusError অন্যান্য non-2xx রেসপন্স কভার করে (সার্ভার-সাইড সমস্যার জন্য e.status_code >= 500 দেখুন); APIConnectionError মানে অনুরোধের কোনো রেসপন্সই পাওয়া যায়নি। আর আপনি রিট্রাই লুপ তৈরি করার আগে: SDK নিজেই 429 এবং 5xx ত্রুটিগুলো রিট্রাই করে, ডিফল্টভাবে দুবার, এক্সপোনেনশিয়াল ব্যাকঅফ সহ (ক্লায়েন্টে max_retries)। আপনার except চলার সময়, রিট্রাইগুলো ইতিমধ্যেই শেষ — তাই একটি CLI-তে সঠিক পদক্ষেপ হলো রিপোর্ট করা এবং প্রস্থান করা, ঘুমানো এবং বারবার আঘাত করা নয়।
খরচ নিয়ন্ত্রণ
এটি একটি পৃথক বিভাগের যোগ্য, কারণ API-তে আপনি যা কনফিগার করেন তা ছাড়া কোনো অন্তর্নির্মিত মাসিক সীমা নেই, এবং এখানকার প্রতিটি ভুল নীরবে বহুগুণ হয়ে যায়।
max_tokens হলো আপনার প্রতি কলের খরচের সর্বোচ্চ সীমা। আউটপুট টোকেনই হলো ব্যয়বহুল দিক — Opus 4.8-এ এটি ইনপুট মূল্যের পাঁচ গুণ — এবং max_tokens হলো মডেল যতগুলো টোকেন তৈরি করতে পারে তার একটি কঠোর সীমা। একটি বেপরোয়া প্রম্পট আপনার অনুমোদিত পরিমাণের বেশি আউটপুটে খরচ করতে পারবে না। কাজ অনুযায়ী এর মান নির্ধারণ করুন: একটি লগ বিশ্লেষণের জন্য 1,500 যথেষ্ট; একটি শ্রেণিবিন্যাস কাজের জন্য 100 প্রয়োজন। যদি উত্তরগুলো stop_reason: "max_tokens" সহ মাঝ বাক্যে থেমে যায়, তবে আপনি সীমাটি খুব কম করে নির্ধারণ করেছেন — বিশাল মান ডিফল্ট হিসেবে ব্যবহার না করে সচেতনভাবে এটি বাড়ান।
পাঠানোর আগে গণনা করুন। ইনপুটেরও খরচ হয়, এবং লগগুলো বড় আকারের হয়। API-তে একটি গণনা এন্ডপয়েন্ট রয়েছে যা বিনামূল্যে ব্যবহার করা যায় (এর নিজস্ব রেট লিমিট রয়েছে, যা মেসেজ তৈরির থেকে আলাদা):
count = client.messages.count_tokens(
model="claude-opus-4-8",
messages=[{"role": "user", "content": big_log_text}],
)
print(count.input_tokens)দুর্ঘটনাক্রমে একটি 2 GB লগ টুলের মাধ্যমে পাঠানো রোধ করতে এটি ব্যবহার করুন। এই কাজে tiktoken ব্যবহার করবেন না — সেটি OpenAI-এর টোকেনাইজার, এবং এটি সাধারণ টেক্সটে Claude টোকেনের সংখ্যা প্রায় 15–20% কম গণনা করে, এবং কোডে আরও বেশি কম গণনা করে।
আনুগত্যের ভিত্তিতে নয়, কাজ অনুযায়ী মডেল বেছে নিন। 2026 সালের জুলাই পর্যন্ত, Opus 4.8 (claude-opus-4-8) প্রতি মিলিয়ন ইনপুট টোকেনে $5 এবং প্রতি মিলিয়ন আউটপুটে $25 খরচ করে; Haiku 4.5 (claude-haiku-4-5) 200K কন্টেক্সট সহ $1/$5; Sonnet 5 (claude-sonnet-5) মাঝামাঝি অবস্থানে $3/$15, এবং 2026 সালের 31 আগস্ট পর্যন্ত প্রাথমিক $2/$10 মূল্য প্রযোজ্য। সুনির্দিষ্টভাবে: একটি 2,000-টোকেন লগ অংশ এবং একটি 500-টোকেন উত্তর Opus-এ প্রায় $0.0225 এবং Haiku-তে $0.0045 খরচ করবে। আউটপুটের গুণমান বিচার করার সময় Opus দিয়ে শুরু করুন, তারপর একই প্রম্পট Haiku-তে চেষ্টা করুন — বেশি পরিমাণের, সাধারণ রূপান্তরের জন্য এটি প্রায়শই পঞ্চমাংশ মূল্যে আলাদা করা যায় না। এগুলো কোনো বাজেটে সরাসরি যুক্ত করার আগে বর্তমান সংখ্যাগুলো প্রাইসিং পেজে যাচাই করুন।
যা অপেক্ষা করতে পারে সবকিছুর জন্য Batches। Batches API অনুরোধগুলো অ্যাসিঙ্ক্রোনাসভাবে স্ট্যান্ডার্ড মূল্যের 50% হারে প্রক্রিয়া করে, এবং বেশিরভাগ ব্যাচ এক ঘণ্টার মধ্যে সম্পন্ন হয়। রাতের ডাইজেস্ট, ব্যাকফিল, বাল্ক শ্রেণিবিন্যাস — যেখানে কোনো মানুষ অপেক্ষা করছে না এমন সবকিছু সেখানেই রাখা উচিত।
পুনরাবৃত্ত কন্টেক্সটের জন্য প্রম্পট ক্যাশিং। যদি প্রতিটি কল একই বড় সিস্টেম প্রম্পট বা রানবুক পুনরায় পাঠায়, তবে এটি ক্যাশেযোগ্য হিসেবে চিহ্নিত করুন:
response = client.messages.create(
model="claude-opus-4-8",
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 onক্যাশ রাইট প্রায় 1.25x ইনপুট মূল্য, ক্যাশ রিড প্রায় 0.1x, একটি 5-মিনিটের TTL-এ — তাই উইন্ডোর মধ্যে দ্বিতীয় কলই প্রথম কলের খরচ পূরণ করে দেয়। দুটি সতর্কতা রয়েছে। ক্যাশ করা প্রিফিক্স অবশ্যই প্রতি-মডেল ন্যূনতম সীমা অতিক্রম করতে হবে — Opus-এ কয়েক হাজার টোকেন — তাই একটি ছোট সিস্টেম প্রম্পট নীরবে একেবারেই ক্যাশ হবে না। এবং যদি cache_read_input_tokens অভিন্ন কলগুলোতে শূন্য থাকে, তবে আপনার প্রিফিক্সের কিছু প্রতিটি অনুরোধে পরিবর্তিত হচ্ছে (একটি টাইমস্ট্যাম্প সাধারণত এর কারণ)।
কী ইনপুট হিসেবে গণ্য হয় তা মনে রাখুন। সিস্টেম প্রম্পট, টুল সংজ্ঞা, এবং — মাল্টি-টার্ন কথোপকথনে — প্রতি টার্নে আপনি যে সম্পূর্ণ ইতিহাস পুনরায় পাঠান তা সবই ইনপুট টোকেন হিসেবে বিল করা হয়। একটি চ্যাট লুপ যা কখনোই ইতিহাস ছাঁটে না তা খরচে দ্বিঘাত হারে বৃদ্ধি পায়। কোনো কনভার্সেশনাল বিষয় তৈরি করার আগে সম্পূর্ণ হিসাব বোঝা উচিত: Claude টোকেন ব্যবহার এবং বিলিং আসলে কীভাবে যোগ হয়।
systemd-এর অধীনে চালান
Environment-file নিয়ম মেনে চলার পুরস্কার: প্রতিদিন সকালে গতকালের ত্রুটিগুলি সংক্ষিপ্ত করে দেখানো একটি টাইমার।
# /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 অধিকারহীন explain ব্যবহারকারীতে নেমে যাওয়ার আগে root-এর মালিকানাধীন, mode-600 ফাইলটি পড়ে। ফলে প্রক্রিয়াটি ভেরিয়েবলটি পায়, কিন্তু ব্যবহারকারী কী ফাইলটি পড়তে পারে না। systemd-journal গ্রুপ লগ অ্যাক্সেস দেয়। একটি ম্যানুয়াল systemctl start দিয়ে পরীক্ষা করুন এবং journalctl -u log-digest.service পড়ুন — একটি টাইপো ধরতে 06:15 পর্যন্ত অপেক্ষা করবেন না। এই প্যাটার্ন যখন একটি shell pipeline-এর বাইরে বেড়ে যায়, তখন একই key-in-env-file পদ্ধতি সরাসরি একই বাক্সে Claude-চালিত n8n ওয়ার্কফ্লো-তে প্রয়োগ করা যায়।
বিভিন্ন ব্যর্থতার ধরন, এবং আপনি যে স্ট্রিংগুলো দেখবেন
কার্যকর key-তে 401। exception-টি এরকম:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}key-টি আপনার shell-এ কাজ করলেও service-টি যদি 401 দেয়, তার মানে service-টি key-টি পায়নি — systemd কখনো .bashrc পড়ে না; দেখে নিন EnvironmentFile= সঠিক path নির্দেশ করছে কি না। অন্য কারণ: env ফাইলে পেস্ট করা উদ্ধৃতি চিহ্ন (ANTHROPIC_API_KEY="sk-ant-..." — systemd উদ্ধৃতি চিহ্নগুলো বাদ দেয়, কিন্তু আপনার shell wrapper-এর . file অদ্ভুতভাবে উদ্ধৃতি দিলে সেগুলো value-তে রেখে দেয়), শেষে অতিরিক্ত whitespace, অথবা আপনি গত সপ্তাহে Console থেকে revoke করা একটি key।
model-এর টাইপোর কারণে 404। এর সবচেয়ে সাধারণ রূপ হলো একটি বর্তমান model ID-তে তারিখের সাফিক্স যোগ করা:
anthropic.NotFoundError: Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-opus-4-8-20260115'}, 'request_id': 'req_011CSJqymAvNw4bT3qmDdMbA'}বর্তমান প্রজন্মের ID-গুলো যেমন লেখা আছে ঠিক তেমনই — claude-opus-4-8, claude-haiku-4-5, claude-sonnet-5। সেগুলো models ডকুমেন্টেশন থেকে কপি করুন, মুখস্থ বা পুরোনো টিউটোরিয়াল থেকে নয়।
429 rate_limit_error। error টাইপের স্ট্রিং হলো rate_limit_error এবং response-এ একটি retry-after header থাকে যেখানে অপেক্ষা করার সময় সেকেন্ডে দেওয়া থাকে। আপনি exception-টি দেখার আগে SDK ইতিমধ্যে backoff সহ দুবার retry করেছে, তাই একটানা 429 মানে আপনার ধারাবাহিক rate সত্যিই আপনার tier-এর সীমা ছাড়িয়ে গেছে — কাজটি batch করুন বা ছড়িয়ে দিন, retry loop আরও কঠোর করবেন না।
এটি object প্রিন্ট করে, text নয়। আউটপুট দেখায় [TextBlock(citations=None, text='...', type='text')]। আপনি block গুলো iterate করে যেখানে block.type == "text" সেখান থেকে .text পড়ার বদলে response.content প্রিন্ট করেছেন। উপরের প্রতিটি SDK উদাহরণ এটি সঠিকভাবে করে; loop-টি কপি করুন।
error: externally-managed-environment। আপনি Ubuntu 24.04-এর system Python-এর বিরুদ্ধে pip install চালিয়েছেন। venv ব্যবহার করুন — আপনার গুরুত্বপূর্ণ কোনো server-এ কখনো --break-system-packages ব্যবহার করবেন না।
ছোট হয়ে যাওয়া উত্তর। response.stop_reason == "max_tokens" মানে model আপনার আউটপুট সীমায় পৌঁছে গেছে। এটি ডিজাইন অনুযায়ীই কাজ করছে; সীমাটি ইচ্ছাকৃতভাবে বাড়ান।
আপনার প্রথম app কাজ করা শুরু করলে, Claude দিয়ে একটি AI agent তৈরি করা সেই একই API call গুলোকে এমন একটি agent-এ রূপান্তর করে যা tool ব্যবহার করে।
FAQ
Claude API পরখ করতে কত খরচ হয়?
এই ধরনের একটি টুলের জন্য খরচ সত্যিই কম। 2026 সালের জুলাই পর্যন্ত, Opus 4.8-এর দাম প্রতি মিলিয়ন input token-এ $5 এবং প্রতি মিলিয়ন output token-এ $25। একটি সাধারণ লগ বিশ্লেষণে কয়েক হাজার token ইনপুট এবং কয়েক শত token আউটপুট হয়, যার খরচ প্রায় দুই সেন্ট। Haiku 4.5-এ ($1/$5) এই খরচ অর্ধ সেন্টেরও কম। প্রতিদিনের ডাইজেস্টের এক মাসের খরচ এক কাপ কফির চেয়েও কম। ঝুঁকি প্রতি কলের দামে নয়; ঝুঁকি হলো সীমাহীন লুপ এবং সীমাহীন max_tokens-এ। এই কারণেই এই গাইডে উভয়ের মান স্পষ্টভাবে নির্ধারণ করা হয়েছে।
Claude API-এর জন্য কোনো ফ্রি টিয়ার আছে কি?
2026 সালের জুলাই পর্যন্ত কোনো চলমান ফ্রি টিয়ার নেই। Anthropic-এর মূল্য নির্ধারণের ডকুমেন্টেশন অনুযায়ী, নতুন ব্যবহারকারীরা API পরীক্ষা করার জন্য সামান্য পরিমাণ ফ্রি ক্রেডিট পান। এটি এককালীন ট্রায়াল, যার সঠিক পরিমাণ সাইন আপের সময় Console-এ দেখানো হয়। এর পর আপনাকে অ্যাকাউন্টে টাকা যোগ করতে হবে। আপনার লক্ষ্য যদি অত্যাধুনিক গুণমানের চেয়ে প্রতিটি অনুরোধে শূন্য প্রান্তিক খরচ হয়, তবে বিকল্প হলো Ollama-এর সাথে একটি ওপেন-ওয়েট মডেল নিজে হোস্ট করা এবং token-এর বদলে RAM-এ মূল্য পরিশোধ করা।
সার্ভারে আমি কীভাবে আমার API key নিরাপদ রাখব?
কখনোই কোডে রাখবেন না, কখনোই git-এ রাখবেন না, কখনোই .bashrc থেকে এক্সপোর্ট করবেন না, এবং কখনোই এমন শেলে টাইপ করবেন না যেখানে history সংরক্ষিত হয়। এটি একটি root-মালিকানাধীন ফাইলে 600 অনুমতি সহ রাখুন, প্রতিটি প্রসেসে আলাদাভাবে লোড করুন — ইন্টারঅ্যাকটিভ ব্যবহারের জন্য একটি wrapper script, systemd-এর জন্য EnvironmentFile= — এবং প্রতি সার্ভার বা প্রজেক্টে একটি করে key ব্যবহার করুন। এতে ফাঁস হওয়া key বাতিল করা একটি সীমিত ক্ষতির মধ্যে থাকে, পুরো ব্যবস্থা অচল হয় না। key কখনো কোনো পেস্ট সাইট বা git commit-এ গেলে, অবিলম্বে Console থেকে তা বাতিল করুন; commit মুছে ফেললে ফাঁস পূর্বাবস্থায় ফিরে যায় না।
কোন Claude মডেল দিয়ে আমার শুরু করা উচিত?
প্রথমে claude-opus-4-8 দিয়ে শুরু করুন, যখন আপনি নির্ধারণ করছেন যে আউটপুটগুলি কাজে ব্যবহারের জন্য যথেষ্ট ভালো কিনা — আপনি সম্পূর্ণ গুণমানে ধারণাটি যাচাই করতে চান, এবং শখের মাত্রায় ব্যবহারে খরচের পার্থক্য মাত্র কয়েক সেন্ট। prompt একবার নির্ধারিত হলে, আপনার আসল ইনপুটগুলি claude-haiku-4-5-এ পুনরায় চালান; সারাংশ তৈরি, শ্রেণীবিভাগ এবং লগ ট্রায়েজের জন্য এটি প্রায়শই পাঁচ ভাগের এক ভাগ দামে সমানভাবে ভালো। Haiku বা Sonnet-এ স্থানান্তর করুন পরিমাপের ভিত্তিতে, অভ্যাসবশত নয়।