Prompt-kassing
C-AUTOMATIESDie hosted open-weight models kas herhaalde prompt-prefikse outomaties. Wanneer 'n versoek begin met dieselfde stelsel-prompt, gereedskap en vorige boodskappe as 'n onlangse versoek op dieselfde model, word daardie gedeelde prefiks vanaf die kas gelees en gefaktureer teen 25% van die model se inset-prys. Daar is niks om te aktiveer nie, en kas-skryfwerk is gratis.
Hoe dit werk
- Prefiks, in volgorde — Die prompt word in volgorde gelees: stelsel-prompt, gereedskap-definisies, en dan die boodskappe. Die kas pas vanaf die begin van daardie volgorde tot by die eerste token wat verskil.
- Wat tel as 'n 'hit' — 'n Versoek waarvan die prompt begin met dieselfde inhoud as 'n onlangse versoek — tipies die vorige beurt van dieselfde gesprek met nuwe boodskappe bygevoeg. Die ooreenstemmende prefiks is gekasde inset; alles daarna is gewone inset.
- Granulariteit — Die kas hou 'n prompt in blokke van 1,568 tokens, so 'n prompt korter as ongeveer 1,500 tokens word nie gekas nie. Die gekasde telling in 'n antwoord is jou insettelling vermenigvuldig met die gekasde deel van die prompt, afgerond na onder. Dit is nie noodwendig 'n veelvoud van die blokgrootte nie.
- Sonder 'n hit — 'n Versoek waarvan die begin nie in die kas is nie, word teen die gewone insettarief gefaktureer. Geen leeftyd word vir gekasde prompts gepubliseer nie en 'n hit is nie gewaarborg nie: lees
usageom te sien wat 'n versoek uit die kas geneem het. - Geen skakelaar — 'n Versoek kies nie in nie, en geen veld skakel kassing af nie.
- Watter models — Elke hosted open-weight id. GET /v1/models rapporteer capabilities.prompt_caching: true en pricing.cached_input_per_million_usd vir hulle. Shannon models faktureer teen een vaste tarief.
Sien 'n kas-hit in 'n antwoord
Stuur twee versoeke wat met dieselfde lang stelselprompt begin en druk die gebruik van elk. Die eerste getal is die inset van die versoek, die tweede is die deel daarvan wat uit die kas gelees is.
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 Beprysing
Gekasde inset-tokens word gefaktureer teen 25% van die model se inset-tarief, afgerond na $0.001 per 1M. Om na die kas te skryf kos niks ekstra nie, en uitsette word soos gewoonlik gefaktureer. Elke id se gekasde tarief is in die Models & pricing tabel. Modelle en pryse
Die inset van 'n oproep word gehef as (inset − gekas) × insettarief + gekas × kastarief. Die gekasde telling is nooit groter as die insettelling nie.
| Model | Inset / 1M | Gekasde inset / 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 |
Die gebruikslog lys die gekasde inset van elke oproep. Sy gefaktureerde tokens en koste sluit reeds die kastarief in. Sleutels en gebruik
Gebruik-velde
| Eindpunt | Gekasde inset | Redenering |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — deel van prompt_tokens | usage.completion_tokens_details.reasoning_tokens — deel van completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — deel van input_tokens | usage.output_tokens_details.reasoning_tokens — deel van output_tokens |
/v1/messages | usage.cache_read_input_tokens — apart gerapporteer: input_tokens is die ongekasde deel; cache_creation_input_tokens is altyd 0 | denkproses word getel in 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
}
} 'n Gestroomde antwoord dra dieselfde velde in sy finale gebruik. Jy hoef nie daarvoor te vra nie:
| Eindpunt | Waar die gebruik aankom |
|---|---|
/v1/chat/completions | usage op die laaste brokkie voor data: [DONE]. Dit word op elke stroom gestuur. |
/v1/responses | response.usage van die response.completed-gebeurtenis. |
/v1/messages | usage van die message_delta-gebeurtenis. Die usage van message_start bevat nulle. |
Kry meer kas-hits
- Hou die stelsel-prompt en gereedskap-definisies byte-vir-byte stabiel oor oproepe heen. Plaas per-oproep waardes soos tydstempels of versoek-ids aan die einde van die nuutste boodskap, nie in die stelsel-prompt nie.
- Voeg slegs by die geskiedenis. Om vorige beurte te redigeer, te sny of op te som verander die prefiks, en alles na die eerste verandering word as gewone inset gefaktureer.
- Moenie gereedskap, boodskappe of inhoud-blokke tussen oproepe herrangel nie, en serialiseer JSON (gereedskap-skemas, argumente en resultate) elke keer op dieselfde manier.
- Bly by een model-id vir 'n gesprek, en stuur die opvolgoproep kort ná die een voor dit.
Die API hou die begin van 'n gesprek in hierdie gevalle stabiel:
- 'n
system- ofdeveloper-boodskap wat later in 'n gesprek gestuur word, bly op sy plek. Dit verander nie die begin van die prompt nie, so die beurte daarvoor bly gekas. - Die argumente van gereedskapoproepe in vroeëre assistent-beurte word volgens waarde vergelyk. Sleutelvolgorde en spasiëring van daardie JSON maak nie saak nie.
- Die drie eindpunte lees 'n gesprek op dieselfde manier. 'n Gesprek wat op 'n ander eindpunt voortgesit word, behou sy gedeelde prefiks wanneer die inhoud dieselfde is.
Versoekvelde
prompt_cache_key (Chat Completions en Responses) en cache_control op Messages-inhoudblokke word aanvaar, sodat bestaande kliëntkode onveranderd bly. Nie een is verplig nie: caching is outomaties en werk dieselfde sonder hulle.
| Veld | Gestuur na | Wat dit is |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | 'n Kas-roeteringsleutel van die OpenAI API. |
cache_control | /v1/messages | 'n Kas-breekpunt op 'n inhoudblok, 'n system-blok of 'n boodskap van die Anthropic API. |
stream_options | /v1/chat/completions | include_usage vra die OpenAI API vir gebruik op 'n stroom. Hier eindig elke stroom met gebruik. |
Tel van tokens
Twee gratis eindpunte, POST /v1/tokenize en POST /v1/messages/count_tokens, tel die tokens van 'n teks of van 'n hele versoek vir die gehuisveste oopgewig-modelle voordat jy dit stuur. Hulle het hul eie bladsy: Tokens tel