تحسين التكلفةدليل
اقتطع سجل المحادثة لتقليل التكلفة: نافذة منزلقة أم ملخص
حدد ما تعيد إرساله في كل دورة: احتفظ بآخر بضع رسائل أو بملخص قصير. حسابات الرموز لمحادثة من 50 دورة ومساعد Python.

في هذه الصفحة
روبوت الدعم الخاص بك يتحادث منذ 50 دورة، وكل رسالة جديدة تكلف أكثر من سابقتها. واجهة API لا تتذكر شيئًا، لذا يعيد كودك إرسال المحادثة كاملة في كل مرة. الحل هو تحديد ما ترسله: احتفظ بمطالبة النظام وآخر بضع دورات (نافذة منزلقة)، أو استبدل الدورات القديمة بملخص قصير. فيما يلي الحسابات لمحادثة من 50 دورة ومساعد يمكنك نسخه.
دليل المحادثة متعددة الجولات من DeepSeek (api-docs.deepseek.com، تم التحقق في 1 نوفمبر 2026) يقولها بوضوح: الخادم لا يسجل سياق الطلبات السابقة، لذا يرسل العميل قائمة messages كاملة في كل استدعاء. التنسيق المتوافق مع OpenAI على CheapTokens يعمل بالطريقة نفسها. إذا كان هذا جديدًا عليك، ابدأ بـ لماذا تكلف المحادثة الطويلة أكثر وكيف تعمل مصفوفة الرسائل.
ما ترسله الدورة 50 فعليًا#
لنفترض أنك تشغل روبوت دعم بمطالبة نظام من 400 رمز. في دورة نموذجية يكتب المستخدم حوالي 60 رمزًا ويجيب الروبوت بحوالي 190. الدورة الكاملة الواحدة تضيف 250 رمزًا إلى السجل. هذه افتراضات: استبدلها بالأرقام من حقل usage في ردودك الخاصة.
في الدورة 50 يحمل الطلب مطالبة النظام و49 دورة سابقة والرسالة الجديدة: 400 + 49 × 250 + 60 = 12,710 رمز إدخال، للحصول على إجابة من 190 رمزًا. اجمع المحادثة بأكملها. مطالبة النظام والرسالة الجديدة تُرسلان في كل مرة: 50 × 460 = 23,000. السجل المتكرر يضيف 250 × 1,225 = 306,250. معًا: 23,000 + 306,250 = 329,250 رمز إدخال، مقابل 50 × 190 = 9,500 رمز إخراج.
السجل في كل طلب ينمو بدورة واحدة، لذا ينمو الإجمالي مع مربع طول المحادثة. انتقل من 50 إلى 100 دورة ويتضاعف جزء السجل المتكرر أربع مرات تقريبًا.
جرّب بنفسكجرب: إذا أرسلت مطالبة النظام فقط، وآخر 4 دورات والرسالة الجديدة، فكم رمز إدخال ستحمل الدورة 50؟إظهار الإجابة
1,460 (400 + 4 × 250 + 60)، مقابل 12,710 مع السجل الكامل. نفس السؤال، نفس طول الإجابة، جزء صغير من الإدخال.
الخيار 1: نافذة منزلقة#
الفكرة: أرسل دائمًا مطالبة النظام، وأسقط كل شيء عدا آخر N دورة. تحتفظ بالسجل الكامل في التخزين الخاص بك وتقتطع فقط النسخة التي ترسلها.
def trim_history(messages, keep_pairs=4):
"""System prompt + the last keep_pairs turns + the new user message."""
system = [m for m in messages if m["role"] == "system"]
rest = [m for m in messages if m["role"] != "system"]
return system + rest[-(keep_pairs * 2 + 1):]استدعها بعد إضافة رسالة المستخدم الجديدة. مع keep_pairs=4 يعني ذلك 4 أزواج مستخدم/مساعد بالإضافة إلى الرسالة الجديدة، 9 رسائل، والقطعة تبدأ دائمًا برسالة مستخدم. إليك كيفية ربطها في استدعاء حقيقي:
import 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"
history = [{"role": "system", "content": "You are a concise support assistant."}]
def ask(text):
history.append({"role": "user", "content": text})
resp = client.chat.completions.create(
model=MODEL,
messages=trim_history(history),
max_tokens=500,
)
answer = resp.choices[0].message.content
history.append({"role": "assistant", "content": answer})
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
return answerسطر print هو المفيد: راقب الرقم الأول. بدون الاقتطاع يتصاعد في كل دورة. مع النافذة يتوقف عن النمو بمجرد تجاوز المحادثة الدورة 4.

بالأرقام: من الدورة 5 فصاعدًا، كل طلب هو 400 + 4 × 250 + 60 = 1,460 رمز إدخال. الدورات الأربع الأولى لا تزال تنمو بشكل طبيعي وتجمع 3,340. المحادثة بأكملها: 3,340 + 46 × 1,460 = 70,500 رمز إدخال، حوالي خُمس 329,250 التي ترسلها مع السجل الكامل. الإخراج يبقى 50 × 190 = 9,500.

في الكود، التغيير كله هو وسيطة واحدة في الاستدعاء:
قارن
التغيير بسطر واحد
قبل
messages=historyبعد
messages=trim_history(history)المشكلة: النافذة تنسى. إذا سأل المستخدم في الدورة 40 "ما هو رقم طلبي؟" وكان الرقم في الدورة 3، فإن النموذج لم يره قط. حلان رخيصان. استخرج الحقائق الثابتة (الاسم، رقم الطلب، الخطة) من المحادثة في كودك الخاص وأضفها إلى مطالبة النظام، حيث لا تقطعها النافذة أبدًا. أو أضف ملخصًا، وهو الخيار التالي.
الخيار 2: ملخص للدورات القديمة#
بدلاً من إسقاط الدورات القديمة، تضغطها. كل بضع دورات، أرسل الدورات التي سقطت للتو من النافذة، بالإضافة إلى الملخص الحالي، إلى النموذج واطلب ملخصًا جديدًا قصيرًا. ثم ضع هذا الملخص في رسالة النظام.
def summarize(summary, old_messages):
transcript = "\n".join(f"{m['role']}: {m['content']}" for m in old_messages)
prompt = (
f"Summary so far:\n{summary}\n\nNew turns:\n{transcript}\n\n"
"Rewrite the summary in under 200 words. "
"Keep names, numbers, decisions and open questions."
)
resp = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
max_tokens=400,
)
return resp.choices[0].message.content
def build_messages(history, summary, keep_pairs=4):
system = history[0]["content"]
if summary:
system += "\n\nEarlier in this chat: " + summary
recent = history[1:][-(keep_pairs * 2 + 1):]
return [{"role": "system", "content": system}] + recentالملخص ليس مجانيًا: إنه استدعاء نموذج إضافي. افترض ملخصًا من حوالي 300 رمز، يتم تحديثه كل 5 دورات (9 مرات في 50 دورة)، كل تحديث يقرأ حوالي 1,600 رمز (الملخص القديم بالإضافة إلى خمس دورات بالإضافة إلى التعليمات) ويكتب 300. للبقاء على الجانب الآمن، احسب الملخص في كل طلب من الدورة 5 فصاعدًا (في الواقع يظهر بعد التحديث الأول، لذا هذا مبالغة طفيفة): 400 + 300 + 4 × 250 + 60 = 1,760 رمز إدخال.
الإجماليات للمحادثة: الطلبات الرئيسية 3,340 + 46 × 1,760 = 84,300 رمز إدخال، استدعاءات الملخص 9 × 1,600 = 14,400 إدخال و9 × 300 = 2,700 إخراج. إجمالاً 84,300 + 14,400 = 98,700 إدخال و9,500 + 2,700 = 12,200 رمز إخراج.
يكلف الملخص أكثر قليلاً من النافذة المجردة، وفي المقابل لا يزال النموذج يعرف ما حدث في الدورة 3.
تكلفة الإعدادات الثلاثة#
إليك نفس المحادثة من 50 دورة على DeepSeek-V4-Flash، مسعّرة مباشرة من الإجماليات أعلاه:
الأسعار تأتي من قائمة الأسعار المباشرة، لذا تتحدث الأرقام عندما تتغير التعريفة. الترتيب لن يتغير: النافذة ترسل الأقل، الملخص في المنتصف، السجل الكامل هو الأغلى.
لمحادثة كهذه، نموذج CheapTokens للبدء هو DeepSeek-V4-Flash. لديه نافذة سياق 380K (محادثة من 50 دورة تناسب حتى بدون اقتطاع)، حتى 32,768 رمز إخراج لكل إجابة، سعر ثابت واحد في أي ساعة من اليوم، وإجمالاً، مع احتساب الإدخال والإخراج معًا، فهو أرخص من OpenRouter. معرف النموذج هو deepseek-. إذا كنت تريد مقارنة النماذج على إعداد النافذة (1,410 رمز إدخال لكل طلب في المتوسط، 190 إخراج، 50 طلبًا)، إليك الجدول المباشر:
| النموذج | الإدخال $/1M | الإخراج $/1M | لكل طلب | 50 طلبات | OpenRouter، 50 طلبات |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000036 | $0.0018 | $0.0032 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00004 | $0.002 | $0.0063 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000099 | $0.005 | $0.0594 |
1,410 رمز إدخال و190 رمز إخراج لكل طلب. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.
GLM-5.3-Flash لديه سياق 390K وMiniMax-M2.7 لديه 180K، وهو ما يكفي لمحادثة مقتطعة. الأسعار الحالية على صفحة التسعير، والمستندات توضح كيفية إرسال الطلب الأول.
أي واحد تختار#
النافذة هي الافتراضي: ثلاثة أسطر من الكود، لا استدعاءات إضافية، لا وضع فشل إضافي. استخدمها لروبوتات الدعم والمعلمين ولعب الأدوار، حيث تحمل آخر بضع دورات المحادثة وتحمل مطالبة النظام القواعد. أضف الملخص عندما يشير المستخدمون إلى أشياء قيلت منذ فترة طويلة، كما في مساعد شخصي بمحادثة واحدة لا تنتهي. اجعل النافذة صغيرة بما يكفي ليرى النموذج السياق المباشر، وكبيرة بما يكفي لاحتواء تبادل سؤال وجواب كامل. كم يناسب على الإطلاق هو حد منفصل، مشمول في ما هي نافذة السياق.
فحص سريع
يسأل المستخدم في الدورة 40 عن رقم طلب مذكور في الدورة 3. تستخدم نافذة من 4 دورات بدون ملخص. ماذا يحدث؟
إظهار الإجابة
الإجابة: لا يستطيع النموذج رؤيته، لأن الدورة 3 قُطعت من الطلب
API عديمة الحالة. يرى النموذج فقط ما في الطلب، لذا يجب أن تبقى الحقائق التي لا تزال بحاجة إليها في مطالبة النظام أو في ملخص.



