ผมสร้างเครื่องมือพร็อกซีที่ช่วยให้เห็นว่า Claude Code ส่ง `Claude.md` ไปยังเซิร์ฟเวอร์ในรูปแบบไหน และส่งต้นฉบับของ skill ไปยังเซิร์ฟเวอร์อย่างไร
(github.com/kangraemin)ระหว่างทำงานด้วย Claude Code อยู่ดี ๆ ก็เกิดสงสัยขึ้นมาว่า ไฟล์ CLAUDE.md หรือข้อมูลอย่าง skill, rules / memory นั้น เซิร์ฟเวอร์ของ Claude รับรู้มันอย่างไรกันแน่?
ผมเลยลองทำ MITM proxy ขึ้นมาเอง และสร้างเครื่องมือที่สามารถดูทราฟฟิกได้
หลักการคือเปลี่ยน baseURL ตอนรัน Claude Code เพื่อดักจับและแสดงการสื่อสาร HTTP ที่เกิดขึ้นภายใน Claude Code
สิ่งที่ค้นพบได้จากเครื่องมือนี้มีดังนี้
คำว่า hello คำเดียว มีข้อมูลแนบออกไปถึง 12KB
- นี่คือกรณีที่เปิด Claude Code แล้วส่ง
helloทันที - ระบบจะส่ง
content[0]เป็นรายการสกิล ~2KB,content[1]เป็นCLAUDE.md~10KB, และcontent[2]เป็นข้อความhelloที่ป้อนจริง - นั่นหมายความว่าถ้า
CLAUDE.mdยาว 500 บรรทัด มันจะถูกส่งทั้งก้อนในทุกคำขอ ซึ่งเป็นเหตุผลว่าทำไมควรรักษาCLAUDE.mdให้กระชับ
ยิ่งบทสนทนาสะสมมากขึ้น แต่ละคำขอก็ยิ่งพองโตเหมือนก้อนหิมะ
- ระบบจะส่ง
messages[]ทั้งหมดซ้ำใหม่ในทุกคำขอ — 1 เทิร์น 15KB, 10 เทิร์น 200KB, 30 เทิร์น 1MB+ - แม้แต่คำตอบที่ Claude เคยตอบไปแล้วก็ยังถูกใส่รวมมาใน request message ด้วย
- ถ้าไม่คอยใช้
/clearเป็นระยะเพื่อเคลียร์ context window ก็อาจสิ้นเปลืองโทเคน และทำให้บริบทก่อนหน้าติดตามไปกับบริบทหลังเสมอจนกระทบประสิทธิภาพได้
เครื่องมือ MCP จะถูกโหลดเฉพาะตอนที่จำเป็นเท่านั้น
- ตอนเริ่มต้นจะโหลดเฉพาะเครื่องมือบิลต์อินจำนวน N ตัวก่อน (ขึ้นอยู่กับเวอร์ชันของ Claude) และถ้าจำเป็นต้องใช้ MCP tool ฝั่งเซิร์ฟเวอร์จะเรียก
ToolSearchเพื่อหาเครื่องมือที่จะใช้ - หลังจากนั้นในการเรียกแต่ละครั้ง ก็จะมีการเพิ่มเครื่องมือที่ค้นพบด้านบนเข้ามาด้วย
- กล่าวคือ MCP Tool ถูกโหลดแบบไดนามิก ดังนั้นเครื่องมือของ MCP ที่ยังไม่ได้ใช้งานจึงไม่ได้กินโทเคนมากอย่างที่คิด
ซับเอเจนต์ทำงานในคอนเท็กซ์ที่แยกขาดจากกันโดยสมบูรณ์
- ซับเอเจนต์เปรียบเสมือนการเปิดเซสชันใหม่ โดยไม่มีประวัติการสนทนาของตัวแม่เลยแม้แต่น้อย
- ใน Inspector คุณสามารถดูและเปรียบเทียบการเรียกของ parent/sub-agent แบบวางข้างกันได้ด้วยตา
การแนบรูปภาพ 1 รูป จะเพิ่มข้อมูลอีกหลายร้อย KB
- เมื่อแนบสกรีนช็อต รูปจะถูกเข้ารหัสแบบ base64 แล้วฝัง inline ลงใน JSON body
- คุณสามารถตรวจสอบได้แบบเรียลไทม์ว่ารูปภาพทำให้คำขอใหญ่ขึ้นแค่ไหน
สามารถติดตั้งได้ด้วยคำสั่งด้านล่าง
brew install --cask kangraemin/tap/claude-inspector && sleep 2 && open -a "Claude Inspector"
GitHub: https://github.com/kangraemin/claude-inspector
ตอนนี้ยังรองรับเฉพาะ macOS และยังเป็นเวอร์ชันเริ่มต้น หากมีข้อเสนอแนะเพื่อปรับปรุง ผมยินดีรับไปพัฒนาต่ออย่างเต็มที่
ลองใช้กันดูนะครับ หวังว่าจะเป็นประโยชน์ต่อการศึกษา ขอบคุณครับ!
4 ความคิดเห็น
ในบทความ suspiciously precise floats, or,
how I got Claude's real limits ดูเหมือนว่าจะมีการวิเคราะห์ว่า ต่างจากค่าใช้จ่ายของ API ตรงที่ในแพลนสมัครสมาชิกไม่มีค่าใช้จ่ายสำหรับการอ่านแคชนะครับ/ค่ะ ยิ่งเซสชันยาวขึ้น ก็รู้สึกว่าอาจมีความคลาดเคลื่อนระหว่างต้นทุนที่คำนวณได้กับต้นทุนจริงอยู่บ้างเหมือนกันครับ/ค่ะ
โอ้ .... เป็นโพสต์ที่ผมไม่รู้มาก่อนเลย ... เดี๋ยวจะลองตรวจสอบดูครับ! ขอบคุณครับ
https://github.com/badlogic/lemmy/tree/main/apps/claude-trace
ผมใช้สิ่งนี้ดูทั้งพรอมป์และมีการใช้เครื่องมืออะไรบ้าง แต่คงต้องลองใช้ของที่คุณทำไว้ด้วยเหมือนกันครับ
ขอบคุณที่แชร์ครับ :+1:
นอกจากนี้ หลังจากส่งคำขอแล้ว คุณสามารถดูจำนวนโทเค็นที่ใช้ใน request นั้นได้จากใน response ด้วย!
โมเดล: claude-sonnet-4-6
ขนาดคำขอ: 68.9 KB
"usage": {
"input_tokens": 3,
"cache_creation_input_tokens": 12394,
"cache_read_input_tokens": 6499,
"cache_creation": {
"ephemeral_5m_input_tokens": 0,
"ephemeral_1h_input_tokens": 12394
},
"output_tokens": 74,
"service_tier": "standard",
"inference_geo": "not_available"
}
และยังคำนวณ cost ต่อ request โดยนำราคาของแต่ละโมเดลมาใช้ไว้ให้แล้วด้วย ฝากลองใช้งานกันเยอะ ๆ นะครับ
อ่านแคช: 6.5K tok × $0.3/MTok = $0.0019
เขียนแคช: 12.4K tok × $3.75/MTok = $0.0465
อินพุตที่ไม่แคช: 3 tok × $3/MTok = $0.0000
เอาต์พุต: 74 tok × $15/MTok = $0.0011
รวม: $0.0495
อัตราแคชฮิต: 34%