Keširanje promptova
AUTOMATSKIHostovani open-weight modeli automatski keširaju ponovljene prefikse promptova. Kada zahtev počinje istim sistemskim promptom, alatima i prethodnim porukama kao nedavni zahtev na istom modelu, taj zajednički prefiks se čita iz keša i naplaćuje po 25% cene ulaza modela. Ne zahteva aktivaciju, a pisanje u keš je besplatno.
Kako funkcioniše
- Prefiks, po redu — Prompt se čita po redu: sistemski prompt, definicije alata, a zatim poruke. Keš se podudara od početka te sekvence do prvog tokena koji se razlikuje.
- Šta se smatra pogodkom (hit) — Zahtev čiji prompt počinje istim sadržajem kao nedavni zahtev — obično prethodni krug iste konverzacije kojem su dodate nove poruke. Podudarani prefiks je keširani ulaz; sve nakon toga je regularni ulaz.
- Granularnost — Keš čuva prompt u blokovima od 1,568 tokena, pa se prompt kraći od oko 1,500 tokena ne kešira. Broj keširanih tokena u odgovoru je vaš broj ulaznih tokena pomnožen keširanim udelom prompta, zaokružen naniže. Nije nužno višekratnik veličine bloka.
- Bez pogotka — Zahtev čiji početak nije u kešu naplaćuje se po običnoj ceni ulaza. Za keširane promptove nije objavljeno vreme trajanja i pogodak nije zagarantovan: pročitajte
usageda vidite šta je zahtev uzeo iz keša. - Bez prekidača — Zahtev se ne uključuje posebno, i nijedno polje ne isključuje keširanje.
- Koji modeli — Svaki hostovani open-weight ID. GET /v1/models prijavljuje capabilities.prompt_caching: true i pricing.cached_input_per_million_usd za njih. Shannon modeli naplaćuju jednu jedinstvenu stopu.
Pogodak u kešu u odgovoru
Pošaljite dva zahteva koja počinju istim dugim system promptom i ispišite upotrebu svakog. Prvi broj je ulaz zahteva, drugi je deo koji je pročitan iz keša.
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 Cene
Keširani ulazni tokeni se naplaćuju po 25% stope ulaza modela, zaokruženo na $0.001 po 1M. Pisanje u keš ne košta ništa dodatno, a izlaz se naplaćuje kao i obično. Keširana stopa za svaki ID se nalazi u tabeli Modeli i cene. Modeli i cene
Ulaz poziva se naplaćuje kao (ulaz − keširano) × cena ulaza + keširano × cena keširanog. Broj keširanih tokena nikad nije veći od broja ulaznih.
| Model | Ulaz / 1M | Keširani ulaz / 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 |
Dnevnik upotrebe navodi keširani ulaz svakog poziva. Njegovi naplaćeni tokeni i cena već uključuju cenu keširanog. Ključevi i upotreba
Polja upotrebe
| Endpoint | Keširani ulaz | Razmišljanje (Reasoning) |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — deo prompt_tokens | usage.completion_tokens_details.reasoning_tokens — deo completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — deo input_tokens | usage.output_tokens_details.reasoning_tokens — deo output_tokens |
/v1/messages | usage.cache_read_input_tokens — prijavljeno odvojeno: input_tokens je nekeširani deo; cache_creation_input_tokens je uvek 0 | razmišljanje se računa u 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
}
} Strimovani odgovor nosi ista polja u svojoj završnoj upotrebi. Ne morate to da tražite:
| Endpoint | Gde stiže upotreba |
|---|---|
/v1/chat/completions | usage na poslednjem delu pre data: [DONE]. Šalje se na svakom streamu. |
/v1/responses | response.usage događaja response.completed. |
/v1/messages | usage događaja message_delta. usage događaja message_start sadrži nule. |
Kako ostvariti više pogodaka keša
- Održavajte sistemski prompt i definicije alata bajt-po-bajt stabilnim kroz pozive. Vrednosti specifične za svaki poziv, kao što su vremenski žigovi ili ID-jevi zahteva, stavite na kraj poslednje poruke, a ne u sistemski prompt.
- Samo dodajte nove poruke na istoriju. Menjanje, skraćivanje ili sumiranje prethodnih krugova menja prefiks, i sve nakon prve izmene se naplaćuje kao regularni ulaz.
- Nemojte menjati redosled alata, poruka ili blokova sadržaja između poziva, i serijalizujte JSON (šeme alata, argumenti alata i rezultati) na isti način svaki put.
- Ostanite na jednom id-ju modela tokom razgovora i pošaljite sledeći poziv ubrzo nakon prethodnog.
API drži početak razgovora stabilnim u ovim slučajevima:
- Poruka
systemilideveloperposlata kasnije u razgovoru ostaje na svom mestu. Ne menja početak prompta, pa potezi pre nje ostaju keširani. - Argumenti poziva alata u ranijim potezima asistenta porede se po vrednosti. Redosled ključeva i razmaci tog JSON-a nisu važni.
- Sva tri endpointa čitaju razgovor na isti način. Razgovor nastavljen na drugom endpointu zadržava zajednički prefiks kada je sadržaj isti.
Polja zahteva
Prihvaćeni su prompt_cache_key (za Chat Completions i Responses) i cache_control na blokovima sadržaja poruka, tako da postojeći klijentski kod radi bez promena. Nijedno od njih nije obavezno: keširanje je automatsko i funkcioniše isto i bez njih.
| Polje | Šalje se na | Šta je to |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | Ključ za usmeravanje keša OpenAI API-ja. |
cache_control | /v1/messages | Cache breakpoint na bloku sadržaja, system bloku ili poruci Anthropic API-ja. |
stream_options | /v1/chat/completions | include_usage traži od OpenAI API-ja upotrebu na streamu. Ovde svaki stream završava upotrebom. |
Brojanje tokena
Dva besplatna endpointa, POST /v1/tokenize i POST /v1/messages/count_tokens, broje tokene teksta ili celog zahteva za hostovane open-weight modele pre nego što ga pošaljete. Imaju svoju stranicu: Brojanje tokena