Caching prompt
AUTOMATIKModel open-weight hosted menyimpan cache awalan prompt berulang secara automatik. Apabila permintaan bermula dengan prompt sistem, alat dan mesej terdahulu yang sama dengan permintaan terbaru pada model yang sama, awalan kongsi tersebut dibaca daripada cache dan dibilkan pada 25% daripada harga masukan model. Tiada apa yang perlu diaktifkan, dan penulisan cache adalah percuma.
Cara ia berfungsi
- Awalan, mengikut urutan — Prompt dibaca mengikut urutan: prompt sistem, definisi alat, kemudian mesej. Cache sepadan dari permulaan jujukan tersebut sehingga token pertama yang berbeza.
- Apa yang dikira sebagai hit — Permintaan yang promptnya bermula dengan kandungan yang sama seperti permintaan terbaru — biasanya pusingan sebelumnya dalam perbualan yang sama dengan mesej baru ditambah. Awalan yang sepadan adalah masukan cached; semua selepas itu adalah masukan biasa.
- Granulariti — Cache menyimpan prompt dalam blok 1,568 token, jadi prompt yang lebih pendek daripada kira-kira 1,500 token tidak di-cache. Bilangan cached dalam balasan ialah bilangan input anda didarab dengan bahagian prompt yang di-cache, dibundarkan ke bawah. Ia belum tentu gandaan saiz blok.
- Tanpa hit — Permintaan yang awalannya tiada dalam cache dibilkan pada kadar input biasa. Tiada jangka hayat diterbitkan untuk prompt yang di-cache dan hit tidak dijamin: baca
usageuntuk melihat apa yang diambil oleh permintaan daripada cache. - Tiada suis — Permintaan tidak perlu mengikut serta, dan tiada medan yang mematikan caching.
- Model mana — Setiap id open-weight hosted. GET /v1/models melaporkan capabilities.prompt_caching: true dan pricing.cached_input_per_million_usd untuk mereka. Model Shannon membil satu kadar rata.
Lihat cache hit dalam balasan
Hantar dua permintaan yang bermula dengan system prompt panjang yang sama dan cetak penggunaan setiap satu. Nombor pertama ialah input permintaan, nombor kedua ialah bahagiannya yang dibaca daripada 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 Harga
Token masukan cached dibilkan pada 25% daripada kadar masukan model, dibundarkan kepada $0.001 setiap 1M. Menulis ke cache tidak memerlukan kos tambahan, dan keluaran dibilkan seperti biasa. Kadar cached bagi setiap id berada dalam jadual Model & harga. Model & harga
Input sesuatu panggilan dicaj sebagai (input − cached) × kadar input + cached × kadar cached. Bilangan cached tidak pernah lebih besar daripada bilangan input.
| Model | Input / 1M | Input cached / 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 |
Log penggunaan menyenaraikan input cached bagi setiap panggilan. Token yang dibilkan dan kosnya sudah termasuk kadar cached. Kunci & penggunaan
Medan penggunaan
| Endpoint | Masukan cached | Penaakulan |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — bahagian prompt_tokens | usage.completion_tokens_details.reasoning_tokens — bahagian completion_tokens |
/v1/responses | usage.input_tokens_details.cached_tokens — bahagian input_tokens | usage.output_tokens_details.reasoning_tokens — bahagian output_tokens |
/v1/messages | usage.cache_read_input_tokens — dilaporkan berasingan: input_tokens adalah bahagian tidak cached; cache_creation_input_tokens sentiasa 0 | pemikiran dikira dalam 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
}
} Balasan stream membawa medan yang sama dalam penggunaan akhirnya. Anda tidak perlu memintanya:
| Endpoint | Tempat penggunaan tiba |
|---|---|
/v1/chat/completions | usage pada ketulan terakhir sebelum data: [DONE]. Ia dihantar pada setiap stream. |
/v1/responses | response.usage peristiwa response.completed. |
/v1/messages | usage peristiwa message_delta. usage bagi message_start mengandungi sifar. |
Mendapatkan lebih banyak hit cache
- Pastikan prompt sistem dan definisi alat stabil byte-demi-byte antara panggilan. Letakkan nilai setiap panggilan seperti timestamp atau id permintaan di akhir mesej terbaru, bukan dalam prompt sistem.
- Hanya tambah (append) pada sejarah. Menyunting, memotong atau meringkaskan pusingan terdahulu akan mengubah awalan, dan semua selepas perubahan pertama dibilkan sebagai masukan biasa.
- Jangan susun semula alat, mesej atau blok kandungan antara panggilan, dan serikan JSON (skema alat, argumen alat dan hasil) dengan cara yang sama setiap kali.
- Kekal pada satu id model sepanjang perbualan, dan hantar panggilan susulan sejurus selepas panggilan sebelumnya.
API mengekalkan permulaan perbualan supaya stabil dalam kes berikut:
- Mesej
systemataudeveloperyang dihantar kemudian dalam perbualan kekal di tempatnya. Ia tidak mengubah permulaan prompt, jadi giliran sebelumnya kekal di-cache. - Argumen panggilan alat dalam giliran assistant terdahulu dibandingkan mengikut nilai. Susunan kunci dan jarak dalam JSON itu tidak penting.
- Ketiga-tiga endpoint membaca perbualan dengan cara yang sama. Perbualan yang diteruskan pada endpoint lain mengekalkan awalan bersamanya apabila kandungannya sama.
Medan permintaan
prompt_cache_key (Chat Completions dan Responses) serta cache_control pada blok kandungan Messages diterima, jadi kod klien sedia ada berjalan tanpa perubahan. Kedua-duanya tidak diwajibkan: caching adalah automatik dan berfungsi sama tanpanya.
| Medan | Dihantar kepada | Apakah ia |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | Kunci penghalaan cache API OpenAI. |
cache_control | /v1/messages | Titik putus cache pada blok kandungan, blok system atau mesej API Anthropic. |
stream_options | /v1/chat/completions | include_usage meminta penggunaan daripada API OpenAI pada stream. Di sini setiap stream berakhir dengan penggunaan. |
Pengiraan tokens
Dua endpoint percuma, POST /v1/tokenize dan POST /v1/messages/count_tokens, mengira token sesuatu teks atau keseluruhan permintaan untuk model open-weight yang dihoskan sebelum anda menghantarnya. Ia mempunyai halaman tersendiri: Pengiraan token