الكود
LiteLLM
وجّه LiteLLM إلى nokeep بالبادئة openai/ وapi_base. يعمل ذلك في الـ proxy وفي SDK بايثون.
تم التحقق في 29 أكتوبر 2026
الـ proxy
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.00000065pip 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 بايثون
pip install litellm
export NOKEEP_API_KEY="sk-nokeep-test" # your own key once it connectsimport 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 هي الطريقة؛ وهي ترسل الطلب كما هو.
البث
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)الأدوات والتفكير وأدوات أخذ العينات
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 من الإعداد أعلاه؛ الأسعار فيها مأخوذة من الجدول نفسه الذي تُحسب منه فاتورتك. والفاتورة نفسها تُقرّب كل طلب إلى رصيد كامل.