I Thought the Model Drifted. My Cache Key Was Serving Tuesday. A developer spent two days debugging an LLM endpoint that returned answers for the wrong prompts, initially blaming model drift and sampling noise. The root cause was a cache key that hashed only the user message, ignoring system prompts, temperature, and other request fields, causing collisions. The developer fixed it by hashing a canonical request document and warns that latency is not a reliable indicator of cache identity. Have you ever watched an LLM endpoint return a clean answer that belonged to a different prompt entirely? I spent forty-eight hours blaming sampling noise, temperature, and a free model that would not sit still. The request logs looked honest enough, and the health check on the box stayed green the whole time. The bug was quieter than that: a cache key that hashed the user message and ignored everything else that actually changes a completion. I was trying to keep a small eval loop cheap, which is a very ordinary instinct. Free-model access is useful when you want overnight volume without treating every call as precious. I parked a thin HTTP wrapper on a free server, hashed each prompt, and stored the JSON body on disk so retries would not hammer the model. Does that sound reasonable? It did, until two different system prompts started colliding on the same key and I spent a day chasing "nondeterminism" that was just a hash. I ran that wrapper against MonkeyCode's free model access on the free server option because I wanted a boring place to reproduce the cache bug, not a production SLA. Disclosure: This article was prepared as part of MonkeyCode's product outreach. Nothing below depends on a named model, a quota, or a hardware claim. The lesson is the key function, and it still applies if you delete the product name from the stack. The wrapper looked like every weekend cache I have written under time pressure. Incoming POST bodies were reduced to user message , run through hashlib.sha256 , and written under ./cache/