[{"data":1,"prerenderedAt":425},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-what-a-prompt-cache-remembers-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_id":8,"slug":9,"excerpt":10,"excerpt_id":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_id":26,"slug":27},9,"Articles","Artikel","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_id":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_id":36,"slug":37},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":39,"title_id":40,"slug":41},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":43,"title_id":44,"slug":45},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_id":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_id":53,"slug":54},"Learning Python","Belajar Python","belajar-python",{"title":56,"title_id":57,"slug":58},"Learning Go","Belajar Golang","belajar-golang",{"title":60,"title_id":61,"slug":62},"Learning Java","Belajar Java","belajar-java",{"title":64,"title_id":65,"slug":66},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_id":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":307,"renderedTakeaway":308,"latestArticles":309,"toc":409},{"id":74,"title":75,"title_id":75,"slug":76,"excerpt":77,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":85,"series":86,"authors":299,"seoTitle":21,"seoDescription":21,"body_locale":302,"available_locales":303,"body":305,"takeway":306,"prerequisite":21},140,"Apa yang Sebenarnya Diingat Prompt Cache","what-a-prompt-cache-remembers","Empat provider meng-cache byte yang sama dengan empat buku aturan berbeda. Pertanyaan yang menentukan tagihanmu: saat permintaan kedua lebih panjang, apakah seluruh prefix dipakai ulang atau cuma bagian yang sudah pernah ditulis?","2026-11-08T01:10:00.000Z",6,[81,82,83,84],"llm","ai-agent","cache","api","\u002Fog\u002Fwhat-a-prompt-cache-remembers.png",{"id":87,"title":35,"title_id":36,"slug":37,"description":88,"description_id":21,"articles":89,"children_series":291,"parent_series":292},8,"Notes on AI that go past the demo: how the models work, where they break, and what changes once you put them in production.",[90,107,124,139,153,167,183,200,220,239,258,272,284],{"id":91,"title":92,"title_id":93,"slug":94,"excerpt":95,"excerpt_id":96,"has_translation":12,"published_at":97,"reading_time":98,"hidden_from_listing":15,"tags":99,"thumbnail_image":21,"og_image":104,"series":105,"authors":106},1,"Why Does AI Keep Hallucinating? Meet JEPA, the AI Brain With Common Sense","Kenapa AI Suka 'Halu'? Kenalan sama JEPA, Otak AI yang Punya Akal Sehat","kenapa-ai-suka-halu-kenalan-sama-jepa-otak-ai-yang-punya-akal-sehat","Generative AI hallucinates because all it does is guess word patterns. JEPA tries to change that by teaching machines how the real world works, the way a human brain does.","AI generatif sering 'halu' karena cuma jago nebak pola kata. JEPA coba ngerombak itu dengan ngajarin AI cara kerja dunia nyata kayak otak manusia.","2026-06-02T08:09:05.595Z",4,[100,101,102,103],"jepa","artificial-intelligence","yann-lecun","agi","\u002Fog\u002Fkenapa-ai-suka-halu-kenalan-sama-jepa-otak-ai-yang-punya-akal-sehat.png",{"id":87,"title":35,"title_id":36,"slug":37},[],{"id":108,"title":109,"title_id":110,"slug":111,"excerpt":112,"excerpt_id":113,"has_translation":12,"published_at":114,"reading_time":98,"hidden_from_listing":15,"tags":115,"thumbnail_image":21,"og_image":116,"series":117,"authors":118},2,"LLMs Are Going to Hit a Wall. What Then?","LLM Bakal Mentok, Terus Gimana Dong?","llm-bakal-mentok-terus-gimana-dong","LLMs like ChatGPT are great at stringing words together, but they never really grasp reality. Yann LeCun says this architecture will hit a wall and needs a new answer.","LLM kayak ChatGPT itu jago ngerangkai kata, tapi nggak beneran paham realitas. Yann LeCun bilang arsitektur ini bakal mentok dan butuh solusi baru.","2026-06-03T08:55:33.003Z",[101,81,102,100],"\u002Fog\u002Fllm-bakal-mentok-terus-gimana-dong.png",{"id":87,"title":35,"title_id":36,"slug":37},[119],{"authors_id":120},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},"Daffa Izzuddin","izzudd","Writer",{"id":125,"title":126,"title_id":127,"slug":128,"excerpt":129,"excerpt_id":130,"has_translation":12,"published_at":131,"reading_time":98,"hidden_from_listing":15,"tags":132,"thumbnail_image":21,"og_image":134,"series":135,"authors":136},3,"Meet JEPA: Where AI Starts Learning Common Sense","Mengenal JEPA: Saat AI Mulai Belajar Punya \"Akal Sehat\"","kenapa-ai-suka-halu-dan-gimana-jepa-beresin-masalah-ini","AI hallucinates because it only guesses data probabilities without understanding reality. The JEPA architecture tries to change that by building a world model in its head.","AI sering 'halu' karena cuma nebak probabilitas data tanpa paham realita. Arsitektur JEPA mencoba mengubah itu dengan membangun model dunia di kepalanya.","2026-06-03T09:32:50.446Z",[101,100,133,102],"world-models","\u002Fog\u002Fkenapa-ai-suka-halu-dan-gimana-jepa-beresin-masalah-ini.png",{"id":87,"title":35,"title_id":36,"slug":37},[137],{"authors_id":138},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":98,"title":140,"title_id":141,"slug":142,"excerpt":143,"excerpt_id":144,"has_translation":12,"published_at":145,"reading_time":98,"hidden_from_listing":15,"tags":146,"thumbnail_image":21,"og_image":148,"series":149,"authors":150},"Beyond Generative AI: JEPA Chases Human-Style Conceptual Understanding","Bukan Sekadar Generative AI, JEPA Coba Kejar Pemahaman Konsep ala Manusia","kenapa-ai-masih-gagal-paham-fisika-dasar-mengenal-arsitektur-jepa","AI usually only guesses pixels, while JEPA tries to learn from abstract concepts in latent space. That approach turns out to reach as far as reading brain waves.","AI biasanya cuma jago nebak piksel, tapi JEPA coba belajar lewat konsep abstrak di ruang laten. Ternyata, cara ini bisa sampai dipakai buat baca gelombang otak.","2026-06-03T09:34:14.840Z",[100,102,147,103],"machine-learning","\u002Fog\u002Fkenapa-ai-masih-gagal-paham-fisika-dasar-mengenal-arsitektur-jepa.png",{"id":87,"title":35,"title_id":36,"slug":37},[151],{"authors_id":152},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":14,"title":154,"title_id":155,"slug":156,"excerpt":157,"excerpt_id":158,"has_translation":12,"published_at":159,"reading_time":98,"hidden_from_listing":15,"tags":160,"thumbnail_image":21,"og_image":162,"series":163,"authors":164},"Inside JEPA's Kitchen: The Secrets of EMA, VICReg, and Compute Efficiency","Di Balik Dapur JEPA: Rahasia EMA, VICReg, dan Efisiensi Komputasi","di-balik-dapur-jepa-rahasia-ema-vicreg-dan-efisiensi-komputasi","Bored of AI that only guesses words or memorizes pixels? Meet JEPA, an architecture that teaches machines common sense very cheaply. Here is a look at its technical insides.","Bosen sama AI yang cuma jago nebak kata atau ngafalin pixel? Kenalan sama JEPA, arsitektur revolusioner yang ngajarin mesin punya \"akal sehat\" secara super efisien. Yuk intip jeroan teknisnya!","2026-06-07T16:14:13.723Z",[100,161],"artificial-intelligent","\u002Fog\u002Fdi-balik-dapur-jepa-rahasia-ema-vicreg-dan-efisiensi-komputasi.png",{"id":87,"title":35,"title_id":36,"slug":37},[165],{"authors_id":166},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":168,"title":169,"title_id":170,"slug":171,"excerpt":172,"excerpt_id":173,"has_translation":12,"published_at":174,"reading_time":87,"hidden_from_listing":15,"tags":175,"thumbnail_image":21,"og_image":180,"series":181,"authors":182},125,"MCP, Rebuilt: Good News If You're Tired of Writing Connectors","MCP dibongkar ulang: kabar baik buat kamu yang capek nulis konektor","mcp-dibongkar-ulang-kabar-baik-buat-kamu","You have a few internal APIs and one AI agent, but the code has to be rewritten every time the model changes. MCP ends that, and this year the protocol was rebuilt so servers can run like ordinary web servers. Here's what changed. 🔧","Kamu punya beberapa API internal dan satu agent AI, tapi kodenya harus ditulis ulang tiap kali modelnya diganti. MCP datang buat mengakhiri itu, dan tahun ini protokolnya dibongkar ulang supaya server-nya bisa jalan seperti web server biasa. Yuk lihat apa yang berubah. 🔧","2026-10-16T05:00:00.000Z",[176,177,82,81,178,179],"mcp","model-context-protocol","backend","python","\u002Fog\u002Fmcp-dibongkar-ulang-kabar-baik-buat-kamu.png",{"id":87,"title":35,"title_id":36,"slug":37},[],{"id":184,"title":185,"title_id":186,"slug":187,"excerpt":188,"excerpt_id":189,"has_translation":12,"published_at":190,"reading_time":191,"hidden_from_listing":15,"tags":192,"thumbnail_image":21,"og_image":195,"series":196,"authors":197},126,"AI Agent Memory: From Vector Store to Temporal Graph","Memori AI Agent: dari Vector Store ke Temporal Graph","memori-ai-agent-vector-store-ke-temporal-graph","Two contradictory facts make an agent answer nonsense. Here is how a vector store and a temporal knowledge graph differ at keeping long-term state.","Dua fakta yang saling bertentangan bikin agent menjawab ngawur. Ini bedanya vector store dan temporal knowledge graph dalam menjaga state jangka panjang.","2026-10-18T13:13:29.458Z",7,[193,81,178,194],"ai","system-design","\u002Fog\u002Fmemori-ai-agent-vector-store-ke-temporal-graph.png",{"id":87,"title":35,"title_id":36,"slug":37},[198],{"authors_id":199},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":201,"title":202,"title_id":203,"slug":204,"excerpt":205,"excerpt_id":206,"has_translation":12,"published_at":207,"reading_time":79,"hidden_from_listing":15,"tags":208,"thumbnail_image":21,"og_image":215,"series":216,"authors":217},127,"Why RAG That Leans on Cosine Similarity Alone Keeps Missing","Kenapa RAG yang cuma andalkan cosine similarity sering nyasar","kenapa-rag-cuma-cosine-similarity-sering-nyasar","RAG that leans only on embeddings returns chunks that look close in meaning, not the ones you need. Here is why, and the two layers that patch it.","RAG yang cuma andalkan embedding balikin chunk yang mirip maknanya, bukan yang kamu butuh. Ini penyebabnya, dan dua lapis penambalnya.","2026-10-19T02:04:06.718Z",[209,210,211,212,213,214],"rag","vector-search","bm25","hybrid-search","retrieval","embedding","\u002Fog\u002Fkenapa-rag-cuma-cosine-similarity-sering-nyasar.png",{"id":87,"title":35,"title_id":36,"slug":37},[218],{"authors_id":219},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":221,"title":222,"title_id":223,"slug":224,"excerpt":225,"excerpt_id":226,"has_translation":12,"published_at":227,"reading_time":79,"hidden_from_listing":15,"tags":228,"thumbnail_image":21,"og_image":234,"series":235,"authors":236},128,"Linear or Graph: How to Run Many Agents Without an Eternal Loop","Linear atau graf: cara mengatur banyak agent tanpa loop abadi","multi-agen-linear-atau-grafik","One agent with twenty tools gets messy fast. Once several agents revise each other, you need a graph that allows cycles and a number that makes it stop.","Satu agent dengan dua puluh tool gampang kacau. Begitu beberapa agent saling revisi, kamu butuh graf yang mendukung cycle dan angka yang membuatnya berhenti.","2026-10-21T16:05:00.000Z",[229,230,231,232,233,81],"multi-agent","langgraph","autogen","orkestrasi","checkpoint","\u002Fog\u002Fmulti-agen-linear-atau-grafik.png",{"id":87,"title":35,"title_id":36,"slug":37},[237],{"authors_id":238},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":240,"title":241,"title_id":242,"slug":243,"excerpt":244,"excerpt_id":245,"has_translation":12,"published_at":246,"reading_time":14,"hidden_from_listing":15,"tags":247,"thumbnail_image":21,"og_image":253,"series":254,"authors":255},129,"So Your RAG Stops Hitting 504: Split the Query Path From Ingestion","Biar RAG nggak kena 504: pisahin jalur query dan ingestion","rag-pisah-jalur-query-dan-ingestion","One RAG service that both parses uploads and answers queries will fall over the moment someone uploads a 200-page PDF. The cure is two paths and one queue.","Satu service RAG yang merangkap parsing dan menjawab kueri bakal tumbang pas ada yang upload PDF 200 halaman. Obatnya dua jalur dan satu queue.","2026-10-22T01:30:00.000Z",[209,248,249,250,251,252],"cloud-run","cloud-tasks","gcp","serverless","arsitektur","\u002Fog\u002Frag-pisah-jalur-query-dan-ingestion.png",{"id":87,"title":35,"title_id":36,"slug":37},[256],{"authors_id":257},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":259,"title":260,"title_id":21,"slug":261,"excerpt":262,"excerpt_id":21,"has_translation":15,"published_at":263,"reading_time":14,"hidden_from_listing":15,"tags":264,"thumbnail_image":21,"og_image":267,"series":268,"authors":269},134,"Your Stream Dies at 125 Seconds and Nothing in Your Code Says 125","your-stream-dies-at-125-seconds","Streaming moves the wait into a connection that outlives the request. Four layers sit between the model and the browser, their idle timeouts disagree, and the smallest one ends your stream.","2026-11-04T01:00:00.000Z",[265,266,82,84],"streaming","sse","\u002Fog\u002Fyour-stream-dies-at-125-seconds.png",{"id":87,"title":35,"title_id":36,"slug":37},[270],{"authors_id":271},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":273,"title":274,"title_id":21,"slug":275,"excerpt":276,"excerpt_id":21,"has_translation":15,"published_at":277,"reading_time":98,"hidden_from_listing":15,"tags":278,"thumbnail_image":21,"og_image":279,"series":280,"authors":281},135,"Caching That Never Hits Costs More Than No Caching","caching-that-never-hits","Same model, same conversation, same token count, and a bill five times higher. The cause is a prefix that changes, a write premium nobody reads about, and a cost curve that grows faster than the loop.","2026-11-04T01:10:00.000Z",[81,82,83,84],"\u002Fog\u002Fcaching-that-never-hits.png",{"id":87,"title":35,"title_id":36,"slug":37},[282],{"authors_id":283},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":74,"title":285,"title_id":75,"slug":76,"excerpt":286,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":85,"series":287,"authors":288},"What a Prompt Cache Actually Remembers","Four providers cache the same bytes under four different rulebooks. The question that decides your bill: when the second request is longer than the first, does it reuse the whole prefix or only the part that was already written?",{"id":87,"title":35,"title_id":36,"slug":37},[289],{"authors_id":290},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},[],{"id":24,"title":25,"title_id":26,"slug":27,"parent_series":21,"children_series":293},[294,295,297],{"id":87,"title":35,"title_id":36,"slug":37,"cover_image":21},{"id":296,"title":39,"title_id":40,"slug":41,"cover_image":21},12,{"id":298,"title":43,"title_id":44,"slug":45,"cover_image":21},15,[300],{"authors_id":301},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},"id",[304,302],"en","\nPrompt cache tidak mengingat promptmu. Dia mengingat prefix yang pernah ditulis permintaan sebelumnya, di batas yang ditandai permintaan itu, lalu mengembalikan yang terpanjang yang masih cocok. Semua kejutan soal token caching mengalir dari kalimat itu, termasuk tagihan yang tidak kamu duga.\n\nIni versi terkecil dari kejutannya. System prompt-mu 512 token. Giliran pertama mengirim 512 token itu. Giliran kedua mengirim 512 yang sama ditambah pesan 512 token. Provider membaca 512 token dari cache, menagih harga penuh untuk 512 sisanya, dan paruh kedua itu tetap di luar cache sampai ada permintaan berikutnya yang menulisnya. Giliran ketiga mengirim 1.536 token dan membaca 1.024.\n\nCache tumbuh satu giliran di belakangmu. Itu bukan bug di provider mana pun; memang begitu cara kerja prefix cache.\n\n## Empat buku aturan, satu mekanisme\n\nSemua provider besar meng-cache tiga hal yang sama: key-value state model untuk satu urutan token, hash prefix yang menghasilkannya, dan masa kedaluwarsa. Mereka berbeda di empat tempat, dan tiap perbedaan muncul di tagihan.\n\n**Caching implisit** menyala secara bawaan dan provider yang memilih di mana prefix yang bisa dipakai ulang berakhir. OpenAI melakukannya di semua model yang didukung, Gemini menyebutnya implicit caching, dan DeepSeek menjalankannya di disk tanpa perlu opt-in sama sekali.\n\n**Breakpoint eksplisit** menaruh kendali batas di tanganmu. Anthropic menerima `cache_control` di sebuah blok, maksimal empat per permintaan. OpenAI punya gagasan yang sama di GPT-5.6 ke atas lewat `prompt_cache_options.mode: \"explicit\"`, juga dengan empat penulisan per permintaan.\n\n**Objek cache bernama** adalah mode eksplisit Gemini: kamu membuat cache, merujuknya dengan nama, dan membayar penyimpanan per token-jam di atas harga token input. TTL-nya dari satu menit sampai tanpa batas, bawaan 60 menit.\n\n**Sticky routing** bukan cache. OpenRouter melacak sebuah percakapan supaya permintaan berikutnya mendarat di provider yang masih menyimpan prefix-mu, dan kunci percakapannya diturunkan dari hash pesan system pertama dan pesan user pertama. System prompt yang berubah tiap menit merusak kunci itu juga, lalu percakapannya pindah ke tempat yang cache-nya kosong.\n\n```figure\ncache-prefix-hierarchy\n```\n\nAngka di bawah datang dari dokumentasi provider masing-masing pada November 2026. Pengalinya mirip antar vendor; minimum dan masa hidupnya tidak, dan dua hal itulah yang menentukan apakah sebuah permintaan kena cache.\n\n| | Anthropic | OpenAI (GPT-5.6+) | Gemini | DeepSeek |\n|---|---|---|---|---|\n| Pemicu tulis | blok `cache_control`, atau otomatis di blok terakhir yang bisa di-cache | breakpoint eksplisit, atau implisit di pesan terakhir yang memenuhi syarat | implisit secara bawaan, atau cache bernama | otomatis di batas permintaan |\n| Prefix minimum | 512 token di model terbaru, 1.024 sampai 4.096 di model lama | 1.024 token input yang terlihat | 2.048 di Gemini 2, 4.096 di Gemini 3 dan 4, 6.144 di sebagian preview 3.x | tidak didokumentasikan |\n| Pencarian | hash prefix di tiap breakpoint, mundur 20 blok | hash breakpoint, ditambah sampai 20 ujung pesan sebelumnya | best effort | harus cocok penuh dengan unit prefix tersimpan |\n| Masa hidup bawaan | 5 menit, diperpanjang saat dipakai; 1 jam kalau diminta | 30 menit, atau 12 jam dengan harga tulis lebih tinggi | sampai 24 jam untuk implisit; 60 menit bawaan untuk eksplisit | jam sampai hari, best effort |\n| Harga baca | 0,1x input, 0,05x di Sonnet 5.5 dan Opus 5.5 | 0,1x input, 0,05x di GPT-6.1 Sol dan Terra | diskon 90% | harga hit yang lebih murah |\n| Harga tulis | 1,25x untuk 5 menit, 2x untuk 1 jam | 1,25x untuk 30 menit, 2,5x untuk 12 jam | harga input biasa, ditambah penyimpanan kalau eksplisit | bukan harga terpisah |\n\nToken yang kena cache tetap dihitung ke batas token-per-menit di OpenAI, jadi semua ini tidak menambah throughput. Yang dibeli cuma uang.\n\n## Pertanyaan 512 token\n\nAmbil prefix 512 token, pesan 512 token per giliran, dan pengali yang dipakai sebagian besar model: input $2 per juta token, tulis 1,25x, baca 0,1x.\n\n```figure\ncache-prefix-growth\n```\n\nGiliran pertama menulis 512 token seharga $0,00128 dan tidak membaca apa pun. Giliran kedua membaca 512 seharga $0,00010 dan menulis 512 baru seharga $0,00128. Giliran ketiga membaca 1.024 dan menulis 512 baru. Selama tiga giliran itu totalnya $0,0041, dibanding $0,0061 tanpa caching sama sekali.\n\nAda dua hal yang rusak di sini, dan keduanya cukup umum sampai dokumentasinya menyebutnya.\n\n**Memperpanjang pesan alih-alih menambah pesan baru.** Panduan OpenAI tegas soal ini. Kalau permintaan pertama berakhir dengan pesan user berisi `Content A`, lalu permintaan kedua memperpanjang pesan yang sama menjadi `Content A + Content B`, batas lama sekarang berada di dalam sebuah pesan. Prefix yang tersimpan tidak dipakai ulang di situ tanpa breakpoint eksplisit. DeepSeek menyatakan aturan yang sama dengan kata lain. Permintaan `A + B` lalu `A + B + C` kena unit `A + B`; permintaan `A + B` lalu `A + C` tidak kena apa pun, walau ia mengajari sistem menyimpan `A` yang dipakai bersama untuk permintaan ketiga.\n\n**Jatuh di bawah minimum.** Di GPT-5.6 ke atas, 512 token tidak bisa di-cache sama sekali, karena minimumnya 1.024 token input yang terlihat; hit pertama yang mungkin adalah giliran kedua, dan itu mencakup seluruh 1.024. Di Gemini 2 tunggunya 2.048 token, dan di Gemini 3 dan 4 tunggunya 4.096. Model Anthropic terbaru menerima 512, dan itulah sebabnya contoh di atas mungkin di sana dan belum tentu di tempat lain.\n\n## Dua breakpoint yang membohongimu\n\nBreakpoint di blok yang berubah setiap permintaan menulis entri baru tiap kali dan tidak pernah membaca satu pun. Dokumentasi Anthropic menyebut ini kesalahan umum dengan kata yang persis. Pencariannya menelusuri mundur mencari entri yang *ditulis* permintaan sebelumnya, bukan mencari konten yang stabil. Kalau tidak ada yang menulis entri di ujung blok statismu, tidak ada apa pun untuk ditemukan di balik sebuah timestamp.\n\nJebakan kedua adalah jarak. Anthropic menelusuri mundur 20 posisi blok dari sebuah breakpoint; OpenAI memeriksa sampai 20 ujung pesan sebelumnya di mode implisit. Satu giliran yang menambahkan lebih dari 20 blok, atau percakapan yang tumbuh melewatinya, meninggalkan entri terakhir di luar jendela. Untuk itulah breakpoint kedua dan ketiga ada.\n\n## Tujuh setelan yang menentukan hit rate\n\n1. **Urutkan berdasarkan seberapa sering bagiannya berubah.** Definisi tool, lalu instruksi, lalu materi referensi, lalu percakapan. Apa pun yang berubah per permintaan tempatnya setelah semua yang tidak berubah.\n2. **Taruh breakpoint di ujung blok stabil terakhir.** Bukan di blok terakhir. Di percakapan yang tumbuh, blok terakhir berhasil, karena giliran sebelumnya menulis di sana; di prompt dengan akhiran yang berubah, tidak.\n3. **Tambahkan, jangan tulis ulang.** Ringkasan adalah pesan baru di ujung, bukan versi lebih kecil dari transkrip di awal. Compaction dan pemotongan mereset prefix sejak token pertama yang berubah.\n4. **Jaga array tool tetap identik byte demi byte.** Matikan tool dengan `tool_choice: \"none\"` alih-alih menghapus definisinya, dan jangan pernah menaruh id sesi atau timestamp snapshot di deskripsi.\n5. **Cocokkan masa hidup dengan jedanya.** Buku panduan yang dipakai sepanjang hari butuh penulisan satu jam dengan 2x. Ekor percakapan butuh yang bawaan, karena toh kedaluwarsa di antara sesi.\n6. **Kirim permintaan yang berhubungan ke cache yang sama.** Di model OpenAI sebelum GPT-5.6 itu berarti `prompt_cache_key` yang stabil, dibidik sekitar 15 permintaan per menit per kunci. Lewat router, artinya prefix yang tidak berubah, supaya kunci routing-nya tidak ikut berubah.\n7. **Baca penghitungnya.** `cache_read_input_tokens`, `cached_tokens`, `prompt_cache_hit_tokens`, `cachedContentTokenCount`. Tiap provider melaporkan token yang datang dari cache pada permintaan itu. Hit rate mendekati nol pada prompt yang kelihatan statis berarti prefix-nya berubah di tempat yang belum kamu periksa.\n\n## Yang tidak dibeli caching\n\nToken input yang kena cache tetap dihitung ke batas rate limit di OpenAI, jadi caching tidak akan menyelamatkan loop yang sedang di-throttle. Entri cache di Anthropic baru tersedia setelah respons pertama mulai, jadi permintaan paralel yang datang bersamaan tidak bisa saling menolong. Konten system yang disembunyikan tidak dihitung ke prefix minimum di kedua provider. Cache terisolasi per organisasi dan, di Claude API, per workspace, jadi dua salinan prompt yang sama di dua workspace adalah dua penulisan. Dan Gemini menagih penyimpanan untuk cache eksplisit per token-jam, meteran kedua yang bisa membengkak kalau cache-nya dibiarkan 24 jam.\n\n```figure\ncache-cost-curve\n```\n\nTidak ada satu pun dari ini yang mengubah bentuk kurva biayanya. Caching membagi tagihannya sekitar lima kali dan membiarkan pertumbuhannya, karena transkripnya tetap tumbuh dan tetap kamu kirim ulang tiap giliran. Di loop empat puluh giliran yang dihitung di artikel sebelumnya, caching memindahkan $2,16 ke $0,43 dan kedua angka tetap naik mengikuti kuadrat jumlah giliran.\n\nUrutkan prompt berdasarkan seberapa sering bagiannya berubah, taruh breakpoint di ujung bagian yang tidak berubah, dan ukur penghitungnya di permintaan berikutnya. Kalau hit rate-nya mendekati nol padahal prompt-nya kelihatan statis, prefix-nya berubah di array tool, di baris pertama system prompt, atau di suatu tempat di atas blok yang ingin kamu cache.\n","- **Entri cache adalah hash sebuah prefix, ditulis di batas yang kamu tandai.** Entri itu tidak pernah tumbuh sendiri: permintaan yang lebih panjang hanya memakai ulang bagian yang sudah ditulis permintaan sebelumnya.\n- **Kasus 512 ke 1.024 cuma punya satu jawaban.** 512 token pertama kembali dengan harga baca, 512 token baru dibayar penuh, dan baru bisa dipakai ulang mulai permintaan berikutnya.\n- **Panjang minimum menentukan apakah kamu dapat hit sama sekali.** 512 token bisa di-cache di model Anthropic terbaru, 1.024 di GPT-5.6 ke atas, dan 2.048 sampai 6.144 di Gemini tergantung modelnya.\n- **Posisi breakpoint adalah seluruh permainannya.** Di blok yang berubah setiap permintaan, tiap penulisan terbuang; di ujung blok stabil, satu penulisan bertahan sepanjang percakapan.\n- **Ukur penghitung yang dilaporkan, bukan saklar fiturnya.** Setiap provider memberitahu berapa token yang datang dari cache pada permintaan itu, dan angka itulah satu-satunya bukti caching bekerja.","\u003Cp>Prompt cache tidak mengingat promptmu. Dia mengingat prefix yang pernah ditulis permintaan sebelumnya, di batas yang ditandai permintaan itu, lalu mengembalikan yang terpanjang yang masih cocok. Semua kejutan soal token caching mengalir dari kalimat itu, termasuk tagihan yang tidak kamu duga.\u003C\u002Fp>\n\u003Cp>Ini versi terkecil dari kejutannya. System prompt-mu 512 token. Giliran pertama mengirim 512 token itu. Giliran kedua mengirim 512 yang sama ditambah pesan 512 token. Provider membaca 512 token dari cache, menagih harga penuh untuk 512 sisanya, dan paruh kedua itu tetap di luar cache sampai ada permintaan berikutnya yang menulisnya. Giliran ketiga mengirim 1.536 token dan membaca 1.024.\u003C\u002Fp>\n\u003Cp>Cache tumbuh satu giliran di belakangmu. Itu bukan bug di provider mana pun; memang begitu cara kerja prefix cache.\u003C\u002Fp>\n\u003Ch2 id=\"empat-buku-aturan-satu-mekanisme\">Empat buku aturan, satu mekanisme\u003C\u002Fh2>\n\u003Cp>Semua provider besar meng-cache tiga hal yang sama: key-value state model untuk satu urutan token, hash prefix yang menghasilkannya, dan masa kedaluwarsa. Mereka berbeda di empat tempat, dan tiap perbedaan muncul di tagihan.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Caching implisit\u003C\u002Fstrong> menyala secara bawaan dan provider yang memilih di mana prefix yang bisa dipakai ulang berakhir. OpenAI melakukannya di semua model yang didukung, Gemini menyebutnya implicit caching, dan DeepSeek menjalankannya di disk tanpa perlu opt-in sama sekali.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Breakpoint eksplisit\u003C\u002Fstrong> menaruh kendali batas di tanganmu. Anthropic menerima \u003Ccode>cache_control\u003C\u002Fcode> di sebuah blok, maksimal empat per permintaan. OpenAI punya gagasan yang sama di GPT-5.6 ke atas lewat \u003Ccode>prompt_cache_options.mode: &quot;explicit&quot;\u003C\u002Fcode>, juga dengan empat penulisan per permintaan.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Objek cache bernama\u003C\u002Fstrong> adalah mode eksplisit Gemini: kamu membuat cache, merujuknya dengan nama, dan membayar penyimpanan per token-jam di atas harga token input. TTL-nya dari satu menit sampai tanpa batas, bawaan 60 menit.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Sticky routing\u003C\u002Fstrong> bukan cache. OpenRouter melacak sebuah percakapan supaya permintaan berikutnya mendarat di provider yang masih menyimpan prefix-mu, dan kunci percakapannya diturunkan dari hash pesan system pertama dan pesan user pertama. System prompt yang berubah tiap menit merusak kunci itu juga, lalu percakapannya pindah ke tempat yang cache-nya kosong.\u003C\u002Fp>\n\u003Cfigure class=\"ds-figure not-prose\" data-ds-figure=\"cache-prefix-hierarchy\">\n  \u003Cdiv class=\"ds-figure-body\">\n    \u003Cdiv class=\"ds-panel\">\n      \u003Cdiv class=\"ds-panel-head\">\u003Cspan class=\"ds-panel-title\">Tiga tingkat, satu urutan\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"ds-stack\">\n        \u003Cdiv class=\"ds-tier\">\u003Cspan class=\"ds-tier-name\">definisi tool\u003C\u002Fspan>\u003Cspan class=\"ds-tier-tag\">5 tool · ~120 token · jarang berubah\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"ds-tier\">\u003Cspan class=\"ds-tier-name\">system prompt\u003C\u002Fspan>\u003Cspan class=\"ds-tier-tag\">buku panduan · 6.050 token · tidak pernah berubah\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"ds-tier is-open\">\u003Cspan class=\"ds-tier-name\">messages\u003C\u002Fspan>\u003Cspan class=\"ds-tier-tag\">transkrip · +350 token per giliran\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"ds-bp\">\u003Cspan class=\"ds-bp-caret\" aria-hidden=\"true\">▲\u003C\u002Fspan>breakpoint di sini\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"ds-note\">Timestamp di definisi tool membatalkan ketiga tingkat. Timestamp yang sama di pesan terakhir hanya membatalkan yang sesudahnya.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n  \u003Cfigcaption>Cache itu hierarki, bukan kolam: dibangun dari atas ke bawah, dan tiap tingkat bergantung pada tingkat di atasnya.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>\u003Cp>Angka di bawah datang dari dokumentasi provider masing-masing pada November 2026. Pengalinya mirip antar vendor; minimum dan masa hidupnya tidak, dan dua hal itulah yang menentukan apakah sebuah permintaan kena cache.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C\u002Fth>\n\u003Cth>Anthropic\u003C\u002Fth>\n\u003Cth>OpenAI (GPT-5.6+)\u003C\u002Fth>\n\u003Cth>Gemini\u003C\u002Fth>\n\u003Cth>DeepSeek\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Pemicu tulis\u003C\u002Ftd>\n\u003Ctd>blok \u003Ccode>cache_control\u003C\u002Fcode>, atau otomatis di blok terakhir yang bisa di-cache\u003C\u002Ftd>\n\u003Ctd>breakpoint eksplisit, atau implisit di pesan terakhir yang memenuhi syarat\u003C\u002Ftd>\n\u003Ctd>implisit secara bawaan, atau cache bernama\u003C\u002Ftd>\n\u003Ctd>otomatis di batas permintaan\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Prefix minimum\u003C\u002Ftd>\n\u003Ctd>512 token di model terbaru, 1.024 sampai 4.096 di model lama\u003C\u002Ftd>\n\u003Ctd>1.024 token input yang terlihat\u003C\u002Ftd>\n\u003Ctd>2.048 di Gemini 2, 4.096 di Gemini 3 dan 4, 6.144 di sebagian preview 3.x\u003C\u002Ftd>\n\u003Ctd>tidak didokumentasikan\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Pencarian\u003C\u002Ftd>\n\u003Ctd>hash prefix di tiap breakpoint, mundur 20 blok\u003C\u002Ftd>\n\u003Ctd>hash breakpoint, ditambah sampai 20 ujung pesan sebelumnya\u003C\u002Ftd>\n\u003Ctd>best effort\u003C\u002Ftd>\n\u003Ctd>harus cocok penuh dengan unit prefix tersimpan\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Masa hidup bawaan\u003C\u002Ftd>\n\u003Ctd>5 menit, diperpanjang saat dipakai; 1 jam kalau diminta\u003C\u002Ftd>\n\u003Ctd>30 menit, atau 12 jam dengan harga tulis lebih tinggi\u003C\u002Ftd>\n\u003Ctd>sampai 24 jam untuk implisit; 60 menit bawaan untuk eksplisit\u003C\u002Ftd>\n\u003Ctd>jam sampai hari, best effort\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Harga baca\u003C\u002Ftd>\n\u003Ctd>0,1x input, 0,05x di Sonnet 5.5 dan Opus 5.5\u003C\u002Ftd>\n\u003Ctd>0,1x input, 0,05x di GPT-6.1 Sol dan Terra\u003C\u002Ftd>\n\u003Ctd>diskon 90%\u003C\u002Ftd>\n\u003Ctd>harga hit yang lebih murah\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Harga tulis\u003C\u002Ftd>\n\u003Ctd>1,25x untuk 5 menit, 2x untuk 1 jam\u003C\u002Ftd>\n\u003Ctd>1,25x untuk 30 menit, 2,5x untuk 12 jam\u003C\u002Ftd>\n\u003Ctd>harga input biasa, ditambah penyimpanan kalau eksplisit\u003C\u002Ftd>\n\u003Ctd>bukan harga terpisah\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Token yang kena cache tetap dihitung ke batas token-per-menit di OpenAI, jadi semua ini tidak menambah throughput. Yang dibeli cuma uang.\u003C\u002Fp>\n\u003Ch2 id=\"pertanyaan-512-token\">Pertanyaan 512 token\u003C\u002Fh2>\n\u003Cp>Ambil prefix 512 token, pesan 512 token per giliran, dan pengali yang dipakai sebagian besar model: input $2 per juta token, tulis 1,25x, baca 0,1x.\u003C\u002Fp>\n\u003Cfigure class=\"ds-figure not-prose\" data-ds-figure=\"cache-prefix-growth\">\n  \u003Cdiv class=\"ds-figure-body\">\n    \u003Cdiv class=\"ds-panel\">\n      \u003Cdiv class=\"ds-panel-head\">\u003Cspan class=\"ds-panel-title\">Yang bisa dipakai ulang permintaan kedua\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"ds-legend\">\n        \u003Cspan>\u003Ci class=\"ds-swatch is-hit\">\u003C\u002Fi>dibaca dari cache\u003C\u002Fspan>\n        \u003Cspan>\u003Ci class=\"ds-swatch is-fresh\">\u003C\u002Fi>ditulis giliran ini\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"ds-scroll\">\u003Cdiv class=\"ds-seg-table\">\u003Cdiv class=\"ds-seg-row\">\n    \u003Cdiv class=\"ds-seg-name\">giliran 1\u003Cspan>write 512 · read 0\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"ds-seg-track\">\u003Cdiv class=\"ds-seg-bar\" style=\"width:33%\">\u003Cdiv class=\"ds-seg is-fresh\" style=\"flex:512 1 0\">\n    \u003Cspan class=\"ds-seg-tokens\">512\u003C\u002Fspan>\n    \u003Cspan class=\"ds-seg-label\">ditulis giliran ini\u003C\u002Fspan>\n  \u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\u003Cdiv class=\"ds-seg-row\">\n    \u003Cdiv class=\"ds-seg-name\">giliran 2\u003Cspan>read 512 · write 512\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"ds-seg-track\">\u003Cdiv class=\"ds-seg-bar\" style=\"width:67%\">\u003Cdiv class=\"ds-seg is-hit\" style=\"flex:512 1 0\">\n    \u003Cspan class=\"ds-seg-tokens\">512\u003C\u002Fspan>\n    \u003Cspan class=\"ds-seg-label\">dibaca dari cache\u003C\u002Fspan>\n  \u003C\u002Fdiv>\u003Cdiv class=\"ds-seg is-fresh\" style=\"flex:512 1 0\">\n    \u003Cspan class=\"ds-seg-tokens\">512\u003C\u002Fspan>\n    \u003Cspan class=\"ds-seg-label\">ditulis giliran ini\u003C\u002Fspan>\n  \u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\u003Cdiv class=\"ds-seg-row\">\n    \u003Cdiv class=\"ds-seg-name\">giliran 3\u003Cspan>read 1,024 · write 512\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"ds-seg-track\">\u003Cdiv class=\"ds-seg-bar\" style=\"width:100%\">\u003Cdiv class=\"ds-seg is-hit\" style=\"flex:1024 1 0\">\n    \u003Cspan class=\"ds-seg-tokens\">1.024\u003C\u002Fspan>\n    \u003Cspan class=\"ds-seg-label\">dibaca dari cache\u003C\u002Fspan>\n  \u003C\u002Fdiv>\u003Cdiv class=\"ds-seg is-fresh\" style=\"flex:512 1 0\">\n    \u003Cspan class=\"ds-seg-tokens\">512\u003C\u002Fspan>\n    \u003Cspan class=\"ds-seg-label\">ditulis giliran ini\u003C\u002Fspan>\n  \u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n  \u003Cfigcaption>Prefix tumbuh 512 token per giliran, dan tiap giliran hanya memakai ulang yang pernah ditulis giliran sebelumnya — tidak lebih. Tambahan 512 dibayar penuh saat pertama kali muncul.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>\u003Cp>Giliran pertama menulis 512 token seharga $0,00128 dan tidak membaca apa pun. Giliran kedua membaca 512 seharga $0,00010 dan menulis 512 baru seharga $0,00128. Giliran ketiga membaca 1.024 dan menulis 512 baru. Selama tiga giliran itu totalnya $0,0041, dibanding $0,0061 tanpa caching sama sekali.\u003C\u002Fp>\n\u003Cp>Ada dua hal yang rusak di sini, dan keduanya cukup umum sampai dokumentasinya menyebutnya.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Memperpanjang pesan alih-alih menambah pesan baru.\u003C\u002Fstrong> Panduan OpenAI tegas soal ini. Kalau permintaan pertama berakhir dengan pesan user berisi \u003Ccode>Content A\u003C\u002Fcode>, lalu permintaan kedua memperpanjang pesan yang sama menjadi \u003Ccode>Content A + Content B\u003C\u002Fcode>, batas lama sekarang berada di dalam sebuah pesan. Prefix yang tersimpan tidak dipakai ulang di situ tanpa breakpoint eksplisit. DeepSeek menyatakan aturan yang sama dengan kata lain. Permintaan \u003Ccode>A + B\u003C\u002Fcode> lalu \u003Ccode>A + B + C\u003C\u002Fcode> kena unit \u003Ccode>A + B\u003C\u002Fcode>; permintaan \u003Ccode>A + B\u003C\u002Fcode> lalu \u003Ccode>A + C\u003C\u002Fcode> tidak kena apa pun, walau ia mengajari sistem menyimpan \u003Ccode>A\u003C\u002Fcode> yang dipakai bersama untuk permintaan ketiga.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Jatuh di bawah minimum.\u003C\u002Fstrong> Di GPT-5.6 ke atas, 512 token tidak bisa di-cache sama sekali, karena minimumnya 1.024 token input yang terlihat; hit pertama yang mungkin adalah giliran kedua, dan itu mencakup seluruh 1.024. Di Gemini 2 tunggunya 2.048 token, dan di Gemini 3 dan 4 tunggunya 4.096. Model Anthropic terbaru menerima 512, dan itulah sebabnya contoh di atas mungkin di sana dan belum tentu di tempat lain.\u003C\u002Fp>\n\u003Ch2 id=\"dua-breakpoint-yang-membohongimu\">Dua breakpoint yang membohongimu\u003C\u002Fh2>\n\u003Cp>Breakpoint di blok yang berubah setiap permintaan menulis entri baru tiap kali dan tidak pernah membaca satu pun. Dokumentasi Anthropic menyebut ini kesalahan umum dengan kata yang persis. Pencariannya menelusuri mundur mencari entri yang \u003Cem>ditulis\u003C\u002Fem> permintaan sebelumnya, bukan mencari konten yang stabil. Kalau tidak ada yang menulis entri di ujung blok statismu, tidak ada apa pun untuk ditemukan di balik sebuah timestamp.\u003C\u002Fp>\n\u003Cp>Jebakan kedua adalah jarak. Anthropic menelusuri mundur 20 posisi blok dari sebuah breakpoint; OpenAI memeriksa sampai 20 ujung pesan sebelumnya di mode implisit. Satu giliran yang menambahkan lebih dari 20 blok, atau percakapan yang tumbuh melewatinya, meninggalkan entri terakhir di luar jendela. Untuk itulah breakpoint kedua dan ketiga ada.\u003C\u002Fp>\n\u003Ch2 id=\"tujuh-setelan-yang-menentukan-hit-rate\">Tujuh setelan yang menentukan hit rate\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>Urutkan berdasarkan seberapa sering bagiannya berubah.\u003C\u002Fstrong> Definisi tool, lalu instruksi, lalu materi referensi, lalu percakapan. Apa pun yang berubah per permintaan tempatnya setelah semua yang tidak berubah.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Taruh breakpoint di ujung blok stabil terakhir.\u003C\u002Fstrong> Bukan di blok terakhir. Di percakapan yang tumbuh, blok terakhir berhasil, karena giliran sebelumnya menulis di sana; di prompt dengan akhiran yang berubah, tidak.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tambahkan, jangan tulis ulang.\u003C\u002Fstrong> Ringkasan adalah pesan baru di ujung, bukan versi lebih kecil dari transkrip di awal. Compaction dan pemotongan mereset prefix sejak token pertama yang berubah.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Jaga array tool tetap identik byte demi byte.\u003C\u002Fstrong> Matikan tool dengan \u003Ccode>tool_choice: &quot;none&quot;\u003C\u002Fcode> alih-alih menghapus definisinya, dan jangan pernah menaruh id sesi atau timestamp snapshot di deskripsi.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Cocokkan masa hidup dengan jedanya.\u003C\u002Fstrong> Buku panduan yang dipakai sepanjang hari butuh penulisan satu jam dengan 2x. Ekor percakapan butuh yang bawaan, karena toh kedaluwarsa di antara sesi.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kirim permintaan yang berhubungan ke cache yang sama.\u003C\u002Fstrong> Di model OpenAI sebelum GPT-5.6 itu berarti \u003Ccode>prompt_cache_key\u003C\u002Fcode> yang stabil, dibidik sekitar 15 permintaan per menit per kunci. Lewat router, artinya prefix yang tidak berubah, supaya kunci routing-nya tidak ikut berubah.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Baca penghitungnya.\u003C\u002Fstrong> \u003Ccode>cache_read_input_tokens\u003C\u002Fcode>, \u003Ccode>cached_tokens\u003C\u002Fcode>, \u003Ccode>prompt_cache_hit_tokens\u003C\u002Fcode>, \u003Ccode>cachedContentTokenCount\u003C\u002Fcode>. Tiap provider melaporkan token yang datang dari cache pada permintaan itu. Hit rate mendekati nol pada prompt yang kelihatan statis berarti prefix-nya berubah di tempat yang belum kamu periksa.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"yang-tidak-dibeli-caching\">Yang tidak dibeli caching\u003C\u002Fh2>\n\u003Cp>Token input yang kena cache tetap dihitung ke batas rate limit di OpenAI, jadi caching tidak akan menyelamatkan loop yang sedang di-throttle. Entri cache di Anthropic baru tersedia setelah respons pertama mulai, jadi permintaan paralel yang datang bersamaan tidak bisa saling menolong. Konten system yang disembunyikan tidak dihitung ke prefix minimum di kedua provider. Cache terisolasi per organisasi dan, di Claude API, per workspace, jadi dua salinan prompt yang sama di dua workspace adalah dua penulisan. Dan Gemini menagih penyimpanan untuk cache eksplisit per token-jam, meteran kedua yang bisa membengkak kalau cache-nya dibiarkan 24 jam.\u003C\u002Fp>\n\u003Cfigure class=\"ds-figure not-prose\" data-ds-figure=\"cache-cost-curve\">\n  \u003Cdiv class=\"ds-figure-body\">\n    \u003Cdiv class=\"ds-panel\">\n      \u003Cdiv class=\"ds-panel-head\">\u003Cspan class=\"ds-panel-title\">Empat puluh giliran, empat panjang\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"ds-legend\">\n        \u003Cspan>\u003Ci class=\"ds-swatch is-plain\">\u003C\u002Fi>tanpa cache\u003C\u002Fspan>\n        \u003Cspan>\u003Ci class=\"ds-swatch is-cached\">\u003C\u002Fi>prefix stabil\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"ds-scroll\">\n        \u003Cdiv class=\"ds-cols\">\n          \u003Cdiv class=\"ds-col-group\">\n        \u003Cdiv class=\"ds-col-pair\">\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-plain\" style=\"height:3%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$0.24\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-cached\" style=\"height:2%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$0.09\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cspan class=\"ds-col-label\">10\u003C\u002Fspan>\n      \u003C\u002Fdiv>\u003Cdiv class=\"ds-col-group\">\n        \u003Cdiv class=\"ds-col-pair\">\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-plain\" style=\"height:9%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$0.68\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-cached\" style=\"height:2%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$0.18\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cspan class=\"ds-col-label\">20\u003C\u002Fspan>\n      \u003C\u002Fdiv>\u003Cdiv class=\"ds-col-group\">\n        \u003Cdiv class=\"ds-col-pair\">\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-plain\" style=\"height:29%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$2.16\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-cached\" style=\"height:6%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$0.43\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cspan class=\"ds-col-label\">40\u003C\u002Fspan>\n      \u003C\u002Fdiv>\u003Cdiv class=\"ds-col-group\">\n        \u003Cdiv class=\"ds-col-pair\">\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-plain\" style=\"height:100%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$7.52\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n          \u003Cdiv class=\"ds-col\">\n    \u003Cdiv class=\"ds-col-bar is-cached\" style=\"height:15%\">\u003C\u002Fdiv>\n    \u003Cspan class=\"ds-col-value\">$1.16\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cspan class=\"ds-col-label\">80\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cp class=\"ds-axis\">giliran dalam loop\u003C\u002Fp>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n  \u003Cfigcaption>Model sama, panjang keluaran sama, blok statis 6.000 token dan 1.000 token ditambahkan per giliran, pada $2 per juta token input. Menggandakan panjang loop mengalikan tagihan tanpa cache sekitar tiga kali; caching membagi tagihan itu lima kali dan membiarkan pertumbuhannya.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>\u003Cp>Tidak ada satu pun dari ini yang mengubah bentuk kurva biayanya. Caching membagi tagihannya sekitar lima kali dan membiarkan pertumbuhannya, karena transkripnya tetap tumbuh dan tetap kamu kirim ulang tiap giliran. Di loop empat puluh giliran yang dihitung di artikel sebelumnya, caching memindahkan $2,16 ke $0,43 dan kedua angka tetap naik mengikuti kuadrat jumlah giliran.\u003C\u002Fp>\n\u003Cp>Urutkan prompt berdasarkan seberapa sering bagiannya berubah, taruh breakpoint di ujung bagian yang tidak berubah, dan ukur penghitungnya di permintaan berikutnya. Kalau hit rate-nya mendekati nol padahal prompt-nya kelihatan statis, prefix-nya berubah di array tool, di baris pertama system prompt, atau di suatu tempat di atas blok yang ingin kamu cache.\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>\u003Cstrong>Entri cache adalah hash sebuah prefix, ditulis di batas yang kamu tandai.\u003C\u002Fstrong> Entri itu tidak pernah tumbuh sendiri: permintaan yang lebih panjang hanya memakai ulang bagian yang sudah ditulis permintaan sebelumnya.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kasus 512 ke 1.024 cuma punya satu jawaban.\u003C\u002Fstrong> 512 token pertama kembali dengan harga baca, 512 token baru dibayar penuh, dan baru bisa dipakai ulang mulai permintaan berikutnya.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Panjang minimum menentukan apakah kamu dapat hit sama sekali.\u003C\u002Fstrong> 512 token bisa di-cache di model Anthropic terbaru, 1.024 di GPT-5.6 ke atas, dan 2.048 sampai 6.144 di Gemini tergantung modelnya.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Posisi breakpoint adalah seluruh permainannya.\u003C\u002Fstrong> Di blok yang berubah setiap permintaan, tiap penulisan terbuang; di ujung blok stabil, satu penulisan bertahan sepanjang percakapan.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Ukur penghitung yang dilaporkan, bukan saklar fiturnya.\u003C\u002Fstrong> Setiap provider memberitahu berapa token yang datang dari cache pada permintaan itu, dan angka itulah satu-satunya bukti caching bekerja.\u003C\u002Fli>\n\u003C\u002Ful>\n",[310,332,352,369,384,389],{"id":311,"title":312,"title_id":313,"slug":314,"excerpt":315,"excerpt_id":316,"has_translation":12,"published_at":317,"reading_time":98,"hidden_from_listing":15,"tags":318,"thumbnail_image":21,"og_image":323,"series":324,"authors":329},48,"What a Linked List Actually Is","Tentang Struktur Data LinkedList","tentang-struktur-data-linked-list","A linked list is a linear chain of nodes, each holding data and a pointer to the next node. Here is what that chain looks like, what it costs next to an array, and the same minimal implementation in Java, Python, and JavaScript.","Linked list adalah rantai linear berisi node, dan setiap node menyimpan data plus pointer ke node berikutnya. Ini bentuk rantainya, ongkosnya dibanding array, dan implementasi paling sederhana dalam Java, Python, serta JavaScript.","2026-11-21T01:00:00.000Z",[319,320,321,322],"struktur-data","linked-list","pointer","konsep","\u002Fog\u002Ftentang-struktur-data-linked-list.png",{"id":325,"title":326,"title_id":327,"slug":328},28,"Linear Data Structures","Struktur Data Linear","asd-struktur-linear",[330],{"authors_id":331},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":333,"title":334,"title_id":335,"slug":336,"excerpt":337,"excerpt_id":338,"has_translation":12,"published_at":339,"reading_time":191,"hidden_from_listing":15,"tags":340,"thumbnail_image":21,"og_image":343,"series":344,"authors":349},47,"Why Understanding Algorithms and Data Structures Actually Matters","Pentingnya Memahami Algoritma dan Struktur Data","pentingnya-memahami-algoritma-dan-struktur-data","An algorithm is an ordered list of steps, and that order decides how expensive a problem is. The examples are on the back of an instant noodle packet, in a factorial, and behind ctrl+z.","Sebagai konsep fundamental, algoritma menentukan seberapa mahal sebuah masalah diselesaikan. Contohnya ada di bungkus mie instan, di bilangan faktorial, dan di tombol undo.","2026-11-19T01:00:00.000Z",[341,319,322,342],"algoritma","dasar","\u002Fog\u002Fpentingnya-memahami-algoritma-dan-struktur-data.png",{"id":345,"title":346,"title_id":347,"slug":348},27,"About Algorithms and Data Structures","Tentang Algoritma dan Struktur Data","asd-intro",[350],{"authors_id":351},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":353,"title":354,"title_id":355,"slug":356,"excerpt":357,"excerpt_id":358,"has_translation":12,"published_at":359,"reading_time":14,"hidden_from_listing":15,"tags":360,"thumbnail_image":21,"og_image":364,"series":365,"authors":366},108,"At 11 a.m. the AI Quota Runs Out, and the Work Stops There","Jam 11 siang kuota AI-nya habis, dan kerjaan berhenti di situ","jam-11-kuota-ai-habis-kerjaan-berhenti","The panel says the usage limit is reached and the work stops, not because it is finished. Three guesses explain it, and all three are wrong: the limit is shaped like a cliff, and the day is built on top of one tool.","Panel di layar bilang batas pemakaian tercapai, dan kerja berhenti di situ. Bukan karena selesai. Ada tiga tebakan kenapa ini terjadi, dan ketiganya salah: batasnya berbentuk tebing, dan harinya dibangun di atas satu alat.","2026-11-12T01:00:00.000Z",[193,361,362,363],"tooling","rate-limit","produktivitas","\u002Fog\u002Fjam-11-kuota-ai-habis-kerjaan-berhenti.png",{"id":24,"title":25,"title_id":26,"slug":27},[367],{"authors_id":368},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":370,"title":371,"title_id":372,"slug":373,"excerpt":374,"excerpt_id":375,"has_translation":12,"published_at":376,"reading_time":125,"hidden_from_listing":15,"tags":377,"thumbnail_image":21,"og_image":378,"series":379,"authors":381},141,"A 6,000-Token Handbook and a 0% Cache Hit Rate","Buku Panduan 6.000 Token dan Hit Rate Cache 0%","cache-hit-rate-zero","Twenty-four turns, caching switched on, and a bill 21% higher than running with no cache at all. A support agent whose prompt looks static, and the three lines that quietly change it every turn.","Dua puluh empat giliran, caching menyala, dan tagihan 21% lebih tinggi daripada menjalankannya tanpa cache sama sekali. Agen support yang prompt-nya kelihatan statis, dan tiga baris yang diam-diam mengubahnya tiap giliran.","2026-11-08T01:20:00.000Z",[70,81,83,84],"\u002Fog\u002Fcache-hit-rate-zero.png",{"id":380,"title":69,"title_id":69,"slug":70},29,[382],{"authors_id":383},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":74,"title":285,"title_id":75,"slug":76,"excerpt":286,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":85,"series":385,"authors":386},{"id":87,"title":35,"title_id":36,"slug":37},[387],{"authors_id":388},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},{"id":390,"title":391,"title_id":392,"slug":393,"excerpt":394,"excerpt_id":395,"has_translation":12,"published_at":396,"reading_time":14,"hidden_from_listing":15,"tags":397,"thumbnail_image":21,"og_image":400,"series":401,"authors":406},138,"Python venv: the Install That Went Into the Wrong Python","venv Python: Instalasi yang Masuk ke Python yang Salah","python-venv-pip","`pip install` printed Successfully installed, and the next run raised ModuleNotFoundError on the same machine. Two interpreters, one install, and the variable your script checks is the one the interpreter never sets.","`pip install` mencetak Successfully installed, lalu jalan berikutnya melempar ModuleNotFoundError di mesin yang sama. Dua interpreter, satu instalasi, dan variabel yang skripmu periksa justru tidak pernah dipasang oleh interpreter.","2026-11-07T12:00:00.000Z",[179,398,399],"venv","pip","\u002Fog\u002Fpython-venv-pip.png",{"id":402,"title":403,"title_id":404,"slug":405},18,"Working with Python Scripts","Menggunakan Script Python","python-pemrograman-dengan-script",[407],{"authors_id":408},{"id":91,"name":121,"slug":122,"role":123,"profile_picture":21},[410,413,416,419,422],{"text":411,"depth":108,"id":412},"Empat buku aturan, satu mekanisme","empat-buku-aturan-satu-mekanisme",{"text":414,"depth":108,"id":415},"Pertanyaan 512 token","pertanyaan-512-token",{"text":417,"depth":108,"id":418},"Dua breakpoint yang membohongimu","dua-breakpoint-yang-membohongimu",{"text":420,"depth":108,"id":421},"Tujuh setelan yang menentukan hit rate","tujuh-setelan-yang-menentukan-hit-rate",{"text":423,"depth":108,"id":424},"Yang tidak dibeli caching","yang-tidak-dibeli-caching",1794150713287]