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

API وSDKدليل

LiteLLM مع api_base مخصص: استدعاء CheapTokens في Python

استخدم بادئة openai/ وapi_base ومعرّف نموذج كامل لاستدعاء CheapTokens من litellm.completion() ومن إعداد الوكيل config.yaml في LiteLLM، وأصلح Not Found.

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

استدعاء LiteLLM مع بادئة openai/ للنموذج وapi_base يشير إلى CheapTokens
في هذه الصفحة
  1. الاستدعاء نفسه في Python وفي الوكيل
  2. ما الذي يجب أن تراه
  3. إضافة المزيد من النماذج إلى الوكيل
  4. عندما يتعطل: Not Found و401
  5. تكلفة ألف استدعاء

لإرسال LiteLLM إلى CheapTokens تغيّر ثلاث قيم: model يأخذ البادئة openai/ أمام معرّف النموذج الكامل، وapi_base يصبح https://api.cheaptokens.dev/v1، وapi_key هو مفتاح CheapTokens الخاص بك. هذا هو التبديل كله، سواء لـ litellm.completion() في Python أو لوكيل LiteLLM.

لنفترض أن لديك مشروعًا يستدعي litellm.completion() بنموذج OpenAI أو Anthropic، وتريد تجربة نموذج أرخص دون المساس ببقية الكود. البادئة هي ما يجعل ذلك يعمل: تقول وثائق مزوّد OpenAI المتوافق في LiteLLM (تم التحقق في 29 أكتوبر 2026) إنه لأي نقطة نهاية متوافقة مع OpenAI تضبط النموذج بـ openai/ حتى يوجّه LiteLLM الطلب إلى مزوّد OpenAI، ثم تمرّر api_base وapi_key بجانبه. يتحدث CheapTokens بصيغة OpenAI Chat Completions على https://api.cheaptokens.dev/v1، لذا فهو مناسب.

الاستدعاء نفسه في Python وفي الوكيل#

الإعدادان قصيران. اختر التبويب الذي يطابق طريقة تشغيلك لـ LiteLLM.

نموذج CheapTokens واحد، وطريقتان لاستدعائه

Python SDK

python
import os
import litellm

response = litellm.completion(
    model="openai/deepseek-ai/DeepSeek-V4-Flash-0731",
    api_base="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
    messages=[{"role": "user", "content": "Explain what api_base does in one sentence."}],
    max_tokens=200,
)

print(response.choices[0].message.content)
print(response.usage)

احتفظ بالمفتاح في متغير بيئة، لا في الملف.

إعداد الوكيل config.yaml

yaml
model_list:
  - model_name: cheap-chat
    litellm_params:
      model: openai/deepseek-ai/DeepSeek-V4-Flash-0731
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY

شغّله بـ litellm --config /path/to/config.yaml. يطلب العملاء من الوكيل cheap-chat ولا يرون معرّف النموذج الحقيقي أبدًا.

استدعاء الوكيل

bash
curl http://localhost:4000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "cheap-chat", "messages": [{"role": "user", "content": "Say hi"}]}'

يستمع الوكيل على المنفذ 4000 افتراضيًا. بدّل النموذج خلف cheap-chat لاحقًا ولن يتغير هذا الطلب.

معرّف النموذج هو الجزء الذي يتعثر فيه الناس. المعرّف الذي يقبله CheapTokens هو الكامل، deepseek-ai/DeepSeek-V4-Flash-0731، وopenai/ يأتي أمامه. ليس deepseek-v4-flash، وليس مجرد البادئة مع اسم قصير. إن لم تكن متأكدًا من اسم النموذج، اعرض النماذج بـ GET /v1/models وانسخ المعرّف من الرد.

استدعاء Python مع القيم الثلاث المتغيرة
القيم الثلاث التي تتغير: النموذج مع بادئة openai/، وapi_base، وapi_key.

ما الذي يجب أن تراه#

شغّل تبويب Python. يُظهر print الأول نص النموذج. ويُظهر الثاني response.usage، عدد الرموز لهذا الاستدعاء الواحد: prompt_tokens لما أرسلته وcompletion_tokens لما كتبه النموذج. يعيدها LiteLLM بصيغة OpenAI، لذا يستمر الكود الذي يقرأ usage في العمل. إن أردت تحويل هذين الرقمين إلى فاتورة جارية، يُظهر تتبع تكلفة رموز الوكيل في Python كيف.

إضافة المزيد من النماذج إلى الوكيل#

فكرة model_name هي أن يحتفظ عملاؤك باسم مستعار واحد بينما تغيّر ما يقف خلفه. يمكن لـ model_list أن يحمل عدة إدخالات، كلها تشير إلى نفس api_base ونفس المفتاح، لأن رصيد CheapTokens واحد يغطي كل النماذج:

