Predpomaganje promptov
AVTOMATIČNOGostovani modeli z odprtimi utežmi avtomatično predpomagajo ponovljene predpomage promptov. Ko zahtevek začne z istim sistemskim promptom, orodji in predhodnimi sporočili kot nedavni zahtevek na istem modelu, se ta skupni predpomag prebere iz predpomage in obračuna po 25 % vhodne cene modela. Nič dejavno aktivirati, zapisovanje v predpomago pa je brezplačno.
Kako deluje
- Predpomag, po vrstnem redu — Prompt se bere po vrstnem redu: sistemski prompt, definicije orodij, nato sporočila. Predpomaga se ujemlja od začetka te zaporednosti do prvega tokenja, ki se razlikuje.
- Kaj velja za zadetek — Zahtevek, katerega prompt se začne z enakim vsebovim kot nedavni zahtevek — običajno prejšnji obrat istega pogovora z dodanimi novimi sporočili. Ujemani predpomag je predpomagan vhod; vse po tem je običajen vhod.
- Granularnost — Predpomnilnik hrani prompt v blokih po 1,568 tokenov, zato se prompt, krajši od približno 1,500 tokenov, ne predpomni. Število predpomnjenih v odgovoru je vaše število vhodnih, pomnoženo z deležem predpomnjenega dela prompta, zaokroženo navzdol. Ni nujno večkratnik velikosti bloka.
- Brez zadetka — Zahtevek, katerega začetka ni v predpomnilniku, se obračuna po običajni vhodni ceni. Za predpomnjene prompte ni objavljena življenjska doba in zadetek ni zagotovljen: preberite
usage, da vidite, kaj je zahtevek vzel iz predpomnilnika. - Brez stikala — Zahtevek se ne prijavi posebej in nobeno polje ne izklopi predpomnjenja.
- Kateri modeli — Vsak gostovani ID z odprtimi utežmi. GET /v1/models za njih riportira capabilities.prompt_caching: true in pricing.cached_input_per_million_usd. Shannon modeli obračunavajo eno fiksno tarifo.
Poglejte zadetek predpomnilnika v odgovoru
Pošljite dva zahtevka, ki se začneta z istim dolgim sistemskim promptom, in izpišite porabo vsakega. Prvo število je vhod zahtevka, drugo je del vhoda, prebran iz predpomnilnika.
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 Cenik
Tokeni predpomaganega vhoda se obračunavajo po 25 % vhodne tarife modela, zaokroženo na $0,001 na 1M. Zapisovanje v predpomago ne stane nič dodatnega, izhod pa se obračunava kot običajno. Predpomagana tarifa za vsak ID je v tabeli Modeli in cenovnik. Modeli in cene
Vhod klica se obračuna kot (vhod − predpomnjeno) × vhodna cena + predpomnjeno × cena predpomnjenega. Število predpomnjenih nikoli ni večje od števila vhodnih.
| Model | Vhod / 1M | Predpomnjeni vhod / 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 porabe navaja predpomnjeni vhod vsakega klica. Obračunani tokeni in strošek že vključujejo ceno predpomnjenega. Ključi in poraba
Polja uporabe
| Končni točka (Endpoint) | Predpomagan vhod | Razmisljevanje |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — del prompt_tokens | usage.completion_tokens_details.reasoning_tokens — del completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — del input_tokens | usage.output_tokens_details.reasoning_tokens — del output_tokens |
/v1/messages | usage.cache_read_input_tokens — riportirano posebej: input_tokens je nedel predpomagan; cache_creation_input_tokens je vedno 0 | razmisljevanje se šteje v 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
}
} Pretočni odgovor v končni porabi nosi ista polja. Zanje vam ni treba zaprositi:
| Končni točka (Endpoint) | Kje prispe poraba |
|---|---|
/v1/chat/completions | usage na zadnjem kosu pred data: [DONE]. Pošlje se v vsakem toku. |
/v1/responses | response.usage dogodka response.completed. |
/v1/messages | usage dogodka message_delta. usage v message_start vsebuje ničle. |
Kako doseči več zadetkov v predpomagi
- Poskrbite, da so sistemski prompt in definicije orodij byte-za-byte stabilni med klici. Vrednosti, ki se spreminjajo pri vsakem klicu (npr. časovni žigi ali ID-ji zahtevkov), postavite na konec zadnjega sporočila, ne v sistemski prompt.
- Z zgodovino samo dopolnjujte. Urejanje, krajšanje ali povzetje predhodnih obratov spremeni predpomag, vse po prvi spremembi pa se obračuna kot običajen vhod.
- Med klici ne spreminjajte vrstnega reda orodij, sporočil ali blokov vsebine ter JSON (sheme orodij, argumenti in rezultati) vedno serializirajte na isti način.
- Med pogovorom ostanite pri enem id-ju modela in nadaljnji klic pošljite kmalu po prejšnjem.
API ohranja začetek pogovora stabilen v teh primerih:
- Sporočilo
systemalideveloper, poslano pozneje v pogovoru, ostane na svojem mestu. Ne spremeni začetka prompta, zato predhodni obrati ostanejo predpomnjeni. - Argumenti klicev orodij v prejšnjih obratih pomočnika se primerjajo po vrednosti. Vrstni red ključev in presledki v tem JSON-u niso pomembni.
- Vsi trije endpointi pogovor preberejo enako. Pogovor, nadaljevan na drugem endpointu, obdrži skupni začetek, če je vsebina enaka.
Polja za zahtev
Podprta sta prompt_cache_key (za Chat Completions in Responses) ter cache_control za vsebinski blok Messages, zato obstoječa koda naročnikov deluje brez sprememb. Nobeno od tega ni obvezno: pomilgevanje je avtomatizirano in deluje enakoleto tudi brez njih.
| Polje | Poslano na | Kaj je |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | Ključ usmerjanja predpomnilnika API-ja OpenAI. |
cache_control | /v1/messages | Prelomna točka predpomnilnika na bloku vsebine, bloku system ali sporočilu API-ja Anthropic. |
stream_options | /v1/chat/completions | include_usage pri API-ju OpenAI zahteva porabo v toku. Tukaj se vsak tok konča s porabo. |
Števanje tokenjev
Dva brezplačna endpointa, POST /v1/tokenize in POST /v1/messages/count_tokens, preštejeta tokene besedila ali celotnega zahtevka za gostovane modele z odprtimi utežmi, preden ga pošljete. Imata svojo stran: Štetje tokenov