شرح Claude API: ابنِ أول تطبيق على VPS
تعلّم إنشاء مفتاح Claude API وتأمينه على Ubuntu 24.04، ثم ابنِ أداة Python تشرح السجلات مع البث ومعالجة الأخطاء والتحكم الفعلي في التكلفة.
ما الذي ستبنيه
أداة تعمل من سطر الأوامر على VPS جديد بنظام Ubuntu 24.04. تمرّر إليها رسالة خطأ أو جزءاً من سجل، فتحصل على تشخيص باللغة الإنجليزية المبسطة: journalctl -u nginx -n 50 | explain. يتكوّن المشروع من نحو ستين سطراً من Python، ويطبّق كل ما تحتاج إليه أي أداة حقيقية تستخدم Claude API: تخزين المفتاح بطريقة صحيحة، وإنشاء virtualenv، وفهم أشكال الاستجابة في SDK، والبث، وتسلسل الاستثناءات المعرّفة بالأنواع، وإنشاء وحدة systemd لتعمل الأداة دون تدخل منك.
اخترت هذا المشروع عمداً. تطلب منك معظم دروس "أول تطبيق API" إنشاء chatbot لن تفتحه مرة أخرى. أما أداة شرح السجلات فتثبت فائدتها على الخادم منذ اليوم الأول، وتدفعك إلى معالجة الأمرين اللذين يخطئ فيهما المبتدئون فعلياً: قراءة كائن الاستجابة بطريقة صحيحة، والتحكم في الإنفاق. تحاسبك API حسب عدد الرموز، ولا يوجد سقف للإنفاق سوى الحدود التي تضعها أنت. لذلك يُعد التحكم في التكلفة جزءاً من تصميم هذه الأداة، وليس أمراً لاحقاً. وينطبق الانضباط نفسه عندما تنتقل إلى تشغيل Claude Code على VPS نفسه داخل tmux.
احصل على مفتاح API من Console
تُدار صلاحيات API في Anthropic Console على platform.claude.com. أنشئ حساباً، ثم أنشئ مفتاحاً من Settings → API Keys، إذ تشير الوثائق مباشرةً إلى platform.claude.com/settings/keys. يظهر المفتاح مرة واحدة، ويبدأ بـ sk-ant-، ولا يمكن استعادته لاحقاً. انسخه فوراً، أو احذفه وأنشئ مفتاحاً جديداً.
في ما يتعلق بالتكلفة: اعتباراً من July 2026، لا توجد طبقة مجانية مستمرة لـ API. توضّح وثائق تسعير Anthropic أن المستخدمين الجدد يحصلون على مقدار صغير من الرصيد المجاني للاختبار. ويكون المقدار الدقيق هو ما تعرضه Console عند التسجيل. بعد نفاد هذا الرصيد، يجب تمويل الحساب قبل أن تنجح الطلبات. هذا منفصل عن اشتراك claude.ai. لا تتضمن خطة Pro أو Max رصيداً لـ API، كما أن مفتاح API لا يمنحك تطبيق المحادثة. إذا كنت تقارن بين الاشتراك وAPI، فهذا موضوع مستقل: خطة Claude التي تحتاجها فعلاً.
أنشئ المفتاح بحيث يقتصر نطاقه على مشروع أو خادم واحد. عندما يتسرب مفتاح، وسيحدث ذلك في نهاية المطاف إذا طال الوقت بما يكفي، ستحتاج إلى إبطاله دون تعطيل كل ما تملكه.
أبقِ المفتاح خارج .bashrc
الخطوة التلقائية هي export ANTHROPIC_API_KEY=sk-ant-... في ~/.bashrc. لا تفعل ذلك. توجد 3 مشكلات منفصلة:
- كل عملية ترثه. ينتقل متغير البيئة المُصدَّر في shell تسجيل الدخول إلى كل ما تشغّله، بما في ذلك تطبيق الويب، وأداة الإبلاغ عن الأعطال التي تفرغ بيئتها في تقرير خطأ، وصفحة
phpinfo()التي تركها أحدهم مفعّلة. يصبح نطاق تعرّض المفتاح هو «كل ما يشغّله هذا المستخدم». - كتابته تضعه في
~/.bash_history. شغّل أمر التصدير يدوياً مرة واحدة، فيستقر مفتاحك في ملف نص عادي إلى الأبد، وتتم مزامنته مع كل نسخة احتياطية من مجلد home الخاص بك. - لا يكون موجوداً عندما يحتاج إليه systemd. لا تقرأ الخدمات ملف
.bashrcالخاص بك، لذلك يفشل هذا النمط بالضبط عند تحويل script إلى unit، ويظهر ذلك عادةً كخطأ 401 غامض عند الساعة 6 صباحاً.
النمط الصحيح على الخادم هو استخدام ملف بيئة مخصص بصلاحيات 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استخدم tee من خلال printf بدلاً من محرر إذا أردت إبقاء المفتاح خارج ملفات swap الخاصة بالمحرر. وفي كلتا الحالتين، تحقق باستخدام ls -l /etc/claude-explain.env من أنه يقرأ -rw------- وأن مالكه هو root. تحصل interactive shells على المفتاح عند كل استدعاء من خلال wrapper، كما هو موضح أدناه، ويحصل عليه systemd عبر EnvironmentFile=. يقرأ root الملف قبل إسقاط الصلاحيات، لذلك لا يحتاج مستخدم الخدمة إلى صلاحية قراءته. لا يظهر المفتاح مطلقاً في الشفرة، أو git، أو مخرجات ps، أو سجل shell.
تثبيت SDK في venv
يأتي Ubuntu 24.04 مع Python 3.12 وتفعيل تطبيق 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لا تحتاج إلى خطوات تفعيل خاصة على الخادم: يؤدي استدعاء /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')]هذا ليس خطأً، بل هو التمثيل النصي للكائن. يمكن أن تحتوي الاستجابات على أنواع متعددة من الكتل، مثل النص واستدعاءات الأدوات والتفكير. لذلك كرّر على الكتل وتحقّق من block.type == "text" قبل الوصول إلى .text. أضف هذه الحلقة منذ اليوم الأول، ولن تواجه فئة كاملة من الالتباس المرتبط بظهور مخرجات غير مفهومة.
استخدم معرّف النموذج الدقيق claude-opus-4-8. معرّفات الجيل الحالي لا تتضمن تاريخاً. لا تتبع العادة التي تدفعك، أو منشور المدونة القديم، إلى إلحاق لاحقة تاريخية بها. فهذا يؤدي إلى خطأ 404، كما سيأتي شرحه أدناه.
الأداة الفعلية: شرح
إليك البرنامج كاملاً. يقرأ من 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، أو يجب أن يكون لملف البيئة مجموعة ينتمي إليها المستخدم الإداري. اختر أحد الخيارين عمداً بدلاً من تخفيف صلاحيات الملف إلى 644.)
سبب استخدام التدفق. يطبع client.messages.stream الرموز فور وصولها بدلاً من الانتظار بصمت حتى يكتمل التوليد، كما يتجنب مهلات HTTP عند إخراج النتائج الطويلة. ويرفض SDK فعلياً قيم max_tokens الكبيرة جداً في الطلبات غير المتدفقة للسبب نفسه. إذا احتجت إلى الكائن المُجمَّع بعد ذلك، فاستدعِ stream.get_final_message() داخل كتلة with.
سبب ترتيب الاستثناءات. يرفع SDK استثناءات ذات أنواع محددة، بدءاً بالأكثر تخصيصاً: يشير RateLimitError إلى حالة 429 ويحمل ترويسة retry-after التي تحدد مدة الانتظار؛ ويغطي APIStatusError استجابات 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% في النصوص المعتادة، وبنسبة أكبر في التعليمات البرمجية.
اختر النموذج لكل مهمة، لا بدافع الولاء. اعتباراً من July 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، مع أسعار تمهيدية تبلغ $2/$10 حتى August 31, 2026. عملياً، تبلغ تكلفة مقتطف سجل من 2,000 رمز مع إجابة من 500 رمز نحو $0.0225 على Opus و$0.0045 على Haiku. ابدأ بـ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 دقائق. لذلك يغطي الاستدعاء الثاني خلال هذه المدة تكلفة الاستدعاء الأول بالفعل. انتبه إلى نقطتين. يجب أن يتجاوز الجزء الأول المخزّن مؤقتاً حداً أدنى يختلف حسب النموذج، ويبلغ بضعة آلاف من الرموز في Opus، وإلا فلن يُخزّن موجّه النظام القصير مؤقتاً بصمت. وإذا ظل cache_read_input_tokens صفراً عبر استدعاءات متطابقة، فهذا يعني أن شيئاً في الجزء الأول يتغير مع كل طلب؛ ويكون الطابع الزمني هو السبب المعتاد.
تذكّر ما يُحتسب ضمن الإدخال. تُحتسب موجّهات النظام، وتعريفات الأدوات، وفي المحادثات متعددة الأدوار، كامل السجل الذي تعيد إرساله في كل دور، كلها كرموز إدخال. وتزداد تكلفة حلقة المحادثة التي لا تحذف من السجل بمرور الوقت بشكل تربيعي. من المفيد فهم الحساب الكامل قبل إنشاء أي نظام حواري: كيف يُحتسب استخدام Claude للرموز وتكلفته فعلياً.
شغِّله ضمن systemd
الفائدة العملية للانضباط في استخدام ملف البيئة هي مؤقّت يلخّص أخطاء اليوم السابق كل صباح.
# /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 صلاحية الوصول إلى السجلات. اختبر باستخدام systemctl start يدوياً واقرأ journalctl -u log-digest.service، ولا تنتظر حتى 06:15 لاكتشاف خطأ مطبعي. عندما يتجاوز هذا النمط إمكانات pipeline من shell، تنتقل طريقة المفتاح نفسها داخل ملف البيئة مباشرة إلى سير عمل n8n المدعوم من Claude على الخادم نفسه.
أنماط الفشل، مع النصوص التي ستظهر لك
401 مع مفتاح صالح. يظهر الاستثناء بالنص التالي:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}إذا كان المفتاح يعمل في الصدفة لديك، لكن الخدمة تُرجع 401، فهذا يعني أن الخدمة لم تستلمه. تذكّر أن systemd لا يقرأ .bashrc؛ تحقّق من أن EnvironmentFile= يشير إلى المسار الصحيح. تشمل الأسباب الأخرى لصق علامات الاقتباس داخل ملف البيئة (ANTHROPIC_API_KEY="sk-ant-..."؛ إذ يزيل systemd علامات الاقتباس، لكن . file في غلاف الصدفة يبقيها ضمن القيمة إذا أضفت علامات الاقتباس بطريقة غير صحيحة)، أو وجود مسافات بيضاء في نهاية السطر، أو استخدام مفتاح ألغيتَه من Console الأسبوع الماضي.
404 بسبب خطأ إملائي في معرّف النموذج. أكثر أشكال هذا الخطأ شيوعاً هو إضافة لاحقة التاريخ إلى معرّف نموذج حالي:
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، وتتضمن الاستجابة ترويسة retry-after التي تحدد عدد الثواني الواجب انتظارها. نفّذ SDK إعادة المحاولة مرتين مع backoff قبل ظهور الاستثناء لديك، لذلك تعني أخطاء 429 المستمرة أن معدل الطلبات الفعلي لديك يتجاوز مستوى tier الخاص بك. اجمع العمل في دفعات أو وزّعه زمنياً، ولا تقلّل فترة إعادة المحاولة.
يطبع الكائن بدلاً من النص. يبدو الناتج مثل [TextBlock(citations=None, text='...', type='text')]. لقد طبعت response.content بدلاً من التكرار على الكتل وقراءة .text من الكتل التي يكون فيها block.type == "text". تنفّذ كل أمثلة SDK أعلاه ذلك بصورة صحيحة؛ انسخ الحلقة.
error: externally-managed-environment. شغّلت pip install باستخدام Python النظام في Ubuntu 24.04. استخدم venv، ولا تستخدم --break-system-packages مطلقاً على خادم مهم.
إجابات مبتورة. يعني response.stop_reason == "max_tokens" أن النموذج بلغ حد الإخراج الذي حددته أثناء توليد الإجابة. هذا سلوك متوقع؛ ارفع الحد عن قصد.
بعد أن يعمل تطبيقك الأول، يتيح لك إنشاء وكيل AI باستخدام Claude تحويل استدعاءات API نفسها إلى وكيل يستخدم الأدوات.
FAQ
ما تكلفة تجربة Claude API؟
التكلفة منخفضة فعلاً بالنسبة إلى أداة كهذه. اعتباراً من July 2026، تبلغ تكلفة Opus 4.8 مبلغ $5 لكل مليون token من الإدخال و$25 لكل مليون token من الإخراج. لذلك تكلف عملية تشخيص نموذجية لسجل، تتضمن إدخال بضعة آلاف من token وإخراج بضع مئات منها، نحو سنتين. ومع Haiku 4.5 ($1/$5)، تقل التكلفة عن نصف سنت. وتكلفة الملخصات اليومية لمدة شهر أقل من تكلفة قهوة. لا يكمن الخطر في سعر الطلب الواحد، بل في الحلقات غير المحدودة وmax_tokens غير المحدود، ولذلك تُضبط القيمتان صراحةً في هذا الدليل.
هل توجد فئة مجانية لـ Claude API؟
لا توجد فئة مجانية مستمرة اعتباراً من July 2026. توضح وثائق تسعير Anthropic أن المستخدمين الجدد يحصلون على قدر صغير من الرصيد المجاني لاختبار API، في تجربة لمرة واحدة. ويظهر المبلغ الدقيق في Console عند التسجيل، وبعد ذلك تموّل الحساب. إذا كان هدفك هو انعدام التكلفة الحدّية لكل طلب، وليس الحصول على أعلى جودة متاحة، فالبديل هو استضافة نموذج مفتوح الأوزان ذاتياً باستخدام Ollama ودفع التكلفة من ذاكرة RAM بدلاً من token.
كيف أحافظ على أمان مفتاح API على خادم؟
لا تضعه في الشفرة، ولا في git، ولا تصدّره من .bashrc، ولا تكتبه في shell يمكن لتاريخه الاحتفاظ به. ضعه في ملف يملكه root مع أذونات 600، وحمّله لكل عملية على حدة: استخدم wrapper script للتشغيل التفاعلي، وEnvironmentFile= مع systemd. خصّص مفتاحاً واحداً لكل خادم أو مشروع، حتى يصبح إلغاء مفتاح مسرّب إجراءً محدداً بدلاً من إيقاف النظام بأكمله. إذا وصل المفتاح في أي وقت إلى موقع للصق النصوص أو إلى commit في git، فألغِه فوراً من Console؛ حذف commit لا يلغي تسريب المفتاح.
ما نموذج Claude الذي ينبغي أن أبدأ به؟
ابدأ باستخدام claude-opus-4-8 أثناء تقييمك لما إذا كانت المخرجات جيدة بما يكفي للبناء عليها. تريد تقييم الفكرة بأعلى جودة، ومع حجم استخدام للهواة يكون فرق التكلفة بضعة سنتات. بعد استقرار prompt، أعد تشغيل مدخلاتك الفعلية على claude-haiku-4-5. ففي التلخيص والتصنيف وفرز السجلات، يكون غالباً جيداً بالقدر نفسه مقابل خُمس التكلفة. انتقل إلى Haiku أو Sonnet بناءً على القياس، وليس افتراضياً.