Message Batches API: giảm 50% chi phí Claude cho việc không cần trả lời ngay
Tóm tắt
Batch API cho phép gửi tới 100.000 request (hoặc 256 MB) trong một lô, tính phí 50% giá chuẩn. Phần lớn lô xong trong dưới 1 giờ, tối đa 24 giờ; kết quả giữ 29 ngày. Có thể kết hợp prompt caching để giảm thêm.
Không phải request nào gửi tới Claude cũng cần trả lời trong vài giây. Phân loại 10.000 ticket hỗ trợ, tóm tắt cả kho tài liệu, chạy bộ eval so sánh prompt, sinh mô tả cho hàng nghìn sản phẩm… đều là việc có thể chờ. Với nhóm việc này, Message Batches API cho phép gửi một lần cả lô request, xử lý bất đồng bộ, và chỉ tính 50% giá chuẩn.
Batch API là gì?
Đây là cách gọi Messages API theo lô: bạn gom nhiều request vào một batch, gửi lên, rồi quay lại lấy kết quả khi xử lý xong. Mỗi request trong lô được xử lý độc lập — một request lỗi không ảnh hưởng các request khác. Theo tài liệu chính thức, phần lớn batch hoàn thành trong dưới 1 giờ.
Thông số cần nhớ
| Hạng mục | Giới hạn |
|---|---|
| Giá | 50% giá API chuẩn, áp dụng cho cả input và output |
| Số request tối đa / batch | 100.000 request |
| Dung lượng tối đa / batch | 256 MB (chạm giới hạn nào trước thì áp dụng giới hạn đó; vượt sẽ lỗi 413 request_too_large) |
| Thời gian xử lý | Đa số dưới 1 giờ; tối đa 24 giờ — quá hạn thì request còn lại bị expired |
| Lưu kết quả | 29 ngày tính từ created_at (không phải từ lúc xong) |
custom_id | Duy nhất trong batch, 1–64 ký tự chữ, số, _, - |
Giá batch tham khảo (USD / 1 triệu token)
| Model | Input (batch) | Output (batch) |
|---|---|---|
| Claude Opus 5.5 | $2 | $10 |
| Claude Sonnet 5.5 | $1 | $5 |
| Claude Haiku 5.5 (prompt ≤100K token) | $0,05 | $0,25 |
Giá theo trang Batch processing của Claude Docs tại thời điểm viết bài; luôn kiểm tra lại trước khi lập ngân sách.
Hỗ trợ và không hỗ trợ gì?
Mọi model đang hoạt động đều dùng được Batch API. Một batch có thể trộn nhiều kiểu request khác nhau, và hỗ trợ gần như mọi tính năng của Messages API: hình ảnh (vision), tool use (kể cả server tool như web search, web fetch, code execution, MCP connector), system prompt, hội thoại nhiều lượt, extended thinking, phần lớn tính năng beta và prompt caching.
Những tham số sẽ bị báo lỗi validation:
stream: true— kết quả trả về dạng file, không stream.speed(fast mode) vàfallbacks— chỉ có ý nghĩa với API đồng bộ.max_tokens: 0(làm nóng cache) — cache sẽ hết hạn trước khi request sau kịp dùng.
Một điểm thú vị: với header beta output-300k-2026-03-24, request trong batch được nâng max_tokens lên tới 300.000 trên các model hỗ trợ — chỉ có ở Batch API, không có ở API đồng bộ.
Quy trình 4 bước (Python)
Bước 1 — Tạo batch
import anthropic
client = anthropic.Anthropic()
batch = client.messages.batches.create(requests=[
{
"custom_id": f"ticket-{t['id']}",
"params": {
"model": "claude-haiku-5-5",
"max_tokens": 200,
"system": "Phân loại ticket vào: billing, bug, feature, other. Chỉ trả về nhãn.",
"messages": [{"role": "user", "content": t["text"]}],
},
}
for t in tickets
])
print(batch.id, batch.processing_status) # in_progress
Lưu ý: tham số trong params được kiểm tra bất đồng bộ — lỗi chỉ hiện ra khi batch chạy xong. Vì vậy hãy gửi thử một request giống hệt qua Messages API thường trước khi đẩy cả lô.
Bước 2 — Theo dõi trạng thái
import time
while True:
b = client.messages.batches.retrieve(batch.id)
if b.processing_status == "ended":
break
print(b.request_counts) # processing / succeeded / errored / canceled / expired
time.sleep(60)
processing_status có 3 giá trị: in_progress, canceling, ended. Bạn cũng có thể xem trực tiếp trong Claude Console.
Bước 3 — Lấy kết quả
labels = {}
retry = []
for r in client.messages.batches.results(batch.id):
match r.result.type:
case "succeeded":
labels[r.custom_id] = r.result.message.content[0].text
case "errored":
if r.result.error.error.type == "invalid_request_error":
print("Sửa request:", r.custom_id)
else:
retry.append(r.custom_id) # lỗi server: gửi lại được
case "expired" | "canceled":
retry.append(r.custom_id)
Kết quả là file .jsonl, mỗi dòng một object gồm custom_id và result. Quan trọng: thứ tự kết quả không khớp thứ tự gửi — luôn ghép bằng custom_id.
| Loại kết quả | Ý nghĩa | Có tính tiền? |
|---|---|---|
succeeded | Thành công, có message | Có |
errored | Request sai hoặc lỗi server | Không |
canceled | Bị huỷ trước khi tới model | Không |
expired | Hết 24 giờ mà chưa kịp xử lý | Không |
Bước 4 — Huỷ hoặc xoá khi cần
Gọi client.messages.batches.cancel(id) để huỷ batch đang chạy: trạng thái chuyển sang canceling rồi ended, có thể vẫn có kết quả một phần. Muốn xoá dữ liệu batch sau khi xử lý, dùng DELETE /v1/messages/batches/{batch_id} (batch đang chạy phải huỷ trước).
Kết hợp với prompt caching
Giảm giá batch và giảm giá cache cộng dồn. Vì các request trong batch chạy song song nên cache hit chỉ là “best-effort”, tỷ lệ thường từ 30% đến 98%. Để tăng tỷ lệ hit:
- Đặt cùng một khối
cache_controlgiống hệt nhau ở mọi request (ví dụ system prompt + tài liệu tham chiếu). - Gửi đều tay để cache (thời gian sống 5 phút) không hết hạn giữa chừng.
- Thiết kế request để phần dùng chung càng lớn càng tốt; với batch chạy lâu, cân nhắc cache 1 giờ.
Khi nào dùng, khi nào không?
| Phù hợp | Không phù hợp |
|---|---|
| Phân loại, gắn nhãn, trích xuất dữ liệu hàng loạt | Chatbot trả lời người dùng real-time |
| Tóm tắt, dịch kho tài liệu | Agent nhiều bước cần kết quả bước trước để đi tiếp |
| Chạy eval, so sánh nhiều phiên bản prompt | Việc có deadline tính bằng giây |
| Kiểm duyệt nội dung, sinh nội dung số lượng lớn | Request cần stream từng token |
Lưu ý vận hành
- Chia nhỏ: dataset rất lớn nên tách thành nhiều batch để dễ theo dõi và retry.
- Stream kết quả: dùng iterator
results()thay vì tải toàn bộ vào bộ nhớ. - Spend limit: do throughput cao, batch có thể vượt nhẹ hạn mức chi tiêu của Workspace.
- Phạm vi Workspace: batch thuộc về Workspace tạo ra nó; chỉ API key cùng Workspace hoặc người có quyền trong Console mới xem được.
- Dữ liệu: request và response được lưu tối đa 29 ngày để xử lý; xoá chủ động bằng endpoint DELETE nếu dữ liệu nhạy cảm.
Áp dụng thế nào?
- Dev: Tách pipeline thành hai lớp — lớp real-time (API thường) cho người dùng, lớp batch chạy đêm cho phân tích, gắn nhãn, báo cáo. Hoá đơn giảm đáng kể mà trải nghiệm không đổi.
- Data/QA: Chạy bộ eval hàng nghìn case bằng batch mỗi khi đổi prompt — rẻ một nửa và không chiếm rate limit của API đồng bộ.
- PM: Khi ước tính chi phí AI cho tính năng, hỏi team: “phần nào chờ được vài giờ?”. Phần đó chuyển sang batch là tiết kiệm ngay 50%.
Nguồn & tham khảo
- Batch processing — Claude Docs
- Message Batches API reference — Claude Docs