5.6 Prompt caching has performance issues?

We’re working to improve our caching performance with gpt-5.6-luna. We are using implicit caching, but with explicit cache breakpoints. Given that we’re doing a lot of function tool calling, this is the only pattern that makes sense.

However, I came across this: Prompt caching | OpenAI API

It talks about splitting your cache key if you are getting above 15 requests per minute. That’s a bit scary to us. We serve many different customers, and we’ll use a different cache key for each of them because we will have different content that is relevant to each one. But 15 requests per minute is not very many! Think about the fact that we might use 5 steps in a single response generation because of a sequence of tool calls. Each one of those is a call to response.create and that means for one question, we have already used up 5 requests in that minute. If we’re handling a few users within the same minute, it would be easy to go over 15 RPM. And they say that at that point, we will start seeing cache misses. Egads! Misses are very expensive both in time and money.

The solution proposed is to shard the cache keys. But that’s a problem because it means that cache performance will degrade badly for the case where we’re at lower request rates – because we will effectively be failing to use a perfectly good cached version because it is behind a different key.

I encourage the OpenAI folks to give this a little more thought. Caching is a win-win and we want to be “good citizens” to make it as effective as possible. But this puts us in a bit of a bind.

Consider in different terms:

A server instance with local cache, a compute unit, will have a maximum concurrency.

If you have a single multi-turn agentic task that is doing sequential tool calls, those are not causing concurrent generative inference.

So the explanation simply “15 RPM”, and the need for routing to roll over to a different non-cache unit, might be a bit more directed to a layperson than the actual situation and the amount of over-subscription at a particular time.

So there might be an in-between strategy, where you have clusters of common cache key to also exploit commonality between system message of an application and particular model.

Thanks for your thinking on this. Your metaphor is helpful. We have to guess, of course, about what the actual implementation looks like. But if it is as you hypothesize, and the time to process a given request is measured in, at most, seconds, it would seem to me that requests-per-minute is a rather odd way of phrasing this. Wouldn’t it make more sense to talk about concurrent requests?

Anyway, we’re going to start collecting data and that will allow us to see if and when we are running into cache misses and under what conditions.