Zum Inhalt springen
Gesamte Doku

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

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

Ihre 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

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)

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

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)

Tools, Denken und Sampler

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)

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-uncensored nimmt none, low, high, max; glm-5.3-flash-uncensored nimmt low, high. Die Werte minimal, medium und xhigh anderer Apps werden auf die nächstliegende Stufe des Modells abgebildet (medium als high, xhigh als max, wo das Modell sie hat); jeder andere Wert ergibt 400 invalid_reasoning_effort. Siehe Denken.
  • GLM wählt seine Tools selbst. glm-5.3-flash-uncensored nimmt tool_choice nur als auto oder none. Ein erzwungenes Tool (required oder ein benannter Funktionsname) ergibt 400 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-ignored nennt, was weggelassen wurde. GLM behält nur tools, tool_choice und reasoning_effort; daher werden seine temperature und response_format verworfen. Siehe welche Felder jedes Modell annimmt.
  • Inhaltsteile sind nur Text und Bilder. image_url-Teile funktionieren mit deepseek-v4.1-flash-uncensored; GLM liest nur Text. Audio- und Dateiteile (ein PDF) ergeben 400 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.