Code
LiteLLM
Richten Sie LiteLLM mit dem Präfix openai/ und api_base auf nokeep aus. Es funktioniert im Proxy und im Python-SDK.
Geprüft am 29. Oktober 2026
Der 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.yamlIhre Apps rufen dann den Proxy (standardmäßig http://0.0.0.0:4000) mit dem model_name auf, und der Proxy ruft nokeep auf. model_info gibt LiteLLM die Preise von nokeep pro Token, damit die Kostenerfassung zu Ihrer Rechnung passt. Ohne model_info hat LiteLLM keinen Preis für die Modelle von nokeep und kann nicht zählen, was die Aufrufe kosten.
Das Python-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)Für LiteLLM wurde ein nativer nokeep-Provider vorgeschlagen. Bis er veröffentlicht ist, ist das Präfix openai/ mit api_base der Weg hinein; es schickt die Anfrage unverändert.
Streaming
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)Tools, Denken und Sampler
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)Mit dem Präfix openai/ gehen reasoning_effort und tools unverändert durch. Im Proxy setzen Sie feste Felder pro Modell unter litellm_params (zum Beispiel reasoning_effort: high), oder jeder Aufrufer schickt seine eigenen. Siehe Tool-Aufrufe und Denken.
Stolperfallen
- `reasoning_effort` nimmt nur die eigenen Werte des Modells.
deepseek-v4.1-flash-uncensorednimmtnone,low,high,max;glm-5.3-flash-uncensorednimmtlow,high. Die Werteminimal,mediumundxhighanderer Apps werden auf die nächstliegende Stufe des Modells abgebildet (mediumalshigh,xhighalsmax, wo das Modell sie hat); jeder andere Wert ergibt400 invalid_reasoning_effort. Siehe Denken. - GLM wählt seine Tools selbst.
glm-5.3-flash-uncensorednimmttool_choicenur alsautoodernone. Ein erzwungenes Tool (requiredoder ein benannter Funktionsname) ergibt400 unsupported_tool_choice. Nehmen Sie DeepSeek, wenn Sie eines erzwingen müssen. - Felder, die ein Modell nicht annimmt, werden verworfen, nicht abgelehnt. Der Aufruf wird trotzdem beantwortet, und der Antwort-Header
x-nokeep-ignorednennt, was weggelassen wurde. GLM behält nurtools,tool_choiceundreasoning_effort; daher werden seinetemperatureundresponse_formatverworfen. Siehe welche Felder jedes Modell annimmt. - Inhaltsteile sind nur Text und Bilder.
image_url-Teile funktionieren mitdeepseek-v4.1-flash-uncensored; GLM liest nur Text. Audio- und Dateiteile (ein PDF) ergeben400 unsupported_input. - `n` muss 1 sein. Fordern Sie mehrere Antworten mit mehreren Aufrufen an.
drop_params: true lässt LiteLLM vor dem Aufruf die Felder verwerfen, von denen es glaubt, dass ein Anbieter sie nicht annimmt. nokeep verwirft bereits, was ein Modell nicht annimmt, und nennt es im Header x-nokeep-ignored; Sie brauchen es also nicht.
Fragen
Trage ich meinen nokeep-Schlüssel in config.yaml ein?
Nein. Schreiben Sie api_key: os.environ/NOKEEP_API_KEY, und LiteLLM liest den Schlüssel beim Start aus der Umgebung.
Warum zeigt LiteLLM keine Kosten für nokeep-Aufrufe an?
Es kennt die Preise von nokeep nicht. Fügen Sie den Block model_info aus der Konfiguration oben hinzu; die Preise darin stammen aus derselben Tabelle wie Ihre Rechnung. Die Rechnung selbst rundet jeden Aufruf auf ganze Credits auf.