پرش به محتوا
همه مستندات

کد

LiteLLM

LiteLLM را با پیشوند openai/ و api_base به nokeep وصل کن. هم در پروکسی کار می‌کند هم در SDK پایتون.

بررسی‌شده در ۷ آبان ۱۴۰۵

پروکسی

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

بعد اپ‌هایت پروکسی را (به‌طور پیش‌فرض http://0.0.0.0:4000) با model_name صدا می‌زنند و پروکسی از nokeep می‌پرسد. model_info قیمت‌های nokeep را برای هر توکن به LiteLLM می‌دهد تا پیگیری هزینه‌اش با صورتحسابت یکی باشد. بدون آن، 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)

یک ارائه‌دهندهٔ بومی nokeep به LiteLLM پیشنهاد شده است. تا وقتی منتشر شود، راه ورود همان پیشوند 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 بدون تغییر عبور می‌کنند. در پروکسی، فیلدهای ثابت هر مدل را زیر 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 را از تنظیمات بالا اضافه کن؛ قیمت‌های آن از همان جدولی می‌آید که صورتحسابت. خود صورتحساب هر درخواست را به یک اعتبار کامل گرد می‌کند.