Prompt-caching
AUTOMATISKDe hosted open-weight modeller cacher gentagne prompt-præfikser automatisk. Når en anmodning starter med samme system prompt, værktøjer og tidligere beskeder som en nylig anmodning på samme model, læses dette fælles præfiks fra cache og afregnes til 25% af modellens input-pris. Der er intet at aktivere, og cache-skrivninger er gratis.
Hvordan det fungerer
- Præfiks, i rækkefølge — Prompten læses i rækkefølge: system prompt, værktøjsdefinitioner og derefter beskederne. Cachen matcher fra starten af denne sekvens op til den første token, der afviger.
- Hvad tæller som et hit — En anmodning hvis prompt starter med samme indhold som en nylig anmodning — typisk den forrige tur i den samme samtale med nye beskeder tilføjet. Det matchende præfiks er cached input; alt efter dette er regulært input.
- Granularitet — Cachen rummer en prompt i blokke på 1,568 tokens, så en prompt på under ca. 1,500 tokens caches ikke. Det cachede antal i et svar er dit inputantal ganget med den cachede andel af prompten, rundet ned. Det er ikke nødvendigvis et multiplum af blokstørrelsen.
- Uden hit — En anmodning, hvis begyndelse ikke findes i cachen, afregnes til den almindelige inputtakst. Der offentliggøres ingen levetid for cachede prompts, og et hit er ikke garanteret: læs
usagefor at se, hvad en anmodning tog fra cachen. - Ingen kontakt — En anmodning tilmelder sig ikke, og intet felt slår caching fra.
- Hvilke modeller — Hvert hosted open-weight id. GET /v1/models rapporterer capabilities.prompt_caching: true og pricing.cached_input_per_million_usd for dem. Shannon-modeller afregnes med én flad takst.
Se et cache-hit i et svar
Send to anmodninger, der begynder med den samme lange system prompt, og udskriv forbruget for hver. Det første tal er anmodningens input, det andet er den del af det, der blev læst fra cachen.
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.shannon-ai.com/v1")
handbook = open("handbook.txt").read() # a long text that stays the same
def ask(question):
response = client.chat.completions.create(
model="Kimi-K3-3BIT-REAP",
messages=[
{"role": "system", "content": handbook},
{"role": "user", "content": question},
],
)
usage = response.usage
print(usage.prompt_tokens, usage.prompt_tokens_details.cached_tokens)
ask("What is the refund policy?")
ask("Who approves travel?") # same start: read the second number import { readFileSync } from "node:fs";
import OpenAI from "openai";
const client = new OpenAI({ apiKey: "YOUR_API_KEY", baseURL: "https://api.shannon-ai.com/v1" });
const handbook = readFileSync("handbook.txt", "utf8"); // a long text that stays the same
async function ask(question) {
const response = await client.chat.completions.create({
model: "Kimi-K3-3BIT-REAP",
messages: [
{ role: "system", content: handbook },
{ role: "user", content: question },
],
});
const usage = response.usage;
console.log(usage.prompt_tokens, usage.prompt_tokens_details.cached_tokens);
}
await ask("What is the refund policy?");
await ask("Who approves travel?"); // same start: read the second number # handbook.txt is a long text that stays the same. jq builds the JSON body from it
# and prints the usage object of the reply. Run it twice with different questions.
jq -Rs '{
model: "Kimi-K3-3BIT-REAP",
messages: [
{role: "system", content: .},
{role: "user", content: "What is the refund policy?"}
]
}' handbook.txt \
| curl -s https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d @- \
| jq .usage Prissætning
Cached input tokens afregnes til 25% af modellens input-takst, afrundet til $0,001 per 1M. Skrivning til cachen koster ikke ekstra, og output afregnes som sædvanlig. Hvert ids cached-takst findes i tabellen Models & pricing. Modeller og priser
Et kalds input afregnes som (input − cachet) × inputtakst + cachet × cache-takst. Det cachede antal er aldrig større end inputantallet.
| Model | Input / 1M | Cachet input / 1M |
|---|---|---|
DeepSeek-V4-Pro-0813-3BIT-REAP | $1.95 | $0.488 |
GLM-5.2-3BIT-REAP | $0.73 | $0.183 |
Kimi-K3-3BIT-REAP | $3.83 | $0.958 |
Nemotron3Ultra-3BIT-REAP | $0.75 | $0.188 |
MiniMax-M3-3BIT-REAP | $0.50 | $0.125 |
DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP | $0.50 | $0.125 |
Kimi-K2.6-W4A16-AUTOROUND-REAP | $0.78 | $0.195 |
Laguna-S-2.1-W4A16-AUTOROUND-REAP | $0.50 | $0.125 |
inkling-W4A16-AUTOROUND-REAP | $1.42 | $0.355 |
MiMo-V2.5-Pro-W8A16 | $0.50 | $0.125 |
MiMo-V2.5-W8A16 | $0.50 | $0.125 |
Hy3-W8A16 | $0.50 | $0.125 |
Forbrugsloggen viser det cachede input for hvert kald. Dens afregnede tokens og omkostninger indeholder allerede cache-taksten. Nøgler og forbrug
Felter for brug
| Endpoint | Cachset input | Reasoning |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — del af prompt_tokens | usage.completion_tokens_details.reasoning_tokens — del af completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — del af input_tokens | usage.output_tokens_details.reasoning_tokens — del af output_tokens |
/v1/messages | usage.cache_read_input_tokens — rapporteret separat: input_tokens er den ikke-cached del; cache_creation_input_tokens er altid 0 | thinking tælles i output_tokens |
{
"usage": {
"prompt_tokens": 20000,
"completion_tokens": 812,
"total_tokens": 20812,
"prompt_tokens_details": {
"cached_tokens": 18000
},
"completion_tokens_details": {
"reasoning_tokens": 604
}
}
} {
"usage": {
"input_tokens": 20000,
"input_tokens_details": {
"cached_tokens": 18000
},
"output_tokens": 812,
"output_tokens_details": {
"reasoning_tokens": 604
},
"total_tokens": 20812
}
} {
"usage": {
"input_tokens": 2000,
"cache_read_input_tokens": 18000,
"cache_creation_input_tokens": 0,
"output_tokens": 812
}
} Et streamet svar har de samme felter i sit sidste forbrug. Du behøver ikke bede om det:
| Endpoint | Hvor forbruget kommer |
|---|---|
/v1/chat/completions | usage i den sidste chunk før data: [DONE]. Det sendes på hver stream. |
/v1/responses | response.usage i hændelsen response.completed. |
/v1/messages | usage i hændelsen message_delta. usage i message_start indeholder nuller. |
Få flere cache-hits
- Hold system prompt og værktøjsdefinitioner byte-for-byte stabile på tværs af kald. Placer værdier per kald, såsom tidsstempler eller request-id'er, i slutningen af den seneste besked, ikke i system prompten.
- Tilføj kun til historikken. Redigering, beskæring eller opsummering af tidligere ture ændrer præfikset, og alt efter den første ændring afregnes som regulært input.
- Omorganiser ikke værktøjer, beskeder eller indholdsbokse mellem kald, og serialiser JSON (værktøjsskemaer, værktøjsargumenter og resultater) på samme måde hver gang.
- Hold dig til ét model-id gennem en samtale, og send opfølgningskaldet kort efter det forrige.
API'et holder begyndelsen af en samtale stabil i disse tilfælde:
- En
system- ellerdeveloper-besked, der sendes senere i en samtale, bliver på sin plads. Den ændrer ikke begyndelsen af prompten, så turene før den forbliver cachet. - Argumenterne til værktøjskald i tidligere assistent-ture sammenlignes på værdi. Rækkefølgen af nøgler og mellemrum i den JSON er ligegyldig.
- De tre endpoints læser en samtale på samme måde. En samtale, der fortsættes på et andet endpoint, beholder sit fælles præfiks, når indholdet er det samme.
Anmodningsfelter
prompt_cache_key (Chat Completions og Responses) og cache_control på Messages content blocks accepteres, så eksisterende klientkode kører uændret. Ingen af dem er påkrævet: caching er automatisk og fungerer på samme måde uden dem.
| Felt | Sendt til | Hvad det er |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | En cache-routingnøgle fra OpenAI API'et. |
cache_control | /v1/messages | Et cache-breakpoint på en indholdsblok, en system-blok eller en besked i Anthropic API'et. |
stream_options | /v1/chat/completions | include_usage beder OpenAI API'et om forbrug på en stream. Her slutter hver stream med forbrug. |
Tælling af tokens
To gratis endpoints, POST /v1/tokenize og POST /v1/messages/count_tokens, tæller tokens i en tekst eller i en hel anmodning for de hostede open-weight-modeller, før du sender den. De har deres egen side: Tælling af tokens