ติดตาม token และค่าใช้จ่าย AI coding
AtoAxis บันทึกว่า coding agent ของคุณใช้ token ไปเท่าไร และประมาณค่าใช้จ่ายเท่าไร แยกตามโปรเจกต์และรายวัน โดยแยก input, output และ cache token ออกจากกัน ราคามีเวอร์ชันและช่วงเวลาที่มีผลกำกับ ส่วนตัวเลขที่คำนวณจาก usage และราคาที่รู้ไม่ได้ จะรายงานว่าไม่ทราบ ไม่ใช่ศูนย์
วัดอะไรบ้าง
coding agent คิดเงินตาม token ไม่ใช่ตามเวลาที่คุณนั่งดูมันทำงาน เวลาตอบคำถามว่า session นี้นานแค่ไหน ส่วน token ตอบว่า session นี้ใช้ทรัพยากรไปเท่าไร ทั้งสองอยู่บน timeline เดียวกัน
token สี่ประเภท
- Input token: สิ่งที่ส่งเข้า model
- Output token: สิ่งที่ model สร้างออกมา
- Cache read token: เนื้อหา prompt ที่อ่านจาก cache คิดราคาถูกกว่า
- Cache write token: เนื้อหาที่เขียนลง cache คิดราคาแพงกว่า
ที่แยกเก็บเพราะคิดราคาต่างกัน ถ้ายุบเป็นตัวเลขเดียว session ที่ใช้ cache หนักจะดูเหมือน session ที่ส่ง context ใหม่ทั้งก้อน ซึ่งราคาไม่เท่ากัน
usage เข้ามาอย่างไร
usage event ส่งเข้า endpoint เฉพาะที่มีเฉพาะ identifier และตัวเลข ไม่มีฟิลด์สำหรับ prompt, response, patch, file path หรือ source code
[
{
"usage_event_id": "msg_01ExampleProviderMessageId",
"ai_session_id": "your-session-id",
"occurred_at": "2026-08-23T04:15:00Z",
"agent": "claude-code",
"provider": "anthropic",
"model": "your-model-name",
"prompt_count": 1,
"input_tokens": 18450,
"output_tokens": 1220,
"cache_read_tokens": 96300,
"cache_write_tokens": 4100,
"token_source": "reported"
}
]event ใช้ message id ของ provider เป็นคีย์ ส่งซ้ำจึงนับซ้ำไม่ได้ bundled hook อ่านจาก transcript ในเครื่องคุณเอง หรือจะเขียน wrapper ส่งเองก็ได้
agent ที่รองรับ
- Claude Code, Codex CLI และ Gemini CLI มี bundled hook อ่าน transcript ในเครื่อง
- เครื่องมืออื่นส่งเข้า endpoint เดียวกันได้โดยตรง
- Cursor และ Copilot ต้องมี adapter เฉพาะของ provider ก่อน
เครื่องมือที่ยังไม่มี hook จะไม่ถูกรายงานเป็นศูนย์ แต่จะไม่มีข้อมูล และตัวเลข coverage จะบอกว่าช่วงนั้นขาดไปเท่าไร
คำนวณค่าใช้จ่ายอย่างไร
ค่าใช้จ่ายมาจากการคำนวณ ไม่ใช่การเดา แต่ละคู่ provider กับ model มีแถวราคาพร้อมช่วงเวลาที่มีผล event จึงคิดด้วยราคา ณ เวลานั้น ไม่ใช่ราคาวันนี้
กฎที่ทำให้ตัวเลขน่าเชื่อถือ
- เลือกราคาจาก provider คู่กับ model เสมอ ไม่เคยใช้ชื่อ model อย่างเดียว เพราะสอง provider อาจตั้งชื่อซ้ำกันแต่คิดราคาต่างกัน
- แต่ละแถวราคามีวันเริ่มมีผลและเวอร์ชัน การปรับราคาจึงไม่ไปเขียนทับเดือนที่แล้ว
- เก็บมูลค่าเป็น micro-USD เพื่อไม่ให้เกิด rounding drift เมื่อมี event หลายล้านรายการ
- provider หรือ model ที่ไม่รู้จัก จะได้ต้นทุนว่า "ไม่ทราบ" ไม่ใช่ ศูนย์
ชุดราคาที่ให้มาครอบราคา list price ของ Anthropic การใช้งานจาก provider ที่ยังไม่มีแถวราคายังรายงาน token ตามปกติ ขาดไปเฉพาะตัวเลขค่าใช้จ่าย
ค่าใช้จ่ายแยกตามโปรเจกต์
usage event นำ workspace context ของ agent มาด้วย โดยย่อเหลือเพียงชื่อโปรเจกต์ก่อนออกจากเครื่อง จึงจัดกลุ่มค่าใช้จ่ายได้แบบเดียวกับ coding time
เมื่อ event ไม่ระบุโปรเจกต์
- ถ้าทุก event ใน session นั้นอยู่โปรเจกต์เดียว event นั้นจะสืบโปรเจกต์นั้น
- ถ้า session แตะหลายโปรเจกต์ event จะคงเป็น unattributed แทนที่จะคัดลอกไปทุกโปรเจกต์
กฎข้อสองคือเหตุผลที่ยอดรวมรายโปรเจกต์อาจน้อยกว่ายอดรวมของบัญชี การกระจาย session ที่คลุมเครือไปทุกโปรเจกต์จะทำให้ทุกโปรเจกต์ดูแพงเกินจริง และแยกไม่ออกว่าส่วนไหนถูกเดาขึ้นมา
coverage แทนความแม่นยำเทียม
attribution, token และค่าใช้จ่ายมี coverage ของตัวเอง ส่วนค่าที่คำนวณไม่ได้จะเป็น null พร้อม coverage กำกับ
{
"tokens": { "total": 1204300, "coverage_percent": 92.4 },
"estimated_spend": { "amount_microusd": 3184500, "coverage_percent": 74.1, "currency": "USD" },
"coverage": { "attribution_percent": 88.0, "token_percent": 92.4, "cost_percent": 74.1 }
}dashboard ที่แสดงค่าที่ไม่รู้เป็น 0 คือการบอกสิ่งที่มันไม่รู้ การเห็นว่า "คิดราคาได้ 74%" บอกได้ว่าควรเชื่อตัวเลขรวมแค่ไหน และแพ็กเกจ subscription ที่ไม่เปิดราคาต่อครั้งจะอยู่นอกขอบเขตอย่างชัดเจน ไม่ถูกนับเงียบ ๆ ว่าฟรี
สิ่งที่ไม่เก็บ
- prompt, คำตอบของ model และ transcript ของบทสนทนา
- เนื้อหาไฟล์ source และ patch
- absolute path — ใช้เฉพาะชื่อโฟลเดอร์สุดท้ายเป็นชื่อโปรเจกต์
usage stream ออกแบบมาให้มีเฉพาะตัวเลขและ identifier ความยาว prompt ถูกนับในเครื่องคุณและส่งมาเฉพาะตัวเลข ส่วนตัวข้อความถูกทิ้งไป
ข้อจำกัดที่ควรรู้
- ค่าใช้จ่ายเป็นการประมาณจาก list price ไม่ใช่ใบแจ้งหนี้ จึงไม่ตรงกับราคาที่ต่อรองไว้หรือแพ็กเกจ subscription
- แพ็กเกจ subscription ที่ไม่เปิดราคาต่อครั้งจะได้ token แต่ไม่ได้ค่าใช้จ่าย
- usage มาจาก agent ที่มี hook หรือ adapter เท่านั้น
- event เก่าเก็บราคา ณ เวลาที่เกิด การแก้ชุดราคาไม่ย้อนกลับไปแก้ของเดิม
หน้าที่เกี่ยวข้อง
คำถามที่พบบ่อยเรื่อง token และค่าใช้จ่าย AI
- ติดตามได้หรือไม่ว่า Claude Code ใช้ token ไปเท่าไร?
- ได้ bundled hook อ่าน transcript ของ Claude Code ในเครื่องแล้วส่ง input, output, cache read และ cache write token แยกตาม session โปรเจกต์และวัน
- คำนวณค่าใช้จ่ายของ AI coding session อย่างไร?
- นำ token ที่ provider รายงานมาคูณกับราคาที่มีผล ณ เวลาที่ event เกิด ราคามีเวอร์ชันและช่วงเวลา หากไม่รู้จัก provider หรือ model จะตอบว่าไม่ทราบ ไม่ใช่ 0
- ดูค่าใช้จ่าย AI แยกตามโปรเจกต์ได้หรือไม่?
- ได้ usage จะสืบโปรเจกต์จาก session เมื่อ session นั้นแตะโปรเจกต์เดียว ถ้าแตะหลายโปรเจกต์จะคงเป็น unattributed แทนการคัดลอกไปทุกโปรเจกต์
- agent ใดบ้างที่รายงาน token ได้?
- Claude Code, Codex CLI และ Gemini CLI มี bundled hook เครื่องมืออื่นส่งเข้า endpoint เดียวกันได้ ส่วน Cursor และ Copilot ต้องมี adapter ก่อน
- ตัวเลขจะตรงกับบิลจาก provider หรือไม่?
- ไม่ตรง เป็นการประมาณจาก list price และ usage ที่รายงานมา ราคาที่ต่อรองไว้ แพ็กเกจ และการปรับฝั่ง provider มองไม่เห็น จึงต้องดู coverage ควบคู่เสมอ
- ต้องเก็บ prompt หรือ response เพื่อคำนวณค่าใช้จ่ายหรือไม่?
- ไม่ต้อง usage stream มีเฉพาะ identifier และตัวเลข ความยาว prompt นับในเครื่องแล้วทิ้งข้อความ