SSD Nodes Learn
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-07-22

درس Claude API: أول تطبيق لك على VPS

احصل على مفتاح Claude API، وأمّنه على Ubuntu 24.04، وابنِ أداة Python لتفسير السجلّات بالبث المتدفق ومعالجة استثناءات مصنّفة وتحكم حقيقي في التكلفة.

ما الذي ستبنيه

أداة سطر أوامر على خادم VPS جديد بنظام Ubuntu 24.04، ترسل إليها عبر أنبوب (pipe) رسالة خطأ أو مقطعًا من سجلّ، فتعيد لك تشخيصًا بلغة واضحة ومباشرة: journalctl -u nginx -n 50 | explain. الأمر كله نحو ستين سطرًا من Python، وهو يطبّق عمليًا كل ما يحتاجه تطبيق حقيقي لـ Claude API: مفتاحًا مخزَّنًا بالطريقة الصحيحة، وvirtualenv، وأشكال استجابة SDK، والبث (streaming)، وسلسلة الاستثناءات المصنّفة حسب النوع، ووحدة systemd تجعله يعمل من دونك.

اخترتُ هذا المشروع عن قصد. معظم دروس «أول تطبيق API» تجعلك تبني روبوت محادثة (chatbot) لن تفتحه مرة أخرى أبدًا. أما مُفسِّر السجلّات فيثبت جدواه على الخادم منذ اليوم الأول، ويضعك أمام الأمرين اللذين يخطئ فيهما المبتدئون فعلًا: قراءة كائن الاستجابة بالشكل الصحيح، والتحكم في الإنفاق. تفرض API رسومها على كل رمز (token)، من دون أي سقف عدا ما تضعه أنت بنفسك، ولذلك يكون التحكم في التكلفة هنا عنصرًا في التصميم منذ البداية، لا فكرة لاحقة — الانضباط نفسه الذي يهمّك حين تنتقل إلى تشغيل Claude Code على هذا الـ VPS نفسه داخل tmux.

احصل على مفتاح API من Console

تُدار صلاحية الوصول إلى API من Console الخاصة بـ Anthropic على platform.claude.com: أنشئ حسابًا، ثم أنشئ مفتاحًا ضمن Settings → API Keys (توثيق Anthropic يحيلك مباشرة إلى platform.claude.com/settings/keys). يُعرَض المفتاح مرة واحدة فقط، ويبدأ بـ sk-ant-، ولا يمكن استرجاعه بعد ذلك — انسخه فورًا، أو احذفه وأصدر مفتاحًا جديدًا.

أما من الناحية المالية: حتى يوليو 2026 لا يوجد مستوى مجاني دائم لـ API. تذكر وثائق تسعير Anthropic أن المستخدمين الجدد يحصلون على قدر صغير من الأرصدة المجانية للتجربة؛ والمقدار الدقيق هو ما تعرضه لك Console عند إنشاء الحساب، وبمجرد نفاده يجب عليك تمويل الحساب قبل أن تنجح أي طلبات. هذا أمر منفصل عن اشتراك claude.ai: فخطة Pro أو Max لا تتضمن رصيد API، ومفتاح API لا يمنحك تطبيق الدردشة. إن كنت توازن بين الاشتراك واستخدام API، فهذه المفاضلة موضوع قائم بذاته: أي خطة Claude تحتاجها فعلًا.

أنشئ المفتاح مقيّدًا بمشروع واحد أو خادم واحد. فحين يتسرّب مفتاح — وعلى مدى زمني طويل بما يكفي، سيحدث ذلك حتمًا — تريد أن تكون قادرًا على إبطاله من دون أن تُعطِّل كل شيء آخر تملكه.

أبقِ المفتاح بعيدًا عن .bashrc