yaml
model_list:
  - model_name: cheap-chat
    litellm_params:
      model: openai/deepseek-ai/DeepSeek-V4-Flash-0731
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY
  - model_name: cheap-glm
    litellm_params:
      model: openai/zai-org/GLM-5.3-Flash
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY
  - model_name: cheap-minimax
    litellm_params:
      model: openai/MiniMaxAI/MiniMax-M2.7
      api_base: https://api.cheaptokens.dev/v1
      api_key: os.environ/CHEAPTOKENS_API_KEY

أي اسم مستعار لأي مهمة؟ لاستدعاءات الدردشة والوكلاء حيث قد تطول الإجابة، ابدأ بـ DeepSeek-V4-Flash: سياق 380K، وحتى 32,768 رمز إخراج لكل إجابة، وسعر ثابت بلا ساعات ذروة. يمتلك GLM-5.3-Flash سياقًا 390K وحتى 8,192 رمز إخراج. ويمتلك MiniMax-M2.7 سياقًا 180K. تحتوي صفحة DeepSeek على التفاصيل، وتُدرج الأسعار المعدلات الحالية للثلاثة.

عندما يتعطل: Not Found و401#

يغطي خطآن معظم الاستدعاءات الأولى الفاشلة. تقول وثائق LiteLLM ألا تضيف أي شيء إضافي إلى عنوان URL الأساسي، وأنه عند خطأ Not Found يجب أن تتحقق من أن api_base ينتهي بـ /v1. ملاحظة واحدة: مثال الوثائق نفسه لوكيل محلي يستخدم http://0.0.0.0:4000 بلا /v1. ذلك خادم مختلف. بالنسبة لـ CheapTokens يبقى /v1.

Not Found عندما لا يحتوي api_base على /v1
خطأ 404 Not Found يعني عادةً أن api_base يفتقد /v1.

اختر حالتك

كيف يبدو خطؤك؟

Not Found (404)

تحقق من api_base. يجب أن يكون بالضبط https://api.cheaptokens.dev/v1، مع /v1 وبدون /chat/completions في النهاية. يضيف LiteLLM بقية المسار بنفسه.

401 Unauthorized

المفتاح مفقود أو خاطئ، أو قرأ LiteLLM متغير بيئة فارغًا. اطبع طول os.environ.get("CHEAPTOKENS_API_KEY")، لا المفتاح نفسه، للتحقق من أنه مضبوط، وتأكد من أنك لم تمرر مفتاح OpenAI بدافع العادة.

النموذج مرفوض

قارن المعرّف حرفًا بحرف مع المعرّف من /v1/models. بادئة openai/ مخصصة لـ LiteLLM فقط؛ وما يليها هو معرّف CheapTokens الكامل، بما في ذلك جزء المطوّر قبل الشرطة المائلة.

للاطلاع على الشرح الكامل لرموز الحالة راجع API 401 أو 404: مفتاح أو عنوان URL أساسي أو معرّف نموذج خاطئ. إن أردت الفكرة وراء api_base أولًا، يشرحها ما هو base_url وكيف تبدّل بالنسخة المبسطة.

فحص سريع

قيمة api_base لديك هي https://api.cheaptokens.dev والاستدعاء يعيد Not Found. ما الذي تغيّره أولًا؟

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

الإجابة: أضف /v1 ليصبح https://api.cheaptokens.dev/v1

يشير Not Found إلى المسار. المفتاح سيعطي 401، والبادئة هي ما يخبر LiteLLM باستخدام الطلب بأسلوب OpenAI.

تكلفة ألف استدعاء#

افترض أن روبوت دعم خلف الوكيل يرسل 1,000 طلب يوميًا، كل منها بنحو 2,000 رمز إدخال (السؤال مع السياق) و500 رمز إخراج. إليك هذا الحمل على الأسعار الحية، مع عمود OpenRouter للمقارنة بالإجمالي، مع احتساب الإدخال والإخراج معًا:

النموذج لكل طلب 1,000 طلبات OpenRouter، 1,000 طلبات
GLM-5.3-Flash $0.00006 $0.06 $0.121
DeepSeek-V4-Flash $0.00008 $0.08 $0.173
MiniMax-M2.7 $0.00018 $0.175 $1.20

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

بالنسبة لـ DeepSeek-V4-Flash يكلف هذا الحمل $0.08 يوميًا، ويُظهر الجدول أنه أرخص من OpenRouter إجمالًا. غيّر الرقمين إلى متوسط طلبك الخاص وستحصل على ميزانيتك.

هذا كل ما يحتاجه LiteLLM: ثلاث قيم، و/v1 واحد، ومعرّف نموذج كامل. أضف المفتاح من لوحة التحكم لديك وشغّل تبويب Python.