Technical reference
การแคชพรอมป์
Prompt caching หมายถึงผู้ให้บริการโมเดลสามารถนำ prefix ของ prompt ที่ไม่เปลี่ยนแปลงกลับมาใช้ซ้ำได้ (โดยปกติคือคำสั่ง system/developer และบริบทเสถียรอื่น ๆ) ข้าม turn แทนที่จะประมวลผลใหม่ทุกครั้ง OpenClaw ทำให้การใช้งานจากผู้ให้บริการเป็นรูปแบบเดียวกันเป็น cacheRead และ cacheWrite เมื่อ API ต้นทางเปิดเผยตัวนับเหล่านั้นโดยตรง
พื้นผิวสถานะยังสามารถกู้คืนตัวนับ cache จาก usage log ของ transcript ล่าสุด
เมื่อ snapshot ของ session สดไม่มีข้อมูลเหล่านั้นได้ เพื่อให้ /status ยัง
แสดงบรรทัด cache ต่อได้หลังจาก metadata ของ session บางส่วนสูญหาย ค่า cache สด
ที่ไม่เป็นศูนย์ซึ่งมีอยู่แล้วยังคงมีลำดับความสำคัญเหนือค่ fallback จาก transcript
เหตุผลที่สำคัญ: ค่า token ต่ำลง การตอบสนองเร็วขึ้น และประสิทธิภาพที่คาดการณ์ได้มากขึ้นสำหรับ session ที่ทำงานยาวนาน หากไม่มี caching prompt ที่ซ้ำจะเสียต้นทุน prompt เต็มทุก turn แม้ input ส่วนใหญ่จะไม่เปลี่ยนก็ตาม
ส่วนด้านล่างครอบคลุมปุ่มปรับทั้งหมดที่เกี่ยวกับ cache ซึ่งส่งผลต่อการนำ prompt กลับมาใช้ซ้ำและต้นทุน token
ข้อมูลอ้างอิงของผู้ให้บริการ:
- 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
- header ของ OpenAI API และ request ID: https://developers.openai.com/api/reference/overview
- request ID และข้อผิดพลาดของ Anthropic: https://platform.claude.com/docs/en/api/errors
ตัวปรับหลัก
cacheRetention (ค่าเริ่มต้น global, โมเดล, และต่อ agent)
ตั้งค่าการเก็บ cache เป็นค่าเริ่มต้น global สำหรับทุกโมเดล:
agents: defaults: params: cacheRetention: "long" # none | short | longoverride ต่อโมเดล:
agents: defaults: models: "anthropic/claude-opus-4-6": params: cacheRetention: "short" # none | short | longoverride ต่อ agent:
agents: list: - id: "alerts" params: cacheRetention: "none"ลำดับการ merge config:
agents.defaults.params(ค่าเริ่มต้น global — ใช้กับทุกโมเดล)agents.defaults.models["provider/model"].params(override ต่อโมเดล)agents.list[].params(id ของ agent ที่ตรงกัน; override ตาม key)
contextPruning.mode: "cache-ttl"
ตัดบริบทผลลัพธ์เครื่องมือเก่าหลังหน้าต่าง TTL ของ cache เพื่อให้คำขอหลัง idle ไม่ต้อง re-cache ประวัติที่ใหญ่เกินไป
agents: defaults: contextPruning: mode: "cache-ttl" ttl: "1h"ดูพฤติกรรมฉบับเต็มได้ที่ การตัด Session
ทำให้ Heartbeat อุ่นอยู่เสมอ
Heartbeat สามารถทำให้หน้าต่าง cache อุ่นอยู่เสมอและลดการเขียน cache ซ้ำหลังช่วง idle ได้
agents: defaults: heartbeat: every: "55m"รองรับ heartbeat ต่อ agent ที่ agents.list[].heartbeat
พฤติกรรมของผู้ให้บริการ
Anthropic (API โดยตรง)
- รองรับ
cacheRetention - ด้วย profile การยืนยันตัวตนแบบ API key ของ Anthropic, OpenClaw จะ seed
cacheRetention: "short"สำหรับ ref โมเดล Anthropic เมื่อไม่ได้ตั้งค่า - response ของ Anthropic Messages แบบ native เปิดเผยทั้ง
cache_read_input_tokensและcache_creation_input_tokensดังนั้น OpenClaw จึงแสดงได้ทั้งcacheReadและcacheWrite - สำหรับคำขอ Anthropic แบบ native,
cacheRetention: "short"map ไปยัง ephemeral cache ค่าเริ่มต้น 5 นาที และcacheRetention: "long"อัปเกรดเป็น TTL 1 ชั่วโมงเฉพาะบน host โดยตรงของapi.anthropic.com
OpenAI (API โดยตรง)
- Prompt caching เป็นอัตโนมัติบนโมเดลรุ่นใหม่ที่รองรับ OpenClaw ไม่จำเป็นต้อง inject marker cache ระดับ block
- OpenClaw ใช้
prompt_cache_keyเพื่อให้การ route cache เสถียรข้าม turn host โดยตรงของ OpenAI ใช้prompt_cache_retention: "24h"เมื่อเลือกcacheRetention: "long" - ผู้ให้บริการ Completions ที่เข้ากันได้กับ OpenAI จะได้รับ
prompt_cache_keyเฉพาะเมื่อ config โมเดลของตนตั้งค่าcompat.supportsPromptCacheKey: trueอย่างชัดเจน การ forward การเก็บรักษาระยะยาวเป็น capability แยกต่างหาก:cacheRetention: "long"ที่ระบุชัดเจนจะส่งprompt_cache_retention: "24h"เฉพาะเมื่อ entry ของ compat นั้นรองรับการเก็บ cache ระยะยาวด้วย ผู้ให้บริการเช่น Mistral สามารถเลือกใช้ cache key ขณะตั้งค่าcompat.supportsLongCacheRetention: falseเพื่อระงับ field การเก็บรักษาระยะยาวcacheRetention: "none"จะระงับทั้งสอง field - response ของ OpenAI เปิดเผย token ของ prompt ที่ถูก cache ผ่าน
usage.prompt_tokens_details.cached_tokens(หรือinput_tokens_details.cached_tokensบน event ของ Responses API) OpenClaw map ค่านั้นเป็นcacheRead - usage ของ GPT-5.6 Responses ยังสามารถเปิดเผย
input_tokens_details.cache_write_tokensได้ OpenClaw map ค่านั้นเป็นcacheWriteและคิดราคาตามอัตรา cache-write ของโมเดล; Responses ที่ไม่ใส่ field นี้จะคงcacheWriteไว้ที่0 - OpenAI ส่งคืน header ที่มีประโยชน์สำหรับ tracing และ rate limit เช่น
x-request-id,openai-processing-ms, และx-ratelimit-*แต่การนับ cache hit ควรมาจาก payload ของ usage ไม่ใช่จาก header - ในทางปฏิบัติ OpenAI มักทำงานเหมือน cache ของ prefix เริ่มต้นมากกว่าการ reuse ประวัติเต็มแบบเคลื่อนที่สไตล์ Anthropic turn ที่มีข้อความ prefix ยาวและเสถียรสามารถไปอยู่ใกล้ plateau ที่
4864cached-token ใน probe สดปัจจุบัน ขณะที่ transcript ที่ใช้เครื่องมือหนักหรือสไตล์ MCP มัก plateau ใกล้4608cached token แม้จะทำซ้ำตรงกันทุกประการ
Anthropic Vertex
- โมเดล Anthropic บน Vertex AI (
anthropic-vertex/*) รองรับcacheRetentionแบบเดียวกับ Anthropic โดยตรง cacheRetention: "long"map ไปยัง TTL prompt-cache จริง 1 ชั่วโมงบน endpoint ของ Vertex AI- ค่าเริ่มต้นการเก็บ cache สำหรับ
anthropic-vertexตรงกับค่าเริ่มต้นของ Anthropic โดยตรง - คำขอ Vertex ถูก route ผ่านการจัดรูป cache ที่รู้ขอบเขต เพื่อให้การ reuse cache สอดคล้องกับสิ่งที่ผู้ให้บริการได้รับจริง
Amazon Bedrock
- ref โมเดล Anthropic Claude (
amazon-bedrock/*anthropic.claude*) รองรับการ pass-throughcacheRetentionที่ระบุชัดเจน - โมเดล Bedrock ที่ไม่ใช่ Anthropic จะถูกบังคับเป็น
cacheRetention: "none"ตอน runtime
โมเดล OpenRouter
สำหรับ ref โมเดล openrouter/anthropic/*, OpenClaw inject
cache_control บน block ของ prompt system/developer เพื่อปรับปรุงการ reuse
prompt-cache เฉพาะเมื่อคำขอยังคงกำหนดเป้าหมายไปยัง route OpenRouter ที่ตรวจสอบแล้ว
(openrouter บน endpoint ค่าเริ่มต้นของมัน หรือ provider/base URL ใด ๆ ที่ resolve
เป็น openrouter.ai)
สำหรับ ref โมเดล openrouter/deepseek/*, openrouter/moonshot*/*, และ openrouter/zai/*,
อนุญาตให้ใช้ contextPruning.mode: "cache-ttl" เพราะ OpenRouter
จัดการ prompt caching ฝั่งผู้ให้บริการโดยอัตโนมัติ OpenClaw ไม่ inject
marker cache_control ของ Anthropic เข้าไปในคำขอเหล่านั้น
การสร้าง cache ของ DeepSeek เป็นแบบ best-effort และอาจใช้เวลาสองสามวินาที
การ follow-up ทันทีอาจยังแสดง cached_tokens: 0; ตรวจสอบด้วยคำขอ
prefix เดิมซ้ำหลังรอสั้น ๆ และใช้ usage.prompt_tokens_details.cached_tokens
เป็นสัญญาณ cache-hit
หากคุณชี้โมเดลไปยัง URL proxy ที่เข้ากันได้กับ OpenAI แบบใดก็ได้ OpenClaw จะหยุด inject marker cache ของ Anthropic เฉพาะ OpenRouter เหล่านั้น
ผู้ให้บริการอื่น
หากผู้ให้บริการไม่รองรับโหมด cache นี้ cacheRetention จะไม่มีผล
Google Gemini direct API
- transport Gemini โดยตรง (
api: "google-generative-ai") รายงาน cache hit ผ่านcachedContentTokenCountจากต้นทาง; OpenClaw map ค่านั้นเป็นcacheRead - เมื่อมีการตั้ง
cacheRetentionบนโมเดล Gemini โดยตรง OpenClaw จะสร้าง reuse และ refresh resourcecachedContentsสำหรับ system prompt บนการรัน Google AI Studio โดยอัตโนมัติ ซึ่งหมายความว่าคุณไม่จำเป็นต้องสร้าง handle cached-content ไว้ล่วงหน้าด้วยตนเองอีกต่อไป - คุณยังสามารถส่ง handle cached-content ของ Gemini ที่มีอยู่แล้วผ่านเป็น
params.cachedContent(หรือ legacyparams.cached_content) บนโมเดล ที่กำหนดค่าไว้ได้ - สิ่งนี้แยกจาก prompt-prefix caching ของ Anthropic/OpenAI สำหรับ Gemini,
OpenClaw จัดการ resource
cachedContentsแบบ native ของผู้ให้บริการ แทนที่จะ inject marker cache เข้าไปในคำขอ
การใช้งาน Gemini CLI
- output
stream-jsonของ Gemini CLI สามารถแสดง cache hit ผ่านstats.cached; OpenClaw map ค่านั้นเป็นcacheReadoverride legacy--output-format jsonใช้ การ normalize usage เดียวกัน - หาก CLI ไม่ใส่ค่า
stats.inputโดยตรง OpenClaw จะคำนวณ token input จากstats.input_tokens - stats.cached - นี่เป็นเพียงการ normalize usage เท่านั้น ไม่ได้หมายความว่า OpenClaw กำลังสร้าง marker prompt-cache สไตล์ Anthropic/OpenAI สำหรับ Gemini CLI
ขอบเขต cache ของ system-prompt
OpenClaw แยก system prompt ออกเป็น prefix เสถียร และ suffix ผันผวน
คั่นด้วยขอบเขต cache-prefix ภายใน เนื้อหาเหนือขอบเขต
(นิยามเครื่องมือ, metadata ของ Skills, ไฟล์ workspace, และบริบทอื่น ๆ
ที่ค่อนข้างคงที่) ถูกจัดลำดับเพื่อให้ byte-identical ข้าม turn
เนื้อหาใต้ขอบเขต (เช่น HEARTBEAT.md, timestamp runtime, และ
metadata ต่อ turn อื่น ๆ) สามารถเปลี่ยนได้โดยไม่ทำให้ prefix ที่ cache ไว้
ใช้งานไม่ได้
ตัวเลือกการออกแบบสำคัญ:
- ไฟล์ project-context ของ workspace ที่เสถียรถูกจัดลำดับก่อน
HEARTBEAT.mdเพื่อให้ churn ของ heartbeat ไม่ทำลาย prefix ที่เสถียร - ขอบเขตนี้ถูกใช้กับการจัดรูป transport ตระกูล Anthropic, ตระกูล OpenAI, Google, และ CLI เพื่อให้ผู้ให้บริการที่รองรับทั้งหมดได้ประโยชน์จากความเสถียรของ prefix เดียวกัน
- คำขอ Codex Responses และ Anthropic Vertex ถูก route ผ่าน การจัดรูป cache ที่รู้ขอบเขต เพื่อให้การ reuse cache สอดคล้องกับสิ่งที่ผู้ให้บริการ ได้รับจริง
- fingerprint ของ system-prompt ถูก normalize (ช่องว่าง, line ending, บริบทที่ hook เพิ่ม, การจัดลำดับ capability ของ runtime) เพื่อให้ prompt ที่ไม่เปลี่ยนในเชิงความหมายใช้ KV/cache ร่วมกันข้าม turn
หากคุณเห็น spike ของ cacheWrite ที่ไม่คาดคิดหลังเปลี่ยน config หรือ workspace
ให้ตรวจสอบว่าการเปลี่ยนนั้นอยู่เหนือหรือใต้ขอบเขต cache การย้าย
เนื้อหาที่ผันผวนลงใต้ขอบเขต (หรือทำให้มันเสถียร) มักแก้ปัญหาได้
guard ความเสถียรของ cache ใน OpenClaw
OpenClaw ยังทำให้รูป payload หลายรายการที่อ่อนไหวต่อ cache deterministic ก่อน คำขอจะไปถึงผู้ให้บริการ:
- catalog เครื่องมือ MCP ของ bundle ถูก sort แบบ deterministic ก่อนการ
ลงทะเบียนเครื่องมือ ดังนั้นการเปลี่ยนลำดับ
listTools()จะไม่ทำให้ block เครื่องมือ churn และ ไม่ทำลาย prefix ของ prompt-cache - session legacy ที่มี block รูปภาพคงอยู่จะรักษา 3 turn ที่เสร็จสมบูรณ์ล่าสุด ไว้ครบถ้วน; block รูปภาพเก่าที่ประมวลผลแล้วอาจถูกแทนที่ด้วย marker เพื่อให้ follow-up ที่มีรูปภาพจำนวนมากไม่ต้องส่ง payload เก่าขนาดใหญ่ซ้ำต่อไป
รูปแบบการปรับแต่ง
traffic ผสม (ค่าเริ่มต้นที่แนะนำ)
รักษา baseline อายุยาวไว้บน agent หลักของคุณ ปิด caching บน agent แจ้งเตือนที่ bursty:
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"baseline เน้นต้นทุน
- ตั้ง baseline
cacheRetention: "short" - เปิดใช้
contextPruning.mode: "cache-ttl" - ให้ heartbeat ต่ำกว่า TTL ของคุณเฉพาะสำหรับ agent ที่ได้ประโยชน์จาก cache อุ่น
การวินิจฉัย cache
OpenClaw เปิดเผยการวินิจฉัย cache-trace เฉพาะสำหรับการรัน agent แบบ embedded
สำหรับการวินิจฉัยที่ผู้ใช้ทั่วไปเห็นได้ /status และสรุป usage อื่น ๆ สามารถใช้
entry usage ของ transcript ล่าสุดเป็นแหล่ง fallback สำหรับ cacheRead /
cacheWrite เมื่อ entry ของ session สดไม่มีตัวนับเหล่านั้น
การทดสอบ regression สด
OpenClaw มี gate regression cache สดแบบรวมหนึ่งชุดสำหรับ prefix ที่ซ้ำ, turn เครื่องมือ, turn รูปภาพ, transcript เครื่องมือสไตล์ MCP, และ control แบบ no-cache ของ Anthropic
src/agents/live-cache-regression.live.test.tssrc/agents/live-cache-regression-baseline.ts
รัน gate สดแบบแคบด้วย:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cacheไฟล์ baseline เก็บตัวเลข live ล่าสุดที่สังเกตได้ รวมถึง regression floor เฉพาะผู้ให้บริการที่การทดสอบใช้ runner ยังใช้ ID เซสชันและ namespace ของพรอมป์แบบใหม่สำหรับแต่ละรัน เพื่อให้สถานะแคชก่อนหน้าไม่ปนเปื้อนตัวอย่าง regression ปัจจุบัน
การทดสอบเหล่านี้ตั้งใจไม่ใช้เกณฑ์ความสำเร็จที่เหมือนกันทุกประการระหว่างผู้ให้บริการ
ความคาดหวัง live สำหรับ Anthropic
- คาดว่าจะมีการเขียน warmup อย่างชัดเจนผ่าน
cacheWrite - คาดว่าจะนำประวัติเกือบทั้งหมดกลับมาใช้ซ้ำในเทิร์นที่ซ้ำกัน เพราะการควบคุมแคชของ Anthropic จะเลื่อนจุดแบ่งแคชไปตามบทสนทนา
- assertion live ปัจจุบันยังใช้เกณฑ์อัตรา hit สูงสำหรับเส้นทาง stable, tool และ image
ความคาดหวัง live สำหรับ OpenAI
- คาดว่าจะมีเฉพาะ
cacheReadส่วนcacheWriteยังคงเป็น0 - ให้ถือว่าการนำแคชกลับมาใช้ซ้ำในเทิร์นที่ซ้ำกันเป็น plateau เฉพาะผู้ให้บริการ ไม่ใช่การนำประวัติเต็มรูปแบบที่เลื่อนไปเรื่อย ๆ แบบ Anthropic
- assertion live ปัจจุบันใช้การตรวจสอบ floor แบบอนุรักษ์นิยมที่ได้มาจากพฤติกรรม live ที่สังเกตบน
gpt-5.4-mini:- stable prefix:
cacheRead >= 4608, อัตรา hit>= 0.90 - tool transcript:
cacheRead >= 4096, อัตรา hit>= 0.85 - image transcript:
cacheRead >= 3840, อัตรา hit>= 0.82 - MCP-style transcript:
cacheRead >= 4096, อัตรา hit>= 0.85
- stable prefix:
การตรวจสอบ live แบบรวมล่าสุดเมื่อ 2026-04-04 ได้ผลดังนี้:
- stable prefix:
cacheRead=4864, อัตรา hit0.966 - tool transcript:
cacheRead=4608, อัตรา hit0.896 - image transcript:
cacheRead=4864, อัตรา hit0.954 - MCP-style transcript:
cacheRead=4608, อัตรา hit0.891
เวลา wall-clock ล่าสุดในเครื่องสำหรับ gate แบบรวมอยู่ที่ประมาณ 88s
เหตุผลที่ assertion แตกต่างกัน:
- Anthropic เปิดเผยจุดแบ่งแคชอย่างชัดเจนและการนำประวัติบทสนทนาที่เลื่อนไปเรื่อย ๆ กลับมาใช้ซ้ำ
- การแคชพรอมป์ของ OpenAI ยังอ่อนไหวต่อ exact-prefix แต่ prefix ที่นำกลับมาใช้ซ้ำได้จริงในทราฟฟิก Responses แบบ live อาจ plateau ก่อนถึงพรอมป์เต็ม
- ด้วยเหตุนี้ การเปรียบเทียบ Anthropic และ OpenAI ด้วยเกณฑ์เปอร์เซ็นต์เดียวข้ามผู้ให้บริการจึงสร้าง regression เทียม
การตั้งค่า diagnostics.cacheTrace
diagnostics: cacheTrace: enabled: true filePath: "~/.openclaw/logs/cache-trace.jsonl" # optional includeMessages: false # default true includePrompt: false # default true includeSystem: false # default trueค่าเริ่มต้น:
filePath:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonlincludeMessages:trueincludePrompt:trueincludeSystem:true
toggle ของ env (การดีบักแบบครั้งเดียว)
OPENCLAW_CACHE_TRACE=1เปิดใช้การติดตามแคชOPENCLAW_CACHE_TRACE_FILE=/path/to/cache-trace.jsonlแทนที่พาธเอาต์พุตOPENCLAW_CACHE_TRACE_MESSAGES=0|1สลับการจับ payload ข้อความแบบเต็มOPENCLAW_CACHE_TRACE_PROMPT=0|1สลับการจับข้อความพรอมป์OPENCLAW_CACHE_TRACE_SYSTEM=0|1สลับการจับ system prompt
สิ่งที่ควรตรวจสอบ
- เหตุการณ์ cache trace เป็น JSONL และมี snapshot ตามขั้น เช่น
session:loaded,prompt:before,stream:contextและsession:after - ผลกระทบของโทเค็นแคชต่อเทิร์นมองเห็นได้ในพื้นผิวการใช้งานปกติผ่าน
cacheReadและcacheWrite(เช่น/usage tokens,/status, สรุปการใช้งานเซสชัน และเลย์เอาต์messages.usageTemplateแบบกำหนดเอง) - สำหรับ Anthropic ให้คาดว่าจะมีทั้ง
cacheReadและcacheWriteเมื่อการแคชทำงานอยู่ - สำหรับ OpenAI ให้คาดว่าจะมี
cacheReadเมื่อ cache hit นอกจากนี้ GPT-5.6 Responses ยังสามารถรายงานcacheWriteขณะเขียนส่วนของพรอมป์ได้ ส่วน payload ของ Responses อื่นที่ละเว้นตัวนับการเขียนจะคงค่าไว้ที่0 - หากคุณต้องการการติดตามคำขอ ให้บันทึก ID คำขอและ header ของ rate-limit แยกจากเมตริกแคช เอาต์พุต cache-trace ปัจจุบันของ OpenClaw มุ่งเน้นที่รูปทรงของพรอมป์/เซสชันและการใช้โทเค็นที่ทำให้เป็นมาตรฐานแล้ว มากกว่า header การตอบกลับดิบจากผู้ให้บริการ
การแก้ปัญหาอย่างรวดเร็ว
cacheWriteสูงในเทิร์นส่วนใหญ่: ตรวจสอบอินพุต system-prompt ที่เปลี่ยนแปลงบ่อย และยืนยันว่าโมเดล/ผู้ให้บริการรองรับการตั้งค่าแคชของคุณcacheWriteสูงบน Anthropic: มักหมายความว่าจุดแบ่งแคชไปตกบนเนื้อหาที่เปลี่ยนทุกคำขอcacheReadต่ำบน OpenAI: ยืนยันว่า stable prefix อยู่ด้านหน้า, repeated prefix มีอย่างน้อย 1024 โทเค็น และมีการนำprompt_cache_keyเดิมกลับมาใช้ซ้ำสำหรับเทิร์นที่ควรแชร์แคชcacheRetentionไม่มีผล: ยืนยันว่า key ของโมเดลตรงกับagents.defaults.models["provider/model"]- คำขอ Bedrock Nova/Mistral ที่มีการตั้งค่าแคช: คาดว่ารันไทม์จะบังคับเป็น
none
เอกสารที่เกี่ยวข้อง: