SSD Nodes Learn Hosting plans →
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-23

كيف تمنع وكيل ذكاء اصطناعي من رفع فاتورة VPS

تعلّم ضبط سقف الاستجابة وعدد التكرارات، وتخزين المطالبات مؤقتاً وتجميع المهام، مع قراءة حقول الاستخدام لمعرفة تكلفة كل تشغيل.

كيف تمنع وكيلاً للذكاء الاصطناعي يعمل باستمرار من رفع الفاتورة

تعتمد السيطرة على تكلفة وكيل الذكاء الاصطناعي على VPS (خادم افتراضي خاص) على وضع حدود قبل بدء الوكيل، لأن لا أحد يراقب العداد أثناء تشغيله. حدّد سقفاً لكل استجابة باستخدام max_tokens، وقيّد عدد تكرارات الحلقة في التعليمات البرمجية التي تكتبها، وخزّن الجزء الذي لا يتغير من المطالبة مؤقتاً، وسجّل أرقام استخدام كل استجابة لمعرفة المهمة التي تستهلك الموارد. يكون استئجار الخادم بسعر شهري ثابت. أما واجهة برمجة النماذج فتُحاسب بحسب عدد الرموز، ويمكن لحلقة غير خاضعة للمراقبة أن تستهلك الرموز بصمت وبسرعة.

يفترض هذا وجود وكيل مُنشأ مسبقاً يستدعي Messages API من جهاز تملكه. يشرح إنشاء وكيل للذكاء الاصطناعي باستخدام Claude على VPS المكونات اللازمة لذلك.

لماذا يختلف نمط التكلفة في الوكيل غير المراقَب

تتضمن الجلسة التفاعلية شخصاً. عندما يسلك النموذج مساراً خاطئاً أو يقرأ سجلاً من 40,000 سطر، يوقفه الشخص الذي يراقبه. أما الوكيل غير المراقَب فلا يملك هذا المكبح؛ إذ يستمر في التشغيل حتى تنتهي الحلقة، ثم يشغّله المؤقت مرة أخرى.

التكرار هو العامل المضاعِف الذي يغفل عنه الناس. تعمل المهمة المجدولة كل خمس دقائق 288 مرة يومياً، وحوالي 8,640 مرة شهرياً. اضرب تكلفة التشغيل الواحد في هذا العدد. كثير من الوكلاء «الذين يعملون دائماً» لا يحتاجون إلى العمل باستمرار. بل يحتاجون إلى الاستجابة خلال عدد محدد من الدقائق، وهذا يتحقق من خلال جدولة.

يدفع الوكيل أيضاً مقابل أشياء لا تدفع مقابلها نافذة الدردشة.

  • تُرسل تعريفات الأدوات مع كل طلب. تكلف مطالبة النظام الخاصة باستخدام الأدوات 290 token في Claude Opus 4.8 مع tool_choice من auto أو none، و410 مع any أو tool. وتضيف أداة bash مقداراً إضافياً قدره 325 token. يضيف كل خادم MCP تربطه مخططاته إلى هذا الحجم، وMCP هو بروتوكول سياق النموذج.
  • نتائج الأدوات هي token للإدخال. يضع الأمر الذي يطبع 8,000 سطر هذه الأسطر الثمانية آلاف في الطلب التالي، وفي كل طلب لاحق ضمن تلك الدورة.
  • الصفحات التي يجلبها الوكيل هي token للإدخال. تحتوي صفحة ويب بمتوسط 10 kB تقريباً على 2,500 token، ويحتوي ملف PDF بحثي بحجم 500 kB تقريباً على 125,000 token. يقتصر max_content_tokens على اقتطاع النصوص، لأنّه «ينطبق على المحتوى النصي، وليس على المحتوى الثنائي مثل ملفات PDF». حدّد حجم ملف PDF باستخدام max_uses وallowed_domains بدلاً من ذلك.
  • تُحتسب عمليات البحث على الويب لكل عملية بحث، بسعر $10 لكل 1,000 عملية بحث، بغض النظر عن عدد النتائج التي تعود. لا تُحتسب تكلفة البحث الذي يفشل.

