---
read_when:
    - คุณต้องการลดค่าใช้จ่ายด้านโทเค็นของพรอมต์ด้วยการเก็บรักษาแคช
    - คุณต้องกำหนดลักษณะการทำงานของแคชแยกตามเอเจนต์ในการตั้งค่าแบบหลายเอเจนต์
    - คุณกำลังปรับแต่ง Heartbeat และการล้างข้อมูลตาม TTL ของแคชร่วมกัน
summary: ตัวเลือกการแคชพรอมต์ ลำดับการผสาน พฤติกรรมของผู้ให้บริการ และรูปแบบการปรับแต่ง
title: การแคชพรอมต์
x-i18n:
    generated_at: "2026-07-21T15:49:34Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: a9201ebc262f00311a512788e8aa2bf2091b6f31ad160b54925cceb2b74c7155
    source_path: reference/prompt-caching.md
    workflow: 16
---

การแคชพรอมต์ช่วยให้ผู้ให้บริการโมเดลนำคำนำหน้าพรอมต์ที่ไม่เปลี่ยนแปลง (คำสั่งระดับระบบ/นักพัฒนา นิยามเครื่องมือ และบริบทคงที่อื่นๆ) กลับมาใช้ข้ามเทิร์นได้ แทนที่จะประมวลผลใหม่ทุกคำขอ ซึ่งช่วยลดค่าใช้จ่ายด้านโทเค็นและเวลาแฝงสำหรับเซสชันที่ทำงานเป็นเวลานานและมีบริบทซ้ำกัน

OpenClaw ปรับการใช้งานจากผู้ให้บริการให้อยู่ในรูปแบบ `cacheRead` และ `cacheWrite` ทุกแห่งที่ API ต้นทางเปิดเผยตัวนับเหล่านั้น ข้อมูลสรุปการใช้งาน (`/status` และรายการที่คล้ายกัน) จะใช้รายการการใช้งานล่าสุดในทรานสคริปต์เป็นค่าทดแทนเมื่อสแนปชอตเซสชันสดไม่มีตัวนับแคช โดยค่าจากข้อมูลสดที่ไม่เป็นศูนย์จะมีลำดับความสำคัญเหนือค่าทดแทนเสมอ

เอกสารอ้างอิงของผู้ให้บริการ:

