انتقل إلى المحتوى
كل التوثيق

الكود

LiteLLM

وجّه LiteLLM إلى nokeep بالبادئة openai/ وapi_base. يعمل ذلك في الـ proxy وفي SDK بايثون.

تم التحقق في 29 أكتوبر 2026

الـ proxy

config.yaml
model_list:
  - model_name: deepseek-v4.1-flash-uncensored
    litellm_params:
      model: openai/deepseek-v4.1-flash-uncensored
      api_base: https://nokeep.ai/v1
      api_key: os.environ/NOKEEP_API_KEY
    model_info:
      input_cost_per_token: 0.00000045
      cache_read_input_token_cost: 0.000000011
      output_cost_per_token: 0.00000175
  - model_name: glm-5.3-flash-uncensored
    litellm_params:
      model: openai/glm-5.3-flash-uncensored
      api_base: https://nokeep.ai/v1
      api_key: os.environ/NOKEEP_API_KEY
    model_info:
      input_cost_per_token: 0.0000002
      cache_read_input_token_cost: 0.00000004
      output_cost_per_token: 0.00000065
Shell
pip install 'litellm[proxy]'
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
litellm --config config.yaml

ثم تستدعي تطبيقاتك الـ proxy (افتراضيًا http://0.0.0.0:4000) باستخدام model_name، ويستدعي الـ proxy nokeep. يمنح model_info لـ LiteLLM أسعار nokeep لكل رمز، فيتطابق تتبع إنفاقه مع فاتورتك. ومن دونه لا يعرف LiteLLM سعر نماذج nokeep، ولا يستطيع حساب تكلفة الطلبات.

SDK بايثون

Shell
pip install litellm
export NOKEEP_API_KEY="sk-nokeep-test"  # your own key once it connects
Python
import os
import litellm

reply = litellm.completion(
    model="openai/deepseek-v4.1-flash-uncensored",
    api_base="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
    messages=[{"role": "user", "content": "Name three good names for a tavern."}],
)
print(reply.choices[0].message.content)
print(reply.usage)

اقتُرح على LiteLLM مزوّد nokeep أصلي. إلى أن يُصدَر، فإن البادئة openai/ مع api_base هي الطريقة؛ وهي ترسل الطلب كما هو.

البث

Python
import os
import litellm

stream = litellm.completion(
    model="openai/deepseek-v4.1-flash-uncensored",
    api_base="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
    messages=[{"role": "user", "content": "Tell me a story in three lines."}],
    stream=True,
    stream_options={"include_usage": True},
)
for chunk in stream:
    if chunk.choices:
        print(chunk.choices[0].delta.content or "", end="", flush=True)
    if getattr(chunk, "usage", None):
        print("\n", chunk.usage)

الأدوات والتفكير وأدوات أخذ العينات

Python
import os
import litellm

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get the weather in a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

reply = litellm.completion(
    model="openai/deepseek-v4.1-flash-uncensored",
    api_base="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
    messages=[{"role": "user", "content": "What's the weather in Lisbon?"}],
    tools=tools,
    reasoning_effort="high",
    max_tokens=4000,
    extra_body={"min_p": 0.05},  # fields LiteLLM has no argument for
)
print(reply.choices[0].message.tool_calls)

مع البادئة openai/ تمرّ reasoning_effort وtools كما هي. وفي الـ proxy، اضبط حقولًا ثابتة لكل نموذج تحت litellm_params (مثلًا reasoning_effort: high)، أو دَع كل مستدعٍ يرسل حقوله. اطلع على استدعاء الأدوات والتفكير.

أمور تستحق الانتباه

  • `reasoning_effort` يقبل قيم النموذج نفسه فقط. يقبل deepseek-v4.1-flash-uncensored القيم none وlow وhigh وmax، ويقبل glm-5.3-flash-uncensored القيمتين low وhigh. أما minimal وmedium وxhigh من التطبيقات الأخرى فتعمل على أقرب مستوى للنموذج (medium كـ high، وxhigh كـ max حيث يتوفر)، وأي قيمة أخرى تُرجع 400 invalid_reasoning_effort. اطلع على التفكير.
  • GLM يختار أدواته بنفسه. يقبل glm-5.3-flash-uncensored القيمة auto أو none فقط في tool_choice. فرض أداة (required أو تسمية دالة) يُرجع 400 unsupported_tool_choice. استخدم DeepSeek حين تحتاج إلى فرض أداة.
  • الحقول التي لا يقبلها النموذج تُسقَط ولا تُرفض. يُجيب الطلب مع ذلك، وترويسة الاستجابة x-nokeep-ignored تسمّي ما استُبعد. يقبل GLM الحقول tools وtool_choice وreasoning_effort فقط، لذا تُسقَط temperature وresponse_format عنده. اطلع على الحقول التي يقبلها كل نموذج.
  • أجزاء المحتوى نص وصور فقط. تعمل أجزاء image_url مع deepseek-v4.1-flash-uncensored، أما GLM فيقرأ النص وحده. أجزاء الصوت والملفات (مثل PDF) تُرجع 400 unsupported_input.
  • يجب أن تكون قيمة `n` هي 1. لطلب عدة ردود، أرسل عدة طلبات.

يجعل drop_params: true من LiteLLM يُسقط قبل الطلب الحقول التي يظن أن المزوّد لا يقبلها. تُسقط nokeep أصلًا ما لا يقبله النموذج وتذكره في x-nokeep-ignored، فلا حاجة إليه.

أسئلة

هل أضع مفتاح nokeep في config.yaml؟

لا. اكتب api_key: os.environ/NOKEEP_API_KEY فيقرأ LiteLLM المفتاح من متغيرات البيئة عند التشغيل.

لماذا لا يُظهر LiteLLM أي تكلفة لطلبات nokeep؟

لأنه لا يعرف أسعار nokeep. أضف كتلة model_info من الإعداد أعلاه؛ الأسعار فيها مأخوذة من الجدول نفسه الذي تُحسب منه فاتورتك. والفاتورة نفسها تُقرّب كل طلب إلى رصيد كامل.