Technical reference
کشکردن پرامپت
ذخیرهسازی موقت پرامپت به ارائهدهندهٔ مدل امکان میدهد بهجای پردازش دوبارهٔ آن در هر درخواست، پیشوند بدون تغییر پرامپت (دستورالعملهای system/developer، تعاریف ابزار و سایر زمینههای پایدار) را میان نوبتها بازاستفاده کند. این کار هزینهٔ توکن و تأخیر را در نشستهای طولانی با زمینهٔ تکراری کاهش میدهد.
OpenClaw در هر جایی که API بالادستی این شمارندهها را ارائه کند، مصرف ارائهدهنده را به cacheRead و cacheWrite نرمالسازی میکند. هنگامی که تصویر لحظهای نشست زنده فاقد شمارندههای کش باشد، خلاصههای مصرف (/status و موارد مشابه) به آخرین ورودی مصرف در رونوشت رجوع میکنند؛ مقدار زندهٔ غیرصفر همیشه بر مقدار جایگزین اولویت دارد.
مراجع ارائهدهندگان:
تنظیمات اصلی
cacheRetention
مقادیر: "none" | "short" | "long". بهعنوان پیشفرض سراسری، برای هر مدل و برای هر عامل قابل پیکربندی است.
agents: defaults: params: cacheRetention: "long" # none | short | long models: "anthropic/claude-opus-4-6": params: cacheRetention: "short" # پیشفرض سراسری را برای این مدل بازنویسی میکند list: - id: "alerts" params: cacheRetention: "none" # هر دو پیشفرض را برای این عامل بازنویسی میکندترتیب ادغام (مورد بعدی اولویت دارد):
agents.defaults.params- پیشفرض سراسری برای همهٔ مدلهاagents.defaults.models["provider/model"].params- بازنویسی مختص هر مدلagents.list[].params- بازنویسی مختص هر عامل که بر اساس شناسهٔ عامل تطبیق داده میشود
منبع: src/agents/embedded-agent-runner/extra-params.ts (resolveExtraParams).
contextPruning.mode: "cache-ttl"
پس از سپریشدن بازهٔ TTL کش، زمینهٔ قدیمی نتایج ابزار را هرس میکند تا درخواست پس از یک دورهٔ بیکاری، تاریخچهٔ بیشازحد بزرگ را دوباره در کش ذخیره نکند.
agents: defaults: contextPruning: mode: "cache-ttl" ttl: "1h"برای رفتار کامل، به هرس نشست مراجعه کنید.
گرم نگهداشتن با Heartbeat
Heartbeat میتواند پنجرههای کش را گرم نگه دارد و نوشتنهای مکرر در کش پس از وقفههای بیکاری را کاهش دهد. بهصورت سراسری (agents.defaults.heartbeat) یا برای هر عامل (agents.list[].heartbeat) قابل پیکربندی است.
agents: defaults: heartbeat: every: "55m"رفتار ارائهدهندگان
Anthropic (API مستقیم و Vertex AI)
cacheRetentionبرای ارائهدهندگانanthropicوanthropic-vertex، همچنین برای مدلهای Claude رویamazon-bedrockو نقاط پایانی سفارشی سازگار باanthropic-messagesدر صورت تنظیم صریحcacheRetentionپشتیبانی میشود.- در صورت تنظیمنشدن، OpenClaw برای Anthropic مستقیم مقدار
cacheRetention: "short"را مقداردهی اولیه میکند (فقط ارائهدهندگانanthropicوanthropic-vertex؛ سایر مسیرهای خانوادهٔ Anthropic به مقدار صریح نیاز دارند). - پاسخهای بومی Anthropic Messages مقادیر
cache_read_input_tokensوcache_creation_input_tokensرا ارائه میکنند که بهترتیب بهcacheReadوcacheWriteنگاشت میشوند. cacheRetention: "short"به کش موقت پیشفرض ۵ دقیقهای نگاشت میشود. وقتیcacheRetention: "long"بهطور صریح تنظیم شود، TTL یکساعته (cache_control: { type: "ephemeral", ttl: "1h" }) درخواست میشود. نگهداشت طولانی ضمنی یا مبتنی بر متغیر محیطی (OPENCLAW_CACHE_RETENTION=longبدونcacheRetentionصریح) فقط روی میزبانهایapi.anthropic.comیا Vertex AI (aiplatform.googleapis.com/*-aiplatform.googleapis.com) به TTL یکساعته ارتقا مییابد؛ سایر میزبانها کش ۵ دقیقهای را حفظ میکنند.
منبع: src/agents/anthropic-payload-policy.ts (resolveAnthropicEphemeralCacheControl، isLongTtlEligibleEndpoint).
OpenAI (API مستقیم)
- ذخیرهسازی موقت پرامپت در مدلهای جدید پشتیبانیشده بهصورت خودکار انجام میشود؛ OpenClaw نشانگرهای کش در سطح بلوک تزریق نمیکند.
- OpenClaw برای پایدار نگهداشتن مسیریابی کش میان نوبتها،
prompt_cache_keyرا ارسال میکند. میزبانهای مستقیمapi.openai.comاین مقدار را بهصورت خودکار دریافت میکنند. پراکسیهای سازگار با OpenAI (oMLX، llama.cpp و نقاط پایانی سفارشی) برای فعالسازی بایدcompat.supportsPromptCacheKey: trueرا در پیکربندی مدل داشته باشند؛ این قابلیت هرگز برای پراکسی بهصورت خودکار تشخیص داده نمیشود. prompt_cache_retention: "24h"فقط زمانی افزوده میشود کهcacheRetention: "long"انتخاب شده باشد و نقطهٔ پایانی حلشده هم از کلید کش و هم نگهداشت طولانی پشتیبانی کند (compat.supportsLongCacheRetentionکه بهطور پیشفرضtrueاست؛ نمایههای سازگاری Together AI و Cloudflare آن را غیرفعال میکنند).cacheRetention: "none"هر دو فیلد را حذف میکند.- برخوردهای کش از طریق
usage.prompt_tokens_details.cached_tokens(Chat Completions) یاinput_tokens_details.cached_tokens(Responses API) ارائه و بهcacheReadنگاشت میشوند. - محمولههای Responses API ممکن است
input_tokens_details.cache_write_tokensرا نیز ارائه کنند که بهcacheWriteنگاشت و با نرخ نوشتن در کش مدل قیمتگذاری میشود؛ در محمولههای Responses که این فیلد را ندارند،cacheWriteبرابر0باقی میماند. API Chat Completions در OpenAI شمارندهٔcache_write_tokensرا مستند یا منتشر نمیکند، اما OpenClaw همچنانprompt_tokens_details.cache_write_tokensرا در آنجا برای پراکسیهای سازگار با OpenRouter و پراکسیهای سبک DeepSeek که شمارش نوشتن جداگانهای گزارش میکنند، میخواند. - در عمل، رفتار OpenAI بیشتر شبیه کش پیشوند اولیه است تا بازاستفادهٔ پویای کل تاریخچه در Anthropic؛ بخش انتظارات زندهٔ OpenAI را در ادامه ببینید.
Amazon Bedrock
- ارجاعهای مدل Anthropic Claude (
amazon-bedrock/*anthropic.claude*بههمراه پیشوندهای نمایهٔ استنتاج سیستمی AWS یعنیus./eu./global.anthropic.claude*) از عبور صریحcacheRetentionپشتیبانی میکنند. - مدلهای غیر Anthropic در Bedrock (برای مثال
amazon.nova-*) هنگام اجرا، صرفنظر از هر مقدار پیکربندیشدهٔcacheRetention، بدون نگهداشت کش حل میشوند. - ARNهای مبهم نمایهٔ استنتاج برنامه در Bedrock (شناسههای نمایهای که شامل
claudeنیستند) نیز بدون نگهداشت کش حل میشوند، مگر اینکهcacheRetentionبهطور صریح تنظیم شده باشد؛ زیرا خانوادهٔ مدل را نمیتوان فقط از ARN استنباط کرد.
OpenRouter
برای ارجاعهای مدل openrouter/anthropic/*، OpenClaw نشانگرهای cache_control متعلق به Anthropic را در بلوکهای پرامپت system/developer تزریق میکند، اما فقط زمانی که درخواست همچنان یک مسیر تأییدشدهٔ OpenRouter را هدف گرفته باشد (openrouter روی نقطهٔ پایانی پیشفرض خود، یا هر ارائهدهنده/نشانی پایهای که به openrouter.ai حل شود). تغییر مقصد مدل به یک نشانی دلخواه پراکسی سازگار با OpenAI این تزریق را متوقف میکند.
contextPruning.mode: "cache-ttl" برای ارجاعهای مدل openrouter/anthropic/*، openrouter/deepseek/*، openrouter/moonshot/*، openrouter/moonshotai/* و openrouter/zai/* مجاز است، زیرا این مسیرها ذخیرهسازی موقت پرامپت در سمت ارائهدهنده را بدون نیاز به نشانگرهای تزریقشدهٔ OpenClaw مدیریت میکنند.
منبع: extensions/openrouter/index.ts (OPENROUTER_CACHE_TTL_MODEL_PREFIXES).
ساخت کش DeepSeek روی OpenRouter بهصورت بهترین تلاش انجام میشود و ممکن است چند ثانیه طول بکشد؛ یک درخواست بلافاصله پس از آن ممکن است همچنان cached_tokens: 0 را نشان دهد. پس از تأخیری کوتاه، با تکرار درخواستی با همان پیشوند و استفاده از usage.prompt_tokens_details.cached_tokens بهعنوان نشانهٔ برخورد کش، آن را تأیید کنید.
Google Gemini (API مستقیم)
- انتقال مستقیم Gemini (
api: "google-generative-ai") برخوردهای کش را از طریقcachedContentTokenCountبالادستی گزارش میکند که بهcacheReadنگاشت میشود. - خانوادههای مدل واجد شرایط:
gemini-2.5*وgemini-3*(گونههای Live/پیشنمایش خارج از این تطبیق پیشوند، مانندgemini-live-2.5-flash-preview، مستثنا هستند). - وقتی
cacheRetentionروی یک مدل واجد شرایط تنظیم شود، OpenClaw بهطور خودکار یک منبعcachedContentsبرای پرامپت system ایجاد، بازاستفاده و تازهسازی میکند؛ به شناسهٔ دستی محتوای کششده نیازی نیست. TTL برایcacheRetention: "short"برابر300sو برای"long"برابر3600sاست. - همچنان میتوانید یک شناسهٔ محتوای کششدهٔ ازپیشموجود Gemini را از طریق
params.cachedContent(یا شکل قدیمیparams.cached_content) ارسال کنید؛ شناسهٔ صریح، مسیر مدیریت خودکار کش را کاملاً رد میکند. - این سازوکار از ذخیرهسازی موقت پیشوند پرامپت در Anthropic/OpenAI جدا است: OpenClaw بهجای تزریق نشانگرهای درونخطی کش، یک منبع بومی ارائهدهنده به نام
cachedContentsرا برای Gemini مدیریت میکند.
منبع: src/agents/embedded-agent-runner/google-prompt-cache.ts.
ارائهدهندگان مبتنی بر مهار CLI (Claude Code، Gemini CLI)
پشتانههای CLI که رویدادهای مصرف JSONL منتشر میکنند (jsonlDialect: "claude-stream-json" یا "gemini-stream-json")، از یک تجزیهگر مشترک مصرف عبور میکنند که چندین گونهٔ نام فیلد، از جمله شمارندهٔ سادهٔ cached نگاشتشده به cacheRead، را تشخیص میدهد. وقتی محمولهٔ JSON در CLI فاقد فیلد مستقیم توکن ورودی باشد، OpenClaw آن را بهصورت input_tokens - cached محاسبه میکند. این فقط نرمالسازی مصرف است و برای این مدلهای هدایتشده با CLI، نشانگرهای کش پرامپت مشابه Anthropic/OpenAI ایجاد نمیکند.
منبع: src/agents/cli-output.ts (toCliUsage).
سایر ارائهدهندگان
اگر ارائهدهندهای از هیچیک از حالتهای کش بالا پشتیبانی نکند، cacheRetention اثری ندارد.
مرز کش پرامپت system
OpenClaw پرامپت system را در یک مرز داخلی پیشوند کش به یک پیشوند پایدار و یک پسوند متغیر تقسیم میکند. محتوای بالای مرز (تعاریف ابزار، فرادادهٔ Skills و فایلهای فضای کاری) طوری مرتب میشود که در همهٔ نوبتها از نظر بایتی یکسان بماند. محتوای پایین مرز (برای مثال HEARTBEAT.md، مُهرهای زمانی زمان اجرا و سایر فرادادههای مختص هر نوبت) میتواند بدون بیاعتبارکردن پیشوند کششده تغییر کند.
انتخابهای کلیدی طراحی:
- فایلهای پایدار زمینهٔ پروژه در فضای کاری پیش از
HEARTBEAT.mdمرتب میشوند تا تغییرات Heartbeat پیشوند پایدار را از بین نبرد. - این مرز در شکلدهی انتقال خانوادهٔ Anthropic، خانوادهٔ OpenAI، Google و CLI اعمال میشود تا همهٔ ارائهدهندگان پشتیبانیشده از پایداری یکسان پیشوند بهرهمند شوند.
- درخواستهای Codex Responses و Anthropic Vertex از شکلدهی کش آگاه از مرز عبور داده میشوند تا بازاستفاده از کش با آنچه ارائهدهندگان واقعاً دریافت میکنند همتراز بماند.
- اثرانگشتهای پرامپت system نرمالسازی میشوند (فاصلههای سفید، پایان خطها، زمینهٔ افزودهشده توسط هوک و ترتیب قابلیتهای زمان اجرا) تا پرامپتهایی که از نظر معنایی تغییری نکردهاند، کش را میان نوبتها به اشتراک بگذارند.
اگر پس از تغییر پیکربندی یا فضای کاری جهشهای غیرمنتظرهای در cacheWrite مشاهده کردید، بررسی کنید که تغییر در بالا یا پایین مرز کش قرار میگیرد. انتقال محتوای متغیر به پایین مرز (یا پایدارکردن آن) معمولاً مشکل را برطرف میکند.
محافظهای پایداری کش OpenClaw
- کاتالوگهای ابزار MCP همراه، پیش از ثبت ابزار بهصورت قطعی مرتب میشوند (ابتدا بر اساس نام سرور و سپس نام ابزار) تا تغییر ترتیب
listTools()موجب تغییر مکرر بلوک ابزارها و از بین رفتن پیشوندهای کش پرامپت نشود. - نشستهای قدیمی دارای بلوکهای تصویر ذخیرهشده، ۳ نوبت تکمیلشدهٔ اخیر را دستنخورده نگه میدارند (با شمارش همهٔ نوبتهای تکمیلشده، نه فقط نوبتهای دارای تصویر). بلوکهای تصویر قدیمیتر که قبلاً پردازش شدهاند با یک نشانگر متنی جایگزین میشوند تا پیگیریهای پرتصویر، محمولههای قدیمی و بزرگ را مکرراً ارسال نکنند.
الگوهای تنظیم
ترافیک ترکیبی (پیشفرض توصیهشده)
یک خط پایهٔ بلندمدت را روی عامل اصلی خود حفظ کنید و ذخیرهسازی موقت را برای عاملهای اعلانگر با ترافیک جهشی غیرفعال کنید:
agents: defaults: model: primary: "anthropic/claude-opus-4-6" models: "anthropic/claude-opus-4-6": params: cacheRetention: "long" list: - id: "research" default: true heartbeat: every: "55m" - id: "alerts" params: cacheRetention: "none"خط پایه با اولویت هزینه
- خط پایهٔ
cacheRetention: "short"را تنظیم کنید. contextPruning.mode: "cache-ttl"را فعال کنید.- فقط برای عاملهایی که از کش گرم سود میبرند، فاصلهٔ Heartbeat را کمتر از TTL خود نگه دارید.
آزمونهای زندهٔ رگرسیون
OpenClaw یک دروازهٔ ترکیبی رگرسیون زندهٔ کش را اجرا میکند که پیشوندهای تکراری، نوبتهای ابزار، نوبتهای تصویر، رونوشتهای ابزار به سبک MCP و یک کنترل بدون کش Anthropic را پوشش میدهد.
src/agents/live-cache-regression.live.test.tssrc/agents/live-cache-regression-runner.tssrc/agents/live-cache-regression-baseline.ts
آن را با دستور زیر اجرا کنید:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cacheفایل خط پایه، جدیدترین اعداد زندهٔ مشاهدهشده را بههمراه کفهای رگرسیون مختص هر ارائهدهنده که آزمون بررسی میکند، ذخیره میکند. هر اجرا از شناسههای نشست و فضاهای نام پرامپت تازه و مختص همان اجرا استفاده میکند تا وضعیت کش قبلی نمونهٔ فعلی را آلوده نکند. Anthropic و OpenAI اعمال متفاوتی دارند: نرسیدن Anthropic به کف تعیینشده یک رگرسیون قطعی است (آزمون شکست میخورد)، درحالیکه نرسیدن OpenAI به کف فقط تحت نظارت است (بهعنوان هشدار ثبت میشود و اجرا را شکست نمیدهد). آنها یک آستانهٔ واحد مشترک میان ارائهدهندگان ندارند.
انتظارات زندهٔ Anthropic
- انتظار نگارشهای صریح گرمسازی از طریق
cacheWriteرا داشته باشید. - در نوبتهای تکراری، انتظار استفادهٔ مجدد از تقریباً تمام تاریخچه را داشته باشید، زیرا کنترل کش Anthropic نقطهٔ شکست کش را در طول مکالمه پیش میبرد.
- کفهای مبنا برای مسیرهای پایدار، ابزار، تصویر و سبک MCP، دروازههای سخت رگرسیون هستند.
انتظارات زندهٔ OpenAI
- فقط انتظار
cacheReadرا داشته باشید؛ در Chat Completions مقدارcacheWriteبرابر0باقی میماند. - استفادهٔ مجدد از کش در نوبتهای تکراری را یک سطح ثابت مختص ارائهدهنده در نظر بگیرید، نه استفادهٔ مجدد متحرک از تمام تاریخچه به سبک Anthropic.
- کفها فقط برای پایش هستند (عدم دستیابی به آنها بهصورت هشدار ثبت میشود، نه شکست آزمون) و از رفتار زندهٔ مشاهدهشده در
gpt-5.4-miniبه دست آمدهاند:
| سناریو | کف cacheRead |
کف نرخ اصابت |
|---|---|---|
| پیشوند پایدار | ۴٬۶۰۸ | ۰٫۹۰ |
| رونوشت ابزار | ۴٬۰۹۶ | ۰٫۸۵ |
| رونوشت تصویر | ۳٬۸۴۰ | ۰٫۸۲ |
| رونوشت به سبک MCP | ۴٬۰۹۶ | ۰٫۸۵ |
جدیدترین اعداد مبنای مشاهدهشده (از live-cache-regression-baseline.ts) به این مقادیر رسیدند: پیشوند پایدار cacheRead=4864، نرخ اصابت 0.966؛ رونوشت ابزار cacheRead=4608، نرخ اصابت 0.896؛ رونوشت تصویر cacheRead=4864، نرخ اصابت 0.954؛ رونوشت به سبک MCP با cacheRead=4608 و نرخ اصابت 0.891.
دلیل تفاوت ادعاها: Anthropic نقاط شکست صریح کش و استفادهٔ مجدد متحرک از تاریخچهٔ مکالمه را ارائه میکند، در حالی که پیشوند عملاً قابلاستفادهٔ مجدد OpenAI در ترافیک زنده ممکن است پیش از رسیدن به کل پرامپت در یک سطح ثابت بماند. مقایسهٔ این دو ارائهدهنده با یک آستانهٔ درصدی واحد و مشترک میان ارائهدهندگان، رگرسیونهای کاذب ایجاد میکند.
پیکربندی diagnostics.cacheTrace
diagnostics: cacheTrace: enabled: true filePath: "~/.openclaw/logs/cache-trace.jsonl" # اختیاری includeMessages: false # پیشفرض true includePrompt: false # پیشفرض true includeSystem: false # پیشفرض trueمقادیر پیشفرض:
| کلید | مقدار پیشفرض |
|---|---|
filePath |
$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl |
includeMessages |
true |
includePrompt |
true |
includeSystem |
true |
کلیدهای تغییر محیطی (اشکالزدایی موردی)
| متغیر | اثر |
|---|---|
OPENCLAW_CACHE_TRACE=1 |
ردیابی کش را فعال میکند |
OPENCLAW_CACHE_TRACE_FILE=path |
مسیر خروجی را بازنویسی میکند |
OPENCLAW_CACHE_TRACE_MESSAGES=0|1 |
ثبت محتوای کامل پیام را تغییر میدهد |
OPENCLAW_CACHE_TRACE_PROMPT=0|1 |
ثبت متن پرامپت را تغییر میدهد |
OPENCLAW_CACHE_TRACE_SYSTEM=0|1 |
ثبت پرامپت سیستم را تغییر میدهد |
چه مواردی را بررسی کنید
- رویدادهای ردیابی کش بهصورت JSONL و دارای عکسهای فوری مرحلهبندیشدهای مانند
session:loaded،prompt:before،stream:contextوsession:afterهستند. - تأثیر توکنهای کش در هر نوبت در نماهای معمول مصرف قابل مشاهده است:
cacheReadوcacheWriteدر/usage tokens،/status، خلاصههای مصرف نشست و چیدمانهای سفارشیmessages.usageTemplateنمایش داده میشوند. - برای Anthropic، هنگامی که کش فعال است، انتظار هر دو مقدار
cacheReadوcacheWriteرا داشته باشید. - برای OpenAI، در اصابتهای کش انتظار
cacheReadرا داشته باشید؛cacheWriteفقط در محتوای Responses API که آن را شامل میشود مقداردهی میشود (به بخش OpenAI در بالا مراجعه کنید). - OpenAI همچنین سرآیندهای ردیابی و محدودیت نرخ مانند
x-request-id،openai-processing-msوx-ratelimit-*را بازمیگرداند؛ از آنها برای ردیابی درخواست استفاده کنید، اما محاسبهٔ اصابت کش همچنان باید از محتوای مصرف به دست آید، نه از سرآیندها.
عیبیابی سریع
cacheWriteبالا در بیشتر نوبتها: ورودیهای متغیر پرامپت سیستم را بررسی کنید؛ اطمینان یابید مدل یا ارائهدهنده از تنظیمات کش شما پشتیبانی میکند.cacheWriteبالا در Anthropic: اغلب به این معناست که نقطهٔ شکست کش روی محتوایی قرار گرفته است که در هر درخواست تغییر میکند.cacheReadپایین OpenAI: بررسی کنید که پیشوند پایدار در ابتدا قرار دارد، پیشوند تکراری دستکم ۱۰۲۴ توکن است و برای نوبتهایی که باید کش مشترک داشته باشند، همانprompt_cache_keyدوباره استفاده میشود.- بیاثر بودن
cacheRetention: تأیید کنید کلید مدل باagents.defaults.models["provider/model"]مطابقت دارد. - درخواستهای Bedrock Nova با تنظیمات کش: مورد انتظار است — این درخواستها هنگام اجرا بدون نگهداشت کش تفکیک میشوند.
مستندات مرتبط: