# Cache Rebuild (การสร้างแคชใหม่)

## ภูมิหลัง

กลไก prompt caching ของ Anthropic จะนำ system → tools → messages (จนถึง cache breakpoint) ในคำร้องขอมาต่อกันตามลำดับเพื่อสร้างคีย์แคช เมื่อคีย์แคชตรงกับคำร้องขอก่อนหน้าทุกประการ API จะส่งคืน `cache_read_input_tokens` (แคชตรง) เมื่อคีย์แคชเปลี่ยนแปลง API จะสร้างแคชใหม่และส่งคืน `cache_creation_input_tokens` จำนวนมาก นั่นคือการสร้างแคชใหม่

การสร้างแคชใหม่หมายถึงค่าใช้จ่ายโทเค็นเพิ่มเติม (ราคา cache creation สูงกว่า cache read) ดังนั้นการระบุสาเหตุของการสร้างใหม่จึงมีคุณค่าโดยตรงต่อการเพิ่มประสิทธิภาพค่าใช้จ่าย

## การจำแนกสาเหตุการสร้างแคชใหม่

cc-viewer ระบุสาเหตุของการสร้างแคชใหม่อย่างแม่นยำโดยเปรียบเทียบ body ของคำร้องขอ MainAgent สองรายการที่ต่อเนื่องกัน:

| reason | ความหมาย | วิธีการตรวจสอบ |
|--------|------|----------|
| `ttl` | แคชหมดอายุ | เวลาห่างจากคำร้องขอ MainAgent ก่อนหน้ามากกว่า 5 นาที |
| `system_change` | system prompt เปลี่ยนแปลง | `JSON.stringify(prev.system) !== JSON.stringify(curr.system)` |
| `tools_change` | คำจำกัดความเครื่องมือเปลี่ยนแปลง | `JSON.stringify(prev.tools) !== JSON.stringify(curr.tools)` |
| `model_change` | เปลี่ยนโมเดล | `prev.model !== curr.model` |
| `msg_truncated` | สแต็กข้อความถูกตัดทอน | จำนวนข้อความของคำร้องขอปัจจุบันน้อยกว่าคำร้องขอก่อนหน้า โดยปกติเกิดจากการตัดทอนเมื่อหน้าต่างบริบทล้น |
| `msg_modified` | ข้อความประวัติถูกแก้ไข | เนื้อหาข้อความนำหน้าไม่สอดคล้องกัน (ในการเพิ่มปกติ ข้อความนำหน้าควรเหมือนกันทุกประการ) |
| `key_change` | การเปลี่ยนแปลงคีย์ที่ไม่ทราบสาเหตุ | fallback เมื่อไม่ตรงกับเงื่อนไขใดข้างต้น |

## ลำดับความสำคัญในการตรวจสอบ

1. ตรวจสอบช่วงเวลาก่อน — หากเกิน 5 นาที จะระบุเป็น `ttl` ทันทีโดยไม่เปรียบเทียบ body
2. จากนั้นตรวจสอบตามลำดับ model, system, tools, messages
3. คำร้องขอหนึ่งอาจตรงกับหลายสาเหตุพร้อมกัน (เช่น เปลี่ยนโมเดล + เปลี่ยน system prompt) ในกรณีนี้อาร์เรย์ `reasons` จะมีรายการที่ตรงทั้งหมด และ tooltip จะแสดงแยกบรรทัด

## สถานการณ์ที่พบบ่อย

- **`ttl`**: ผู้ใช้หยุดการทำงานนานกว่า 5 นาทีแล้วดำเนินการต่อ แคชหมดอายุตามธรรมชาติ
- **`system_change`**: Claude Code อัปเดต system prompt (เช่น โหลด CLAUDE.md ใหม่, project instructions เปลี่ยนแปลง)
- **`tools_change`**: การเชื่อมต่อ/ตัดการเชื่อมต่อ MCP server ทำให้รายการเครื่องมือที่ใช้ได้เปลี่ยนแปลง
- **`model_change`**: ผู้ใช้เปลี่ยนโมเดลผ่านคำสั่ง `/model`
- **`msg_truncated`**: การสนทนายาวเกินไปทำให้เกิดการจัดการหน้าต่างบริบท Claude Code ตัดทอนข้อความก่อนหน้า
- **`msg_modified`**: Claude Code แก้ไขข้อความประวัติ (เช่น `/compact` แทนที่ข้อความต้นฉบับด้วยสรุปแบบบีบอัด)