لا تكون أي من هذه العناصر مكلفة عند استخدامها مرة واحدة. لكنها تصبح مكلفة عند استخدامها 8,640 مرة.

سقوف الإخراج الصارمة والسقوف المرنة تحل مشكلات مختلفة

يُطبَّق max_tokens. وهو حد أقصى صارم لإجمالي إخراج الطلب الواحد، بما في ذلك التفكير ونص الاستجابة. لا يُنشئ Claude أي محتوى يتجاوزه، ولا يستطيع النموذج رؤية هذه القيمة. عند بلوغ هذا الحد، تظهر stop_reason: "max_tokens" وتُقتطع الاستجابة. أما بالنسبة إلى الوكلاء، فالمهم أن كل طلب ضمن حلقة استخدام الأدوات له قيمة max_tokens خاصة به. لذلك يحد هذا السقف استجابة واحدة، لا المهمة بأكملها. تؤدي عشر استدعاءات للأدوات بقيمة 4,000 إلى سقف قدره 40,000 رمز مميز للدور.

ميزانية المهمة إرشادية. تقع task_budget ضمن output_config، وتحدد للنموذج عدد الرموز المميزة المتاحة له خلال حلقة الوكيل بأكملها، بما في ذلك التفكير، واستدعاءات الأدوات، ونتائج الأدوات، والإخراج.

resp = client.beta.messages.create(
    model="claude-opus-4-8",
    max_tokens=4096,
    betas=["task-budgets-2026-03-13"],
    output_config={"task_budget": {"type": "tokens", "total": 64000}},
    messages=messages,
)

"ميزانيات المهام تلميح مرن وليست حداً صارماً." قد يتجاوز Claude هذه الميزانية أثناء تنفيذ إجراء واحد، بينما يظل الحد المفروض على الإخراج هو max_tokens. "لا يرى العدّ التنازلي إلا النموذج"، ولا تتضمن الاستجابات حقلاً يوضح الميزانية المتبقية. الحد الأدنى المقبول لقيمة task_budget.total هو 20,000 رمز مميز، بينما تؤدي قيمة أقل إلى خطأ 400. تؤدي الميزانية الصغيرة جداً بالنسبة إلى العمل إلى سلوك يشبه الرفض، لذلك يضيّق النموذج نطاق المهمة أو يتوقف مبكراً.

هناك تفصيل واحد يستهلك المال بدلاً من توفيره. إذا كان عميلك ينقص task_budget.remaining مع كل طلب متابعة، فإن القيمة المتغيرة تُبطل أي بادئة مخزنة مؤقتاً تتضمنها. اضبطها مرة واحدة في الطلب الأول.

ميزانيات المهام متاحة في الإصدار التجريبي على Claude Fable 5 وClaude Opus 4.8 وClaude Opus 4.7. ويُدرج Claude Sonnet 5 وClaude Haiku 4.5 ضمن Not supported، كما لا تنطبق ميزانيات المهام على Claude Code. لذلك تعتمد جلسة Claude Code المنفصلة في tmux على إدارة الجلسة بصورة سليمة.

يوجد السقف الثالث في Claude Console: امنح الوكيل مساحة عمل خاصة به، ثم اضبط حد إنفاق شهرياً وحدوداً لمعدل الطلبات في الدقيقة عليها. "لا يمكنك ضبط حدود على Default Workspace"، و"تُطبَّق الحدود على مستوى المؤسسة دائماً، حتى إذا تجاوز مجموع حدود مساحات العمل هذه القيم". أضف إشعارات للإنفاق كي يصلك تنبيه عند بلوغ عتبة معينة قبل الوصول إلى السقف.

اختيار النموذج لكل مهمة، وما الذي يغيّره الجهد فعلياً

