Optimasi biayaPanduan
Pangkas riwayat obrolan untuk memangkas biaya: jendela geser atau ringkasan
Batasi apa yang Anda kirim ulang pada setiap giliran: pertahankan beberapa pesan terakhir atau ringkasan singkat. Perhitungan token untuk obrolan 50 giliran dan helper Python.

Di halaman ini
Bot dukungan Anda sudah mengobrol selama 50 giliran, dan setiap pesan baru lebih mahal daripada pesan sebelumnya. API tidak mengingat apa pun, jadi kode Anda mengirim ulang seluruh percakapan setiap kali. Solusinya adalah membatasi apa yang Anda kirim: pertahankan system prompt dan beberapa giliran terakhir (jendela geser), atau ganti giliran lama dengan ringkasan singkat. Berikut adalah perhitungan untuk obrolan 50 giliran dan helper yang bisa Anda salin.
Panduan obrolan multi-putaran DeepSeek (api-docs.deepseek.com, diperiksa 1 November 2026) menyatakannya dengan jelas: server tidak mencatat konteks permintaan sebelumnya, jadi klien mengirim seluruh daftar messages pada setiap panggilan. Format yang kompatibel dengan OpenAI di CheapTokens bekerja dengan cara yang sama. Jika ini baru bagi Anda, mulailah dengan mengapa obrolan panjang lebih mahal dan cara kerja array messages.
Apa yang sebenarnya dikirim pada giliran ke-50#
Katakanlah Anda menjalankan bot dukungan dengan system prompt 400 token. Pada giliran tipikal, pengguna menulis sekitar 60 token dan bot menjawab dengan sekitar 190. Satu giliran penuh menambahkan 250 token ke riwayat. Itu adalah asumsi: ganti dengan angka dari bidang usage pada respons Anda sendiri.
Pada giliran ke-50, permintaan membawa system prompt, 49 giliran sebelumnya, dan pesan baru: 400 + 49 × 250 + 60 = 12,710 token input, untuk mendapatkan jawaban 190 token. Jumlahkan seluruh obrolan. System prompt dan pesan baru dikirim setiap kali: 50 × 460 = 23,000. Riwayat yang berulang menambahkan 250 × 1,225 = 306,250. Bersama-sama: 23,000 + 306,250 = 329,250 token input, dibandingkan dengan 50 × 190 = 9,500 token output.
Riwayat dalam setiap permintaan bertambah satu giliran, sehingga totalnya tumbuh sebanding dengan kuadrat panjang obrolan. Beralih dari 50 ke 100 giliran dan bagian riwayat berulang kira-kira menjadi empat kali lipat.
Coba sendiriCoba: jika Anda hanya mengirim system prompt, 4 giliran terakhir, dan pesan baru, berapa token input yang akan dibawa giliran ke-50?Tampilkan jawaban
1.460 (400 + 4 × 250 + 60), dibandingkan dengan 12.710 dengan riwayat penuh. Pertanyaan sama, panjang jawaban sama, sebagian kecil dari input.
Opsi 1: jendela geser#
Idenya: selalu kirim system prompt, buang semuanya kecuali N giliran terakhir. Anda menyimpan riwayat lengkap di penyimpanan Anda sendiri dan hanya memangkas salinan yang Anda kirim.
def trim_history(messages, keep_pairs=4):
"""System prompt + the last keep_pairs turns + the new user message."""
system = [m for m in messages if m["role"] == "system"]
rest = [m for m in messages if m["role"] != "system"]
return system + rest[-(keep_pairs * 2 + 1):]Panggil setelah Anda menambahkan pesan baru pengguna. Dengan keep_pairs=4 itu berarti 4 pasangan pengguna/asisten ditambah pesan baru, 9 pesan, dan potongan selalu dimulai pada pesan pengguna. Berikut cara memasangnya ke panggilan nyata:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
MODEL = "deepseek-ai/DeepSeek-V4-Flash-0731"
history = [{"role": "system", "content": "You are a concise support assistant."}]
def ask(text):
history.append({"role": "user", "content": text})
resp = client.chat.completions.create(
model=MODEL,
messages=trim_history(history),
max_tokens=500,
)
answer = resp.choices[0].message.content
history.append({"role": "assistant", "content": answer})
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
return answerBaris print adalah yang berguna: perhatikan angka pertama. Tanpa pemangkasan, angka itu naik setiap giliran. Dengan jendela, angka itu berhenti tumbuh setelah obrolan melewati giliran ke-4.

Dalam angka: dari giliran ke-5 dan seterusnya, setiap permintaan adalah 400 + 4 × 250 + 60 = 1,460 token input. Empat giliran pertama masih tumbuh normal dan berjumlah 3.340. Seluruh obrolan: 3,340 + 46 × 1,460 = 70,500 token input, sekitar seperlima dari 329.250 yang Anda kirim dengan riwayat penuh. Output tetap 50 × 190 = 9,500.

