batchwork 1.2.0 → 1.3.0

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.
Files changed (37) hide show
  1. package/README.md +90 -6
  2. package/dist/batch.d.ts +179 -9
  3. package/dist/batch.d.ts.map +1 -1
  4. package/dist/body.d.ts +30 -1
  5. package/dist/body.d.ts.map +1 -1
  6. package/dist/{chunk-3yqs6x71.js → chunk-9cwfwzm4.js} +40 -10
  7. package/dist/{chunk-3yqs6x71.js.map → chunk-9cwfwzm4.js.map} +3 -3
  8. package/dist/{chunk-h2he3d16.js → chunk-gwa0dkhj.js} +139 -26
  9. package/dist/chunk-gwa0dkhj.js.map +27 -0
  10. package/dist/{chunk-bjkbtj1q.js → chunk-qqz5h9v6.js} +337 -14
  11. package/dist/chunk-qqz5h9v6.js.map +12 -0
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -2
  15. package/dist/job.d.ts.map +1 -1
  16. package/dist/model.d.ts +50 -3
  17. package/dist/model.d.ts.map +1 -1
  18. package/dist/next/index.d.ts +4 -3
  19. package/dist/next/index.d.ts.map +1 -1
  20. package/dist/next/index.js +11 -15
  21. package/dist/next/index.js.map +3 -3
  22. package/dist/providers/anthropic.d.ts.map +1 -1
  23. package/dist/providers/google.d.ts.map +1 -1
  24. package/dist/providers/mistral.d.ts.map +1 -1
  25. package/dist/providers/openai-compatible.d.ts +5 -0
  26. package/dist/providers/openai-compatible.d.ts.map +1 -1
  27. package/dist/providers/shared.d.ts +16 -1
  28. package/dist/providers/shared.d.ts.map +1 -1
  29. package/dist/providers/together.d.ts.map +1 -1
  30. package/dist/providers/xai.d.ts.map +1 -1
  31. package/dist/server/index.js +2 -2
  32. package/dist/server/poller.d.ts.map +1 -1
  33. package/dist/types.d.ts +209 -4
  34. package/dist/types.d.ts.map +1 -1
  35. package/package.json +14 -15
  36. package/dist/chunk-bjkbtj1q.js.map +0 -12
  37. package/dist/chunk-h2he3d16.js.map +0 -27
@@ -7,7 +7,7 @@ import {
7
7
  getAdapter,
8
8
  mapWithConcurrency,
9
9
  resolveBatchLimits
10
- } from "./chunk-h2he3d16.js";
10
+ } from "./chunk-gwa0dkhj.js";
11
11
  import {
12
12
  __require
13
13
  } from "./chunk-v0bahtg2.js";
@@ -199,6 +199,38 @@ var createCaptureEmbeddingModel = async (resolved, credentials, fetchImpl) => {
199
199
  }
200
200
  }
201
201
  };
202
+ var IMAGE_EDIT_PROVIDERS = new Set(["openai", "xai"]);
203
+ var unsupportedImageEditProvider = (provider) => new UnsupportedProviderError(provider, `batchwork: provider "${provider}" does not offer batch image editing. Image edits are supported for: openai, xai.`);
204
+ var VIDEO_PROVIDERS = new Set(["xai"]);
205
+ var unsupportedVideoProvider = (provider) => new UnsupportedProviderError(provider, `batchwork: provider "${provider}" does not offer batch video generation. Videos are supported for: xai.`);
206
+ var createCaptureVideoModel = async (resolved, credentials, fetchImpl) => {
207
+ if (resolved.provider !== "xai") {
208
+ throw unsupportedVideoProvider(resolved.provider);
209
+ }
210
+ const { createXai } = await loadProvider("xai");
211
+ return createXai({
212
+ apiKey: credentials.apiKey ?? CAPTURE_API_KEY,
213
+ baseURL: credentials.baseURL,
214
+ fetch: fetchImpl,
215
+ headers: credentials.headers
216
+ }).video(resolved.modelId);
217
+ };
218
+ var TRANSLATION_PROVIDERS = new Set([
219
+ "groq",
220
+ "together"
221
+ ]);
222
+ var unsupportedTranslationProvider = (provider) => new UnsupportedProviderError(provider, `batchwork: provider "${provider}" does not offer batch translation. Translations are supported for: groq, together.`);
223
+ var MODERATION_PROVIDERS = new Set([
224
+ "mistral",
225
+ "openai"
226
+ ]);
227
+ var unsupportedModerationProvider = (provider) => new UnsupportedProviderError(provider, `batchwork: provider "${provider}" does not offer batch moderation. Moderations are supported for: openai, mistral.`);
228
+ var TRANSCRIPTION_PROVIDERS = new Set([
229
+ "groq",
230
+ "mistral",
231
+ "together"
232
+ ]);
233
+ var unsupportedTranscriptionProvider = (provider) => new UnsupportedProviderError(provider, `batchwork: provider "${provider}" does not offer batch transcription. Transcriptions are supported for: groq, mistral, together.`);
202
234
  var IMAGE_PROVIDERS = new Set([
203
235
  "google",
204
236
  "openai",
@@ -232,7 +264,12 @@ var createCaptureImageModel = async (resolved, credentials, fetchImpl) => {
232
264
  };
233
265
 
234
266
  // src/body.ts
235
- import { embed, generateImage, generateText } from "ai";
267
+ import {
268
+ embed,
269
+ experimental_generateVideo,
270
+ generateImage,
271
+ generateText
272
+ } from "ai";
236
273
  var MAX_CAUSE_DEPTH = 10;
237
274
 
238
275
  class CaptureSignalError extends Error {
@@ -395,12 +432,99 @@ var buildEmbeddingBodies = async (resolved, requests, credentials, rawLimits) =>
395
432
  return built;
396
433
  });
397
434
  };
