Aller au contenu
Toute la documentation

Code

LiteLLM

Dirigez LiteLLM vers nokeep avec le préfixe openai/ et api_base. Cela fonctionne dans le proxy comme dans le SDK Python.

Vérifié le 29 octobre 2026

Le 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

Vos applications appellent ensuite le proxy (par défaut http://0.0.0.0:4000) avec le model_name, et le proxy appelle nokeep. model_info donne à LiteLLM les prix de nokeep, par jeton, pour que son suivi des dépenses corresponde à votre facture. Sans cela, LiteLLM ne connaît pas de prix pour les modèles de nokeep et ne peut pas compter ce que coûtent les appels.

Le SDK Python

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)

Un fournisseur natif nokeep a été proposé à LiteLLM. Tant qu’il n’est pas publié, le préfixe openai/ avec api_base est la voie d’accès ; il envoie la requête telle quelle.

Flux

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)

Outils, réflexion et échantillonneurs

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)

Avec le préfixe openai/, reasoning_effort et tools passent inchangés. Dans le proxy, fixez les champs par modèle sous litellm_params (par exemple reasoning_effort: high), ou laissez chaque appelant envoyer les siens. Voir Appels d’outils et Réflexion.

Pièges

  • `reasoning_effort` n’accepte que les valeurs du modèle. deepseek-v4.1-flash-uncensored accepte none, low, high, max ; glm-5.3-flash-uncensored accepte low, high. Les valeurs minimal, medium et xhigh d’autres applications passent au niveau le plus proche du modèle (medium devient high, xhigh devient max quand le modèle le propose) ; toute autre valeur reçoit 400 invalid_reasoning_effort. Voir Réflexion.
  • GLM choisit lui-même ses outils. glm-5.3-flash-uncensored n’accepte que tool_choice auto ou none. Forcer un outil (required, ou nommer une fonction) reçoit 400 unsupported_tool_choice. Utilisez DeepSeek si vous devez en forcer un.
  • Les champs qu’un modèle ne peut pas prendre sont écartés, pas refusés. L’appel répond quand même, et l’en-tête de réponse x-nokeep-ignored nomme ce qui a été laissé de côté. GLM ne garde que tools, tool_choice et reasoning_effort : son temperature et son response_format sont donc écartés. Voir les champs acceptés par chaque modèle.
  • Les parties de contenu ne sont que du texte et des images. Les parties image_url fonctionnent sur deepseek-v4.1-flash-uncensored ; GLM ne lit que le texte. Les parties audio et fichier (un PDF) reçoivent 400 unsupported_input.
  • `n` doit valoir 1. Pour plusieurs réponses, faites plusieurs appels.

drop_params: true fait supprimer par LiteLLM les champs qu’il croit qu’un fournisseur ne peut pas prendre, avant l’appel. nokeep écarte déjà ce qu’un modèle ne peut pas prendre et le nomme dans x-nokeep-ignored : vous n’en avez pas besoin.

Questions

Dois-je mettre ma clé nokeep dans config.yaml ?

Non. Écrivez api_key: os.environ/NOKEEP_API_KEY et LiteLLM lit la clé dans l’environnement au démarrage.

Pourquoi LiteLLM n’affiche-t-il aucun coût pour les appels nokeep ?

Il ne connaît pas les prix de nokeep. Ajoutez le bloc model_info de la configuration ci-dessus ; les prix qui s’y trouvent viennent de la même table que votre facture. La facture elle-même arrondit chaque appel au crédit entier supérieur.