Užklausų kešavimas
AUTOMATINIŠKASHostingai open-weight modeliai automatiškai kešuoja pakartojamus užklausų prefiksus. Kai užklausa prasideda tuo patiu sisteminiu promptu, įrankiais ir ankstesnėmis žinutėmis kaip neseniai atlikta užklausa tame pačiame modeliui, šis bendras prefiksas skaitomas iš kešo ir apmokestinamas kaip 25% iš modelio įvesties kainos. Nereikia nieko įjungti, o įrašymas į kešą yra nemokamas.
Kaip tai veikia
- Prefiksas, tvarkytai — Užklausa skaitoma tvarka: sisteminis promptas, įrankių apibrėžimai, tada žinutės. Kešas sutampa nuo šios sekvencijos pradžios iki pirmo skirto tokeno.
- Kas laikoma „hit“ (atradimu) — Užklausa, kurios promptas prasideda tuo pačiu turiniu kaip neseniai atlikta užklausa — paprastai tai yra ankstesnė tos pačios konversacijos dalis, prie kurios pridėtos naujos žinutės. Sutapęs prefiksas yra kešuota įvestis; viskas po jo yra įprasta įvestis.
- Granuliuotumas — Kešas laiko prompt 1,568 tokenų blokais, todėl trumpesnis nei maždaug 1,500 tokenų prompt nekešuojamas. Kešuotų tokenų skaičius atsakyme yra jūsų įvesties skaičius, padaugintas iš kešuotos prompt dalies ir suapvalintas žemyn. Jis nebūtinai dalijasi iš bloko dydžio.
- Be pataikymo — Užklausa, kurios pradžios kešė nėra, apmokestinama įprastu įvesties įkainiu. Kešuotų prompt gyvavimo trukmė neskelbiama ir pataikymas negarantuojamas: skaitykite
usage, kad pamatytumėte, ką užklausa paėmė iš kešo. - Jungiklio nėra — Užklausa nesirenka kešavimo ir joks laukas kešavimo neišjungia.
- Kuriems modeliams — Kiekvienam hostingo open-weight id. GET /v1/models praneša capabilities.prompt_caching: true ir pricing.cached_input_per_million_usd. Shannon modeliai taiko vieną fiksuotą tarifą.
Kaip atsakyme matyti kešo pataikymą
Išsiųskite dvi užklausas, prasidedančias tuo pačiu ilgu sistemos nurodymu, ir išspausdinkite kiekvienos naudojimo duomenis. Pirmasis skaičius yra užklausos įvestis, antrasis yra jos dalis, nuskaityta iš kešo.
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 Kaina
Kešuoti įvesties tokenai apmokestinami kaip 25% iš modelio įvesties tarifο, suapvalintam iki $0.001 per 1M. Įrašymas į kešą nieko papildomai nekainuoja, o išvestis apmokestinama kaip įprasta. Kiekvieno id kešavimo tarifas nurodytas „Modeliai ir kainos“ lentelių. Modeliai ir kainos
Kreipinio įvestis apmokestinama pagal (įvestis − kešuota) × įvesties įkainis + kešuota × kešo įkainis. Kešuotų tokenų skaičius niekada nėra didesnis už įvesties skaičių.
| Modelis | Įvestis / 1M | Kešuota įvestis / 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 |
Naudojimo žurnale nurodyta kiekvieno kreipinio kešuota įvestis. Jo apmokestinti tokenai ir kaina jau apima kešo įkainį. Raktai ir naudojimas
Naudojimo laukai
| Galutinis taškas | Kešuota įvestis | Mąstymas |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — prompt_tokens dalis | usage.completion_tokens_details.reasoning_tokens — completion_tokens dalis |
/v1/responses | usage.input_tokens_details.cached_tokens — input_tokens dalis | usage.output_tokens_details.reasoning_tokens — output_tokens dalis |
/v1/messages | usage.cache_read_input_tokens — pranešama atskirai: input_tokens yra nekešuota dalis; cache_creation_input_tokens visada yra 0 | mąstymas skaičiuojamas 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
}
} Srautu siunčiamas atsakymas tuos pačius laukus turi galutiniuose naudojimo duomenyse. Jų prašyti nereikia:
| Galutinis taškas | Kur ateina naudojimo duomenys |
|---|---|
/v1/chat/completions | usage paskutiniame gabale prieš data: [DONE]. Jis siunčiamas kiekviename sraute. |
/v1/responses | response.completed įvykio response.usage. |
/v1/messages | message_delta įvykio usage. message_start usage yra nuliai. |
Kaip gauti daugiau kešavimo hitų
- Saugokite, kad sisteminis promptas ir įrankių apibrėžimai būtų identiški (ikio byteArray) tarp užklausų. Kintamus reikšnius, pavyzdžiui, laiko žymas ar užklausų id, dėkite paskutinės žinutės pabaigai, o ne sisteminiame prompte.
- Tik pridėkite duomenis prie istorijos. Redaguojant, trumpinant ar apibendrinant ankstesnes dalis keičiate prefiksą, ir viskas po pirmųjų pakeitimų apmokestinama kaip įprasta įvestis.
- Nepakeikite įrankių, žinučių ar turinio blokų tvarkos tarp užklausų ir visada serializuokite JSON (įrankių schemų, argumentų ir rezultatų) vienodai.
- Pokalbiui naudokite vieną modelio id ir tolesnį kreipinį siųskite netrukus po ankstesnio.
API išlaiko stabilią pokalbio pradžią šiais atvejais:
- Vėliau pokalbyje išsiųsta
systemardeveloperžinutė lieka savo vietoje. Ji nekeičia prompt pradžios, todėl prieš ją esantys ėjimai lieka kešuoti. - Ankstesnių assistant ėjimų įrankių kreipinių argumentai lyginami pagal reikšmę. To JSON raktų tvarka ir tarpai nesvarbūs.
- Trys galiniai taškai pokalbį skaito vienodai. Pokalbis, tęsiamas kitame galiniame taške, išsaugo bendrą prefiksą, jei turinys tas pats.
Užklauso laukai
Priimami prompt_cache_key (Chat Completions ir Responses) bei cache_control Messages turinio blokuose, todėl esamasis kliento kodas veikia be pakeitimų. Nėra būtina naudoti abu: gredavimas yra automatinis ir veikia taip pat ir be jų.
| Laukas | Siunčiama į | Kas tai |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | OpenAI API kešo maršrutizavimo raktas. |
cache_control | /v1/messages | Anthropic API kešo lūžio taškas turinio bloke, system bloke ar žinutėje. |
stream_options | /v1/chat/completions | include_usage prašo OpenAI API pateikti naudojimo duomenis srautui. Čia kiekvienas srautas baigiasi naudojimo duomenimis. |
Tokenų skaičiavimas
Du nemokami galiniai taškai, POST /v1/tokenize ir POST /v1/messages/count_tokens, prieš siunčiant suskaičiuoja teksto ar visos užklausos tokenus talpinamiems atvirų svorių modeliams. Jie turi savo puslapį: Tokenų skaičiavimas