Skip to content
Batchwork
Esc
navigateopen⌘Jpreview
On this page

Text

Batch thousands of chat and text completions with batch() — author each request like the AI SDK's generateText, correlated by customId.

Submit a text batch

batch() is the core entry point: pass any AI SDK language model and a list of requests authored like generateText, and it returns a BatchJob handle immediately. Each request produces one text completion, correlated by customId.

import { batch } from "batchwork";
import { anthropic } from "@ai-sdk/anthropic";

const job = await batch({
  model: anthropic("claude-opus-4-8"),
  requests: [
    { customId: "doc-1", prompt: "Summarize…", temperature: 0 },
    {
      customId: "doc-2",
      system: "You are terse.",
      messages: [{ role: "user", content: "Translate…" }],
      maxOutputTokens: 256,
    },
  ],
});

Text batches are supported by every provider Batchwork supports. Everything on the job handle works the same — wait(), poll(), results(), collect(), and cancel() — as does rehydration with getBatch / getBatchResults / cancelBatch.

Request shape

Each request mirrors generateText (minus model), plus a customId used to correlate its result. Provide prompt or messages.

Field Notes
customId Correlates the result. Auto-generated as request-<index> if omitted; must be unique within a batch.
prompt / messages Provide one. messages is the AI SDK ModelMessage[].
system System prompt.
tools / toolChoice Tool definitions, exactly as in generateText.
maxOutputTokens Maximum tokens to generate. Required by Anthropic.
temperature, topP, topK Sampling controls.
presencePenalty, frequencyPenalty Penalties.
stopSequences, seed Stop sequences and seed.
providerOptions Provider-specific options (e.g. reasoning / thinking config).

Batch-level options — defaults, metadata, and limits — apply to every batch function, including this one.

OpenAI request shapes

OpenAI exposes several request shapes, and Batchwork mirrors whichever the model implies:

Model Batch endpoint
openai.chat("…") /v1/chat/completions
openai("…") / openai.responses("…") /v1/responses
openai.completion("…") /v1/completions

A "openai/…" string defaults to chat completions — the most widely supported batch endpoint.

Results

Text batches reuse the normalized BatchResult. The generated text lands on result.text; read the full provider payload — tool calls, structured output, finish reasons — from result.response.

for await (const result of job.results()) {
  if (result.status === "succeeded") {
    save(result.customId, result.text, result.usage);
  } else if (result.status === "errored") {
    console.error(result.customId, result.error?.message);
  }
}

usage is normalized to { inputTokens, outputTokens, totalTokens }, billed at the batch rate (~50% off).

How it’s built

Like batch.images() and batch.embeddings(), batch() derives each provider request body by running the AI SDK’s generateText() through a capturing fetch that records the serialized body and aborts before any network call. Every request field generateText accepts — system, messages, tools, multimodal content, providerOptions — carries through unchanged.

Batchwork serializes the request only; it does not run generateText’s response side, so there is no automatic multi-step tool execution and no generateObject-style parsing. You get the raw model output back — read tool calls or structured output from result.response yourself.

Was this page helpful?