Caching de prompt
AUTOMATModelele hosted open-weight cachează automat prefixele de prompt repetate. Când o cerere începe cu același prompt de sistem, instrumente și mesaje anterioare ca o cerere recentă pe același model, acel prefix partajat este citit din cache și facturat la 25% din prețul de intrare al modelului. Nu este necesară nicio activare, iar scrierea în cache este gratuită.
Cum funcționează
- Prefix, în ordine — Promptul este citit în ordine: prompt de sistem, definiții de instrumente, apoi mesajele. Cache-ul se potrivește de la începutul acelei secvențe până la primul token care diferă.
- Ce se consideră un „hit” — O cerere al cărei prompt începe cu același conținut ca o cerere recentă — în general, runda anterioară a aceleiași conversații cu mesaje noi adăugate. Prefixul corespunzător este intrare din cache; tot ce urmează este intrare regulată.
- Granularitate — Cache-ul păstrează un prompt în blocuri de 1,568 token-uri, deci un prompt mai scurt de aproximativ 1,500 token-uri nu este pus în cache. Numărul din cache dintr-un răspuns este numărul tău de intrare înmulțit cu partea din prompt aflată în cache, rotunjit în jos. Nu este neapărat un multiplu al dimensiunii blocului.
- Fără hit — O cerere al cărei început nu se află în cache este facturată la tariful obișnuit de intrare. Nu se publică nicio durată de viață pentru prompt-urile din cache și un hit nu este garantat: citește
usagepentru a vedea ce a luat o cerere din cache. - Fără comutator — O cerere nu trebuie să se înscrie și niciun câmp nu dezactivează caching-ul.
- Ce modele — Orice ID hosted open-weight. GET /v1/models raportează capabilities.prompt_caching: true și pricing.cached_input_per_million_usd pentru acestea. Modelele Shannon facturează un tarif fix.
Vezi un cache hit într-un răspuns
Trimite două cereri care încep cu același system prompt lung și afișează utilizarea fiecăreia. Primul număr este intrarea cererii, al doilea este partea din ea citită din cache.
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 Prețuri
Token-urile de intrare din cache sunt facturate la 25% din tariful de intrare al modelului, rotunjit la $0.001 per 1M. Scrierea în cache nu costă suplimentar, iar ieșirea este facturată ca ownțial. Tariful de cache pentru fiecare ID se află în tabelul Models & pricing. Modele și prețuri
Intrarea unui apel este taxată ca (intrare − din cache) × tarif de intrare + din cache × tarif cache. Numărul din cache nu este niciodată mai mare decât numărul de intrare.
| Model | Intrare / 1M | Intrare din cache / 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 |
Jurnalul de utilizare listează intrarea din cache a fiecărui apel. Token-urile facturate și costul includ deja tariful cache. Chei și utilizare
Câmpuri de utilizare
| Endpoint | Intrare cache | Raționament |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — parte din prompt_tokens | usage.completion_tokens_details.reasoning_tokens — parte din completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — parte din input_tokens | usage.output_tokens_details.reasoning_tokens — parte din output_tokens |
/v1/messages | usage.cache_read_input_tokens — raportat separat: input_tokens este partea necache-uită; cache_creation_input_tokens este întotdeauna 0 | gândirea este numărată în 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
}
} Un răspuns în streaming poartă aceleași câmpuri în utilizarea finală. Nu trebuie să o ceri:
| Endpoint | Unde sosește utilizarea |
|---|---|
/v1/chat/completions | usage pe ultimul chunk dinaintea data: [DONE]. Este trimis pe fiecare stream. |
/v1/responses | response.usage al evenimentului response.completed. |
/v1/messages | usage al evenimentului message_delta. usage din message_start conține zerouri. |
Cum să obțineți mai multe cache hits
- Mențineți promptul de sistem și definițiile instrumentelor stabile byte-la-byte între apeluri. Plasați valorile specifice fiecărui apel, cum ar fi timestamp-urile sau ID-urile de cerere, la sfârșitul ultimului mesaj, nu în promptul de sistem.
- Adăugați doar la finalul istoricului. Editarea, tăierea sau rezumarea rundelor anterioare modifică prefixul, iar tot ce urmează după prima modificare este facturat ca intrare regulată.
- Nu reordonați instrumentele, mesajele sau blocurile de conținut între apeluri și serializați JSON (schemele instrumentelor, argumentele și rezultatele instrumentelor) la fel de own dată.
- Rămâi la același id de model pe durata unei conversații și trimite apelul următor la scurt timp după cel dinainte.
API-ul menține stabil începutul unei conversații în aceste cazuri:
- Un mesaj
systemsaudevelopertrimis mai târziu într-o conversație rămâne la locul lui. Nu schimbă începutul prompt-ului, deci rundele de dinaintea lui rămân în cache. - Argumentele apelurilor de instrument din rundele anterioare ale asistentului sunt comparate după valoare. Ordinea cheilor și spațierea acelui JSON nu contează.
- Cele trei endpoint-uri citesc o conversație în același mod. O conversație continuată pe alt endpoint își păstrează prefixul comun când conținutul este același.
Câmpuri de cerere
prompt_cache_key (pentru Chat Completions și Responses) și cache_control pe blocurile de conținut Messages sunt acceptate, astfel încât codul client existent funcționează fără modificări. Niciunul nu este obligatoriu: caching-ul este automat și funcționează la fel și fără ele.
| Câmp | Trimis către | Ce reprezintă |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | O cheie de rutare cache a API-ului OpenAI. |
cache_control | /v1/messages | Un punct de întrerupere cache pe un bloc de conținut, pe un bloc system sau pe un mesaj al API-ului Anthropic. |
stream_options | /v1/chat/completions | include_usage cere API-ului OpenAI utilizarea pe un stream. Aici fiecare stream se încheie cu utilizarea. |
Numărarea token-urilor
Două endpoint-uri gratuite, POST /v1/tokenize și POST /v1/messages/count_tokens, numără token-urile unui text sau ale unei cereri întregi pentru modelele open-weight găzduite înainte să o trimiți. Ele au propria pagină: Numărarea token-urilor