رفتن به محتوا
کش کردن پرامپت

کش کردن پرامپت

خودکار

مدل‌های hosted open-weight پیشوندهای تکراری پرامپت را به‌طور خودکار کش می‌کنند. وقتی یک درخواست با همان پرامپت سیستم، ابزارها و پیام‌های قبلیِ یک درخواست اخیر در همان مدل شروع شود، آن پیشوند مشترک از کش خوانده شده و ۲۵٪ قیمت ورودی مدل محاسبه می‌شود. نیازی به فعال‌سازی نیست و نوشتن در کش رایگان است.

نحوه عملکرد

  • پیشوند، به ترتیب — پرامپت به ترتیب زیر خوانده می‌شود: پرامپت سیستم، تعریف ابزارها و سپس پیام‌ها. کش از ابتدای این توالی تا اولین توکنی که متفاوت باشد، مطابقت داده می‌شود.
  • چه چیزی Hit محسوب می‌شود — درخواستی که پرامپت آن با محتوای یک درخواست اخیر شروع شود — معمولاً نوبت قبلی از همان گفتگو که پیام‌های جدید به آن اضافه شده است. پیشوند منطبق، ورودی کش‌شده است؛ هر چیزی بعد از آن، ورودی معمولی است.
  • دقت (Granularity) — کش یک پرامپت را در بلوک‌های 1,568 توکنی نگه می‌دارد، پس پرامپتی کوتاه‌تر از حدود 1,500 توکن کش نمی‌شود. تعداد کش‌شده در پاسخ برابر تعداد ورودی شما ضربدر سهم کش‌شده پرامپت است، گرد شده به پایین. لزوماً مضربی از اندازه بلوک نیست.
  • بدون Hit — درخواستی که ابتدایش در کش نیست با نرخ عادی ورودی محاسبه می‌شود. برای پرامپت‌های کش‌شده مدت ماندگاری منتشر نشده و Hit تضمین‌شده نیست: usage را بخوانید تا ببینید یک درخواست چه مقدار را از کش گرفته است.
  • بدون کلید فعال/غیرفعال — درخواست نیازی به فعال‌سازی ندارد و هیچ فیلدی کش را خاموش نمی‌کند.
  • کدام مدل‌ها — تمام شناسه‌های hosted open-weight. متد GET /v1/models مقادیر capabilities.prompt_caching: true و pricing.cached_input_per_million_usd را برای آن‌ها گزارش می‌دهد. مدل‌های Shannon یک نرخ ثابت دارند.

دیدن یک Hit کش در پاسخ

دو درخواست بفرستید که با یک system prompt طولانی یکسان شروع می‌شوند و 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

قیمت‌گذاری

توکن‌های ورودی کش‌شده با ۲۵٪ نرخ ورودی مدل محاسبه شده و به $0.001 per 1M گرد می‌شوند. نوشتن در کش هزینه اضافی ندارد و خروجی طبق معمول محاسبه می‌شود. نرخ کش هر شناسه در جدول «مدل‌ها و قیمت‌گذاری» موجود است. مدل‌ها و قیمت‌ها

ورودی یک فراخوانی به این صورت محاسبه می‌شود: (ورودی − کش‌شده) × نرخ ورودی + کش‌شده × نرخ کش‌شده. تعداد کش‌شده هیچ‌وقت از تعداد ورودی بزرگ‌تر نیست.

مدل ورودی / 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

گزارش مصرف ورودی کش‌شده هر فراخوانی را فهرست می‌کند. توکن‌های محاسبه‌شده و هزینه آن از قبل نرخ کش‌شده را در بر می‌گیرند. کلیدها و مصرف

فیلدهای استفاده

اندپوینت ورودی کش‌شده استدلال (Reasoning)
/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
    }
  }
}

پاسخ streamشده همین فیلدها را در usage پایانی خود دارد. لازم نیست آن را درخواست کنید:

اندپوینت محل رسیدن usage
/v1/chat/completions usage روی آخرین chunk پیش از data: [DONE]. روی هر stream فرستاده می‌شود.
/v1/responses response.usage در رویداد response.completed.
/v1/messages usage رویداد message_delta. usage در message_start صفر است.

افزایش نرخ Hit کش

  • پرامپت سیستم و تعریف ابزارها را در تمام فراخوانی‌ها دقیقاً یکسان نگه دارید. مقادیر متغیر مانند Timestamp یا ID درخواست‌ها را در انتهای آخرین پیام قرار دهید، نه در پرامپت سیستم.
  • فقط به تاریخچه پیام‌ها اضافه کنید (Append). ویرایش، کوتاه کردن یا خلاصه‌سازی نوبت‌های قبلی، پیشوند را تغییر می‌دهد و هر چیزی بعد از اولین تغییر، به عنوان ورودی معمولی محاسبه می‌شود.
  • ترتیب ابزارها، پیام‌ها یا بلوک‌های محتوا را بین فراخوانی‌ها تغییر ندهید و JSONها (طرح‌واره ابزارها، آرگومان‌ها و نتایج) را هر بار به یک شکل سریالایز کنید.
  • در یک گفتگو روی یک شناسه مدل بمانید و فراخوانی بعدی را کمی پس از قبلی بفرستید.

API در این موارد ابتدای گفتگو را ثابت نگه می‌دارد:

  • پیام system یا developer که بعداً در گفتگو فرستاده شود در جای خودش می‌ماند. ابتدای پرامپت را تغییر نمی‌دهد، پس نوبت‌های پیش از آن کش‌شده می‌مانند.
  • آرگومان‌های فراخوانی ابزار در نوبت‌های قبلی assistant بر اساس مقدار مقایسه می‌شوند. ترتیب کلیدها و فاصله‌گذاری آن JSON اهمیتی ندارد.
  • این سه endpoint یک گفتگو را یکسان می‌خوانند. گفتگویی که روی endpoint دیگری ادامه یابد، اگر محتوا یکی باشد پیشوند مشترک خود را حفظ می‌کند.

فیلدهای درخواست

فیلدهای prompt_cache_key (در Chat Completions و Responses) و cache_control در بلوک‌های محتوای Messages پذیرفته شده‌اند، بنابراین کدهای فعلی کلاینت بدون تغییر اجرا می‌شوند. هیچ‌کدام الزامی نیستند: کشینگ خودکار است و بدون آن‌ها نیز به همین شکل عمل می‌کند.

فیلد ارسال‌شده به چیست
prompt_cache_key /v1/chat/completions, /v1/responses یک کلید مسیریابی کش در API OpenAI.
cache_control /v1/messages یک نقطه شکست کش (cache breakpoint) روی بلوک محتوا، بلوک system یا پیامی در API Anthropic.
stream_options /v1/chat/completions include_usage در API OpenAI برای دریافت usage روی یک stream درخواست می‌شود. اینجا هر stream با usage پایان می‌یابد.

شمارش توکن‌ها

دو endpoint رایگان، POST /v1/tokenize و POST /v1/messages/count_tokens، پیش از ارسال، توکن‌های یک متن یا کل یک درخواست را برای مدل‌های open-weight میزبانی‌شده می‌شمارند. آن‌ها صفحه خودشان را دارند: شمارش توکن