العودة إلى المدونة

تحسين التكلفةدليل

قدّر تكلفة API لبطولة نماذج قبل تشغيلها

احسب الرموز لكل مقعد، واضربها في الألعاب وتبديلات الجانبين، وضع حدًا أقصى صارمًا في Python: تقدير عملي لبطولة نماذج بـ 6 مقاعد و60 لعبة.

بواسطة CheapTokens Teamنُشر في 5 دقيقة قراءة

الغلاف: تكلفة بطولة نماذج قبل تشغيلها، من المقاعد والأدوار إلى السجل المتنامي وحد الميزانية
في هذه الصفحة
  1. ماذا يخبرك عنوان بقيمة 20,000 دولار وماذا لا يخبرك
  2. مقعد واحد: لماذا يستمر الإدخال في النمو
  3. من مقعد واحد إلى بطولة كاملة
  4. ضع حدًا أقصى صارمًا في الكود
  5. ترتيب آمن للتشغيل الأول

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

ماذا يخبرك عنوان بقيمة 20,000 دولار وماذا لا يخبرك#

في 5 نوفمبر 2026 نشر المدون الصوتي Dwarkesh Patel Clocktower Bench، وهو معيار تقييم تلعب فيه النماذج لعبة الاستنتاج الاجتماعي Blood on the Clocktower ضد بعضها البعض. يقول إنه أنفق حوالي 20,000 دولار من أرصدة API لبناء أداة التقييم، وأن الكثير منها ذهب إلى التكرار على تصميم البيئة، أكثر من الرموز التي كان يخطط لها.

يصف README الخاص بالمشروع (تم التحقق منه في 8 نوفمبر 2026) الإعداد: 11 نموذجًا، 386 لعبة للتصنيف الرئيسي، نموذج واحد يلعب كل مقعد خيّر وآخر كل مقعد شرير، 10–12 لاعبًا، ألعاب تستمر عدة ساعات. يتم إعادة كل توزيع مع تبديل الجانبين، حتى لا يحصل أي من النموذجين على الدور الأسهل. كما يشحن تشغيلًا تجريبيًا مجانيًا (--model random)، ويكتب الإنفاق إلى games/ledger.jsonl، وله حد أقصى --budget افتراضيًا 1,000 دولار.

ما لا يقدمه هو عدد الرموز لكل لعبة. لذا لا يوجد شيء لنسخه؛ تبني التقدير بنفسك. هذا ما يفعله بقية هذا المقال، بافتراضات معلنة يمكنك استبدالها بافتراضاتك الخاصة.

مقعد واحد: لماذا يستمر الإدخال في النمو#

لنفترض أنك تدير لعبة أصغر: 6 مقاعد، كل مقعد نموذج بمحادثته الخاصة، 20 دورًا لكل مقعد. افترض موجه نظام بحجم 2,000 رمز (القواعد ودور المقعد)، و600 رمز جديد من حديث الطاولة يصل قبل كل دور، ورد بـ 300 رمز. لا يمتلك API ذاكرة، لذا يحمل كل طلب المحادثة بأكملها مرة أخرى (لماذا تكلف الدردشة الطويلة أكثر).

الدور الأول يرسل 2,000 + 600 = 2,600 رمز. الدور العشرون يرسل 2,000 + 600 × 20 + 300 × 19 = 19,700. جرب الرقم الأخير بنفسك:

خمّن الرقم

كم عدد رموز الإدخال التي يرسلها مقعد في دوره العشرين؟

إظهار الإجابة

الإجابة: 19,700

19,700: موجه النظام بحجم 2,000 رمز، و20 × 600 من الحديث الجديد، و19 ردًا سابقًا بـ 300 لكل منها. كل رد قديم وكل رسالة قديمة تعود مرة أخرى.

اجمع كل الأدوار العشرين لمقعد واحد: 2,000 × 20 + 600 × 210 + 300 × 190 = 40,000 + 126,000 + 57,000 = 223,000 رمز إدخال. الإخراج فقط 20 × 300 = 6,000. إذا حسبت كل رسالة مرة واحدة، ستحصل على 2,000 + 20 × 600 = 14,000 وتكون مخطئًا بمعامل ستة عشر.

العد مرة واحدة مقابل إعادة إرسال السجل لمقعد واحد على مدى 20 دورًا
مقعد واحد، 20 دورًا: العد مرة واحدة يعطي 14,000 رمز إدخال، وإعادة إرسال السجل تعطي 223,000. افتراضات هذا المقال.

جانب الإخراج بالكاد يتحرك. الإدخال هو حيث تذهب الأموال، وهذا هو الجانب الذي يسوء مع طول الألعاب.

من مقعد واحد إلى بطولة كاملة#

الآن قم بقياسها بثلاثة مضاعفات.

  • المقاعد. 6 مقاعد × 223,000 = 1,338,000 رمز إدخال و6 × 6,000 = 36,000 رمز إخراج لكل لعبة.
  • تبديل الجانبين. خذ 3 نماذج في دورة روبن: 3 مواجهات. العب 10 توزيعات لكل مواجهة، كل واحدة مرتين مع تبديل الجانبين: 3 × 10 × 2 = 60 لعبة.
  • الألعاب. 60 × 1,338,000 = 80,280,000 إدخال و60 × 36,000 = 2,160,000 رمز إخراج للبطولة.
من مقعد واحد إلى 60 لعبة: المضاعفات
افتراضات هذا المقال: 6 مقاعد، 3 مواجهات × 10 توزيعات × 2 جانبين = 60 لعبة.

لعبة واحدة على DeepSeek-V4-Flash تصل إلى $0.0237. يسعر الجدول أدناه البطولة الكاملة المكونة من 60 لعبة كما لو أن ذلك النموذج الواحد لعب كل مقعد، حتى تتمكن من مقارنة النماذج الثلاثة التي تقدمها CheapTokens لهذا النوع من مهام المحادثة الطويلة. في المجموع، مع حساب الإدخال والإخراج معًا، كل واحد منهم أرخص من مرجع OpenRouter في العمود الأخير.

النموذج لكل طلب 60 طلبات OpenRouter، 60 طلبات
GLM-5.3-Flash $0.0282 $1.69 $2.87
DeepSeek-V4-Flash $0.0237 $1.42 $5.92
MiniMax-M2.7 $0.0723 $4.34 $52.06

1,338,000 رمز إدخال و36,000 رمز إخراج لكل طلب. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.

من حيث الميزانية هذه هي الحيلة بأكملها: لا تحتاج إلى بند بقيمة 20,000 دولار لتعرف أي من ثلاثة نماذج يلعب لعبة تفاوض بشكل أفضل. تحتاج إلى التقدير أعلاه، ثم تجربة حقيقية للتحقق منه.

فحص سريع

لعبتك ذات 6 مقاعد تنتقل من 20 إلى 40 دورًا لكل مقعد. ماذا يحدث لفاتورة الإدخال؟

إظهار الإجابة

الإجابة: تنمو حوالي 3.6 مرة

لـ 40 دورًا تعطي نفس الصيغة 2,000 × 40 + 600 × 820 + 300 × 780 = 806,000 رمز إدخال، مقابل 223,000 لـ 20 دورًا. ينمو حد السجل مع مربع عدد الأدوار.

فحصان قبل أن تثق بأي رقم من هذا القبيل. أولاً، يجب أن يتسع أكبر طلب لنافذة النموذج. عند 20 دورًا أكبر طلب هو 19,700 رمز، لا مشكلة. لعبة متعددة الساعات بـ 200 دور لكل مقعد تصل إلى 2,000 + 600 × 200 + 300 × 199 = 181,700، حوالي 182K، لذا اقرأ حجم السياق في صفحة النموذج قبل تصميم اللعبة. يمتلك DeepSeek-V4-Flash نافذة 380K وما يصل إلى 32,768 رمز إخراج؛ انظر صفحة النموذج. ثانيًا، إذا أصدر نموذج استدلالًا طويلًا، تصبح رموز الإخراج الـ 300 لديك أكثر (رموز التفكير في مهمة مجمعة).

ضع حدًا أقصى صارمًا في الكود#

علامة --budget في README هي الفكرة الصحيحة، وتستغرق عشر أسطر لنسخها إلى أداة التقييم الخاصة بك. السكريبت أدناه يقدّر قبل التشغيل، ويرفض إرسال طلب قد يدفع الإجمالي فوق الحد الأقصى، ويسجل كل استدعاء في ملف سجل. الأسعار فيه مثال: استبدلها بالأسعار الحالية من جدول التسعير.

python
import json, os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
PRICE_IN, PRICE_OUT = 0.10, 0.40  # per 1M tokens: example, substitute current
CAP_USD = 5.00
spent = 0.0


def cost(tin, tout):
    return (tin * PRICE_IN + tout * PRICE_OUT) / 1_000_000


def estimate(seats, turns, system=2000, new_in=600, out=300):
    tin = sum(system + new_in * k + out * (k - 1) for k in range(1, turns + 1))
    return seats * tin, seats * turns * out


def ask(seat, history, max_out=400):
    global spent
    rough_in = sum(len(m['content']) for m in history) // 3  # pessimistic
    if spent + cost(rough_in, max_out) > CAP_USD:
        raise SystemExit(f'cap reached: ${spent:.4f} spent')
    r = client.chat.completions.create(
        model=MODEL, messages=history, max_tokens=max_out)
    u = r.usage
    spent += cost(u.prompt_tokens, u.completion_tokens)
    with open('ledger.jsonl', 'a') as f:
        f.write(json.dumps({'seat': seat, 'in': u.prompt_tokens,
                            'out': u.completion_tokens,
                            'spent': round(spent, 6)}) + '\n')
    return r.choices[0].message.content


print(estimate(6, 20))  # (1338000, 36000) per game

estimate(6, 20) يطبع (1338000, 36000)، نفس أرقام كل لعبة كما هو مذكور أعلاه، لذا يتحقق الكود والحساب من بعضهما البعض. usage.prompt_tokens وusage.completion_tokens يأتيان من الاستجابة وهما ما يتم محاسبتك عليه؛ يستخدم الفحص المسبق عدد أحرف متشائمًا لأن العدد الحقيقي لا يُعرف إلا بعد الاستدعاء. المزيد عن سجلات كل مشروع في تتبع تكلفة رموز الوكيل في Python.

ترتيب آمن للتشغيل الأول#

تسلسل المستودع نفسه نموذج جيد: مجاني أولاً، رخيص ثانيًا، مكلف أخيرًا. رتب هذه الخطوات:

رتّب بالترتيب

رتب خطوات التشغيل الأول الآمن

  1. تشغيل تجريبي مع لاعب عشوائي، بدون استدعاءات API
  2. شغّل estimate() وقارنه بحدك الأقصى
  3. العب لعبة حقيقية واحدة واقرأ السجل
  4. صحح الافتراضات بأعداد الرموز الحقيقية
  5. أطلق البطولة الكاملة مع تفعيل الحد الأقصى

يقول README إن لعبة تجريبية على نماذج رخيصة تكلف حوالي 2–5 دولارات. هذا بيان المؤلف والنماذج غير مسماة، لذا اعتبره نطاقًا معقولًا، وليس عرض سعر لإعدادك. لعبتك التجريبية الخاصة تعطيك الرقم المهم: إذا أظهر سجلها 1,500,000 رمز إدخال حيث افترضت 1,338,000، فقد تعلمت شيئًا ببضعة سنتات بدلاً من اللعبة الأربعين.

للتجارب الأطول، الرافعات المعتادة موجودة في تقليم سجل الدردشة: قلل ما يجب على كل مقعد إعادة قراءته، وسينكمش الحد التربيعي معه. عندما تكون مستعدًا لتشغيله، الوثائق تحتوي على نقطة النهاية ومعرفات النماذج.