Dalam kode, seluruh perubahan adalah satu argumen dalam panggilan:
Bandingkan
Perubahan satu baris
Sebelum
messages=historySesudah
messages=trim_history(history)Jebakannya: jendela melupakan. Jika pengguna bertanya pada giliran ke-40 "berapa nomor pesanan saya?" dan nomor itu ada di giliran ke-3, model belum pernah melihatnya. Dua perbaikan murah. Tarik fakta stabil (nama, nomor pesanan, paket) dari obrolan di kode Anda sendiri dan tambahkan ke system prompt, di mana jendela tidak pernah memotongnya. Atau tambahkan ringkasan, yang merupakan opsi berikutnya.
Opsi 2: ringkasan giliran lama#
Alih-alih membuang giliran lama, Anda memadatkannya. Setiap beberapa giliran, kirim giliran yang baru saja keluar dari jendela, ditambah ringkasan saat ini, ke model dan minta ringkasan baru yang singkat. Lalu masukkan ringkasan itu ke dalam pesan sistem.
def summarize(summary, old_messages):
transcript = "\n".join(f"{m['role']}: {m['content']}" for m in old_messages)
prompt = (
f"Summary so far:\n{summary}\n\nNew turns:\n{transcript}\n\n"
"Rewrite the summary in under 200 words. "
"Keep names, numbers, decisions and open questions."
)
resp = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
max_tokens=400,
)
return resp.choices[0].message.content
def build_messages(history, summary, keep_pairs=4):
system = history[0]["content"]
if summary:
system += "\n\nEarlier in this chat: " + summary
recent = history[1:][-(keep_pairs * 2 + 1):]
return [{"role": "system", "content": system}] + recentRingkasan tidak gratis: itu adalah panggilan model tambahan. Asumsikan ringkasan sekitar 300 token, diperbarui setiap 5 giliran (9 kali dalam 50 giliran), setiap pembaruan membaca sekitar 1.600 token (ringkasan lama ditambah lima giliran ditambah instruksi) dan menulis 300. Untuk tetap di sisi aman, hitung ringkasan di setiap permintaan dari giliran ke-5 dan seterusnya (pada kenyataannya ringkasan muncul setelah pembaruan pertama, jadi ini sedikit perkiraan berlebih): 400 + 300 + 4 × 250 + 60 = 1,760 token input.
Total untuk obrolan: permintaan utama 3,340 + 46 × 1,760 = 84,300 token input, panggilan ringkasan 9 × 1,600 = 14,400 input dan 9 × 300 = 2,700 output. Secara keseluruhan 84,300 + 14,400 = 98,700 token input dan 9,500 + 2,700 = 12,200 token output.
Ringkasan sedikit lebih mahal daripada jendela polos, dan sebagai imbalannya model masih tahu apa yang terjadi pada giliran ke-3.
Berapa biaya ketiga pengaturan#
Berikut adalah obrolan 50 giliran yang sama pada DeepSeek-V4-Flash, dengan harga langsung dari total di atas:
Harga berasal dari daftar harga langsung, jadi angkanya diperbarui saat tarif berubah. Urutannya tidak akan berubah: jendela mengirim paling sedikit, ringkasan berada di antaranya, riwayat penuh paling mahal.
Untuk obrolan seperti ini, model CheapTokens yang cocok untuk memulai adalah DeepSeek-V4-Flash. Model ini memiliki jendela konteks 380K (obrolan 50 giliran muat bahkan tanpa pemangkasan), hingga 32.768 token output per jawaban, satu harga tetap pada jam berapa pun, dan secara total, dengan input dan output dihitung bersama, lebih murah daripada OpenRouter. Id modelnya adalah deepseek-. Jika Anda ingin membandingkan model pada pengaturan jendela (rata-rata 1.410 token input per permintaan, 190 output, 50 permintaan), berikut adalah tabel langsungnya:
| Model | Input $/1Jt | Output $/1Jt | Per permintaan | 50 permintaan | OpenRouter, 50 permintaan |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000036 | $0.0018 | $0.0032 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00004 | $0.002 | $0.0063 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000099 | $0.005 | $0.0594 |
1.410 token input dan 190 token output per permintaan. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.
GLM-5.3-Flash memiliki konteks 390K dan MiniMax-M2.7 memiliki 180K, yang cukup untuk obrolan yang dipangkas. Harga terkini ada di halaman harga, dan dokumentasi menunjukkan cara mengirim permintaan pertama.
Mana yang harus dipilih#
Jendela adalah pilihan default: tiga baris kode, tanpa panggilan tambahan, tanpa mode kegagalan tambahan. Gunakan untuk bot dukungan, tutor, dan role-play, di mana beberapa giliran terakhir membawa percakapan dan system prompt membawa aturan. Tambahkan ringkasan ketika pengguna merujuk kembali ke hal-hal yang dikatakan lama sebelumnya, seperti pada asisten pribadi dengan satu percakapan tanpa akhir. Jaga jendela cukup kecil agar model masih melihat konteks langsung, dan cukup besar untuk menampung pertukaran tanya-jawab lengkap. Berapa banyak yang muat sama sekali adalah batas terpisah, yang dibahas di apa itu jendela konteks.
Cek cepat
Pengguna bertanya pada giliran ke-40 tentang nomor pesanan yang diberikan pada giliran ke-3. Anda menggunakan jendela 4 giliran tanpa ringkasan. Apa yang terjadi?
Tampilkan jawaban
Jawaban: Model tidak dapat melihatnya, karena giliran ke-3 dipotong dari permintaan
API bersifat stateless. Model hanya melihat apa yang ada dalam permintaan, jadi fakta yang masih Anda butuhkan harus tetap ada di system prompt atau dalam ringkasan.



