Python 88.3%
TypeScript 7.6%
Shell 4.1%
1// Message Batches lifecycle with the official TypeScript SDK.2// STATUS: LIVE_VERIFIED 2026-09-18 (identical HTTP sequence executed via scripts/live.py; SDK calls map 1:1).3// Model: claude-haiku-4-5-20251001, max_tokens 8 (~$0.0001 at 50 % batch pricing).4// Run: node --env-file=.env --experimental-strip-types examples/anthropic/batch/batch_lifecycle.ts5import Anthropic from "@anthropic-ai/sdk";67const MODEL = "claude-haiku-4-5-20251001";8const client = new Anthropic(); // reads ANTHROPIC_API_KEY9const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));10const req = (custom_id: string, model: string) => ({11 custom_id,12 params: { model, max_tokens: 8, messages: [{ role: "user" as const, content: "Reply with OK." }] },13});1415// 1. create — invalid model is accepted here and becomes an `errored` result16let batch = await client.messages.batches.create({ requests: [req("ok-1", MODEL), req("bad-model-1", "claude-does-not-exist-1")] });17console.log("created", batch.id, batch.processing_status, batch.request_counts);1819// 2. list (auto-paginating async iterator) / retrieve20for await (const b of client.messages.batches.list({ limit: 1 })) { console.log("list ->", b.id); break; }2122// 3. poll (every 20 s, ≤ 5 min). Observed ~100 s for 2 requests.23const t0 = Date.now();24while (batch.processing_status !== "ended" && Date.now() - t0 < 300_000) {25 await sleep(20_000);26 batch = await client.messages.batches.retrieve(batch.id);27 console.log(` ${Math.round((Date.now() - t0) / 1000)}s ${batch.processing_status}`, batch.request_counts);28}2930// 4. results — JSONL stream, unordered31for await (const entry of await client.messages.batches.results(batch.id)) {32 const r = entry.result;33 if (r.type === "succeeded") console.log(entry.custom_id, "succeeded", r.message.usage.service_tier);34 else if (r.type === "errored") console.log(entry.custom_id, "errored", r.error.error.type);35 else console.log(entry.custom_id, r.type); // canceled | expired36}3738// 5. delete (400 while in_progress/canceling)39console.log("delete", (await client.messages.batches.delete(batch.id)).type);4041// 6. cancel path42let b2 = await client.messages.batches.create({ requests: [req("cancel-1", MODEL)] });43b2 = await client.messages.batches.cancel(b2.id);44console.log("cancel ->", b2.processing_status, b2.cancel_initiated_at);45const t1 = Date.now();46while (b2.processing_status !== "ended" && Date.now() - t1 < 240_000) { await sleep(15_000); b2 = await client.messages.batches.retrieve(b2.id); }47console.log("after cancel", b2.request_counts);48console.log("delete #2", (await client.messages.batches.delete(b2.id)).type);49