398
- var mergeImageDefaults = (request, defaults) => {
399
- if (!defaults) {
400
- return request;
435
+ var MODERATION_ENDPOINT = "/v1/moderations";
436
+ var moderationInput = (request) => {
437
+ const imageUrls = request.imageUrls ?? [];
438
+ if (imageUrls.length === 0) {
439
+ return request.value;
401
440
  }
402
- return { ...defaults, ...request };
441
+ return [
442
+ ...request.value === undefined ? [] : [{ text: request.value, type: "text" }],
443
+ ...imageUrls.map((url) => ({ image_url: { url }, type: "image_url" }))
444
+ ];
445
+ };
446
+ var moderationBody = (resolved, request, customId) => {
447
+ if (request.value === undefined && !request.imageUrls?.length) {
448
+ throw new BatchworkError(`batchwork: moderation request "${customId}" needs \`value\` or \`imageUrls\`.`);
449
+ }
450
+ const options = request.providerOptions?.[resolved.provider];
451
+ if (resolved.provider === "openai") {
452
+ return {
453
+ input: moderationInput(request),
454
+ model: resolved.modelId,
455
+ ...options
456
+ };
457
+ }
458
+ if (resolved.provider === "mistral") {
459
+ if (request.imageUrls?.length) {
460
+ throw new BatchworkError(`batchwork: moderation request "${customId}" has \`imageUrls\`, but Mistral moderation is text-only.`);
461
+ }
462
+ return { input: request.value, model: resolved.modelId, ...options };
463
+ }
464
+ throw unsupportedModerationProvider(resolved.provider);
465
+ };
466
+ var buildModerationBodies = (resolved, requests, rawLimits) => {
467
+ const limits = resolveBatchLimits(rawLimits);
468
+ if (requests.length > limits.maxRequests) {
469
+ throw new BatchworkError(`batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`);
470
+ }
471
+ return assignCustomIds(requests).map((item) => {
472
+ const body = moderationBody(resolved, item.request, item.customId);
473
+ assertByteLength(`request "${item.customId}"`, JSON.stringify(body), limits.maxRequestBytes);
474
+ return { body, customId: item.customId, endpoint: MODERATION_ENDPOINT };
475
+ });
476
+ };
477
+ var TRANSCRIPTION_ENDPOINT = "/v1/audio/transcriptions";
478
+ var transcriptionBody = (resolved, request) => {
479
+ const options = request.providerOptions?.[resolved.provider];
480
+ if (resolved.provider === "groq") {
481
+ return {
482
+ model: resolved.modelId,
483
+ url: request.audioUrl,
484
+ ...request.language ? { language: request.language } : {},
485
+ ...request.timestampGranularities ? {
486
+ response_format: "verbose_json",
487
+ timestamp_granularities: request.timestampGranularities
488
+ } : {},
489
+ ...options
490
+ };
491
+ }
492
+ if (resolved.provider === "mistral") {
493
+ return {
494
+ file_url: request.audioUrl,
495
+ model: resolved.modelId,
496
+ ...request.language ? { language: request.language } : {},
497
+ ...request.timestampGranularities ? { timestamp_granularities: request.timestampGranularities } : {},
498
+ ...options
499
+ };
500
+ }
501
+ if (resolved.provider === "together") {
502
+ return {
503
+ file: request.audioUrl,
504
+ model: resolved.modelId,
505
+ ...request.language ? { language: request.language } : {},
506
+ ...request.timestampGranularities ? {
507
+ response_format: "verbose_json",
508
+ timestamp_granularities: request.timestampGranularities
509
+ } : {},
510
+ ...options
511
+ };
512
+ }
513
+ throw unsupportedTranscriptionProvider(resolved.provider);
514
+ };
515
+ var buildAudioBodies = (resolved, requests, defaults, endpoint, rawLimits) => {
516
+ const limits = resolveBatchLimits(rawLimits);
517
+ if (requests.length > limits.maxRequests) {
518
+ throw new BatchworkError(`batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`);
519
+ }
520
+ return assignCustomIds(requests).map((item) => {
521
+ const body = transcriptionBody(resolved, mergeDefaults(item.request, defaults));
522
+ assertByteLength(`request "${item.customId}"`, JSON.stringify(body), limits.maxRequestBytes);
523
+ return { body, customId: item.customId, endpoint };
524
+ });
403
525
  };
526
+ var buildTranscriptionBodies = (resolved, requests, defaults, rawLimits) => buildAudioBodies(resolved, requests, defaults, TRANSCRIPTION_ENDPOINT, rawLimits);
527
+ var buildTranslationBodies = (resolved, requests, defaults, rawLimits) => buildAudioBodies(resolved, requests, defaults, "/v1/audio/translations", rawLimits);
404
528
  var buildImageBodies = async (resolved, requests, defaults, credentials, rawLimits) => {
405
529
  const limits = resolveBatchLimits(rawLimits);
406
530
  if (requests.length > limits.maxRequests) {
@@ -409,13 +533,95 @@ var buildImageBodies = async (resolved, requests, defaults, credentials, rawLimi
409
533
  const model = await createCaptureImageModel(resolved, credentials, captureFetch);
410
534
  const items = assignCustomIds(requests);
411
535
  return await mapWithConcurrency(items, limits.captureConcurrency, async (item) => {
412
- const built = await captureImageOne(model, mergeImageDefaults(item.request, defaults), item.customId, limits.maxRequestBytes);
536
+ const built = await captureImageOne(model, mergeDefaults(item.request, defaults), item.customId, limits.maxRequestBytes);
537
+ assertByteLength(`request "${item.customId}"`, JSON.stringify(built.body), limits.maxRequestBytes);
538
+ return built;
539
+ });
540
+ };
541
+ var IMAGE_EDIT_ENDPOINT = "/v1/images/edits";
542
+ var openaiImageRef = (ref) => ("fileId" in ref) ? { file_id: ref.fileId } : { image_url: ref.imageUrl };
543
+ var imageEditBody = (resolved, request, customId) => {
544
+ if (request.images.length === 0) {
545
+ throw new BatchworkError(`batchwork: image-edit request "${customId}" needs at least one entry in \`images\`.`);
546
+ }
547
+ const options = request.providerOptions?.[resolved.provider];
548
+ if (resolved.provider === "openai") {
549
+ return {
550
+ images: request.images.map(openaiImageRef),
551
+ model: resolved.modelId,
552
+ prompt: request.prompt,
553
+ ...request.mask ? { mask: openaiImageRef(request.mask) } : {},
554
+ ...request.n === undefined ? {} : { n: request.n },
555
+ ...request.size ? { size: request.size } : {},
556
+ ...options
557
+ };
558
+ }
559
+ if (resolved.provider === "xai") {
560
+ if (request.mask) {
561
+ throw new BatchworkError(`batchwork: image-edit request "${customId}" has a \`mask\`, but xAI image edits do not support masks.`);
562
+ }
563
+ if (request.size) {
564
+ throw new BatchworkError(`batchwork: image-edit request "${customId}" has \`size\`, but xAI image edits take \`providerOptions.xai.aspect_ratio\` instead.`);
565
+ }
566
+ const urls = request.images.map((ref) => {
567
+ if ("fileId" in ref) {
568
+ throw new BatchworkError(`batchwork: image-edit request "${customId}" uses a \`fileId\` reference, but xAI image edits accept image URLs only.`);
569
+ }
570
+ return ref.imageUrl;
571
+ });
572
+ return {
573
+ model: resolved.modelId,
574
+ prompt: request.prompt,
575
+ ...urls.length === 1 ? { image: { url: urls[0] } } : { images: urls.map((url) => ({ url })) },
576
+ ...request.n === undefined ? {} : { n: request.n },
577
+ ...options
578
+ };
579
+ }
580
+ throw unsupportedImageEditProvider(resolved.provider);
581
+ };
582
+ var buildImageEditBodies = (resolved, requests, defaults, rawLimits) => {
583
+ const limits = resolveBatchLimits(rawLimits);
584
+ if (requests.length > limits.maxRequests) {
585
+ throw new BatchworkError(`batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`);
586
+ }
587
+ return assignCustomIds(requests).map((item) => {
588
+ const body = imageEditBody(resolved, mergeDefaults(item.request, defaults), item.customId);
589
+ assertByteLength(`request "${item.customId}"`, JSON.stringify(body), limits.maxRequestBytes);
590
+ return { body, customId: item.customId, endpoint: IMAGE_EDIT_ENDPOINT };
591
+ });
592
+ };
593
+ var captureVideoOne = async (model, request, customId, maxRequestBytes) => {
594
+ try {
595
+ await experimental_generateVideo({
596
+ aspectRatio: request.aspectRatio,
597
+ duration: request.duration,
598
+ maxRetries: 0,
599
+ model,
600
+ prompt: request.prompt,
601
+ providerOptions: request.providerOptions,
602
+ resolution: request.resolution
603
+ });
604
+ } catch (error) {
605
+ return bodyFromCapture(error, customId, maxRequestBytes);
606
+ }
607
+ throw new BatchworkError("batchwork: the request was not intercepted while building the video body.");
608
+ };
609
+ var buildVideoBodies = async (resolved, requests, defaults, credentials, rawLimits) => {
610
+ const limits = resolveBatchLimits(rawLimits);
611
+ if (requests.length > limits.maxRequests) {
612
+ throw new BatchworkError(`batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`);
613
+ }
614
+ const model = await createCaptureVideoModel(resolved, credentials, captureFetch);
615
+ const items = assignCustomIds(requests);
616
+ return await mapWithConcurrency(items, limits.captureConcurrency, async (item) => {
617
+ const built = await captureVideoOne(model, mergeDefaults(item.request, defaults), item.customId, limits.maxRequestBytes);
413
618
  assertByteLength(`request "${item.customId}"`, JSON.stringify(built.body), limits.maxRequestBytes);
414
619
  return built;
415
620
  });
416
621
  };
417
622
 
418
623
  // src/batch.ts
624
+ var EMPTY_REQUESTS_MESSAGE = "batchwork: `requests` must not be empty.";
419
625
  var pickCredentials = (source) => ({
420
626
  apiKey: source.apiKey,
421
627
  baseURL: source.baseURL,
@@ -432,7 +638,7 @@ var providerFromRef = (ref) => {
432
638
  };
433
639
  var submitText = async (options) => {
434
640
  if (options.requests.length === 0) {
435
- throw new BatchworkError("batchwork: `requests` must not be empty.");
641
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
436
642
  }
437
643
  const resolved = resolveModel(options.model);
438
644
  const credentials = pickCredentials(options);
@@ -451,7 +657,7 @@ var submitText = async (options) => {
451
657
  };
452
658
  var submitEmbeddings = async (options) => {
453
659
  if (options.requests.length === 0) {
454
- throw new BatchworkError("batchwork: `requests` must not be empty.");
660
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
455
661
  }
456
662
  const resolved = resolveModel(options.model);
457
663
  if (!EMBEDDING_PROVIDERS.has(resolved.provider)) {
@@ -473,7 +679,7 @@ var submitEmbeddings = async (options) => {
473
679
  };
474
680
  var submitImages = async (options) => {
475
681
  if (options.requests.length === 0) {
476
- throw new BatchworkError("batchwork: `requests` must not be empty.");
682
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
477
683
  }
478
684
  const resolved = resolveModel(options.model);
479
685
  if (!IMAGE_PROVIDERS.has(resolved.provider)) {
@@ -493,10 +699,127 @@ var submitImages = async (options) => {
493
699
  });
494
700
  return new BatchJob(adapter, credentials, snapshot);
495
701
  };
702
+ var submitImageEdits = async (options) => {
703
+ if (options.requests.length === 0) {
704
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
705
+ }
706
+ const resolved = resolveModel(options.model);
707
+ if (!IMAGE_EDIT_PROVIDERS.has(resolved.provider)) {
708
+ throw unsupportedImageEditProvider(resolved.provider);
709
+ }
710
+ const credentials = pickCredentials(options);
711
+ const limits = resolveBatchLimits(options.limits);
712
+ const adapter = getAdapter(resolved.provider);
713
+ const built = buildImageEditBodies(resolved, options.requests, options.defaults, limits);
714
+ const snapshot = await adapter.submit({
715
+ built,
716
+ credentials,
717
+ endpoint: built[0]?.endpoint ?? "",
718
+ limits,
719
+ metadata: options.metadata,
720
+ modelId: resolved.modelId
721
+ });
722
+ return new BatchJob(adapter, credentials, snapshot);
723
+ };
724
+ var submitModerations = async (options) => {
725
+ if (options.requests.length === 0) {
726
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
727
+ }
728
+ const resolved = resolveModel(options.model);
729
+ if (!MODERATION_PROVIDERS.has(resolved.provider)) {
730
+ throw unsupportedModerationProvider(resolved.provider);
731
+ }
732
+ const credentials = pickCredentials(options);
733
+ const limits = resolveBatchLimits(options.limits);
734
+ const adapter = getAdapter(resolved.provider);
735
+ const built = buildModerationBodies(resolved, options.requests, limits);
736
+ const snapshot = await adapter.submit({
737
+ built,
738
+ credentials,
739
+ endpoint: built[0]?.endpoint ?? "",
740
+ limits,
741
+ metadata: options.metadata,
742
+ modelId: resolved.modelId
743
+ });
744
+ return new BatchJob(adapter, credentials, snapshot);
745
+ };
746
+ var submitTranscriptions = async (options) => {
747
+ if (options.requests.length === 0) {
748
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
749
+ }
750
+ const resolved = resolveModel(options.model);
751
+ if (!TRANSCRIPTION_PROVIDERS.has(resolved.provider)) {
752
+ throw unsupportedTranscriptionProvider(resolved.provider);
753
+ }
754
+ const credentials = pickCredentials(options);
755
+ const limits = resolveBatchLimits(options.limits);
756
+ const adapter = getAdapter(resolved.provider);
757
+ const built = buildTranscriptionBodies(resolved, options.requests, options.defaults, limits);
758
+ const snapshot = await adapter.submit({
759
+ built,
760
+ credentials,
761
+ endpoint: built[0]?.endpoint ?? "",
762
+ limits,
763
+ metadata: options.metadata,
764
+ modelId: resolved.modelId
765
+ });
766
+ return new BatchJob(adapter, credentials, snapshot);
767
+ };
768
+ var submitVideos = async (options) => {
769
+ if (options.requests.length === 0) {
770
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
771
+ }
772
+ const resolved = resolveModel(options.model);
773
+ if (!VIDEO_PROVIDERS.has(resolved.provider)) {
774
+ throw unsupportedVideoProvider(resolved.provider);
775
+ }
776
+ const credentials = pickCredentials(options);
777
+ const limits = resolveBatchLimits(options.limits);
778
+ const adapter = getAdapter(resolved.provider);
779
+ const built = await buildVideoBodies(resolved, options.requests, options.defaults, credentials, limits);
780
+ const snapshot = await adapter.submit({
781
+ built,
782
+ credentials,
783
+ endpoint: built[0]?.endpoint ?? "",
784
+ limits,
785
+ metadata: options.metadata,
786
+ modelId: resolved.modelId
787
+ });
788
+ return new BatchJob(adapter, credentials, snapshot);
789
+ };
790
+ var submitTranslations = async (options) => {
791
+ if (options.requests.length === 0) {
792
+ throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);
793
+ }
794
+ const resolved = resolveModel(options.model);
795
+ if (!TRANSLATION_PROVIDERS.has(resolved.provider)) {
796
+ throw unsupportedTranslationProvider(resolved.provider);
797
+ }
798
+ const credentials = pickCredentials(options);
799
+ const limits = resolveBatchLimits(options.limits);
800
+ const adapter = getAdapter(resolved.provider);
801
+ const built = buildTranslationBodies(resolved, options.requests, options.defaults, limits);
802
+ const snapshot = await adapter.submit({
803
+ built,
804
+ credentials,
805
+ endpoint: built[0]?.endpoint ?? "",
806
+ limits,
807
+ metadata: options.metadata,
808
+ modelId: resolved.modelId
809
+ });
810
+ return new BatchJob(adapter, credentials, snapshot);
811
+ };
496
812
  var batch = Object.assign(submitText, {
497
813
  embeddings: submitEmbeddings,
498
- images: submitImages,
499
- text: submitText
814
+ images: Object.assign(submitImages, {
815
+ create: submitImages,
816
+ edit: submitImageEdits
817
+ }),
818
+ moderations: submitModerations,
819
+ text: submitText,
820
+ transcriptions: submitTranscriptions,
821
+ translations: submitTranslations,
822
+ videos: submitVideos
500
823
  });
501
824
  var batchEmbeddings = submitEmbeddings;
502
825
  var batchImages = submitImages;
@@ -517,5 +840,5 @@ var cancelBatch = async (ref) => {
517
840
 
518
841
  export { resolveModel, batch, batchEmbeddings, batchImages, getBatch, getBatchResults, cancelBatch };
519
842
 
520
- //# debugId=21B5A5E0E7FCF0AE64756E2164756E21
521
- //# sourceMappingURL=chunk-bjkbtj1q.js.map
843
+ //# debugId=0D659D78B4576A4164756E2164756E21
844
+ //# sourceMappingURL=chunk-qqz5h9v6.js.map
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/model.ts", "../src/body.ts", "../src/batch.ts"],
4
+ "sourcesContent": [
5
+ "import type { createAnthropic } from \"@ai-sdk/anthropic\";\nimport type { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport type { createGroq } from \"@ai-sdk/groq\";\nimport type { createMistral } from \"@ai-sdk/mistral\";\nimport type { createOpenAI } from \"@ai-sdk/openai\";\nimport type { createTogetherAI } from \"@ai-sdk/togetherai\";\nimport type { createXai } from \"@ai-sdk/xai\";\nimport type {\n EmbeddingModel,\n ImageModel,\n LanguageModel,\n TranscriptionModel,\n} from \"ai\";\n\nimport { MissingDependencyError, UnsupportedProviderError } from \"./errors\";\nimport type { BatchProvider, ProviderCredentials, VideoModel } from \"./types\";\n\n/** The shape `loadProvider` expects from each optional `@ai-sdk/*` package. */\ninterface AnthropicModule {\n createAnthropic: typeof createAnthropic;\n}\ninterface GoogleModule {\n createGoogleGenerativeAI: typeof createGoogleGenerativeAI;\n}\ninterface GroqModule {\n createGroq: typeof createGroq;\n}\ninterface MistralModule {\n createMistral: typeof createMistral;\n}\ninterface OpenAIModule {\n createOpenAI: typeof createOpenAI;\n}\ninterface TogetherModule {\n createTogetherAI: typeof createTogetherAI;\n}\ninterface XaiModule {\n createXai: typeof createXai;\n}\n\n/** A fetch implementation compatible with the AI SDK provider `fetch` option. */\nexport type CapturingFetch = typeof globalThis.fetch;\n\n/** OpenAI exposes several request shapes; we mirror the one the model implies. */\nexport type OpenAIModelKind = \"chat\" | \"responses\" | \"completion\";\n\nexport interface ResolvedModel {\n /** Relevant for OpenAI; other providers always use a single chat endpoint. */\n kind: OpenAIModelKind;\n modelId: string;\n provider: BatchProvider;\n}\n\n/**\n * Placeholder API key used only when building request bodies. Body building\n * intercepts the request before it is sent, so no real credential is needed —\n * but the provider refuses to construct a model without one.\n */\nconst CAPTURE_API_KEY = \"batchwork-capture\";\n\n/** The optional `@ai-sdk/*` package backing each provider. */\nconst PACKAGE_BY_PROVIDER: Record<\n BatchProvider,\n { label: string; specifier: string }\n> = {\n anthropic: { label: \"Anthropic\", specifier: \"@ai-sdk/anthropic\" },\n google: { label: \"Google Gemini\", specifier: \"@ai-sdk/google\" },\n groq: { label: \"Groq\", specifier: \"@ai-sdk/groq\" },\n mistral: { label: \"Mistral\", specifier: \"@ai-sdk/mistral\" },\n openai: { label: \"OpenAI\", specifier: \"@ai-sdk/openai\" },\n together: { label: \"Together AI\", specifier: \"@ai-sdk/togetherai\" },\n xai: { label: \"xAI\", specifier: \"@ai-sdk/xai\" },\n};\n\n/**\n * AI SDK provider id prefixes (the part before the first `.` in `model.provider`)\n * mapped to batch providers.\n */\nconst PROVIDER_BY_FAMILY: Record<string, BatchProvider> = {\n anthropic: \"anthropic\",\n google: \"google\",\n groq: \"groq\",\n mistral: \"mistral\",\n openai: \"openai\",\n together: \"together\",\n togetherai: \"together\",\n xai: \"xai\",\n};\n\n/** Aliases accepted in the `\"provider/model\"` string form. */\nconst PROVIDER_BY_ALIAS: Record<string, BatchProvider> = {\n ...PROVIDER_BY_FAMILY,\n gemini: \"google\",\n};\n\nconst splitOnce = (value: string, separator: string): [string, string] => {\n const index = value.indexOf(separator);\n if (index === -1) {\n return [value, \"\"];\n }\n return [value.slice(0, index), value.slice(index + separator.length)];\n};\n\nconst openaiKind = (suffix: string): OpenAIModelKind => {\n if (suffix === \"responses\") {\n return \"responses\";\n }\n if (suffix === \"completion\") {\n return \"completion\";\n }\n // Default to chat completions: the most widely supported batch endpoint.\n return \"chat\";\n};\n\n/** Resolve a `\"provider/model\"` string into a provider + model id. */\nconst resolveModelString = (value: string): ResolvedModel => {\n const [providerId, modelId] = splitOnce(value, \"/\");\n if (modelId === \"\") {\n throw new UnsupportedProviderError(value);\n }\n const provider = PROVIDER_BY_ALIAS[providerId];\n if (!provider) {\n throw new UnsupportedProviderError(providerId);\n }\n return { kind: \"chat\", modelId, provider };\n};\n\n/**\n * Resolve any AI SDK `model` (a `\"provider/model\"` string or a provider model\n * object such as `openai(\"gpt-5.5\")`) to a provider + model id + request\n * shape. Gateway/registry model objects whose `modelId` is itself\n * `\"provider/model\"` are also handled.\n */\nexport const resolveModel = (\n model:\n | LanguageModel\n | EmbeddingModel\n | ImageModel\n | TranscriptionModel\n | VideoModel\n): ResolvedModel => {\n if (typeof model === \"string\") {\n return resolveModelString(model);\n }\n\n const [family, suffix] = splitOnce(model.provider, \".\");\n const provider = PROVIDER_BY_FAMILY[family];\n if (provider === \"openai\") {\n return { kind: openaiKind(suffix), modelId: model.modelId, provider };\n }\n if (provider) {\n return { kind: \"chat\", modelId: model.modelId, provider };\n }\n // Gateway/registry providers carry the real target in the model id.\n if (model.modelId.includes(\"/\")) {\n return resolveModelString(model.modelId);\n }\n throw new UnsupportedProviderError(model.provider);\n};\n\nconst importProvider = (provider: BatchProvider): Promise<unknown> => {\n switch (provider) {\n case \"anthropic\": {\n return import(\"@ai-sdk/anthropic\");\n }\n case \"google\": {\n return import(\"@ai-sdk/google\");\n }\n case \"groq\": {\n return import(\"@ai-sdk/groq\");\n }\n case \"mistral\": {\n return import(\"@ai-sdk/mistral\");\n }\n case \"openai\": {\n return import(\"@ai-sdk/openai\");\n }\n case \"together\": {\n return import(\"@ai-sdk/togetherai\");\n }\n case \"xai\": {\n return import(\"@ai-sdk/xai\");\n }\n default: {\n return Promise.reject(new UnsupportedProviderError(provider));\n }\n }\n};\n\n/**\n * Import the `@ai-sdk/*` package for a provider, translating a missing optional\n * dependency into a `MissingDependencyError`. The importer is injectable (like\n * the capturing `fetch`) so tests can drive the failure paths without\n * uninstalling a package. Exported for testing; not part of the public API.\n */\nexport const loadProvider = async <T>(\n provider: BatchProvider,\n load: (target: BatchProvider) => Promise<unknown> = importProvider\n): Promise<T> => {\n try {\n return (await load(provider)) as T;\n } catch (error) {\n if (error instanceof UnsupportedProviderError) {\n throw error;\n }\n const { specifier, label } = PACKAGE_BY_PROVIDER[provider];\n throw new MissingDependencyError(specifier, label);\n }\n};\n\n/**\n * Construct an AI SDK model wired to a capturing `fetch`, used to derive the\n * provider request body for each batch item without making a network call.\n */\nexport const createCaptureModel = async (\n resolved: ResolvedModel,\n credentials: ProviderCredentials,\n fetchImpl: CapturingFetch\n): Promise<LanguageModel> => {\n const settings = {\n apiKey: credentials.apiKey ?? CAPTURE_API_KEY,\n baseURL: credentials.baseURL,\n fetch: fetchImpl,\n headers: credentials.headers,\n };\n\n switch (resolved.provider) {\n case \"openai\": {\n const { createOpenAI } = await loadProvider<OpenAIModule>(\"openai\");\n const provider = createOpenAI(settings);\n if (resolved.kind === \"responses\") {\n return provider.responses(resolved.modelId);\n }\n if (resolved.kind === \"completion\") {\n return provider.completion(resolved.modelId);\n }\n return provider.chat(resolved.modelId);\n }\n case \"anthropic\": {\n const { createAnthropic } =\n await loadProvider<AnthropicModule>(\"anthropic\");\n return createAnthropic(settings).messages(resolved.modelId);\n }\n case \"groq\": {\n const { createGroq } = await loadProvider<GroqModule>(\"groq\");\n return createGroq(settings).languageModel(resolved.modelId);\n }\n case \"mistral\": {\n const { createMistral } = await loadProvider<MistralModule>(\"mistral\");\n return createMistral(settings).languageModel(resolved.modelId);\n }\n case \"google\": {\n const { createGoogleGenerativeAI } =\n await loadProvider<GoogleModule>(\"google\");\n return createGoogleGenerativeAI(settings).languageModel(resolved.modelId);\n }\n case \"xai\": {\n const { createXai } = await loadProvider<XaiModule>(\"xai\");\n return createXai(settings).languageModel(resolved.modelId);\n }\n case \"together\": {\n const { createTogetherAI } =\n await loadProvider<TogetherModule>(\"together\");\n return createTogetherAI(settings).languageModel(resolved.modelId);\n }\n default: {\n throw new UnsupportedProviderError(resolved.provider);\n }\n }\n};\n\n/**\n * Providers whose batch API accepts embeddings. Together is excluded: it exposes\n * an embedding model, but its batch endpoint rejects `/v1/embeddings`. Anthropic,\n * Groq, and xAI have no embedding model at all.\n */\nexport const EMBEDDING_PROVIDERS = new Set<BatchProvider>([\n \"google\",\n \"mistral\",\n \"openai\",\n]);\n\nexport const unsupportedEmbeddingProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch embeddings. Embeddings are supported for: openai, mistral, google.`\n );\n\n/**\n * Construct an AI SDK text embedding model wired to a capturing `fetch`, used to\n * derive the provider embedding request body for each batch item without making\n * a network call. Throws for providers without an embedding model.\n */\nexport const createCaptureEmbeddingModel = async (\n resolved: ResolvedModel,\n credentials: ProviderCredentials,\n fetchImpl: CapturingFetch\n): Promise<EmbeddingModel> => {\n const settings = {\n apiKey: credentials.apiKey ?? CAPTURE_API_KEY,\n baseURL: credentials.baseURL,\n fetch: fetchImpl,\n headers: credentials.headers,\n };\n\n switch (resolved.provider) {\n case \"openai\": {\n const { createOpenAI } = await loadProvider<OpenAIModule>(\"openai\");\n return createOpenAI(settings).embeddingModel(resolved.modelId);\n }\n case \"mistral\": {\n const { createMistral } = await loadProvider<MistralModule>(\"mistral\");\n return createMistral(settings).embeddingModel(resolved.modelId);\n }\n case \"google\": {\n const { createGoogleGenerativeAI } =\n await loadProvider<GoogleModule>(\"google\");\n return createGoogleGenerativeAI(settings).embeddingModel(\n resolved.modelId\n );\n }\n default: {\n throw unsupportedEmbeddingProvider(resolved.provider);\n }\n }\n};\n\n/**\n * Providers whose batch API accepts image editing. OpenAI and xAI both expose\n * `/v1/images/edits` as a batch endpoint (JSON bodies with asset references —\n * OpenAI takes uploaded file ids or image URLs plus an optional mask; xAI\n * takes image URLs only). Google's Gemini batch has no edit endpoint.\n */\nexport const IMAGE_EDIT_PROVIDERS = new Set<BatchProvider>([\"openai\", \"xai\"]);\n\nexport const unsupportedImageEditProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch image editing. Image edits are supported for: openai, xai.`\n );\n\n/**\n * Providers whose batch API accepts video generation. xAI exposes\n * `/v1/videos/generations` (plus `/edits` and `/extensions`) as batch\n * endpoints for Grok Imagine. OpenAI's Videos API (Sora) is deprecated and\n * shuts down 2026-09-24, so it is deliberately not supported; Google's Veo\n * models are not batch-compatible.\n */\nexport const VIDEO_PROVIDERS = new Set<BatchProvider>([\"xai\"]);\n\nexport const unsupportedVideoProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch video generation. Videos are supported for: xai.`\n );\n\n/**\n * Construct an AI SDK video model wired to a capturing `fetch`, used to derive\n * the provider video request body for each batch item without making a network\n * call. Throws for providers without batch video support.\n */\nexport const createCaptureVideoModel = async (\n resolved: ResolvedModel,\n credentials: ProviderCredentials,\n fetchImpl: CapturingFetch\n): Promise<VideoModel> => {\n if (resolved.provider !== \"xai\") {\n throw unsupportedVideoProvider(resolved.provider);\n }\n const { createXai } = await loadProvider<XaiModule>(\"xai\");\n return createXai({\n apiKey: credentials.apiKey ?? CAPTURE_API_KEY,\n baseURL: credentials.baseURL,\n fetch: fetchImpl,\n headers: credentials.headers,\n }).video(resolved.modelId);\n};\n\n/**\n * Providers whose batch API accepts audio translation (Whisper's\n * translate-to-English task). Groq and Together expose\n * `/v1/audio/translations` as a batch endpoint; Mistral batches\n * transcriptions but not translations.\n */\nexport const TRANSLATION_PROVIDERS = new Set<BatchProvider>([\n \"groq\",\n \"together\",\n]);\n\nexport const unsupportedTranslationProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch translation. Translations are supported for: groq, together.`\n );\n\n/**\n * Providers whose batch API accepts moderation. OpenAI exposes\n * `/v1/moderations` as a batch endpoint (omni moderation, text + images);\n * Mistral runs its moderation models through the same batch job flow\n * (text-only). No other provider has a standalone moderation API.\n */\nexport const MODERATION_PROVIDERS = new Set<BatchProvider>([\n \"mistral\",\n \"openai\",\n]);\n\nexport const unsupportedModerationProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch moderation. Moderations are supported for: openai, mistral.`\n );\n\n/**\n * Providers whose batch API accepts audio transcription. Groq, Mistral, and\n * Together expose `/v1/audio/transcriptions` as a batch endpoint; OpenAI's\n * batch API does not accept audio endpoints, and the remaining providers have\n * no standalone transcription API.\n */\nexport const TRANSCRIPTION_PROVIDERS = new Set<BatchProvider>([\n \"groq\",\n \"mistral\",\n \"together\",\n]);\n\nexport const unsupportedTranscriptionProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch transcription. Transcriptions are supported for: groq, mistral, together.`\n );\n\n/**\n * Providers whose batch API accepts image generation. OpenAI and xAI expose\n * `/v1/images/generations` as a batch endpoint; Google runs Gemini image models\n * through `:batchGenerateContent`. Imagen (Google `:predict`) is not\n * batch-supported, Together's batch API is chat/audio only, and Anthropic, Groq,\n * and Mistral have no image model.\n */\nexport const IMAGE_PROVIDERS = new Set<BatchProvider>([\n \"google\",\n \"openai\",\n \"xai\",\n]);\n\nexport const unsupportedImageProvider = (\n provider: BatchProvider\n): UnsupportedProviderError =>\n new UnsupportedProviderError(\n provider,\n `batchwork: provider \"${provider}\" does not offer batch image generation. Image batches are supported for: openai, google, xai.`\n );\n\n/**\n * Construct an AI SDK image model wired to a capturing `fetch`, used to derive\n * the provider image-generation request body for each batch item without making\n * a network call. Throws for providers without batch image support.\n */\nexport const createCaptureImageModel = async (\n resolved: ResolvedModel,\n credentials: ProviderCredentials,\n fetchImpl: CapturingFetch\n): Promise<ImageModel> => {\n const settings = {\n apiKey: credentials.apiKey ?? CAPTURE_API_KEY,\n baseURL: credentials.baseURL,\n fetch: fetchImpl,\n headers: credentials.headers,\n };\n\n switch (resolved.provider) {\n case \"openai\": {\n const { createOpenAI } = await loadProvider<OpenAIModule>(\"openai\");\n return createOpenAI(settings).image(resolved.modelId);\n }\n case \"google\": {\n const { createGoogleGenerativeAI } =\n await loadProvider<GoogleModule>(\"google\");\n return createGoogleGenerativeAI(settings).image(resolved.modelId);\n }\n case \"xai\": {\n const { createXai } = await loadProvider<XaiModule>(\"xai\");\n return createXai(settings).image(resolved.modelId);\n }\n default: {\n throw unsupportedImageProvider(resolved.provider);\n }\n }\n};\n",
6
+ "import {\n embed,\n experimental_generateVideo,\n generateImage,\n generateText,\n} from \"ai\";\nimport type { EmbeddingModel, ImageModel, LanguageModel } from \"ai\";\n\nimport { BatchworkError } from \"./errors\";\nimport {\n assertByteLength,\n mapWithConcurrency,\n resolveBatchLimits,\n} from \"./limits\";\nimport type { ResolvedBatchLimits } from \"./limits\";\nimport {\n createCaptureEmbeddingModel,\n createCaptureImageModel,\n createCaptureModel,\n createCaptureVideoModel,\n unsupportedImageEditProvider,\n unsupportedModerationProvider,\n unsupportedTranscriptionProvider,\n} from \"./model\";\nimport type { CapturingFetch, ResolvedModel } from \"./model\";\nimport type {\n BatchDefaults,\n BatchEmbeddingRequest,\n BatchImageDefaults,\n BatchImageEditDefaults,\n BatchImageEditRequest,\n BatchImageRef,\n BatchImageRequest,\n BatchLimits,\n BatchModerationRequest,\n BatchRequest,\n BatchTranscriptionDefaults,\n BatchTranscriptionRequest,\n BatchTranslationDefaults,\n BatchTranslationRequest,\n BatchVideoDefaults,\n BatchVideoRequest,\n ProviderCredentials,\n VideoModel,\n} from \"./types\";\n\ntype GenerateTextInput = Parameters<typeof generateText>[0];\n\n/** A provider request body derived from a single batch item. */\nexport interface BuiltRequest {\n /** The serialized provider request body (becomes the batch line). */\n body: Record<string, unknown>;\n customId: string;\n /** API endpoint path the model targets, e.g. `/v1/chat/completions`. */\n endpoint: string;\n}\n\nconst MAX_CAUSE_DEPTH = 10;\n\n/**\n * Thrown by the capturing `fetch` to abort the request after its body has been\n * serialized. The body travels inside the error (not shared state), so capture\n * is correct even under concurrency.\n */\nclass CaptureSignalError extends Error {\n readonly url: string;\n readonly rawBody: string;\n\n constructor(url: string, rawBody: string) {\n super(\"batchwork:capture\");\n this.name = \"CaptureSignalError\";\n this.url = url;\n this.rawBody = rawBody;\n }\n}\n\nconst resolveUrl = (input: string | URL | Request): string => {\n if (typeof input === \"string\") {\n return input;\n }\n if (input instanceof URL) {\n return input.toString();\n }\n return input.url;\n};\n\nconst extractBody = (init?: RequestInit): string => {\n const body = init?.body;\n if (typeof body === \"string\") {\n return body;\n }\n if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n }\n throw new BatchworkError(\n \"batchwork: unable to read the provider request body during capture.\"\n );\n};\n\n// `CapturingFetch` is `typeof fetch`, whose shape varies by runtime types (e.g.\n// Bun adds a required `preconnect` method). We only ever call it as a plain\n// fetch, so cast the bare implementation rather than stub the extra members.\nconst captureFetch = ((input: string | URL | Request, init?: RequestInit) =>\n Promise.reject(\n new CaptureSignalError(resolveUrl(input), extractBody(init))\n )) as unknown as CapturingFetch;\n\nconst findCapture = (error: unknown): CaptureSignalError | undefined => {\n let current: unknown = error;\n let depth = 0;\n while (current && depth < MAX_CAUSE_DEPTH) {\n if (current instanceof CaptureSignalError) {\n return current;\n }\n current = (current as { cause?: unknown }).cause;\n depth += 1;\n }\n};\n\nconst endpointFromUrl = (url: string): string => {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n};\n\nconst mergeDefaults = <Request extends object>(\n request: Request,\n defaults: NoInfer<Partial<Request>> | undefined\n): Request => {\n if (!defaults) {\n return request;\n }\n return { ...defaults, ...request };\n};\n\n/**\n * Map a batch request to AI SDK `generateText` input. Fields are listed\n * explicitly so `customId` never leaks into the provider request.\n */\nconst toGenerateInput = (\n model: LanguageModel,\n request: BatchRequest\n): GenerateTextInput =>\n // `prompt`/`messages` form a discriminated union in the AI SDK types; we\n // pass both keys and let `generateText` validate the XOR at runtime.\n ({\n frequencyPenalty: request.frequencyPenalty,\n maxOutputTokens: request.maxOutputTokens,\n maxRetries: 0,\n messages: request.messages,\n model,\n presencePenalty: request.presencePenalty,\n prompt: request.prompt,\n providerOptions: request.providerOptions,\n seed: request.seed,\n stopSequences: request.stopSequences,\n system: request.system,\n temperature: request.temperature,\n toolChoice: request.toolChoice,\n tools: request.tools,\n topK: request.topK,\n topP: request.topP,\n }) as GenerateTextInput;\n\n/**\n * Turn a thrown capture into a {@link BuiltRequest}. A genuine failure (one that\n * never reached the capturing `fetch`, e.g. an invalid prompt) is rethrown.\n */\nconst bodyFromCapture = (\n error: unknown,\n customId: string,\n maxRequestBytes: number\n): BuiltRequest => {\n const capture = findCapture(error);\n if (capture) {\n assertByteLength(`request \"${customId}\"`, capture.rawBody, maxRequestBytes);\n return {\n body: JSON.parse(capture.rawBody) as Record<string, unknown>,\n customId,\n endpoint: endpointFromUrl(capture.url),\n };\n }\n throw error;\n};\n\nconst captureOne = async (\n model: LanguageModel,\n request: BatchRequest,\n customId: string,\n maxRequestBytes: number\n): Promise<BuiltRequest> => {\n try {\n await generateText(toGenerateInput(model, request));\n } catch (error) {\n return bodyFromCapture(error, customId, maxRequestBytes);\n }\n throw new BatchworkError(\n \"batchwork: the request was not intercepted while building the batch body.\"\n );\n};\n\nconst captureEmbeddingOne = async (\n model: EmbeddingModel,\n request: BatchEmbeddingRequest,\n customId: string,\n maxRequestBytes: number\n): Promise<BuiltRequest> => {\n try {\n // `maxRetries: 0` is load-bearing: with retries enabled the capture error\n // is wrapped in a `RetryError` (under `.errors`, not `.cause`) and\n // `findCapture`'s cause walk would miss it.\n await embed({\n maxRetries: 0,\n model,\n providerOptions: request.providerOptions,\n value: request.value,\n });\n } catch (error) {\n return bodyFromCapture(error, customId, maxRequestBytes);\n }\n throw new BatchworkError(\n \"batchwork: the request was not intercepted while building the embedding body.\"\n );\n};\n\nconst captureImageOne = async (\n model: ImageModel,\n request: BatchImageRequest,\n customId: string,\n maxRequestBytes: number\n): Promise<BuiltRequest> => {\n try {\n await generateImage({\n aspectRatio: request.aspectRatio,\n // `maxImagesPerCall: n` forces a single `doGenerate` call so the captured\n // body carries the requested `n` rather than a fanned-out per-call count.\n maxImagesPerCall: request.n,\n // `maxRetries: 0` is load-bearing: with retries enabled the capture error\n // is wrapped in a `RetryError` (under `.errors`, not `.cause`) and\n // `findCapture`'s cause walk would miss it.\n maxRetries: 0,\n model,\n n: request.n,\n prompt: request.prompt,\n providerOptions: request.providerOptions,\n seed: request.seed,\n size: request.size,\n });\n } catch (error) {\n return bodyFromCapture(error, customId, maxRequestBytes);\n }\n throw new BatchworkError(\n \"batchwork: the request was not intercepted while building the image body.\"\n );\n};\n\n/**\n * Assign and validate a unique `customId` for each request (sequentially, so\n * duplicates are reported deterministically before bodies are captured in\n * parallel). Auto-generates `request-{index}` when omitted.\n */\nconst assignCustomIds = <T extends { customId?: string }>(\n requests: readonly T[]\n): { customId: string; request: T }[] => {\n const seen = new Set<string>();\n return requests.map((request, index) => {\n const customId = request.customId ?? `request-${index}`;\n if (seen.has(customId)) {\n throw new BatchworkError(\n `batchwork: duplicate customId \"${customId}\". customId values must be unique within a batch.`\n );\n }\n seen.add(customId);\n return { customId, request };\n });\n};\n\n/**\n * Derive provider request bodies for every batch item by running each through\n * the AI SDK with a capturing `fetch`. This reuses the AI SDK's full message,\n * tool, and multimodal conversion, so the body matches what `generateText`\n * would send — minus the network call.\n */\nexport const buildRequestBodies = async (\n resolved: ResolvedModel,\n requests: readonly BatchRequest[],\n defaults: BatchDefaults | undefined,\n credentials: ProviderCredentials,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): Promise<BuiltRequest[]> => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n const model = await createCaptureModel(resolved, credentials, captureFetch);\n const items = assignCustomIds(requests);\n\n return await mapWithConcurrency(\n items,\n limits.captureConcurrency,\n async (item) => {\n const built = await captureOne(\n model,\n mergeDefaults(item.request, defaults),\n item.customId,\n limits.maxRequestBytes\n );\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(built.body),\n limits.maxRequestBytes\n );\n return built;\n }\n );\n};\n\n/**\n * Derive provider embedding request bodies for every batch item by running each\n * through the AI SDK `embed` with a capturing `fetch`. Mirrors\n * {@link buildRequestBodies} for the embedding endpoint; each item maps to a\n * single embedding (`input: [value]`), correlated by `customId`.\n */\nexport const buildEmbeddingBodies = async (\n resolved: ResolvedModel,\n requests: readonly BatchEmbeddingRequest[],\n credentials: ProviderCredentials,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): Promise<BuiltRequest[]> => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n const model = await createCaptureEmbeddingModel(\n resolved,\n credentials,\n captureFetch\n );\n const items = assignCustomIds(requests);\n\n return await mapWithConcurrency(\n items,\n limits.captureConcurrency,\n async (item) => {\n const built = await captureEmbeddingOne(\n model,\n item.request,\n item.customId,\n limits.maxRequestBytes\n );\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(built.body),\n limits.maxRequestBytes\n );\n return built;\n }\n );\n};\n\nconst MODERATION_ENDPOINT = \"/v1/moderations\";\n\n/**\n * Build the moderation `input`: a bare string for text, or the OpenAI omni\n * moderation content-part array when images are involved.\n */\nconst moderationInput = (request: BatchModerationRequest): unknown => {\n const imageUrls = request.imageUrls ?? [];\n if (imageUrls.length === 0) {\n return request.value;\n }\n return [\n ...(request.value === undefined\n ? []\n : [{ text: request.value, type: \"text\" }]),\n ...imageUrls.map((url) => ({ image_url: { url }, type: \"image_url\" })),\n ];\n};\n\n/**\n * Build the provider moderation body directly — the AI SDK has no moderation\n * call to capture. Both providers take `{ input }`; OpenAI carries the model\n * per line, Mistral on the job.\n */\nconst moderationBody = (\n resolved: ResolvedModel,\n request: BatchModerationRequest,\n customId: string\n): Record<string, unknown> => {\n if (request.value === undefined && !request.imageUrls?.length) {\n throw new BatchworkError(\n `batchwork: moderation request \"${customId}\" needs \\`value\\` or \\`imageUrls\\`.`\n );\n }\n const options = request.providerOptions?.[resolved.provider];\n if (resolved.provider === \"openai\") {\n return {\n input: moderationInput(request),\n model: resolved.modelId,\n ...options,\n };\n }\n if (resolved.provider === \"mistral\") {\n if (request.imageUrls?.length) {\n throw new BatchworkError(\n `batchwork: moderation request \"${customId}\" has \\`imageUrls\\`, but Mistral moderation is text-only.`\n );\n }\n // `model` is included for uniformity; the Mistral adapter strips it from\n // each line and sets it on the job instead.\n return { input: request.value, model: resolved.modelId, ...options };\n }\n throw unsupportedModerationProvider(resolved.provider);\n};\n\n/**\n * Build provider moderation request bodies for every batch item. Each item\n * maps to a single moderation verdict, correlated by `customId`.\n */\nexport const buildModerationBodies = (\n resolved: ResolvedModel,\n requests: readonly BatchModerationRequest[],\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): BuiltRequest[] => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n return assignCustomIds(requests).map((item) => {\n const body = moderationBody(resolved, item.request, item.customId);\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(body),\n limits.maxRequestBytes\n );\n return { body, customId: item.customId, endpoint: MODERATION_ENDPOINT };\n });\n};\n\nconst TRANSCRIPTION_ENDPOINT = \"/v1/audio/transcriptions\";\n\n/**\n * Build the provider transcription body directly. Batch audio endpoints take\n * JSON with a hosted audio URL — unlike the synchronous transcription APIs\n * (and the AI SDK's `transcribe`), which upload the file as multipart form\n * data — so there is no SDK call to capture.\n */\nconst transcriptionBody = (\n resolved: ResolvedModel,\n request: BatchTranscriptionRequest\n): Record<string, unknown> => {\n const options = request.providerOptions?.[resolved.provider];\n if (resolved.provider === \"groq\") {\n return {\n model: resolved.modelId,\n url: request.audioUrl,\n ...(request.language ? { language: request.language } : {}),\n // Timestamps require the verbose response shape; providerOptions can\n // still override `response_format` since it spreads last.\n ...(request.timestampGranularities\n ? {\n response_format: \"verbose_json\",\n timestamp_granularities: request.timestampGranularities,\n }\n : {}),\n ...options,\n };\n }\n if (resolved.provider === \"mistral\") {\n // `model` is included for uniformity; the Mistral adapter strips it from\n // each line and sets it on the job instead.\n return {\n file_url: request.audioUrl,\n model: resolved.modelId,\n ...(request.language ? { language: request.language } : {}),\n ...(request.timestampGranularities\n ? { timestamp_granularities: request.timestampGranularities }\n : {}),\n ...options,\n };\n }\n if (resolved.provider === \"together\") {\n // Together's audio batch lines carry the hosted URL in `file`; extra\n // fields pass through to the underlying transcription API.\n return {\n file: request.audioUrl,\n model: resolved.modelId,\n ...(request.language ? { language: request.language } : {}),\n ...(request.timestampGranularities\n ? {\n response_format: \"verbose_json\",\n timestamp_granularities: request.timestampGranularities,\n }\n : {}),\n ...options,\n };\n }\n throw unsupportedTranscriptionProvider(resolved.provider);\n};\n\nconst buildAudioBodies = (\n resolved: ResolvedModel,\n requests: readonly BatchTranscriptionRequest[],\n defaults: BatchTranscriptionDefaults | undefined,\n endpoint: string,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): BuiltRequest[] => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n return assignCustomIds(requests).map((item) => {\n const body = transcriptionBody(\n resolved,\n mergeDefaults(item.request, defaults)\n );\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(body),\n limits.maxRequestBytes\n );\n return { body, customId: item.customId, endpoint };\n });\n};\n\n/**\n * Build provider transcription request bodies for every batch item. Each item\n * maps to a single transcription of a hosted audio URL, correlated by\n * `customId`.\n */\nexport const buildTranscriptionBodies = (\n resolved: ResolvedModel,\n requests: readonly BatchTranscriptionRequest[],\n defaults: BatchTranscriptionDefaults | undefined,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): BuiltRequest[] =>\n buildAudioBodies(\n resolved,\n requests,\n defaults,\n TRANSCRIPTION_ENDPOINT,\n rawLimits\n );\n\n/**\n * Build provider audio-translation request bodies for every batch item. The\n * body shape is identical to transcription (minus `language` — the output is\n * always English); only the endpoint differs.\n */\nexport const buildTranslationBodies = (\n resolved: ResolvedModel,\n requests: readonly BatchTranslationRequest[],\n defaults: BatchTranslationDefaults | undefined,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): BuiltRequest[] =>\n buildAudioBodies(\n resolved,\n requests,\n defaults,\n \"/v1/audio/translations\",\n rawLimits\n );\n\n/**\n * Derive provider image-generation request bodies for every batch item by\n * running each through the AI SDK `generateImage` with a capturing `fetch`.\n * Mirrors {@link buildRequestBodies} for the image endpoint; each item maps to a\n * single image-generation call, correlated by `customId`.\n */\nexport const buildImageBodies = async (\n resolved: ResolvedModel,\n requests: readonly BatchImageRequest[],\n defaults: BatchImageDefaults | undefined,\n credentials: ProviderCredentials,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): Promise<BuiltRequest[]> => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n const model = await createCaptureImageModel(\n resolved,\n credentials,\n captureFetch\n );\n const items = assignCustomIds(requests);\n\n return await mapWithConcurrency(\n items,\n limits.captureConcurrency,\n async (item) => {\n const built = await captureImageOne(\n model,\n mergeDefaults(item.request, defaults),\n item.customId,\n limits.maxRequestBytes\n );\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(built.body),\n limits.maxRequestBytes\n );\n return built;\n }\n );\n};\n\nconst IMAGE_EDIT_ENDPOINT = \"/v1/images/edits\";\n\nconst openaiImageRef = (ref: BatchImageRef): Record<string, string> =>\n \"fileId\" in ref ? { file_id: ref.fileId } : { image_url: ref.imageUrl };\n\n/**\n * Build the provider image-edit body directly — the AI SDK's `generateImage`\n * has no way to pass input images, so there is no call to capture. Both\n * providers take JSON with asset references: OpenAI `{ images: [{ file_id |\n * image_url }], mask? }`, xAI `{ image: { url } }` (URLs only, no masks).\n */\nconst imageEditBody = (\n resolved: ResolvedModel,\n request: BatchImageEditRequest,\n customId: string\n): Record<string, unknown> => {\n if (request.images.length === 0) {\n throw new BatchworkError(\n `batchwork: image-edit request \"${customId}\" needs at least one entry in \\`images\\`.`\n );\n }\n const options = request.providerOptions?.[resolved.provider];\n if (resolved.provider === \"openai\") {\n return {\n images: request.images.map(openaiImageRef),\n model: resolved.modelId,\n prompt: request.prompt,\n ...(request.mask ? { mask: openaiImageRef(request.mask) } : {}),\n ...(request.n === undefined ? {} : { n: request.n }),\n ...(request.size ? { size: request.size } : {}),\n ...options,\n };\n }\n if (resolved.provider === \"xai\") {\n if (request.mask) {\n throw new BatchworkError(\n `batchwork: image-edit request \"${customId}\" has a \\`mask\\`, but xAI image edits do not support masks.`\n );\n }\n if (request.size) {\n throw new BatchworkError(\n `batchwork: image-edit request \"${customId}\" has \\`size\\`, but xAI image edits take \\`providerOptions.xai.aspect_ratio\\` instead.`\n );\n }\n const urls = request.images.map((ref) => {\n if (\"fileId\" in ref) {\n throw new BatchworkError(\n `batchwork: image-edit request \"${customId}\" uses a \\`fileId\\` reference, but xAI image edits accept image URLs only.`\n );\n }\n return ref.imageUrl;\n });\n return {\n model: resolved.modelId,\n prompt: request.prompt,\n ...(urls.length === 1\n ? { image: { url: urls[0] } }\n : { images: urls.map((url) => ({ url })) }),\n ...(request.n === undefined ? {} : { n: request.n }),\n ...options,\n };\n }\n throw unsupportedImageEditProvider(resolved.provider);\n};\n\n/**\n * Build provider image-edit request bodies for every batch item. Each item\n * maps to a single edit call, correlated by `customId`.\n */\nexport const buildImageEditBodies = (\n resolved: ResolvedModel,\n requests: readonly BatchImageEditRequest[],\n defaults: BatchImageEditDefaults | undefined,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): BuiltRequest[] => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n return assignCustomIds(requests).map((item) => {\n const body = imageEditBody(\n resolved,\n mergeDefaults(item.request, defaults),\n item.customId\n );\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(body),\n limits.maxRequestBytes\n );\n return { body, customId: item.customId, endpoint: IMAGE_EDIT_ENDPOINT };\n });\n};\n\nconst captureVideoOne = async (\n model: VideoModel,\n request: BatchVideoRequest,\n customId: string,\n maxRequestBytes: number\n): Promise<BuiltRequest> => {\n try {\n // The provider's first network call is the JSON job-creation POST (polling\n // only starts afterwards), so the capturing `fetch` intercepts the exact\n // body a batch line needs. Edit/extend modes (via `providerOptions`) are\n // captured against their own endpoints, which xAI batch also accepts.\n await experimental_generateVideo({\n aspectRatio: request.aspectRatio,\n duration: request.duration,\n // `maxRetries: 0` is load-bearing: with retries enabled the capture error\n // is wrapped in a `RetryError` (under `.errors`, not `.cause`) and\n // `findCapture`'s cause walk would miss it.\n maxRetries: 0,\n model,\n prompt: request.prompt,\n providerOptions: request.providerOptions,\n resolution: request.resolution,\n });\n } catch (error) {\n return bodyFromCapture(error, customId, maxRequestBytes);\n }\n throw new BatchworkError(\n \"batchwork: the request was not intercepted while building the video body.\"\n );\n};\n\n/**\n * Derive provider video-generation request bodies for every batch item by\n * running each through the AI SDK `generateVideo` with a capturing `fetch`.\n * Mirrors {@link buildRequestBodies} for the video endpoints; each item maps to\n * a single video job, correlated by `customId`.\n */\nexport const buildVideoBodies = async (\n resolved: ResolvedModel,\n requests: readonly BatchVideoRequest[],\n defaults: BatchVideoDefaults | undefined,\n credentials: ProviderCredentials,\n rawLimits?: BatchLimits | ResolvedBatchLimits\n): Promise<BuiltRequest[]> => {\n const limits = resolveBatchLimits(rawLimits);\n if (requests.length > limits.maxRequests) {\n throw new BatchworkError(\n `batchwork: requests length ${requests.length} exceeds the ${limits.maxRequests} request limit.`\n );\n }\n const model = await createCaptureVideoModel(\n resolved,\n credentials,\n captureFetch\n );\n const items = assignCustomIds(requests);\n\n return await mapWithConcurrency(\n items,\n limits.captureConcurrency,\n async (item) => {\n const built = await captureVideoOne(\n model,\n mergeDefaults(item.request, defaults),\n item.customId,\n limits.maxRequestBytes\n );\n assertByteLength(\n `request \"${item.customId}\"`,\n JSON.stringify(built.body),\n limits.maxRequestBytes\n );\n return built;\n }\n );\n};\n",
7
+ "import {\n buildEmbeddingBodies,\n buildImageBodies,\n buildImageEditBodies,\n buildModerationBodies,\n buildRequestBodies,\n buildTranscriptionBodies,\n buildTranslationBodies,\n buildVideoBodies,\n} from \"./body\";\nimport { BatchworkError } from \"./errors\";\nimport { BatchJob } from \"./job\";\nimport { resolveBatchLimits } from \"./limits\";\nimport {\n EMBEDDING_PROVIDERS,\n IMAGE_EDIT_PROVIDERS,\n IMAGE_PROVIDERS,\n MODERATION_PROVIDERS,\n resolveModel,\n TRANSCRIPTION_PROVIDERS,\n TRANSLATION_PROVIDERS,\n unsupportedEmbeddingProvider,\n unsupportedImageEditProvider,\n unsupportedImageProvider,\n unsupportedModerationProvider,\n unsupportedTranscriptionProvider,\n unsupportedTranslationProvider,\n unsupportedVideoProvider,\n VIDEO_PROVIDERS,\n} from \"./model\";\nimport { getAdapter } from \"./providers\";\nimport type {\n BatchEmbeddingsOptions,\n BatchImageEditOptions,\n BatchImageOptions,\n BatchModerationOptions,\n BatchOptions,\n BatchProvider,\n BatchRef,\n BatchResult,\n BatchTranscriptionOptions,\n BatchTranslationOptions,\n BatchVideoOptions,\n ProviderCredentials,\n} from \"./types\";\n\nconst EMPTY_REQUESTS_MESSAGE = \"batchwork: `requests` must not be empty.\";\n\nconst pickCredentials = (source: ProviderCredentials): ProviderCredentials => ({\n apiKey: source.apiKey,\n baseURL: source.baseURL,\n headers: source.headers,\n});\n\nconst providerFromRef = (ref: BatchRef): BatchProvider => {\n if (ref.provider) {\n return ref.provider;\n }\n if (ref.model !== undefined) {\n return resolveModel(ref.model).provider;\n }\n throw new BatchworkError(\n \"batchwork: provide `provider` or `model` to identify the batch.\"\n );\n};\n\n/**\n * Submit a batch of text/chat requests to the model's provider and return a\n * handle. Reachable as both `batch()` (shorthand) and `batch.text()`.\n *\n * Resolves immediately once the batch is accepted — it does not wait for\n * processing. Use the returned {@link BatchJob} to poll, wait, or stream\n * results.\n *\n * @example\n * const job = await batch({\n * model: openai(\"gpt-5.5\"),\n * requests: [{ customId: \"a\", prompt: \"Say hi\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n */\nconst submitText = async (options: BatchOptions): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = await buildRequestBodies(\n resolved,\n options.requests,\n options.defaults,\n credentials,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of embedding requests to the model's provider and return a\n * handle. Each request's `value` produces one vector, correlated by `customId`\n * via {@link BatchJob.results}. Supported for OpenAI, Mistral, Together, and\n * Google; other providers throw {@link UnsupportedProviderError}.\n *\n * @example\n * const job = await batch.embeddings({\n * model: openai.embeddingModel(\"text-embedding-3-small\"),\n * requests: [{ customId: \"a\", value: \"hello world\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n * for (const r of results) {\n * console.log(r.customId, r.embedding?.length);\n * }\n */\nconst submitEmbeddings = async (\n options: BatchEmbeddingsOptions\n): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!EMBEDDING_PROVIDERS.has(resolved.provider)) {\n throw unsupportedEmbeddingProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = await buildEmbeddingBodies(\n resolved,\n options.requests,\n credentials,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of image-generation requests to the model's provider and\n * return a handle. Each request's `prompt` produces one or more images,\n * correlated by `customId` via {@link BatchJob.results}. Supported for OpenAI\n * and Google; other providers throw {@link UnsupportedProviderError}.\n *\n * @example\n * const job = await batch.images({\n * model: openai.image(\"gpt-image-2\"),\n * requests: [{ customId: \"a\", prompt: \"a red bicycle\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n * for (const r of results) {\n * console.log(r.customId, r.images?.length);\n * }\n */\nconst submitImages = async (options: BatchImageOptions): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!IMAGE_PROVIDERS.has(resolved.provider)) {\n throw unsupportedImageProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = await buildImageBodies(\n resolved,\n options.requests,\n options.defaults,\n credentials,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of image-edit requests to the model's provider and return a\n * handle. Each request's `prompt` is applied to its source `images` (uploaded\n * file ids or hosted URLs — batch bodies are JSON, so raw uploads aren't\n * possible), producing edited images on `result.images`, correlated by\n * `customId` via {@link BatchJob.results}. Supported for OpenAI and xAI; other\n * providers throw {@link UnsupportedProviderError}.\n *\n * @example\n * const job = await batch.images.edit({\n * model: openai.image(\"gpt-image-2\"),\n * requests: [\n * {\n * customId: \"a\",\n * prompt: \"Make the bicycle blue.\",\n * images: [{ imageUrl: \"https://example.com/bicycle.png\" }],\n * },\n * ],\n * });\n * const results = await job.wait().then(() => job.collect());\n */\nconst submitImageEdits = async (\n options: BatchImageEditOptions\n): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!IMAGE_EDIT_PROVIDERS.has(resolved.provider)) {\n throw unsupportedImageEditProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = buildImageEditBodies(\n resolved,\n options.requests,\n options.defaults,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of moderation requests to the model's provider and return a\n * handle. Each request's `value` (and/or `imageUrls`, OpenAI omni moderation\n * only) produces one verdict on `result.moderation`, correlated by `customId`\n * via {@link BatchJob.results}. Supported for OpenAI and Mistral; other\n * providers throw {@link UnsupportedProviderError}. Pass the model as a\n * `\"provider/model\"` string — the AI SDK has no moderation model type.\n *\n * @example\n * const job = await batch.moderations({\n * model: \"openai/omni-moderation-latest\",\n * requests: [{ customId: \"a\", value: \"…user-generated content…\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n * for (const r of results) {\n * console.log(r.customId, r.moderation?.flagged);\n * }\n */\nconst submitModerations = async (\n options: BatchModerationOptions\n): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!MODERATION_PROVIDERS.has(resolved.provider)) {\n throw unsupportedModerationProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = buildModerationBodies(resolved, options.requests, limits);\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of audio-transcription requests to the model's provider and\n * return a handle. Each request's `audioUrl` (a hosted audio file — batch\n * audio endpoints accept URLs, not file uploads) produces one transcript,\n * correlated by `customId` via {@link BatchJob.results}. Supported for Groq\n * and Mistral; other providers throw {@link UnsupportedProviderError}.\n *\n * @example\n * const job = await batch.transcriptions({\n * model: groq.transcription(\"whisper-large-v3\"),\n * requests: [{ customId: \"a\", audioUrl: \"https://example.com/call.wav\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n * for (const r of results) {\n * console.log(r.customId, r.text);\n * }\n */\nconst submitTranscriptions = async (\n options: BatchTranscriptionOptions\n): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!TRANSCRIPTION_PROVIDERS.has(resolved.provider)) {\n throw unsupportedTranscriptionProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = buildTranscriptionBodies(\n resolved,\n options.requests,\n options.defaults,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of video-generation requests to the model's provider and\n * return a handle. Each request's `prompt` produces one video, correlated by\n * `customId` via {@link BatchJob.results}. Supported for xAI (Grok Imagine);\n * other providers throw {@link UnsupportedProviderError} — OpenAI's Videos API\n * (Sora) is deprecated and Google's Veo models are not batch-compatible.\n *\n * Results come back as signed URLs on `result.videos` that **expire ~1h**\n * after completion — download promptly.\n *\n * @example\n * const job = await batch.videos({\n * model: xai.video(\"grok-imagine-video\"),\n * requests: [{ customId: \"a\", prompt: \"A red bicycle rolling downhill.\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n * for (const r of results) {\n * console.log(r.customId, r.videos?.[0]?.url);\n * }\n */\nconst submitVideos = async (options: BatchVideoOptions): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!VIDEO_PROVIDERS.has(resolved.provider)) {\n throw unsupportedVideoProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = await buildVideoBodies(\n resolved,\n options.requests,\n options.defaults,\n credentials,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of audio-translation requests (Whisper's translate task —\n * audio in any language, English text out) and return a handle. Mirrors\n * {@link batch.transcriptions} minus `language`: each request's `audioUrl`\n * produces one English transcript on `result.text`, correlated by `customId`.\n * Supported for Groq and Together; other providers throw\n * {@link UnsupportedProviderError} — Mistral batches transcriptions but not\n * translations.\n *\n * @example\n * const job = await batch.translations({\n * model: groq.transcription(\"whisper-large-v3\"),\n * requests: [{ customId: \"a\", audioUrl: \"https://example.com/french.wav\" }],\n * });\n * const results = await job.wait().then(() => job.collect());\n */\nconst submitTranslations = async (\n options: BatchTranslationOptions\n): Promise<BatchJob> => {\n if (options.requests.length === 0) {\n throw new BatchworkError(EMPTY_REQUESTS_MESSAGE);\n }\n\n const resolved = resolveModel(options.model);\n if (!TRANSLATION_PROVIDERS.has(resolved.provider)) {\n throw unsupportedTranslationProvider(resolved.provider);\n }\n const credentials = pickCredentials(options);\n const limits = resolveBatchLimits(options.limits);\n const adapter = getAdapter(resolved.provider);\n\n const built = buildTranslationBodies(\n resolved,\n options.requests,\n options.defaults,\n limits\n );\n const snapshot = await adapter.submit({\n built,\n credentials,\n endpoint: built[0]?.endpoint ?? \"\",\n limits,\n metadata: options.metadata,\n modelId: resolved.modelId,\n });\n\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/**\n * Submit a batch of requests and return a {@link BatchJob} handle.\n *\n * Callable directly as a shorthand for text/chat batches, with one method per\n * modality:\n *\n * - `batch()` / {@link batch.text} — text & chat completions\n * - {@link batch.embeddings} — embedding vectors\n * - {@link batch.images} / {@link batch.images.create} — image generation\n * - {@link batch.images.edit} — image editing\n * - {@link batch.transcriptions} — audio transcription\n * - {@link batch.translations} — audio translation to English\n * - {@link batch.moderations} — content moderation\n * - {@link batch.videos} — video generation\n *\n * @example\n * const job = await batch({\n * model: openai(\"gpt-5.5\"),\n * requests: [{ customId: \"a\", prompt: \"Say hi\" }],\n * });\n */\nexport const batch = Object.assign(submitText, {\n /** Submit a batch of embedding requests. */\n embeddings: submitEmbeddings,\n /**\n * Submit a batch of image-generation requests. Also exposes\n * {@link batch.images.create} (an alias of calling it directly) and\n * {@link batch.images.edit} for editing existing images.\n */\n images: Object.assign(submitImages, {\n /** Submit a batch of image-generation requests. Equivalent to `batch.images()`. */\n create: submitImages,\n /** Submit a batch of image-edit requests. */\n edit: submitImageEdits,\n }),\n /** Submit a batch of moderation requests. */\n moderations: submitModerations,\n /** Submit a batch of text/chat requests. Equivalent to calling `batch()`. */\n text: submitText,\n /** Submit a batch of audio-transcription requests. */\n transcriptions: submitTranscriptions,\n /** Submit a batch of audio-translation (to English) requests. */\n translations: submitTranslations,\n /** Submit a batch of video-generation requests. */\n videos: submitVideos,\n});\n\n/**\n * @deprecated Use {@link batch.embeddings} instead. Kept as a standalone alias\n * for backward compatibility; it will be removed in a future major.\n */\nexport const batchEmbeddings = submitEmbeddings;\n\n/**\n * @deprecated Use {@link batch.images} instead. Kept as a standalone alias for\n * backward compatibility; it will be removed in a future major.\n */\nexport const batchImages = submitImages;\n\n/**\n * Rehydrate a {@link BatchJob} for an existing batch id (e.g. one persisted\n * after submission). Identify the provider with `provider` or `model`.\n */\nexport const getBatch = async (ref: BatchRef): Promise<BatchJob> => {\n const adapter = getAdapter(providerFromRef(ref));\n const credentials = pickCredentials(ref);\n const snapshot = await adapter.retrieve(ref.id, credentials);\n return new BatchJob(adapter, credentials, snapshot);\n};\n\n/** Stream the results of an existing batch by id, without a handle. */\nexport const getBatchResults = (ref: BatchRef): AsyncGenerator<BatchResult> => {\n const adapter = getAdapter(providerFromRef(ref));\n return adapter.results(ref.id, pickCredentials(ref));\n};\n\n/** Request cancellation of an existing batch by id. */\nexport const cancelBatch = async (ref: BatchRef): Promise<void> => {\n const adapter = getAdapter(providerFromRef(ref));\n await adapter.cancel(ref.id, pickCredentials(ref));\n};\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "0D659D78B4576A4164756E2164756E21",
11
+ "names": []
12
+ }
package/dist/index.d.ts CHANGED
@@ -2,5 +2,5 @@ export { batch, batchEmbeddings, batchImages, cancelBatch, getBatch, getBatchRes
2
2
  export { BatchworkError, MissingDependencyError, UnsupportedProviderError, } from "./errors";
3
3
  export { BatchJob, isTerminalStatus } from "./job";
4
4
  export { resolveModel } from "./model";
5
- export type { BatchDefaults, BatchEmbeddingRequest, BatchEmbeddingsOptions, BatchImage, BatchImageDefaults, BatchImageOptions, BatchImageRequest, BatchLimits, BatchOptions, BatchProvider, BatchRef, BatchRequest, BatchRequestCounts, BatchRequestSettings, BatchResult, BatchResultError, BatchResultStatus, BatchSnapshot, BatchStatus, BatchUsage, ProviderCredentials, ProviderOptions, WaitOptions, } from "./types";
5
+ export type { BatchDefaults, BatchEmbeddingRequest, BatchEmbeddingsOptions, BatchImage, BatchImageDefaults, BatchImageEditDefaults, BatchImageEditOptions, BatchImageEditRequest, BatchImageOptions, BatchImageRef, BatchImageRequest, BatchLimits, BatchModeration, BatchModerationOptions, BatchModerationRequest, BatchOptions, BatchProvider, BatchRef, BatchRequest, BatchRequestCounts, BatchRequestSettings, BatchResult, BatchResultError, BatchResultStatus, BatchSnapshot, BatchStatus, BatchTranscriptionDefaults, BatchTranscriptionOptions, BatchTranscriptionRequest, BatchTranscriptionSegment, BatchTranslationDefaults, BatchTranslationOptions, BatchTranslationRequest, BatchUsage, BatchVideo, BatchVideoDefaults, BatchVideoOptions, BatchVideoRequest, ProviderCredentials, ProviderOptions, VideoModel, WaitOptions, } from "./types";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,WAAW,GACZ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,WAAW,GACZ,MAAM,SAAS,CAAC"}