اختيار النموذج قرار يُتخذ لكل مهمة. اعتباراً من يوليو 2026، تبلغ التكلفة لكل مليون token، للإدخال ثم الإخراج: Claude Fable 5 بسعر $10 و$50، وClaude Opus 4.8 وOpus 4.7 بسعر $5 و$25، وClaude Sonnet 5 بسعر $3 و$15، وClaude Haiku 4.5 بسعر $1 و$5. يُسعَّر Sonnet 5 حالياً بأقل من سعره المعلن، لأن «التسعير التمهيدي البالغ $2/$10 لكل مليون token للإدخال/الإخراج سارٍ حتى 31 أغسطس 2026». لا تحتاج خطوة تقتصر على تصنيف أسطر السجل إلى Opus. ولا يوجد رصيد مجاني لاستيعاب جدول مهام مزدحم، لأن Claude API لا يوفّر طبقة مجانية تتجاوز الرصيد الصغير الممنوح عند التسجيل.

الجهد هو الرافعة الثانية. يقبل output_config.effort القيم low وmedium وhigh وxhigh وmax، والقيمة الافتراضية هي high، لذلك فإن تعيين high صراحةً يعادل حذفه. يقلل الجهد المنخفض أكثر من طول الاستدلال؛ إذ توضح الوثائق أنه يجعل Claude ينفذ استدعاءات أدوات أقل ويجمع العمليات في استدعاء واحد. وهذا يحقق وفراً أكبر في الوكيل، لأن تجنب استدعاء أداة يعني عدم تنفيذ طلب كامل.

المشكلة أن الجهد يتعارض مع التخزين المؤقت. يؤدي تغيير القيمة بين الطلبات إلى إبطال التخزين المؤقت للمطالبات. في المثال الموثق، أبلغ الطلب 2 عن cache_read_input_tokens: 3546؛ بينما أبلغ الطلب 3، بعد تغيير الجهد من مرتفع إلى متوسط، عن cache_creation_input_tokens من أصل 3546 وcache_read_input_tokens من أصل 0. لذلك غيّر الجهد بين أحمال العمل، وليس داخل محادثة واحدة مخزنة مؤقتاً. لتوجيه مستوى العمق دون إبطال التخزين المؤقت، نفّذ ذلك في المطالبة: تترك عبارة مثل «أجب مباشرةً دون إطالة التفكير.» في أحدث رسالة للمستخدم نقاط التوقف السابقة سليمة.

تُحاسب token الخاصة بالتفكير وفق معدلات الإخراج، وتُحتسب ضمن max_tokens، ولذلك تعني الإجابة المبتورة غالباً أن التفكير استهلك الميزانية. اقرأ usage.output_tokens_details.thinking_tokens لمعرفة العدد. يوضّح ما الذي يملأ فاتورة Claude من token مكوّنات العداد بالتفصيل.

تخزين البادئة المستقرة مؤقتاً وتجنّب كسرها دون قصد

تُكلّف كتابة ذاكرة التخزين المؤقت 1.25 ضعف سعر الإدخال الأساسي في ذاكرة الخمس دقائق، وضعفين في ذاكرة الساعة الواحدة. أمّا قراءة ذاكرة التخزين المؤقت فتُكلّف 0.1 ضعف السعر، لذلك «يصبح التخزين المؤقت مجدياً بعد قراءة واحدة فقط لذاكرة الخمس دقائق (كتابة بتكلفة 1.25 ضعف)، أو بعد قراءتين لذاكرة الساعة الواحدة (كتابة بتكلفة ضعفين)».

توضح جملة واحدة سبب ملاءمة ذلك لوكيل يعمل دائماً: «تُحدَّث ذاكرة التخزين المؤقت دون تكلفة إضافية كلما استُخدم المحتوى المخزّن مؤقتاً». إذا شغّلت مهمة كل دقيقتين مقابل ذاكرة الخمس دقائق، فستبقي بادئتها دافئة طوال اليوم بعملية كتابة واحدة.

ثلاث طرق لفقدان ذاكرة التخزين المؤقت دون ملاحظة ذلك.

بادئة تتغير. «تُنشأ بادئات ذاكرة التخزين المؤقت بالترتيب التالي: tools، ثم system، ثم messages.» يؤدي أي تغيير في بايت سابق ضمن هذا الترتيب إلى إبطال كل ما يليه، كما يؤدي تعديل تعريفات الأدوات إلى إبطال ذاكرة التخزين المؤقت بالكامل. ومن أكثر الأخطاء شيوعاً إضافة طابع زمني أو معرّف تشغيل إلى مطالبة النظام: عندها يحمل كل طلب بادئة مختلفة، ويكتب إدخالاً جديداً بتكلفة 1.25 ضعف، ولا يستعيد أي شيء من الذاكرة. العلامة الدالة هي usage.cache_read_input_tokens بقيمة 0 في الاستدعاءات المتطابقة ظاهرياً. انقل النص المتغير إلى أحدث رسالة من المستخدم.

