{"product_id":"claude-batch-api-xử-ly-hang-loạt-với-chi-phi-giảm-50","title":"Claude Batch API — Xử lý hàng loạt với chi phí giảm 50%","description":"\n\u003cp\u003eKhi bạn cần xử lý hàng trăm hoặc hàng nghìn request tới Claude API, việc gửi từng request một không chỉ chậm mà còn tốn kém. Anthropic cung cấp Message Batches API cho phép bạn gửi nhiều request cùng lúc và nhận kết quả trong vòng 24 giờ, với mức giá chỉ bằng 50% so với API thông thường. Bài viết này hướng dẫn chi tiết cách triển khai Batch API trong thực tế.\u003c\/p\u003e\n\n\u003ch2\u003eBatch API là gì?\u003c\/h2\u003e\n\u003cp\u003eMessage Batches API là endpoint bất đồng bộ (asynchronous) của Claude API, cho phép bạn gửi một tập hợp nhiều request cùng một lúc thay vì gửi từng request riêng lẻ. Hệ thống sẽ xử lý toàn bộ batch và trả kết quả trong thời gian tối đa 24 giờ.\u003c\/p\u003e\n\u003cp\u003eCác đặc điểm chính của Batch API:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eGiảm 50% chi phí:\u003c\/strong\u003e mỗi token input và output đều được tính với giá bằng một nửa so với API đồng bộ (synchronous)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eThời gian xử lý tối đa 24 giờ:\u003c\/strong\u003e hệ thống cam kết hoàn thành trong khung thời gian này, thực tế thường nhanh hơn nhiều\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTối đa 100.000 request mỗi batch:\u003c\/strong\u003e đủ cho hầu hết các tác vụ xử lý hàng loạt\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHỗ trợ tất cả các model:\u003c\/strong\u003e Claude Opus, Sonnet, Haiku đều có thể dùng Batch API\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eKết quả trả về theo từng request:\u003c\/strong\u003e mỗi request trong batch có kết quả riêng, bao gồm cả trường hợp lỗi\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eKhi nào nên dùng Batch API?\u003c\/h2\u003e\n\u003cp\u003eBatch API phù hợp với các tác vụ không yêu cầu phản hồi ngay lập tức. Dưới đây là những use case phổ biến nhất:\u003c\/p\u003e\n\n\u003ch3\u003e1. Sinh nội dung hàng loạt\u003c\/h3\u003e\n\u003cp\u003eBạn cần tạo mô tả sản phẩm cho 5.000 SKU, viết meta description cho 2.000 trang web, hoặc dịch 500 bài viết sang nhiều ngôn ngữ. Thay vì chờ từng request hoàn thành, bạn gửi toàn bộ vào một batch và nhận kết quả sau vài giờ.\u003c\/p\u003e\n\n\u003ch3\u003e2. Phân tích và phân loại dữ liệu\u003c\/h3\u003e\n\u003cp\u003ePhân loại 10.000 đánh giá khách hàng theo sentiment, trích xuất thông tin từ hàng nghìn hợp đồng, hoặc gắn nhãn dữ liệu training cho model machine learning. Đây là những tác vụ vốn không cần kết quả tức thì.\u003c\/p\u003e\n\n\u003ch3\u003e3. Đánh giá và kiểm duyệt nội dung\u003c\/h3\u003e\n\u003cp\u003eKiểm tra hàng nghìn bình luận, đánh giá chất lượng bài viết, hoặc phát hiện nội dung vi phạm chính sách. Batch API giúp bạn xử lý khối lượng lớn với chi phí thấp.\u003c\/p\u003e\n\n\u003ch3\u003e4. Tạo dữ liệu tổng hợp (synthetic data)\u003c\/h3\u003e\n\u003cp\u003eKhi cần tạo dữ liệu huấn luyện, test case, hoặc dữ liệu mẫu cho phát triển ứng dụng, Batch API là lựa chọn kinh tế nhất.\u003c\/p\u003e\n\n\u003ch2\u003eTriển khai Batch API với Python\u003c\/h2\u003e\n\u003cp\u003eDưới đây là quy trình hoàn chỉnh từ tạo batch đến xử lý kết quả.\u003c\/p\u003e\n\n\u003ch3\u003eCài đặt và cấu hình\u003c\/h3\u003e\n\u003cp\u003eTrước tiên, cài đặt thư viện Anthropic Python SDK:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003epip install anthropic\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 1: Chuẩn bị danh sách request\u003c\/h3\u003e\n\u003cp\u003eMỗi request trong batch cần có một custom_id duy nhất để bạn có thể ghép kết quả với input sau khi batch hoàn thành:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()\n\n# Danh sach san pham can tao mo ta\nproducts = [\n    {\"id\": \"prod_001\", \"name\": \"Ao thun cotton\", \"category\": \"Thoi trang\"},\n    {\"id\": \"prod_002\", \"name\": \"Tai nghe Bluetooth\", \"category\": \"Cong nghe\"},\n    {\"id\": \"prod_003\", \"name\": \"Binh giu nhiet 500ml\", \"category\": \"Gia dung\"},\n    # ... hang nghin san pham khac\n]\n\n# Tao danh sach request cho batch\nrequests = []\nfor product in products:\n    requests.append({\n        \"custom_id\": product[\"id\"],\n        \"params\": {\n            \"model\": \"claude-sonnet-4-20250514\",\n            \"max_tokens\": 1024,\n            \"messages\": [\n                {\n                    \"role\": \"user\",\n                    \"content\": f\"Viet mo ta san pham ngan gon (100-150 tu) \"\n                               f\"cho san pham: {product['name']}, \"\n                               f\"danh muc: {product['category']}. \"\n                               f\"Viet bang tieng Viet, gong dieu than thien, \"\n                               f\"tap trung vao loi ich cho nguoi dung.\"\n                }\n            ]\n        }\n    })\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 2: Tạo batch\u003c\/h3\u003e\n\u003cp\u003eGửi danh sách request tới Batch API:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Tao batch\nbatch = client.messages.batches.create(requests=requests)\n\nprint(f\"Batch ID: {batch.id}\")\nprint(f\"Trang thai: {batch.processing_status}\")\nprint(f\"So request: {batch.request_counts.total}\")\n# Output:\n# Batch ID: msgbatch_01HG5K...\n# Trang thai: in_progress\n# So request: 3\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 3: Theo dõi tiến trình\u003c\/h3\u003e\n\u003cp\u003eBatch API cung cấp thông tin chi tiết về tiến trình xử lý. Bạn có thể polling hoặc dùng webhook:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport time\n\ndef wait_for_batch(client, batch_id, poll_interval=30):\n    \"\"\"Cho doi batch hoan thanh voi polling.\"\"\"\n    while True:\n        batch = client.messages.batches.retrieve(batch_id)\n        counts = batch.request_counts\n\n        print(f\"Tien trinh: {counts.succeeded + counts.errored + counts.expired}\"\n              f\"\/{counts.total} \"\n              f\"(thanh cong: {counts.succeeded}, \"\n              f\"loi: {counts.errored}, \"\n              f\"het han: {counts.expired})\")\n\n        if batch.processing_status == \"ended\":\n            print(\"Batch da hoan thanh!\")\n            return batch\n\n        time.sleep(poll_interval)\n\n# Su dung\ncompleted_batch = wait_for_batch(client, batch.id)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eBước 4: Xử lý kết quả\u003c\/h3\u003e\n\u003cp\u003eSau khi batch hoàn thành, lấy kết quả và xử lý từng response:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef process_batch_results(client, batch_id):\n    \"\"\"Xu ly ket qua batch va phan loai theo trang thai.\"\"\"\n    results = {\n        \"succeeded\": [],\n        \"errored\": [],\n        \"expired\": []\n    }\n\n    for result in client.messages.batches.results(batch_id):\n        custom_id = result.custom_id\n        result_type = result.result.type\n\n        if result_type == \"succeeded\":\n            message = result.result.message\n            content = message.content[0].text\n            results[\"succeeded\"].append({\n                \"id\": custom_id,\n                \"content\": content,\n                \"input_tokens\": message.usage.input_tokens,\n                \"output_tokens\": message.usage.output_tokens\n            })\n        elif result_type == \"errored\":\n            error = result.result.error\n            results[\"errored\"].append({\n                \"id\": custom_id,\n                \"error_type\": error.type,\n                \"error_message\": error.message\n            })\n        elif result_type == \"expired\":\n            results[\"expired\"].append({\"id\": custom_id})\n\n    return results\n\n# Su dung\nresults = process_batch_results(client, batch.id)\nprint(f\"Thanh cong: {len(results['succeeded'])}\")\nprint(f\"Loi: {len(results['errored'])}\")\nprint(f\"Het han: {len(results['expired'])}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXử lý lỗi và retry cho batch\u003c\/h2\u003e\n\u003cp\u003eTrong thực tế, một số request trong batch có thể thất bại. Bạn cần có chiến lược retry cho những request lỗi:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef retry_failed_requests(client, results, original_requests, max_retries=3):\n    \"\"\"Gui lai cac request that bai trong batch moi.\"\"\"\n    failed_ids = set()\n    for item in results[\"errored\"]:\n        failed_ids.add(item[\"id\"])\n    for item in results[\"expired\"]:\n        failed_ids.add(item[\"id\"])\n\n    if not failed_ids:\n        print(\"Khong co request nao can retry.\")\n        return results\n\n    # Loc ra cac request can gui lai\n    retry_requests = [\n        req for req in original_requests\n        if req[\"custom_id\"] in failed_ids\n    ]\n\n    print(f\"Retry {len(retry_requests)} request...\")\n\n    for attempt in range(max_retries):\n        retry_batch = client.messages.batches.create(requests=retry_requests)\n        completed = wait_for_batch(client, retry_batch.id)\n        retry_results = process_batch_results(client, retry_batch.id)\n\n        # Cap nhat ket qua\n        results[\"succeeded\"].extend(retry_results[\"succeeded\"])\n\n        # Kiem tra con request loi khong\n        remaining_failed = retry_results[\"errored\"] + retry_results[\"expired\"]\n        if not remaining_failed:\n            print(f\"Tat ca request da thanh cong sau {attempt + 1} lan retry.\")\n            break\n\n        failed_ids = set(item[\"id\"] for item in remaining_failed)\n        retry_requests = [\n            req for req in retry_requests\n            if req[\"custom_id\"] in failed_ids\n        ]\n\n    return results\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eSo sánh chi phí: Batch API vs Real-time API\u003c\/h2\u003e\n\u003cp\u003eDưới đây là bảng so sánh chi phí cho một tác vụ điển hình: xử lý 10.000 request, mỗi request trung bình 500 token input và 300 token output.\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTiêu chí\u003c\/th\u003e\n      \u003cth\u003eReal-time API\u003c\/th\u003e\n      \u003cth\u003eBatch API\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eGiá input (Claude Sonnet)\u003c\/td\u003e\n      \u003ctd\u003e$3 \/ 1M tokens\u003c\/td\u003e\n      \u003ctd\u003e$1.5 \/ 1M tokens\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eGiá output (Claude Sonnet)\u003c\/td\u003e\n      \u003ctd\u003e$15 \/ 1M tokens\u003c\/td\u003e\n      \u003ctd\u003e$7.5 \/ 1M tokens\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eChi phí input (10K req x 500 tokens)\u003c\/td\u003e\n      \u003ctd\u003e$15\u003c\/td\u003e\n      \u003ctd\u003e$7.50\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eChi phí output (10K req x 300 tokens)\u003c\/td\u003e\n      \u003ctd\u003e$45\u003c\/td\u003e\n      \u003ctd\u003e$22.50\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTổng chi phí\u003c\/td\u003e\n      \u003ctd\u003e$60\u003c\/td\u003e\n      \u003ctd\u003e$30\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTiết kiệm\u003c\/td\u003e\n      \u003ctd\u003e-\u003c\/td\u003e\n      \u003ctd\u003e50% ($30)\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eThời gian hoàn thành\u003c\/td\u003e\n      \u003ctd\u003eNgay lập tức (mỗi request)\u003c\/td\u003e\n      \u003ctd\u003eTối đa 24 giờ\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ePhù hợp cho\u003c\/td\u003e\n      \u003ctd\u003eChat, interactive app\u003c\/td\u003e\n      \u003ctd\u003eBatch processing, ETL\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003eVới model Claude Opus, mức chênh lệch còn lớn hơn vì đơn giá cao hơn, nhưng tỷ lệ giảm vẫn là 50%.\u003c\/p\u003e\n\n\u003ch2\u003eVí dụ thực tế: Phân loại đánh giá khách hàng\u003c\/h2\u003e\n\u003cp\u003eGiả sử bạn có 5.000 đánh giá sản phẩm cần phân loại theo sentiment (tích cực, tiêu cực, trung tính) và trích xuất các chủ đề chính:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport json\n\ndef create_review_classification_batch(client, reviews):\n    \"\"\"Tao batch phan loai danh gia khach hang.\"\"\"\n    system_prompt = (\n        \"Ban la chuyen gia phan tich feedback khach hang. \"\n        \"Voi moi danh gia, hay tra ve JSON voi format:\n\"\n        '{\"sentiment\": \"positive|negative|neutral\", '\n        '\"topics\": [\"topic1\", \"topic2\"], '\n        '\"summary\": \"tom tat 1 cau\", '\n        '\"action_required\": true|false}'\n    )\n\n    requests = []\n    for review in reviews:\n        requests.append({\n            \"custom_id\": f\"review_{review['id']}\",\n            \"params\": {\n                \"model\": \"claude-haiku-3-5-20241022\",\n                \"max_tokens\": 256,\n                \"messages\": [\n                    {\"role\": \"user\", \"content\": review[\"text\"]}\n                ],\n                \"system\": system_prompt\n            }\n        })\n\n    batch = client.messages.batches.create(requests=requests)\n    return batch\n\n# Sau khi batch hoan thanh, parse ket qua\ndef parse_classification_results(client, batch_id):\n    \"\"\"Parse ket qua phan loai thanh structured data.\"\"\"\n    classifications = []\n    for result in client.messages.batches.results(batch_id):\n        if result.result.type == \"succeeded\":\n            text = result.result.message.content[0].text\n            try:\n                data = json.loads(text)\n                data[\"review_id\"] = result.custom_id\n                classifications.append(data)\n            except json.JSONDecodeError:\n                print(f\"Loi parse JSON cho {result.custom_id}\")\n\n    return classifications\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ thực tế: Dịch nội dung đa ngôn ngữ\u003c\/h2\u003e\n\u003cp\u003eKhi cần dịch toàn bộ nội dung website sang nhiều ngôn ngữ, Batch API giúp tiết kiệm đáng kể:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef create_translation_batch(client, contents, target_languages):\n    \"\"\"Tao batch dich noi dung sang nhieu ngon ngu.\"\"\"\n    requests = []\n    for content in contents:\n        for lang in target_languages:\n            requests.append({\n                \"custom_id\": f\"{content['id']}_{lang}\",\n                \"params\": {\n                    \"model\": \"claude-sonnet-4-20250514\",\n                    \"max_tokens\": 4096,\n                    \"messages\": [\n                        {\n                            \"role\": \"user\",\n                            \"content\": (\n                                f\"Dich doan van sau sang {lang}. \"\n                                f\"Giu nguyen format HTML neu co. \"\n                                f\"Dam bao ban dich tu nhien, \"\n                                f\"khong dich mot-mot:\n\n\"\n                                f\"{content['text']}\"\n                            )\n                        }\n                    ]\n                }\n            })\n\n    # Chia thanh nhieu batch neu vuot qua 100K request\n    batch_size = 100000\n    batches = []\n    for i in range(0, len(requests), batch_size):\n        chunk = requests[i:i + batch_size]\n        batch = client.messages.batches.create(requests=chunk)\n        batches.append(batch)\n        print(f\"Da tao batch {batch.id} voi {len(chunk)} request\")\n\n    return batches\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKhi nào chọn Batch API, khi nào chọn Real-time API?\u003c\/h2\u003e\n\u003cp\u003eQuyết định giữa hai phương thức phụ thuộc vào bốn yếu tố chính:\u003c\/p\u003e\n\n\u003ch3\u003eChọn Real-time API khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eNgười dùng đang chờ phản hồi (chat, search, autocomplete)\u003c\/li\u003e\n  \u003cli\u003eKết quả cần trong vòng vài giây\u003c\/li\u003e\n  \u003cli\u003eSố lượng request nhỏ (dưới 100 request mỗi lần)\u003c\/li\u003e\n  \u003cli\u003eCần streaming response (hiển thị từng chữ)\u003c\/li\u003e\n  \u003cli\u003eLogic ứng dụng phụ thuộc vào kết quả request trước để tạo request sau\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eChọn Batch API khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eKhông cần kết quả ngay lập tức (có thể chờ vài giờ)\u003c\/li\u003e\n  \u003cli\u003eSố lượng request lớn (hàng trăm đến hàng trăm nghìn)\u003c\/li\u003e\n  \u003cli\u003eTối ưu chi phí là ưu tiên hàng đầu\u003c\/li\u003e\n  \u003cli\u003eCác request độc lập với nhau (kết quả request A không ảnh hưởng request B)\u003c\/li\u003e\n  \u003cli\u003eChạy trong pipeline ETL, cron job, hoặc quy trình backend\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eKết hợp cả hai\u003c\/h3\u003e\n\u003cp\u003eNhiều hệ thống sử dụng hybrid approach: Real-time API cho trải nghiệm người dùng trực tiếp, Batch API cho các tác vụ nền chạy hàng đêm. Ví dụ, một sàn thương mại điện tử có thể dùng Real-time API cho chatbot hỗ trợ khách hàng ban ngày, và Batch API để phân tích toàn bộ đánh giá sản phẩm mới vào ban đêm.\u003c\/p\u003e\n\n\u003ch2\u003eBest practices khi dùng Batch API\u003c\/h2\u003e\n\n\u003ch3\u003e1. Thiết kế custom_id có ý nghĩa\u003c\/h3\u003e\n\u003cp\u003eCustom ID giúp bạn ghép kết quả với dữ liệu gốc. Nên dùng format rõ ràng và có thể parse được:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Tot: co the parse de ghep voi database\ncustom_id = f\"product_{product_id}_description_{language}\"\n\n# Khong tot: khong biet thuoc du lieu nao\ncustom_id = f\"req_{uuid4()}\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003e2. Chia batch lớn thành nhiều batch nhỏ\u003c\/h3\u003e\n\u003cp\u003eMặc dù giới hạn là 100.000 request mỗi batch, nên chia thành các batch 10.000-20.000 request để dễ theo dõi và retry khi có lỗi.\u003c\/p\u003e\n\n\u003ch3\u003e3. Lưu batch_id và trạng thái vào database\u003c\/h3\u003e\n\u003cp\u003eTrong môi trường production, luôn lưu batch_id vào database để có thể truy vấn lại kết quả nếu ứng dụng bị crash hoặc restart.\u003c\/p\u003e\n\n\u003ch3\u003e4. Xử lý idempotency\u003c\/h3\u003e\n\u003cp\u003eNếu batch bị timeout hoặc lỗi, bạn cần đảm bảo việc retry không tạo ra dữ liệu trùng lặp. Sử dụng custom_id để kiểm tra request nào đã có kết quả trước khi gửi lại.\u003c\/p\u003e\n\n\u003ch3\u003e5. Monitor chi phí\u003c\/h3\u003e\n\u003cp\u003eTheo dõi usage từ kết quả batch để tính tổng chi phí thực tế:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef calculate_batch_cost(results, model=\"claude-sonnet-4-20250514\"):\n    \"\"\"Tinh chi phi thuc te cua batch.\"\"\"\n    # Gia Batch API (50% gia thuong)\n    pricing = {\n        \"claude-sonnet-4-20250514\": {\n            \"input\": 1.5 \/ 1_000_000,\n            \"output\": 7.5 \/ 1_000_000\n        },\n        \"claude-haiku-3-5-20241022\": {\n            \"input\": 0.4 \/ 1_000_000,\n            \"output\": 2.0 \/ 1_000_000\n        }\n    }\n\n    total_input = sum(r[\"input_tokens\"] for r in results[\"succeeded\"])\n    total_output = sum(r[\"output_tokens\"] for r in results[\"succeeded\"])\n\n    cost_input = total_input * pricing[model][\"input\"]\n    cost_output = total_output * pricing[model][\"output\"]\n\n    print(f\"Input tokens: {total_input:,}\")\n    print(f\"Output tokens: {total_output:,}\")\n    print(f\"Chi phi input: ${cost_input:.4f}\")\n    print(f\"Chi phi output: ${cost_output:.4f}\")\n    print(f\"Tong chi phi: ${cost_input + cost_output:.4f}\")\n\n    return cost_input + cost_output\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eHủy batch đang xử lý\u003c\/h2\u003e\n\u003cp\u003eNếu bạn phát hiện lỗi trong dữ liệu đầu vào hoặc cần dừng batch vì lý do nào đó, bạn có thể hủy batch:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Huy batch\nclient.messages.batches.cancel(batch_id)\n\n# Luu y: cac request da xu ly xong se khong bi huy\n# Chi nhung request chua bat dau moi bi huy\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eSau khi hủy, bạn vẫn có thể lấy kết quả của các request đã hoàn thành trước thời điểm hủy.\u003c\/p\u003e\n\n\u003ch2\u003eLiệt kê và quản lý batch\u003c\/h2\u003e\n\u003cp\u003eBạn có thể liệt kê tất cả các batch đã tạo để theo dõi và quản lý:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Liet ke cac batch gan day\nbatches = client.messages.batches.list(limit=20)\nfor b in batches:\n    print(f\"ID: {b.id} | Status: {b.processing_status} | \"\n          f\"Total: {b.request_counts.total} | \"\n          f\"Succeeded: {b.request_counts.succeeded}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBước tiếp theo\u003c\/h2\u003e\n\u003cp\u003eBatch API là công cụ mạnh mẽ để tối ưu chi phí khi làm việc với Claude API ở quy mô lớn. Kết hợp với Prompt Caching để giảm thêm chi phí input token, hoặc sử dụng model cascade (bắt đầu với Haiku cho tác vụ đơn giản, nâng lên Sonnet cho tác vụ phức tạp) để tối ưu hóa ngân sách AI của bạn. Khám phá thêm tại \u003ca href=\"\/collections\/ung-dung\"\u003eThư viện Ứng dụng Claude\u003c\/a\u003e.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47730150506708,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/claude-batch-api-x_-ly-hang-lo_t-v_i-chi-phi-gi_m-50.jpg?v=1774715503","url":"https:\/\/claude.vn\/products\/claude-batch-api-x%e1%bb%ad-ly-hang-lo%e1%ba%a1t-v%e1%bb%9bi-chi-phi-gi%e1%ba%a3m-50","provider":"CLAUDE.VN","version":"1.0","type":"link"}