LLMのバッチ処理は安い一方、プロバイダごとにAPIの形が違い、実装の手間がかかります。
Hayden Bleasel氏が2026年6月16日に公開した「Batchwork」は、OpenAIやAnthropicなど7社のバッチAPIを1つのTypeScriptインターフェースにまとめたOSSです。Vercel AI SDKのgenerateTextと同じリクエスト形式のまま、JSONLの生成・アップロード・ポーリング・結果パースまでを任せられます。
この記事でわかること
- Batchworkが解決する課題と、各プロバイダのバッチAPIの違い
- 対応プロバイダと、約50%のコスト削減が得られる仕組み
- 基本的な使い方と、本番運用向けのサーバー機能
- 類似ツールとの違いと、導入時の注意点
バッチAPIは安いが、プロバイダごとに実装がバラバラ
OpenAI、Anthropic、Google Geminiなど主要プロバイダは、リアルタイムAPIよりおおよそ半額のバッチAPIを提供しています。大量の要約や分類など、即時応答が不要な処理に向いています。
ただし各社のAPI仕様は統一されていません。OpenAIはリクエストをJSONLファイルにまとめ、Files APIでアップロードしてからバッチジョブを作成します。AnthropicはインラインのJSON配列で送る方式です。いずれも結果はcustom_idで紐づけられますが、返却順序は保証されず、完了までポーリングが必要です。
Vercel AI SDKは同期生成を統一していますが、バッチ処理には対応していません。そのため今まで、プロバイダを切り替えるたびにアップロードやポーリングのコードを書き直す必要がありました。
Batchworkが提供する解決策
Batchworkは、上記のプロバイダ固有処理を1つのbatch()呼び出しに集約するライブラリです。npmパッケージ名はbatchwork、ライセンスはMIT、Node.js 20以上が必要です。2026年6月16日にv1.0.0が公開され、同日にセキュリティ修正を含むv1.0.1がリリースされています。
コアの依存はaiパッケージのみです。@ai-sdk/openaiや@ai-sdk/anthropicなどのプロバイダパッケージはオプションのピア依存として、使うプロバイダだけをインストールします。
対応プロバイダと主な機能
Batchworkが対応するのは次の7社です。
- OpenAI
- Anthropic
- Google Gemini
- Groq
- Mistral
- Together AI
- xAI
リクエストはAI SDKのgenerateTextと同じ形で書けます。promptだけの単純な指定も、messages配列を使う会話形式もそのまま渡せます。各リクエストにcustomIdを付け、返ってきた結果を同じIDで突き合わせます。
返却されるBatchResultはプロバイダに依存しない統一形式です。status、text、usage、エラー情報が揃っており、失敗したリクエストだけを再処理するといった運用もしやすくなっています。
料金面では、各プロバイダのバッチ料金がそのまま適用されます。Batchwork自体に追加の利用料はなく、公式ドキュメントでも「約50%のコスト削減」と説明されています。これは各社バッチAPIの標準的な割引率に基づく表現です。
基本的な使い方
インストールは次のとおりです。
npm install batchwork
npm install @ai-sdk/openai @ai-sdk/anthropic
コード例は次の形になります。
import { batch } from "batchwork";
import { openai } from "@ai-sdk/openai";
const job = await batch({
model: openai.chat("gpt-5.5"),
requests: [
{ customId: "a", prompt: "Summarize: …" },
{ customId: "b", messages: [{ role: "user", content: "Translate: …" }] },
],
});
const results = await job.wait().then(() => job.collect());
for (const r of results) {
console.log(r.customId, r.status, r.text);
}
batch()を呼ぶと、Batchworkがプロバイダ向けのJSONL生成、ファイルアップロード、ジョブ投入を内部で行います。job.wait()で完了を待ち、job.collect()またはjob.results()で結果を取得します。モデル指定はopenai.chat("gpt-5.5")のようなAI SDKオブジェクトでも、"anthropic/claude-opus-4-8"のような文字列でも受け付けます。
本番運用向けのサーバー機能
スクリプトでの一括処理だけでなく、本番環境向けのオプション層も用意されています。
batchwork/serverのマネージドポーラーは、バッチ完了時に署名付きWebhookを1回だけ送ります。OpenAIはネイティブWebhookに対応しており、それ以外のプロバイダは同じAPIの裏でポーリングされます。アプリ側で長時間の待機ループを書く必要がありません。
状態の永続化には、Postgres用のbatchwork/postgresとUpstash Redis用のbatchwork/redisアダプタが提供されています。プロバイダのバッチIDだけを保存しておけば、別プロセスから再接続して結果を取得する「rehydration」にも対応しています。
Next.js向けには、Cron用のGETハンドラとWebhook用のPOSTハンドラをエクスポートするルートヘルパーもあります。v1.0.1では、Cronルートへの認可チェックやWebhook署名検証の強化など、セキュリティ面の修正が多数入っています。
類似ツールとの違い
LLMバッチ処理を扱うOSSは他にもあります。Python向けのLangBatchやBatchataは、複数プロバイダのバッチAPIを統一する点で近いです。BatchLLMはCSVやJSONLを並列処理するCLIツールで、OpenAI互換API全般に対応します。
Batchworkの特徴は、TypeScriptとVercel AI SDKエコシステムに深く統合されている点です。既にgenerateTextで書いているコードをほぼそのままバッチに流せるため、AI SDK利用者にとって移行コストが低くなります。サーバー層とNext.js連携まで含めた一貫した設計も、他ツールとの差別化になっています。
導入時の注意点
BatchworkはバッチAPIのラッパーであり、各プロバイダの制約はそのまま残ります。バッチ処理は非同期で、完了まで数時間かかる場合があります。リアルタイム応答が必要な用途には向きません。
対応言語はTypeScript(Node.js)に限定されています。Python中心のプロジェクトでは、言語が合う別ツールの方が適しています。
プロジェクトは2026年6月に公開されたばかりで、npmの公開バージョンはv1.0.1です。本番投入前に、対象プロバイダでの動作確認とエラーハンドリングのテストを行うのがよいでしょう。
どんな開発者に向くか
Batchworkは「安いバッチAPIを使いたいが、プロバイダごとの実装差に悩んでいる」開発者向けのツールです。7社対応、AI SDK互換のリクエスト形式、JSONL処理の自動化という3点が揃っており、大量のLLMリクエストを扱うバックエンドやデータパイプラインの実装負荷を下げます。詳細は公式サイト batchwork.dev とGitHubリポジトリで確認できます。