بادئة قصيرة جداً. يملك كل نموذج حداً أدنى لطول المحتوى القابل للتخزين مؤقتاً. إذا كان الطلب أقصر من هذا الحد، فستتم معالجته من دون تخزين مؤقت، و«لن يُعاد أي خطأ». تشمل القيم 1,024 رمزاً في Claude Opus 4.8 وClaude Sonnet 5، و4,096 في Claude Haiku 4.5. لذلك قد يؤدي نقل مهمة من Sonnet إلى Haiku إلى تعطيل التخزين المؤقت بصمت.

محادثة تتجاوز فترة الرجوع. «نافذة الرجوع هي 20 كتلة». يفحص النظام 20 موضعاً كحد أقصى عند كل نقطة فصل، ثم يتوقف. في المثال الموثق، إذا احتوت إحدى الجولات على 35 كتلة وكانت نقطة الفصل عند الكتلة 35، فسيُفحص النطاق من الكتلة 35 إلى الكتلة 16. وتكون نتيجة الجولة السابقة عند الكتلة 15 خارج النافذة، لذلك لا تحدث إصابة. يتجاوز وكيل يضيف عدة كتل لاستخدام الأدوات ونتائجها في كل جولة قيمة 20 خلال جولتين أو ثلاث. لديك أربع نقاط فصل لكل طلب، لذلك خصّص واحدة للرسائل الحديثة.

أرسل كل ما يمكنه الانتظار إلى Batches API

تُحتسب كل الاستخدامات بنسبة 50% من أسعار API القياسية، سواء للإدخال أو للإخراج. وتتم معالجة الدفعات بشكل غير متزامن، إذ تنتهي معظم الدفعات خلال أقل من 1 ساعة، وتتوفر النتائج عند اكتمال كل الطلبات أو بعد 24 ساعة، أيهما يأتي أولاً. هذا هو الوضع المعتاد، لكنه غير مضمون.

استطلع processing_status بشكل متكرر حتى تصبح قيمته ended. لا تُحتسب رسوم على الطلبات التي تُرجع errored أو canceled أو expired. توجد ملاحظة مهمة إذا كنت تعتمد على حد أقصى للإنفاق: قد تتجاوز الدفعات قليلاً حد الإنفاق الذي تم تكوينه لمساحة العمل لديك.

يمكن جمع الخصومات. وبما أن الدفعة قد تستغرق أكثر من 5 دقائق، توصي الوثائق باستخدام ذاكرة التخزين المؤقت لمدة ساعة للدفعات التي تشترك في السياق. لذلك قسّم العمل: أي شيء ينتظره شخص أو webhook يجب أن يبقى في المسار المباشر، بينما يُرسل الملخص الليلي أو تصنيف سجلات الأمس إلى دفعة بنصف السعر.

سجّل حقول الاستخدام لكل استجابة في مخزن خاص بك

لا يمكنك إسناد نفقات لم تسجّلها. تخبرك كل استجابة بما كلّفته.

u = resp.usage
row = {
    "job": job_name,
    "model": resp.model,
    "uncached_input": u.input_tokens,
    "cache_write": u.cache_creation_input_tokens,
    "cache_read": u.cache_read_input_tokens,
    "output": u.output_tokens,
    "stop_reason": resp.stop_reason,
}

أضف صفاً واحداً لكل استدعاء API إلى ملف JSON-lines، مع وسمه باسم المهمة. بعد أسبوع، ستتمكن من معرفة المهام التي تستهلك الميزانية وتلك التي تبدو مشغولة فقط. راقب cache_read: فوجود عمود من الأصفار هو أكثر أخطاء التكلفة شيوعاً في الوكيل المستضاف ذاتياً.