- [การแคชพรอมต์ของ Anthropic](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)
- [การแคชพรอมต์ของ OpenAI](https://developers.openai.com/api/docs/guides/prompt-caching)

## ตัวควบคุมหลัก

### `cacheRetention`

ค่า: `"none" | "short" | "long"` กำหนดค่าได้ทั้งเป็นค่าเริ่มต้นส่วนกลาง แยกตามโมเดล และแยกตามเอเจนต์
`"standard"` ไม่ใช่นามแฝง ให้ใช้ `"short"` สำหรับช่วงเวลาการแคชเริ่มต้นของผู้ให้บริการ ค่าที่ไม่ถูกต้องจะถูกละเว้นพร้อมคำเตือน

```yaml
agents:
  defaults:
    params:
      cacheRetention: "long" # none | short | long
    models:
      "anthropic/claude-opus-4-6":
        params:
          cacheRetention: "short" # overrides the global default for this model
  list:
    - id: "alerts"
      params:
        cacheRetention: "none" # overrides both defaults for this agent
```

ลำดับการผสาน (ค่าที่มาทีหลังมีผล):

1. `agents.defaults.params` - ค่าเริ่มต้นส่วนกลางสำหรับทุกโมเดล
2. `agents.defaults.models["provider/model"].params` - ค่าแทนที่แยกตามโมเดล
3. `agents.list[].params` - ค่าแทนที่แยกตามเอเจนต์ โดยจับคู่ตามรหัสเอเจนต์

แหล่งที่มา: `src/agents/embedded-agent-runner/extra-params.ts` (`resolveExtraParams`)

### `contextPruning.mode: "cache-ttl"`

ตัดบริบทผลลัพธ์จากเครื่องมือที่เก่าออกหลังจากพ้นช่วง TTL ของแคช เพื่อไม่ให้คำขอหลังจากไม่มีการใช้งานต้องแคชประวัติขนาดใหญ่เกินไปซ้ำอีก

```yaml
agents:
  defaults:
    contextPruning:
      mode: "cache-ttl"
      ttl: "1h"
```

ดูพฤติกรรมทั้งหมดได้ที่ [การตัดเซสชัน](/th/concepts/session-pruning)

### การรักษาแคชให้อุ่นด้วย Heartbeat

Heartbeat สามารถรักษาช่วงเวลาของแคชให้อุ่นอยู่เสมอ และลดการเขียนแคชซ้ำหลังจากเว้นช่วงโดยไม่มีการใช้งาน กำหนดค่าได้ทั้งแบบส่วนกลาง (`agents.defaults.heartbeat`) หรือแยกตามเอเจนต์ (`agents.list[].heartbeat`)

```yaml
agents:
  defaults:
    heartbeat:
      every: "55m"
```

## พฤติกรรมของผู้ให้บริการ

### Anthropic (API โดยตรงและ Vertex AI)

- รองรับ `cacheRetention` สำหรับผู้ให้บริการ `anthropic` และ `anthropic-vertex` รวมถึงโมเดล Claude บน `amazon-bedrock` และปลายทางแบบกำหนดเองที่เข้ากันได้กับ `anthropic-messages` เมื่อกำหนด `cacheRetention` ไว้อย่างชัดเจน
- เมื่อไม่ได้กำหนดค่า OpenClaw จะตั้งค่าเริ่มต้น `cacheRetention: "short"` สำหรับ Anthropic โดยตรง (เฉพาะผู้ให้บริการ `anthropic` และ `anthropic-vertex` เท่านั้น เส้นทางอื่นในตระกูล Anthropic ต้องระบุค่าอย่างชัดเจน)
- การตอบกลับแบบ Anthropic Messages ดั้งเดิมเปิดเผย `cache_read_input_tokens` และ `cache_creation_input_tokens` ซึ่งแมปไปยัง `cacheRead` และ `cacheWrite`
- `cacheRetention: "short"` แมปไปยังแคชชั่วคราวเริ่มต้น 5 นาที ส่วน `cacheRetention: "long"` จะขอ TTL 1 ชั่วโมง (`cache_control: { type: "ephemeral", ttl: "1h" }`) เมื่อกำหนดไว้อย่างชัดเจน การเก็บรักษาระยะยาวแบบโดยนัย/ขับเคลื่อนด้วยสภาพแวดล้อม (`OPENCLAW_CACHE_RETENTION=long` โดยไม่มี `cacheRetention` ที่กำหนดไว้อย่างชัดเจน) จะอัปเกรดเป็น TTL 1 ชั่วโมงเฉพาะบนโฮสต์ `api.anthropic.com` หรือ Vertex AI (`aiplatform.googleapis.com` / `*-aiplatform.googleapis.com`) เท่านั้น ส่วนโฮสต์อื่นจะใช้แคช 5 นาทีต่อไป

แหล่งที่มา: `packages/ai/src/transports/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` ซึ่งเป็นจริงโดยค่าเริ่มต้น ส่วนโปรไฟล์ความเข้ากันได้ของ 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 แบบสด](#openai-live-expectations) ด้านล่าง

### Amazon Bedrock

- การอ้างอิงโมเดล Anthropic Claude (`amazon-bedrock/*anthropic.claude*` รวมถึงคำนำหน้าโปรไฟล์การอนุมานระบบของ AWS ได้แก่ `us.`/`eu.`/`global.anthropic.claude*`) รองรับการส่งผ่าน `cacheRetention` อย่างชัดเจน
- โมเดล Bedrock ที่ไม่ใช่ Anthropic (เช่น `amazon.nova-*`) จะถูกแก้ไขเป็นไม่มีการเก็บรักษาแคชขณะรันไทม์ ไม่ว่าจะกำหนดค่า `cacheRetention` ไว้เป็นค่าใดก็ตาม
- ARN ของโปรไฟล์การอนุมานแอปพลิเคชัน Bedrock แบบทึบ (รหัสโปรไฟล์ที่ไม่มี `claude`) จะถูกแก้ไขเป็นไม่มีการเก็บรักษาแคชเช่นกัน เว้นแต่จะกำหนด `cacheRetention` ไว้อย่างชัดเจน เนื่องจากไม่สามารถอนุมานตระกูลโมเดลจาก ARN เพียงอย่างเดียวได้

### OpenRouter

สำหรับการอ้างอิงโมเดล `openrouter/anthropic/*` OpenClaw จะแทรกเครื่องหมาย `cache_control` ของ Anthropic ในบล็อกพรอมต์ระดับระบบ/นักพัฒนา แต่เฉพาะเมื่อคำขอยังคงมุ่งไปยังเส้นทาง OpenRouter ที่ผ่านการตรวจสอบแล้ว (`openrouter` บนปลายทางเริ่มต้น หรือผู้ให้บริการ/URL ฐานใดๆ ที่แก้ไขไปยัง `openrouter.ai`) การเปลี่ยนให้โมเดลชี้ไปยัง URL พร็อกซีที่เข้ากันได้กับ 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` สำหรับพรอมต์ระบบโดยอัตโนมัติ โดยไม่ต้องใช้แฮนเดิลเนื้อหาที่แคชด้วยตนเอง TTL คือ `300s` สำหรับ `cacheRetention: "short"` และ `3600s` สำหรับ `"long"`
- ยังคงสามารถส่งแฮนเดิลเนื้อหาที่แคชไว้ล่วงหน้าของ 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` นี่เป็นเพียงการปรับข้อมูลการใช้งานให้เป็นรูปแบบมาตรฐาน และไม่ได้สร้างเครื่องหมายแคชพรอมต์แบบ Anthropic/OpenAI สำหรับโมเดลที่ขับเคลื่อนผ่าน CLI เหล่านี้

แหล่งที่มา: `src/agents/cli-output.ts` (`toCliUsage`)

### ผู้ให้บริการอื่น

หากผู้ให้บริการไม่รองรับโหมดแคชใดๆ ข้างต้น `cacheRetention` จะไม่มีผล

## ขอบเขตแคชของพรอมต์ระบบ

OpenClaw แบ่งพรอมต์ระบบออกเป็น **คำนำหน้าคงที่** และ **คำต่อท้ายที่เปลี่ยนแปลงได้** ณ ขอบเขตคำนำหน้าแคชภายใน เนื้อหาเหนือขอบเขต (นิยามเครื่องมือ เมทาดาทา Skills และไฟล์เวิร์กสเปซ) จะถูกจัดลำดับให้คงความเหมือนกันทุกไบต์ข้ามเทิร์น เนื้อหาใต้ขอบเขต (เช่น `HEARTBEAT.md` การประทับเวลารันไทม์ และเมทาดาทาอื่นที่แตกต่างในแต่ละเทิร์น) สามารถเปลี่ยนแปลงได้โดยไม่ทำให้คำนำหน้าที่แคชไว้ใช้ไม่ได้

ตัวเลือกการออกแบบที่สำคัญ:

- ไฟล์บริบทโปรเจกต์ในเวิร์กสเปซที่คงที่จะถูกจัดลำดับไว้ก่อน `HEARTBEAT.md` เพื่อไม่ให้การเปลี่ยนแปลงของ Heartbeat ทำลายคำนำหน้าคงที่
- ขอบเขตนี้ใช้กับการจัดรูปแบบการส่งข้อมูลในตระกูล Anthropic, ตระกูล OpenAI, Google และ CLI เพื่อให้ผู้ให้บริการที่รองรับทั้งหมดได้รับประโยชน์จากความคงที่ของคำนำหน้าแบบเดียวกัน
- คำขอ Codex Responses และ Anthropic Vertex ถูกกำหนดเส้นทางผ่านการจัดรูปแบบแคชที่รับรู้ขอบเขต เพื่อให้การนำแคชกลับมาใช้สอดคล้องกับข้อมูลที่ผู้ให้บริการได้รับจริง
- ลายนิ้วมือของพรอมต์ระบบถูกปรับให้อยู่ในรูปแบบมาตรฐาน (ช่องว่าง อักขระขึ้นบรรทัดใหม่ บริบทที่เพิ่มโดยฮุก และลำดับความสามารถของรันไทม์) เพื่อให้พรอมต์ที่ไม่มีการเปลี่ยนแปลงด้านความหมายใช้แคชร่วมกันข้ามเทิร์นได้

หากพบการพุ่งสูงของ `cacheWrite` โดยไม่คาดคิดหลังจากเปลี่ยนการกำหนดค่าหรือเวิร์กสเปซ ให้ตรวจสอบว่าการเปลี่ยนแปลงนั้นอยู่เหนือหรือใต้ขอบเขตแคช การย้ายเนื้อหาที่เปลี่ยนแปลงได้ไปไว้ใต้ขอบเขต (หรือทำให้เนื้อหานั้นคงที่) มักแก้ปัญหาได้

## กลไกป้องกันความคงที่ของแคชใน OpenClaw

- แค็ตตาล็อกเครื่องมือ MCP ที่รวมมาในชุดจะถูกเรียงลำดับแบบกำหนดผลลัพธ์แน่นอน (ตามชื่อเซิร์ฟเวอร์ แล้วตามชื่อเครื่องมือ) ก่อนลงทะเบียนเครื่องมือ เพื่อไม่ให้การเปลี่ยนลำดับ `listTools()` ทำให้บล็อกเครื่องมือเปลี่ยนไปมาและทำลายคำนำหน้าแคชพรอมต์
- เซสชันแบบเดิมที่มีบล็อกรูปภาพที่บันทึกไว้จะเก็บ **3 เทิร์นที่เสร็จสมบูรณ์ล่าสุด** ไว้ครบถ้วน (นับเทิร์นที่เสร็จสมบูรณ์ทั้งหมด ไม่ใช่เฉพาะเทิร์นที่มีรูปภาพ) บล็อกรูปภาพเก่ากว่าที่ประมวลผลแล้วจะถูกแทนที่ด้วยเครื่องหมายข้อความ เพื่อไม่ให้คำขอต่อเนื่องที่มีรูปภาพจำนวนมากต้องส่งเพย์โหลดเก่าขนาดใหญ่ซ้ำต่อไป

## รูปแบบการปรับแต่ง

### การรับส่งข้อมูลแบบผสม (ค่าเริ่มต้นที่แนะนำ)

เก็บค่าพื้นฐานอายุยาวไว้ในเอเจนต์หลัก และปิดใช้งานการแคชสำหรับเอเจนต์แจ้งเตือนที่ทำงานเป็นช่วงสั้นๆ:

```yaml
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.ts`
- `src/agents/live-cache-regression-runner.ts`
- `src/agents/live-cache-regression-baseline.ts`

เรียกใช้ด้วย:

```sh
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache
```

ไฟล์ค่าฐานจัดเก็บตัวเลขจากระบบจริงที่สังเกตได้ล่าสุด รวมถึงค่าต่ำสุดสำหรับตรวจจับการถดถอยเฉพาะผู้ให้บริการที่การทดสอบใช้ตรวจสอบ การรันแต่ละครั้งใช้ ID เซสชันและเนมสเปซพรอมต์ใหม่เฉพาะการรัน เพื่อไม่ให้สถานะแคชก่อนหน้าปนเปื้อนตัวอย่างปัจจุบัน Anthropic และ OpenAI ใช้การบังคับใช้ต่างกัน: การต่ำกว่าค่าต่ำสุดของ Anthropic ถือเป็นการถดถอยร้ายแรง (การทดสอบล้มเหลว) ส่วนการต่ำกว่าค่าต่ำสุดของ OpenAI ใช้สำหรับเฝ้าระวังเท่านั้น (บันทึกเป็นคำเตือนและไม่ทำให้การรันล้มเหลว) ทั้งสองไม่ได้ใช้เกณฑ์เดียวกันข้ามผู้ให้บริการ

### ความคาดหวังจากระบบจริงของ Anthropic

- คาดว่าจะมีการเขียนเพื่ออุ่นแคชอย่างชัดเจนผ่าน `cacheWrite`
- คาดว่าจะนำประวัติเกือบทั้งหมดกลับมาใช้ซ้ำในการโต้ตอบรอบถัดไป เนื่องจากการควบคุมแคชของ Anthropic เลื่อนจุดแบ่งแคชไปตามบทสนทนา
- ค่าต่ำสุดของค่าฐานสำหรับเลนแบบเสถียร เครื่องมือ รูปภาพ และรูปแบบ MCP เป็นเกตตรวจจับการถดถอยแบบบังคับ

### ความคาดหวังจากระบบจริงของ OpenAI

- คาดว่าจะมีเฉพาะ `cacheRead`; `cacheWrite` ยังคงเป็น `0` บน Chat Completions
- ให้ถือว่าการนำแคชกลับมาใช้ซ้ำในการโต้ตอบรอบถัดไปเป็นระดับคงที่เฉพาะผู้ให้บริการ ไม่ใช่การนำประวัติทั้งหมดกลับมาใช้ซ้ำแบบเลื่อนตาม Anthropic
- ค่าต่ำสุดใช้สำหรับเฝ้าระวังเท่านั้น (หากต่ำกว่าจะบันทึกเป็นคำเตือน ไม่ใช่ทำให้การทดสอบล้มเหลว) โดยได้มาจากพฤติกรรมที่สังเกตจากระบบจริงบน `gpt-5.4-mini`:

| สถานการณ์             | ค่าต่ำสุดของ `cacheRead` | ค่าต่ำสุดของอัตราการพบ |
| -------------------- | ----------------: | -------------: |
| คำนำหน้าแบบเสถียร        |             4,608 |           0.90 |
| ทรานสคริปต์เครื่องมือ      |             4,096 |           0.85 |
| ทรานสคริปต์รูปภาพ     |             3,840 |           0.82 |
| ทรานสคริปต์รูปแบบ MCP |             4,096 |           0.85 |

ตัวเลขค่าฐานที่สังเกตได้ล่าสุด (จาก `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`

```yaml
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-direct-api) ด้านบน)
- OpenAI ยังส่งคืนส่วนหัวสำหรับการติดตามและการจำกัดอัตรา เช่น `x-request-id`, `openai-processing-ms` และ `x-ratelimit-*`; ใช้ค่าเหล่านี้เพื่อติดตามคำขอ แต่การคำนวณการพบข้อมูลในแคชยังคงต้องมาจากเพย์โหลดการใช้งาน ไม่ใช่จากส่วนหัว

## การแก้ปัญหาอย่างรวดเร็ว

- **ค่า `cacheWrite` สูงในรอบส่วนใหญ่**: ตรวจสอบอินพุตพรอมต์ระบบที่เปลี่ยนแปลงบ่อย และตรวจสอบว่าโมเดล/ผู้ให้บริการรองรับการตั้งค่าแคช
- **ค่า `cacheWrite` สูงบน Anthropic**: มักหมายความว่าจุดแบ่งแคชอยู่บนเนื้อหาที่เปลี่ยนแปลงทุกคำขอ
- **ค่า `cacheRead` ของ OpenAI ต่ำ**: ตรวจสอบว่าคำนำหน้าแบบเสถียรอยู่ด้านหน้า คำนำหน้าที่ซ้ำกันมีอย่างน้อย 1024 โทเค็น และนำ `prompt_cache_key` เดิมกลับมาใช้ซ้ำสำหรับรอบที่ควรใช้แคชร่วมกัน
- **`cacheRetention` ไม่มีผล**: ตรวจสอบว่าคีย์โมเดลตรงกับ `agents.defaults.models["provider/model"]`
- **คำขอ Bedrock Nova ที่มีการตั้งค่าแคช**: เป็นพฤติกรรมที่คาดไว้ เนื่องจากระบบจะแปลงค่าเหล่านี้เป็นการไม่เก็บแคชขณะรันไทม์

เอกสารที่เกี่ยวข้อง:

- [Anthropic](/th/providers/anthropic)
- [การใช้โทเค็นและค่าใช้จ่าย](/th/reference/token-use)
- [การตัดแต่งเซสชัน](/th/concepts/session-pruning)
- [เอกสารอ้างอิงการกำหนดค่า Gateway](/th/gateway/configuration-reference)

## ที่เกี่ยวข้อง

- [การใช้โทเค็นและค่าใช้จ่าย](/th/reference/token-use)
- [การใช้งาน API และค่าใช้จ่าย](/th/reference/api-usage-costs)