الخطوة الغريزية المعتادة هي كتابة export ANTHROPIC_API_KEY=sk-ant-... في ~/.bashrc. لا تفعل ذلك. ثلاث مشكلات منفصلة:

  • كل عملية ترثه. متغير بيئة (environment variable) يُصدَّر في صدفة (shell) تسجيل الدخول لديك ينتشر إلى كل ما تشغّله بعد ذلك: تطبيق الويب، ومُبلِّغ الأعطال الذي يفرّغ بيئته بلطف داخل تقرير عطل، وصفحة phpinfo() التي تركها أحدهم مفعّلة. يصبح سطح تعرّض المفتاح «كل ما يشغّله هذا المستخدم يومًا ما».
  • كتابته يدويًا يضعه في ~/.bash_history. نفّذ أمر التصدير يدويًا مرة واحدة، وستجد مفتاحك باقيًا في ملف نصي عادي، إلى الأبد، ويتزامن مع كل نسخة احتياطية لمجلدك الشخصي.
  • لا يكون موجودًا حين يحتاجه systemd. الخدمات لا تقرأ ملف .bashrc الخاص بك، فيفشل هذا النمط بالضبط حين ترفع السكربت إلى وحدة (unit) — وغالبًا في صورة خطأ 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 بدلًا من استخدام محرر نصوص إن أردت إبقاء المفتاح بعيدًا عن ملفات التبديل (swap) الخاصة بالمحرر؛ وفي الحالتين، تأكد بالأمر ls -l /etc/claude-explain.env أنه يعرض -rw------- وأن ملكيته لـ root. الصدفات التفاعلية تحصل على المفتاح في كل استدعاء عبر غلاف (wrapper) (أدناه)، ويحصل عليه systemd عبر EnvironmentFile= — إذ يقرأ root الملف قبل أن يتخلى عن صلاحياته، فلا يحتاج مستخدم الخدمة أبدًا إلى صلاحية قراءته. المفتاح لا يظهر أبدًا في الكود، ولا في git، ولا في مخرجات ps، ولا في سجل الصدفة.

ثبّت 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

لا حاجة إلى أي طقوس تفعيل (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)

شيئان في هذه الأسطر الاثني عشر يحملان معظم النموذج الذهني للـ API. أولًا، anthropic.Anthropic() من دون أي وسائط يقرأ المفتاح من البيئة — لا تمرره أبدًا كسلسلة نصية حرفية. ثانيًا، response.content هو قائمة من كتل المحتوى (content blocks)، لا سلسلة نصية. اطبعه مباشرة وستحصل على المخرجات الكلاسيكية لمن يجرّب ذلك لأول مرة:

[TextBlock(citations=None, text='A systemd unit file is...', type='text')]

هذا ليس خللًا؛ إنه التمثيل النصي لهذا الكائن (repr). قد تحتوي الاستجابات على أنواع متعددة من الكتل (نص، استدعاءات أدوات، تفكير)، لذا عليك أن تكرّر (iterate) عبرها وتتحقق من block.type == "text" قبل أن تتعامل مع .text. ضع هذه الحلقة منذ اليوم الأول، وستتجنب كليًا فئة كاملة من الحيرة من نوع «إنه يطبع محتوى عشوائيًا».

استخدم معرّف النموذج الدقيق claude-opus-4-8. معرّفات الجيل الحالي لا تحمل تاريخًا — قاوم العادة الراسخة (أو المقالة القديمة) التي تدفعك إلى إضافة لاحقة تاريخ؛ فذلك ينتج عنه خطأ 404، وهو ما نتناوله أدناه.

الأداة الفعلية: explain

إليك البرنامج كاملًا: إدخال عبر stdin، وتشخيص يُبثّ (streamed) في المخرجات، وأخطاء تُعالَج:

#!/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

(يحتاج الغلاف إلى أن يعمل عبر sudo، أو يحتاج ملف البيئة إلى مجموعة (group) ينتمي إليها مستخدمك الإداري — اختر أحد الخيارين عن قصد بدلًا من تخفيف صلاحيات الملف إلى 644.)

لماذا البث (streaming). تطبع client.messages.stream الرموز (tokens) فور وصولها بدلًا من البقاء صامتة طوال مدة التوليد الكاملة، وتتجنب مهلات HTTP الزمنية عند المخرجات الطويلة — بل إن SDK يرفض فعليًا قيم max_tokens الكبيرة جدًا في الاستدعاءات غير المُبثّة لهذا السبب بالذات. إن احتجت إلى الكائن المُجمَّع لاحقًا، فاستدعِ stream.get_final_message() داخل كتلة with.

لماذا هذا الترتيب للاستثناءات. يطلق SDK استثناءات مصنّفة حسب النوع، الأكثر تحديدًا أولًا: RateLimitError يقابل خطأ 429 ويحمل ترويسة retry-after تخبرك بمدة الانتظار؛ وAPIStatusError يغطي بقية الاستجابات من خارج نطاق 2xx (تحقق من e.status_code >= 500 لمشكلات من جهة الخادم)؛ وAPIConnectionError يعني أن الطلب لم يحصل على أي استجابة أصلًا. وقبل أن تبني حلقة إعادة محاولة: يعيد SDK بنفسه المحاولة أصلًا مع أخطاء 429 وأخطاء 5xx، مرتين افتراضيًا مع تراجع أسي (exponential backoff) (max_retries على العميل). وبحلول الوقت الذي تعمل فيه except لديك، تكون إعادات المحاولة قد استُنفدت — لذا فالتصرف الصحيح في أداة سطر أوامر هو الإبلاغ والخروج، لا النوم ثم القرع مجددًا.