من السهل إساءة فهم أحد الحقول. يحسب input_tokens الرموز الموجودة بعد آخر نقطة توقف للتخزين المؤقت فقط، لذلك يكون حجم المطالبة الفعلي هو total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens. إذا أبلغ وكيل عن input_tokens: 400 عند إرسال مطالبة كبيرة، فهذا لا يعني أنه منخفض التكلفة؛ فقد جاءت بقية الرموز من ذاكرة التخزين المؤقت.

احسب العدد قبل الإرسال. عدّ الرموز مجاني، وحدود معدله منفصلة عن إنشاء الرسائل، لذلك استخدم count_tokens لرفض مرفق يتجاوز الحجم المسموح بدلاً من دفع التكلفة لاكتشاف ذلك. النتيجة تقديرية، لذلك أعد القياس لكل نموذج، ولا تعِد استخدام عدد محسوب باستخدام tokenizer من مورّد آخر. تستخدم Claude Opus 4.7 والنماذج الأحدث من Opus وClaude Fable 5 وClaude Sonnet 5 tokenizer أحدث «ينتج رموزاً أكثر بنسبة تقارب 30% للنص نفسه». أما Claude Sonnet 4.6 والإصدارات الأقدم، ومن بينها Claude Haiku 4.5، فتستخدم tokenizer السابق.

للحصول على العرض المعتمد، تعرض Admin API بيانات الاستخدام في https://api.anthropic.com/v1/organizations/usage_report/messages والتكلفة في https://api.anthropic.com/v1/organizations/cost_report. ويتطلب كلاهما مفتاح admin (sk-ant-admin01-...) بوصفه x-api-key: $ANTHROPIC_ADMIN_KEY مع anthropic-version: 2023-06-01، ويقبلان bucket_width=1d وgroup_by[]=model وapi_key_ids[]=. يوجد قيد واحد: «لا تتوفر Admin API للحسابات الفردية».

أما تلك المعلمة الأخيرة فهي طريقة منخفضة التكلفة لإسناد الاستخدام: امنح كل مهمة مفتاح API خاصاً بها، وطبّق التصفية باستخدام api_key_ids[]، ثم قسّم التقرير لكل مفتاح باستخدام group_by[]=api_key_id. عامل التصفية جمع، أما بُعد التجميع فمفرد. احتفظ بالمفاتيح في البيئة بدلاً من وضعها في الشيفرة، كما تفعل أول تطبيق Claude API على VPS.

حدّد عدد التكرارات، فلا شيء آخر سيفعل ذلك

عدد التكرارات المحدّد ليس اختيارياً هنا. الحلقة تحت مسؤوليتك، ولذلك فالعداد تحت مسؤوليتك أيضاً:

for step in range(MAX_STEPS):          # MAX_STEPS = 12, never "while True"
    resp = client.messages.create(...)
    if resp.stop_reason != "tool_use":
        break
else:
    log.warning("job %s hit MAX_STEPS=%d, giving up", job_name, MAX_STEPS)

لا يفرض أيّ من الحدّين أعلاه هذا القيد نيابةً عنك: إذ يحدّد max_tokens استجابةً واحدة، ولا يُبلِغ النموذج إلا بميزانية المهمة. كان المنتج المستضاف سيوقفك هنا، كما يوقف حد Claude لاستدعاءات الأدوات ضمن دورة واحدة جلسةً أجرت عدداً كبيراً منها، لكن الحلقة التي كتبتها بنفسك لا تتضمن آلية إيقاف كهذه حتى تضيفها.

أضف آلية إيقاف ثانية خارج العملية. شغّل المهمة بواسطة مؤقّت systemd بدلاً من تشغيل عملية دائمة، واضبط RuntimeMaxSec= في وحدة الخدمة الخاصة بها. باستخدام RuntimeMaxSec=600، يُنهى التشغيل العالق بعد عشر دقائق بدلاً من استمراره إلى أن تلاحظ المشكلة. يشرح تشغيل برنامج كخدمة ومؤقّت في systemd ملفات الوحدات نفسها. اعرف ما الذي فعله أحد التشغيلات باستخدام journalctl -u triage-agent.service --since "1 hour ago".

