প্রম্পট ক্যাশিং
C-AUTOMATICহোস্ট করা ওপেন-ওয়েট মডেলগুলো পুনরাবৃত্ত প্রম্পট প্রিফিক্স স্বয়ংক্রিয়ভাবে ক্যাশ করে। যখন একটি রিকোয়েস্ট একই মডেলের সাম্প্রতিক রিকোয়েস্টের মতো একই সিস্টেম প্রম্পট, টুলস এবং আগের মেসেজ দিয়ে শুরু হয়, তখন সেই শেয়ারড প্রিফিক্স ক্যাশ থেকে পড়া হয় এবং মডেলের ইনপুট প্রাইসের ২৫% হিসেবে বিল করা হয়। এটি সক্রিয় করার জন্য আলাদা কিছু করতে হয় না, এবং ক্যাশ রাইট সম্পূর্ণ বিনামূল্যে।
এটি যেভাবে কাজ করে
- প্রিফিক্স, ক্রমানুসারে — প্রম্পটটি ক্রমানুসারে পড়া হয়: সিস্টেম প্রম্পট, টুলের ডেফিনিশন, তারপর মেসেজগুলো। ক্যাশ এই সিকোয়েন্সের শুরু থেকে প্রথম ভিন্ন টোকেন পর্যন্ত ম্যাচ করে।
- ক্যাশ হিট হিসেবে কী গণ্য হয় — এমন একটি রিকোয়েস্ট যার প্রম্পট সাম্প্রতিক রিকোয়েস্টের মতো একই কন্টেন্ট দিয়ে শুরু হয় — সাধারণত নতুন মেসেজ যুক্ত করে একই কথোপকথনের আগের টার্ন। ম্যাচিং প্রিফিক্সটি হলো ক্যাশড ইনপুট; এর পরের সবকিছু সাধারণ ইনপুট।
- গ্র্যানুলারিটি — ক্যাশ একটি প্রম্পটকে 1,568 tokens-এর ব্লকে ধরে রাখে, তাই প্রায় 1,500 tokens-এর চেয়ে ছোট প্রম্পট ক্যাশ হয় না। উত্তরে ক্যাশড সংখ্যা হলো আপনার ইনপুট সংখ্যাকে প্রম্পটের ক্যাশড অংশ দিয়ে গুণ করে নিচের দিকে গোল করা মান। এটি ব্লক সাইজের গুণিতক হতেই হবে এমন নয়।
- হিট ছাড়া — যে রিকোয়েস্টের শুরু ক্যাশে নেই তা সাধারণ ইনপুট রেটে বিল হয়। ক্যাশড প্রম্পটের জন্য কোনো মেয়াদ প্রকাশ করা হয় না এবং হিটের নিশ্চয়তা নেই: রিকোয়েস্ট ক্যাশ থেকে কী নিয়েছে তা দেখতে
usageপড়ুন। - কোনো সুইচ নেই — রিকোয়েস্ট থেকে ক্যাশিং বেছে নিতে হয় না, এবং কোনো ফিল্ড ক্যাশিং বন্ধ করে না।
- কোন মডেলগুলো — প্রতিটি হোস্ট করা ওপেন-ওয়েট আইডি। GET /v1/models তাদের জন্য capabilities.prompt_caching: true এবং pricing.cached_input_per_million_usd রিপোর্ট করে। Shannon মডেলগুলো একটি ফ্ল্যাট রেটে বিল করে।
উত্তরে ক্যাশ হিট দেখুন
একই দীর্ঘ সিস্টেম প্রম্পট দিয়ে শুরু হওয়া দুটি রিকোয়েস্ট পাঠান এবং প্রতিটির ইউসেজ প্রিন্ট করুন। প্রথম সংখ্যাটি রিকোয়েস্টের ইনপুট, দ্বিতীয়টি তার যে অংশ ক্যাশ থেকে পড়া হয়েছে।
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 প্রাইসিং
ক্যাশড ইনপুট টোকেনগুলো মডেলের ইনপুট রেটের ২৫% হিসেবে বিল করা হয়, যা প্রতি 1M-এ $0.001 পর্যন্ত রাউন্ড করা হয়। ক্যাশে রাইট করতে অতিরিক্ত কোনো খরচ নেই, এবং আউটপুট স্বাভাবিকভাবেই বিল করা হয়। প্রতিটি আইডির ক্যাশড রেট '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 |
ইউসেজ লগ প্রতিটি কলের ক্যাশড ইনপুট তালিকাভুক্ত করে। এর বিল করা tokens ও খরচে ক্যাশড রেট আগে থেকেই ধরা আছে। Keys & usage
ইউসেজ ফিল্ডস
| এন্ডপয়েন্ট | ক্যাশড ইনপুট | রিজনিং |
|---|---|---|
/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 সর্বদা ০ | thinking অংশটি 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
}
} স্ট্রিম করা উত্তর তার শেষ ইউসেজে একই ফিল্ডগুলো বহন করে। এটি চাইতে হয় না:
| এন্ডপয়েন্ট | ইউসেজ যেখানে আসে |
|---|---|
/v1/chat/completions | data: [DONE]-এর আগের শেষ চাংকে usage। এটি প্রতিটি স্ট্রিমে পাঠানো হয়। |
/v1/responses | response.completed ইভেন্টের response.usage। |
/v1/messages | message_delta ইভেন্টের usage। message_start-এর usage-এ শূন্য থাকে। |
lবে ক্যাশ হিট পাওয়ার উপায়
- কলগুলোর মধ্যে সিস্টেম প্রম্পট এবং টুল ডেফিনিশনগুলো বাইট-টু-বাইট স্থিতিশীল রাখুন। টাইমস্ট্যাম্প বা রিকোয়েস্ট আইডির মতো প্রতি-কল ভ্যালুগুলো সিস্টেম প্রম্পটে না রেখে সর্বশেষ মেসেজের শেষে রাখুন।
- শুধুমাত্র হিস্ট্রির শেষে নতুন মেসেজ যুক্ত করুন। আগের টার্নগুলো এডিট, ট্রিম বা সামারাইজ করলে প্রিফিক্স পরিবর্তিত হয়, এবং প্রথম পরিবর্তনের পরের সবকিছু সাধারণ ইনপুট হিসেবে বিল করা হয়।
- কলগুলোর মাঝে টুলস, মেসেজ বা কন্টেন্ট ব্লকের ক্রম পরিবর্তন করবেন না, এবং JSON (টুল স্কিমা, টুল আর্গুমেন্ট এবং রেজাল্ট) প্রতিবার একইভাবে সিরিয়ালাইজ করুন।
- একটি কথোপকথনের জন্য একই মডেল id-তে থাকুন, এবং পরের কলটি আগেরটির কিছুক্ষণের মধ্যেই পাঠান।
এই ক্ষেত্রগুলোতে API কথোপকথনের শুরু স্থির রাখে:
- কথোপকথনের পরে পাঠানো
systemবাdeveloperমেসেজ তার জায়গাতেই থাকে। এটি প্রম্পটের শুরু বদলায় না, তাই এর আগের টার্নগুলো ক্যাশড থাকে। - আগের assistant টার্নে টুল কলের আর্গুমেন্ট মান ধরে তুলনা করা হয়। সেই JSON-এর key-র ক্রম ও স্পেসিং গুরুত্বপূর্ণ নয়।
- তিনটি এন্ডপয়েন্ট একটি কথোপকথন একইভাবে পড়ে। অন্য এন্ডপয়েন্টে চালিয়ে যাওয়া কথোপকথন কনটেন্ট একই হলে তার শেয়ার্ড প্রিফিক্স ধরে রাখে।
রিকোয়েস্ট ফিল্ডস
prompt_cache_key (Chat Completions এবং Responses) এবং Messages কন্টেন্ট ব্লকের cache_control গ্রহণ করা হয়, তাই বিদ্যমান ক্লায়েন্ট কোড অপরিবর্তিত থাকে। কোনোটিই বাধ্যতামূলক নয়: ক্যাশিং স্বয়ংক্রিয় এবং এগুলো ছাড়াও একইভাবে কাজ করে।
| ফিল্ড | যেখানে পাঠানো হয় | এটি কী |
|---|---|---|
prompt_cache_key | /v1/chat/completions, /v1/responses | OpenAI API-র একটি ক্যাশ রাউটিং key। |
cache_control | /v1/messages | Anthropic API-র একটি কনটেন্ট ব্লক, একটি system ব্লক বা একটি মেসেজের ওপর ক্যাশ ব্রেকপয়েন্ট। |
stream_options | /v1/chat/completions | include_usage OpenAI API-র কাছে স্ট্রিমে ইউসেজ চায়। এখানে প্রতিটি স্ট্রিম ইউসেজ দিয়ে শেষ হয়। |
টোকেন গণনা
দুটি ফ্রি এন্ডপয়েন্ট, POST /v1/tokenize ও POST /v1/messages/count_tokens, পাঠানোর আগেই হোস্টেড ওপেন-ওয়েট মডেলগুলোর জন্য একটি টেক্সটের বা পুরো রিকোয়েস্টের tokens গণনা করে। এগুলোর নিজস্ব পেজ আছে: Token গণনা