التحكم في التكلفة

يستحق هذا قسمًا خاصًا به، لأن API لا تملك أي سقف شهري مدمج فيما عدا ما تضبطه أنت بنفسك، وكل خطأ هنا يتراكم بصمت.

max_tokens هو سقف إنفاقك في كل استدعاء. رموز الإخراج (output tokens) هي الجانب الأكثر تكلفة — على Opus 4.8 بخمسة أضعاف سعر الإدخال — وmax_tokens سقف صارم على عدد الرموز التي يمكن للنموذج إنتاجها. مُوجِّه (prompt) خارج عن السيطرة لا يمكن أن يكلفك مخرجات أكثر مما سمحت به. اضبط حجمه بحسب المهمة: 1500 يكفي تمامًا لتشخيص سجلّ؛ ومهمة تصنيف تحتاج إلى 100 فقط. إذا توقفت الاستجابات في منتصف الجملة بقيمة stop_reason: "max_tokens"، فأنت ضبطته أضيق مما ينبغي — ارفعه عن وعي بدلًا من اللجوء افتراضيًا إلى قيمة ضخمة.

عُدَّ الرموز قبل أن ترسل. الإدخال يكلّف مالًا أيضًا، والسجلّات ضخمة الحجم. تملك API نقطة نهاية (endpoint) للعدّ مجانية الاستخدام (ولها حدود معدل خاصة بها، منفصلة عن إنشاء الرسائل):

count = client.messages.count_tokens(
    model="claude-opus-4-8",
    messages=[{"role": "user", "content": big_log_text}],
)
print(count.input_tokens)

استخدمها للاحتراس من تمرير سجلّ بحجم 2 جيجابايت عبر الأداة عن طريق الخطأ. لا تستخدم tiktoken لهذا الغرض — فهو مُجزِّئ الرموز (tokenizer) الخاص بـ OpenAI، وهو يقلّل عدد رموز Claude بنحو 15-20% على النصوص العادية، وبأكثر من ذلك على الكود.

اختر النموذج بحسب المهمة، لا بحسب الولاء. حتى يوليو 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$ حتى 31 أغسطس 2026. بشكل ملموس: مقتطف سجلّ من 2000 رمز مع إجابة من 500 رمز يكلّف نحو 0.0225$ على Opus و0.0045$ على Haiku. ابدأ بـ Opus بينما تحكم على جودة المخرجات، ثم جرّب المُوجِّهات (prompts) نفسها على Haiku — فبالنسبة إلى التحويلات البسيطة عالية الحجم، غالبًا ما يكون الفرق غير ملحوظ عند خُمس السعر. تحقق من الأرقام الحالية في صفحة التسعير قبل أن تُدرِج أيًا من هذا في ميزانية بشكل نهائي.

استخدم Batches API لكل ما يمكن أن ينتظر. تعالج Batches API الطلبات بشكل غير متزامن (asynchronously) بنسبة 50% من الأسعار القياسية، وتكتمل معظم الدفعات (batches) خلال ساعة. الملخصات الليلية، وتعبئة البيانات الفائتة (backfills)، والتصنيف الجماعي — كل ما لا ينتظره إنسان مكانه هناك.

التخزين المؤقت للمُوجِّهات (prompt caching) للسياق المتكرر. إن كان كل استدعاء يعيد إرسال نفس مُوجِّه النظام الكبير أو دليل التشغيل (runbook) نفسه، فضع علامة عليه بأنه قابل للتخزين المؤقت:

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

كتابة التخزين المؤقت (cache writes) تكلّف نحو 1.25 ضعف سعر الإدخال، وقراءته (cache reads) نحو 0.1 ضعف، على مدة صلاحية (TTL) قدرها 5 دقائق — أي أن الاستدعاء الثاني ضمن هذه النافذة الزمنية يسدد بالفعل تكلفة الأول. وهناك مأخذان. يجب أن تتجاوز البادئة (prefix) المخزَّنة حدًا أدنى خاصًا بكل نموذج — بضعة آلاف من الرموز على Opus — وإلا فإن مُوجِّه نظام قصيرًا لن يُخزَّن مؤقتًا على الإطلاق من دون أي تنبيه. وإذا بقيت قيمة cache_read_input_tokens صفرًا عبر استدعاءات متطابقة، فهذا يعني أن شيئًا ما في بادئتك يتغيّر مع كل طلب (والختم الزمني هو المتّهم المعتاد).

