کد
LiteLLM
LiteLLM را با پیشوند openai/ و api_base به nokeep وصل کن. هم در پروکسی کار میکند هم در SDK پایتون.
بررسیشده در ۷ آبان ۱۴۰۵
پروکسی
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بعد اپهایت پروکسی را (بهطور پیشفرض http://0.0.0.0:4000) با model_name صدا میزنند و پروکسی از nokeep میپرسد. model_info قیمتهای nokeep را برای هر توکن به LiteLLM میدهد تا پیگیری هزینهاش با صورتحسابت یکی باشد. بدون آن، 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)یک ارائهدهندهٔ بومی nokeep به LiteLLM پیشنهاد شده است. تا وقتی منتشر شود، راه ورود همان پیشوند 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 بدون تغییر عبور میکنند. در پروکسی، فیلدهای ثابت هر مدل را زیر 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فقطtool_choiceبا مقدارautoیاnoneرا میگیرد. اجبار به یک ابزار (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` باید ۱ باشد. برای چند پاسخ، چند درخواست جدا بفرست.
drop_params: true باعث میشود LiteLLM قبل از درخواست، فیلدهایی را که فکر میکند ارائهدهنده نمیپذیرد کنار بگذارد. nokeep از قبل فیلدهایی را که مدل نمیپذیرد حذف میکند و در x-nokeep-ignored نامشان را میآورد، پس به آن نیازی نیست.
پرسشها
کلید nokeep را در config.yaml بگذارم؟
نه. بنویس api_key: os.environ/NOKEEP_API_KEY تا LiteLLM موقع شروع کلید را از محیط بخواند.
چرا LiteLLM هزینهای برای درخواستهای nokeep نشان نمیدهد؟
قیمتهای nokeep را نمیشناسد. بلوک model_info را از تنظیمات بالا اضافه کن؛ قیمتهای آن از همان جدولی میآید که صورتحسابت. خود صورتحساب هر درخواست را به یک اعتبار کامل گرد میکند.