Vì sao đây là khoản tiết kiệm lớn nhất
Mỗi lần gọi model, phần context lặp lại (system prompt, tài liệu, lịch sử hội thoại, định nghĩa tool) được tính giá input. Nếu prefix đó giống hệt lần trước, nhà cung cấp đọc từ cache và tính giá cache read — rẻ hơn input khoảng 5–20 lần tuỳ model.
Với agent lập trình (Claude Code, Cline, Codex), phần lớn token là cache read. Nghĩa là cách bạn viết prompt ảnh hưởng tới hoá đơn nhiều hơn cả việc chọn model rẻ hay đắt.
Từng nhà cung cấp: bật thế nào
| Hãng | Bật cache | Prefix tối thiểu | Giá cache read |
|---|---|---|---|
| Anthropic | Phải tự khai cache_control | ~600 token (Sonnet/Opus), ~4.100 (Haiku) | 0,05–0,1× input |
| OpenAI | Tự động | ~1.000 token | 0,05–0,5× input (tuỳ model) |
| DeepSeek | Tự động | theo block 64 token | 0,02× input |
| xAI (Grok) | Tự động | ~1.000 token | 0,15–0,25× input |
| Gemini | Tự động (implicit) | vài nghìn token trở lên | 0,05–0,1× input |
Số "prefix tối thiểu" ở trên là đo trên chính endpoint này: Sonnet không cache ở 512 token nhưng cache ở 603; Haiku 4.5 không cache ở 3.793 nhưng cache ở 4.401. Dưới ngưỡng thì cache_control bị bỏ qua im lặng — request vẫn 200, chỉ là không có cache.
Cột "Giá cache read" là KHOẢNG giữa các model — mỗi model một tỷ lệ. Số chính xác của model bạn dùng nằm ở chip cache read trên bảng giá trang chủ, hoặc pricing_usd_per_1m.cache_read của GET /v1/models.
cache_control trong request là 0% cache, và toàn bộ context tính giá input đầy đủ. Claude Code tự gửi, nhưng code tự viết bằng SDK thì thường quên.Khai cache cho Anthropic
Đặt cache_control ở block CUỐI của phần ổn định (thường là system prompt hoặc tài liệu dài), không đặt ở mọi block. Mọi thứ TRƯỚC breakpoint được cache; thứ sau nó thì không.
{
"model": "claude-sonnet-5-5",
"max_tokens": 1024,
"system": [
{ "type": "text", "text": "<tài liệu dài, ổn định>",
"cache_control": { "type": "ephemeral" } }
],
"messages": [{ "role": "user", "content": "Câu hỏi thay đổi mỗi lần" }]
}Mặc định cache sống 5 phút. Muốn 1 giờ thì thêm "ttl": "1h" và header anthropic-beta: extended-cache-ttl-2025-04-11. Ghi cache 1h đắt gấp đôi input (5 phút: 1,25×), nên chỉ dùng khi prefix thực sự được dùng lại lâu — ví dụ phiên làm việc dài trên cùng một repo.
Cách viết prompt để trúng cache
- Phần ổn định đặt TRƯỚC, phần thay đổi (câu hỏi, timestamp) đặt SAU. Cache là so khớp theo thứ tự từ đầu.
- Đừng chèn ngày giờ, số ngẫu nhiên, hay id phiên vào đầu system prompt — một token đổi ở đầu là mất toàn bộ cache phía sau.
- Giữ nguyên định nghĩa tool: đổi thứ tự hay thêm một tool làm prefix khác đi.
- Đừng xoá context giữa phiên để "tiết kiệm". Gửi lại từ đầu ở giá input thường tốn hơn phần bạn xoá.
- Cache gắn với account của nhà cung cấp, không gắn với key của bạn — chúng tôi giữ mỗi khách trên một upstream ổn định để cache không bị mất khi có nhiều đường.
Kiểm tra xem có trúng cache không
Mọi response đều có khối usage với số token cache. Chúng tôi chuyển nguyên văn các con số này và dùng chính chúng để tính tiền: cache_read_input_tokens / prompt_tokens_details.cached_tokens / cachedContentTokenCount (Google), và cache_creation_input_tokens (Anthropic) khi ghi cache.
curl -s https://api.apimodelhub.com/v1/messages \
-H "x-api-key: sk-spk-..." \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d @body.json | jq .usagecached_tokens vẫn 0 ở lần hai nghĩa là prefix đã thay đổi — thường do phần đầu prompt có nội dung động.