प्रॉम्प्ट कॅशिंग
स्वयंचलितहोस्टेड ओपन-वेट मॉडेल्स पुनरावृत्ती प्रॉम्प्ट प्रीफिक्स स्वयंचलितपणे कॅश करतात. जेव्हा एखादी विनंती त्याच मॉडेलवरील अलीकडील विनंतीप्रमाणेच सिस्टम प्रॉम्प्ट, टूल्स आणि आधीच्या संदेशांनी सुरू होते, तेव्हा तो सामायिक प्रीफिक्स कॅशमधून वाचला जातो आणि मॉडेलच्या इनपुट किमतीच्या २५% दराने बिल केला जातो. यासाठी काहीही सक्षम (enable) करण्याची गरज नाही, आणि कॅश राइट्स मोफत आहेत.
हे कसे कार्य करते
- प्रीफिक्स, क्रमाने — प्रॉम्प्ट क्रमाने वाचला जातो: सिस्टम प्रॉम्प्ट, टूल डेफिनिशन्स आणि त्यानंतर संदेश. कॅश या क्रमाच्या सुरुवातीपासून पहिल्या भिन्न टोकनपर्यंत जुळते.
- हिट म्हणून काय मोजले जाते — अशी विनंती ज्याचा प्रॉम्प्ट अलीकडील विनंतीप्रमाणेच सामग्रीने सुरू होतो — साधारणपणे नवीन संदेश जोडलेले त्याच संभाषणाचे मागील टर्न. जुळणारा प्रीफिक्स हा कॅश केलेले इनपुट आहे; त्यानंतरचे सर्व नियमित इनपुट आहे.
- ग्रॅन्युलॅरिटी — कॅश प्रॉम्प्ट 1,568 टोकन्सच्या ब्लॉक्समध्ये ठेवतो, त्यामुळे सुमारे 1,500 टोकन्सपेक्षा लहान प्रॉम्प्ट कॅश होत नाही. उत्तरातील कॅश केलेली संख्या म्हणजे तुमची इनपुट संख्या गुणिले प्रॉम्प्टचा कॅश केलेला वाटा, खाली पूर्णांकित. ती ब्लॉक आकाराचा गुणाकार असेलच असे नाही.
- हिट नसताना — ज्या रिक्वेस्टची सुरुवात कॅशमध्ये नसते तिचे बिल नियमित इनपुट दराने होते. कॅश केलेल्या प्रॉम्प्टसाठी कोणताही कालावधी जाहीर केलेला नाही आणि हिटची हमी नाही: रिक्वेस्टने कॅशमधून काय घेतले ते पाहण्यासाठी
usageवाचा. - स्विच नाही — रिक्वेस्ट ऑप्ट-इन करत नाही, आणि कोणतेही फील्ड कॅशिंग बंद करत नाही.
- कोणती मॉडेल्स — प्रत्येक होस्टेड ओपन-वेट id. GET /v1/models त्यांच्यासाठी capabilities.prompt_caching: true आणि pricing.cached_input_per_million_usd रिपोर्ट करते. Shannon मॉडेल्स एक सपाट दर लावतात.
उत्तरात कॅश हिट पहा
एकाच लांब सिस्टम प्रॉम्प्टने सुरू होणाऱ्या दोन रिक्वेस्ट्स पाठवा आणि प्रत्येकाचा usage प्रिंट करा. पहिला आकडा रिक्वेस्टचे इनपुट आहे, दुसरा त्यातील कॅशमधून वाचलेला भाग आहे.
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 किंमत
कॅश केलेले इनपुट टोकन्स मॉडेलच्या इनपुट रेटच्या २५% दराने बिल केले जातात, जे १M प्रती $०.००१ पर्यंत राउंड केले जातात. कॅशमध्ये लिहिण्यासाठी अतिरिक्त खर्च येत नाही आणि आउटपुट नेहमीप्रमाणे बिल केले जाते. प्रत्येक id चा कॅश रेट 'Models & pricing' टेबलमध्ये आहे. मॉडेल्स आणि किंमत
कॉलचे इनपुट (इनपुट − कॅश केलेले) × इनपुट दर + कॅश केलेले × कॅश दर असे आकारले जाते. कॅश केलेली संख्या इनपुट संख्येपेक्षा कधीही मोठी नसते.
| मॉडेल | इनपुट / 1M | कॅश केलेले इनपुट / 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 |
usage लॉग प्रत्येक कॉलचे कॅश केलेले इनपुट दाखवतो. त्याचे बिल केलेले टोकन्स आणि खर्चात कॅश दर आधीच समाविष्ट आहे. की आणि वापर
वापर क्षेत्रे (Usage fields)
| एंडपॉइंट | कॅश केलेले इनपुट | रीझनिंग |
|---|---|---|
/v1/chat/completions | usage.prompt_tokens_details.cached_tokens — prompt_tokens चा भाग | usage.completion_tokens_details.reasoning_tokens — completion_tokens चा भाग |
/v1/responses | usage.input_tokens_details.cached_tokens — input_tokens चा भाग | usage.output_tokens_details.reasoning_tokens — output_tokens चा भाग |
/v1/messages | usage.cache_read_input_tokens — वेगळे रिपोर्ट केलेले: input_tokens हा अनकॅश भाग आहे; cache_creation_input_tokens नेहमी ० असतो | थिंकिंग 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
}
} स्ट्रीम केलेल्या उत्तराच्या अंतिम usage मध्ये तीच फील्ड्स असतात. ते मागावे लागत नाही:
| एंडपॉइंट | usage कुठे येतो |
|---|---|
/v1/chat/completions | data: [DONE] च्या आधीच्या शेवटच्या चंकवरील usage. तो प्रत्येक स्ट्रीमवर पाठवला जातो. |
/v1/responses | response.completed इव्हेंटचा response.usage. |
/v1/messages | message_delta इव्हेंटचा usage. message_start चा usage शून्ये दाखवतो. |
अधिक कॅश हिट्स मिळवण्यासाठी
- कॉल दरम्यान सिस्टम प्रॉम्प्ट आणि टूल डेफिनिशन्स बाइट-टू-बाइट स्थिर ठेवा. टाइमस्टॅम्प किंवा रिक्वेस्ट ids सारखी प्रति-कॉल व्हॅल्यू सिस्टम प्रॉम्प्टमध्ये न ठेवता शेवटच्या संदेशाच्या शेवटी ठेवा.
- केवळ हिस्ट्रीमध्ये अपेंड (append) करा. आधीच्या टर्न्समध्ये बदल करणे, ट्रिम करणे किंवा सारांश देणे प्रीफिक्स बदलतो, आणि पहिल्या बदला नंतरचे सर्व नियमित इनपुट म्हणून बिल केले जाते.
- कॉल दरम्यान टूल्स, संदेश किंवा कंटेंट ब्लॉक्सचा क्रम बदलू नका आणि JSON (टूल स्कीमा, टूल आर्ग्युमेंट्स आणि रिझल्ट्स) प्रत्येक वेळी एकाच पद्धतीने सिरियलाईज करा.
- संभाषणासाठी एकाच मॉडेल id वर राहा, आणि पुढचा कॉल आधीच्या कॉलनंतर लवकर पाठवा.
API या प्रसंगांत संभाषणाची सुरुवात स्थिर ठेवते:
- संभाषणात नंतर पाठवलेला
systemकिंवाdeveloperसंदेश आपल्या जागीच राहतो. तो प्रॉम्प्टची सुरुवात बदलत नाही, त्यामुळे त्याच्या आधीचे टर्न्स कॅश राहतात. - आधीच्या assistant टर्न्समधील टूल कॉल्सचे आर्ग्युमेंट्स व्हॅल्यूनुसार तुलना केले जातात. त्या JSON ची की क्रमवारी आणि स्पेसिंग महत्त्वाचे नाही.
- तिन्ही एंडपॉइंट संभाषण एकाच प्रकारे वाचतात. दुसऱ्या एंडपॉइंटवर पुढे चालवलेल्या संभाषणाचा मजकूर तोच असल्यास त्याचा सामायिक प्रीफिक्स टिकतो.
रिक्वेस्ट फील्ड्स
prompt_cache_key (Chat Completions आणि Responses) आणि Messages content blocks वरील cache_control स्वीकारले जातात, त्यामुळे सध्याचा क्लायंट कोड न बदलता चालतो. दोन्ही आवश्यक नाहीत: caching स्वयंचलित आहे आणि त्यांच्याशिवाय देखील ते तसेच कार्य करते.
| फील्ड | कोणाला पाठवले | ते काय आहे |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | OpenAI API ची कॅश रूटिंग की. |
cache_control | /v1/messages | Anthropic API च्या कंटेंट ब्लॉक, system ब्लॉक किंवा संदेशावरील कॅश ब्रेकपॉइंट. |
stream_options | /v1/chat/completions | include_usage OpenAI API ला स्ट्रीमवर usage मागतो. येथे प्रत्येक स्ट्रीम usage सह संपतो. |
tokens मोजणे
दोन मोफत एंडपॉइंट, POST /v1/tokenize आणि POST /v1/messages/count_tokens, तुम्ही पाठवण्यापूर्वी होस्ट केलेल्या open-weight मॉडेल्ससाठी मजकुराचे किंवा संपूर्ण रिक्वेस्टचे टोकन्स मोजतात. त्यांचे स्वतःचे पान आहे: टोकन मोजणी