آموزش استفاده از Claude API در VPS
نحوه ساخت اپلیکیشن Python برای تحلیل log در Ubuntu 24.04، مدیریت streaming و کنترل هزینه با Claude API را در این آموزش گامبهگام بیاموزید.
آنچه در حال ساخت آن هستید
یک ابزار خط فرمان روی یک VPS تازه با Ubuntu 24.04 که پیام خطا یا بخشی از یک log را به آن pipe میکنید و در مقابل، یک تشخیص به زبان ساده دریافت میکنید: journalctl -u nginx -n 50 | explain. این پروژه احتمالاً حدود 60 خط کد Python است و تمام موارد مورد نیاز یک اپلیکیشن واقعی Claude API را شامل میشود: یک key که به درستی ذخیره شده است، یک virtualenv، ساختار پاسخهای SDK، قابلیت streaming، زنجیره exception تایپشده، و یک systemd unit تا برنامه بدون دخالت شما اجرا شود.
من این پروژه را آگاهانه انتخاب کردم. اکثر آموزشهای «اولین اپلیکیشن API» از شما میخواهند یک chatbot بسازید که دیگر هرگز آن را باز نخواهید کرد. یک log explainer از همان روز اول در یک سرور کاربرد دارد و شما را با دو موردی که مبتدیها واقعاً اشتباه انجام میدهند، روبرو میکند: خواندن صحیح response object و کنترل هزینهها. صورتحساب API بر اساس token است و هیچ سقفی جز آنچه شما تعیین میکنید ندارد؛ بنابراین کنترل هزینه در اینجا یک ورودی طراحی است، نه یک موضوع ثانویه — همان انضباطی که هنگام انتقال به running Claude Code on this same VPS in tmux اهمیت پیدا میکند.
دریافت API key از Console
دسترسی API در Anthropic Console در آدرس platform.claude.com مدیریت میشود — ابتدا ثبتنام کنید و سپس در مسیر Settings → API Keys یک کلید بسازید (لینک مستندات مستقیماً به platform.claude.com/settings/keys اشاره دارد). کلید تنها یک بار نمایش داده میشود، با sk-ant- شروع میشود و امکان بازیابی مجدد آن وجود ندارد — بلافاصله آن را کپی کنید یا آن را حذف و دوباره بسازید.
در مورد هزینهها: تا جولای 2026، هیچ طرح رایگان دائمی برای API وجود ندارد. طبق مستندات قیمتگذاری Anthropic، کاربران جدید مقدار کمی اعتبار رایگان برای تست دریافت میکنند؛ مقدار دقیق همان چیزی است که در هنگام ثبتنام در Console به شما نمایش داده میشود. پس از اتمام این اعتبار، برای موفقیتآمیز بودن درخواستها باید حساب خود را شارژ کنید. این موضوع با اشتراک claude.ai متفاوت است — طرحهای Pro یا Max شامل اعتبار API نمیشوند و داشتن API key به معنای دسترسی به اپلیکیشن چت نیست. اگر در حال مقایسه اشتراک با API هستید، این موضوع بحث جداگانهای است: کدام طرح Claude را واقعاً نیاز دارید.
کلید را محدود به یک پروژه یا سرور خاص بسازید. وقتی یک کلید لو میرود — و در بازه زمانی طولانی، این اتفاق رخ خواهد داد — شما باید بتوانید آن را بدون از کار انداختن سایر بخشهای خود، لغو (revoke) کنید.
کلید را در .bashrc نگه ندارید
استفاده از روش بازگشتی (reflexive move) در export ANTHROPIC_API_KEY=sk-ant-... در ~/.bashrc انجام میشود. این کار را انجام ندهید. این کار سه مشکل مجزا ایجاد میکند:
- هر فرآیند آن را به ارث میبرد. یک متغیر محیطی که در shell هنگام ورود (login shell) export شده است، به هر چیزی که اجرا میکنید منتقل میشود؛ از اپلیکیشن وب گرفته تا گزارشگر خطا که محیط خود را در گزارش باگ قرار میدهد، و صفحه
phpinfo()که کسی آن را فعال گذاشته است. سطح قرارگیری کلید (exposure surface) به "هر چیزی که این کاربر اجرا میکند" تبدیل میشود. - تایپ کردن آن در
~/.bash_historyذخیره میشود. اگر دستور export را یک بار به صورت دستی اجرا کنید، کلید شما برای همیشه در یک فایل متنی (plaintext) باقی میماند و در تمام نسخههای پشتیبان (backup) پوشه home شما همگامسازی میشود. - هنگامی که systemd به آن نیاز دارد، در دسترس نیست. سرویسها فایل
.bashrcشما را نمیخوانند؛ بنابراین این الگو دقیقاً زمانی که اسکریپت را به یک unit ارتقا میدهید، شکست میخورد — که معمولاً منجر به خطای مرموز 401 در ساعت 6 a.m. میشود.
الگوی صحیح در یک سرور، استفاده از یک فایل محیطی اختصاصی با دسترسیهای 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اگر میخواهید کلید را از فایلهای swap ادیتور دور نگه دارید، به جای ادیتور از printf برای استفاده از tee استفاده کنید؛ در هر صورت، با استفاده از ls -l /etc/claude-explain.env بررسی کنید که فایل -rw------- را میخواند و مالک آن root است. شلهای تعاملی (Interactive shells) کلید را در هر فراخوانی از طریق یک wrapper (در ادامه) دریافت میکنند، و systemd آن را از طریق EnvironmentFile= دریافت میکند — کاربر root فایل را قبل از کاهش سطح دسترسی (dropping privileges) میخواند، بنابراین کاربرِ سرویس هرگز به دسترسی خواندن آن نیاز ندارد. کلید هرگز در کد، در git، در خروجی ps، یا در تاریخچه شل (shell history) ظاهر نمیشود.
Install the SDK in a venv
در Ubuntu 24.04، پایتون 3.12 با قابلیت enforcement مربوط به PEP 668 عرضه میشود؛ بنابراین اجرای مستقیم pip install anthropic روی مفسر سیستم با خطای error: externally-managed-environment مواجه میشود. این خطا نشاندهنده عملکرد صحیح سیستمعامل است — از یک 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 استفاده میکند.
اولین فراخوانی و خواندن صحیح پاسخ
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)دو مورد در این 12 خط، بخش اصلی مدل ذهنی این API را تشکیل میدهند. اول، استفاده از anthropic.Anthropic() بدون آرگومان که کلید را از environment میخواند؛ هرگز آن را به صورت یک string literal پاس ندهید. دوم، response.content یک list از content blocks است، نه یک string. اگر آن را مستقیماً چاپ کنید، با خروجی کلاسیک مبتدیان مواجه میشوید:
[TextBlock(citations=None, text='A systemd unit file is...', type='text')]این یک bug نیست؛ بلکه repr مربوط به آن object است. پاسخها میتوانند شامل انواع مختلفی از blockها باشند (text، tool calls، thinking)، بنابراین باید با استفاده از یک حلقه، ابتدا block.type == "text" را بررسی کنید و سپس به سراغ .text بروید. اگر از همان روز اول این حلقه را پیادهسازی کنید، از بروز یک دسته کامل از سردرگمیهای «خروجیها نامفهوم هستند» جلوگیری میکنید.
از model ID دقیق یعنی claude-opus-4-8 استفاده کنید. شناسههای نسل فعلی فاقد تاریخ هستند؛ از عادت قبلی خود (یا پستهای قدیمی بلاگ) که میگوید باید یک پسوند تاریخ به آن اضافه کنید، خودداری کنید؛ این کار باعث خطای 404 میشود که در ادامه توضیح داده شده است.
ابزار اصلی: توضیح
در اینجا برنامه کامل قرار دارد — ورودی از stdin، خروجی تشخیص (diagnosis) به صورت استریم، و مدیریت خطاها:
#!/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 ذخیره کنید، سپس یک 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 باید متعلق به گروهی باشد که کاربر admin شما در آن عضو است — به جای تغییر سطح دسترسی فایل به 644، یکی از این دو روش را با دقت انتخاب کنید.)
دلیل استفاده از استریم. client.messages.stream توکنها را به محض رسیدن چاپ میکند، به جای اینکه تا پایان تولید منتظر بماند؛ این کار از بروز timeout در HTTP برای خروجیهای طولانی جلوگیری میکند — دقیقاً به همین دلیل، SDK مقادیر بسیار بزرگ max_tokens را در فراخوانیهای غیر استریم رد میکند. اگر بعداً به شیء کامل نیاز دارید، stream.get_final_message() را داخل بلوک with فراخوانی کنید.
دلیل ترتیب استثناها. SDK استثناهای تایپشده پرتاب میکند و اولویت با جزئیترین استثناست: RateLimitError یک خطای 429 است و شامل هدر retry-after است که مدت زمان انتظار را به شما اعلام میکند؛ APIStatusError سایر پاسخهای غیر 2xx را پوشش میدهد (برای مشکلات سمت سرور e.status_code >= 500 را بررسی کنید)؛ APIConnectionError به این معناست که درخواست اصلاً پاسخی دریافت نکرده است. و قبل از اینکه یک حلقه بازگشتی (retry loop) بسازید: خودِ SDK خطاهای 429 و 5xx را بازگشت میدهد؛ به صورت پیشفرض دو بار با الگوی exponential backoff (در max_retries سمت کلاینت). زمانی که except شما اجرا میشود، تلاشهای بازگشتی تمام شدهاند — بنابراین در یک CLI، اقدام درست گزارش خطا و خروج است، نه توقف و ارسال درخواستهای مکرر.
کنترل هزینه
این موضوع نیاز به یک بخش مجزا دارد؛ زیرا API فراتر از تنظیمات شما، هیچ سقف ماهانه داخلی ندارد و هر اشتباه در اینجا به صورت بیصدا انباشته میشود.
max_tokens سقف هزینه شما به ازای هر فراخوانی است. توکنهای خروجی گرانتر هستند — در مدل Opus 4.8، قیمت آنها 5 برابر قیمت ورودی است — و max_tokens یک سقف سخت برای تعداد توکنهای تولید شده توسط مدل است. یک پرامپت کنترلنشده نمیتواند بیشتر از مقدار مجاز خروجی هزینه داشته باشد. اندازه آن را متناسب با کار تنظیم کنید: مقدار 1,500 برای عیبیابی یک لاگ کافی است؛ یک وظیفه طبقهبندی (classification) به 100 نیاز دارد. اگر پاسخها با خطای stop_reason: "max_tokens" در میان جمله متوقف شدند، یعنی سقف را خیلی کم تنظیم کردهاید — به جای استفاده از مقادیر پیشفرض بسیار بزرگ، آن را آگاهانه افزایش دهید.
قبل از ارسال، تعداد را محاسبه کنید. ورودی نیز هزینه دارد و لاگها حجم بالایی دارند. این API یک endpoint برای شمارش دارد که استفاده از آن رایگان است (این endpoint محدودیتهای نرخ مجزایی نسبت به ایجاد پیام دارد):
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 است و در متنهای معمولی حدود 15–20% و در کدها بیشتر از توکنهای Claude کمتر محاسبه میکند.
مدل را بر اساس وظیفه انتخاب کنید، نه بر اساس وفاداری. تا جولای 2026، مدل Opus 4.8 (claude-opus-4-8) با قیمت 5 دلار به ازای هر میلیون توکن ورودی و 25 دلار به ازای هر میلیون توکن خروجی فعالیت میکند؛ مدل Haiku 4.5 (claude-haiku-4-5) با قیمت 1/5 دلار و کانتکست 200K؛ مدل Sonnet 5 (claude-sonnet-5) با قیمت 3/15 دلار در این میان قرار دارد که تا 31 August 2026 قیمت آزمایشی 2/10 دلار را ارائه میدهد. به صورت مشخص: یک قطعه لاگ 2,000 توکنی با یک پاسخ 500 توکنی، در مدل Opus حدود 0.0225 دلار و در مدل Haiku حدود 0.0045 دلار هزینه دارد. در حالی که کیفیت خروجی را بررسی میکنید از Opus شروع کنید، سپس همان پرامپتها را روی Haiku امتحان کنید — برای تبدیلهای ساده و با حجم بالا، نتایج اغلب با یک پنجم قیمت، غیرقابل تشخیص هستند. قبل از ثبت قطعی این اعداد در بودجه، مقادیر فعلی را در صفحه قیمتگذاری بررسی کنید.
برای کارهایی که میتوانند منتظر بمانند، از Batches استفاده کنید. Batches API درخواستها را به صورت ناهمگام (asynchronous) با 50% قیمت استاندارد پردازش میکند و اکثر Batchها در کمتر از یک ساعت تکمیل میشوند. خلاصههای شبانه، پر کردن دادههای قدیمی (backfills)، طبقهبندی انبوه — هر چیزی که منتظر پاسخ انسانی نیست، متعلق به این بخش است.
استفاده از Prompt caching برای کانتکستهای تکراری. اگر هر فراخوانی، همان پرامپت سیستمی بزرگ یا دفترچه راهنما را دوباره ارسال میکند، آن را قابل کش کردن (cacheable) علامتگذاری کنید:
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.25 برابر قیمت ورودی و هزینه خواندن از کش حدود 0.1 برابر است (با TTL مدت 5 دقیقه) — بنابراین فراخوانی دوم در این بازه زمانی، هزینه فراخوانی اول را پوشش میدهد. دو نکته وجود دارد. پیشوند کش شده باید از حداقل مشخص شده برای هر مدل عبور کند — چند هزار توکن در Opus — بنابراین یک پرامپت سیستمی کوتاه ممکن است اصلاً کش نشود. و اگر cache_read_input_tokens در فراخوانیهای یکسان صفر باقی ماند، یعنی چیزی در پیشوند شما در هر درخواست تغییر میکند (معمولاً یک Timestamp مقصر است).
به یاد داشته باشید چه چیزی به عنوان ورودی محاسبه میشود. پرامپتهای سیستمی، تعاریف ابزارها، و — در گفتگوهای چند مرحلهای — کل تاریخچهای که در هر مرحله دوباره ارسال میکنید، همگی به عنوان توکنهای ورودی محاسبه میشوند. یک حلقه چت که هرگز تاریخچه را کوتاه (trim) نکند، هزینه آن به صورت تصاعدی رشد میکند. درک کامل محاسبات قبل از ساخت هر سیستم گفتگویی ضروری است: نحوه محاسبه واقعی مصرف توکن و صورتحساب 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 فایل با مالکیت root و mode-600 را قبل از تغییر سطح دسترسی به کاربر غیرمجاز explain میخواند؛ بنابراین فرآیند متغیر را دریافت میکند، در حالی که کاربر نمیتواند فایل کلید را بخواند. گروه systemd-journal دسترسی به log را فراهم میکند. با یک systemctl start دستی تست کنید و journalctl -u log-digest.service را بخوانید — برای پیدا کردن یک غلط تایپی منتظر ساعت 06:15 نمانید. وقتی این الگو از یک shell pipeline فراتر رفت، همین روش استفاده از فایل محیطی برای کلیدها، مستقیماً در workflowهای n8n مبتنی بر Claude در همان سیستم قابل استفاده است.
حالتهای خطا و رشتههای نمایش داده شده
خطای 401 با وجود معتبر بودن کلید. متن خطا به این صورت است:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}اگر کلید در shell شما کار میکند اما سرویس خطای 401 میدهد، یعنی سرویس هرگز آن را دریافت نکرده است — به یاد داشته باشید که systemd فایل .bashrc را نمیخواند؛ بررسی کنید که EnvironmentFile= به مسیر صحیح اشاره کند. سایر دلایل: وجود علامتهای نقلقول (quotes) در فایل env (در ANTHROPIC_API_KEY="sk-ant-..."، systemd آنها را حذف میکند، اما اگر از روش اشتباهی استفاده کرده باشید، . file در wrapperِ shell شما آنها را در مقدار نگه میدارد)، وجود فاصله (whitespace) در انتهای خط، یا کلیدی که هفته گذشته در Console لغو (revoke) کردهاید.
خطای 404 ناشی از غلط املایی در نام مدل. رایجترین حالت این خطا، اضافه کردن پسوند تاریخ به ID مدل فعلی است:
anthropic.NotFoundError: Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-opus-4-8-20260115'}, 'request_id': 'req_011CSJqymAvNw4bT3qmDdMbA'}شناسههای نسل فعلی دقیقاً مطابق با آنچه نوشته شده هستند — claude-opus-4-8، claude-haiku-4-5، claude-sonnet-5. آنها را مستقیماً از مستندات مدلها کپی کنید، هرگز از حافظه یا آموزشهای قدیمی استفاده نکنید.
خطای 429 rate_limit_error. رشته نوع خطا rate_limit_error است و پاسخ شامل یک header به نام retry-after شامل تعداد ثانیههای مورد نیاز برای انتظار است. SDK پیش از اینکه شما با این استثنا مواجه شوید، دو بار با استفاده از استراتژی backoff تلاش مجدد انجام داده است؛ بنابراین وجود مداوم خطای 429 به این معناست که نرخ درخواستهای شما واقعاً از سقف مجاز سطح (tier) شما فراتر رفته است — کارها را دستهبندی (batch) کنید یا در زمان پخش کنید، حلقه تلاش مجدد (retry loop) را فشرده نکنید.
چاپ شدن شیء (object) به جای متن. خروجی شبیه به [TextBlock(citations=None, text='...', type='text')] است. شما به جای پیمایش بلوکها و خواندن .text از بلوکهایی که block.type == "text" هستند، از response.content استفاده کردهاید. تمام مثالهای SDK در بالا این کار را به درستی انجام میدهند؛ از همان حلقه (loop) کپی کنید.
error: externally-managed-environment. شما pip install را روی Python سیستمی Ubuntu 24.04 اجرا کردهاید. از venv استفاده کنید — هرگز از --break-system-packages روی سروری که برای آن اهمیت قائل هستید، استفاده نکنید.
پاسخهای ناقص (Truncated). response.stop_reason == "max_tokens" به این معناست که مدل در میانهی پردازش به سقف خروجی (output cap) شما رسیده است. این رفتار طبق طراحی است؛ سقف خروجی را آگاهانه افزایش دهید.
وقتی اولین اپلیکیشن خود را راهاندازی کردید، ساخت یک عامل هوش مصنوعی با Claude همان فراخوانیهای API را به عاملی تبدیل میکند که از ابزارها (tools) استفاده میکند.
FAQ
هزینه استفاده از Claude API چقدر است؟
برای ابزاری با این قابلیت، هزینه بسیار ناچیز است. در جولای 2026، مدل Opus 4.8 برای هر یک میلیون توکن ورودی 5 دلار و برای هر یک میلیون توکن خروجی 25 دلار هزینه دارد؛ بنابراین یک عیبیابی معمولی در لاگها — شامل چند هزار توکن ورودی و چند صد توکن خروجی — حدود 2 سنت هزینه دارد. در مدل Haiku 4.5 (با قیمت 1/5 دلار) این هزینه کمتر از نصف یک سنت است. هزینه یک ماه استفاده روزانه از خلاصهها، کمتر از قیمت یک فنجان قهوه است. ریسک اصلی قیمت هر فراخوانی نیست؛ بلکه حلقههای بیانتها و max_tokens نامحدود است، به همین دلیل در این راهنما هر دو مورد را به صورت صریح تنظیم میکنیم.
آیا نسخه رایگان برای Claude API وجود دارد؟
تا جولای 2026، هیچ طرح رایگان دائمی وجود ندارد. طبق مستندات قیمتگذاری Anthropic، کاربران جدید مقدار کمی اعتبار رایگان برای تست API دریافت میکنند — یک دوره آزمایشی یکباره که مقدار دقیق آن در هنگام ثبتنام در Console نمایش داده میشود — و پس از آن باید حساب را شارژ کنید. اگر هدف شما به جای کیفیت پیشرو، هزینه نهایی صفر در هر درخواست است، جایگزین دیگر میزبانی خودکار یک مدل open-weight با Ollama و پرداخت هزینه به جای توکن، با RAM است.
چگونه کلید API خود را در سرور ایمن نگه دارم؟
هرگز آن را در کد، در git، در خروجیهای .bashrc و هرگز در shell که تاریخچه (history) آن را ذخیره میکند، تایپ نکنید. کلید را در فایلی با مالکیت root و دسترسیهای 600 قرار دهید. آن را به صورت per-process بارگذاری کنید — از یک اسکریپت wrapper برای استفاده تعاملی و از EnvironmentFile= برای systemd استفاده کنید. برای هر سرور یا پروژه فقط از یک کلید استفاده کنید تا در صورت لو رفتن، لغو کردن کلید مانند یک جراحی دقیق باشد، نه قطع عضو. اگر کلید شما در یک سایت Paste یا یک git commit قرار گرفت، بلافاصله آن را در Console لغو کنید؛ حذف کردن commit باعث رفع نشت کلید نمیشود.
با کدام مدل Claude شروع کنم؟
تا زمانی که در حال ارزیابی کیفیت خروجیها برای ساخت محصول هستید، با claude-opus-4-8 شروع کنید — شما باید ایده خود را با کیفیت کامل بسنجید و در حجم استفاده شخصی، تفاوت هزینه فقط در حد چند سنت است. پس از نهایی شدن prompt، ورودیهای واقعی خود را روی claude-haiku-4-5 اجرا کنید؛ برای خلاصهسازی، طبقهبندی و بررسی لاگها، این مدل اغلب با یک پنجم قیمت، همان کیفیت را ارائه میدهد. انتقال به Haiku یا Sonnet را بر اساس اندازهگیری و سنجش انجام دهید، نه به صورت پیشفرض.