Prompt-kaŝado
C-AUTOMATALa gastigitaj malferma-pezaj modeloj aŭtomate kaŝas ripetitajn promptajn prefiksajn partojn. Kiam requesto komenciĝas per la sama sistem-prompto, iloj kaj antaŭaj mesaĝoj kielj dejara requesto en la sama modelo, tiu komuna prefikso estas legata el la kaŝo kaj fakturata je 25% de la eniga prezo de la modelo. aĉu nenion aktivi, kaj kaŝ-skribadoj estas senpaga.
Kiel ĝi funkcias
- Prefikso, laŭ ordo — La prompto estas legata laŭ ordo: sistem-prompto, definioj de iloj, poste la mesaĝoj. La kaŝo kongruas de la komenco de tiu sekvenco ĝis la unua tokeno, kiu differencas.
- Kio kalkulatas kiel trafo (hit) — Requesto, kies prompto komenciĝas per la sama enhavo kielj plej recenta requesto — kutime la antaŭa turno de la sama konversacio kun novaj mesaĝoj aldonitaj. La kongrua prefikso estas kashita enigo; ĉio post ĝi estas regula enigo.
- Granulariteco — La kaŝmemoro tenas prompton en blokoj de 1,568 tokenoj, do prompto pli mallonga ol ĉirkaŭ 1,500 tokenoj ne estas kaŝmemorata. La kaŝmemorita nombro en respondo estas via enira nombro multiplikita per la kaŝmemorita parto de la prompto, rondigita malsupren. Ĝi ne nepre estas oblo de la bloka grandeco.
- Sen trafo — Peto, kies komenco ne estas en la kaŝmemoro, estas fakturata laŭ la regula enira prezo. Neniu daŭro de vivo estas publikigita por kaŝmemoritaj promptoj kaj trafo ne estas garantiita: legu
usagepor vidi, kion peto prenis el la kaŝmemoro. - Neniu ŝaltilo — Peto ne aliĝas, kaj neniu kampo malŝaltas la kaŝmemoradon.
- Kiuj modeloj — Ĉiu gastigita malferma-peza id-o. GET /v1/models raportas capabilities.prompt_caching: true kaj pricing.cached_input_per_million_usd por ili. Shannon-modeloj fakturas unu fiksan tarifon.
Vidi kaŝmemor-trafon en respondo
Sendu du petojn, kiuj komenciĝas per la sama longa system prompt, kaj presu la uzadon de ĉiu. La unua nombro estas la enigo de la peto, la dua estas la parto de ĝi legita el la kaŝmemoro.
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 Prezado
Kashitaj enig-tokenoj estas fakturataj je 25% de la eniga tarifo de la modelo, ĉirkaŭitaj al $0.001 per 1M. Skribado al la kaŝo kostas nenion plian, kaj eligo estas fakturata kiel kutime. La kashita tarifo de ĉiu id-o estas en la tablo Modeloj & prezado. Modeloj kaj prezoj
La enigo de voko estas kalkulata kiel (enigo − kaŝmemorita) × enira prezo + kaŝmemorita × kaŝmemorita prezo. La kaŝmemorita nombro neniam estas pli granda ol la enira nombro.
| Modelo | Enigo / 1M | Kaŝmemorita enigo / 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 |
La uzada protokolo listigas la kaŝmemoritan enigon de ĉiu voko. Ĝiaj fakturitaj tokenoj kaj kosto jam inkluzivas la kaŝmemoritan prezon. Ŝlosiloj kaj uzado
Kampoj de uzado
| Ĉuĵuŝpunkto | Kashita enigo | Raciumado |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — parto de prompt_tokens | usage.completion_tokens_details.reasoning_tokens — parto de completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — parto de input_tokens | usage.output_tokens_details.reasoning_tokens — parto de output_tokens |
/v1/messages | usage.cache_read_input_tokens — raportata aparte: input_tokens estas la ne-kashita parto; cache_creation_input_tokens ĉiam estas 0 | pensado estas kalkulita en 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
}
} Fluata respondo portas la samajn kampojn en sia fina uzado. Vi ne devas peti ĝin:
| Ĉuĵuŝpunkto | Kie alvenas la uzado |
|---|---|
/v1/chat/completions | usage en la lasta peco antaŭ data: [DONE]. Ĝi estas sendata ĉe ĉiu fluo. |
/v1/responses | response.usage de la evento response.completed. |
/v1/messages | usage de la evento message_delta. La usage de message_start enhavas nulojn. |
Kiel ricevi pli da kash-trafaj (hits)
- Tenu la sistem-prompton kaj definiojn de iloj byte-por-byte stabilaj inter vokoj. Metu per-vokajn valorojn kiel tempo-stampojn aŭ request-id-ojn al la fino de la plej nova mesaĝo, ne en la sistem-prompto.
- Nur aldonu al la historio. Redaktado, trogigado aŭ resumado de antaŭaj turnoj ŝanĝas la prefikson, kaj ĉio post la unua ŝanĝo estas fakturata kiel regula enigo.
- Ne reordonu ilojn, mesaĝojn aŭ enhav-blokojn inter vokoj, kaj serializu JSON (ŝemoj de iloj, argumentoj de iloj kaj rezultoj) la saman manieron ĉajunfoje.
- Restu ĉe unu modelo-id dum konversacio, kaj sendu la sekvan vokon baldaŭ post la antaŭa.
La API tenas la komencon de konversacio stabila en ĉi tiuj kazoj:
- Mesaĝo
systemaŭdevelopersendita pli poste en konversacio restas en sia loko. Ĝi ne ŝanĝas la komencon de la prompto, do la antaŭaj turnoj restas kaŝmemoritaj. - La argumentoj de ilovokoj en pli fruaj turnoj de assistant estas komparataj laŭ valoro. Ordo de ŝlosiloj kaj spacoj de tiu JSON ne gravas.
- La tri endpoints legas konversacion same. Konversacio daŭrigita ĉe alia endpoint konservas sian komunan prefikson, se la enhavo estas la sama.
Kampoj de peto
prompt_cache_key (Chat Completions kaj Responses) kaj cache_control ĉe Messages enhavblokoj estas akceptataj, do ekzistanta klienta kodo funkcias sen ŝanĝoj. Neniu el ili estas necesa: kashigo estas aŭtomata kaj funkcias tielsame sen ili.
| Kampo | Sendita al | Kio ĝi estas |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | Kaŝmemora vojiga ŝlosilo de la OpenAI API. |
cache_control | /v1/messages | Kaŝmemora haltpunkto sur enhava bloko, bloko system aŭ mesaĝo de la Anthropic API. |
stream_options | /v1/chat/completions | include_usage petas de la OpenAI API uzadon en fluo. Ĉi tie ĉiu fluo finiĝas per uzado. |
Kalkumado de tokens
Du senpagaj endpoints, POST /v1/tokenize kaj POST /v1/messages/count_tokens, kalkulas la tokenojn de teksto aŭ de tuta peto por la gastigitaj malfermpezaj modeloj antaŭ ol vi sendas ĝin. Ili havas sian propran paĝon: Kalkulado de tokenoj