@ai-sdk/black-forest-labs 2.0.48 → 2.0.51
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.
- package/CHANGELOG.md +34 -0
- package/dist/index.js +85 -86
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/black-forest-labs-image-model.ts +24 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# @ai-sdk/black-forest-labs
|
|
2
2
|
|
|
3
|
+
## 2.0.51
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 525efc5: feat(provider): advertise image model file and mask input support
|
|
8
|
+
|
|
9
|
+
Use confirmed model IDs for capability declarations so unrecognized model names
|
|
10
|
+
remain unknown. Include Together AI FLUX.2 Pro and Flex single-image editing, and
|
|
11
|
+
allow asynchronous capability lookups and middleware overrides to resolve to
|
|
12
|
+
unknown.
|
|
13
|
+
|
|
14
|
+
Advertise QuiverAI Arrow 2 and Arrow 2 Telos file-input support, and mark Together
|
|
15
|
+
AI Gemini image inputs unsupported by the current single-image request mapping.
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [e3605f6]
|
|
18
|
+
- Updated dependencies [525efc5]
|
|
19
|
+
- @ai-sdk/provider-utils@5.0.50
|
|
20
|
+
- @ai-sdk/provider@4.0.19
|
|
21
|
+
|
|
22
|
+
## 2.0.50
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- Updated dependencies [af9597b]
|
|
27
|
+
- Updated dependencies [bc49f78]
|
|
28
|
+
- @ai-sdk/provider-utils@5.0.49
|
|
29
|
+
|
|
30
|
+
## 2.0.49
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- Updated dependencies [be877ff]
|
|
35
|
+
- @ai-sdk/provider-utils@5.0.48
|
|
36
|
+
|
|
3
37
|
## 2.0.48
|
|
4
38
|
|
|
5
39
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -43,17 +43,14 @@ function bflErrorToMessage(error) {
|
|
|
43
43
|
if (detail != null) {
|
|
44
44
|
try {
|
|
45
45
|
return JSON.stringify(detail);
|
|
46
|
-
} catch
|
|
46
|
+
} catch {
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
return message;
|
|
50
50
|
}
|
|
51
51
|
var bflFailedResponseHandler = createJsonErrorResponseHandler({
|
|
52
52
|
errorSchema: bflErrorSchema,
|
|
53
|
-
errorToMessage: (error) =>
|
|
54
|
-
var _a;
|
|
55
|
-
return (_a = bflErrorToMessage(error)) != null ? _a : "Unknown Black Forest Labs error";
|
|
56
|
-
}
|
|
53
|
+
errorToMessage: (error) => bflErrorToMessage(error) ?? "Unknown Black Forest Labs error"
|
|
57
54
|
});
|
|
58
55
|
function isTrustedUrl(url, baseUrl) {
|
|
59
56
|
if (isSameOrigin(url, baseUrl)) {
|
|
@@ -62,7 +59,7 @@ function isTrustedUrl(url, baseUrl) {
|
|
|
62
59
|
try {
|
|
63
60
|
const { protocol, hostname } = new URL(url);
|
|
64
61
|
return protocol === "https:" && (hostname === "bfl.ai" || hostname.endsWith(".bfl.ai"));
|
|
65
|
-
} catch
|
|
62
|
+
} catch {
|
|
66
63
|
return false;
|
|
67
64
|
}
|
|
68
65
|
}
|
|
@@ -124,6 +121,23 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
124
121
|
this.specificationVersion = "v4";
|
|
125
122
|
this.maxImagesPerCall = 1;
|
|
126
123
|
}
|
|
124
|
+
get supportsFileInputs() {
|
|
125
|
+
if (["flux-kontext-pro", "flux-kontext-max", "flux-pro-1.0-fill"].includes(
|
|
126
|
+
this.modelId
|
|
127
|
+
)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
if (["flux-pro-1.1-ultra", "flux-pro-1.1"].includes(this.modelId)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return void 0;
|
|
134
|
+
}
|
|
135
|
+
get supportsMaskInputs() {
|
|
136
|
+
if (this.modelId === "flux-pro-1.0-fill") {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
return this.supportsFileInputs == null ? void 0 : false;
|
|
140
|
+
}
|
|
127
141
|
get provider() {
|
|
128
142
|
return this.config.provider;
|
|
129
143
|
}
|
|
@@ -145,9 +159,8 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
145
159
|
seed,
|
|
146
160
|
providerOptions
|
|
147
161
|
}) {
|
|
148
|
-
var _a, _b, _c;
|
|
149
162
|
const warnings = [];
|
|
150
|
-
const finalAspectRatio = aspectRatio
|
|
163
|
+
const finalAspectRatio = aspectRatio ?? (size ? convertSizeToAspectRatio(size) : void 0);
|
|
151
164
|
if (size && !aspectRatio) {
|
|
152
165
|
warnings.push({
|
|
153
166
|
type: "unsupported",
|
|
@@ -166,8 +179,8 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
166
179
|
providerOptions,
|
|
167
180
|
schema: blackForestLabsImageModelOptionsSchema
|
|
168
181
|
});
|
|
169
|
-
const [widthStr, heightStr] =
|
|
170
|
-
const inputImages =
|
|
182
|
+
const [widthStr, heightStr] = size?.split("x") ?? [];
|
|
183
|
+
const inputImages = files?.map((file) => {
|
|
171
184
|
if (file.type === "url") {
|
|
172
185
|
return file.url;
|
|
173
186
|
}
|
|
@@ -175,7 +188,7 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
175
188
|
return file.data;
|
|
176
189
|
}
|
|
177
190
|
return Buffer.from(file.data).toString("base64");
|
|
178
|
-
})
|
|
191
|
+
}) || [];
|
|
179
192
|
if (inputImages.length > 10) {
|
|
180
193
|
throw new Error("Black Forest Labs supports up to 10 input images.");
|
|
181
194
|
}
|
|
@@ -200,20 +213,20 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
200
213
|
prompt,
|
|
201
214
|
seed,
|
|
202
215
|
aspect_ratio: finalAspectRatio,
|
|
203
|
-
width:
|
|
204
|
-
height:
|
|
205
|
-
steps: bflOptions
|
|
206
|
-
guidance: bflOptions
|
|
207
|
-
image_prompt_strength: bflOptions
|
|
208
|
-
image_prompt: bflOptions
|
|
216
|
+
width: bflOptions?.width ?? (size ? Number(widthStr) : void 0),
|
|
217
|
+
height: bflOptions?.height ?? (size ? Number(heightStr) : void 0),
|
|
218
|
+
steps: bflOptions?.steps,
|
|
219
|
+
guidance: bflOptions?.guidance,
|
|
220
|
+
image_prompt_strength: bflOptions?.imagePromptStrength,
|
|
221
|
+
image_prompt: bflOptions?.imagePrompt,
|
|
209
222
|
...inputImagesObj,
|
|
210
223
|
mask: maskValue,
|
|
211
|
-
output_format: bflOptions
|
|
212
|
-
prompt_upsampling: bflOptions
|
|
213
|
-
raw: bflOptions
|
|
214
|
-
safety_tolerance: bflOptions
|
|
215
|
-
webhook_secret: bflOptions
|
|
216
|
-
webhook_url: bflOptions
|
|
224
|
+
output_format: bflOptions?.outputFormat,
|
|
225
|
+
prompt_upsampling: bflOptions?.promptUpsampling,
|
|
226
|
+
raw: bflOptions?.raw,
|
|
227
|
+
safety_tolerance: bflOptions?.safetyTolerance,
|
|
228
|
+
webhook_secret: bflOptions?.webhookSecret,
|
|
229
|
+
webhook_url: bflOptions?.webhookUrl
|
|
217
230
|
};
|
|
218
231
|
return { body, warnings, bflOptions };
|
|
219
232
|
}
|
|
@@ -228,7 +241,6 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
228
241
|
headers,
|
|
229
242
|
abortSignal
|
|
230
243
|
}) {
|
|
231
|
-
var _a, _b, _c;
|
|
232
244
|
const { body, warnings, bflOptions } = await this.getArgs({
|
|
233
245
|
prompt,
|
|
234
246
|
files,
|
|
@@ -241,7 +253,7 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
241
253
|
headers,
|
|
242
254
|
abortSignal
|
|
243
255
|
});
|
|
244
|
-
const currentDate =
|
|
256
|
+
const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
|
|
245
257
|
const combinedHeaders = combineHeaders(
|
|
246
258
|
await resolve(this.config.headers),
|
|
247
259
|
headers
|
|
@@ -269,8 +281,8 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
269
281
|
headers: combinedHeaders,
|
|
270
282
|
abortSignal,
|
|
271
283
|
pollOverrides: {
|
|
272
|
-
pollIntervalMillis: bflOptions
|
|
273
|
-
pollTimeoutMillis: bflOptions
|
|
284
|
+
pollIntervalMillis: bflOptions?.pollIntervalMillis,
|
|
285
|
+
pollTimeoutMillis: bflOptions?.pollTimeoutMillis
|
|
274
286
|
}
|
|
275
287
|
});
|
|
276
288
|
const { value: imageBytes, responseHeaders } = await getFromApi({
|
|
@@ -323,9 +335,8 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
323
335
|
abortSignal,
|
|
324
336
|
pollOverrides
|
|
325
337
|
}) {
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
const pollTimeoutMillis = (_d = (_c = pollOverrides == null ? void 0 : pollOverrides.pollTimeoutMillis) != null ? _c : this.config.pollTimeoutMillis) != null ? _d : DEFAULT_POLL_TIMEOUT_MILLIS;
|
|
338
|
+
const pollIntervalMillis = pollOverrides?.pollIntervalMillis ?? this.config.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;
|
|
339
|
+
const pollTimeoutMillis = pollOverrides?.pollTimeoutMillis ?? this.config.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS;
|
|
329
340
|
const url = new URL(pollUrl);
|
|
330
341
|
if (!url.searchParams.has("id")) {
|
|
331
342
|
url.searchParams.set("id", requestId);
|
|
@@ -353,13 +364,13 @@ var BlackForestLabsImageModel = class _BlackForestLabsImageModel {
|
|
|
353
364
|
});
|
|
354
365
|
const status = value.status;
|
|
355
366
|
if (status === "Ready") {
|
|
356
|
-
if (typeof
|
|
367
|
+
if (typeof value.result?.sample === "string") {
|
|
357
368
|
return {
|
|
358
369
|
imageUrl: value.result.sample,
|
|
359
|
-
seed:
|
|
360
|
-
start_time:
|
|
361
|
-
end_time:
|
|
362
|
-
duration:
|
|
370
|
+
seed: value.result.seed ?? void 0,
|
|
371
|
+
start_time: value.result.start_time ?? void 0,
|
|
372
|
+
end_time: value.result.end_time ?? void 0,
|
|
373
|
+
duration: value.result.duration ?? void 0
|
|
363
374
|
};
|
|
364
375
|
}
|
|
365
376
|
throw new Error(
|
|
@@ -430,13 +441,10 @@ var bflPollSchema = z3.object({
|
|
|
430
441
|
}).nullish()
|
|
431
442
|
}).refine((v) => v.status != null || v.state != null, {
|
|
432
443
|
message: "Missing status in Black Forest Labs poll response"
|
|
433
|
-
}).transform((v) => {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
result: v.result
|
|
438
|
-
};
|
|
439
|
-
});
|
|
444
|
+
}).transform((v) => ({
|
|
445
|
+
status: v.status ?? v.state,
|
|
446
|
+
result: v.result
|
|
447
|
+
}));
|
|
440
448
|
|
|
441
449
|
// src/black-forest-labs-video-model.ts
|
|
442
450
|
import {
|
|
@@ -580,10 +588,9 @@ function nonImageFrameMediaType(file) {
|
|
|
580
588
|
return topLevelMediaType === "image" ? void 0 : topLevelMediaType;
|
|
581
589
|
}
|
|
582
590
|
function getDraftEnhanceArgs(options, bflOptions) {
|
|
583
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
584
591
|
const warnings = [];
|
|
585
592
|
const pinnedByBundle = [
|
|
586
|
-
["prompt", (
|
|
593
|
+
["prompt", (options.prompt?.trim().length ?? 0) > 0],
|
|
587
594
|
[
|
|
588
595
|
"aspectRatio",
|
|
589
596
|
options.aspectRatio != null || bflOptions.aspectRatio != null
|
|
@@ -594,9 +601,9 @@ function getDraftEnhanceArgs(options, bflOptions) {
|
|
|
594
601
|
["seed", options.seed != null],
|
|
595
602
|
["generateAudio", options.generateAudio != null],
|
|
596
603
|
["image", options.image != null],
|
|
597
|
-
["frameImages", (
|
|
598
|
-
["inputReferences", (
|
|
599
|
-
["keyframes", (
|
|
604
|
+
["frameImages", (options.frameImages?.length ?? 0) > 0],
|
|
605
|
+
["inputReferences", (options.inputReferences?.length ?? 0) > 0],
|
|
606
|
+
["keyframes", (bflOptions.keyframes?.length ?? 0) > 0],
|
|
600
607
|
["version", bflOptions.version != null]
|
|
601
608
|
];
|
|
602
609
|
for (const [feature, isSet] of pinnedByBundle) {
|
|
@@ -640,7 +647,7 @@ function describePollDetails(details) {
|
|
|
640
647
|
}
|
|
641
648
|
try {
|
|
642
649
|
return JSON.stringify(details);
|
|
643
|
-
} catch
|
|
650
|
+
} catch {
|
|
644
651
|
return void 0;
|
|
645
652
|
}
|
|
646
653
|
}
|
|
@@ -673,14 +680,13 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
673
680
|
return new _BlackForestLabsVideoModel(options.modelId, options.config);
|
|
674
681
|
}
|
|
675
682
|
async getArgs(options) {
|
|
676
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
677
683
|
const warnings = [];
|
|
678
684
|
const bflOptions = await parseProviderOptions2({
|
|
679
685
|
provider: "blackForestLabs",
|
|
680
686
|
providerOptions: options.providerOptions,
|
|
681
687
|
schema: blackForestLabsVideoModelOptionsSchema
|
|
682
688
|
});
|
|
683
|
-
if (
|
|
689
|
+
if (bflOptions?.draftCache != null) {
|
|
684
690
|
return getDraftEnhanceArgs(options, bflOptions);
|
|
685
691
|
}
|
|
686
692
|
if (options.fps != null) {
|
|
@@ -704,7 +710,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
704
710
|
details: "FLUX 3 video generates a single video per call. Only 1 video will be generated."
|
|
705
711
|
});
|
|
706
712
|
}
|
|
707
|
-
let resolution = bflOptions
|
|
713
|
+
let resolution = bflOptions?.resolution;
|
|
708
714
|
if (options.resolution != null) {
|
|
709
715
|
const resolved = resolveTopLevelResolution(options.resolution);
|
|
710
716
|
if (resolution != null) {
|
|
@@ -732,7 +738,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
732
738
|
}
|
|
733
739
|
}
|
|
734
740
|
}
|
|
735
|
-
let aspectRatio = bflOptions
|
|
741
|
+
let aspectRatio = bflOptions?.aspectRatio;
|
|
736
742
|
if (aspectRatio == null && options.aspectRatio != null) {
|
|
737
743
|
if (allowedAspectRatios.has(options.aspectRatio)) {
|
|
738
744
|
aspectRatio = options.aspectRatio;
|
|
@@ -744,13 +750,13 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
744
750
|
});
|
|
745
751
|
}
|
|
746
752
|
}
|
|
747
|
-
const firstFrameImage =
|
|
753
|
+
const firstFrameImage = options.frameImages?.find(
|
|
748
754
|
(frame) => frame.frameType === "first_frame"
|
|
749
|
-
)
|
|
750
|
-
let firstFrame = firstFrameImage
|
|
751
|
-
let lastFrame =
|
|
755
|
+
)?.image;
|
|
756
|
+
let firstFrame = firstFrameImage ?? options.image;
|
|
757
|
+
let lastFrame = options.frameImages?.find(
|
|
752
758
|
(frame) => frame.frameType === "last_frame"
|
|
753
|
-
)
|
|
759
|
+
)?.image;
|
|
754
760
|
const firstFrameMediaType = firstFrame != null ? nonImageFrameMediaType(firstFrame) : void 0;
|
|
755
761
|
if (firstFrame != null && firstFrameMediaType != null) {
|
|
756
762
|
warnings.push({
|
|
@@ -780,7 +786,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
780
786
|
}
|
|
781
787
|
}
|
|
782
788
|
}
|
|
783
|
-
let keyframes =
|
|
789
|
+
let keyframes = bflOptions?.keyframes != null && bflOptions.keyframes.length > 0 ? [...bflOptions.keyframes] : void 0;
|
|
784
790
|
if (keyframes != null) {
|
|
785
791
|
if (firstFrame != null || lastFrame != null) {
|
|
786
792
|
warnings.push({
|
|
@@ -796,7 +802,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
796
802
|
}
|
|
797
803
|
}
|
|
798
804
|
let startVideo;
|
|
799
|
-
const referenceFiles =
|
|
805
|
+
const referenceFiles = options.inputReferences ?? [];
|
|
800
806
|
const referenceVideos = [];
|
|
801
807
|
for (const file of referenceFiles) {
|
|
802
808
|
const topLevelMediaType = file.mediaType != null ? getTopLevelMediaType(file.mediaType) : void 0;
|
|
@@ -868,7 +874,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
868
874
|
duration = MIN_DURATION_SECONDS;
|
|
869
875
|
}
|
|
870
876
|
}
|
|
871
|
-
const untimedKeyframeCount =
|
|
877
|
+
const untimedKeyframeCount = keyframes?.filter((keyframe) => typeof keyframe === "string").length ?? 0;
|
|
872
878
|
if (duration == null && untimedKeyframeCount >= UNTIMED_KEYFRAMES_NEEDING_DURATION) {
|
|
873
879
|
throw new InvalidArgumentError({
|
|
874
880
|
argument: "duration",
|
|
@@ -878,23 +884,22 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
878
884
|
const mode = keyframes != null ? "i2v" : startVideo != null ? "v2v" : "t2v";
|
|
879
885
|
const body = {
|
|
880
886
|
mode,
|
|
881
|
-
prompt:
|
|
887
|
+
prompt: options.prompt ?? "",
|
|
882
888
|
aspect_ratio: aspectRatio,
|
|
883
889
|
duration,
|
|
884
890
|
resolution,
|
|
885
|
-
version: bflOptions
|
|
891
|
+
version: bflOptions?.version,
|
|
886
892
|
generate_audio: options.generateAudio,
|
|
887
|
-
safety_tolerance: bflOptions
|
|
888
|
-
draft: bflOptions
|
|
893
|
+
safety_tolerance: bflOptions?.safetyTolerance,
|
|
894
|
+
draft: bflOptions?.draft,
|
|
889
895
|
...mode === "i2v" && { keyframes },
|
|
890
896
|
...mode === "v2v" && { start_video: startVideo }
|
|
891
897
|
};
|
|
892
898
|
return { body, warnings };
|
|
893
899
|
}
|
|
894
900
|
async doStart(options) {
|
|
895
|
-
var _a, _b, _c;
|
|
896
901
|
const { body, warnings } = await this.getArgs(options);
|
|
897
|
-
const currentDate =
|
|
902
|
+
const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
|
|
898
903
|
const combinedHeaders = combineHeaders2(
|
|
899
904
|
await resolve2(this.config.headers),
|
|
900
905
|
options.headers
|
|
@@ -929,8 +934,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
929
934
|
};
|
|
930
935
|
}
|
|
931
936
|
async doStatus(options) {
|
|
932
|
-
|
|
933
|
-
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
937
|
+
const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
|
|
934
938
|
const operation = options.operation;
|
|
935
939
|
const url = new URL(operation.pollingUrl);
|
|
936
940
|
if (!url.searchParams.has("id")) {
|
|
@@ -958,7 +962,7 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
958
962
|
headers: responseHeaders
|
|
959
963
|
};
|
|
960
964
|
const { status, result } = value;
|
|
961
|
-
const cost =
|
|
965
|
+
const cost = value.cost ?? operation.cost;
|
|
962
966
|
if (status === "Ready") {
|
|
963
967
|
const parsed = bflVideoResultSchema.safeParse(result);
|
|
964
968
|
if (!parsed.success) {
|
|
@@ -1021,11 +1025,10 @@ var BlackForestLabsVideoModel = class _BlackForestLabsVideoModel {
|
|
|
1021
1025
|
return { status: "pending", response };
|
|
1022
1026
|
}
|
|
1023
1027
|
async doGenerate(options) {
|
|
1024
|
-
var _a, _b;
|
|
1025
1028
|
const startResult = await this.doStart(options);
|
|
1026
1029
|
const operation = startResult.operation;
|
|
1027
|
-
const pollIntervalMillis =
|
|
1028
|
-
const pollTimeoutMillis =
|
|
1030
|
+
const pollIntervalMillis = this.config.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS2;
|
|
1031
|
+
const pollTimeoutMillis = this.config.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS2;
|
|
1029
1032
|
const startTime = Date.now();
|
|
1030
1033
|
while (true) {
|
|
1031
1034
|
await delay2(pollIntervalMillis, { abortSignal: options.abortSignal });
|
|
@@ -1084,24 +1087,20 @@ var bflVideoPollSchema = z5.object({
|
|
|
1084
1087
|
cost: z5.number().nullish()
|
|
1085
1088
|
}).refine((v) => v.status != null || v.state != null, {
|
|
1086
1089
|
message: "Missing status in Black Forest Labs poll response"
|
|
1087
|
-
}).transform((v) => {
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
cost: v.cost
|
|
1094
|
-
};
|
|
1095
|
-
});
|
|
1090
|
+
}).transform((v) => ({
|
|
1091
|
+
status: v.status ?? v.state,
|
|
1092
|
+
details: v.details,
|
|
1093
|
+
result: v.result,
|
|
1094
|
+
cost: v.cost
|
|
1095
|
+
}));
|
|
1096
1096
|
|
|
1097
1097
|
// src/version.ts
|
|
1098
|
-
var VERSION = true ? "2.0.
|
|
1098
|
+
var VERSION = true ? "2.0.51" : "0.0.0-test";
|
|
1099
1099
|
|
|
1100
1100
|
// src/black-forest-labs-provider.ts
|
|
1101
1101
|
var defaultBaseURL = "https://api.bfl.ai/v1";
|
|
1102
1102
|
function createBlackForestLabs(options = {}) {
|
|
1103
|
-
|
|
1104
|
-
const baseURL = withoutTrailingSlash((_a = options.baseURL) != null ? _a : defaultBaseURL);
|
|
1103
|
+
const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);
|
|
1105
1104
|
const getHeaders = () => withUserAgentSuffix(
|
|
1106
1105
|
{
|
|
1107
1106
|
"x-key": loadApiKey({
|
|
@@ -1115,7 +1114,7 @@ function createBlackForestLabs(options = {}) {
|
|
|
1115
1114
|
);
|
|
1116
1115
|
const createImageModel = (modelId) => new BlackForestLabsImageModel(modelId, {
|
|
1117
1116
|
provider: "black-forest-labs.image",
|
|
1118
|
-
baseURL: baseURL
|
|
1117
|
+
baseURL: baseURL ?? defaultBaseURL,
|
|
1119
1118
|
headers: getHeaders,
|
|
1120
1119
|
fetch: options.fetch,
|
|
1121
1120
|
pollIntervalMillis: options.pollIntervalMillis,
|
|
@@ -1123,7 +1122,7 @@ function createBlackForestLabs(options = {}) {
|
|
|
1123
1122
|
});
|
|
1124
1123
|
const createVideoModel = (modelId) => new BlackForestLabsVideoModel(modelId, {
|
|
1125
1124
|
provider: "black-forest-labs.video",
|
|
1126
|
-
baseURL: baseURL
|
|
1125
|
+
baseURL: baseURL ?? defaultBaseURL,
|
|
1127
1126
|
headers: getHeaders,
|
|
1128
1127
|
fetch: options.fetch,
|
|
1129
1128
|
pollIntervalMillis: options.pollIntervalMillis,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/black-forest-labs-provider.ts","../src/black-forest-labs-image-model.ts","../src/black-forest-labs-api.ts","../src/black-forest-labs-image-model-options.ts","../src/black-forest-labs-video-model.ts","../src/black-forest-labs-video-model-options.ts","../src/black-forest-labs-video-settings.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4,\n type ImageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { BlackForestLabsImageModel } from './black-forest-labs-image-model';\nimport type { BlackForestLabsImageModelId } from './black-forest-labs-image-settings';\nimport { BlackForestLabsVideoModel } from './black-forest-labs-video-model';\nimport type { BlackForestLabsVideoModelId } from './black-forest-labs-video-settings';\nimport { VERSION } from './version';\n\nexport interface BlackForestLabsProviderSettings {\n /**\n * Black Forest Labs API key. Default value is taken from the `BFL_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls. Defaults to `https://api.bfl.ai/v1`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Poll interval in milliseconds between status checks. Defaults to 500ms for\n * images and 2s for video.\n */\n pollIntervalMillis?: number;\n\n /**\n * Overall timeout in milliseconds for polling before giving up. Defaults to\n * 60s for images and 10 minutes for video.\n */\n pollTimeoutMillis?: number;\n}\n\nexport interface BlackForestLabsProvider extends ProviderV4 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: BlackForestLabsImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: BlackForestLabsImageModelId): ImageModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: BlackForestLabsVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: BlackForestLabsVideoModelId): Experimental_VideoModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://api.bfl.ai/v1';\n\nexport function createBlackForestLabs(\n options: BlackForestLabsProviderSettings = {},\n): BlackForestLabsProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'x-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'BFL_API_KEY',\n description: 'Black Forest Labs',\n }),\n ...options.headers,\n },\n `ai-sdk/black-forest-labs/${VERSION}`,\n );\n\n const createImageModel = (modelId: BlackForestLabsImageModelId) =>\n new BlackForestLabsImageModel(modelId, {\n provider: 'black-forest-labs.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n pollIntervalMillis: options.pollIntervalMillis,\n pollTimeoutMillis: options.pollTimeoutMillis,\n });\n\n const createVideoModel = (modelId: BlackForestLabsVideoModelId) =>\n new BlackForestLabsVideoModel(modelId, {\n provider: 'black-forest-labs.video',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n pollIntervalMillis: options.pollIntervalMillis,\n pollTimeoutMillis: options.pollTimeoutMillis,\n });\n\n const embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n return {\n specificationVersion: 'v4',\n imageModel: createImageModel,\n image: createImageModel,\n videoModel: createVideoModel,\n video: createVideoModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const blackForestLabs = createBlackForestLabs();\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n bflFailedResponseHandler,\n isTrustedUrl,\n} from './black-forest-labs-api';\nimport { blackForestLabsImageModelOptionsSchema } from './black-forest-labs-image-model-options';\nimport type {\n BlackForestLabsAspectRatio,\n BlackForestLabsImageModelId,\n} from './black-forest-labs-image-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 60000;\n\ninterface BlackForestLabsImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n /**\n * Poll interval in milliseconds between status checks. Defaults to 500ms.\n */\n pollIntervalMillis?: number;\n /**\n * Overall timeout in milliseconds for polling before giving up. Defaults to 60s.\n */\n pollTimeoutMillis?: number;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class BlackForestLabsImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: BlackForestLabsImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: BlackForestLabsImageModelId;\n config: BlackForestLabsImageModelConfig;\n }) {\n return new BlackForestLabsImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: BlackForestLabsImageModelId,\n private readonly config: BlackForestLabsImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n }: Parameters<ImageModelV4['doGenerate']>[0]) {\n const warnings: Array<SharedV4Warning> = [];\n\n const finalAspectRatio =\n aspectRatio ?? (size ? convertSizeToAspectRatio(size) : undefined);\n\n if (size && !aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'Deriving aspect_ratio from size. Use the width and height provider options to specify dimensions for models that support them.',\n });\n } else if (size && aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'Black Forest Labs ignores size when aspectRatio is provided. Use the width and height provider options to specify dimensions for models that support them',\n });\n }\n\n const bflOptions = await parseProviderOptions({\n provider: 'blackForestLabs',\n providerOptions,\n schema: blackForestLabsImageModelOptionsSchema,\n });\n\n const [widthStr, heightStr] = size?.split('x') ?? [];\n\n const inputImages: string[] =\n files?.map(file => {\n if (file.type === 'url') {\n return file.url;\n }\n\n if (typeof file.data === 'string') {\n return file.data;\n }\n\n return Buffer.from(file.data).toString('base64');\n }) || [];\n\n if (inputImages.length > 10) {\n throw new Error('Black Forest Labs supports up to 10 input images.');\n }\n\n const inputImageField =\n this.modelId === 'flux-pro-1.0-fill' ? 'image' : 'input_image';\n const inputImagesObj: Record<string, string> = inputImages.reduce<\n Record<string, string>\n >((acc, img, index) => {\n acc[`${inputImageField}${index === 0 ? '' : `_${index + 1}`}`] = img;\n return acc;\n }, {});\n\n let maskValue: string | undefined;\n if (mask) {\n if (mask.type === 'url') {\n maskValue = mask.url;\n } else {\n if (typeof mask.data === 'string') {\n maskValue = mask.data;\n } else {\n maskValue = Buffer.from(mask.data).toString('base64');\n }\n }\n }\n\n const body: Record<string, unknown> = {\n prompt,\n seed,\n aspect_ratio: finalAspectRatio,\n width: bflOptions?.width ?? (size ? Number(widthStr) : undefined),\n height: bflOptions?.height ?? (size ? Number(heightStr) : undefined),\n steps: bflOptions?.steps,\n guidance: bflOptions?.guidance,\n image_prompt_strength: bflOptions?.imagePromptStrength,\n image_prompt: bflOptions?.imagePrompt,\n ...inputImagesObj,\n mask: maskValue,\n output_format: bflOptions?.outputFormat,\n prompt_upsampling: bflOptions?.promptUpsampling,\n raw: bflOptions?.raw,\n safety_tolerance: bflOptions?.safetyTolerance,\n webhook_secret: bflOptions?.webhookSecret,\n webhook_url: bflOptions?.webhookUrl,\n };\n\n return { body, warnings, bflOptions };\n }\n\n async doGenerate({\n prompt,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const { body, warnings, bflOptions } = await this.getArgs({\n prompt,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n n: 1,\n headers,\n abortSignal,\n } as Parameters<ImageModelV4['doGenerate']>[0]);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n await resolve(this.config.headers),\n headers,\n );\n\n const submit = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combinedHeaders,\n body,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(bflSubmitSchema),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const pollUrl = submit.value.polling_url;\n const requestId = submit.value.id;\n\n const {\n imageUrl,\n seed: resultSeed,\n start_time: resultStartTime,\n end_time: resultEndTime,\n duration: resultDuration,\n } = await this.pollForImageUrl({\n pollUrl,\n requestId,\n headers: combinedHeaders,\n abortSignal,\n pollOverrides: {\n pollIntervalMillis: bflOptions?.pollIntervalMillis,\n pollTimeoutMillis: bflOptions?.pollTimeoutMillis,\n },\n });\n\n const { value: imageBytes, responseHeaders } = await getFromApi({\n url: imageUrl,\n // imageUrl comes from the provider response body; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n // Only send credentials if the response-supplied URL points back at the\n // provider; the image is typically delivered from a CDN, so the API key\n // must not travel to a foreign host.\n headers: isTrustedUrl(imageUrl, this.config.baseURL)\n ? combinedHeaders\n : undefined,\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n\n return {\n images: [imageBytes],\n warnings,\n providerMetadata: {\n blackForestLabs: {\n images: [\n {\n ...(resultSeed != null && { seed: resultSeed }),\n ...(resultStartTime != null && { start_time: resultStartTime }),\n ...(resultEndTime != null && { end_time: resultEndTime }),\n ...(resultDuration != null && { duration: resultDuration }),\n ...(submit.value.cost != null && { cost: submit.value.cost }),\n ...(submit.value.input_mp != null && {\n inputMegapixels: submit.value.input_mp,\n }),\n ...(submit.value.output_mp != null && {\n outputMegapixels: submit.value.output_mp,\n }),\n },\n ],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollForImageUrl({\n pollUrl,\n requestId,\n headers,\n abortSignal,\n pollOverrides,\n }: {\n pollUrl: string;\n requestId: string;\n headers: Record<string, string | undefined>;\n abortSignal: AbortSignal | undefined;\n pollOverrides?: {\n pollIntervalMillis?: number;\n pollTimeoutMillis?: number;\n };\n }): Promise<{\n imageUrl: string;\n seed?: number;\n start_time?: number;\n end_time?: number;\n duration?: number;\n }> {\n const pollIntervalMillis =\n pollOverrides?.pollIntervalMillis ??\n this.config.pollIntervalMillis ??\n DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n pollOverrides?.pollTimeoutMillis ??\n this.config.pollTimeoutMillis ??\n DEFAULT_POLL_TIMEOUT_MILLIS;\n\n const url = new URL(pollUrl);\n if (!url.searchParams.has('id')) {\n url.searchParams.set('id', requestId);\n }\n\n const timeoutController = new AbortController();\n let didTimeout = false;\n const timeoutId = setTimeout(() => {\n didTimeout = true;\n timeoutController.abort();\n }, pollTimeoutMillis);\n const pollingAbortSignal =\n abortSignal == null\n ? timeoutController.signal\n : AbortSignal.any([abortSignal, timeoutController.signal]);\n\n try {\n while (true) {\n const { value } = await getFromApi({\n url: url.toString(),\n // The polling URL comes from the provider response; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n // Only send credentials when it stays on a trusted provider host.\n headers: isTrustedUrl(url.toString(), this.config.baseURL)\n ? headers\n : undefined,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(bflPollSchema),\n abortSignal: pollingAbortSignal,\n fetch: this.config.fetch,\n });\n\n const status = value.status;\n if (status === 'Ready') {\n if (typeof value.result?.sample === 'string') {\n return {\n imageUrl: value.result.sample,\n seed: value.result.seed ?? undefined,\n start_time: value.result.start_time ?? undefined,\n end_time: value.result.end_time ?? undefined,\n duration: value.result.duration ?? undefined,\n };\n }\n throw new Error(\n 'Black Forest Labs poll response is Ready but missing result.sample',\n );\n }\n if (status === 'Error' || status === 'Failed') {\n throw new Error('Black Forest Labs generation failed.');\n }\n\n await delay(pollIntervalMillis, {\n abortSignal: pollingAbortSignal,\n });\n }\n } catch (error) {\n if (didTimeout) {\n throw new Error('Black Forest Labs generation timed out.');\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\nfunction convertSizeToAspectRatio(\n size: string,\n): BlackForestLabsAspectRatio | undefined {\n const [wStr, hStr] = size.split('x');\n const width = Number(wStr);\n const height = Number(hStr);\n if (\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return undefined;\n }\n const g = gcd(width, height);\n return `${Math.round(width / g)}:${Math.round(height / g)}`;\n}\n\nfunction gcd(a: number, b: number): number {\n let x = Math.abs(a);\n let y = Math.abs(b);\n while (y !== 0) {\n const t = y;\n y = x % y;\n x = t;\n }\n return x;\n}\n\nconst bflSubmitSchema = z.object({\n id: z.string(),\n polling_url: z.url(),\n cost: z.number().nullish(),\n input_mp: z.number().nullish(),\n output_mp: z.number().nullish(),\n});\n\nconst bflStatus = z.union([\n z.literal('Pending'),\n z.literal('Ready'),\n z.literal('Error'),\n z.literal('Failed'),\n z.literal('Request Moderated'),\n]);\n\nconst bflPollSchema = z\n .object({\n status: bflStatus.optional(),\n state: bflStatus.optional(),\n details: z.unknown().optional(),\n result: z\n .object({\n sample: z.url(),\n seed: z.number().optional(),\n start_time: z.number().optional(),\n end_time: z.number().optional(),\n duration: z.number().optional(),\n })\n .nullish(),\n })\n .refine(v => v.status != null || v.state != null, {\n message: 'Missing status in Black Forest Labs poll response',\n })\n .transform(v => ({\n status: (v.status ?? v.state)!,\n result: v.result,\n }));\n","import {\n createJsonErrorResponseHandler,\n isSameOrigin,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Transport concerns shared by every Black Forest Labs model\n */\n\nexport const bflErrorSchema = z.object({\n message: z.string().optional(),\n detail: z.any().optional(),\n});\n\nfunction bflErrorToMessage(error: unknown): string | undefined {\n const parsed = bflErrorSchema.safeParse(error);\n if (!parsed.success) return undefined;\n const { message, detail } = parsed.data;\n if (typeof detail === 'string') return detail;\n if (detail != null) {\n try {\n return JSON.stringify(detail);\n } catch {\n // ignore\n }\n }\n return message;\n}\n\nexport const bflFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: bflErrorSchema,\n errorToMessage: error =>\n bflErrorToMessage(error) ?? 'Unknown Black Forest Labs error',\n});\n\n/**\n * Black Forest Labs returns response-supplied URLs (polling and delivery) on\n * sibling cluster hosts of the API origin (e.g. `api.us1.bfl.ai` for a base\n * URL on `api.bfl.ai`), so a strict same-origin check against the configured\n * base URL is not enough. Credentials may also be sent to any https host under\n * the official `bfl.ai` domain.\n */\nexport function isTrustedUrl(url: string, baseUrl: string): boolean {\n if (isSameOrigin(url, baseUrl)) {\n return true;\n }\n\n try {\n const { protocol, hostname } = new URL(url);\n return (\n protocol === 'https:' &&\n (hostname === 'bfl.ai' || hostname.endsWith('.bfl.ai'))\n );\n } catch {\n return false;\n }\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const blackForestLabsImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n imagePrompt: z.string().optional(),\n imagePromptStrength: z.number().min(0).max(1).optional(),\n /** @deprecated use prompt.images instead */\n inputImage: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage2: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage3: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage4: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage5: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage6: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage7: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage8: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage9: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage10: z.string().optional(),\n steps: z.number().int().positive().optional(),\n guidance: z.number().min(0).optional(),\n width: z.number().int().min(256).max(1920).optional(),\n height: z.number().int().min(256).max(1920).optional(),\n outputFormat: z.enum(['jpeg', 'png']).optional(),\n promptUpsampling: z.boolean().optional(),\n raw: z.boolean().optional(),\n safetyTolerance: z.number().int().min(0).max(6).optional(),\n webhookSecret: z.string().optional(),\n webhookUrl: z.url().optional(),\n pollIntervalMillis: z.number().int().positive().optional(),\n pollTimeoutMillis: z.number().int().positive().optional(),\n }),\n ),\n);\n\nexport type BlackForestLabsImageModelOptions = InferSchema<\n typeof blackForestLabsImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n InvalidArgumentError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4CallOptions as VideoModelV4CallOptions,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type Experimental_VideoModelV4Result as VideoModelV4Result,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n delay,\n getFromApi,\n getTopLevelMediaType,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n bflFailedResponseHandler,\n isTrustedUrl,\n} from './black-forest-labs-api';\nimport {\n blackForestLabsVideoModelOptionsSchema,\n type BlackForestLabsVideoModelOptions,\n} from './black-forest-labs-video-model-options';\nimport {\n blackForestLabsVideoAspectRatios,\n blackForestLabsVideoResolutions,\n type BlackForestLabsVideoModelId,\n} from './black-forest-labs-video-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 2_000;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 600_000;\nconst MIN_DURATION_SECONDS = 5;\nconst MAX_DURATION_SECONDS = 20;\n/** Keyframe counts above this need an explicit duration when untimed. */\nconst UNTIMED_KEYFRAMES_NEEDING_DURATION = 3;\n\nconst allowedAspectRatios = new Set<string>(blackForestLabsVideoAspectRatios);\nconst allowedResolutions = new Set<string>(blackForestLabsVideoResolutions);\n\n/**\n * Statuses that end the poll without a video.\n */\nconst TERMINAL_FAILURE_STATUSES = new Set([\n 'Error',\n 'Failed',\n 'Request Moderated',\n 'Content Moderated',\n 'Task not found',\n]);\n\ntype BlackForestLabsVideoKeyframe = string | [number, string];\n\ninterface BlackForestLabsVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n pollIntervalMillis?: number;\n pollTimeoutMillis?: number;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\ntype BlackForestLabsVideoOperation = {\n requestId: string;\n pollingUrl: string;\n cost?: number;\n inputMegapixels?: number;\n outputMegapixels?: number;\n};\n\ntype BlackForestLabsVideoDoGenerateOptions = VideoModelV4CallOptions;\n\n/**\n * The API takes a named tier (`hd`/`fhd`) while the top-level `resolution` is\n * `{width}x{height}`, so a caller may reasonably pass either.\n */\nfunction resolveTopLevelResolution(\n resolution: string,\n): { tier: string; derived: boolean } | undefined {\n const named = resolution.toLowerCase();\n if (allowedResolutions.has(named)) {\n return { tier: named, derived: false };\n }\n\n const match = resolution.match(/^(\\d+)x(\\d+)$/);\n if (match == null) {\n return undefined;\n }\n\n const shorterSide = Math.min(Number(match[1]), Number(match[2]));\n return {\n tier: shorterSide <= 720 ? 'hd' : 'fhd',\n derived: shorterSide !== 720 && shorterSide !== 1080,\n };\n}\n\nfunction nonImageFrameMediaType(file: VideoModelV4File): string | undefined {\n if (file.mediaType == null) {\n return undefined;\n }\n\n const topLevelMediaType = getTopLevelMediaType(file.mediaType);\n return topLevelMediaType === 'image' ? undefined : topLevelMediaType;\n}\n\n/**\n * Draft-enhance replays an encrypted bundle from a prior `draft` generation at\n * full quality. The bundle pins the original mode, prompt, seed, and\n * conditioning media, and the API accepts nothing alongside it but\n * `safety_tolerance` — so this is a separate body rather than one more field,\n * and everything else the caller set is reported as dropped.\n */\nfunction getDraftEnhanceArgs(\n options: BlackForestLabsVideoDoGenerateOptions,\n bflOptions: BlackForestLabsVideoModelOptions,\n) {\n const warnings: Array<SharedV4Warning> = [];\n\n const pinnedByBundle: Array<[feature: string, isSet: boolean]> = [\n ['prompt', (options.prompt?.trim().length ?? 0) > 0],\n [\n 'aspectRatio',\n options.aspectRatio != null || bflOptions.aspectRatio != null,\n ],\n ['resolution', options.resolution != null || bflOptions.resolution != null],\n ['duration', options.duration != null],\n ['fps', options.fps != null],\n ['seed', options.seed != null],\n ['generateAudio', options.generateAudio != null],\n ['image', options.image != null],\n ['frameImages', (options.frameImages?.length ?? 0) > 0],\n ['inputReferences', (options.inputReferences?.length ?? 0) > 0],\n ['keyframes', (bflOptions.keyframes?.length ?? 0) > 0],\n ['version', bflOptions.version != null],\n ];\n\n for (const [feature, isSet] of pinnedByBundle) {\n if (isSet) {\n warnings.push({\n type: 'unsupported',\n feature,\n details:\n `FLUX 3 draft enhance replays the draft bundle as it was generated, so \"${feature}\" ` +\n 'was ignored. Set it on the original draft request instead.',\n });\n }\n }\n\n if (bflOptions.draft != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'draft',\n details:\n 'FLUX 3 draft enhance always renders at full quality. The draft option was ignored.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'FLUX 3 video generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n return {\n body: {\n mode: 'draft_enhance',\n draft_cache: bflOptions.draftCache,\n safety_tolerance: bflOptions.safetyTolerance,\n } as Record<string, unknown>,\n warnings,\n };\n}\n\n/**\n * A failed poll carries a `details` payload that is a plain string for\n * moderation refusals and an object for everything else.\n */\nfunction describePollDetails(details: unknown): string | undefined {\n if (details == null) {\n return undefined;\n }\n\n if (typeof details === 'string') {\n return details;\n }\n\n try {\n return JSON.stringify(details);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The API takes conditioning media as an http(s) URL or a bare base64 string —\n * not a data URI.\n */\nfunction toBlackForestLabsFile(file: VideoModelV4File): string {\n if (file.type === 'url') {\n return file.url;\n }\n\n if (typeof file.data === 'string') {\n return file.data;\n }\n\n return Buffer.from(file.data).toString('base64');\n}\n\nexport class BlackForestLabsVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: BlackForestLabsVideoModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: BlackForestLabsVideoModelId;\n config: BlackForestLabsVideoModelConfig;\n }) {\n return new BlackForestLabsVideoModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: BlackForestLabsVideoModelId,\n private readonly config: BlackForestLabsVideoModelConfig,\n ) {}\n\n private async getArgs(options: BlackForestLabsVideoDoGenerateOptions) {\n const warnings: Array<SharedV4Warning> = [];\n\n const bflOptions = (await parseProviderOptions({\n provider: 'blackForestLabs',\n providerOptions: options.providerOptions,\n schema: blackForestLabsVideoModelOptionsSchema,\n })) as BlackForestLabsVideoModelOptions | undefined;\n\n if (bflOptions?.draftCache != null) {\n return getDraftEnhanceArgs(options, bflOptions);\n }\n\n if (options.fps != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'FLUX 3 video does not support a custom frame rate.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'FLUX 3 video does not accept a seed.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'FLUX 3 video generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n // Resolution: an explicit provider option is already a tier, so it wins and\n // a top-level value only has to be resolved when it is the sole source.\n let resolution: string | undefined = bflOptions?.resolution;\n if (options.resolution != null) {\n const resolved = resolveTopLevelResolution(options.resolution);\n if (resolution != null) {\n if (resolved == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". FLUX 3 video supports \"hd\" and \"fhd\", ` +\n `so providerOptions.blackForestLabs.resolution (\"${resolution}\") was used instead.`,\n });\n }\n } else if (resolved == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". FLUX 3 video supports ` +\n '\"hd\" and \"fhd\", or a {width}x{height} value to map onto one.',\n });\n } else {\n resolution = resolved.tier;\n if (resolved.derived) {\n warnings.push({\n type: 'compatibility',\n feature: 'resolution',\n details:\n `FLUX 3 video renders at \"hd\" or \"fhd\"; the requested resolution ` +\n `\"${options.resolution}\" was mapped to \"${resolved.tier}\".`,\n });\n }\n }\n }\n\n // Aspect ratio: the provider option can also express `auto`, so it wins.\n let aspectRatio: string | undefined = bflOptions?.aspectRatio;\n if (aspectRatio == null && options.aspectRatio != null) {\n if (allowedAspectRatios.has(options.aspectRatio)) {\n aspectRatio = options.aspectRatio;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `FLUX 3 video does not support the aspect ratio \"${options.aspectRatio}\". ` +\n 'Using the provider default (auto).',\n });\n }\n }\n\n // Resolve first/last frame inputs. A standalone `image` is treated as the\n // first frame (image-to-video). The core sets `image` to the `first_frame`\n // frame image when there is one, so the frame-image entry is tracked\n // separately to report which input a warning came from.\n const firstFrameImage = options.frameImages?.find(\n frame => frame.frameType === 'first_frame',\n )?.image;\n let firstFrame = firstFrameImage ?? options.image;\n let lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n const firstFrameMediaType =\n firstFrame != null ? nonImageFrameMediaType(firstFrame) : undefined;\n if (firstFrame != null && firstFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: firstFrameImage != null ? 'frameImages' : 'image',\n details:\n firstFrameMediaType === 'video'\n ? 'FLUX 3 video does not accept a video as a keyframe. Pass it as an inputReference to continue from it instead.'\n : `FLUX 3 video only accepts an image as a keyframe; the \"${firstFrame.mediaType}\" file was ignored.`,\n });\n firstFrame = undefined;\n }\n\n if (lastFrame != null) {\n if (firstFrame == null) {\n // Keyframes are positional: the first entry opens the clip, so there is\n // no way to send a closing frame on its own.\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'FLUX 3 video requires a first_frame when a last_frame is provided. The last_frame was ignored.',\n });\n lastFrame = undefined;\n } else {\n const lastFrameMediaType = nonImageFrameMediaType(lastFrame);\n if (lastFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n lastFrameMediaType === 'video'\n ? 'FLUX 3 video does not accept a video as a keyframe. The last_frame video was ignored.'\n : `FLUX 3 video only accepts an image as a keyframe; the \"${lastFrame.mediaType}\" last_frame was ignored.`,\n });\n lastFrame = undefined;\n }\n }\n }\n\n // Keyframes: the provider option covers the shapes the top-level fields\n // cannot express (3+ images, images pinned to a second), so it wins.\n let keyframes: BlackForestLabsVideoKeyframe[] | undefined =\n bflOptions?.keyframes != null && bflOptions.keyframes.length > 0\n ? [...bflOptions.keyframes]\n : undefined;\n\n if (keyframes != null) {\n if (firstFrame != null || lastFrame != null) {\n warnings.push({\n type: 'unsupported',\n feature: options.frameImages != null ? 'frameImages' : 'image',\n details:\n 'FLUX 3 video takes a single keyframe list. providerOptions.blackForestLabs.keyframes ' +\n 'was used and the top-level frame images were ignored.',\n });\n }\n } else if (firstFrame != null) {\n keyframes = [toBlackForestLabsFile(firstFrame)];\n if (lastFrame != null) {\n keyframes.push(toBlackForestLabsFile(lastFrame));\n }\n }\n\n // Video continuation. FLUX 3 takes a single `start_video` and has no\n // reference-image concept, so image references cannot be honored.\n let startVideo: string | undefined;\n const referenceFiles = options.inputReferences ?? [];\n const referenceVideos: VideoModelV4File[] = [];\n\n for (const file of referenceFiles) {\n const topLevelMediaType =\n file.mediaType != null\n ? getTopLevelMediaType(file.mediaType)\n : undefined;\n\n if (topLevelMediaType === 'video') {\n referenceVideos.push(file);\n } else if (topLevelMediaType == null) {\n warnings.push({\n type: 'compatibility',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video only accepts a video reference, so the reference with no mediaType ' +\n 'was treated as the video to continue from. Pass { url, mediaType: \"video/mp4\" } to be explicit.',\n });\n referenceVideos.push(file);\n } else if (topLevelMediaType === 'image') {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video has no reference-image input. Pass images as `image`, `frameImages`, or ' +\n 'providerOptions.blackForestLabs.keyframes instead. The reference was ignored.',\n });\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details: `FLUX 3 video only accepts a video reference; the \"${file.mediaType}\" reference was ignored.`,\n });\n }\n }\n\n if (referenceVideos.length > 0) {\n if (keyframes != null) {\n // Continuation and keyframes are mutually exclusive modes.\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video cannot combine keyframes with a video to continue from. The video reference was ignored.',\n });\n } else {\n startVideo = toBlackForestLabsFile(referenceVideos[0]);\n if (referenceVideos.length > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video continues from a single video. Only the first video reference was used.',\n });\n }\n }\n }\n\n // Duration: whole seconds between 5 and 20, or omitted to let the API pick\n // one that matches the content.\n let duration = options.duration;\n if (duration != null) {\n if (!Number.isInteger(duration)) {\n const rounded = Math.round(duration);\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `FLUX 3 video requires a whole number of seconds. The requested duration of ${duration} was rounded to ${rounded}.`,\n });\n duration = rounded;\n }\n\n if (duration > MAX_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `FLUX 3 video supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,\n });\n duration = MAX_DURATION_SECONDS;\n } else if (duration < MIN_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `FLUX 3 video requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`,\n });\n duration = MIN_DURATION_SECONDS;\n }\n }\n\n const untimedKeyframeCount =\n keyframes?.filter(keyframe => typeof keyframe === 'string').length ?? 0;\n if (\n duration == null &&\n untimedKeyframeCount >= UNTIMED_KEYFRAMES_NEEDING_DURATION\n ) {\n throw new InvalidArgumentError({\n argument: 'duration',\n message:\n `FLUX 3 video requires an explicit duration when ${UNTIMED_KEYFRAMES_NEEDING_DURATION} or more ` +\n 'keyframes are sent without a timestamp.',\n });\n }\n\n const mode = keyframes != null ? 'i2v' : startVideo != null ? 'v2v' : 't2v';\n\n const body: Record<string, unknown> = {\n mode,\n prompt: options.prompt ?? '',\n aspect_ratio: aspectRatio,\n duration,\n resolution,\n version: bflOptions?.version,\n generate_audio: options.generateAudio,\n safety_tolerance: bflOptions?.safetyTolerance,\n draft: bflOptions?.draft,\n ...(mode === 'i2v' && { keyframes }),\n ...(mode === 'v2v' && { start_video: startVideo }),\n };\n\n return { body, warnings };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const { body, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n const { value: submit, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combinedHeaders,\n body,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(bflVideoSubmitSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n operation: {\n requestId: submit.id,\n pollingUrl: submit.polling_url,\n ...(submit.cost != null && { cost: submit.cost }),\n ...(submit.input_mp != null && {\n inputMegapixels: submit.input_mp,\n }),\n ...(submit.output_mp != null && {\n outputMegapixels: submit.output_mp,\n }),\n } satisfies BlackForestLabsVideoOperation,\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const operation = options.operation as BlackForestLabsVideoOperation;\n const url = new URL(operation.pollingUrl);\n if (!url.searchParams.has('id')) {\n url.searchParams.set('id', operation.requestId);\n }\n\n const combinedHeaders = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n const { value, responseHeaders } = await getFromApi({\n url: url.toString(),\n // The polling URL comes from the provider response; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n // Only send credentials when it stays on a trusted provider host.\n headers: isTrustedUrl(url.toString(), this.config.baseURL)\n ? combinedHeaders\n : undefined,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(bflVideoPollSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const response = {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n };\n const { status, result } = value;\n\n const cost = value.cost ?? operation.cost;\n\n if (status === 'Ready') {\n const parsed = bflVideoResultSchema.safeParse(result);\n if (!parsed.success) {\n throw new AISDKError({\n name: 'BLACK_FOREST_LABS_VIDEO_GENERATION_ERROR',\n message:\n 'Black Forest Labs reported the video as Ready but returned no result.sample URL. ' +\n `Request id: ${operation.requestId}`,\n });\n }\n\n return {\n status: 'completed',\n videos: [\n {\n type: 'url',\n url: parsed.data.sample,\n mediaType: 'video/mp4',\n },\n ],\n warnings: [],\n providerMetadata: {\n blackForestLabs: {\n videos: [\n {\n id: operation.requestId,\n videoUrl: parsed.data.sample,\n ...(parsed.data.seed != null && { seed: parsed.data.seed }),\n ...(parsed.data.start_time != null && {\n start_time: parsed.data.start_time,\n }),\n ...(parsed.data.end_time != null && {\n end_time: parsed.data.end_time,\n }),\n ...(parsed.data.duration != null && {\n duration: parsed.data.duration,\n }),\n ...(parsed.data.draft_cache != null && {\n draftCache: parsed.data.draft_cache,\n }),\n ...(cost != null && { cost }),\n ...(operation.inputMegapixels != null && {\n inputMegapixels: operation.inputMegapixels,\n }),\n ...(operation.outputMegapixels != null && {\n outputMegapixels: operation.outputMegapixels,\n }),\n },\n ],\n },\n },\n response,\n };\n }\n\n if (TERMINAL_FAILURE_STATUSES.has(status)) {\n const detail = describePollDetails(value.details);\n return {\n status: 'error',\n error:\n `Black Forest Labs video generation failed with status \"${status}\"` +\n `${detail != null ? `: ${detail}` : ''}. Request id: ${operation.requestId}`,\n response,\n };\n }\n\n return { status: 'pending', response };\n }\n\n async doGenerate(\n options: BlackForestLabsVideoDoGenerateOptions,\n ): Promise<VideoModelV4Result> {\n const startResult = await this.doStart(options);\n const operation = startResult.operation as BlackForestLabsVideoOperation;\n const pollIntervalMillis =\n this.config.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n this.config.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS;\n const startTime = Date.now();\n\n while (true) {\n await delay(pollIntervalMillis, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMillis) {\n throw new AISDKError({\n name: 'BLACK_FOREST_LABS_VIDEO_GENERATION_TIMEOUT',\n message:\n `Black Forest Labs video generation timed out after ${pollTimeoutMillis}ms. ` +\n `Request id: ${operation.requestId}`,\n });\n }\n\n const statusResult = await this.doStatus({\n operation,\n headers: options.headers,\n abortSignal: options.abortSignal,\n });\n\n if (statusResult.status === 'pending') {\n continue;\n }\n\n if (statusResult.status === 'error') {\n throw new AISDKError({\n name: 'BLACK_FOREST_LABS_VIDEO_GENERATION_FAILED',\n message: statusResult.error,\n });\n }\n\n return {\n videos: statusResult.videos,\n warnings: [...startResult.warnings, ...statusResult.warnings],\n providerMetadata: statusResult.providerMetadata,\n response: statusResult.response,\n };\n }\n }\n}\n\nconst bflVideoSubmitSchema = z.object({\n id: z.string(),\n polling_url: z.url(),\n cost: z.number().nullish(),\n input_mp: z.number().nullish(),\n output_mp: z.number().nullish(),\n});\n\nconst bflVideoResultSchema = z.object({\n sample: z.url(),\n seed: z.number().nullish(),\n start_time: z.number().nullish(),\n end_time: z.number().nullish(),\n duration: z.number().nullish(),\n draft_cache: z.string().nullish(),\n});\n\nconst bflVideoPollSchema = z\n .object({\n status: z.string().optional(),\n state: z.string().optional(),\n details: z.unknown().optional(),\n result: z.unknown().optional(),\n // `SettledCostResultResponse.cost` — the price actually charged, which the\n // API can only know once generation finishes. Absent on the plain\n // `ResultResponse` variant.\n cost: z.number().nullish(),\n })\n .refine(v => v.status != null || v.state != null, {\n message: 'Missing status in Black Forest Labs poll response',\n })\n .transform(v => ({\n status: (v.status ?? v.state)!,\n details: v.details,\n result: v.result,\n cost: v.cost,\n }));\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n blackForestLabsVideoAspectRatios,\n blackForestLabsVideoResolutions,\n} from './black-forest-labs-video-settings';\n\nconst blackForestLabsTimedVideoKeyframeSchema = z.tuple([\n z.number().min(0).max(20),\n z.string(),\n]);\n\nexport const blackForestLabsVideoKeyframesSchema = z.union([\n z.array(z.string()).min(1).max(10),\n z\n .array(blackForestLabsTimedVideoKeyframeSchema)\n .min(1)\n .max(10)\n .refine(\n keyframes =>\n keyframes.every(\n (keyframe, index) =>\n index === 0 || keyframe[0] > keyframes[index - 1][0],\n ),\n { message: 'Timed keyframes must be in chronological order.' },\n ),\n]);\n\nexport const blackForestLabsVideoProviderOptions = z.object({\n /**\n * Output resolution tier. Takes precedence over the top-level `resolution`,\n * which is expressed as `{width}x{height}` and has to be mapped onto a tier.\n */\n resolution: z.enum(blackForestLabsVideoResolutions).optional(),\n\n /**\n * Aspect ratio of the generated video. Takes precedence over the top-level\n * `aspectRatio`, and unlike it can be set to `auto`.\n */\n aspectRatio: z.enum(blackForestLabsVideoAspectRatios).optional(),\n\n /**\n * Keyframes for image-to-video generation, for the shapes the top-level\n * `image` and `frameImages` options cannot express: more than two images, or\n * images pinned to a specific second. Takes precedence over both.\n *\n * One image opens the clip, two open and close it, and with more the extras\n * are spaced evenly in between. Three or more plain images require an\n * explicit `duration`.\n */\n keyframes: blackForestLabsVideoKeyframesSchema.optional(),\n\n /**\n * Moderation strictness from 0 (strictest) to 4. Defaults to 2. Sexual\n * content is capped at 3 and hate content at 2 regardless of the request,\n * and any request carrying conditioning media is capped at 2.\n */\n safetyTolerance: z.number().int().min(0).max(4).optional(),\n\n /**\n * Render a fast, lower-quality preview instead of the finished video.\n * Defaults to `false`.\n */\n draft: z.boolean().optional(),\n\n /**\n * Encrypted draft-cache bundle from a prior `draft` generation, which\n * switches the request to draft-enhance mode: the bundle is replayed at full\n * quality.\n *\n * Either the base64-encoded `.bin` downloaded from the draft's `draftCache`\n * URL, or that URL itself while it is still in its expiry window.\n */\n draftCache: z.string().optional(),\n\n /**\n * Model version to pin. Only `latest` is available today.\n */\n version: z.literal('latest').optional(),\n});\n\nexport const blackForestLabsVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(blackForestLabsVideoProviderOptions),\n);\n\nexport type BlackForestLabsVideoModelOptions = InferSchema<\n typeof blackForestLabsVideoModelOptionsSchema\n>;\n","// https://docs.bfl.ai/api-reference/utility/generate-a-video-with-flux-3\nexport type BlackForestLabsVideoModelId = 'flux-3-video' | (string & {});\n\n/**\n * Aspect ratios FLUX 3 video accepts. `auto` lets the model infer the ratio\n * from the prompt and any conditioning media, and is the API default.\n */\nexport const blackForestLabsVideoAspectRatios = [\n '21:9',\n '2:1',\n '16:9',\n '4:3',\n '1:1',\n '3:4',\n '9:16',\n 'auto',\n] as const;\n\n/**\n * Output resolution tiers FLUX 3 video accepts.\n */\nexport const blackForestLabsVideoResolutions = ['hd', 'fhd'] as const;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","z","combineHeaders","createJsonResponseHandler","delay","getFromApi","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_DESERIALIZE","WORKFLOW_SERIALIZE","z","lazySchema","zodSchema","z","z","lazySchema","zodSchema","DEFAULT_POLL_INTERVAL_MILLIS","DEFAULT_POLL_TIMEOUT_MILLIS","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","getFromApi","delay","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/black-forest-labs-provider.ts","../src/black-forest-labs-image-model.ts","../src/black-forest-labs-api.ts","../src/black-forest-labs-image-model-options.ts","../src/black-forest-labs-video-model.ts","../src/black-forest-labs-video-model-options.ts","../src/black-forest-labs-video-settings.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4,\n type ImageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { BlackForestLabsImageModel } from './black-forest-labs-image-model';\nimport type { BlackForestLabsImageModelId } from './black-forest-labs-image-settings';\nimport { BlackForestLabsVideoModel } from './black-forest-labs-video-model';\nimport type { BlackForestLabsVideoModelId } from './black-forest-labs-video-settings';\nimport { VERSION } from './version';\n\nexport interface BlackForestLabsProviderSettings {\n /**\n * Black Forest Labs API key. Default value is taken from the `BFL_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls. Defaults to `https://api.bfl.ai/v1`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Poll interval in milliseconds between status checks. Defaults to 500ms for\n * images and 2s for video.\n */\n pollIntervalMillis?: number;\n\n /**\n * Overall timeout in milliseconds for polling before giving up. Defaults to\n * 60s for images and 10 minutes for video.\n */\n pollTimeoutMillis?: number;\n}\n\nexport interface BlackForestLabsProvider extends ProviderV4 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: BlackForestLabsImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: BlackForestLabsImageModelId): ImageModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: BlackForestLabsVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: BlackForestLabsVideoModelId): Experimental_VideoModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://api.bfl.ai/v1';\n\nexport function createBlackForestLabs(\n options: BlackForestLabsProviderSettings = {},\n): BlackForestLabsProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'x-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'BFL_API_KEY',\n description: 'Black Forest Labs',\n }),\n ...options.headers,\n },\n `ai-sdk/black-forest-labs/${VERSION}`,\n );\n\n const createImageModel = (modelId: BlackForestLabsImageModelId) =>\n new BlackForestLabsImageModel(modelId, {\n provider: 'black-forest-labs.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n pollIntervalMillis: options.pollIntervalMillis,\n pollTimeoutMillis: options.pollTimeoutMillis,\n });\n\n const createVideoModel = (modelId: BlackForestLabsVideoModelId) =>\n new BlackForestLabsVideoModel(modelId, {\n provider: 'black-forest-labs.video',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n pollIntervalMillis: options.pollIntervalMillis,\n pollTimeoutMillis: options.pollTimeoutMillis,\n });\n\n const embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n return {\n specificationVersion: 'v4',\n imageModel: createImageModel,\n image: createImageModel,\n videoModel: createVideoModel,\n video: createVideoModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const blackForestLabs = createBlackForestLabs();\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n bflFailedResponseHandler,\n isTrustedUrl,\n} from './black-forest-labs-api';\nimport { blackForestLabsImageModelOptionsSchema } from './black-forest-labs-image-model-options';\nimport type {\n BlackForestLabsAspectRatio,\n BlackForestLabsImageModelId,\n} from './black-forest-labs-image-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 60000;\n\ninterface BlackForestLabsImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n /**\n * Poll interval in milliseconds between status checks. Defaults to 500ms.\n */\n pollIntervalMillis?: number;\n /**\n * Overall timeout in milliseconds for polling before giving up. Defaults to 60s.\n */\n pollTimeoutMillis?: number;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class BlackForestLabsImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get supportsFileInputs(): boolean | undefined {\n if (\n ['flux-kontext-pro', 'flux-kontext-max', 'flux-pro-1.0-fill'].includes(\n this.modelId,\n )\n ) {\n return true;\n }\n\n if (['flux-pro-1.1-ultra', 'flux-pro-1.1'].includes(this.modelId)) {\n return false;\n }\n\n return undefined;\n }\n\n get supportsMaskInputs(): boolean | undefined {\n if (this.modelId === 'flux-pro-1.0-fill') {\n return true;\n }\n\n return this.supportsFileInputs == null ? undefined : false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: BlackForestLabsImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: BlackForestLabsImageModelId;\n config: BlackForestLabsImageModelConfig;\n }) {\n return new BlackForestLabsImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: BlackForestLabsImageModelId,\n private readonly config: BlackForestLabsImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n }: Parameters<ImageModelV4['doGenerate']>[0]) {\n const warnings: Array<SharedV4Warning> = [];\n\n const finalAspectRatio =\n aspectRatio ?? (size ? convertSizeToAspectRatio(size) : undefined);\n\n if (size && !aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'Deriving aspect_ratio from size. Use the width and height provider options to specify dimensions for models that support them.',\n });\n } else if (size && aspectRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'Black Forest Labs ignores size when aspectRatio is provided. Use the width and height provider options to specify dimensions for models that support them',\n });\n }\n\n const bflOptions = await parseProviderOptions({\n provider: 'blackForestLabs',\n providerOptions,\n schema: blackForestLabsImageModelOptionsSchema,\n });\n\n const [widthStr, heightStr] = size?.split('x') ?? [];\n\n const inputImages: string[] =\n files?.map(file => {\n if (file.type === 'url') {\n return file.url;\n }\n\n if (typeof file.data === 'string') {\n return file.data;\n }\n\n return Buffer.from(file.data).toString('base64');\n }) || [];\n\n if (inputImages.length > 10) {\n throw new Error('Black Forest Labs supports up to 10 input images.');\n }\n\n const inputImageField =\n this.modelId === 'flux-pro-1.0-fill' ? 'image' : 'input_image';\n const inputImagesObj: Record<string, string> = inputImages.reduce<\n Record<string, string>\n >((acc, img, index) => {\n acc[`${inputImageField}${index === 0 ? '' : `_${index + 1}`}`] = img;\n return acc;\n }, {});\n\n let maskValue: string | undefined;\n if (mask) {\n if (mask.type === 'url') {\n maskValue = mask.url;\n } else {\n if (typeof mask.data === 'string') {\n maskValue = mask.data;\n } else {\n maskValue = Buffer.from(mask.data).toString('base64');\n }\n }\n }\n\n const body: Record<string, unknown> = {\n prompt,\n seed,\n aspect_ratio: finalAspectRatio,\n width: bflOptions?.width ?? (size ? Number(widthStr) : undefined),\n height: bflOptions?.height ?? (size ? Number(heightStr) : undefined),\n steps: bflOptions?.steps,\n guidance: bflOptions?.guidance,\n image_prompt_strength: bflOptions?.imagePromptStrength,\n image_prompt: bflOptions?.imagePrompt,\n ...inputImagesObj,\n mask: maskValue,\n output_format: bflOptions?.outputFormat,\n prompt_upsampling: bflOptions?.promptUpsampling,\n raw: bflOptions?.raw,\n safety_tolerance: bflOptions?.safetyTolerance,\n webhook_secret: bflOptions?.webhookSecret,\n webhook_url: bflOptions?.webhookUrl,\n };\n\n return { body, warnings, bflOptions };\n }\n\n async doGenerate({\n prompt,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const { body, warnings, bflOptions } = await this.getArgs({\n prompt,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n n: 1,\n headers,\n abortSignal,\n } as Parameters<ImageModelV4['doGenerate']>[0]);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n await resolve(this.config.headers),\n headers,\n );\n\n const submit = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combinedHeaders,\n body,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(bflSubmitSchema),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const pollUrl = submit.value.polling_url;\n const requestId = submit.value.id;\n\n const {\n imageUrl,\n seed: resultSeed,\n start_time: resultStartTime,\n end_time: resultEndTime,\n duration: resultDuration,\n } = await this.pollForImageUrl({\n pollUrl,\n requestId,\n headers: combinedHeaders,\n abortSignal,\n pollOverrides: {\n pollIntervalMillis: bflOptions?.pollIntervalMillis,\n pollTimeoutMillis: bflOptions?.pollTimeoutMillis,\n },\n });\n\n const { value: imageBytes, responseHeaders } = await getFromApi({\n url: imageUrl,\n // imageUrl comes from the provider response body; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n // Only send credentials if the response-supplied URL points back at the\n // provider; the image is typically delivered from a CDN, so the API key\n // must not travel to a foreign host.\n headers: isTrustedUrl(imageUrl, this.config.baseURL)\n ? combinedHeaders\n : undefined,\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n\n return {\n images: [imageBytes],\n warnings,\n providerMetadata: {\n blackForestLabs: {\n images: [\n {\n ...(resultSeed != null && { seed: resultSeed }),\n ...(resultStartTime != null && { start_time: resultStartTime }),\n ...(resultEndTime != null && { end_time: resultEndTime }),\n ...(resultDuration != null && { duration: resultDuration }),\n ...(submit.value.cost != null && { cost: submit.value.cost }),\n ...(submit.value.input_mp != null && {\n inputMegapixels: submit.value.input_mp,\n }),\n ...(submit.value.output_mp != null && {\n outputMegapixels: submit.value.output_mp,\n }),\n },\n ],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollForImageUrl({\n pollUrl,\n requestId,\n headers,\n abortSignal,\n pollOverrides,\n }: {\n pollUrl: string;\n requestId: string;\n headers: Record<string, string | undefined>;\n abortSignal: AbortSignal | undefined;\n pollOverrides?: {\n pollIntervalMillis?: number;\n pollTimeoutMillis?: number;\n };\n }): Promise<{\n imageUrl: string;\n seed?: number;\n start_time?: number;\n end_time?: number;\n duration?: number;\n }> {\n const pollIntervalMillis =\n pollOverrides?.pollIntervalMillis ??\n this.config.pollIntervalMillis ??\n DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n pollOverrides?.pollTimeoutMillis ??\n this.config.pollTimeoutMillis ??\n DEFAULT_POLL_TIMEOUT_MILLIS;\n\n const url = new URL(pollUrl);\n if (!url.searchParams.has('id')) {\n url.searchParams.set('id', requestId);\n }\n\n const timeoutController = new AbortController();\n let didTimeout = false;\n const timeoutId = setTimeout(() => {\n didTimeout = true;\n timeoutController.abort();\n }, pollTimeoutMillis);\n const pollingAbortSignal =\n abortSignal == null\n ? timeoutController.signal\n : AbortSignal.any([abortSignal, timeoutController.signal]);\n\n try {\n while (true) {\n const { value } = await getFromApi({\n url: url.toString(),\n // The polling URL comes from the provider response; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n // Only send credentials when it stays on a trusted provider host.\n headers: isTrustedUrl(url.toString(), this.config.baseURL)\n ? headers\n : undefined,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(bflPollSchema),\n abortSignal: pollingAbortSignal,\n fetch: this.config.fetch,\n });\n\n const status = value.status;\n if (status === 'Ready') {\n if (typeof value.result?.sample === 'string') {\n return {\n imageUrl: value.result.sample,\n seed: value.result.seed ?? undefined,\n start_time: value.result.start_time ?? undefined,\n end_time: value.result.end_time ?? undefined,\n duration: value.result.duration ?? undefined,\n };\n }\n throw new Error(\n 'Black Forest Labs poll response is Ready but missing result.sample',\n );\n }\n if (status === 'Error' || status === 'Failed') {\n throw new Error('Black Forest Labs generation failed.');\n }\n\n await delay(pollIntervalMillis, {\n abortSignal: pollingAbortSignal,\n });\n }\n } catch (error) {\n if (didTimeout) {\n throw new Error('Black Forest Labs generation timed out.');\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\nfunction convertSizeToAspectRatio(\n size: string,\n): BlackForestLabsAspectRatio | undefined {\n const [wStr, hStr] = size.split('x');\n const width = Number(wStr);\n const height = Number(hStr);\n if (\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return undefined;\n }\n const g = gcd(width, height);\n return `${Math.round(width / g)}:${Math.round(height / g)}`;\n}\n\nfunction gcd(a: number, b: number): number {\n let x = Math.abs(a);\n let y = Math.abs(b);\n while (y !== 0) {\n const t = y;\n y = x % y;\n x = t;\n }\n return x;\n}\n\nconst bflSubmitSchema = z.object({\n id: z.string(),\n polling_url: z.url(),\n cost: z.number().nullish(),\n input_mp: z.number().nullish(),\n output_mp: z.number().nullish(),\n});\n\nconst bflStatus = z.union([\n z.literal('Pending'),\n z.literal('Ready'),\n z.literal('Error'),\n z.literal('Failed'),\n z.literal('Request Moderated'),\n]);\n\nconst bflPollSchema = z\n .object({\n status: bflStatus.optional(),\n state: bflStatus.optional(),\n details: z.unknown().optional(),\n result: z\n .object({\n sample: z.url(),\n seed: z.number().optional(),\n start_time: z.number().optional(),\n end_time: z.number().optional(),\n duration: z.number().optional(),\n })\n .nullish(),\n })\n .refine(v => v.status != null || v.state != null, {\n message: 'Missing status in Black Forest Labs poll response',\n })\n .transform(v => ({\n status: (v.status ?? v.state)!,\n result: v.result,\n }));\n","import {\n createJsonErrorResponseHandler,\n isSameOrigin,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Transport concerns shared by every Black Forest Labs model\n */\n\nexport const bflErrorSchema = z.object({\n message: z.string().optional(),\n detail: z.any().optional(),\n});\n\nfunction bflErrorToMessage(error: unknown): string | undefined {\n const parsed = bflErrorSchema.safeParse(error);\n if (!parsed.success) return undefined;\n const { message, detail } = parsed.data;\n if (typeof detail === 'string') return detail;\n if (detail != null) {\n try {\n return JSON.stringify(detail);\n } catch {\n // ignore\n }\n }\n return message;\n}\n\nexport const bflFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: bflErrorSchema,\n errorToMessage: error =>\n bflErrorToMessage(error) ?? 'Unknown Black Forest Labs error',\n});\n\n/**\n * Black Forest Labs returns response-supplied URLs (polling and delivery) on\n * sibling cluster hosts of the API origin (e.g. `api.us1.bfl.ai` for a base\n * URL on `api.bfl.ai`), so a strict same-origin check against the configured\n * base URL is not enough. Credentials may also be sent to any https host under\n * the official `bfl.ai` domain.\n */\nexport function isTrustedUrl(url: string, baseUrl: string): boolean {\n if (isSameOrigin(url, baseUrl)) {\n return true;\n }\n\n try {\n const { protocol, hostname } = new URL(url);\n return (\n protocol === 'https:' &&\n (hostname === 'bfl.ai' || hostname.endsWith('.bfl.ai'))\n );\n } catch {\n return false;\n }\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const blackForestLabsImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n imagePrompt: z.string().optional(),\n imagePromptStrength: z.number().min(0).max(1).optional(),\n /** @deprecated use prompt.images instead */\n inputImage: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage2: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage3: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage4: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage5: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage6: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage7: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage8: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage9: z.string().optional(),\n /** @deprecated use prompt.images instead */\n inputImage10: z.string().optional(),\n steps: z.number().int().positive().optional(),\n guidance: z.number().min(0).optional(),\n width: z.number().int().min(256).max(1920).optional(),\n height: z.number().int().min(256).max(1920).optional(),\n outputFormat: z.enum(['jpeg', 'png']).optional(),\n promptUpsampling: z.boolean().optional(),\n raw: z.boolean().optional(),\n safetyTolerance: z.number().int().min(0).max(6).optional(),\n webhookSecret: z.string().optional(),\n webhookUrl: z.url().optional(),\n pollIntervalMillis: z.number().int().positive().optional(),\n pollTimeoutMillis: z.number().int().positive().optional(),\n }),\n ),\n);\n\nexport type BlackForestLabsImageModelOptions = InferSchema<\n typeof blackForestLabsImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n InvalidArgumentError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4CallOptions as VideoModelV4CallOptions,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type Experimental_VideoModelV4Result as VideoModelV4Result,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n delay,\n getFromApi,\n getTopLevelMediaType,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n bflFailedResponseHandler,\n isTrustedUrl,\n} from './black-forest-labs-api';\nimport {\n blackForestLabsVideoModelOptionsSchema,\n type BlackForestLabsVideoModelOptions,\n} from './black-forest-labs-video-model-options';\nimport {\n blackForestLabsVideoAspectRatios,\n blackForestLabsVideoResolutions,\n type BlackForestLabsVideoModelId,\n} from './black-forest-labs-video-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 2_000;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 600_000;\nconst MIN_DURATION_SECONDS = 5;\nconst MAX_DURATION_SECONDS = 20;\n/** Keyframe counts above this need an explicit duration when untimed. */\nconst UNTIMED_KEYFRAMES_NEEDING_DURATION = 3;\n\nconst allowedAspectRatios = new Set<string>(blackForestLabsVideoAspectRatios);\nconst allowedResolutions = new Set<string>(blackForestLabsVideoResolutions);\n\n/**\n * Statuses that end the poll without a video.\n */\nconst TERMINAL_FAILURE_STATUSES = new Set([\n 'Error',\n 'Failed',\n 'Request Moderated',\n 'Content Moderated',\n 'Task not found',\n]);\n\ntype BlackForestLabsVideoKeyframe = string | [number, string];\n\ninterface BlackForestLabsVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n pollIntervalMillis?: number;\n pollTimeoutMillis?: number;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\ntype BlackForestLabsVideoOperation = {\n requestId: string;\n pollingUrl: string;\n cost?: number;\n inputMegapixels?: number;\n outputMegapixels?: number;\n};\n\ntype BlackForestLabsVideoDoGenerateOptions = VideoModelV4CallOptions;\n\n/**\n * The API takes a named tier (`hd`/`fhd`) while the top-level `resolution` is\n * `{width}x{height}`, so a caller may reasonably pass either.\n */\nfunction resolveTopLevelResolution(\n resolution: string,\n): { tier: string; derived: boolean } | undefined {\n const named = resolution.toLowerCase();\n if (allowedResolutions.has(named)) {\n return { tier: named, derived: false };\n }\n\n const match = resolution.match(/^(\\d+)x(\\d+)$/);\n if (match == null) {\n return undefined;\n }\n\n const shorterSide = Math.min(Number(match[1]), Number(match[2]));\n return {\n tier: shorterSide <= 720 ? 'hd' : 'fhd',\n derived: shorterSide !== 720 && shorterSide !== 1080,\n };\n}\n\nfunction nonImageFrameMediaType(file: VideoModelV4File): string | undefined {\n if (file.mediaType == null) {\n return undefined;\n }\n\n const topLevelMediaType = getTopLevelMediaType(file.mediaType);\n return topLevelMediaType === 'image' ? undefined : topLevelMediaType;\n}\n\n/**\n * Draft-enhance replays an encrypted bundle from a prior `draft` generation at\n * full quality. The bundle pins the original mode, prompt, seed, and\n * conditioning media, and the API accepts nothing alongside it but\n * `safety_tolerance` — so this is a separate body rather than one more field,\n * and everything else the caller set is reported as dropped.\n */\nfunction getDraftEnhanceArgs(\n options: BlackForestLabsVideoDoGenerateOptions,\n bflOptions: BlackForestLabsVideoModelOptions,\n) {\n const warnings: Array<SharedV4Warning> = [];\n\n const pinnedByBundle: Array<[feature: string, isSet: boolean]> = [\n ['prompt', (options.prompt?.trim().length ?? 0) > 0],\n [\n 'aspectRatio',\n options.aspectRatio != null || bflOptions.aspectRatio != null,\n ],\n ['resolution', options.resolution != null || bflOptions.resolution != null],\n ['duration', options.duration != null],\n ['fps', options.fps != null],\n ['seed', options.seed != null],\n ['generateAudio', options.generateAudio != null],\n ['image', options.image != null],\n ['frameImages', (options.frameImages?.length ?? 0) > 0],\n ['inputReferences', (options.inputReferences?.length ?? 0) > 0],\n ['keyframes', (bflOptions.keyframes?.length ?? 0) > 0],\n ['version', bflOptions.version != null],\n ];\n\n for (const [feature, isSet] of pinnedByBundle) {\n if (isSet) {\n warnings.push({\n type: 'unsupported',\n feature,\n details:\n `FLUX 3 draft enhance replays the draft bundle as it was generated, so \"${feature}\" ` +\n 'was ignored. Set it on the original draft request instead.',\n });\n }\n }\n\n if (bflOptions.draft != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'draft',\n details:\n 'FLUX 3 draft enhance always renders at full quality. The draft option was ignored.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'FLUX 3 video generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n return {\n body: {\n mode: 'draft_enhance',\n draft_cache: bflOptions.draftCache,\n safety_tolerance: bflOptions.safetyTolerance,\n } as Record<string, unknown>,\n warnings,\n };\n}\n\n/**\n * A failed poll carries a `details` payload that is a plain string for\n * moderation refusals and an object for everything else.\n */\nfunction describePollDetails(details: unknown): string | undefined {\n if (details == null) {\n return undefined;\n }\n\n if (typeof details === 'string') {\n return details;\n }\n\n try {\n return JSON.stringify(details);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The API takes conditioning media as an http(s) URL or a bare base64 string —\n * not a data URI.\n */\nfunction toBlackForestLabsFile(file: VideoModelV4File): string {\n if (file.type === 'url') {\n return file.url;\n }\n\n if (typeof file.data === 'string') {\n return file.data;\n }\n\n return Buffer.from(file.data).toString('base64');\n}\n\nexport class BlackForestLabsVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: BlackForestLabsVideoModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: BlackForestLabsVideoModelId;\n config: BlackForestLabsVideoModelConfig;\n }) {\n return new BlackForestLabsVideoModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: BlackForestLabsVideoModelId,\n private readonly config: BlackForestLabsVideoModelConfig,\n ) {}\n\n private async getArgs(options: BlackForestLabsVideoDoGenerateOptions) {\n const warnings: Array<SharedV4Warning> = [];\n\n const bflOptions = (await parseProviderOptions({\n provider: 'blackForestLabs',\n providerOptions: options.providerOptions,\n schema: blackForestLabsVideoModelOptionsSchema,\n })) as BlackForestLabsVideoModelOptions | undefined;\n\n if (bflOptions?.draftCache != null) {\n return getDraftEnhanceArgs(options, bflOptions);\n }\n\n if (options.fps != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'FLUX 3 video does not support a custom frame rate.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'FLUX 3 video does not accept a seed.',\n });\n }\n\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'FLUX 3 video generates a single video per call. Only 1 video will be generated.',\n });\n }\n\n // Resolution: an explicit provider option is already a tier, so it wins and\n // a top-level value only has to be resolved when it is the sole source.\n let resolution: string | undefined = bflOptions?.resolution;\n if (options.resolution != null) {\n const resolved = resolveTopLevelResolution(options.resolution);\n if (resolution != null) {\n if (resolved == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". FLUX 3 video supports \"hd\" and \"fhd\", ` +\n `so providerOptions.blackForestLabs.resolution (\"${resolution}\") was used instead.`,\n });\n }\n } else if (resolved == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `Unrecognized resolution \"${options.resolution}\". FLUX 3 video supports ` +\n '\"hd\" and \"fhd\", or a {width}x{height} value to map onto one.',\n });\n } else {\n resolution = resolved.tier;\n if (resolved.derived) {\n warnings.push({\n type: 'compatibility',\n feature: 'resolution',\n details:\n `FLUX 3 video renders at \"hd\" or \"fhd\"; the requested resolution ` +\n `\"${options.resolution}\" was mapped to \"${resolved.tier}\".`,\n });\n }\n }\n }\n\n // Aspect ratio: the provider option can also express `auto`, so it wins.\n let aspectRatio: string | undefined = bflOptions?.aspectRatio;\n if (aspectRatio == null && options.aspectRatio != null) {\n if (allowedAspectRatios.has(options.aspectRatio)) {\n aspectRatio = options.aspectRatio;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n `FLUX 3 video does not support the aspect ratio \"${options.aspectRatio}\". ` +\n 'Using the provider default (auto).',\n });\n }\n }\n\n // Resolve first/last frame inputs. A standalone `image` is treated as the\n // first frame (image-to-video). The core sets `image` to the `first_frame`\n // frame image when there is one, so the frame-image entry is tracked\n // separately to report which input a warning came from.\n const firstFrameImage = options.frameImages?.find(\n frame => frame.frameType === 'first_frame',\n )?.image;\n let firstFrame = firstFrameImage ?? options.image;\n let lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n const firstFrameMediaType =\n firstFrame != null ? nonImageFrameMediaType(firstFrame) : undefined;\n if (firstFrame != null && firstFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: firstFrameImage != null ? 'frameImages' : 'image',\n details:\n firstFrameMediaType === 'video'\n ? 'FLUX 3 video does not accept a video as a keyframe. Pass it as an inputReference to continue from it instead.'\n : `FLUX 3 video only accepts an image as a keyframe; the \"${firstFrame.mediaType}\" file was ignored.`,\n });\n firstFrame = undefined;\n }\n\n if (lastFrame != null) {\n if (firstFrame == null) {\n // Keyframes are positional: the first entry opens the clip, so there is\n // no way to send a closing frame on its own.\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'FLUX 3 video requires a first_frame when a last_frame is provided. The last_frame was ignored.',\n });\n lastFrame = undefined;\n } else {\n const lastFrameMediaType = nonImageFrameMediaType(lastFrame);\n if (lastFrameMediaType != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n lastFrameMediaType === 'video'\n ? 'FLUX 3 video does not accept a video as a keyframe. The last_frame video was ignored.'\n : `FLUX 3 video only accepts an image as a keyframe; the \"${lastFrame.mediaType}\" last_frame was ignored.`,\n });\n lastFrame = undefined;\n }\n }\n }\n\n // Keyframes: the provider option covers the shapes the top-level fields\n // cannot express (3+ images, images pinned to a second), so it wins.\n let keyframes: BlackForestLabsVideoKeyframe[] | undefined =\n bflOptions?.keyframes != null && bflOptions.keyframes.length > 0\n ? [...bflOptions.keyframes]\n : undefined;\n\n if (keyframes != null) {\n if (firstFrame != null || lastFrame != null) {\n warnings.push({\n type: 'unsupported',\n feature: options.frameImages != null ? 'frameImages' : 'image',\n details:\n 'FLUX 3 video takes a single keyframe list. providerOptions.blackForestLabs.keyframes ' +\n 'was used and the top-level frame images were ignored.',\n });\n }\n } else if (firstFrame != null) {\n keyframes = [toBlackForestLabsFile(firstFrame)];\n if (lastFrame != null) {\n keyframes.push(toBlackForestLabsFile(lastFrame));\n }\n }\n\n // Video continuation. FLUX 3 takes a single `start_video` and has no\n // reference-image concept, so image references cannot be honored.\n let startVideo: string | undefined;\n const referenceFiles = options.inputReferences ?? [];\n const referenceVideos: VideoModelV4File[] = [];\n\n for (const file of referenceFiles) {\n const topLevelMediaType =\n file.mediaType != null\n ? getTopLevelMediaType(file.mediaType)\n : undefined;\n\n if (topLevelMediaType === 'video') {\n referenceVideos.push(file);\n } else if (topLevelMediaType == null) {\n warnings.push({\n type: 'compatibility',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video only accepts a video reference, so the reference with no mediaType ' +\n 'was treated as the video to continue from. Pass { url, mediaType: \"video/mp4\" } to be explicit.',\n });\n referenceVideos.push(file);\n } else if (topLevelMediaType === 'image') {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video has no reference-image input. Pass images as `image`, `frameImages`, or ' +\n 'providerOptions.blackForestLabs.keyframes instead. The reference was ignored.',\n });\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details: `FLUX 3 video only accepts a video reference; the \"${file.mediaType}\" reference was ignored.`,\n });\n }\n }\n\n if (referenceVideos.length > 0) {\n if (keyframes != null) {\n // Continuation and keyframes are mutually exclusive modes.\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video cannot combine keyframes with a video to continue from. The video reference was ignored.',\n });\n } else {\n startVideo = toBlackForestLabsFile(referenceVideos[0]);\n if (referenceVideos.length > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'FLUX 3 video continues from a single video. Only the first video reference was used.',\n });\n }\n }\n }\n\n // Duration: whole seconds between 5 and 20, or omitted to let the API pick\n // one that matches the content.\n let duration = options.duration;\n if (duration != null) {\n if (!Number.isInteger(duration)) {\n const rounded = Math.round(duration);\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `FLUX 3 video requires a whole number of seconds. The requested duration of ${duration} was rounded to ${rounded}.`,\n });\n duration = rounded;\n }\n\n if (duration > MAX_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `FLUX 3 video supports at most ${MAX_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MAX_DURATION_SECONDS}.`,\n });\n duration = MAX_DURATION_SECONDS;\n } else if (duration < MIN_DURATION_SECONDS) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details: `FLUX 3 video requires at least ${MIN_DURATION_SECONDS} seconds. The requested duration of ${options.duration} was clamped to ${MIN_DURATION_SECONDS}.`,\n });\n duration = MIN_DURATION_SECONDS;\n }\n }\n\n const untimedKeyframeCount =\n keyframes?.filter(keyframe => typeof keyframe === 'string').length ?? 0;\n if (\n duration == null &&\n untimedKeyframeCount >= UNTIMED_KEYFRAMES_NEEDING_DURATION\n ) {\n throw new InvalidArgumentError({\n argument: 'duration',\n message:\n `FLUX 3 video requires an explicit duration when ${UNTIMED_KEYFRAMES_NEEDING_DURATION} or more ` +\n 'keyframes are sent without a timestamp.',\n });\n }\n\n const mode = keyframes != null ? 'i2v' : startVideo != null ? 'v2v' : 't2v';\n\n const body: Record<string, unknown> = {\n mode,\n prompt: options.prompt ?? '',\n aspect_ratio: aspectRatio,\n duration,\n resolution,\n version: bflOptions?.version,\n generate_audio: options.generateAudio,\n safety_tolerance: bflOptions?.safetyTolerance,\n draft: bflOptions?.draft,\n ...(mode === 'i2v' && { keyframes }),\n ...(mode === 'v2v' && { start_video: startVideo }),\n };\n\n return { body, warnings };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const { body, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n const { value: submit, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combinedHeaders,\n body,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler:\n createJsonResponseHandler(bflVideoSubmitSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n operation: {\n requestId: submit.id,\n pollingUrl: submit.polling_url,\n ...(submit.cost != null && { cost: submit.cost }),\n ...(submit.input_mp != null && {\n inputMegapixels: submit.input_mp,\n }),\n ...(submit.output_mp != null && {\n outputMegapixels: submit.output_mp,\n }),\n } satisfies BlackForestLabsVideoOperation,\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const operation = options.operation as BlackForestLabsVideoOperation;\n const url = new URL(operation.pollingUrl);\n if (!url.searchParams.has('id')) {\n url.searchParams.set('id', operation.requestId);\n }\n\n const combinedHeaders = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n const { value, responseHeaders } = await getFromApi({\n url: url.toString(),\n // The polling URL comes from the provider response; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n // Only send credentials when it stays on a trusted provider host.\n headers: isTrustedUrl(url.toString(), this.config.baseURL)\n ? combinedHeaders\n : undefined,\n failedResponseHandler: bflFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(bflVideoPollSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const response = {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n };\n const { status, result } = value;\n\n const cost = value.cost ?? operation.cost;\n\n if (status === 'Ready') {\n const parsed = bflVideoResultSchema.safeParse(result);\n if (!parsed.success) {\n throw new AISDKError({\n name: 'BLACK_FOREST_LABS_VIDEO_GENERATION_ERROR',\n message:\n 'Black Forest Labs reported the video as Ready but returned no result.sample URL. ' +\n `Request id: ${operation.requestId}`,\n });\n }\n\n return {\n status: 'completed',\n videos: [\n {\n type: 'url',\n url: parsed.data.sample,\n mediaType: 'video/mp4',\n },\n ],\n warnings: [],\n providerMetadata: {\n blackForestLabs: {\n videos: [\n {\n id: operation.requestId,\n videoUrl: parsed.data.sample,\n ...(parsed.data.seed != null && { seed: parsed.data.seed }),\n ...(parsed.data.start_time != null && {\n start_time: parsed.data.start_time,\n }),\n ...(parsed.data.end_time != null && {\n end_time: parsed.data.end_time,\n }),\n ...(parsed.data.duration != null && {\n duration: parsed.data.duration,\n }),\n ...(parsed.data.draft_cache != null && {\n draftCache: parsed.data.draft_cache,\n }),\n ...(cost != null && { cost }),\n ...(operation.inputMegapixels != null && {\n inputMegapixels: operation.inputMegapixels,\n }),\n ...(operation.outputMegapixels != null && {\n outputMegapixels: operation.outputMegapixels,\n }),\n },\n ],\n },\n },\n response,\n };\n }\n\n if (TERMINAL_FAILURE_STATUSES.has(status)) {\n const detail = describePollDetails(value.details);\n return {\n status: 'error',\n error:\n `Black Forest Labs video generation failed with status \"${status}\"` +\n `${detail != null ? `: ${detail}` : ''}. Request id: ${operation.requestId}`,\n response,\n };\n }\n\n return { status: 'pending', response };\n }\n\n async doGenerate(\n options: BlackForestLabsVideoDoGenerateOptions,\n ): Promise<VideoModelV4Result> {\n const startResult = await this.doStart(options);\n const operation = startResult.operation as BlackForestLabsVideoOperation;\n const pollIntervalMillis =\n this.config.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n this.config.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS;\n const startTime = Date.now();\n\n while (true) {\n await delay(pollIntervalMillis, { abortSignal: options.abortSignal });\n\n if (Date.now() - startTime > pollTimeoutMillis) {\n throw new AISDKError({\n name: 'BLACK_FOREST_LABS_VIDEO_GENERATION_TIMEOUT',\n message:\n `Black Forest Labs video generation timed out after ${pollTimeoutMillis}ms. ` +\n `Request id: ${operation.requestId}`,\n });\n }\n\n const statusResult = await this.doStatus({\n operation,\n headers: options.headers,\n abortSignal: options.abortSignal,\n });\n\n if (statusResult.status === 'pending') {\n continue;\n }\n\n if (statusResult.status === 'error') {\n throw new AISDKError({\n name: 'BLACK_FOREST_LABS_VIDEO_GENERATION_FAILED',\n message: statusResult.error,\n });\n }\n\n return {\n videos: statusResult.videos,\n warnings: [...startResult.warnings, ...statusResult.warnings],\n providerMetadata: statusResult.providerMetadata,\n response: statusResult.response,\n };\n }\n }\n}\n\nconst bflVideoSubmitSchema = z.object({\n id: z.string(),\n polling_url: z.url(),\n cost: z.number().nullish(),\n input_mp: z.number().nullish(),\n output_mp: z.number().nullish(),\n});\n\nconst bflVideoResultSchema = z.object({\n sample: z.url(),\n seed: z.number().nullish(),\n start_time: z.number().nullish(),\n end_time: z.number().nullish(),\n duration: z.number().nullish(),\n draft_cache: z.string().nullish(),\n});\n\nconst bflVideoPollSchema = z\n .object({\n status: z.string().optional(),\n state: z.string().optional(),\n details: z.unknown().optional(),\n result: z.unknown().optional(),\n // `SettledCostResultResponse.cost` — the price actually charged, which the\n // API can only know once generation finishes. Absent on the plain\n // `ResultResponse` variant.\n cost: z.number().nullish(),\n })\n .refine(v => v.status != null || v.state != null, {\n message: 'Missing status in Black Forest Labs poll response',\n })\n .transform(v => ({\n status: (v.status ?? v.state)!,\n details: v.details,\n result: v.result,\n cost: v.cost,\n }));\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n blackForestLabsVideoAspectRatios,\n blackForestLabsVideoResolutions,\n} from './black-forest-labs-video-settings';\n\nconst blackForestLabsTimedVideoKeyframeSchema = z.tuple([\n z.number().min(0).max(20),\n z.string(),\n]);\n\nexport const blackForestLabsVideoKeyframesSchema = z.union([\n z.array(z.string()).min(1).max(10),\n z\n .array(blackForestLabsTimedVideoKeyframeSchema)\n .min(1)\n .max(10)\n .refine(\n keyframes =>\n keyframes.every(\n (keyframe, index) =>\n index === 0 || keyframe[0] > keyframes[index - 1][0],\n ),\n { message: 'Timed keyframes must be in chronological order.' },\n ),\n]);\n\nexport const blackForestLabsVideoProviderOptions = z.object({\n /**\n * Output resolution tier. Takes precedence over the top-level `resolution`,\n * which is expressed as `{width}x{height}` and has to be mapped onto a tier.\n */\n resolution: z.enum(blackForestLabsVideoResolutions).optional(),\n\n /**\n * Aspect ratio of the generated video. Takes precedence over the top-level\n * `aspectRatio`, and unlike it can be set to `auto`.\n */\n aspectRatio: z.enum(blackForestLabsVideoAspectRatios).optional(),\n\n /**\n * Keyframes for image-to-video generation, for the shapes the top-level\n * `image` and `frameImages` options cannot express: more than two images, or\n * images pinned to a specific second. Takes precedence over both.\n *\n * One image opens the clip, two open and close it, and with more the extras\n * are spaced evenly in between. Three or more plain images require an\n * explicit `duration`.\n */\n keyframes: blackForestLabsVideoKeyframesSchema.optional(),\n\n /**\n * Moderation strictness from 0 (strictest) to 4. Defaults to 2. Sexual\n * content is capped at 3 and hate content at 2 regardless of the request,\n * and any request carrying conditioning media is capped at 2.\n */\n safetyTolerance: z.number().int().min(0).max(4).optional(),\n\n /**\n * Render a fast, lower-quality preview instead of the finished video.\n * Defaults to `false`.\n */\n draft: z.boolean().optional(),\n\n /**\n * Encrypted draft-cache bundle from a prior `draft` generation, which\n * switches the request to draft-enhance mode: the bundle is replayed at full\n * quality.\n *\n * Either the base64-encoded `.bin` downloaded from the draft's `draftCache`\n * URL, or that URL itself while it is still in its expiry window.\n */\n draftCache: z.string().optional(),\n\n /**\n * Model version to pin. Only `latest` is available today.\n */\n version: z.literal('latest').optional(),\n});\n\nexport const blackForestLabsVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(blackForestLabsVideoProviderOptions),\n);\n\nexport type BlackForestLabsVideoModelOptions = InferSchema<\n typeof blackForestLabsVideoModelOptionsSchema\n>;\n","// https://docs.bfl.ai/api-reference/utility/generate-a-video-with-flux-3\nexport type BlackForestLabsVideoModelId = 'flux-3-video' | (string & {});\n\n/**\n * Aspect ratios FLUX 3 video accepts. `auto` lets the model infer the ratio\n * from the prompt and any conditioning media, and is the API default.\n */\nexport const blackForestLabsVideoAspectRatios = [\n '21:9',\n '2:1',\n '16:9',\n '4:3',\n '1:1',\n '3:4',\n '9:16',\n 'auto',\n] as const;\n\n/**\n * Output resolution tiers FLUX 3 video accepts.\n */\nexport const blackForestLabsVideoResolutions = ['hd', 'fhd'] as const;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","z","combineHeaders","createJsonResponseHandler","delay","getFromApi","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_DESERIALIZE","WORKFLOW_SERIALIZE","z","lazySchema","zodSchema","z","z","lazySchema","zodSchema","DEFAULT_POLL_INTERVAL_MILLIS","DEFAULT_POLL_TIMEOUT_MILLIS","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","getFromApi","delay","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/black-forest-labs",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.51",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@ai-sdk/provider": "4.0.
|
|
32
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
31
|
+
"@ai-sdk/provider": "4.0.19",
|
|
32
|
+
"@ai-sdk/provider-utils": "5.0.50"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@ai-sdk/test-server": "2.0.
|
|
35
|
+
"@ai-sdk/test-server": "2.0.2",
|
|
36
36
|
"@types/node": "22.19.19",
|
|
37
37
|
"@vercel/ai-tsconfig": "0.0.0",
|
|
38
38
|
"tsup": "^8.5.1",
|
|
@@ -51,6 +51,30 @@ export class BlackForestLabsImageModel implements ImageModelV4 {
|
|
|
51
51
|
readonly specificationVersion = 'v4';
|
|
52
52
|
readonly maxImagesPerCall = 1;
|
|
53
53
|
|
|
54
|
+
get supportsFileInputs(): boolean | undefined {
|
|
55
|
+
if (
|
|
56
|
+
['flux-kontext-pro', 'flux-kontext-max', 'flux-pro-1.0-fill'].includes(
|
|
57
|
+
this.modelId,
|
|
58
|
+
)
|
|
59
|
+
) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (['flux-pro-1.1-ultra', 'flux-pro-1.1'].includes(this.modelId)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
get supportsMaskInputs(): boolean | undefined {
|
|
71
|
+
if (this.modelId === 'flux-pro-1.0-fill') {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return this.supportsFileInputs == null ? undefined : false;
|
|
76
|
+
}
|
|
77
|
+
|
|
54
78
|
get provider(): string {
|
|
55
79
|
return this.config.provider;
|
|
56
80
|
}
|