Перейти к содержанию
Вся документация

Код

LiteLLM

Направьте LiteLLM на nokeep с префиксом openai/ и api_base. Работает и в прокси, и в Python SDK.

Проверено 29 октября 2026 г.

Прокси

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 даёт LiteLLM цены nokeep за токен, чтобы учёт расходов совпадал со счётом. Без него у LiteLLM нет цены для моделей nokeep, и он не может посчитать стоимость вызовов.

Python 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 передаются без изменений. В прокси задайте фиксированные поля для каждой модели в 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` должен быть 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 из конфига выше: цены в нём взяты из той же таблицы, что и ваш счёт. Сам счёт округляет каждый вызов до целого кредита.