Tagihan API AI dihitung dari token × harga per token × jumlah request. Jadi optimasi biaya artinya menurunkan salah satu dari tiga itu: harga per token (pakai model kecil untuk tugas sederhana), token yang ditagih penuh (prompt caching dan batas output), dan jumlah request (cache jawaban). Bayangin warung kopi. Pesanan kopi biasa dibuat dari sachet, barista cuma turun tangan untuk pesanan khusus. Air panas yang sudah direbus dipakai lagi, gak direbus ulang untuk tiap gelas. Dan kalau sepuluh orang memesan es teh yang sama, kamu menyiapkan satu teko.
🧪 Tebakan cepat: Asisten Toko Buku menjawab 10.000 pertanyaan sehari, semuanya dengan
gpt-6.1-sol, tanpa cache: $888 sebulan. Mana yang paling besar menghemat: cache jawaban, prompt caching, atau mengirim pertanyaan stok kegpt-6-luna? Tebak dulu, jawabannya ada di bagian "Routing model: model kecil untuk tugas sederhana".
Token jadi uang: hitung dulu
Harga di halaman "Pricing" OpenAI, Oktober 2026, dalam dolar per 1 juta token:
| Model | Input | Cache read | Cache write | Output |
|---|---|---|---|---|
gpt-6-luna |
$0,10 | $0,01 | $0,125 | $0,50 |
gpt-6.1-sol |
$2 | $0,10 | $2,50 | $10 |
gpt-6-astra |
$10 | $1 | $12,50 | $50 |
Di Anthropic: claude-haiku-5-5 $0,10 / $0,50, claude-sonnet-5-5 $2 / $10, claude-opus-5-5 $4 / $20 (halaman "Pricing" dan "Prompt caching" Anthropic, Oktober 2026).
Asumsi Asisten Toko Buku di Lab (angka contoh, ganti dengan usage milikmu): prefix tetap 1.100 token (instruksi, definisi tool, dan FAQ toko: retur, ongkir, jam buka), 100 token yang berubah (<data_stok> dan pertanyaan), output 40 token untuk pertanyaan stok dan 200 untuk rekomendasi. Log Lab dari 08.01 sampai 08.44 berisi 20 pertanyaan: 18 tanya stok atau harga, 2 minta rekomendasi. Sebulan 10.000 × 30 = 300.000 pertanyaan:
- stok dengan
gpt-6.1-sol: (1.200 × 2 + 40 × 10) / 1.000.000 = $0,0028 × 270.000 = $756 - rekomendasi: (1.200 × 2 + 200 × 10) / 1.000.000 = $0,0044 × 30.000 = $132
- total $888 sebulan
Routing model: model kecil untuk tugas sederhana
Routing artinya memilih model per pertanyaan. Pertanyaan stok cukup dijawab model kecil, karena jawabannya ada di <data_stok>; model besar cuma untuk yang butuh, seperti rekomendasi. Ini pola routing dari artikel Anthropic "Building effective agents" (pelajaran Agent).
const JUDUL = ["laskar pelangi", "bumi manusia", "cantik itu luka", "ronggeng dukuh paruk"];
function pilihModel(q) {
const t = q.toLowerCase();
const stokAtauHarga = JUDUL.some((j) => t.includes(j)) && /\b(stok|harga|ada|berapa|masih)\b/.test(t);
return stokAtauHarga ? "gpt-6-luna" : "gpt-6.1-sol";
}
Pertanyaan stok pindah ke gpt-6-luna, yang 20 kali lebih murah per token: (1.200 × 0,10 + 40 × 0,50) / 1.000.000 = $0,00014 × 270.000 = $37,80. Rekomendasi tetap $132. Totalnya $169,80, hemat 81%. Routing paling besar dampaknya. Itu jawaban tebakannya. Sebelum memindahkan, jalankan eval set (pelajaran Evaluating AI Output) dengan model kecilnya: lebih murah gak ada gunanya kalau angka stoknya jadi salah.
Prompt caching: prefix yang sama dibayar lebih murah
Prompt caching artinya provider menyimpan hasil olahan bagian awal prompt (prefix) yang sama di beberapa request, lalu request berikutnya membacanya dari cache dengan harga jauh lebih murah. Aturannya beda per provider (dicek Oktober 2026):
| OpenAI, GPT-5.6 ke atas | Anthropic | |
|---|---|---|
| Cara menyalakan | otomatis; mode explicit dengan prompt_cache_breakpoint untuk memilih ujung prefix |
cache_control: { type: "ephemeral" } di blok, atau sekali di level atas request |
| Minimum prefix | 1.024 token | 512 token di claude-haiku-5-5, Sonnet 5.5, Opus 5.5 |
| Tulis ke cache | 1,25× harga input | 1,25× (TTL 5 menit), 2× (TTL 1 jam) |
| Baca dari cache | 0,1× (0,05× di gpt-6.1-sol) |
0,1× (0,05× di Opus 5.5 dan Sonnet 5.5) |
| Umur | minimal 30 menit sejak dipakai terakhir | 5 menit, diperpanjang gratis tiap dipakai |
const res = await client.responses.create({
model: pilihModel(q),
reasoning: { effort: "none" },
prompt_cache_options: { mode: "explicit" },
tools,
input: [
{ role: "developer", content: [{ type: "input_text", text: ATURAN_DAN_FAQ, prompt_cache_breakpoint: { mode: "explicit" } }] },
{ role: "user", content: `<data_stok>${await dataStok()}</data_stok>\n<pertanyaan>${bersihkan(q)}</pertanyaan>` },
],
max_output_tokens: 300,
});
console.log(res.usage.input_tokens_details); // { cached_tokens, cache_write_tokens }
- Bagian yang sama (instruksi, tool, FAQ) di depan, yang berubah (stok, pertanyaan) di akhir. Satu karakter beda di depan membuat prefix-nya gak cocok lagi.
instructionsdi level atas gak bisa diberi breakpoint, jadi aturannya dipindah ke pesandeveloper. Mode explicit membuat bagian setelah breakpoint gak ikut ditulis ke cache (gak kena harga tulis 1,25×), seperti contoh juri satu-giliran di panduan OpenAI.- Mengubah
toolsataureasoning.effortjuga mengubah prefix.
Di Anthropic, bentuknya: system: [{ type: "text", text: ATURAN_DAN_FAQ, cache_control: { type: "ephemeral" } }], lalu cek usage.cache_creation_input_tokens dan usage.cache_read_input_tokens.
Hitungan Lab, dengan anggapan 95% request menemukan prefix di cache: per pertanyaan stok di gpt-6-luna jadi $0,0000473 (dari $0,00014), dan routing + prompt caching totalnya $86,04. Matikan FAQ di Lab: prefix tinggal 300 token, di bawah minimum 1.024, jadi gak ada yang di-cache dan gak ada error. Totalnya $100,20, lebih mahal daripada prompt 1.100 token yang ter-cache. Panduan OpenAI menyebut ini jebakan panjang minimum: kadang menambah isi yang berguna sampai melewati 1.024 token justru lebih murah.
Cache jawaban: pertanyaan + versi stok
Prompt caching tetap memanggil model. Cache jawaban gak memanggilnya sama sekali: pertanyaan yang sama dijawab dari simpanan.
const cache = new Map(); // di produksi: Redis atau cache Laravel
const kunci = (q, versi) => versi + ":" + q.toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, "").replace(/\s+/g, " ").trim();
async function tanya(q) {
const versi = await versiStok(); // naik setiap stok berubah
if (cache.has(kunci(q, versi))) return cache.get(kunci(q, versi));
const jawaban = await asisten(q);
cache.set(kunci(q, versi), jawaban);
return jawaban;
}
- Kunci dinormalkan: "stok laskar pelangi masih ada" dan "Stok Laskar Pelangi masih ada?" jadi kunci yang sama.
- Versi stok ada di kunci. Penjualan pukul 08.12 menaikkan versi 41 jadi 42, jadi jawaban "stoknya 12" yang lama gak terpakai lagi. Tanpa versi, cache menjawab stok basi.
- Parafrase gak ketemu: "Stok Cantik Itu Luka berapa?" beda kunci dengan "Cantik Itu Luka ada?". Cache berbasis kemiripan embedding bisa menangkapnya, tapi berisiko: "stok Bumi Manusia" dan "stok Laskar Pelangi" kalimatnya mirip, jawabannya beda.
Di log Lab, 8 dari 20 pertanyaan (40%) dijawab dari cache. Biayanya cuma turun dari $86,04 ke $80,36, karena pertanyaan stok di gpt-6-luna sudah murah. Untung utamanya waktu tunggu (jawaban langsung, tanpa request ke model) dan jatah rate limit.
Batasi token, dan pakai Batch untuk pekerjaan malam
max_output_tokensadalah batas atas token yang dibuat, termasuk token reasoning. Satu jawaban kebablasan 4.000 token digpt-6.1-sol= 4.000 × $10 / 1.000.000 = $0,04, sembilan kali pertanyaan rekomendasi biasa. Dengan batas 300, output paling mahal $0,003.- Batch API: OpenAI Batch API dan Anthropic Message Batches sama-sama 50% lebih murah, selesai dalam 24 jam. Meringkas ulang 5.000 sinopsis tiap malam (300 token masuk, 150 keluar) di
gpt-6.1-sol: $10,50 jadi $5,25. Untuk chat yang ditunggu pelanggan, tetap request biasa.
Jadi strategi paling efektif mengurangi biaya API LLM: cache jawaban, model lebih kecil untuk tugas sederhana, dan batasi token. Di Lab, ketiganya bersama prompt caching membuat $888 jadi $80,36 sebulan, sekitar 91% lebih hemat.
⚠️ Jebakan yang sering ketemu
- Menurunkan temperature supaya jawabannya pendek. Temperature mengatur seberapa acak jawabannya, bukan panjangnya. Panjang dibatasi
max_output_tokensdan instruksi. - Mengira streaming lebih murah. Token stream ditagih sama persis; streaming cuma membuat jawaban terasa lebih cepat.
- Bagian yang berubah ditaruh di depan prompt. Stok atau tanggal di awal membuat prefix beda tiap request, jadi cache-nya gak pernah kena.
- Cache jawaban tanpa versi data. Jawaban "stoknya 12" terus diberikan setelah bukunya habis.
- Mengira self-host selalu lebih murah. Untuk volume Toko Buku,
gpt-6-lunasudah sangat murah; hitungannya ada di pelajaran Ollama.
TL;DR: Biaya = token × harga × jumlah request. Hitung dulu dari usage: semua pertanyaan ke gpt-6.1-sol = $888 sebulan di 10.000 pertanyaan sehari. Routing (stok ke gpt-6-luna, 20 kali lebih murah) menghemat paling banyak: $169,80. Prompt caching (OpenAI GPT-5.6 ke atas: minimal 1.024 token, tulis 1,25×, baca 0,1× atau 0,05× di gpt-6.1-sol, umur minimal 30 menit; Anthropic cache_control: minimal 512 token di Haiku 5.5, tulis 1,25×, baca 0,1×, TTL 5 menit) menurunkan jadi $86,04, asal bagian tetap di depan dan panjangnya lewat minimum. Cache jawaban dengan kunci pertanyaan yang dinormalkan + versi stok menjawab 40% log tanpa model ($80,36). max_output_tokens membatasi jawaban kebablasan, dan Batch API memotong 50% untuk pekerjaan yang boleh selesai dalam 24 jam. Temperature dan streaming gak menurunkan biaya.