Kode
LiteLLM
Arahkan LiteLLM ke nokeep dengan awalan openai/ dan api_base. Ini berjalan di proksi maupun di Python SDK.
Diperiksa 29 Oktober 2026
Proksinya
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.yamlAplikasimu lalu memanggil proksi (secara default http://0.0.0.0:4000) dengan model_name, dan proksi memanggil nokeep. model_info memberi LiteLLM harga nokeep per token, sehingga pelacakan pengeluarannya sama dengan tagihanmu. Tanpa itu, LiteLLM tidak punya harga untuk model nokeep dan tidak bisa menghitung biaya panggilan.
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)Sebuah penyedia nokeep asli telah diusulkan ke LiteLLM. Sampai itu dirilis, awalan openai/ dengan api_base adalah jalannya; permintaan dikirim apa adanya.
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, thinking, dan 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)Dengan awalan openai/, reasoning_effort dan tools diteruskan tanpa diubah. Di proksi, atur field tetap per model di bawah litellm_params (misalnya reasoning_effort: high), atau biarkan tiap pemanggil mengirim miliknya sendiri. Lihat Pemanggilan tool dan Thinking.
Jebakan
- `reasoning_effort` hanya menerima nilai milik model.
deepseek-v4.1-flash-uncensoredmenerimanone,low,high,max;glm-5.3-flash-uncensoredmenerimalow,high. Nilaiminimal,mediumdanxhighdari aplikasi lain dijalankan pada level terdekat model (mediumsebagaihigh,xhighsebagaimaxjika model punya), nilai lain apa pun mendapat400 invalid_reasoning_effort. Lihat Thinking. - GLM memilih tool-nya sendiri.
glm-5.3-flash-uncensoredhanya menerimatool_choiceautoataunone. Memaksa sebuah tool (required, atau menyebut nama fungsi) mendapat400 unsupported_tool_choice. Pakai DeepSeek jika perlu memaksa satu tool. - Field yang tidak bisa diterima sebuah model dibuang, bukan ditolak. Panggilan tetap dijawab, dan header respons
x-nokeep-ignoredmenyebut apa yang dibuang. GLM hanya menerimatools,tool_choicedanreasoning_effort, jaditemperaturedanresponse_format-nya dibuang. Lihat field apa yang diterima tiap model. - Bagian konten hanya teks dan gambar. Bagian
image_urlberfungsi dideepseek-v4.1-flash-uncensored; GLM hanya membaca teks. Bagian audio dan file (PDF) mendapat400 unsupported_input. - `n` harus 1. Minta beberapa balasan dengan beberapa panggilan.
drop_params: true membuat LiteLLM membuang field yang menurutnya tidak bisa diterima penyedia sebelum panggilan. nokeep sudah membuang yang tidak bisa diterima sebuah model dan menyebutkannya di x-nokeep-ignored, jadi kamu tidak perlu opsi itu.
Pertanyaan
Apakah saya memasukkan kunci nokeep di config.yaml?
Tidak. Tulis api_key: os.environ/NOKEEP_API_KEY dan LiteLLM membaca kunci dari environment saat mulai.
Kenapa LiteLLM tidak menampilkan biaya untuk panggilan nokeep?
Ia tidak tahu harga nokeep. Tambahkan blok model_info dari config di atas; harga di dalamnya berasal dari tabel yang sama dengan tagihanmu. Tagihan sendiri membulatkan tiap panggilan ke atas menjadi kredit utuh.