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
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.yamlVos 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
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)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
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
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-uncensoredacceptenone,low,high,max;glm-5.3-flash-uncensoredacceptelow,high. Les valeursminimal,mediumetxhighd’autres applications passent au niveau le plus proche du modèle (mediumdevienthigh,xhighdevientmaxquand le modèle le propose) ; toute autre valeur reçoit400 invalid_reasoning_effort. Voir Réflexion. - GLM choisit lui-même ses outils.
glm-5.3-flash-uncensoredn’accepte quetool_choiceautoounone. Forcer un outil (required, ou nommer une fonction) reçoit400 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-ignorednomme ce qui a été laissé de côté. GLM ne garde quetools,tool_choiceetreasoning_effort: sontemperatureet sonresponse_formatsont 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_urlfonctionnent surdeepseek-v4.1-flash-uncensored; GLM ne lit que le texte. Les parties audio et fichier (un PDF) reçoivent400 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.