Enable caching for a request
Set theForge-Cache-Mode request header to one of the following modes:
To bypass the cache, omit the header.
- Python
- JavaScript
- cURL
readWrite or readOnly), the response includes a Forge-Cache-Status header with the value hit or miss. The response to a writeOnly request doesn’t include it.
What makes two requests identical
The proxy looks up a cached response after it resolves the project version and routing revision, and before it selects a provider. For a model override, the lookup happens after the proxy resolves the override’s provider. The cache key combines the following values:- The Weights & Biases entity, project, and project version that the proxy resolves from the
OpenAI-Projectheader andforge.project_versionmetadata. - The routing revision that applies to the version when the request arrives.
- The request path and query string.
- A SHA-256 hash of the request body, serialized with object keys in sorted order and with the following values excluded.
- The raw
modelstring of a routed request. Its resolved project, version, and routing revision are already in the key, so"router", a blankmodel, and an omittedmodelshare entries. Different versions never share entries. - Metadata keys that start with
forge.orwandb., includingforge.project_version. - The conversation identifier in
gen_ai.conversation.id. stream: false, which the proxy treats the same as omittingstream.- An empty
metadataobject, which the proxy treats the same as omittingmetadata.
messages, tools, tool_choice, response_format, temperature, top_p, max_tokens, seed, n, stop, user, any provider-specific fields, and metadata keys that don’t start with forge. or wandb., such as user.id. The order of keys within an object doesn’t matter. The order of items in an array, such as messages, does.
Entries are scoped to your Weights & Biases entity and project. An identical request from another entity, or for another project in your entity, never matches your entries.
A cached response records the routing target that produced it. The proxy serves a hit from that target without weighted or sticky routing.
A model override sends a provider/model value in model together with the OpenAI-Project header. The proxy caches it in the selected project version like routed traffic. Its key also includes the provider, the model reference, and the provider’s configuration, so an override never matches routed entries or entries for another model.
Limits
The cache has the following limits:- Non-streaming requests only. Requests with
stream: truethat set a cache header return400 Bad Request. - Successful responses only. The proxy stores only 2xx responses up to 8 MiB.
- Retention is 7 days. Entries are deleted 7 days after they’re written. Hits don’t refresh them.
- Invalid modes are rejected. Any
Forge-Cache-Modevalue other than those listed returns400 Bad Request.
Traces and Analytics
The proxy still records a cache hit as a project trace. The trace keeps the original response and its token usage, is marked withcache_hit=true, and has no provider latency. A request that enables cache reads but is forwarded to the provider is marked with cache_hit=false.
Analytics counts the provider spend of a cache hit as zero, because no inference ran, while token totals still include the replayed usage. Dataset creation deduplicates identical inputs, so replayed responses don’t add duplicate training rows.
Browser clients
The proxy allows theOpenAI-Project and Forge-Cache-Mode request headers in cross-origin requests, and it exposes Forge-Cache-Status and x-proxy-request-id to browser code.
Chat Completions
See how the proxy builds the provider request, handles streaming, and forwards tools and structured output.