تذكّر ما يُحتسب كإدخال. مُوجِّهات النظام، وتعريفات الأدوات، وفي المحادثات متعددة الأدوار كامل السجل الذي تعيد إرساله في كل دور، كلها تُفوتَر كرموز إدخال. حلقة محادثة لا تُقلِّم السجل أبدًا تنمو تكلفتها تربيعيًا. يستحق الحساب الكامل أن تفهمه قبل أن تبني أي شيء حواري: كيف يتراكم فعليًا استخدام رموز Claude وفوترتها.

شغّله تحت systemd

هذه هي ثمرة الانضباط في ملف البيئة: مؤقت (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.target
sudo 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 بصلاحيات 600 قبل أن ينزل إلى المستخدم غير المميَّز explain، فتحصل العملية على المتغير في حين لا يستطيع المستخدم قراءة ملف المفتاح. مجموعة systemd-journal تمنح صلاحية الوصول إلى السجلّات. اختبر الأمر بتنفيذ systemctl start يدويًا واقرأ journalctl -u log-digest.service — لا تنتظر حتى الساعة 06:15 لتكتشف خطأ كتابيًا. وحين يتجاوز هذا النمط قدرات أنبوب 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 قد أعاد المحاولة مرتين بالفعل مع تراجع أسي قبل أن ترى الاستثناء، فتكرار 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" أن النموذج بلغ سقف الإخراج الذي وضعته في منتصف فكرة. هذا سلوك مقصود؛ ارفع السقف عن قصد.

وبمجرد أن يعمل تطبيقك الأول، فإن بناء وكيل ذكاء اصطناعي بواسطة Claude يحوّل استدعاءات API نفسها إلى وكيل يستخدم الأدوات.

FAQ

كم تكلّف تجربة Claude API؟

قليلة جدًا فعليًا لأداة كهذه. حتى يوليو 2026، يكلّف Opus 4.8 مبلغ 5$ لكل مليون رمز إدخال و25$ لكل مليون رمز إخراج، فتشخيص سجلّ نموذجي — بضعة آلاف من الرموز إدخالًا وبضع مئات إخراجًا — يكلّف نحو سنتين، وعلى Haiku 4.5 (1$/5$) أقل من نصف سنت. شهر كامل من الملخصات اليومية يكلّف أقل من ثمن فنجان قهوة. الخطر ليس في سعر الاستدعاء الواحد؛ بل في الحلقات غير المحدودة وفي max_tokens غير المحدود، ولهذا يُضبَط كلاهما صراحة في هذا الدليل.

هل يوجد مستوى مجاني لـ Claude API؟

لا يوجد مستوى مجاني دائم حتى يوليو 2026. تذكر وثائق تسعير Anthropic أن المستخدمين الجدد يحصلون على قدر صغير من الأرصدة المجانية لتجربة API — تجربة لمرة واحدة، مع مقدار دقيق يظهر في Console عند إنشاء الحساب — وبعدها يجب عليك تمويل الحساب. إن كان هدفك تكلفة هامشية صِفرية لكل طلب بدلًا من أعلى جودة ممكنة، فالبديل هو استضافة نموذج مفتوح الأوزان ذاتيًا بواسطة Ollama والدفع بذاكرة RAM بدلًا من الرموز.

كيف أحافظ على أمان مفتاح API على خادم؟

لا تضعه أبدًا في الكود، ولا في git، ولا تُصدِّره أبدًا من .bashrc، ولا تكتبه أبدًا في صدفة سيحتفظ سجلّها به. ضعه في ملف مملوك لـ root بأذونات 600، وحمّله لكل عملية على حدة — سكربت غلاف (wrapper) للاستخدام التفاعلي، وEnvironmentFile= لـ systemd — وقيّد مفتاحًا واحدًا لكل خادم أو مشروع حتى يكون إبطال مفتاح متسرِّب عملية جراحية دقيقة، لا بترًا. وإن لامس المفتاح يومًا موقع لصق نصوص أو التزام (commit) في git، فأبطِله في Console فورًا؛ فحذف الالتزام لا يُلغي التسرّب.

بأي نموذج Claude ينبغي أن أبدأ؟

ابدأ بـ claude-opus-4-8 بينما تقيّم ما إذا كانت المخرجات جيدة بما يكفي لتبني عليها — فأنت تريد الحكم على الفكرة بأعلى جودة ممكنة، وعند حجم استخدام هاوٍ يكون الفرق في التكلفة بضعة سنتات. وبمجرد استقرار المُوجِّه، أعد تشغيل مدخلاتك الحقيقية على claude-haiku-4-5؛ ففي التلخيص والتصنيف وفرز السجلّات كثيرًا ما يكون بنفس الجودة عند خُمس السعر. انتقل إلى Haiku أو Sonnet بناءً على القياس، لا بشكل افتراضي.

#claude-api#python#ai#vps#anthropic