حدّد عدد محاولات إعادة التشغيل أيضاً، لأن المعالج الذي يعيد المحاولة بلا نهاية يُحاسبك على كل محاولة. يستحق الخطأ 429 أو 500 بضع محاولات مع التأخير المتزايد. أما الخطأ 400 فلا يستحق أي محاولة، لأن الطلب نفسه سيفشل بالطريقة نفسها.

ضبط تكلفة وكيل AI يبدأ بقراءة أرقامك بنفسك

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

يفترض هذا استخدام API key، لأن الوكيل برنامجك أنت ويستدعي Messages API. أما للعمل التفاعلي الخاص بك، فتوضح خطة Claude المناسبة لطريقة عملك جانب الاشتراك. جرى التحقق من كل سعر وحد في هذا النص مقابل وثائق Anthropic في July 2026، لذلك أعد قراءة صفحة الأسعار قبل إعداد الميزانية.

FAQ

ما تكلفة تشغيل وكيل AI يعمل باستمرار على VPS؟

هناك فاتورتان، ويمكن التنبؤ بواحدة منهما فقط. سعر الخادم ثابت شهرياً. أما API النموذج فيُحاسَب حسب عدد الرموز، لذلك تساوي التكلفة ما يستهلكه تشغيل واحد مضروباً في عدد مرات التشغيل. لا تنشر Anthropic رقماً لتكلفة وكيل يعمل باستمرار ومستضاف ذاتياً، لذلك تعامل مع أي رقم مذكور على أنه تقدير. سجّل usage من تشغيل فعلي واحد، ثم اضربه في جدول التشغيل لديك.

ما الفرق بين max_tokens وميزانية المهمة؟

يفرض النظام max_tokens ولا يراه النموذج. وهو يحدد مخرجات طلب واحد، بما في ذلك التفكير، ويؤدي بلوغه إلى stop_reason: "max_tokens". أما ميزانية المهمة فهي العكس: يُبلَّغ النموذج بالعدد ويضبط الحلقة الوكيلة وفقاً له، لكن «ميزانيات المهام تلميح مرن وليست حداً صارماً»، ويظل الحد المفروض هو max_tokens.

لماذا تكون cache_read_input_tokens مساوية للصفر دائماً لدى وكيلي؟

لأن البادئة تتغير بين الاستدعاءات، أو لأنها قصيرة جداً بحيث لا يمكن تخزينها مؤقتاً. السبب المعتاد هو إدراج طابع زمني أو معرّف تشغيل في system prompt: إذ تعتمد ذاكرة التخزين المؤقت على البادئة، لذلك يؤدي أي تغيير في بايت واحد إلى إبطال كل ما يليها. ويؤدي تغيير تعريفات الأدوات أو قيمة effort إلى النتيجة نفسها. وإلا فالمشكلة في الحجم، لأن system prompt الأقصر لا يُخزَّن مؤقتاً ولا يُعاد أي خطأ.

كيف أوقف وكيلاً للذكاء الاصطناعي من الدخول في حلقة لا نهائية؟

احسب عدد التكرارات في كود الحلقة وأوقفها عند حد أقصى ثابت، لأن max_tokens يحدد استجابة واحدة، بينما ينفذ الوكيل استجابات متعددة. أضف حداً زمنياً خارج العملية: شغّل المهمة من مؤقت systemd مع ضبط RuntimeMaxSec=، حتى تُنهى العملية المتوقفة وفق الجدول. حدّد عدد المحاولات المعادة أيضاً، لأن حلقة إعادة المحاولة تحاسبك على كل محاولة.

هل يمكنني تعيين حد للإنفاق على مفتاح Claude API واحد؟

حد الإنفاق الموثق يطبَّق على مساحة العمل، وليس على المفتاح، لذلك امنح الوكيل مساحة عمل خاصة به وحدد فيها إنفاقه الشهري. «لا يمكنك تعيين حدود في Default Workspace». أضف إشعارات الإنفاق كي يصلك تنبيه عند بلوغ حد معين أولاً. ولتحديد مصدر الإنفاق، امنح كل مهمة مفتاحاً خاصاً بها، ثم جمّع تقرير الاستخدام باستخدام group_by[]=api_key_id.