Technical reference
Prompt cache
يعني Prompt caching أن موفّر النموذج يمكنه إعادة استخدام بادئات prompt غير المتغيرة (عادةً تعليمات system/developer وغيرها من السياقات الثابتة) عبر الأدوار بدلًا من إعادة معالجتها في كل مرة. يقوم OpenClaw بتطبيع استخدام الموفّر إلى cacheRead وcacheWrite عندما تكشف API الصاعدة هذه العدّادات مباشرةً.
يمكن لواجهات الحالة أيضًا استعادة عدّادات cache من أحدث
سجل استخدام في transcript عندما تفتقدها اللقطة الحية للجلسة، بحيث يمكن لأمر /status أن يستمر
في إظهار سطر cache بعد فقدان جزئي لبيانات الجلسة الوصفية. وتظل
قيم cache الحية غير الصفرية الحالية ذات أولوية على قيم fallback المأخوذة من transcript.
أهمية ذلك: تكلفة رموز أقل، واستجابات أسرع، وأداء أكثر قابلية للتوقع للجلسات طويلة التشغيل. من دون caching، تدفع prompts المتكررة تكلفة prompt الكاملة في كل دور حتى عندما لا يتغير معظم الإدخال.
تغطي الأقسام أدناه كل عنصر تحكم متعلق بالـ cache يؤثر في إعادة استخدام prompt وتكلفة الرموز.
مراجع الموفّرين:
- Prompt caching في Anthropic: https://platform.claude.com/docs/en/build-with-claude/prompt-caching
- Prompt caching في OpenAI: https://developers.openai.com/api/docs/guides/prompt-caching
- ترويسات OpenAI API ومعرّفات الطلبات: https://developers.openai.com/api/reference/overview
- معرّفات الطلبات والأخطاء في Anthropic: https://platform.claude.com/docs/en/api/errors
عناصر التحكم الأساسية
cacheRetention (الافتراضي العام، والنموذج، ولكل وكيل)
اضبط الاحتفاظ بالـ cache كإعداد افتراضي عام لجميع النماذج:
agents:
defaults:
params:
cacheRetention: "long" # none | short | long
استبدله لكل نموذج:
agents:
defaults:
models:
"anthropic/claude-opus-4-6":
params:
cacheRetention: "short" # none | short | long
استبدال لكل وكيل:
agents:
list:
- id: "alerts"
params:
cacheRetention: "none"
ترتيب دمج الإعدادات:
agents.defaults.params(الإعداد الافتراضي العام — ينطبق على جميع النماذج)agents.defaults.models["provider/model"].params(استبدال لكل نموذج)agents.list[].params(معرّف الوكيل المطابق؛ يستبدل حسب المفتاح)
contextPruning.mode: "cache-ttl"
يُشذّب سياق نتائج الأدوات القديمة بعد نوافذ TTL الخاصة بالـ cache حتى لا تعيد الطلبات بعد الخمول تخزين سجل ضخم مؤقتًا من جديد.
agents:
defaults:
contextPruning:
mode: "cache-ttl"
ttl: "1h"
راجع تشذيب الجلسة للاطلاع على السلوك الكامل.
إبقاء Heartbeat دافئًا
يمكن لـ Heartbeat إبقاء نوافذ cache دافئة وتقليل عمليات كتابة cache المتكررة بعد فترات الخمول.
agents:
defaults:
heartbeat:
every: "55m"
Heartbeat لكل وكيل مدعوم في agents.list[].heartbeat.
سلوك الموفّر
Anthropic (API مباشر)
cacheRetentionمدعوم.- مع ملفات تعريف مصادقة مفتاح API الخاصة بـ Anthropic، يضبط OpenClaw القيمة الأولية
cacheRetention: "short"لمراجع نماذج Anthropic عندما لا تكون مضبوطة. - تكشف استجابات Messages الأصلية في Anthropic كلاً من
cache_read_input_tokensوcache_creation_input_tokens، لذا يمكن لـ OpenClaw عرض كل منcacheReadوcacheWrite. - بالنسبة إلى طلبات Anthropic الأصلية، فإن
cacheRetention: "short"تُطابق cache المؤقتة الافتراضية ذات الخمس دقائق، بينما تقومcacheRetention: "long"بالترقية إلى TTL لمدة ساعة واحدة فقط على مضيفيapi.anthropic.comالمباشرين.
OpenAI (API مباشر)
- Prompt caching تلقائي على النماذج الحديثة المدعومة. لا يحتاج OpenClaw إلى حقن مؤشرات cache على مستوى الكتل.
- يستخدم OpenClaw القيمة
prompt_cache_keyللحفاظ على استقرار توجيه cache عبر الأدوار، ويستخدمprompt_cache_retention: "24h"فقط عند اختيارcacheRetention: "long"على مضيفي OpenAI المباشرين. - تتلقى موفّرات OpenAI-compatible Completions القيمة
prompt_cache_keyفقط عندما يضبط إعداد النموذج لديها صراحةًcompat.supportsPromptCacheKey: true؛ وتظلcacheRetention: "none"تمنعها. - تكشف استجابات OpenAI عن رموز prompt المخزنة مؤقتًا عبر
usage.prompt_tokens_details.cached_tokens(أوinput_tokens_details.cached_tokensفي أحداث Responses API). ويحوّل OpenClaw ذلك إلىcacheRead. - لا تكشف OpenAI عن عدّاد منفصل لرموز كتابة cache، لذلك تبقى
cacheWriteمساوية لـ0على مسارات OpenAI حتى عندما يقوم الموفّر بتسخين cache. - تعيد OpenAI ترويسات مفيدة للتتبّع وحدود المعدل مثل
x-request-idوopenai-processing-msوx-ratelimit-*، لكن يجب أن تأتي محاسبة إصابات cache من حمولة الاستخدام، لا من الترويسات. - عمليًا، غالبًا ما تتصرف OpenAI كأنها cache لبادئة أولية بدلًا من إعادة استخدام كامل السجل المتحرك على طريقة Anthropic. يمكن أن تستقر الأدوار ذات النصوص الطويلة والثابتة قرب مستوى
4864من الرموز المخزنة مؤقتًا في الاختبارات الحية الحالية، بينما تستقر transcripts الثقيلة بالأدوات أو بأسلوب MCP غالبًا قرب4608رموز مخزنة مؤقتًا حتى مع التطابق التام في الإعادة.
Anthropic Vertex
- تدعم نماذج Anthropic على Vertex AI (
anthropic-vertex/*) القيمةcacheRetentionبالطريقة نفسها مثل Anthropic المباشر. - تقوم
cacheRetention: "long"بالمطابقة مع TTL حقيقي لمدة ساعة واحدة لـ prompt-cache على نقاط نهاية Vertex AI. - يطابق الاحتفاظ الافتراضي بالـ cache لـ
anthropic-vertexافتراضيات Anthropic المباشر. - تُوجَّه طلبات Vertex عبر تشكيل cache واعٍ بالحدود بحيث تظل إعادة الاستخدام متوافقة مع ما تتلقاه الموفّرات فعليًا.
Amazon Bedrock
- تدعم مراجع نماذج Anthropic Claude (
amazon-bedrock/*anthropic.claude*) تمريرcacheRetentionالصريح. - تُفرض على نماذج Bedrock غير التابعة لـ Anthropic القيمة
cacheRetention: "none"وقت التشغيل.
نماذج OpenRouter
بالنسبة إلى مراجع النماذج openrouter/anthropic/*، يقوم OpenClaw بحقن
cache_control الخاص بـ Anthropic في كتل prompt الخاصة بـ system/developer لتحسين إعادة استخدام prompt-cache
فقط عندما يظل الطلب يستهدف مسار OpenRouter متحققًا منه
(openrouter على نقطة نهايته الافتراضية، أو أي موفّر/عنوان أساس يُحل
إلى openrouter.ai).
وبالنسبة إلى مراجع النماذج openrouter/deepseek/* وopenrouter/moonshot*/* وopenrouter/zai/*،
فإن contextPruning.mode: "cache-ttl" مسموح به لأن OpenRouter
يتولى prompt caching على جانب الموفّر تلقائيًا. لا يقوم OpenClaw بحقن
مؤشرات cache_control الخاصة بـ Anthropic في هذه الطلبات.
يتم إنشاء cache في DeepSeek على أساس أفضل جهد وقد يستغرق بضع ثوانٍ. قد
تُظهر المتابعة الفورية القيمة cached_tokens: 0؛ تحقق من ذلك بطلب متكرر
له البادئة نفسها بعد تأخير قصير واستخدم usage.prompt_tokens_details.cached_tokens
كمؤشر على إصابة cache.
إذا أعدت توجيه النموذج إلى عنوان proxy عشوائي متوافق مع OpenAI، فسيتوقف OpenClaw عن حقن مؤشرات cache الخاصة بـ Anthropic والمخصصة لـ OpenRouter.
موفّرون آخرون
إذا لم يكن الموفّر يدعم وضع cache هذا، فلن يكون لـ cacheRetention أي تأثير.
Google Gemini direct API
- يبلغ النقل المباشر لـ Gemini (
api: "google-generative-ai") عن إصابات cache عبرcachedContentTokenCountالصاعد؛ ويحوّل OpenClaw ذلك إلىcacheRead. - عند ضبط
cacheRetentionعلى نموذج Gemini مباشر، يقوم OpenClaw تلقائيًا بإنشاء مواردcachedContentsوإعادة استخدامها وتحديثها لـ prompts الخاصة بالنظام على تشغيلات Google AI Studio. وهذا يعني أنك لم تعد بحاجة إلى إنشاء مقبض cached-content مسبقًا يدويًا. - ما يزال بإمكانك تمرير مقبض Gemini cached-content موجود مسبقًا
عبر
params.cachedContent(أو القديمparams.cached_content) على النموذج المضبوط. - هذا منفصل عن prompt-prefix caching في Anthropic/OpenAI. بالنسبة إلى Gemini،
يدير OpenClaw مورد
cachedContentsأصليًا خاصًا بالموفّر بدلًا من حقن مؤشرات cache داخل الطلب.
استخدام Gemini CLI JSON
- يمكن أن يُظهر خرج JSON الخاص بـ Gemini CLI أيضًا إصابات cache عبر
stats.cached؛ ويحوّل OpenClaw ذلك إلىcacheRead. - إذا حذف CLI قيمة
stats.inputالمباشرة، فإن OpenClaw يستنتج رموز الإدخال منstats.input_tokens - stats.cached. - هذا مجرد تطبيع للاستخدام. ولا يعني أن OpenClaw ينشئ مؤشرات prompt-cache بأسلوب Anthropic/OpenAI من أجل Gemini CLI.
حد cache الخاص بـ system-prompt
يقسم OpenClaw system prompt إلى بادئة ثابتة ولاحقة متقلبة
يفصل بينهما حد داخلي لبادئة cache. يتم ترتيب المحتوى فوق
الحد (تعريفات الأدوات، وبيانات Skills الوصفية، وملفات مساحة العمل، وغير ذلك من
السياق الثابت نسبيًا) بحيث يبقى مطابقًا على مستوى البايتات عبر الأدوار.
أما المحتوى أسفل الحد (مثل HEARTBEAT.md، والطوابع الزمنية لوقت التشغيل،
وغيرها من البيانات الوصفية لكل دور) فيُسمح له بالتغير من دون إبطال
البادئة المخزنة مؤقتًا.
خيارات التصميم الرئيسية:
- تُرتّب ملفات سياق المشروع الثابتة في مساحة العمل قبل
HEARTBEAT.mdبحيث لا يؤدي تغيّر Heartbeat إلى كسر البادئة الثابتة. - يُطبَّق الحد عبر تشكيل cache لعائلة Anthropic، وعائلة OpenAI، وGoogle، وCLI transport بحيث تستفيد كل الموفّرات المدعومة من استقرار البادئة نفسه.
- تُوجَّه طلبات Codex Responses وAnthropic Vertex عبر تشكيل cache واعٍ بالحدود بحيث تظل إعادة الاستخدام متوافقة مع ما تتلقاه الموفّرات فعليًا.
- تُطبَّع بصمات system-prompt (المسافات البيضاء، ونهايات الأسطر، والسياق المضاف عبر hooks، وترتيب إمكانات وقت التشغيل) بحيث تشترك prompts غير المتغيرة دلاليًا في KV/cache عبر الأدوار.
إذا رأيت ارتفاعات غير متوقعة في cacheWrite بعد تغيير في الإعدادات أو مساحة العمل،
فتحقق مما إذا كان التغيير يقع فوق حد cache أو تحته. إن نقل
المحتوى المتقلب إلى أسفل الحد (أو تثبيته) يحل المشكلة غالبًا.
وسائل الحماية لاستقرار cache في OpenClaw
يحافظ OpenClaw أيضًا على عدة أشكال من الحمولات الحساسة للـ cache بشكل حتمي قبل أن يصل الطلب إلى الموفّر:
- تُرتّب كتالوجات أدوات MCP المجمّعة ترتيبًا حتميًا قبل تسجيل
الأداة، بحيث لا يؤدي تغيّر ترتيب
listTools()إلى اضطراب كتلة الأدوات وكسر بادئات prompt-cache. - تحتفظ الجلسات القديمة التي تحتوي على كتل صور محفوظة بأحدث 3 أدوار مكتملة كما هي؛ وقد تُستبدل كتل الصور الأقدم التي تمت معالجتها بالفعل بعلامة حتى لا تستمر المتابعات الثقيلة بالصور في إعادة إرسال حمولات قديمة كبيرة.
أنماط الضبط
حركة مرور مختلطة (الافتراضي الموصى به)
احتفظ بخط أساس طويل الأمد على وكيلك الرئيسي، وعطّل caching على وكلاء الإشعارات المتقطعين:
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 الخاص بك فقط للوكلاء الذين يستفيدون من cache الدافئ.
تشخيصات cache
يكشف OpenClaw عن تشخيصات مخصصة لتتبّع cache لتشغيلات الوكيل المضمّنة.
وبالنسبة إلى التشخيصات العادية الموجهة للمستخدم، يمكن لأمر /status وملخصات الاستخدام الأخرى أن تستخدم
أحدث إدخال استخدام في transcript كمصدر fallback لـ cacheRead /
cacheWrite عندما لا يحتوي إدخال الجلسة الحية على تلك العدّادات.
اختبارات التراجع الحية
يحتفظ OpenClaw ببوابة تراجع حية موحدة واحدة لإعادة البادئات المتكررة، وأدوار الأدوات، وأدوار الصور، وtranscripts الأدوات بأسلوب MCP، وعنصر تحكم Anthropic بدون cache.
src/agents/live-cache-regression.live.test.tssrc/agents/live-cache-regression-baseline.ts
شغّل البوابة الحية الضيقة باستخدام:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache
يخزن ملف خط الأساس أحدث الأرقام الحية المرصودة بالإضافة إلى حدود التراجع الخاصة بكل موفّر التي يستخدمها الاختبار. كما يستخدم المشغّل معرّفات جلسات جديدة لكل تشغيل ومساحات أسماء prompts جديدة حتى لا تلوّث حالة cache السابقة عينة التراجع الحالية.
تتعمّد هذه الاختبارات عدم استخدام معايير نجاح متطابقة بين الموفّرين.
التوقعات الحية لـ Anthropic
- توقّع كتابات تسخين صريحة عبر
cacheWrite. - توقّع إعادة استخدام شبه كاملة للسجل في الأدوار المتكررة لأن عنصر التحكم بالـ cache في Anthropic يقدّم نقطة توقف cache خلال المحادثة.
- ما تزال التأكيدات الحية الحالية تستخدم حدودًا مرتفعة لمعدل الإصابة في المسارات الثابتة، ومسارات الأدوات، ومسارات الصور.
التوقعات الحية لـ OpenAI
- توقّع
cacheReadفقط. وتظلcacheWriteمساوية لـ0. - تعامل مع إعادة استخدام cache في الأدوار المتكررة على أنها مستوى استقرار خاص بالموفّر، لا على أنها إعادة استخدام كامل السجل المتحرك بأسلوب Anthropic.
- تستخدم التأكيدات الحية الحالية فحوصات دنيا متحفظة مشتقة من السلوك الحي المرصود على
gpt-5.4-mini:- بادئة ثابتة:
cacheRead >= 4608، ومعدل إصابة>= 0.90 - transcript الأدوات:
cacheRead >= 4096، ومعدل إصابة>= 0.85 - transcript الصور:
cacheRead >= 3840، ومعدل إصابة>= 0.82 - transcript بأسلوب MCP:
cacheRead >= 4096، ومعدل إصابة>= 0.85
- بادئة ثابتة:
وصل أحدث تحقق حي مجمّع في 2026-04-04 إلى:
- بادئة ثابتة:
cacheRead=4864، ومعدل إصابة0.966 - transcript الأدوات:
cacheRead=4608، ومعدل إصابة0.896 - transcript الصور:
cacheRead=4864، ومعدل إصابة0.954 - transcript بأسلوب MCP:
cacheRead=4608، ومعدل إصابة0.891
كان الزمن المحلي الأخير على ساعة الحائط للبوابة المجمّعة نحو 88s.
لماذا تختلف التأكيدات:
- يكشف Anthropic عن نقاط توقف cache صريحة وإعادة استخدام متحركة لسجل المحادثة.
- ما يزال Prompt caching في OpenAI حساسًا للبادئة المطابقة تمامًا، لكن البادئة القابلة لإعادة الاستخدام فعليًا في حركة Responses الحية قد تستقر عند نقطة أبكر من prompt الكامل.
- ولهذا السبب، فإن مقارنة 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.jsonlincludeMessages: trueincludePrompt: trueincludeSystem: true
مفاتيح Env (لتصحيح مؤقت)
OPENCLAW_CACHE_TRACE=1يفعّل تتبّع cache.OPENCLAW_CACHE_TRACE_FILE=/path/to/cache-trace.jsonlيستبدل مسار الإخراج.OPENCLAW_CACHE_TRACE_MESSAGES=0|1يبدّل التقاط حمولة الرسائل الكاملة.OPENCLAW_CACHE_TRACE_PROMPT=0|1يبدّل التقاط نص prompt.OPENCLAW_CACHE_TRACE_SYSTEM=0|1يبدّل التقاط system prompt.
ما الذي يجب فحصه
- أحداث تتبّع cache تكون بصيغة JSONL وتتضمن لقطات مرحلية مثل
session:loadedوprompt:beforeوstream:contextوsession:after. - يظهر أثر رموز cache لكل دور في واجهات الاستخدام العادية عبر
cacheReadوcacheWrite(مثل/usage fullوملخصات استخدام الجلسة). - بالنسبة إلى Anthropic، توقّع وجود كل من
cacheReadوcacheWriteعندما يكون caching نشطًا. - بالنسبة إلى OpenAI، توقّع
cacheReadعند إصابات cache وأن تبقىcacheWriteمساوية لـ0؛ إذ لا تنشر OpenAI حقلًا منفصلًا لرموز كتابة cache. - إذا كنت بحاجة إلى تتبّع الطلبات، فسجّل معرّفات الطلبات وترويسات حدود المعدل بشكل منفصل عن مقاييس cache. إن خرج تتبّع cache الحالي في OpenClaw يركز على شكل prompt/session واستخدام الرموز المطبّع بدلًا من ترويسات استجابات الموفّر الخام.
استكشاف الأعطال السريع
- ارتفاع
cacheWriteفي معظم الأدوار: تحقّق من مدخلات system-prompt المتقلبة وتأكد من أن النموذج/الموفّر يدعم إعدادات cache الخاصة بك. - ارتفاع
cacheWriteفي Anthropic: يعني غالبًا أن نقطة توقف cache تقع على محتوى يتغير مع كل طلب. - انخفاض
cacheReadفي OpenAI: تحقّق من أن البادئة الثابتة موجودة في البداية، وأن البادئة المتكررة لا تقل عن 1024 رمزًا، وأنه يعاد استخدامprompt_cache_keyنفسه في الأدوار التي ينبغي أن تشترك في cache. - عدم وجود تأثير لـ
cacheRetention: تأكد من أن مفتاح النموذج يطابقagents.defaults.models["provider/model"]. - طلبات Bedrock Nova/Mistral مع إعدادات cache: من المتوقع فرض القيمة
noneوقت التشغيل.
الوثائق ذات الصلة: