batchwork 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,6 +23,7 @@ class MissingDependencyError extends BatchworkError {
23
23
  }
24
24
 
25
25
  // src/job.ts
26
+ var WAIT_ABORTED_MESSAGE = "batchwork: wait aborted.";
26
27
  var DEFAULT_POLL_INTERVAL_MS = 15000;
27
28
  var TERMINAL_STATUSES = new Set([
28
29
  "completed",
@@ -33,13 +34,13 @@ var TERMINAL_STATUSES = new Set([
33
34
  var isTerminalStatus = (status) => TERMINAL_STATUSES.has(status);
34
35
  var delay = (ms, signal) => new Promise((resolve, reject) => {
35
36
  if (signal?.aborted) {
36
- reject(new BatchworkError("batchwork: wait aborted."));
37
+ reject(new BatchworkError(WAIT_ABORTED_MESSAGE));
37
38
  return;
38
39
  }
39
40
  let timer;
40
41
  const onAbort = () => {
41
42
  clearTimeout(timer);
42
- reject(new BatchworkError("batchwork: wait aborted."));
43
+ reject(new BatchworkError(WAIT_ABORTED_MESSAGE));
43
44
  };
44
45
  timer = setTimeout(() => {
45
46
  signal?.removeEventListener("abort", onAbort);
@@ -81,7 +82,7 @@ class BatchJob {
81
82
  options.onPoll?.(snapshot);
82
83
  while (!isTerminalStatus(snapshot.status)) {
83
84
  if (options.signal?.aborted) {
84
- throw new BatchworkError("batchwork: wait aborted.");
85
+ throw new BatchworkError(WAIT_ABORTED_MESSAGE);
85
86
  }
86
87
  if (deadline !== undefined && Date.now() > deadline) {
87
88
  throw new BatchworkError(`batchwork: timed out waiting for batch "${this.id}".`);
@@ -429,7 +430,13 @@ var normalizeSnapshot = (raw) => {
429
430
  };
430
431
  };
431
432
  var textFromMessage = (message) => {
432
- const text = asArray(asRecord(message).content).map((block) => asRecord(block)).filter((block) => block.type === "text").map((block) => asString(block.text) ?? "").join("");
433
+ let text = "";
434
+ for (const item of asArray(asRecord(message).content)) {
435
+ const block = asRecord(item);
436
+ if (block.type === "text") {
437
+ text += asString(block.text) ?? "";
438
+ }
439
+ }
433
440
  return text.length > 0 ? text : undefined;
434
441
  };
435
442
  var usageFromMessage = (message) => {
@@ -534,6 +541,7 @@ var anthropicAdapter = {
534
541
 
535
542
  // src/providers/google.ts
536
543
  var GOOGLE_BASE = "https://generativelanguage.googleapis.com/v1beta";
544
+ var OPERATION_ID_LABEL = "Google operation id";
537
545
  var GOOGLE_BATCH_PREFIX = "batches";
538
546
  var apiKey2 = (credentials) => {
539
547
  const key = credentials.apiKey ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY ?? process.env.GEMINI_API_KEY;
@@ -594,7 +602,7 @@ var normalizeSnapshot2 = (raw) => {
594
602
  const failed = items.filter((item) => asRecord(item).error).length;
595
603
  const id = asString(obj.name) ?? "";
596
604
  return {
597
- id: id ? assertPrefixedProviderId("Google operation id", id, GOOGLE_BATCH_PREFIX) : "",
605
+ id: id ? assertPrefixedProviderId(OPERATION_ID_LABEL, id, GOOGLE_BATCH_PREFIX) : "",
598
606
  provider: "google",
599
607
  raw,
600
608
  requestCounts: {
@@ -611,6 +619,20 @@ var textFromResponse = (response) => {
611
619
  return text.length > 0 ? text : undefined;
612
620
  };
613
621
  var embeddingFromResponse = (response) => asNumberArray(asRecord(asRecord(response).embedding).values);
622
+ var imagesFromResponse = (response) => {
623
+ const candidate = asRecord(asArray(asRecord(response).candidates)[0]);
624
+ const images = [];
625
+ for (const part of asArray(asRecord(candidate.content).parts)) {
626
+ const partObj = asRecord(part);
627
+ const inline = asRecord(partObj.inlineData ?? partObj.inline_data);
628
+ const data = asString(inline.data);
629
+ const mediaType = asString(inline.mimeType) ?? asString(inline.mime_type);
630
+ if (data && mediaType?.startsWith("image/")) {
631
+ images.push({ data, mediaType });
632
+ }
633
+ }
634
+ return images.length > 0 ? images : undefined;
635
+ };
614
636
  var usageFromResponse = (response) => {
615
637
  const usage = asRecord(asRecord(response).usageMetadata);
616
638
  const inputTokens = asNumber(usage.promptTokenCount);
@@ -644,6 +666,7 @@ var normalizeResult2 = (item) => {
644
666
  return {
645
667
  customId,
646
668
  embedding: embeddingFromResponse(obj.response),
669
+ images: imagesFromResponse(obj.response),
647
670
  response: obj.response,
648
671
  status: "succeeded",
649
672
  text: textFromResponse(obj.response),
@@ -696,18 +719,19 @@ var submit2 = async (input) => {
696
719
  return normalizeSnapshot2(raw);
697
720
  };
698
721
  var retrieve2 = async (id, credentials) => {
699
- const operationId = assertPrefixedProviderId("Google operation id", id, GOOGLE_BATCH_PREFIX);
722
+ const operationId = assertPrefixedProviderId(OPERATION_ID_LABEL, id, GOOGLE_BATCH_PREFIX);
700
723
  const raw = await requestJson(`${baseUrl2(credentials)}/${operationId}`, {
701
724
  headers: headers2(credentials)
702
725
  });
703
726
  return normalizeSnapshot2(raw);
704
727
  };
728
+ var fileNameFrom = (value) => asString(asRecord(value).name) ?? asString(value);
705
729
  async function* results2(id, credentials) {
706
730
  const snapshot = await retrieve2(id, credentials);
707
731
  const raw = asRecord(snapshot.raw);
708
732
  const response = asRecord(raw.response);
709
733
  const dest = asRecord(raw.dest);
710
- const responsesFile = asString(asRecord(response.responsesFile).name) ?? asString(response.responsesFile) ?? asString(asRecord(response.responses_file).name) ?? asString(response.responses_file) ?? asString(dest.fileName) ?? asString(dest.file_name);
734
+ const responsesFile = fileNameFrom(response.responsesFile) ?? fileNameFrom(response.responses_file) ?? asString(dest.fileName) ?? asString(dest.file_name);
711
735
  if (responsesFile) {
712
736
  throw new BatchworkError(`batchwork: batch "${id}" returned file-mode results, which are not supported yet.`);
713
737
  }
@@ -720,7 +744,7 @@ async function* results2(id, credentials) {
720
744
  }
721
745
  }
722
746
  var cancel2 = async (id, credentials) => {
723
- const operationId = assertPrefixedProviderId("Google operation id", id, GOOGLE_BATCH_PREFIX);
747
+ const operationId = assertPrefixedProviderId(OPERATION_ID_LABEL, id, GOOGLE_BATCH_PREFIX);
724
748
  await requestJson(`${baseUrl2(credentials)}/${operationId}:cancel`, {
725
749
  headers: headers2(credentials),
726
750
  method: "POST"
@@ -762,6 +786,18 @@ var embeddingFromBody = (body) => {
762
786
  }
763
787
  return asNumberArray(asRecord(data[0]).embedding);
764
788
  };
789
+ var imagesFromBody = (body) => {
790
+ const obj = asRecord(body);
791
+ const mediaType = `image/${asString(obj.output_format) ?? "png"}`;
792
+ const images = [];
793
+ for (const item of asArray(obj.data)) {
794
+ const b64 = asString(asRecord(item).b64_json);
795
+ if (b64) {
796
+ images.push({ data: b64, mediaType });
797
+ }
798
+ }
799
+ return images.length > 0 ? images : undefined;
800
+ };
765
801
  var usageFromBody = (body) => {
766
802
  const usage = asRecord(asRecord(body).usage);
767
803
  const inputTokens = asNumber(usage.prompt_tokens) ?? asNumber(usage.input_tokens);
@@ -803,6 +839,7 @@ var normalizeOpenAIResult = (line) => {
803
839
  return {
804
840
  customId,
805
841
  embedding: embeddingFromBody(response.body),
842
+ images: imagesFromBody(response.body),
806
843
  response: response.body,
807
844
  status: "succeeded",
808
845
  text: textFromBody(response.body),
@@ -965,6 +1002,7 @@ var groqAdapter = createOpenAICompatibleAdapter({
965
1002
 
966
1003
  // src/providers/mistral.ts
967
1004
  var MISTRAL_BASE = "https://api.mistral.ai/v1";
1005
+ var JOB_ID_LABEL = "Mistral job id";
968
1006
  var apiKey3 = (credentials) => resolveApiKey(credentials, "MISTRAL_API_KEY", "Mistral");
969
1007
  var baseUrl3 = (credentials) => credentials.baseURL ?? MISTRAL_BASE;
970
1008
  var authHeaders = (credentials) => ({
@@ -1004,7 +1042,7 @@ var normalizeSnapshot4 = (raw) => {
1004
1042
  return {
1005
1043
  completedAt: toDate(obj.completed_at),
1006
1044
  createdAt: toDate(obj.created_at),
1007
- id: id ? assertSimpleProviderId("Mistral job id", id) : "",
1045
+ id: id ? assertSimpleProviderId(JOB_ID_LABEL, id) : "",
1008
1046
  provider: "mistral",
1009
1047
  raw,
1010
1048
  requestCounts: {
@@ -1038,7 +1076,7 @@ var submit3 = async (input) => {
1038
1076
  return normalizeSnapshot4(raw);
1039
1077
  };
1040
1078
  var retrieve3 = async (id, credentials) => {
1041
- const jobId = assertSimpleProviderId("Mistral job id", id);
1079
+ const jobId = assertSimpleProviderId(JOB_ID_LABEL, id);
1042
1080
  const raw = await requestJson(`${baseUrl3(credentials)}/batch/jobs/${jobId}`, {
1043
1081
  headers: authHeaders(credentials)
1044
1082
  });
@@ -1061,7 +1099,7 @@ async function* results3(id, credentials) {
1061
1099
  }
1062
1100
  }
1063
1101
  var cancel3 = async (id, credentials) => {
1064
- const jobId = assertSimpleProviderId("Mistral job id", id);
1102
+ const jobId = assertSimpleProviderId(JOB_ID_LABEL, id);
1065
1103
  await requestJson(`${baseUrl3(credentials)}/batch/jobs/${jobId}/cancel`, {
1066
1104
  headers: authHeaders(credentials),
1067
1105
  method: "POST"
@@ -1097,14 +1135,46 @@ var parseIpv4 = (host) => {
1097
1135
  };
1098
1136
  var isPrivateIpv4 = (parts) => {
1099
1137
  const [a = 0, b = 0] = parts;
1100
- return a === 0 || a === 10 || a === 127 || a === 100 && b >= 64 && b <= 127 || a === 169 && b === 254 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168 || a === 198 && (b === 18 || b === 19) || a >= 224;
1138
+ if (a === 0 || a === 10 || a === 127 || a >= 224) {
1139
+ return true;
1140
+ }
1141
+ switch (a) {
1142
+ case 100: {
1143
+ return b >= 64 && b <= 127;
1144
+ }
1145
+ case 169: {
1146
+ return b === 254;
1147
+ }
1148
+ case 172: {
1149
+ return b >= 16 && b <= 31;
1150
+ }
1151
+ case 192: {
1152
+ return b === 168;
1153
+ }
1154
+ case 198: {
1155
+ return b === 18 || b === 19;
1156
+ }
1157
+ default: {
1158
+ return false;
1159
+ }
1160
+ }
1101
1161
  };
1102
1162
  var isPrivateIpv6 = (host) => {
1103
1163
  const normalized = host.replace(/^\[/u, "").replace(/\]$/u, "").toLowerCase();
1104
1164
  if (!normalized.includes(":")) {
1105
1165
  return false;
1106
1166
  }
1107
- return normalized === "::" || normalized === "::1" || normalized.startsWith("fc") || normalized.startsWith("fd") || normalized.startsWith("fe80:");
1167
+ if (normalized === "::" || normalized === "::1") {
1168
+ return true;
1169
+ }
1170
+ return normalized.startsWith("fc") || normalized.startsWith("fd") || normalized.startsWith("fe80:");
1171
+ };
1172
+ var isPrivateHost = (host) => {
1173
+ if (host === "localhost" || host.endsWith(".localhost") || host.endsWith(".local")) {
1174
+ return true;
1175
+ }
1176
+ const ipv4 = parseIpv4(host);
1177
+ return (ipv4 ? isPrivateIpv4(ipv4) : false) || isPrivateIpv6(host);
1108
1178
  };
1109
1179
  var validateUploadLocation = (location) => {
1110
1180
  let url;
@@ -1119,9 +1189,7 @@ var validateUploadLocation = (location) => {
1119
1189
  if (url.username || url.password) {
1120
1190
  throw new BatchworkError("batchwork: Together upload Location must not include credentials.");
1121
1191
  }
1122
- const host = url.hostname.toLowerCase();
1123
- const ipv4 = parseIpv4(host);
1124
- if (host === "localhost" || host.endsWith(".localhost") || host.endsWith(".local") || ipv4 && isPrivateIpv4(ipv4) || isPrivateIpv6(host)) {
1192
+ if (isPrivateHost(url.hostname.toLowerCase())) {
1125
1193
  throw new BatchworkError("batchwork: Together upload Location must not target localhost or private networks.");
1126
1194
  }
1127
1195
  return url.toString();
@@ -1170,6 +1238,7 @@ var togetherAdapter = createOpenAICompatibleAdapter({
1170
1238
 
1171
1239
  // src/providers/xai.ts
1172
1240
  var XAI_BASE = "https://api.x.ai/v1";
1241
+ var BATCH_ID_LABEL = "xAI batch id";
1173
1242
  var RESULTS_PAGE_SIZE = 100;
1174
1243
  var apiKey4 = (credentials) => resolveApiKey(credentials, "XAI_API_KEY", "xAI");
1175
1244
  var baseUrl4 = (credentials) => credentials.baseURL ?? XAI_BASE;
@@ -1203,7 +1272,7 @@ var normalizeSnapshot5 = (raw) => {
1203
1272
  completedAt: toDate(obj.finish_time ?? obj.completed_at),
1204
1273
  createdAt: toDate(obj.create_time),
1205
1274
  expiresAt: toDate(obj.expire_time ?? obj.expires_at),
1206
- id: id ? assertSimpleProviderId("xAI batch id", id) : "",
1275
+ id: id ? assertSimpleProviderId(BATCH_ID_LABEL, id) : "",
1207
1276
  provider: "xai",
1208
1277
  raw,
1209
1278
  requestCounts: {
@@ -1216,6 +1285,24 @@ var normalizeSnapshot5 = (raw) => {
1216
1285
  status: deriveStatus(state)
1217
1286
  };
1218
1287
  };
1288
+ var imagesFromXaiCompletion = (completion) => {
1289
+ const obj = asRecord(completion);
1290
+ const entries = asArray(obj.data);
1291
+ const sources = entries.length > 0 ? entries : [obj];
1292
+ const images = [];
1293
+ for (const source of sources) {
1294
+ const record = asRecord(source);
1295
+ const data = asString(record.base64) ?? asString(record.b64_json);
1296
+ const url = asString(record.url);
1297
+ if (data || url) {
1298
+ images.push({
1299
+ ...data ? { data } : {},
1300
+ ...url ? { url } : {}
1301
+ });
1302
+ }
1303
+ }
1304
+ return images.length > 0 ? images : undefined;
1305
+ };
1219
1306
  var normalizeResult3 = (item) => {
1220
1307
  const obj = asRecord(item);
1221
1308
  const customId = asString(obj.batch_request_id) ?? "";
@@ -1237,6 +1324,7 @@ var normalizeResult3 = (item) => {
1237
1324
  const completion = response.chat_get_completion ?? Object.values(response)[0];
1238
1325
  return {
1239
1326
  customId,
1327
+ images: imagesFromXaiCompletion(completion),
1240
1328
  response: completion,
1241
1329
  status: "succeeded",
1242
1330
  text: textFromBody(completion),
@@ -1263,14 +1351,14 @@ var submit4 = async (input) => {
1263
1351
  return normalizeSnapshot5(raw);
1264
1352
  };
1265
1353
  var retrieve4 = async (id, credentials) => {
1266
- const batchId = assertSimpleProviderId("xAI batch id", id);
1354
+ const batchId = assertSimpleProviderId(BATCH_ID_LABEL, id);
1267
1355
  const raw = await requestJson(`${baseUrl4(credentials)}/batches/${batchId}`, {
1268
1356
  headers: authHeaders2(credentials)
1269
1357
  });
1270
1358
  return normalizeSnapshot5(raw);
1271
1359
  };
1272
1360
  async function* results4(id, credentials) {
1273
- const batchId = assertSimpleProviderId("xAI batch id", id);
1361
+ const batchId = assertSimpleProviderId(BATCH_ID_LABEL, id);
1274
1362
  const headers3 = authHeaders2(credentials);
1275
1363
  let token;
1276
1364
  do {
@@ -1287,7 +1375,7 @@ async function* results4(id, credentials) {
1287
1375
  } while (token);
1288
1376
  }
1289
1377
  var cancel4 = async (id, credentials) => {
1290
- const batchId = assertSimpleProviderId("xAI batch id", id);
1378
+ const batchId = assertSimpleProviderId(BATCH_ID_LABEL, id);
1291
1379
  await requestJson(`${baseUrl4(credentials)}/batches/${batchId}:cancel`, {
1292
1380
  headers: authHeaders2(credentials),
1293
1381
  method: "POST"
@@ -1315,5 +1403,5 @@ var getAdapter = (provider) => adapters[provider];
1315
1403
 
1316
1404
  export { BatchworkError, UnsupportedProviderError, MissingDependencyError, resolveBatchLimits, assertByteLength, mapWithConcurrency, isTerminalStatus, BatchJob, getAdapter };
1317
1405
 
1318
- //# debugId=A771CB719D6F2AEA64756E2164756E21
1319
- //# sourceMappingURL=chunk-xtk2ycy6.js.map
1406
+ //# debugId=032D6B4F83FC26F964756E2164756E21
1407
+ //# sourceMappingURL=chunk-jvrfwjwq.js.map
@@ -0,0 +1,27 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/errors.ts", "../src/job.ts", "../src/limits.ts", "../src/http.ts", "../src/jsonl.ts", "../src/payload.ts", "../src/util.ts", "../src/providers/ids.ts", "../src/providers/anthropic.ts", "../src/providers/google.ts", "../src/providers/shared.ts", "../src/providers/openai-compatible.ts", "../src/providers/groq.ts", "../src/providers/mistral.ts", "../src/providers/openai.ts", "../src/providers/together.ts", "../src/providers/xai.ts", "../src/providers/index.ts"],
4
+ "sourcesContent": [
5
+ "// oxlint-disable max-classes-per-file -- the error hierarchy is co-located by design.\n\n/** Base error for all batchwork failures. */\nexport class BatchworkError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"BatchworkError\";\n }\n}\n\n/** Thrown when a model resolves to a provider without a batch adapter. */\nexport class UnsupportedProviderError extends BatchworkError {\n readonly provider: string;\n\n constructor(provider: string, detail?: string) {\n super(\n detail ??\n `batchwork: provider \"${provider}\" is not supported yet. Supported providers: openai, anthropic, google, groq, mistral, together, xai.`\n );\n this.name = \"UnsupportedProviderError\";\n this.provider = provider;\n }\n}\n\n/** Thrown when an optional provider package is not installed. */\nexport class MissingDependencyError extends BatchworkError {\n constructor(pkg: string, provider: string) {\n super(\n `batchwork: install \\`${pkg}\\` to batch ${provider} models (\\`npm install ${pkg}\\`).`\n );\n this.name = \"MissingDependencyError\";\n }\n}\n",
6
+ "import { BatchworkError } from \"./errors\";\nimport type { BatchAdapter } from \"./providers/adapter\";\nimport type {\n BatchProvider,\n BatchRequestCounts,\n BatchResult,\n BatchSnapshot,\n BatchStatus,\n ProviderCredentials,\n WaitOptions,\n} from \"./types\";\n\nconst WAIT_ABORTED_MESSAGE = \"batchwork: wait aborted.\";\nconst DEFAULT_POLL_INTERVAL_MS = 15_000;\n\nconst TERMINAL_STATUSES: ReadonlySet<BatchStatus> = new Set<BatchStatus>([\n \"completed\",\n \"failed\",\n \"expired\",\n \"cancelled\",\n]);\n\n/** Whether a status means the batch has finished processing. */\nexport const isTerminalStatus = (status: BatchStatus): boolean =>\n TERMINAL_STATUSES.has(status);\n\nconst delay = (ms: number, signal?: AbortSignal): Promise<void> =>\n // oxlint-disable-next-line promise/avoid-new -- wrapping the callback-based setTimeout.\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new BatchworkError(WAIT_ABORTED_MESSAGE));\n return;\n }\n // oxlint-disable-next-line prefer-const -- assigned below, after `onAbort` closes over it.\n let timer: ReturnType<typeof setTimeout>;\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new BatchworkError(WAIT_ABORTED_MESSAGE));\n };\n timer = setTimeout(() => {\n // Detach so a reused signal (one per poll across a long wait) doesn't\n // accumulate listeners that only fire on abort.\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n/**\n * A handle to a submitted batch. Returned by `batch()` and `getBatch()`. Use it\n * to poll status, wait for completion, stream results, or cancel.\n */\nexport class BatchJob {\n readonly provider: BatchProvider;\n readonly id: string;\n\n readonly #adapter: BatchAdapter;\n readonly #credentials: ProviderCredentials;\n #snapshot: BatchSnapshot;\n\n constructor(\n adapter: BatchAdapter,\n credentials: ProviderCredentials,\n snapshot: BatchSnapshot\n ) {\n this.#adapter = adapter;\n this.#credentials = credentials;\n this.#snapshot = snapshot;\n this.id = snapshot.id;\n this.provider = snapshot.provider;\n }\n\n /** The most recently observed status. */\n get status(): BatchStatus {\n return this.#snapshot.status;\n }\n\n /** The most recently observed per-request tallies. */\n get requestCounts(): BatchRequestCounts {\n return this.#snapshot.requestCounts;\n }\n\n /** The most recently observed snapshot. */\n get snapshot(): BatchSnapshot {\n return this.#snapshot;\n }\n\n /** Refresh the status from the provider and return the new snapshot. */\n async poll(): Promise<BatchSnapshot> {\n this.#snapshot = await this.#adapter.retrieve(this.id, this.#credentials);\n return this.#snapshot;\n }\n\n /** Poll until the batch reaches a terminal status, then return the snapshot. */\n async wait(options: WaitOptions = {}): Promise<BatchSnapshot> {\n const interval = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const deadline = options.timeoutMs\n ? Date.now() + options.timeoutMs\n : undefined;\n\n let snapshot = await this.poll();\n options.onPoll?.(snapshot);\n\n while (!isTerminalStatus(snapshot.status)) {\n if (options.signal?.aborted) {\n throw new BatchworkError(WAIT_ABORTED_MESSAGE);\n }\n if (deadline !== undefined && Date.now() > deadline) {\n throw new BatchworkError(\n `batchwork: timed out waiting for batch \"${this.id}\".`\n );\n }\n // oxlint-disable-next-line no-await-in-loop, react-doctor/async-await-in-loop -- polling is inherently sequential.\n await delay(interval, options.signal);\n // oxlint-disable-next-line no-await-in-loop, react-doctor/async-await-in-loop -- polling is inherently sequential.\n snapshot = await this.poll();\n options.onPoll?.(snapshot);\n }\n\n return snapshot;\n }\n\n /** Stream normalized results as they are read. Order is not guaranteed. */\n results(): AsyncGenerator<BatchResult> {\n return this.#adapter.results(this.id, this.#credentials);\n }\n\n /** Collect all results into an array, keyed by `customId`. */\n async collect(): Promise<BatchResult[]> {\n const out: BatchResult[] = [];\n for await (const result of this.results()) {\n out.push(result);\n }\n return out;\n }\n\n /** Request cancellation, then refresh status. */\n async cancel(): Promise<BatchSnapshot> {\n await this.#adapter.cancel(this.id, this.#credentials);\n return await this.poll();\n }\n}\n",
7
+ "import { BatchworkError } from \"./errors\";\nimport type { BatchLimits } from \"./types\";\n\nexport interface ResolvedBatchLimits {\n captureConcurrency: number;\n maxRequests: number;\n maxRequestBytes: number;\n maxUploadBytes: number;\n}\n\nconst DEFAULT_LIMITS: ResolvedBatchLimits = {\n captureConcurrency: 16,\n maxRequestBytes: 20 * 1024 * 1024,\n maxRequests: 50_000,\n maxUploadBytes: 200 * 1024 * 1024,\n};\n\nconst encoder = new TextEncoder();\n\nconst positiveInteger = (name: string, value: number): number => {\n if (!(Number.isInteger(value) && value > 0)) {\n throw new BatchworkError(\n `batchwork: limits.${name} must be a positive integer.`\n );\n }\n return value;\n};\n\nexport const resolveBatchLimits = (\n limits: BatchLimits | undefined\n): ResolvedBatchLimits => ({\n captureConcurrency: positiveInteger(\n \"captureConcurrency\",\n limits?.captureConcurrency ?? DEFAULT_LIMITS.captureConcurrency\n ),\n maxRequestBytes: positiveInteger(\n \"maxRequestBytes\",\n limits?.maxRequestBytes ?? DEFAULT_LIMITS.maxRequestBytes\n ),\n maxRequests: positiveInteger(\n \"maxRequests\",\n limits?.maxRequests ?? DEFAULT_LIMITS.maxRequests\n ),\n maxUploadBytes: positiveInteger(\n \"maxUploadBytes\",\n limits?.maxUploadBytes ?? DEFAULT_LIMITS.maxUploadBytes\n ),\n});\n\nexport const byteLength = (value: string): number =>\n encoder.encode(value).length;\n\nexport const assertByteCount = (\n label: string,\n bytes: number,\n maxBytes: number\n): void => {\n if (bytes > maxBytes) {\n throw new BatchworkError(\n `batchwork: ${label} is ${bytes} bytes, exceeding the ${maxBytes} byte limit.`\n );\n }\n};\n\nexport const assertByteLength = (\n label: string,\n value: string,\n maxBytes: number\n): void => {\n assertByteCount(label, byteLength(value), maxBytes);\n};\n\nexport const mapWithConcurrency = async <Input, Output>(\n items: readonly Input[],\n concurrency: number,\n mapper: (item: Input) => Promise<Output>\n): Promise<Output[]> => {\n const results = [] as Output[];\n results.length = items.length;\n let nextIndex = 0;\n const workerCount = Math.min(concurrency, items.length);\n\n const runNext = async (): Promise<void> => {\n const index = nextIndex;\n nextIndex += 1;\n if (index >= items.length) {\n return;\n }\n results[index] = await mapper(items[index] as Input);\n await runNext();\n };\n\n await Promise.all(Array.from({ length: workerCount }, () => runNext()));\n return results;\n};\n",
8
+ "import { BatchworkError } from \"./errors\";\n\nconst assertOk = (url: string, init: RequestInit, response: Response) => {\n if (!response.ok) {\n throw new BatchworkError(\n `batchwork: ${init.method ?? \"GET\"} ${url} failed with ${response.status}.`\n );\n }\n};\n\n/** Make a request and parse a JSON response, throwing on non-2xx. */\nexport const requestJson = async <T>(\n url: string,\n init: RequestInit\n): Promise<T> => {\n const response = await fetch(url, init);\n assertOk(url, init, response);\n return (await response.json()) as T;\n};\n\n/** Make a request and return the raw body stream, throwing on non-2xx. */\nexport const requestStream = async (\n url: string,\n init: RequestInit\n): Promise<ReadableStream<Uint8Array>> => {\n const response = await fetch(url, init);\n assertOk(url, init, response);\n if (!response.body) {\n throw new BatchworkError(`batchwork: ${url} returned an empty body.`);\n }\n return response.body;\n};\n",
9
+ "import { BatchworkError } from \"./errors\";\nimport { assertByteCount, byteLength } from \"./limits\";\n\nconst NEWLINE = \"\\n\";\nconst DEFAULT_MAX_JSONL_LINE_BYTES = 20 * 1024 * 1024;\n\nexport interface JsonlParseOptions {\n maxLineBytes?: number;\n}\n\nexport interface JsonlEncodeOptions {\n label?: string;\n maxBytes?: number;\n}\n\nconst NEWLINE_BYTES = byteLength(NEWLINE);\n\nconst resolveMaxLineBytes = (options?: JsonlParseOptions): number => {\n const maxLineBytes = options?.maxLineBytes ?? DEFAULT_MAX_JSONL_LINE_BYTES;\n if (!(Number.isInteger(maxLineBytes) && maxLineBytes > 0)) {\n throw new BatchworkError(\n \"batchwork: JSONL maxLineBytes must be a positive integer.\"\n );\n }\n return maxLineBytes;\n};\n\nconst assertLineSize = (\n line: string,\n lineNumber: number,\n maxLineBytes: number\n): void => {\n const bytes = byteLength(line);\n if (bytes > maxLineBytes) {\n throw new BatchworkError(\n `batchwork: JSONL line ${lineNumber} is ${bytes} bytes, exceeding the ${maxLineBytes} byte limit.`\n );\n }\n};\n\nconst parseLine = <T>(\n line: string,\n lineNumber: number,\n maxLineBytes: number\n): T | undefined => {\n assertLineSize(line, lineNumber, maxLineBytes);\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n return;\n }\n try {\n return JSON.parse(trimmed) as T;\n } catch (error) {\n throw new BatchworkError(\n `batchwork: invalid JSONL at line ${lineNumber}.`,\n { cause: error }\n );\n }\n};\n\nconst resolveMaxBytes = (options?: JsonlEncodeOptions): number | undefined => {\n const maxBytes = options?.maxBytes;\n if (maxBytes !== undefined && !(Number.isInteger(maxBytes) && maxBytes > 0)) {\n throw new BatchworkError(\n \"batchwork: JSONL maxBytes must be a positive integer.\"\n );\n }\n return maxBytes;\n};\n\nexport const encodeJsonl = (\n items: readonly unknown[],\n options?: JsonlEncodeOptions\n): string => {\n if (items.length === 0) {\n return \"\";\n }\n const lines: string[] = [];\n const maxBytes = resolveMaxBytes(options);\n const label = options?.label ?? \"JSONL\";\n let bytes = 0;\n for (const item of items) {\n const line = JSON.stringify(item);\n if (line === undefined) {\n throw new BatchworkError(\n `batchwork: ${label} contains a value that cannot be JSON encoded.`\n );\n }\n bytes += byteLength(line) + NEWLINE_BYTES;\n if (maxBytes !== undefined) {\n assertByteCount(label, bytes, maxBytes);\n }\n lines.push(line);\n }\n return `${lines.join(NEWLINE)}${NEWLINE}`;\n};\n\nexport const parseJsonl = <T = unknown>(\n text: string,\n options?: JsonlParseOptions\n): T[] => {\n const maxLineBytes = resolveMaxLineBytes(options);\n const results: T[] = [];\n const lines = text.split(NEWLINE);\n for (const [index, line] of lines.entries()) {\n const parsed = parseLine<T>(line, index + 1, maxLineBytes);\n if (parsed !== undefined) {\n results.push(parsed);\n }\n }\n return results;\n};\n\nconst isReadableStream = (\n source: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>\n): source is ReadableStream<Uint8Array> =>\n \"getReader\" in source &&\n typeof (source as ReadableStream<Uint8Array>).getReader === \"function\";\n\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nasync function* toByteIterable(\n source: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>\n): AsyncGenerator<Uint8Array> {\n // Prefer an explicit reader: a web `ReadableStream` (e.g. `fetch` response\n // bodies) is not reliably async-iterable at runtime across platforms.\n if (isReadableStream(source)) {\n const reader = source.getReader();\n try {\n let chunk = await reader.read();\n while (!chunk.done) {\n if (chunk.value) {\n yield chunk.value;\n }\n // oxlint-disable-next-line no-await-in-loop, react-doctor/async-await-in-loop -- a stream is read sequentially.\n chunk = await reader.read();\n }\n } finally {\n reader.releaseLock();\n }\n return;\n }\n\n yield* source;\n}\n\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nexport async function* streamJsonl<T = unknown>(\n source: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>,\n options?: JsonlParseOptions\n): AsyncGenerator<T> {\n const decoder = new TextDecoder();\n const maxLineBytes = resolveMaxLineBytes(options);\n let buffer = \"\";\n let lineNumber = 1;\n\n for await (const chunk of toByteIterable(source)) {\n buffer += decoder.decode(chunk, { stream: true });\n let newlineIndex = buffer.indexOf(NEWLINE);\n while (newlineIndex !== -1) {\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n const parsed = parseLine<T>(line, lineNumber, maxLineBytes);\n if (parsed !== undefined) {\n yield parsed;\n }\n lineNumber += 1;\n newlineIndex = buffer.indexOf(NEWLINE);\n }\n assertLineSize(buffer, lineNumber, maxLineBytes);\n }\n\n buffer += decoder.decode();\n const parsed = parseLine<T>(buffer, lineNumber, maxLineBytes);\n if (parsed !== undefined) {\n yield parsed;\n }\n}\n",
10
+ "import { BatchworkError } from \"./errors\";\nimport { assertByteCount, byteLength } from \"./limits\";\n\ninterface JsonArrayPayloadOptions {\n items: readonly unknown[];\n label: string;\n maxBytes: number;\n prefix: string;\n suffix: string;\n}\n\nexport const encodeJsonArrayPayload = ({\n items,\n label,\n maxBytes,\n prefix,\n suffix,\n}: JsonArrayPayloadOptions): string => {\n const encodedItems: string[] = [];\n let bytes = byteLength(prefix) + byteLength(suffix);\n assertByteCount(label, bytes, maxBytes);\n\n for (const [index, item] of items.entries()) {\n const encoded = JSON.stringify(item);\n if (encoded === undefined) {\n throw new BatchworkError(\n `batchwork: ${label} contains a value that cannot be JSON encoded.`\n );\n }\n bytes += byteLength(encoded);\n if (index > 0) {\n bytes += 1;\n }\n assertByteCount(label, bytes, maxBytes);\n encodedItems.push(encoded);\n }\n\n return `${prefix}${encodedItems.join(\",\")}${suffix}`;\n};\n",
11
+ "/** Small, defensive helpers for reading loosely-typed provider JSON. */\n\nexport const asRecord = (value: unknown): Record<string, unknown> => {\n if (typeof value === \"object\" && value !== null) {\n return value as Record<string, unknown>;\n }\n return {};\n};\n\nexport const asString = (value: unknown): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nexport const asNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" ? value : undefined;\n\nexport const asArray = (value: unknown): unknown[] =>\n Array.isArray(value) ? value : [];\n\n/** Read a non-empty array of numbers (e.g. an embedding vector), else undefined. */\nexport const asNumberArray = (value: unknown): number[] | undefined => {\n if (!Array.isArray(value) || value.length === 0) {\n return;\n }\n const numbers = value.filter(\n (item): item is number => typeof item === \"number\"\n );\n return numbers.length === value.length ? numbers : undefined;\n};\n\n/** Return a shallow copy of `obj` without `key`. */\nexport const omit = (\n obj: Record<string, unknown>,\n key: string\n): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k !== key) {\n result[k] = v;\n }\n }\n return result;\n};\n\n// An empty or malformed timestamp yields an `Invalid Date`, which later throws\n// `RangeError` from `.toISOString()` (e.g. when serializing a webhook event).\n// Normalize those to `undefined` so a bad provider value is simply omitted.\nconst validDate = (date: Date): Date | undefined =>\n Number.isNaN(date.getTime()) ? undefined : date;\n\n/** Coerce a provider timestamp (ISO string or unix seconds) to a `Date`. */\nexport const toDate = (value: unknown): Date | undefined => {\n if (typeof value === \"string\") {\n return validDate(new Date(value));\n }\n if (typeof value === \"number\") {\n return validDate(new Date(value * 1000));\n }\n};\n",
12
+ "import { BatchworkError } from \"../errors\";\n\nconst SIMPLE_PROVIDER_ID = /^[A-Za-z0-9_-]+$/u;\n\nexport const assertSimpleProviderId = (label: string, id: string): string => {\n if (!SIMPLE_PROVIDER_ID.test(id)) {\n throw new BatchworkError(`batchwork: invalid ${label}.`);\n }\n return id;\n};\n\nexport const assertPrefixedProviderId = (\n label: string,\n id: string,\n prefix: string\n): string => {\n const [actualPrefix, value, ...rest] = id.split(\"/\");\n if (\n rest.length > 0 ||\n actualPrefix !== prefix ||\n !value ||\n !SIMPLE_PROVIDER_ID.test(value)\n ) {\n throw new BatchworkError(`batchwork: invalid ${label}.`);\n }\n return id;\n};\n",
13
+ "import { BatchworkError } from \"../errors\";\nimport { requestJson, requestStream } from \"../http\";\nimport { streamJsonl } from \"../jsonl\";\nimport { resolveBatchLimits } from \"../limits\";\nimport { encodeJsonArrayPayload } from \"../payload\";\nimport type {\n BatchResult,\n BatchSnapshot,\n BatchStatus,\n BatchUsage,\n ProviderCredentials,\n} from \"../types\";\nimport { asArray, asNumber, asRecord, asString, omit, toDate } from \"../util\";\nimport type { BatchAdapter, SubmitInput } from \"./adapter\";\nimport { assertSimpleProviderId } from \"./ids\";\n\nconst ANTHROPIC_BASE = \"https://api.anthropic.com\";\nconst ANTHROPIC_VERSION = \"2023-06-01\";\n\nconst apiKey = (credentials: ProviderCredentials): string => {\n const key = credentials.apiKey ?? process.env.ANTHROPIC_API_KEY;\n if (!key) {\n throw new BatchworkError(\n \"batchwork: missing Anthropic API key. Set ANTHROPIC_API_KEY or pass `apiKey`.\"\n );\n }\n return key;\n};\n\nconst baseUrl = (credentials: ProviderCredentials): string =>\n credentials.baseURL ?? ANTHROPIC_BASE;\n\nconst validateResultsUrl = (\n rawUrl: string,\n credentials: ProviderCredentials\n): string => {\n let resultsUrl: URL;\n let expectedBase: URL;\n try {\n resultsUrl = new URL(rawUrl);\n expectedBase = new URL(baseUrl(credentials));\n } catch (error) {\n throw new BatchworkError(\"batchwork: invalid Anthropic results_url.\", {\n cause: error,\n });\n }\n if (resultsUrl.origin !== expectedBase.origin) {\n throw new BatchworkError(\n \"batchwork: Anthropic results_url must match the configured API origin.\"\n );\n }\n if (resultsUrl.username || resultsUrl.password) {\n throw new BatchworkError(\n \"batchwork: Anthropic results_url must not include credentials.\"\n );\n }\n return resultsUrl.toString();\n};\n\nconst headers = (credentials: ProviderCredentials): Record<string, string> => ({\n \"anthropic-version\": ANTHROPIC_VERSION,\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey(credentials),\n ...credentials.headers,\n});\n\nconst mapStatus = (status: string | undefined): BatchStatus => {\n if (status === \"ended\") {\n return \"completed\";\n }\n if (status === \"canceling\") {\n return \"cancelling\";\n }\n return \"in_progress\";\n};\n\nconst normalizeSnapshot = (raw: unknown): BatchSnapshot => {\n const obj = asRecord(raw);\n const counts = asRecord(obj.request_counts);\n const succeeded = asNumber(counts.succeeded) ?? 0;\n const errored = asNumber(counts.errored) ?? 0;\n const processing = asNumber(counts.processing) ?? 0;\n const canceled = asNumber(counts.canceled) ?? 0;\n const expired = asNumber(counts.expired) ?? 0;\n\n return {\n completedAt: toDate(obj.ended_at),\n createdAt: toDate(obj.created_at),\n expiresAt: toDate(obj.expires_at),\n id: asString(obj.id) ?? \"\",\n provider: \"anthropic\",\n raw,\n requestCounts: {\n canceled,\n completed: succeeded,\n expired,\n failed: errored,\n processing,\n total: succeeded + errored + processing + canceled + expired,\n },\n status: mapStatus(asString(obj.processing_status)),\n };\n};\n\nconst textFromMessage = (message: unknown): string | undefined => {\n let text = \"\";\n for (const item of asArray(asRecord(message).content)) {\n const block = asRecord(item);\n if (block.type === \"text\") {\n text += asString(block.text) ?? \"\";\n }\n }\n return text.length > 0 ? text : undefined;\n};\n\nconst usageFromMessage = (message: unknown): BatchUsage | undefined => {\n const usage = asRecord(asRecord(message).usage);\n const inputTokens = asNumber(usage.input_tokens);\n const outputTokens = asNumber(usage.output_tokens);\n if (inputTokens === undefined && outputTokens === undefined) {\n return;\n }\n return {\n inputTokens,\n outputTokens,\n totalTokens: (inputTokens ?? 0) + (outputTokens ?? 0),\n };\n};\n\nconst normalizeResult = (line: unknown): BatchResult => {\n const obj = asRecord(line);\n const customId = asString(obj.custom_id) ?? \"\";\n const result = asRecord(obj.result);\n const type = asString(result.type);\n\n if (type === \"succeeded\") {\n return {\n customId,\n response: result.message,\n status: \"succeeded\",\n text: textFromMessage(result.message),\n usage: usageFromMessage(result.message),\n };\n }\n if (type === \"errored\") {\n const error = asRecord(result.error);\n const nested = asRecord(error.error);\n const source = Object.keys(nested).length > 0 ? nested : error;\n return {\n customId,\n error: {\n message: asString(source.message) ?? \"Request errored.\",\n type: asString(source.type),\n },\n response: result.error,\n status: \"errored\",\n };\n }\n if (type === \"expired\") {\n return { customId, status: \"expired\" };\n }\n return { customId, status: \"canceled\" };\n};\n\nconst submit = async (input: SubmitInput): Promise<BatchSnapshot> => {\n const limits = resolveBatchLimits(input.limits);\n const requests = input.built.map((item) => ({\n custom_id: item.customId,\n params: omit(item.body, \"stream\"),\n }));\n const body = encodeJsonArrayPayload({\n items: requests,\n label: \"batch upload payload\",\n maxBytes: limits.maxUploadBytes,\n prefix: '{\"requests\":[',\n suffix: \"]}\",\n });\n const raw = await requestJson(\n `${baseUrl(input.credentials)}/v1/messages/batches`,\n {\n body,\n headers: headers(input.credentials),\n method: \"POST\",\n }\n );\n return normalizeSnapshot(raw);\n};\n\nconst retrieve = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<BatchSnapshot> => {\n const batchId = assertSimpleProviderId(\"Anthropic batch id\", id);\n const raw = await requestJson(\n `${baseUrl(credentials)}/v1/messages/batches/${batchId}`,\n { headers: headers(credentials) }\n );\n return normalizeSnapshot(raw);\n};\n\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nasync function* results(\n id: string,\n credentials: ProviderCredentials\n): AsyncGenerator<BatchResult> {\n const snapshot = await retrieve(id, credentials);\n const resultsUrl = asString(asRecord(snapshot.raw).results_url);\n if (!resultsUrl) {\n throw new BatchworkError(\n `batchwork: results are not ready for batch \"${id}\" (status: ${snapshot.status}).`\n );\n }\n const stream = await requestStream(\n validateResultsUrl(resultsUrl, credentials),\n {\n headers: headers(credentials),\n redirect: \"manual\",\n }\n );\n for await (const line of streamJsonl(stream)) {\n yield normalizeResult(line);\n }\n}\n\nconst cancel = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<void> => {\n const batchId = assertSimpleProviderId(\"Anthropic batch id\", id);\n await requestJson(\n `${baseUrl(credentials)}/v1/messages/batches/${batchId}/cancel`,\n {\n headers: headers(credentials),\n method: \"POST\",\n }\n );\n};\n\nexport const anthropicAdapter: BatchAdapter = {\n cancel,\n id: \"anthropic\",\n results,\n retrieve,\n submit,\n};\n",
14
+ "import { BatchworkError } from \"../errors\";\nimport { requestJson } from \"../http\";\nimport { resolveBatchLimits } from \"../limits\";\nimport { encodeJsonArrayPayload } from \"../payload\";\nimport type {\n BatchImage,\n BatchResult,\n BatchSnapshot,\n BatchStatus,\n BatchUsage,\n ProviderCredentials,\n} from \"../types\";\nimport {\n asArray,\n asNumber,\n asNumberArray,\n asRecord,\n asString,\n omit,\n} from \"../util\";\nimport type { BatchAdapter, SubmitInput } from \"./adapter\";\nimport { assertPrefixedProviderId } from \"./ids\";\n\nconst GOOGLE_BASE = \"https://generativelanguage.googleapis.com/v1beta\";\nconst OPERATION_ID_LABEL = \"Google operation id\";\nconst GOOGLE_BATCH_PREFIX = \"batches\";\n\nconst apiKey = (credentials: ProviderCredentials): string => {\n const key =\n credentials.apiKey ??\n process.env.GOOGLE_GENERATIVE_AI_API_KEY ??\n process.env.GEMINI_API_KEY;\n if (!key) {\n throw new BatchworkError(\n \"batchwork: missing Google Gemini API key. Set GOOGLE_GENERATIVE_AI_API_KEY (or GEMINI_API_KEY) or pass `apiKey`.\"\n );\n }\n return key;\n};\n\nconst baseUrl = (credentials: ProviderCredentials): string =>\n credentials.baseURL ?? GOOGLE_BASE;\n\nconst headers = (credentials: ProviderCredentials): Record<string, string> => ({\n \"content-type\": \"application/json\",\n \"x-goog-api-key\": apiKey(credentials),\n ...credentials.headers,\n});\n\n/** Gemini operation state. Live ops use `JOB_STATE_*`; match on the suffix. */\nconst mapState = (state: string | undefined, done: boolean): BatchStatus => {\n if (state) {\n if (state.endsWith(\"SUCCEEDED\")) {\n return \"completed\";\n }\n if (state.endsWith(\"FAILED\")) {\n return \"failed\";\n }\n if (state.endsWith(\"CANCELLED\")) {\n return \"cancelled\";\n }\n if (state.endsWith(\"EXPIRED\")) {\n return \"expired\";\n }\n if (state.endsWith(\"PENDING\")) {\n return \"validating\";\n }\n if (state.endsWith(\"RUNNING\")) {\n return \"in_progress\";\n }\n }\n return done ? \"completed\" : \"in_progress\";\n};\n\nconst inlinedResponses = (raw: unknown): unknown[] => {\n const obj = asRecord(raw);\n const response = asRecord(obj.response);\n const dest = asRecord(obj.dest);\n const responseInline =\n response.inlinedResponses ?? response.inlined_responses;\n const destInline = dest.inlinedResponses ?? dest.inlined_responses;\n const nestedResponseInline = asRecord(responseInline);\n const nestedDestInline = asRecord(destInline);\n return [\n ...asArray(responseInline),\n ...asArray(nestedResponseInline.inlinedResponses),\n ...asArray(nestedResponseInline.inlined_responses),\n ...asArray(destInline),\n ...asArray(nestedDestInline.inlinedResponses),\n ...asArray(nestedDestInline.inlined_responses),\n ];\n};\n\nconst normalizeSnapshot = (raw: unknown): BatchSnapshot => {\n const obj = asRecord(raw);\n const items = inlinedResponses(raw);\n const failed = items.filter((item) => asRecord(item).error).length;\n const id = asString(obj.name) ?? \"\";\n return {\n id: id\n ? assertPrefixedProviderId(OPERATION_ID_LABEL, id, GOOGLE_BATCH_PREFIX)\n : \"\",\n provider: \"google\",\n raw,\n requestCounts: {\n completed: items.length - failed,\n failed,\n total: items.length,\n },\n status: mapState(\n asString(obj.state) ??\n asString(asRecord(obj.state).name) ??\n asString(asRecord(obj.metadata).state),\n obj.done === true\n ),\n };\n};\n\nconst textFromResponse = (response: unknown): string | undefined => {\n const candidate = asRecord(asArray(asRecord(response).candidates)[0]);\n const text = asArray(asRecord(candidate.content).parts)\n .map((part) => asString(asRecord(part).text) ?? \"\")\n .join(\"\");\n return text.length > 0 ? text : undefined;\n};\n\nconst embeddingFromResponse = (response: unknown): number[] | undefined =>\n asNumberArray(asRecord(asRecord(response).embedding).values);\n\n/**\n * Read inline base64 images from a Gemini `generateContent` response\n * (`candidates[0].content.parts[].inlineData`). Returns undefined when no part\n * carries image data, so text/embedding results are unaffected.\n */\nconst imagesFromResponse = (response: unknown): BatchImage[] | undefined => {\n const candidate = asRecord(asArray(asRecord(response).candidates)[0]);\n const images: BatchImage[] = [];\n for (const part of asArray(asRecord(candidate.content).parts)) {\n const partObj = asRecord(part);\n const inline = asRecord(partObj.inlineData ?? partObj.inline_data);\n const data = asString(inline.data);\n const mediaType = asString(inline.mimeType) ?? asString(inline.mime_type);\n if (data && mediaType?.startsWith(\"image/\")) {\n images.push({ data, mediaType });\n }\n }\n return images.length > 0 ? images : undefined;\n};\n\nconst usageFromResponse = (response: unknown): BatchUsage | undefined => {\n const usage = asRecord(asRecord(response).usageMetadata);\n const inputTokens = asNumber(usage.promptTokenCount);\n const outputTokens = asNumber(usage.candidatesTokenCount);\n const totalTokens = asNumber(usage.totalTokenCount);\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n totalTokens === undefined\n ) {\n return;\n }\n return {\n inputTokens,\n outputTokens,\n totalTokens: totalTokens ?? (inputTokens ?? 0) + (outputTokens ?? 0),\n };\n};\n\nconst normalizeResult = (item: unknown): BatchResult => {\n const obj = asRecord(item);\n const customId =\n asString(asRecord(obj.metadata).key) ??\n asString(obj.key) ??\n asString(obj.custom_id) ??\n \"\";\n if (obj.error) {\n const error = asRecord(obj.error);\n return {\n customId,\n error: {\n code: asNumber(error.code) ?? asString(error.code),\n message: asString(error.message) ?? \"Request errored.\",\n type: asString(error.status),\n },\n response: obj.error,\n status: \"errored\",\n };\n }\n return {\n customId,\n embedding: embeddingFromResponse(obj.response),\n images: imagesFromResponse(obj.response),\n response: obj.response,\n status: \"succeeded\",\n text: textFromResponse(obj.response),\n usage: usageFromResponse(obj.response),\n };\n};\n\n// Fields the single-value embedding capture emits flat, but the async batch\n// embedding API expects nested under `embedContentConfig`.\nconst EMBED_CONFIG_KEYS = new Set([\n \"outputDimensionality\",\n \"taskType\",\n \"title\",\n]);\n\n/** Reshape a captured `:embedContent` body into an async-batch `request`. */\nconst toEmbedRequest = (\n body: Record<string, unknown>\n): Record<string, unknown> => {\n const request: Record<string, unknown> = {};\n const config: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(body)) {\n if (EMBED_CONFIG_KEYS.has(key)) {\n config[key] = value;\n } else {\n request[key] = value;\n }\n }\n if (Object.keys(config).length > 0) {\n request.embedContentConfig = config;\n }\n return request;\n};\n\nconst submit = async (input: SubmitInput): Promise<BatchSnapshot> => {\n const limits = resolveBatchLimits(input.limits);\n // Embeddings capture targets `:embedContent`; route to the async batch\n // embedding method and reshape each request, otherwise generate content.\n const isEmbedding = input.endpoint.toLowerCase().includes(\"embedcontent\");\n const method = isEmbedding\n ? \"asyncBatchEmbedContent\"\n : \"batchGenerateContent\";\n const requests = input.built.map((item) => {\n const payload = omit(item.body, \"stream\");\n return {\n metadata: { key: item.customId },\n request: isEmbedding ? toEmbedRequest(payload) : payload,\n };\n });\n const body = encodeJsonArrayPayload({\n items: requests,\n label: \"batch upload payload\",\n maxBytes: limits.maxUploadBytes,\n prefix:\n '{\"batch\":{\"display_name\":\"batchwork\",\"input_config\":{\"requests\":{\"requests\":[',\n suffix: \"]}}}}\",\n });\n const raw = await requestJson(\n `${baseUrl(input.credentials)}/models/${input.modelId}:${method}`,\n {\n body,\n headers: headers(input.credentials),\n method: \"POST\",\n }\n );\n return normalizeSnapshot(raw);\n};\n\nconst retrieve = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<BatchSnapshot> => {\n const operationId = assertPrefixedProviderId(\n OPERATION_ID_LABEL,\n id,\n GOOGLE_BATCH_PREFIX\n );\n const raw = await requestJson(`${baseUrl(credentials)}/${operationId}`, {\n headers: headers(credentials),\n });\n return normalizeSnapshot(raw);\n};\n\n/** A file reference may be a bare name string or an object with a `name`. */\nconst fileNameFrom = (value: unknown): string | undefined =>\n asString(asRecord(value).name) ?? asString(value);\n\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nasync function* results(\n id: string,\n credentials: ProviderCredentials\n): AsyncGenerator<BatchResult> {\n const snapshot = await retrieve(id, credentials);\n const raw = asRecord(snapshot.raw);\n const response = asRecord(raw.response);\n const dest = asRecord(raw.dest);\n const responsesFile =\n fileNameFrom(response.responsesFile) ??\n fileNameFrom(response.responses_file) ??\n asString(dest.fileName) ??\n asString(dest.file_name);\n if (responsesFile) {\n throw new BatchworkError(\n `batchwork: batch \"${id}\" returned file-mode results, which are not supported yet.`\n );\n }\n const items = inlinedResponses(raw);\n if (items.length === 0) {\n throw new BatchworkError(\n `batchwork: results are not ready for batch \"${id}\" (status: ${snapshot.status}).`\n );\n }\n for (const item of items) {\n yield normalizeResult(item);\n }\n}\n\nconst cancel = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<void> => {\n const operationId = assertPrefixedProviderId(\n OPERATION_ID_LABEL,\n id,\n GOOGLE_BATCH_PREFIX\n );\n await requestJson(`${baseUrl(credentials)}/${operationId}:cancel`, {\n headers: headers(credentials),\n method: \"POST\",\n });\n};\n\n/**\n * Google Gemini (Developer API) batch adapter: submits inline requests via\n * `:batchGenerateContent`, polls the returned long-running operation, then reads\n * the inline responses keyed by each request's `metadata.key`.\n */\nexport const googleAdapter: BatchAdapter = {\n cancel,\n id: \"google\",\n results,\n retrieve,\n submit,\n};\n",
15
+ "/**\n * Helpers shared across the OpenAI-shaped adapters (OpenAI, Groq, Together,\n * Mistral). These providers all upload JSONL via a Files API, return results as\n * JSONL keyed by `custom_id`, and shape each result line like OpenAI's\n * (`{ custom_id, response: { status_code, body }, error }`).\n */\n\nimport { BatchworkError } from \"../errors\";\nimport { requestJson, requestStream } from \"../http\";\nimport { streamJsonl } from \"../jsonl\";\nimport type {\n BatchImage,\n BatchResult,\n BatchResultError,\n BatchUsage,\n ProviderCredentials,\n} from \"../types\";\nimport { asArray, asNumber, asNumberArray, asRecord, asString } from \"../util\";\n\nconst HTTP_OK_MIN = 200;\nconst HTTP_OK_MAX = 300;\n\n/** Resolve an API key from credentials or the provider's env var, or throw. */\nexport const resolveApiKey = (\n credentials: ProviderCredentials,\n envVar: string,\n label: string\n): string => {\n const key = credentials.apiKey ?? process.env[envVar];\n if (!key) {\n throw new BatchworkError(\n `batchwork: missing ${label} API key. Set ${envVar} or pass \\`apiKey\\`.`\n );\n }\n return key;\n};\n\nexport const textFromBody = (body: unknown): string | undefined => {\n const obj = asRecord(body);\n const choices = asArray(obj.choices);\n if (choices.length > 0) {\n const content = asString(asRecord(asRecord(choices[0]).message).content);\n if (content) {\n return content;\n }\n }\n return asString(obj.output_text);\n};\n\n/** Read the embedding vector from an OpenAI-shaped embeddings response body. */\nexport const embeddingFromBody = (body: unknown): number[] | undefined => {\n const data = asArray(asRecord(body).data);\n if (data.length === 0) {\n return;\n }\n return asNumberArray(asRecord(data[0]).embedding);\n};\n\n/**\n * Read base64 images from an OpenAI-shaped images response body\n * (`{ data: [{ b64_json }], output_format? }`). Returns undefined when the body\n * carries no image data, so chat/embedding results are unaffected.\n */\nexport const imagesFromBody = (body: unknown): BatchImage[] | undefined => {\n const obj = asRecord(body);\n const mediaType = `image/${asString(obj.output_format) ?? \"png\"}`;\n const images: BatchImage[] = [];\n for (const item of asArray(obj.data)) {\n const b64 = asString(asRecord(item).b64_json);\n if (b64) {\n images.push({ data: b64, mediaType });\n }\n }\n return images.length > 0 ? images : undefined;\n};\n\nexport const usageFromBody = (body: unknown): BatchUsage | undefined => {\n const usage = asRecord(asRecord(body).usage);\n const inputTokens =\n asNumber(usage.prompt_tokens) ?? asNumber(usage.input_tokens);\n const outputTokens =\n asNumber(usage.completion_tokens) ?? asNumber(usage.output_tokens);\n const totalTokens = asNumber(usage.total_tokens);\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n totalTokens === undefined\n ) {\n return;\n }\n return {\n inputTokens,\n outputTokens,\n totalTokens: totalTokens ?? (inputTokens ?? 0) + (outputTokens ?? 0),\n };\n};\n\nconst errorFromValue = (value: unknown, fallback: string): BatchResultError => {\n const obj = asRecord(value);\n const nested = asRecord(obj.error);\n const source = nested.message ? nested : obj;\n return {\n code: asNumber(source.code) ?? asString(source.code),\n message: asString(source.message) ?? fallback,\n type: asString(source.type),\n };\n};\n\n/** Normalize an OpenAI-shaped result line into a {@link BatchResult}. */\nexport const normalizeOpenAIResult = (line: unknown): BatchResult => {\n const obj = asRecord(line);\n const customId = asString(obj.custom_id) ?? \"\";\n\n if (obj.error) {\n return {\n customId,\n error: errorFromValue(obj.error, \"Request errored.\"),\n response: obj.error,\n status: \"errored\",\n };\n }\n\n const response = asRecord(obj.response);\n const statusCode = asNumber(response.status_code) ?? 0;\n if (statusCode >= HTTP_OK_MIN && statusCode < HTTP_OK_MAX) {\n return {\n customId,\n embedding: embeddingFromBody(response.body),\n images: imagesFromBody(response.body),\n response: response.body,\n status: \"succeeded\",\n text: textFromBody(response.body),\n usage: usageFromBody(response.body),\n };\n }\n\n return {\n customId,\n error: errorFromValue(\n response.body,\n `Request failed with status ${statusCode}.`\n ),\n response: response.body,\n status: \"errored\",\n };\n};\n\n// Upload a JSONL batch input file and return its id. Purpose defaults to `batch`.\nexport const uploadInputFile = async (\n jsonl: string,\n baseUrl: string,\n headers: Record<string, string>,\n options: { purpose?: string | null } = {}\n): Promise<string> => {\n const form = new FormData();\n const purpose = options.purpose === undefined ? \"batch\" : options.purpose;\n if (purpose !== null) {\n form.append(\"purpose\", purpose);\n }\n form.append(\n \"file\",\n new Blob([jsonl], { type: \"application/jsonl\" }),\n \"batchwork.jsonl\"\n );\n const raw = await requestJson<{ id: string }>(`${baseUrl}/files`, {\n body: form,\n headers,\n method: \"POST\",\n redirect: \"manual\",\n });\n return raw.id;\n};\n\n/**\n * Stream a JSONL result file's content as normalized OpenAI-shaped results.\n *\n * @yields {BatchResult} the normalized result for each line.\n */\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nexport async function* streamResultFile(\n fileId: string,\n baseUrl: string,\n headers: Record<string, string>\n): AsyncGenerator<BatchResult> {\n const stream = await requestStream(`${baseUrl}/files/${fileId}/content`, {\n headers,\n redirect: \"manual\",\n });\n for await (const line of streamJsonl(stream)) {\n yield normalizeOpenAIResult(line);\n }\n}\n",
16
+ "/**\n * Factory for OpenAI-compatible batch adapters. OpenAI, Groq, and Together AI\n * all share the same lifecycle — upload JSONL via the Files API, create a batch\n * referencing the file, poll a `status` field, then download output/error files\n * — differing only in base URL, credentials, and minor request-line shape.\n */\n\nimport { BatchworkError } from \"../errors\";\nimport { requestJson } from \"../http\";\nimport { encodeJsonl } from \"../jsonl\";\nimport { resolveBatchLimits } from \"../limits\";\nimport type {\n BatchProvider,\n BatchResult,\n BatchSnapshot,\n BatchStatus,\n ProviderCredentials,\n} from \"../types\";\nimport { asNumber, asRecord, asString, omit, toDate } from \"../util\";\nimport type { BatchAdapter, SubmitInput } from \"./adapter\";\nimport { assertSimpleProviderId } from \"./ids\";\nimport { resolveApiKey, streamResultFile, uploadInputFile } from \"./shared\";\n\n// How a batch input line is shaped.\nexport type BatchLineFormat = \"body-only\" | \"method-url\";\n\nexport interface OpenAICompatibleConfig {\n apiKeyEnv: string;\n apiKeyLabel: string;\n baseUrl: string;\n // How long the provider may take to finish (OpenAI/Groq/Together).\n completionWindow?: string;\n // Files API purpose value for uploaded JSONL batch inputs.\n filePurpose?: string;\n id: BatchProvider;\n /**\n * Override the JSONL upload. Defaults to a direct multipart POST to the Files\n * API (OpenAI, Groq); Together replaces it with its presigned-URL flow.\n * Returns the uploaded file id.\n */\n uploadFile?: (args: {\n baseUrl: string;\n headers: Record<string, string>;\n jsonl: string;\n purpose: string;\n }) => Promise<string>;\n /**\n * Input-line shape. `method-url` writes `{ custom_id, method, url, body }`\n * (OpenAI, Groq); `body-only` writes `{ custom_id, body }` (Together).\n */\n lineFormat?: BatchLineFormat;\n /**\n * Map the captured endpoint path to the value the provider expects in the\n * batch `url`/`endpoint` field (e.g. Groq serves under `/openai/v1` but its\n * batch `url` must be `/v1/chat/completions`).\n */\n normalizeEndpoint?: (endpoint: string) => string;\n}\n\nconst DEFAULT_COMPLETION_WINDOW = \"24h\";\n\nconst mapStatus = (status: string | undefined): BatchStatus => {\n const normalized = status?.toLowerCase();\n switch (normalized) {\n case \"validating\":\n case \"in_progress\":\n case \"finalizing\":\n case \"completed\":\n case \"failed\":\n case \"expired\":\n case \"cancelling\":\n case \"cancelled\": {\n return normalized;\n }\n default: {\n return \"in_progress\";\n }\n }\n};\n\nconst normalizeSnapshot = (\n raw: unknown,\n provider: BatchProvider\n): BatchSnapshot => {\n const outer = asRecord(raw);\n const obj = asRecord(outer.job);\n const source = Object.keys(obj).length > 0 ? obj : outer;\n const counts = asRecord(source.request_counts);\n return {\n completedAt: toDate(source.completed_at),\n createdAt: toDate(source.created_at),\n expiresAt: toDate(source.expires_at),\n id: asString(source.id) ?? \"\",\n provider,\n raw: source,\n requestCounts: {\n completed: asNumber(counts.completed) ?? 0,\n failed: asNumber(counts.failed) ?? 0,\n total: asNumber(counts.total) ?? 0,\n },\n status: mapStatus(asString(source.status)),\n };\n};\n\n// Build an OpenAI-compatible adapter from a provider config.\nexport const createOpenAICompatibleAdapter = (\n config: OpenAICompatibleConfig\n): BatchAdapter => {\n const completionWindow = config.completionWindow ?? DEFAULT_COMPLETION_WINDOW;\n const lineFormat = config.lineFormat ?? \"method-url\";\n\n const baseUrl = (credentials: ProviderCredentials): string =>\n credentials.baseURL ?? config.baseUrl;\n\n const authHeaders = (\n credentials: ProviderCredentials\n ): Record<string, string> => ({\n Authorization: `Bearer ${resolveApiKey(credentials, config.apiKeyEnv, config.apiKeyLabel)}`,\n ...credentials.headers,\n });\n\n const submit = async (input: SubmitInput): Promise<BatchSnapshot> => {\n const limits = resolveBatchLimits(input.limits);\n const endpoint = config.normalizeEndpoint\n ? config.normalizeEndpoint(input.endpoint)\n : input.endpoint;\n const jsonl = encodeJsonl(\n input.built.map((item) => {\n const body = omit(item.body, \"stream\");\n if (lineFormat === \"body-only\") {\n return { body, custom_id: item.customId };\n }\n return {\n body,\n custom_id: item.customId,\n method: \"POST\",\n url: endpoint,\n };\n }),\n { label: \"batch upload JSONL\", maxBytes: limits.maxUploadBytes }\n );\n const headers = authHeaders(input.credentials);\n const url = baseUrl(input.credentials);\n const purpose = config.filePurpose ?? \"batch\";\n const inputFileId = await (config.uploadFile\n ? config.uploadFile({ baseUrl: url, headers, jsonl, purpose })\n : uploadInputFile(jsonl, url, headers, { purpose }));\n const raw = await requestJson(`${url}/batches`, {\n body: JSON.stringify({\n completion_window: completionWindow,\n endpoint,\n input_file_id: inputFileId,\n metadata: input.metadata,\n }),\n headers: { ...headers, \"content-type\": \"application/json\" },\n method: \"POST\",\n });\n return normalizeSnapshot(raw, config.id);\n };\n\n const retrieve = async (\n id: string,\n credentials: ProviderCredentials\n ): Promise<BatchSnapshot> => {\n const batchId = assertSimpleProviderId(`${config.id} batch id`, id);\n const raw = await requestJson(\n `${baseUrl(credentials)}/batches/${batchId}`,\n {\n headers: authHeaders(credentials),\n }\n );\n return normalizeSnapshot(raw, config.id);\n };\n\n // oxlint-disable-next-line func-style -- generators cannot be arrow functions.\n async function* results(\n id: string,\n credentials: ProviderCredentials\n ): AsyncGenerator<BatchResult> {\n const snapshot = await retrieve(id, credentials);\n const raw = asRecord(snapshot.raw);\n const outputFileId = asString(raw.output_file_id);\n const errorFileId = asString(raw.error_file_id);\n\n if (!(outputFileId || errorFileId)) {\n throw new BatchworkError(\n `batchwork: results are not ready for batch \"${id}\" (status: ${snapshot.status}).`\n );\n }\n const headers = authHeaders(credentials);\n if (outputFileId) {\n yield* streamResultFile(\n assertSimpleProviderId(`${config.id} output file id`, outputFileId),\n baseUrl(credentials),\n headers\n );\n }\n if (errorFileId) {\n yield* streamResultFile(\n assertSimpleProviderId(`${config.id} error file id`, errorFileId),\n baseUrl(credentials),\n headers\n );\n }\n }\n\n const cancel = async (\n id: string,\n credentials: ProviderCredentials\n ): Promise<void> => {\n const batchId = assertSimpleProviderId(`${config.id} batch id`, id);\n await requestJson(`${baseUrl(credentials)}/batches/${batchId}/cancel`, {\n headers: authHeaders(credentials),\n method: \"POST\",\n });\n };\n\n return { cancel, id: config.id, results, retrieve, submit };\n};\n",
17
+ "import { createOpenAICompatibleAdapter } from \"./openai-compatible\";\n\n/**\n * Groq batch adapter. Groq's batch API is OpenAI-compatible (Files API +\n * `/batches`), so it reuses the OpenAI-compatible flow. Groq is served under\n * `/openai/v1`, but its batch `url` must be `/v1/chat/completions`, so the\n * captured endpoint's `/openai` prefix is stripped.\n */\nexport const groqAdapter = createOpenAICompatibleAdapter({\n apiKeyEnv: \"GROQ_API_KEY\",\n apiKeyLabel: \"Groq\",\n baseUrl: \"https://api.groq.com/openai/v1\",\n id: \"groq\",\n lineFormat: \"method-url\",\n normalizeEndpoint: (endpoint) => endpoint.replace(/^\\/openai/u, \"\"),\n});\n",
18
+ "import { BatchworkError } from \"../errors\";\nimport { requestJson } from \"../http\";\nimport { encodeJsonl } from \"../jsonl\";\nimport { resolveBatchLimits } from \"../limits\";\nimport type {\n BatchResult,\n BatchSnapshot,\n BatchStatus,\n ProviderCredentials,\n} from \"../types\";\nimport { asNumber, asRecord, asString, omit, toDate } from \"../util\";\nimport type { BatchAdapter, SubmitInput } from \"./adapter\";\nimport { assertSimpleProviderId } from \"./ids\";\nimport { resolveApiKey, streamResultFile, uploadInputFile } from \"./shared\";\n\nconst MISTRAL_BASE = \"https://api.mistral.ai/v1\";\n\nconst JOB_ID_LABEL = \"Mistral job id\";\n\nconst apiKey = (credentials: ProviderCredentials): string =>\n resolveApiKey(credentials, \"MISTRAL_API_KEY\", \"Mistral\");\n\nconst baseUrl = (credentials: ProviderCredentials): string =>\n credentials.baseURL ?? MISTRAL_BASE;\n\nconst authHeaders = (\n credentials: ProviderCredentials\n): Record<string, string> => ({\n Authorization: `Bearer ${apiKey(credentials)}`,\n ...credentials.headers,\n});\n\nconst mapStatus = (status: string | undefined): BatchStatus => {\n switch (status) {\n case \"QUEUED\": {\n return \"validating\";\n }\n case \"SUCCESS\": {\n return \"completed\";\n }\n case \"FAILED\": {\n return \"failed\";\n }\n case \"TIMEOUT_EXCEEDED\": {\n return \"expired\";\n }\n case \"CANCELLATION_REQUESTED\": {\n return \"cancelling\";\n }\n case \"CANCELLED\": {\n return \"cancelled\";\n }\n default: {\n return \"in_progress\";\n }\n }\n};\n\nconst normalizeSnapshot = (raw: unknown): BatchSnapshot => {\n const obj = asRecord(raw);\n const succeeded = asNumber(obj.succeeded_requests) ?? 0;\n const failed = asNumber(obj.failed_requests) ?? 0;\n const id = asString(obj.id) ?? \"\";\n return {\n completedAt: toDate(obj.completed_at),\n createdAt: toDate(obj.created_at),\n id: id ? assertSimpleProviderId(JOB_ID_LABEL, id) : \"\",\n provider: \"mistral\",\n raw,\n requestCounts: {\n completed: succeeded,\n failed,\n total: asNumber(obj.total_requests) ?? succeeded + failed,\n },\n status: mapStatus(asString(obj.status)),\n };\n};\n\nconst submit = async (input: SubmitInput): Promise<BatchSnapshot> => {\n const limits = resolveBatchLimits(input.limits);\n // Mistral sets the model on the job, so strip it (and `stream`) from each line.\n const jsonl = encodeJsonl(\n input.built.map((item) => ({\n body: omit(omit(item.body, \"stream\"), \"model\"),\n custom_id: item.customId,\n })),\n { label: \"batch upload JSONL\", maxBytes: limits.maxUploadBytes }\n );\n const inputFileId = await uploadInputFile(\n jsonl,\n baseUrl(input.credentials),\n authHeaders(input.credentials)\n );\n const raw = await requestJson(`${baseUrl(input.credentials)}/batch/jobs`, {\n body: JSON.stringify({\n endpoint: input.endpoint,\n input_files: [inputFileId],\n metadata: input.metadata,\n model: input.modelId,\n }),\n headers: {\n ...authHeaders(input.credentials),\n \"content-type\": \"application/json\",\n },\n method: \"POST\",\n });\n return normalizeSnapshot(raw);\n};\n\nconst retrieve = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<BatchSnapshot> => {\n const jobId = assertSimpleProviderId(JOB_ID_LABEL, id);\n const raw = await requestJson(`${baseUrl(credentials)}/batch/jobs/${jobId}`, {\n headers: authHeaders(credentials),\n });\n return normalizeSnapshot(raw);\n};\n\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nasync function* results(\n id: string,\n credentials: ProviderCredentials\n): AsyncGenerator<BatchResult> {\n const snapshot = await retrieve(id, credentials);\n const raw = asRecord(snapshot.raw);\n const outputFileId = asString(raw.output_file);\n const errorFileId = asString(raw.error_file);\n const headers = authHeaders(credentials);\n if (outputFileId) {\n yield* streamResultFile(\n assertSimpleProviderId(\"Mistral output file id\", outputFileId),\n baseUrl(credentials),\n headers\n );\n }\n if (errorFileId) {\n yield* streamResultFile(\n assertSimpleProviderId(\"Mistral error file id\", errorFileId),\n baseUrl(credentials),\n headers\n );\n }\n if (!(outputFileId || errorFileId)) {\n throw new BatchworkError(\n `batchwork: results are not ready for batch \"${id}\" (status: ${snapshot.status}).`\n );\n }\n}\n\nconst cancel = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<void> => {\n const jobId = assertSimpleProviderId(JOB_ID_LABEL, id);\n await requestJson(`${baseUrl(credentials)}/batch/jobs/${jobId}/cancel`, {\n headers: authHeaders(credentials),\n method: \"POST\",\n });\n};\n\n/**\n * Mistral batch adapter: uploads JSONL (`purpose=batch`), creates a job with the\n * model/endpoint set on the job, polls `status`, then downloads the OpenAI-shaped\n * output/error files.\n */\nexport const mistralAdapter: BatchAdapter = {\n cancel,\n id: \"mistral\",\n results,\n retrieve,\n submit,\n};\n",
19
+ "import { createOpenAICompatibleAdapter } from \"./openai-compatible\";\n\n/**\n * OpenAI batch adapter: builds JSONL, uploads it via the Files API\n * (`purpose=batch`), creates the batch, polls `status`, then downloads and\n * parses the output and error files.\n */\nexport const openaiAdapter = createOpenAICompatibleAdapter({\n apiKeyEnv: \"OPENAI_API_KEY\",\n apiKeyLabel: \"OpenAI\",\n baseUrl: \"https://api.openai.com/v1\",\n id: \"openai\",\n lineFormat: \"method-url\",\n});\n",
20
+ "import { BatchworkError } from \"../errors\";\nimport { requestJson } from \"../http\";\nimport { assertSimpleProviderId } from \"./ids\";\nimport { createOpenAICompatibleAdapter } from \"./openai-compatible\";\n\nconst INPUT_FILE_NAME = \"batchwork.jsonl\";\nconst HTTP_FOUND = 302;\n\nconst parseIpv4 = (host: string): number[] | undefined => {\n if (!/^\\d{1,3}(?:\\.\\d{1,3}){3}$/u.test(host)) {\n return;\n }\n const parts = host.split(\".\").map(Number);\n const valid = parts.every(\n (part) => Number.isInteger(part) && part >= 0 && part <= 255\n );\n return valid ? parts : undefined;\n};\n\nconst isPrivateIpv4 = (parts: number[]): boolean => {\n const [a = 0, b = 0] = parts;\n if (a === 0 || a === 10 || a === 127 || a >= 224) {\n return true;\n }\n switch (a) {\n case 100: {\n return b >= 64 && b <= 127;\n }\n case 169: {\n return b === 254;\n }\n case 172: {\n return b >= 16 && b <= 31;\n }\n case 192: {\n return b === 168;\n }\n case 198: {\n return b === 18 || b === 19;\n }\n default: {\n return false;\n }\n }\n};\n\nconst isPrivateIpv6 = (host: string): boolean => {\n const normalized = host.replace(/^\\[/u, \"\").replace(/\\]$/u, \"\").toLowerCase();\n // Only an IPv6 literal can be a private address, and one always contains a\n // colon — guard so a bare DNS name like `fc2.com` is not mistaken for `fc00::/7`.\n if (!normalized.includes(\":\")) {\n return false;\n }\n if (normalized === \"::\" || normalized === \"::1\") {\n return true;\n }\n return (\n normalized.startsWith(\"fc\") ||\n normalized.startsWith(\"fd\") ||\n normalized.startsWith(\"fe80:\")\n );\n};\n\n/** Whether a hostname points at localhost or a private network. */\nconst isPrivateHost = (host: string): boolean => {\n if (\n host === \"localhost\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".local\")\n ) {\n return true;\n }\n const ipv4 = parseIpv4(host);\n return (ipv4 ? isPrivateIpv4(ipv4) : false) || isPrivateIpv6(host);\n};\n\nconst validateUploadLocation = (location: string): string => {\n let url: URL;\n try {\n url = new URL(location);\n } catch (error) {\n throw new BatchworkError(\n \"batchwork: Together upload Location must be a valid URL.\",\n { cause: error }\n );\n }\n if (url.protocol !== \"https:\") {\n throw new BatchworkError(\n \"batchwork: Together upload Location must use https.\"\n );\n }\n if (url.username || url.password) {\n throw new BatchworkError(\n \"batchwork: Together upload Location must not include credentials.\"\n );\n }\n if (isPrivateHost(url.hostname.toLowerCase())) {\n throw new BatchworkError(\n \"batchwork: Together upload Location must not target localhost or private networks.\"\n );\n }\n return url.toString();\n};\n\n/**\n * Together uploads files via a presigned URL rather than a direct multipart\n * upload of the bytes. The flow is three steps:\n *\n * 1. `POST /files` with multipart *metadata only* (`purpose`, `file_name`,\n * `file_type` — no file part) responds `302` with a `Location` (the\n * presigned storage URL) and an `X-Together-File-Id` header.\n * 2. `PUT` the raw bytes to that `Location` (no auth — the URL is signed).\n * 3. `POST /files/{id}/preprocess` to finalize the upload.\n */\nconst uploadTogetherFile = async (args: {\n baseUrl: string;\n headers: Record<string, string>;\n jsonl: string;\n purpose: string;\n}): Promise<string> => {\n const metadata = new FormData();\n metadata.append(\"purpose\", args.purpose);\n metadata.append(\"file_name\", INPUT_FILE_NAME);\n metadata.append(\"file_type\", \"jsonl\");\n const init = await fetch(`${args.baseUrl}/files`, {\n body: metadata,\n // Let fetch set the multipart content-type/boundary; only auth is needed.\n headers: args.headers,\n method: \"POST\",\n // Together signals the presigned URL via a redirect we must read, not follow.\n redirect: \"manual\",\n });\n const location = init.headers.get(\"location\");\n const fileId = init.headers.get(\"x-together-file-id\");\n if (init.status !== HTTP_FOUND || !(location && fileId)) {\n throw new BatchworkError(\n `batchwork: Together upload could not be initiated (${init.status}).`\n );\n }\n\n // The presigned URL carries its own auth; sending Together's would break it.\n const uploadLocation = validateUploadLocation(location);\n const upload = await fetch(uploadLocation, {\n body: args.jsonl,\n method: \"PUT\",\n redirect: \"manual\",\n });\n if (!upload.ok) {\n throw new BatchworkError(\n `batchwork: Together file upload failed (${upload.status}).`\n );\n }\n\n const safeFileId = assertSimpleProviderId(\"Together file id\", fileId);\n await requestJson(`${args.baseUrl}/files/${safeFileId}/preprocess`, {\n headers: args.headers,\n method: \"POST\",\n });\n return safeFileId;\n};\n\n/**\n * Together AI batch adapter. Together's batch API mirrors OpenAI's (Files API +\n * `/batches`) but uses the leaner `{ custom_id, body }` input-line shape, with\n * the endpoint declared on the batch rather than per line, and a presigned-URL\n * file upload in place of OpenAI's direct multipart POST.\n */\nexport const togetherAdapter = createOpenAICompatibleAdapter({\n apiKeyEnv: \"TOGETHER_API_KEY\",\n apiKeyLabel: \"Together AI\",\n baseUrl: \"https://api.together.xyz/v1\",\n filePurpose: \"batch-api\",\n id: \"together\",\n lineFormat: \"body-only\",\n uploadFile: uploadTogetherFile,\n});\n",
21
+ "import { requestJson } from \"../http\";\nimport { encodeJsonl } from \"../jsonl\";\nimport { resolveBatchLimits } from \"../limits\";\nimport type {\n BatchImage,\n BatchResult,\n BatchSnapshot,\n BatchStatus,\n ProviderCredentials,\n} from \"../types\";\nimport { asArray, asNumber, asRecord, asString, omit, toDate } from \"../util\";\nimport type { BatchAdapter, SubmitInput } from \"./adapter\";\nimport { assertSimpleProviderId } from \"./ids\";\nimport {\n resolveApiKey,\n textFromBody,\n uploadInputFile,\n usageFromBody,\n} from \"./shared\";\n\nconst XAI_BASE = \"https://api.x.ai/v1\";\nconst BATCH_ID_LABEL = \"xAI batch id\";\nconst RESULTS_PAGE_SIZE = 100;\n\nconst apiKey = (credentials: ProviderCredentials): string =>\n resolveApiKey(credentials, \"XAI_API_KEY\", \"xAI\");\n\nconst baseUrl = (credentials: ProviderCredentials): string =>\n credentials.baseURL ?? XAI_BASE;\n\nconst authHeaders = (\n credentials: ProviderCredentials\n): Record<string, string> => ({\n Authorization: `Bearer ${apiKey(credentials)}`,\n ...credentials.headers,\n});\n\nconst deriveStatus = (state: Record<string, unknown>): BatchStatus => {\n const pending = asNumber(state.num_pending);\n // No counts yet (e.g. immediately after creation): still processing.\n if (pending === undefined) {\n return \"in_progress\";\n }\n const total = asNumber(state.num_requests) ?? 0;\n const cancelled = asNumber(state.num_cancelled) ?? 0;\n if (total === 0) {\n return \"in_progress\";\n }\n if (pending > 0) {\n return \"in_progress\";\n }\n if (cancelled > 0 && cancelled === total) {\n return \"cancelled\";\n }\n return \"completed\";\n};\n\nconst normalizeSnapshot = (raw: unknown): BatchSnapshot => {\n const obj = asRecord(raw);\n const state = asRecord(obj.state);\n const id = asString(obj.batch_id) ?? asString(obj.id) ?? \"\";\n return {\n // xAI reports the completion time on `finish_time`; `cancel_time` is only\n // set when a batch is cancelled, so it must not stand in for completedAt.\n completedAt: toDate(obj.finish_time ?? obj.completed_at),\n createdAt: toDate(obj.create_time),\n expiresAt: toDate(obj.expire_time ?? obj.expires_at),\n id: id ? assertSimpleProviderId(BATCH_ID_LABEL, id) : \"\",\n provider: \"xai\",\n raw,\n requestCounts: {\n canceled: asNumber(state.num_cancelled) ?? 0,\n completed: asNumber(state.num_success) ?? 0,\n failed: asNumber(state.num_error) ?? 0,\n processing: asNumber(state.num_pending) ?? 0,\n total: asNumber(state.num_requests) ?? 0,\n },\n status: deriveStatus(state),\n };\n};\n\n/**\n * Read images from an xAI batch image result. The `image_response` op carries\n * either an OpenAI-like `data: [{ base64|b64_json, url }]` array or a single\n * `{ base64, url }`; xAI batch hands back signed `url`s (expiring ~1h) and/or\n * inline `base64`. Returns undefined for chat results, which carry neither.\n */\nconst imagesFromXaiCompletion = (\n completion: unknown\n): BatchImage[] | undefined => {\n const obj = asRecord(completion);\n const entries = asArray(obj.data);\n const sources = entries.length > 0 ? entries : [obj];\n const images: BatchImage[] = [];\n for (const source of sources) {\n const record = asRecord(source);\n const data = asString(record.base64) ?? asString(record.b64_json);\n const url = asString(record.url);\n if (data || url) {\n images.push({\n ...(data ? { data } : {}),\n ...(url ? { url } : {}),\n });\n }\n }\n return images.length > 0 ? images : undefined;\n};\n\nconst normalizeResult = (item: unknown): BatchResult => {\n const obj = asRecord(item);\n const customId = asString(obj.batch_request_id) ?? \"\";\n const batchResult = asRecord(obj.batch_result);\n const resultError = batchResult.error;\n const errorMessage =\n asString(obj.error_message) ??\n asString(resultError) ??\n asString(asRecord(resultError).message);\n if (errorMessage) {\n return {\n customId,\n error: {\n message: errorMessage,\n type: asString(asRecord(resultError).type),\n },\n response: obj,\n status: \"errored\",\n };\n }\n // `batch_result.response` is keyed by operation type; chat lives under\n // `chat_get_completion`. Fall back to the first value for other op types.\n const response = asRecord(batchResult.response);\n const completion = response.chat_get_completion ?? Object.values(response)[0];\n return {\n customId,\n images: imagesFromXaiCompletion(completion),\n response: completion,\n status: \"succeeded\",\n text: textFromBody(completion),\n usage: usageFromBody(completion),\n };\n};\n\nconst submit = async (input: SubmitInput): Promise<BatchSnapshot> => {\n const limits = resolveBatchLimits(input.limits);\n const jsonl = encodeJsonl(\n input.built.map((item) => ({\n body: omit(item.body, \"stream\"),\n custom_id: item.customId,\n method: \"POST\",\n url: input.endpoint,\n })),\n { label: \"batch upload JSONL\", maxBytes: limits.maxUploadBytes }\n );\n const inputFileId = await uploadInputFile(\n jsonl,\n baseUrl(input.credentials),\n authHeaders(input.credentials),\n { purpose: null }\n );\n const raw = await requestJson(`${baseUrl(input.credentials)}/batches`, {\n body: JSON.stringify({ input_file_id: inputFileId, name: \"batchwork\" }),\n headers: {\n ...authHeaders(input.credentials),\n \"content-type\": \"application/json\",\n },\n method: \"POST\",\n });\n return normalizeSnapshot(raw);\n};\n\nconst retrieve = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<BatchSnapshot> => {\n const batchId = assertSimpleProviderId(BATCH_ID_LABEL, id);\n const raw = await requestJson(`${baseUrl(credentials)}/batches/${batchId}`, {\n headers: authHeaders(credentials),\n });\n return normalizeSnapshot(raw);\n};\n\n// oxlint-disable-next-line func-style -- generators cannot be arrow functions.\nasync function* results(\n id: string,\n credentials: ProviderCredentials\n): AsyncGenerator<BatchResult> {\n const batchId = assertSimpleProviderId(BATCH_ID_LABEL, id);\n const headers = authHeaders(credentials);\n let token: string | undefined;\n do {\n const query = new URLSearchParams({ limit: String(RESULTS_PAGE_SIZE) });\n if (token) {\n query.set(\"pagination_token\", token);\n }\n // oxlint-disable-next-line no-await-in-loop, react-doctor/async-await-in-loop -- pages are read sequentially.\n const raw = await requestJson<Record<string, unknown>>(\n `${baseUrl(credentials)}/batches/${batchId}/results?${query.toString()}`,\n { headers }\n );\n const page = asRecord(raw);\n for (const item of Array.isArray(page.results) ? page.results : []) {\n yield normalizeResult(item);\n }\n token = asString(page.pagination_token);\n } while (token);\n}\n\nconst cancel = async (\n id: string,\n credentials: ProviderCredentials\n): Promise<void> => {\n const batchId = assertSimpleProviderId(BATCH_ID_LABEL, id);\n await requestJson(`${baseUrl(credentials)}/batches/${batchId}:cancel`, {\n headers: authHeaders(credentials),\n method: \"POST\",\n });\n};\n\n/**\n * xAI (Grok) batch adapter. Uses xAI's OpenAI-compatible file-upload path\n * (`/v1/files` + `/v1/batches` with `input_file_id`), but its status, paginated\n * `/results`, and `:cancel` shapes are proprietary.\n */\nexport const xaiAdapter: BatchAdapter = {\n cancel,\n id: \"xai\",\n results,\n retrieve,\n submit,\n};\n",
22
+ "import type { BatchProvider } from \"../types\";\nimport type { BatchAdapter } from \"./adapter\";\nimport { anthropicAdapter } from \"./anthropic\";\nimport { googleAdapter } from \"./google\";\nimport { groqAdapter } from \"./groq\";\nimport { mistralAdapter } from \"./mistral\";\nimport { openaiAdapter } from \"./openai\";\nimport { togetherAdapter } from \"./together\";\nimport { xaiAdapter } from \"./xai\";\n\nconst adapters: Record<BatchProvider, BatchAdapter> = {\n anthropic: anthropicAdapter,\n google: googleAdapter,\n groq: groqAdapter,\n mistral: mistralAdapter,\n openai: openaiAdapter,\n together: togetherAdapter,\n xai: xaiAdapter,\n};\n\nexport const getAdapter = (provider: BatchProvider): BatchAdapter =>\n adapters[provider];\n\nexport type { BatchAdapter, SubmitInput } from \"./adapter\";\n"
23
+ ],
24
+ "mappings": "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",
25
+ "debugId": "032D6B4F83FC26F964756E2164756E21",
26
+ "names": []
27
+ }