@ai-sdk/prodia 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 +38 -48
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/prodia-image-model.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# @ai-sdk/prodia
|
|
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
|
@@ -47,16 +47,15 @@ var prodiaJobResultSchema = z.object({
|
|
|
47
47
|
}).nullish()
|
|
48
48
|
});
|
|
49
49
|
function buildProdiaProviderMetadata(jobResult) {
|
|
50
|
-
var _a, _b, _c, _d;
|
|
51
50
|
return {
|
|
52
51
|
jobId: jobResult.id,
|
|
53
|
-
...
|
|
52
|
+
...jobResult.config?.seed != null && {
|
|
54
53
|
seed: jobResult.config.seed
|
|
55
54
|
},
|
|
56
|
-
...
|
|
55
|
+
...jobResult.metrics?.elapsed != null && {
|
|
57
56
|
elapsed: jobResult.metrics.elapsed
|
|
58
57
|
},
|
|
59
|
-
...
|
|
58
|
+
...jobResult.metrics?.ips != null && {
|
|
60
59
|
iterationsPerSecond: jobResult.metrics.ips
|
|
61
60
|
},
|
|
62
61
|
...jobResult.created_at != null && {
|
|
@@ -65,7 +64,7 @@ function buildProdiaProviderMetadata(jobResult) {
|
|
|
65
64
|
...jobResult.updated_at != null && {
|
|
66
65
|
updatedAt: jobResult.updated_at
|
|
67
66
|
},
|
|
68
|
-
...
|
|
67
|
+
...jobResult.price?.dollars != null && {
|
|
69
68
|
dollars: jobResult.price.dollars
|
|
70
69
|
}
|
|
71
70
|
};
|
|
@@ -154,7 +153,6 @@ var prodiaErrorSchema = z.object({
|
|
|
154
153
|
var prodiaFailedResponseHandler = createJsonErrorResponseHandler({
|
|
155
154
|
errorSchema: prodiaErrorSchema,
|
|
156
155
|
errorToMessage: (error) => {
|
|
157
|
-
var _a;
|
|
158
156
|
const parsed = prodiaErrorSchema.safeParse(error);
|
|
159
157
|
if (!parsed.success) return "Unknown Prodia error";
|
|
160
158
|
const { message, detail, error: errorField } = parsed.data;
|
|
@@ -162,10 +160,10 @@ var prodiaFailedResponseHandler = createJsonErrorResponseHandler({
|
|
|
162
160
|
if (detail != null) {
|
|
163
161
|
try {
|
|
164
162
|
return JSON.stringify(detail);
|
|
165
|
-
} catch
|
|
163
|
+
} catch {
|
|
166
164
|
}
|
|
167
165
|
}
|
|
168
|
-
return
|
|
166
|
+
return errorField ?? message ?? "Unknown Prodia error";
|
|
169
167
|
}
|
|
170
168
|
});
|
|
171
169
|
|
|
@@ -232,6 +230,8 @@ var ProdiaImageModel = class _ProdiaImageModel {
|
|
|
232
230
|
this.config = config;
|
|
233
231
|
this.specificationVersion = "v4";
|
|
234
232
|
this.maxImagesPerCall = 1;
|
|
233
|
+
this.supportsFileInputs = false;
|
|
234
|
+
this.supportsMaskInputs = false;
|
|
235
235
|
}
|
|
236
236
|
get provider() {
|
|
237
237
|
return this.config.provider;
|
|
@@ -276,12 +276,12 @@ var ProdiaImageModel = class _ProdiaImageModel {
|
|
|
276
276
|
const jobConfig = {
|
|
277
277
|
prompt
|
|
278
278
|
};
|
|
279
|
-
if (
|
|
279
|
+
if (prodiaOptions?.width !== void 0) {
|
|
280
280
|
jobConfig.width = prodiaOptions.width;
|
|
281
281
|
} else if (width !== void 0) {
|
|
282
282
|
jobConfig.width = width;
|
|
283
283
|
}
|
|
284
|
-
if (
|
|
284
|
+
if (prodiaOptions?.height !== void 0) {
|
|
285
285
|
jobConfig.height = prodiaOptions.height;
|
|
286
286
|
} else if (height !== void 0) {
|
|
287
287
|
jobConfig.height = height;
|
|
@@ -289,16 +289,16 @@ var ProdiaImageModel = class _ProdiaImageModel {
|
|
|
289
289
|
if (seed !== void 0) {
|
|
290
290
|
jobConfig.seed = seed;
|
|
291
291
|
}
|
|
292
|
-
if (
|
|
292
|
+
if (prodiaOptions?.steps !== void 0) {
|
|
293
293
|
jobConfig.steps = prodiaOptions.steps;
|
|
294
294
|
}
|
|
295
|
-
if (
|
|
295
|
+
if (prodiaOptions?.stylePreset !== void 0) {
|
|
296
296
|
jobConfig.style_preset = prodiaOptions.stylePreset;
|
|
297
297
|
}
|
|
298
|
-
if (
|
|
298
|
+
if (prodiaOptions?.loras !== void 0 && prodiaOptions.loras.length > 0) {
|
|
299
299
|
jobConfig.loras = prodiaOptions.loras;
|
|
300
300
|
}
|
|
301
|
-
if (
|
|
301
|
+
if (prodiaOptions?.progressive !== void 0) {
|
|
302
302
|
jobConfig.progressive = prodiaOptions.progressive;
|
|
303
303
|
}
|
|
304
304
|
const body = {
|
|
@@ -308,9 +308,8 @@ var ProdiaImageModel = class _ProdiaImageModel {
|
|
|
308
308
|
return { body, warnings };
|
|
309
309
|
}
|
|
310
310
|
async doGenerate(options) {
|
|
311
|
-
var _a, _b, _c;
|
|
312
311
|
const { body, warnings } = await this.getArgs(options);
|
|
313
|
-
const currentDate =
|
|
312
|
+
const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
|
|
314
313
|
const combinedHeaders = combineHeaders(
|
|
315
314
|
this.config.headers ? await resolve(this.config.headers) : void 0,
|
|
316
315
|
options.headers
|
|
@@ -352,8 +351,7 @@ function createMultipartResponseHandler() {
|
|
|
352
351
|
return async ({
|
|
353
352
|
response
|
|
354
353
|
}) => {
|
|
355
|
-
|
|
356
|
-
const contentType = (_a = response.headers.get("content-type")) != null ? _a : "";
|
|
354
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
357
355
|
const responseHeaders = {};
|
|
358
356
|
response.headers.forEach((value, key) => {
|
|
359
357
|
responseHeaders[key] = value;
|
|
@@ -371,8 +369,8 @@ function createMultipartResponseHandler() {
|
|
|
371
369
|
let jobResult;
|
|
372
370
|
let imageBytes;
|
|
373
371
|
for (const part of parts) {
|
|
374
|
-
const contentDisposition =
|
|
375
|
-
const partContentType =
|
|
372
|
+
const contentDisposition = part.headers["content-disposition"] ?? "";
|
|
373
|
+
const partContentType = part.headers["content-type"] ?? "";
|
|
376
374
|
if (contentDisposition.includes('name="job"')) {
|
|
377
375
|
const jsonStr = new TextDecoder().decode(part.body);
|
|
378
376
|
jobResult = await parseJSON({
|
|
@@ -470,7 +468,6 @@ var ProdiaLanguageModel = class _ProdiaLanguageModel {
|
|
|
470
468
|
return new _ProdiaLanguageModel(options.modelId, options.config);
|
|
471
469
|
}
|
|
472
470
|
async doGenerate(options) {
|
|
473
|
-
var _a, _b, _c, _d;
|
|
474
471
|
const warnings = [];
|
|
475
472
|
if (options.temperature !== void 0) {
|
|
476
473
|
warnings.push({ type: "unsupported", feature: "temperature" });
|
|
@@ -565,7 +562,7 @@ var ProdiaLanguageModel = class _ProdiaLanguageModel {
|
|
|
565
562
|
break;
|
|
566
563
|
}
|
|
567
564
|
case "url": {
|
|
568
|
-
const fetchFn =
|
|
565
|
+
const fetchFn = this.config.fetch ?? globalThis.fetch;
|
|
569
566
|
const response = await fetchFn(part.data.url.toString());
|
|
570
567
|
const arrayBuffer = await response.arrayBuffer();
|
|
571
568
|
imageBytes = new Uint8Array(arrayBuffer);
|
|
@@ -593,14 +590,14 @@ var ProdiaLanguageModel = class _ProdiaLanguageModel {
|
|
|
593
590
|
prompt,
|
|
594
591
|
include_messages: true
|
|
595
592
|
};
|
|
596
|
-
if (
|
|
593
|
+
if (prodiaOptions?.aspectRatio !== void 0) {
|
|
597
594
|
jobConfig.aspect_ratio = prodiaOptions.aspectRatio;
|
|
598
595
|
}
|
|
599
596
|
const body = {
|
|
600
597
|
type: this.modelId,
|
|
601
598
|
config: jobConfig
|
|
602
599
|
};
|
|
603
|
-
const currentDate =
|
|
600
|
+
const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
|
|
604
601
|
const combinedHeaders = combineHeaders2(
|
|
605
602
|
this.config.headers ? await resolve2(this.config.headers) : void 0,
|
|
606
603
|
options.headers
|
|
@@ -673,19 +670,17 @@ var ProdiaLanguageModel = class _ProdiaLanguageModel {
|
|
|
673
670
|
};
|
|
674
671
|
}
|
|
675
672
|
async doStream(options) {
|
|
676
|
-
var _a;
|
|
677
673
|
const result = await this.doGenerate(options);
|
|
678
674
|
const stream = new ReadableStream({
|
|
679
675
|
start(controller) {
|
|
680
|
-
var _a2, _b;
|
|
681
676
|
controller.enqueue({
|
|
682
677
|
type: "stream-start",
|
|
683
678
|
warnings: result.warnings
|
|
684
679
|
});
|
|
685
680
|
controller.enqueue({
|
|
686
681
|
type: "response-metadata",
|
|
687
|
-
modelId:
|
|
688
|
-
timestamp:
|
|
682
|
+
modelId: result.response?.modelId,
|
|
683
|
+
timestamp: result.response?.timestamp
|
|
689
684
|
});
|
|
690
685
|
for (const part of result.content) {
|
|
691
686
|
if (part.type === "text") {
|
|
@@ -717,7 +712,7 @@ var ProdiaLanguageModel = class _ProdiaLanguageModel {
|
|
|
717
712
|
return {
|
|
718
713
|
stream,
|
|
719
714
|
response: {
|
|
720
|
-
headers:
|
|
715
|
+
headers: result.response?.headers
|
|
721
716
|
}
|
|
722
717
|
};
|
|
723
718
|
}
|
|
@@ -726,8 +721,7 @@ function createLanguageMultipartResponseHandler() {
|
|
|
726
721
|
return async ({
|
|
727
722
|
response
|
|
728
723
|
}) => {
|
|
729
|
-
|
|
730
|
-
const contentType = (_a = response.headers.get("content-type")) != null ? _a : "";
|
|
724
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
731
725
|
const responseHeaders = {};
|
|
732
726
|
response.headers.forEach((value, key) => {
|
|
733
727
|
responseHeaders[key] = value;
|
|
@@ -746,8 +740,8 @@ function createLanguageMultipartResponseHandler() {
|
|
|
746
740
|
let textContent;
|
|
747
741
|
const fileContent = [];
|
|
748
742
|
for (const part of parts) {
|
|
749
|
-
const contentDisposition =
|
|
750
|
-
const partContentType =
|
|
743
|
+
const contentDisposition = part.headers["content-disposition"] ?? "";
|
|
744
|
+
const partContentType = part.headers["content-type"] ?? "";
|
|
751
745
|
if (contentDisposition.includes('name="job"')) {
|
|
752
746
|
const jsonStr = new TextDecoder().decode(part.body);
|
|
753
747
|
jobResult = await parseJSON2({
|
|
@@ -817,7 +811,6 @@ var ProdiaVideoModel = class {
|
|
|
817
811
|
return this.config.provider;
|
|
818
812
|
}
|
|
819
813
|
async doGenerate(options) {
|
|
820
|
-
var _a, _b, _c;
|
|
821
814
|
const warnings = [];
|
|
822
815
|
const prodiaOptions = await parseProviderOptions3({
|
|
823
816
|
provider: "prodia",
|
|
@@ -831,14 +824,14 @@ var ProdiaVideoModel = class {
|
|
|
831
824
|
if (options.seed !== void 0) {
|
|
832
825
|
jobConfig.seed = options.seed;
|
|
833
826
|
}
|
|
834
|
-
if (
|
|
827
|
+
if (prodiaOptions?.resolution !== void 0) {
|
|
835
828
|
jobConfig.resolution = prodiaOptions.resolution;
|
|
836
829
|
}
|
|
837
830
|
const body = {
|
|
838
831
|
type: this.modelId,
|
|
839
832
|
config: jobConfig
|
|
840
833
|
};
|
|
841
|
-
const currentDate =
|
|
834
|
+
const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
|
|
842
835
|
const combinedHeaders = combineHeaders3(
|
|
843
836
|
await resolve3(this.config.headers),
|
|
844
837
|
options.headers
|
|
@@ -922,8 +915,7 @@ function createVideoMultipartResponseHandler() {
|
|
|
922
915
|
return async ({
|
|
923
916
|
response
|
|
924
917
|
}) => {
|
|
925
|
-
|
|
926
|
-
const contentType = (_a = response.headers.get("content-type")) != null ? _a : "";
|
|
918
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
927
919
|
const responseHeaders = {};
|
|
928
920
|
response.headers.forEach((value, key) => {
|
|
929
921
|
responseHeaders[key] = value;
|
|
@@ -942,8 +934,8 @@ function createVideoMultipartResponseHandler() {
|
|
|
942
934
|
let videoBytes;
|
|
943
935
|
let videoMediaType = "video/mp4";
|
|
944
936
|
for (const part of parts) {
|
|
945
|
-
const contentDisposition =
|
|
946
|
-
const partContentType =
|
|
937
|
+
const contentDisposition = part.headers["content-disposition"] ?? "";
|
|
938
|
+
const partContentType = part.headers["content-type"] ?? "";
|
|
947
939
|
if (contentDisposition.includes('name="job"')) {
|
|
948
940
|
const jsonStr = new TextDecoder().decode(part.body);
|
|
949
941
|
jobResult = await parseJSON3({
|
|
@@ -983,7 +975,6 @@ async function resolveVideoFileData(file, abortSignal) {
|
|
|
983
975
|
return { bytes: new Uint8Array(arrayBuffer), mediaType };
|
|
984
976
|
}
|
|
985
977
|
function getExtension(mediaType) {
|
|
986
|
-
var _a;
|
|
987
978
|
const map = {
|
|
988
979
|
"image/png": ".png",
|
|
989
980
|
"image/jpeg": ".jpg",
|
|
@@ -991,17 +982,16 @@ function getExtension(mediaType) {
|
|
|
991
982
|
"video/mp4": ".mp4",
|
|
992
983
|
"video/webm": ".webm"
|
|
993
984
|
};
|
|
994
|
-
return
|
|
985
|
+
return map[mediaType] ?? "";
|
|
995
986
|
}
|
|
996
987
|
|
|
997
988
|
// src/version.ts
|
|
998
|
-
var VERSION = true ? "2.0.
|
|
989
|
+
var VERSION = true ? "2.0.51" : "0.0.0-test";
|
|
999
990
|
|
|
1000
991
|
// src/prodia-provider.ts
|
|
1001
992
|
var defaultBaseURL = "https://inference.prodia.com/v2";
|
|
1002
993
|
function createProdia(options = {}) {
|
|
1003
|
-
|
|
1004
|
-
const baseURL = withoutTrailingSlash((_a = options.baseURL) != null ? _a : defaultBaseURL);
|
|
994
|
+
const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);
|
|
1005
995
|
const getHeaders = () => withUserAgentSuffix(
|
|
1006
996
|
{
|
|
1007
997
|
Authorization: `Bearer ${loadApiKey({
|
|
@@ -1015,19 +1005,19 @@ function createProdia(options = {}) {
|
|
|
1015
1005
|
);
|
|
1016
1006
|
const createImageModel = (modelId) => new ProdiaImageModel(modelId, {
|
|
1017
1007
|
provider: "prodia.image",
|
|
1018
|
-
baseURL: baseURL
|
|
1008
|
+
baseURL: baseURL ?? defaultBaseURL,
|
|
1019
1009
|
headers: getHeaders,
|
|
1020
1010
|
fetch: options.fetch
|
|
1021
1011
|
});
|
|
1022
1012
|
const createLanguageModel = (modelId) => new ProdiaLanguageModel(modelId, {
|
|
1023
1013
|
provider: "prodia.language",
|
|
1024
|
-
baseURL: baseURL
|
|
1014
|
+
baseURL: baseURL ?? defaultBaseURL,
|
|
1025
1015
|
headers: getHeaders,
|
|
1026
1016
|
fetch: options.fetch
|
|
1027
1017
|
});
|
|
1028
1018
|
const createVideoModel = (modelId) => new ProdiaVideoModel(modelId, {
|
|
1029
1019
|
provider: "prodia.video",
|
|
1030
|
-
baseURL: baseURL
|
|
1020
|
+
baseURL: baseURL ?? defaultBaseURL,
|
|
1031
1021
|
headers: getHeaders,
|
|
1032
1022
|
fetch: options.fetch
|
|
1033
1023
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/prodia-provider.ts","../src/prodia-image-model.ts","../src/prodia-api.ts","../src/prodia-image-model-options.ts","../src/prodia-language-model.ts","../src/prodia-language-model-options.ts","../src/prodia-video-model.ts","../src/prodia-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4,\n type ImageModelV4,\n type LanguageModelV4,\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 { ProdiaImageModel } from './prodia-image-model';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\nimport { ProdiaLanguageModel } from './prodia-language-model';\nimport type { ProdiaLanguageModelId } from './prodia-language-model-settings';\nimport { ProdiaVideoModel } from './prodia-video-model';\nimport type { ProdiaVideoModelId } from './prodia-video-model-settings';\nimport { VERSION } from './version';\n\nexport interface ProdiaProviderSettings {\n /**\n * Prodia API key. Default value is taken from the `PRODIA_TOKEN` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls. Defaults to `https://inference.prodia.com/v2`.\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\nexport interface ProdiaProvider extends ProviderV4 {\n /**\n * Creates a language model for multimodal generation (img2img with text+image output).\n */\n languageModel(modelId: ProdiaLanguageModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: ProdiaImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: ProdiaImageModelId): ImageModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: ProdiaVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: ProdiaVideoModelId): Experimental_VideoModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://inference.prodia.com/v2';\n\nexport function createProdia(\n options: ProdiaProviderSettings = {},\n): ProdiaProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PRODIA_TOKEN',\n description: 'Prodia',\n })}`,\n ...options.headers,\n },\n `ai-sdk/prodia/${VERSION}`,\n );\n\n const createImageModel = (modelId: ProdiaImageModelId) =>\n new ProdiaImageModel(modelId, {\n provider: 'prodia.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createLanguageModel = (modelId: ProdiaLanguageModelId) =>\n new ProdiaLanguageModel(modelId, {\n provider: 'prodia.language',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: ProdiaVideoModelId) =>\n new ProdiaVideoModel(modelId, {\n provider: 'prodia.video',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\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 languageModel: createLanguageModel,\n imageModel: createImageModel,\n image: createImageModel,\n videoModel: createVideoModel,\n video: createVideoModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const prodia = createProdia();\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n parseJSON,\n parseProviderOptions,\n postToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport {\n buildProdiaProviderMetadata,\n parseMultipart,\n prodiaFailedResponseHandler,\n prodiaJobResultSchema,\n type ProdiaJobResult,\n type ProdiaModelConfig,\n} from './prodia-api';\nimport { prodiaImageModelOptionsSchema } from './prodia-image-model-options';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\n\nexport class ProdiaImageModel 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: ProdiaImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ProdiaImageModelId;\n config: ProdiaModelConfig;\n }) {\n return new ProdiaImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ProdiaImageModelId,\n private readonly config: ProdiaModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n size,\n seed,\n providerOptions,\n }: Parameters<ImageModelV4['doGenerate']>[0]) {\n const warnings: Array<SharedV4Warning> = [];\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions,\n schema: prodiaImageModelOptionsSchema,\n });\n\n let width: number | undefined;\n let height: number | undefined;\n if (size) {\n const [widthStr, heightStr] = size.split('x');\n width = Number(widthStr);\n height = Number(heightStr);\n if (\n !widthStr ||\n !heightStr ||\n !Number.isFinite(width) ||\n !Number.isFinite(height)\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details: `Invalid size format: ${size}. Expected format: WIDTHxHEIGHT (e.g., 1024x1024)`,\n });\n width = undefined;\n height = undefined;\n }\n }\n\n const jobConfig: Record<string, unknown> = {\n prompt,\n };\n\n if (prodiaOptions?.width !== undefined) {\n jobConfig.width = prodiaOptions.width;\n } else if (width !== undefined) {\n jobConfig.width = width;\n }\n\n if (prodiaOptions?.height !== undefined) {\n jobConfig.height = prodiaOptions.height;\n } else if (height !== undefined) {\n jobConfig.height = height;\n }\n\n if (seed !== undefined) {\n jobConfig.seed = seed;\n }\n if (prodiaOptions?.steps !== undefined) {\n jobConfig.steps = prodiaOptions.steps;\n }\n if (prodiaOptions?.stylePreset !== undefined) {\n jobConfig.style_preset = prodiaOptions.stylePreset;\n }\n if (prodiaOptions?.loras !== undefined && prodiaOptions.loras.length > 0) {\n jobConfig.loras = prodiaOptions.loras;\n }\n if (prodiaOptions?.progressive !== undefined) {\n jobConfig.progressive = prodiaOptions.progressive;\n }\n\n const body = {\n type: this.modelId,\n config: jobConfig,\n };\n\n return { body, warnings };\n }\n\n async doGenerate(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n const { body, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n const { value: multipartResult, responseHeaders } = await postToApi({\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data; image/png',\n 'Content-Type': 'application/json',\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { jobResult, imageBytes } = multipartResult;\n\n return {\n images: [imageBytes],\n warnings,\n providerMetadata: {\n prodia: {\n images: [buildProdiaProviderMetadata(jobResult)],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\n\ninterface MultipartResult {\n jobResult: ProdiaJobResult;\n imageBytes: Uint8Array;\n}\n\nfunction createMultipartResponseHandler() {\n return async ({\n response,\n }: {\n response: Response;\n }): Promise<{\n value: MultipartResult;\n responseHeaders: Record<string, string>;\n }> => {\n const contentType = response.headers.get('content-type') ?? '';\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\n if (!boundaryMatch) {\n throw new Error(\n `Prodia response missing multipart boundary in content-type: ${contentType}`,\n );\n }\n const boundary = boundaryMatch[1];\n\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n const parts = parseMultipart(bytes, boundary);\n\n let jobResult: ProdiaJobResult | undefined;\n let imageBytes: Uint8Array | undefined;\n\n for (const part of parts) {\n const contentDisposition = part.headers['content-disposition'] ?? '';\n const partContentType = part.headers['content-type'] ?? '';\n\n if (contentDisposition.includes('name=\"job\"')) {\n const jsonStr = new TextDecoder().decode(part.body);\n jobResult = await parseJSON({\n text: jsonStr,\n schema: zodSchema(prodiaJobResultSchema),\n });\n } else if (contentDisposition.includes('name=\"output\"')) {\n imageBytes = part.body;\n } else if (partContentType.startsWith('image/')) {\n imageBytes = part.body;\n }\n }\n\n if (!jobResult) {\n throw new Error('Prodia multipart response missing job part');\n }\n if (!imageBytes) {\n throw new Error('Prodia multipart response missing output image');\n }\n\n return {\n value: { jobResult, imageBytes },\n responseHeaders,\n };\n };\n}\n","import {\n createJsonErrorResponseHandler,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport interface ProdiaModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport const prodiaJobResultSchema = z.object({\n id: z.string(),\n created_at: z.string().optional(),\n updated_at: z.string().optional(),\n expires_at: z.string().optional(),\n state: z\n .object({\n current: z.string(),\n })\n .optional(),\n config: z\n .looseObject({\n seed: z.number().optional(),\n })\n .optional(),\n metrics: z\n .object({\n elapsed: z.number().optional(),\n ips: z.number().optional(),\n })\n .optional(),\n price: z\n .object({\n product: z.string(),\n dollars: z.number(),\n })\n .nullish(),\n});\n\nexport type ProdiaJobResult = z.infer<typeof prodiaJobResultSchema>;\n\nexport function buildProdiaProviderMetadata(jobResult: ProdiaJobResult) {\n return {\n jobId: jobResult.id,\n ...(jobResult.config?.seed != null && {\n seed: jobResult.config.seed,\n }),\n ...(jobResult.metrics?.elapsed != null && {\n elapsed: jobResult.metrics.elapsed,\n }),\n ...(jobResult.metrics?.ips != null && {\n iterationsPerSecond: jobResult.metrics.ips,\n }),\n ...(jobResult.created_at != null && {\n createdAt: jobResult.created_at,\n }),\n ...(jobResult.updated_at != null && {\n updatedAt: jobResult.updated_at,\n }),\n ...(jobResult.price?.dollars != null && {\n dollars: jobResult.price.dollars,\n }),\n };\n}\n\nexport interface MultipartPart {\n headers: Record<string, string>;\n body: Uint8Array;\n}\n\nexport function parseMultipart(\n data: Uint8Array,\n boundary: string,\n): MultipartPart[] {\n const parts: MultipartPart[] = [];\n const boundaryBytes = new TextEncoder().encode(`--${boundary}`);\n const endBoundaryBytes = new TextEncoder().encode(`--${boundary}--`);\n\n const positions: number[] = [];\n for (let i = 0; i <= data.length - boundaryBytes.length; i++) {\n let match = true;\n for (let j = 0; j < boundaryBytes.length; j++) {\n if (data[i + j] !== boundaryBytes[j]) {\n match = false;\n break;\n }\n }\n if (match) {\n positions.push(i);\n }\n }\n\n for (let i = 0; i < positions.length - 1; i++) {\n const start = positions[i] + boundaryBytes.length;\n const end = positions[i + 1];\n\n let isEndBoundary = true;\n for (let j = 0; j < endBoundaryBytes.length && isEndBoundary; j++) {\n if (data[positions[i] + j] !== endBoundaryBytes[j]) {\n isEndBoundary = false;\n }\n }\n if (\n isEndBoundary &&\n positions[i] + endBoundaryBytes.length <= data.length\n ) {\n continue;\n }\n\n let partStart = start;\n if (data[partStart] === 0x0d && data[partStart + 1] === 0x0a) {\n partStart += 2;\n } else if (data[partStart] === 0x0a) {\n partStart += 1;\n }\n\n let partEnd = end;\n if (data[partEnd - 2] === 0x0d && data[partEnd - 1] === 0x0a) {\n partEnd -= 2;\n } else if (data[partEnd - 1] === 0x0a) {\n partEnd -= 1;\n }\n\n const partData = data.slice(partStart, partEnd);\n\n let headerEnd = -1;\n for (let j = 0; j < partData.length - 3; j++) {\n if (\n partData[j] === 0x0d &&\n partData[j + 1] === 0x0a &&\n partData[j + 2] === 0x0d &&\n partData[j + 3] === 0x0a\n ) {\n headerEnd = j;\n break;\n }\n if (partData[j] === 0x0a && partData[j + 1] === 0x0a) {\n headerEnd = j;\n break;\n }\n }\n\n if (headerEnd === -1) {\n continue;\n }\n\n const headerBytes = partData.slice(0, headerEnd);\n const headerStr = new TextDecoder().decode(headerBytes);\n const headers: Record<string, string> = {};\n for (const line of headerStr.split(/\\r?\\n/)) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim().toLowerCase();\n const value = line.slice(colonIdx + 1).trim();\n headers[key] = value;\n }\n }\n\n let bodyStart = headerEnd + 2;\n if (partData[headerEnd] === 0x0d) {\n bodyStart = headerEnd + 4;\n }\n const body = partData.slice(bodyStart);\n\n parts.push({ headers, body });\n }\n\n return parts;\n}\n\nconst prodiaErrorSchema = z.object({\n message: z.string().optional(),\n detail: z.unknown().optional(),\n error: z.string().optional(),\n});\n\nexport const prodiaFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: prodiaErrorSchema,\n errorToMessage: error => {\n const parsed = prodiaErrorSchema.safeParse(error);\n if (!parsed.success) return 'Unknown Prodia error';\n const { message, detail, error: errorField } = 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 errorField ?? message ?? 'Unknown Prodia error';\n },\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst stylePresets = [\n '3d-model',\n 'analog-film',\n 'anime',\n 'cinematic',\n 'comic-book',\n 'digital-art',\n 'enhance',\n 'fantasy-art',\n 'isometric',\n 'line-art',\n 'low-poly',\n 'neon-punk',\n 'origami',\n 'photographic',\n 'pixel-art',\n 'texture',\n 'craft-clay',\n] as const;\n\nexport const prodiaImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Amount of computational iterations to run. More is typically higher quality.\n */\n steps: z.number().int().min(1).max(4).optional(),\n /**\n * Width of the output image in pixels.\n */\n width: z.number().int().min(256).max(1920).optional(),\n /**\n * Height of the output image in pixels.\n */\n height: z.number().int().min(256).max(1920).optional(),\n /**\n * Apply a visual theme to your output image.\n */\n stylePreset: z.enum(stylePresets).optional(),\n /**\n * Augment the output with a LoRa model.\n */\n loras: z.array(z.string()).max(3).optional(),\n /**\n * When using JPEG output, return a progressive JPEG.\n */\n progressive: z.boolean().optional(),\n }),\n ),\n);\n\nexport type ProdiaImageModelOptions = InferSchema<\n typeof prodiaImageModelOptionsSchema\n>;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Content,\n type LanguageModelV4StreamPart,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n isCustomReasoning,\n convertBase64ToUint8Array,\n detectMediaType,\n generateId,\n getTopLevelMediaType,\n isFullMediaType,\n parseJSON,\n parseProviderOptions,\n postFormDataToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport {\n buildProdiaProviderMetadata,\n parseMultipart,\n prodiaFailedResponseHandler,\n prodiaJobResultSchema,\n type ProdiaJobResult,\n type ProdiaModelConfig,\n} from './prodia-api';\nimport { prodiaLanguageModelOptionsSchema } from './prodia-language-model-options';\nimport type { ProdiaLanguageModelId } from './prodia-language-model-settings';\n\nexport class ProdiaLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n readonly supportedUrls = {};\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ProdiaLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ProdiaLanguageModelId;\n config: ProdiaModelConfig;\n }) {\n return new ProdiaLanguageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ProdiaLanguageModelId,\n private readonly config: ProdiaModelConfig,\n ) {}\n\n async doGenerate(options: LanguageModelV4CallOptions) {\n const warnings: Array<SharedV4Warning> = [];\n\n // Warn about unsupported LLM features\n if (options.temperature !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'temperature' });\n }\n if (options.topP !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'topP' });\n }\n if (options.topK !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n if (options.seed !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n if (options.maxOutputTokens !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'maxOutputTokens' });\n }\n if (options.stopSequences !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'stopSequences' });\n }\n if (options.presencePenalty !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'presencePenalty' });\n }\n if (options.frequencyPenalty !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'frequencyPenalty' });\n }\n if (options.tools !== undefined && options.tools.length > 0) {\n warnings.push({ type: 'unsupported', feature: 'tools' });\n }\n if (options.toolChoice !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'toolChoice' });\n }\n if (\n options.responseFormat !== undefined &&\n options.responseFormat.type !== 'text'\n ) {\n warnings.push({ type: 'unsupported', feature: 'responseFormat' });\n }\n\n if (isCustomReasoning(options.reasoning)) {\n warnings.push({\n type: 'unsupported',\n feature: 'reasoning',\n details: 'This provider does not support reasoning configuration.',\n });\n }\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions: options.providerOptions,\n schema: prodiaLanguageModelOptionsSchema,\n });\n\n // Extract text prompt from messages\n let prompt = '';\n let systemMessage = '';\n for (const message of options.prompt) {\n if (message.role === 'system') {\n systemMessage = message.content;\n }\n }\n // Get text from the last user message\n for (let i = options.prompt.length - 1; i >= 0; i--) {\n const message = options.prompt[i];\n if (message.role === 'user') {\n for (const part of message.content) {\n if (part.type === 'text') {\n prompt += (prompt ? '\\n' : '') + part.text;\n }\n }\n break;\n }\n }\n if (systemMessage) {\n prompt = systemMessage + '\\n' + prompt;\n }\n\n // Extract image from user messages\n let imageBytes: Uint8Array | undefined;\n let imageMediaType = 'image/png';\n for (let i = options.prompt.length - 1; i >= 0; i--) {\n const message = options.prompt[i];\n if (message.role === 'user') {\n for (const part of message.content) {\n if (\n part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'image'\n ) {\n switch (part.data.type) {\n case 'reference': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'data': {\n if (part.data.data instanceof Uint8Array) {\n imageBytes = part.data.data;\n } else {\n imageBytes = convertBase64ToUint8Array(part.data.data);\n }\n break;\n }\n case 'url': {\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n const response = await fetchFn(part.data.url.toString());\n const arrayBuffer = await response.arrayBuffer();\n imageBytes = new Uint8Array(arrayBuffer);\n break;\n }\n }\n if (isFullMediaType(part.mediaType)) {\n imageMediaType = part.mediaType;\n } else if (imageBytes !== undefined) {\n const detected = detectMediaType({\n data: imageBytes,\n topLevelType: getTopLevelMediaType(part.mediaType),\n });\n if (detected !== undefined) {\n imageMediaType = detected;\n }\n }\n break;\n }\n }\n break;\n }\n }\n\n const jobConfig: Record<string, unknown> = {\n prompt,\n include_messages: true,\n };\n\n if (prodiaOptions?.aspectRatio !== undefined) {\n jobConfig.aspect_ratio = prodiaOptions.aspectRatio;\n }\n\n const body = {\n type: this.modelId,\n config: jobConfig,\n };\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n // Always use multipart form-data since img2img requires image input\n const formData = new FormData();\n formData.append(\n 'job',\n new Blob([JSON.stringify(body)], { type: 'application/json' }),\n 'job.json',\n );\n if (imageBytes) {\n const fileExtension =\n imageMediaType === 'image/png'\n ? '.png'\n : imageMediaType === 'image/jpeg'\n ? '.jpg'\n : imageMediaType === 'image/webp'\n ? '.webp'\n : '';\n formData.append(\n 'input',\n new Blob([imageBytes], { type: imageMediaType }),\n 'input' + fileExtension,\n );\n }\n\n const { value: multipartResult, responseHeaders } = await postFormDataToApi(\n {\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data',\n },\n formData,\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createLanguageMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n },\n );\n\n const { jobResult, textContent, fileContent } = multipartResult;\n\n const content: Array<LanguageModelV4Content> = [];\n if (textContent !== undefined) {\n content.push({ type: 'text', text: textContent });\n }\n for (const file of fileContent) {\n content.push({\n type: 'file',\n mediaType: file.mediaType,\n data: { type: 'data', data: file.data },\n });\n }\n\n return {\n content,\n finishReason: { unified: 'stop' as const, raw: undefined },\n usage: {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n },\n warnings,\n providerMetadata: {\n prodia: buildProdiaProviderMetadata(jobResult),\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n async doStream(options: LanguageModelV4CallOptions) {\n const result = await this.doGenerate(options);\n\n const stream = new ReadableStream<LanguageModelV4StreamPart>({\n start(controller) {\n controller.enqueue({\n type: 'stream-start',\n warnings: result.warnings,\n });\n\n controller.enqueue({\n type: 'response-metadata',\n modelId: result.response?.modelId,\n timestamp: result.response?.timestamp,\n });\n\n for (const part of result.content) {\n if (part.type === 'text') {\n const id = generateId();\n controller.enqueue({ type: 'text-start', id });\n controller.enqueue({\n type: 'text-delta',\n id,\n delta: part.text,\n });\n controller.enqueue({ type: 'text-end', id });\n } else if (part.type === 'file') {\n controller.enqueue({\n type: 'file',\n mediaType: part.mediaType,\n data: part.data,\n });\n }\n }\n\n controller.enqueue({\n type: 'finish',\n usage: result.usage,\n finishReason: result.finishReason,\n providerMetadata: result.providerMetadata,\n });\n\n controller.close();\n },\n });\n\n return {\n stream,\n response: {\n headers: result.response?.headers,\n },\n };\n }\n}\n\ninterface LanguageMultipartResult {\n jobResult: ProdiaJobResult;\n textContent: string | undefined;\n fileContent: Array<{ mediaType: string; data: Uint8Array }>;\n}\n\nfunction createLanguageMultipartResponseHandler() {\n return async ({\n response,\n }: {\n response: Response;\n }): Promise<{\n value: LanguageMultipartResult;\n responseHeaders: Record<string, string>;\n }> => {\n const contentType = response.headers.get('content-type') ?? '';\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\n if (!boundaryMatch) {\n throw new Error(\n `Prodia response missing multipart boundary in content-type: ${contentType}`,\n );\n }\n const boundary = boundaryMatch[1];\n\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n const parts = parseMultipart(bytes, boundary);\n\n let jobResult: ProdiaJobResult | undefined;\n let textContent: string | undefined;\n const fileContent: Array<{ mediaType: string; data: Uint8Array }> = [];\n\n for (const part of parts) {\n const contentDisposition = part.headers['content-disposition'] ?? '';\n const partContentType = part.headers['content-type'] ?? '';\n\n if (contentDisposition.includes('name=\"job\"')) {\n const jsonStr = new TextDecoder().decode(part.body);\n jobResult = await parseJSON({\n text: jsonStr,\n schema: zodSchema(prodiaJobResultSchema),\n });\n } else if (contentDisposition.includes('name=\"output\"')) {\n if (\n partContentType.startsWith('text/') ||\n contentDisposition.includes('.txt')\n ) {\n textContent = new TextDecoder().decode(part.body);\n } else if (partContentType.startsWith('image/')) {\n fileContent.push({\n mediaType: partContentType,\n data: part.body,\n });\n }\n }\n }\n\n if (!jobResult) {\n throw new Error('Prodia multipart response missing job part');\n }\n\n return {\n value: { jobResult, textContent, fileContent },\n responseHeaders,\n };\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 prodiaLanguageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Aspect ratio for the output image.\n */\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '4:5',\n '5:4',\n '4:7',\n '7:4',\n '9:16',\n '16:9',\n '9:21',\n '21:9',\n ])\n .optional(),\n }),\n ),\n);\n\nexport type ProdiaLanguageModelOptions = InferSchema<\n typeof prodiaLanguageModelOptionsSchema\n>;\n","import type {\n Experimental_VideoModelV4 as VideoModelV4,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n downloadBlob,\n parseJSON,\n parseProviderOptions,\n postFormDataToApi,\n postToApi,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport {\n buildProdiaProviderMetadata,\n parseMultipart,\n prodiaFailedResponseHandler,\n prodiaJobResultSchema,\n type ProdiaJobResult,\n type ProdiaModelConfig,\n} from './prodia-api';\nimport { prodiaVideoModelOptionsSchema } from './prodia-video-model-options';\nimport type { ProdiaVideoModelId } from './prodia-video-model-settings';\n\nexport class ProdiaVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ProdiaVideoModelId,\n private readonly config: ProdiaModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<NonNullable<VideoModelV4['doGenerate']>>[0],\n ): Promise<Awaited<ReturnType<NonNullable<VideoModelV4['doGenerate']>>>> {\n const warnings: Array<SharedV4Warning> = [];\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions: options.providerOptions,\n schema: prodiaVideoModelOptionsSchema,\n });\n\n const jobConfig: Record<string, unknown> = {};\n\n if (options.prompt !== undefined) {\n jobConfig.prompt = options.prompt;\n }\n if (options.seed !== undefined) {\n jobConfig.seed = options.seed;\n }\n if (prodiaOptions?.resolution !== undefined) {\n jobConfig.resolution = prodiaOptions.resolution;\n }\n\n const body = {\n type: this.modelId,\n config: jobConfig,\n };\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 let multipartResult: {\n jobResult: ProdiaJobResult;\n videoBytes: Uint8Array;\n videoMediaType: string;\n };\n let responseHeaders: Record<string, string> | undefined;\n\n if (options.image) {\n // img2vid: multipart form-data request\n const imageData = await resolveVideoFileData(\n options.image,\n options.abortSignal,\n );\n const formData = new FormData();\n formData.append(\n 'job',\n new Blob([JSON.stringify(body)], { type: 'application/json' }),\n 'job.json',\n );\n formData.append(\n 'input',\n new Blob([imageData.bytes], { type: imageData.mediaType }),\n 'input' + getExtension(imageData.mediaType),\n );\n\n const result = await postFormDataToApi({\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data; video/mp4',\n },\n formData,\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createVideoMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n multipartResult = result.value;\n responseHeaders = result.responseHeaders;\n } else {\n // txt2vid: JSON request\n const result = await postToApi({\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data; video/mp4',\n 'Content-Type': 'application/json',\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createVideoMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n multipartResult = result.value;\n responseHeaders = result.responseHeaders;\n }\n\n const { jobResult, videoBytes, videoMediaType } = multipartResult;\n\n return {\n videos: [\n {\n type: 'binary',\n data: videoBytes,\n mediaType: videoMediaType,\n },\n ],\n warnings,\n providerMetadata: {\n prodia: {\n videos: [buildProdiaProviderMetadata(jobResult)],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\n\ninterface VideoMultipartResult {\n jobResult: ProdiaJobResult;\n videoBytes: Uint8Array;\n videoMediaType: string;\n}\n\nfunction createVideoMultipartResponseHandler() {\n return async ({\n response,\n }: {\n response: Response;\n }): Promise<{\n value: VideoMultipartResult;\n responseHeaders: Record<string, string>;\n }> => {\n const contentType = response.headers.get('content-type') ?? '';\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\n if (!boundaryMatch) {\n throw new Error(\n `Prodia response missing multipart boundary in content-type: ${contentType}`,\n );\n }\n const boundary = boundaryMatch[1];\n\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n const parts = parseMultipart(bytes, boundary);\n\n let jobResult: ProdiaJobResult | undefined;\n let videoBytes: Uint8Array | undefined;\n let videoMediaType = 'video/mp4';\n\n for (const part of parts) {\n const contentDisposition = part.headers['content-disposition'] ?? '';\n const partContentType = part.headers['content-type'] ?? '';\n\n if (contentDisposition.includes('name=\"job\"')) {\n const jsonStr = new TextDecoder().decode(part.body);\n jobResult = await parseJSON({\n text: jsonStr,\n schema: zodSchema(prodiaJobResultSchema),\n });\n } else if (contentDisposition.includes('name=\"output\"')) {\n videoBytes = part.body;\n if (partContentType.startsWith('video/')) {\n videoMediaType = partContentType;\n }\n } else if (partContentType.startsWith('video/')) {\n videoBytes = part.body;\n videoMediaType = partContentType;\n }\n }\n\n if (!jobResult) {\n throw new Error('Prodia multipart response missing job part');\n }\n if (!videoBytes) {\n throw new Error('Prodia multipart response missing output video');\n }\n\n return {\n value: { jobResult, videoBytes, videoMediaType },\n responseHeaders,\n };\n };\n}\n\nasync function resolveVideoFileData(\n file: NonNullable<\n Parameters<NonNullable<VideoModelV4['doGenerate']>>[0]['image']\n >,\n abortSignal?: AbortSignal,\n): Promise<{ bytes: Uint8Array; mediaType: string }> {\n if (file.type === 'file') {\n const data =\n typeof file.data === 'string'\n ? convertBase64ToUint8Array(file.data)\n : file.data;\n return { bytes: data, mediaType: file.mediaType };\n }\n // URL type - download via downloadBlob so the user-supplied URL is routed\n // through the SSRF guard (validateDownloadUrl) instead of being fetched\n // directly, preventing requests to private/internal addresses.\n const blob = await downloadBlob(file.url, { abortSignal });\n const arrayBuffer = await blob.arrayBuffer();\n const mediaType = blob.type || 'application/octet-stream';\n return { bytes: new Uint8Array(arrayBuffer), mediaType };\n}\n\nfunction getExtension(mediaType: string): string {\n const map: Record<string, string> = {\n 'image/png': '.png',\n 'image/jpeg': '.jpg',\n 'image/webp': '.webp',\n 'video/mp4': '.mp4',\n 'video/webm': '.webm',\n };\n return map[mediaType] ?? '';\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const prodiaVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Video resolution (e.g. \"480p\", \"720p\").\n */\n resolution: z.string().optional(),\n }),\n ),\n);\n\nexport type ProdiaVideoModelOptions = InferSchema<\n typeof prodiaVideoModelOptionsSchema\n>;\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":["zodSchema","z","zodSchema","combineHeaders","parseJSON","parseProviderOptions","resolve","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","zodSchema","lazySchema","zodSchema","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","resolve","_a","parseJSON","zodSchema","combineHeaders","convertBase64ToUint8Array","parseJSON","parseProviderOptions","postFormDataToApi","postToApi","resolve","zodSchema","lazySchema","zodSchema","z","parseProviderOptions","combineHeaders","resolve","postFormDataToApi","postToApi","parseJSON","zodSchema","convertBase64ToUint8Array"]}
|
|
1
|
+
{"version":3,"sources":["../src/prodia-provider.ts","../src/prodia-image-model.ts","../src/prodia-api.ts","../src/prodia-image-model-options.ts","../src/prodia-language-model.ts","../src/prodia-language-model-options.ts","../src/prodia-video-model.ts","../src/prodia-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4,\n type ImageModelV4,\n type LanguageModelV4,\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 { ProdiaImageModel } from './prodia-image-model';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\nimport { ProdiaLanguageModel } from './prodia-language-model';\nimport type { ProdiaLanguageModelId } from './prodia-language-model-settings';\nimport { ProdiaVideoModel } from './prodia-video-model';\nimport type { ProdiaVideoModelId } from './prodia-video-model-settings';\nimport { VERSION } from './version';\n\nexport interface ProdiaProviderSettings {\n /**\n * Prodia API key. Default value is taken from the `PRODIA_TOKEN` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls. Defaults to `https://inference.prodia.com/v2`.\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\nexport interface ProdiaProvider extends ProviderV4 {\n /**\n * Creates a language model for multimodal generation (img2img with text+image output).\n */\n languageModel(modelId: ProdiaLanguageModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: ProdiaImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: ProdiaImageModelId): ImageModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: ProdiaVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: ProdiaVideoModelId): Experimental_VideoModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://inference.prodia.com/v2';\n\nexport function createProdia(\n options: ProdiaProviderSettings = {},\n): ProdiaProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PRODIA_TOKEN',\n description: 'Prodia',\n })}`,\n ...options.headers,\n },\n `ai-sdk/prodia/${VERSION}`,\n );\n\n const createImageModel = (modelId: ProdiaImageModelId) =>\n new ProdiaImageModel(modelId, {\n provider: 'prodia.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createLanguageModel = (modelId: ProdiaLanguageModelId) =>\n new ProdiaLanguageModel(modelId, {\n provider: 'prodia.language',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: ProdiaVideoModelId) =>\n new ProdiaVideoModel(modelId, {\n provider: 'prodia.video',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\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 languageModel: createLanguageModel,\n imageModel: createImageModel,\n image: createImageModel,\n videoModel: createVideoModel,\n video: createVideoModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const prodia = createProdia();\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n parseJSON,\n parseProviderOptions,\n postToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport {\n buildProdiaProviderMetadata,\n parseMultipart,\n prodiaFailedResponseHandler,\n prodiaJobResultSchema,\n type ProdiaJobResult,\n type ProdiaModelConfig,\n} from './prodia-api';\nimport { prodiaImageModelOptionsSchema } from './prodia-image-model-options';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\n\nexport class ProdiaImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n readonly supportsFileInputs = false;\n readonly supportsMaskInputs = false;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ProdiaImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ProdiaImageModelId;\n config: ProdiaModelConfig;\n }) {\n return new ProdiaImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ProdiaImageModelId,\n private readonly config: ProdiaModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n size,\n seed,\n providerOptions,\n }: Parameters<ImageModelV4['doGenerate']>[0]) {\n const warnings: Array<SharedV4Warning> = [];\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions,\n schema: prodiaImageModelOptionsSchema,\n });\n\n let width: number | undefined;\n let height: number | undefined;\n if (size) {\n const [widthStr, heightStr] = size.split('x');\n width = Number(widthStr);\n height = Number(heightStr);\n if (\n !widthStr ||\n !heightStr ||\n !Number.isFinite(width) ||\n !Number.isFinite(height)\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details: `Invalid size format: ${size}. Expected format: WIDTHxHEIGHT (e.g., 1024x1024)`,\n });\n width = undefined;\n height = undefined;\n }\n }\n\n const jobConfig: Record<string, unknown> = {\n prompt,\n };\n\n if (prodiaOptions?.width !== undefined) {\n jobConfig.width = prodiaOptions.width;\n } else if (width !== undefined) {\n jobConfig.width = width;\n }\n\n if (prodiaOptions?.height !== undefined) {\n jobConfig.height = prodiaOptions.height;\n } else if (height !== undefined) {\n jobConfig.height = height;\n }\n\n if (seed !== undefined) {\n jobConfig.seed = seed;\n }\n if (prodiaOptions?.steps !== undefined) {\n jobConfig.steps = prodiaOptions.steps;\n }\n if (prodiaOptions?.stylePreset !== undefined) {\n jobConfig.style_preset = prodiaOptions.stylePreset;\n }\n if (prodiaOptions?.loras !== undefined && prodiaOptions.loras.length > 0) {\n jobConfig.loras = prodiaOptions.loras;\n }\n if (prodiaOptions?.progressive !== undefined) {\n jobConfig.progressive = prodiaOptions.progressive;\n }\n\n const body = {\n type: this.modelId,\n config: jobConfig,\n };\n\n return { body, warnings };\n }\n\n async doGenerate(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n const { body, warnings } = await this.getArgs(options);\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n const { value: multipartResult, responseHeaders } = await postToApi({\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data; image/png',\n 'Content-Type': 'application/json',\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { jobResult, imageBytes } = multipartResult;\n\n return {\n images: [imageBytes],\n warnings,\n providerMetadata: {\n prodia: {\n images: [buildProdiaProviderMetadata(jobResult)],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\n\ninterface MultipartResult {\n jobResult: ProdiaJobResult;\n imageBytes: Uint8Array;\n}\n\nfunction createMultipartResponseHandler() {\n return async ({\n response,\n }: {\n response: Response;\n }): Promise<{\n value: MultipartResult;\n responseHeaders: Record<string, string>;\n }> => {\n const contentType = response.headers.get('content-type') ?? '';\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\n if (!boundaryMatch) {\n throw new Error(\n `Prodia response missing multipart boundary in content-type: ${contentType}`,\n );\n }\n const boundary = boundaryMatch[1];\n\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n const parts = parseMultipart(bytes, boundary);\n\n let jobResult: ProdiaJobResult | undefined;\n let imageBytes: Uint8Array | undefined;\n\n for (const part of parts) {\n const contentDisposition = part.headers['content-disposition'] ?? '';\n const partContentType = part.headers['content-type'] ?? '';\n\n if (contentDisposition.includes('name=\"job\"')) {\n const jsonStr = new TextDecoder().decode(part.body);\n jobResult = await parseJSON({\n text: jsonStr,\n schema: zodSchema(prodiaJobResultSchema),\n });\n } else if (contentDisposition.includes('name=\"output\"')) {\n imageBytes = part.body;\n } else if (partContentType.startsWith('image/')) {\n imageBytes = part.body;\n }\n }\n\n if (!jobResult) {\n throw new Error('Prodia multipart response missing job part');\n }\n if (!imageBytes) {\n throw new Error('Prodia multipart response missing output image');\n }\n\n return {\n value: { jobResult, imageBytes },\n responseHeaders,\n };\n };\n}\n","import {\n createJsonErrorResponseHandler,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport interface ProdiaModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport const prodiaJobResultSchema = z.object({\n id: z.string(),\n created_at: z.string().optional(),\n updated_at: z.string().optional(),\n expires_at: z.string().optional(),\n state: z\n .object({\n current: z.string(),\n })\n .optional(),\n config: z\n .looseObject({\n seed: z.number().optional(),\n })\n .optional(),\n metrics: z\n .object({\n elapsed: z.number().optional(),\n ips: z.number().optional(),\n })\n .optional(),\n price: z\n .object({\n product: z.string(),\n dollars: z.number(),\n })\n .nullish(),\n});\n\nexport type ProdiaJobResult = z.infer<typeof prodiaJobResultSchema>;\n\nexport function buildProdiaProviderMetadata(jobResult: ProdiaJobResult) {\n return {\n jobId: jobResult.id,\n ...(jobResult.config?.seed != null && {\n seed: jobResult.config.seed,\n }),\n ...(jobResult.metrics?.elapsed != null && {\n elapsed: jobResult.metrics.elapsed,\n }),\n ...(jobResult.metrics?.ips != null && {\n iterationsPerSecond: jobResult.metrics.ips,\n }),\n ...(jobResult.created_at != null && {\n createdAt: jobResult.created_at,\n }),\n ...(jobResult.updated_at != null && {\n updatedAt: jobResult.updated_at,\n }),\n ...(jobResult.price?.dollars != null && {\n dollars: jobResult.price.dollars,\n }),\n };\n}\n\nexport interface MultipartPart {\n headers: Record<string, string>;\n body: Uint8Array;\n}\n\nexport function parseMultipart(\n data: Uint8Array,\n boundary: string,\n): MultipartPart[] {\n const parts: MultipartPart[] = [];\n const boundaryBytes = new TextEncoder().encode(`--${boundary}`);\n const endBoundaryBytes = new TextEncoder().encode(`--${boundary}--`);\n\n const positions: number[] = [];\n for (let i = 0; i <= data.length - boundaryBytes.length; i++) {\n let match = true;\n for (let j = 0; j < boundaryBytes.length; j++) {\n if (data[i + j] !== boundaryBytes[j]) {\n match = false;\n break;\n }\n }\n if (match) {\n positions.push(i);\n }\n }\n\n for (let i = 0; i < positions.length - 1; i++) {\n const start = positions[i] + boundaryBytes.length;\n const end = positions[i + 1];\n\n let isEndBoundary = true;\n for (let j = 0; j < endBoundaryBytes.length && isEndBoundary; j++) {\n if (data[positions[i] + j] !== endBoundaryBytes[j]) {\n isEndBoundary = false;\n }\n }\n if (\n isEndBoundary &&\n positions[i] + endBoundaryBytes.length <= data.length\n ) {\n continue;\n }\n\n let partStart = start;\n if (data[partStart] === 0x0d && data[partStart + 1] === 0x0a) {\n partStart += 2;\n } else if (data[partStart] === 0x0a) {\n partStart += 1;\n }\n\n let partEnd = end;\n if (data[partEnd - 2] === 0x0d && data[partEnd - 1] === 0x0a) {\n partEnd -= 2;\n } else if (data[partEnd - 1] === 0x0a) {\n partEnd -= 1;\n }\n\n const partData = data.slice(partStart, partEnd);\n\n let headerEnd = -1;\n for (let j = 0; j < partData.length - 3; j++) {\n if (\n partData[j] === 0x0d &&\n partData[j + 1] === 0x0a &&\n partData[j + 2] === 0x0d &&\n partData[j + 3] === 0x0a\n ) {\n headerEnd = j;\n break;\n }\n if (partData[j] === 0x0a && partData[j + 1] === 0x0a) {\n headerEnd = j;\n break;\n }\n }\n\n if (headerEnd === -1) {\n continue;\n }\n\n const headerBytes = partData.slice(0, headerEnd);\n const headerStr = new TextDecoder().decode(headerBytes);\n const headers: Record<string, string> = {};\n for (const line of headerStr.split(/\\r?\\n/)) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim().toLowerCase();\n const value = line.slice(colonIdx + 1).trim();\n headers[key] = value;\n }\n }\n\n let bodyStart = headerEnd + 2;\n if (partData[headerEnd] === 0x0d) {\n bodyStart = headerEnd + 4;\n }\n const body = partData.slice(bodyStart);\n\n parts.push({ headers, body });\n }\n\n return parts;\n}\n\nconst prodiaErrorSchema = z.object({\n message: z.string().optional(),\n detail: z.unknown().optional(),\n error: z.string().optional(),\n});\n\nexport const prodiaFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: prodiaErrorSchema,\n errorToMessage: error => {\n const parsed = prodiaErrorSchema.safeParse(error);\n if (!parsed.success) return 'Unknown Prodia error';\n const { message, detail, error: errorField } = 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 errorField ?? message ?? 'Unknown Prodia error';\n },\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst stylePresets = [\n '3d-model',\n 'analog-film',\n 'anime',\n 'cinematic',\n 'comic-book',\n 'digital-art',\n 'enhance',\n 'fantasy-art',\n 'isometric',\n 'line-art',\n 'low-poly',\n 'neon-punk',\n 'origami',\n 'photographic',\n 'pixel-art',\n 'texture',\n 'craft-clay',\n] as const;\n\nexport const prodiaImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Amount of computational iterations to run. More is typically higher quality.\n */\n steps: z.number().int().min(1).max(4).optional(),\n /**\n * Width of the output image in pixels.\n */\n width: z.number().int().min(256).max(1920).optional(),\n /**\n * Height of the output image in pixels.\n */\n height: z.number().int().min(256).max(1920).optional(),\n /**\n * Apply a visual theme to your output image.\n */\n stylePreset: z.enum(stylePresets).optional(),\n /**\n * Augment the output with a LoRa model.\n */\n loras: z.array(z.string()).max(3).optional(),\n /**\n * When using JPEG output, return a progressive JPEG.\n */\n progressive: z.boolean().optional(),\n }),\n ),\n);\n\nexport type ProdiaImageModelOptions = InferSchema<\n typeof prodiaImageModelOptionsSchema\n>;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Content,\n type LanguageModelV4StreamPart,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n isCustomReasoning,\n convertBase64ToUint8Array,\n detectMediaType,\n generateId,\n getTopLevelMediaType,\n isFullMediaType,\n parseJSON,\n parseProviderOptions,\n postFormDataToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport {\n buildProdiaProviderMetadata,\n parseMultipart,\n prodiaFailedResponseHandler,\n prodiaJobResultSchema,\n type ProdiaJobResult,\n type ProdiaModelConfig,\n} from './prodia-api';\nimport { prodiaLanguageModelOptionsSchema } from './prodia-language-model-options';\nimport type { ProdiaLanguageModelId } from './prodia-language-model-settings';\n\nexport class ProdiaLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n readonly supportedUrls = {};\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ProdiaLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ProdiaLanguageModelId;\n config: ProdiaModelConfig;\n }) {\n return new ProdiaLanguageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ProdiaLanguageModelId,\n private readonly config: ProdiaModelConfig,\n ) {}\n\n async doGenerate(options: LanguageModelV4CallOptions) {\n const warnings: Array<SharedV4Warning> = [];\n\n // Warn about unsupported LLM features\n if (options.temperature !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'temperature' });\n }\n if (options.topP !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'topP' });\n }\n if (options.topK !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n if (options.seed !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n if (options.maxOutputTokens !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'maxOutputTokens' });\n }\n if (options.stopSequences !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'stopSequences' });\n }\n if (options.presencePenalty !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'presencePenalty' });\n }\n if (options.frequencyPenalty !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'frequencyPenalty' });\n }\n if (options.tools !== undefined && options.tools.length > 0) {\n warnings.push({ type: 'unsupported', feature: 'tools' });\n }\n if (options.toolChoice !== undefined) {\n warnings.push({ type: 'unsupported', feature: 'toolChoice' });\n }\n if (\n options.responseFormat !== undefined &&\n options.responseFormat.type !== 'text'\n ) {\n warnings.push({ type: 'unsupported', feature: 'responseFormat' });\n }\n\n if (isCustomReasoning(options.reasoning)) {\n warnings.push({\n type: 'unsupported',\n feature: 'reasoning',\n details: 'This provider does not support reasoning configuration.',\n });\n }\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions: options.providerOptions,\n schema: prodiaLanguageModelOptionsSchema,\n });\n\n // Extract text prompt from messages\n let prompt = '';\n let systemMessage = '';\n for (const message of options.prompt) {\n if (message.role === 'system') {\n systemMessage = message.content;\n }\n }\n // Get text from the last user message\n for (let i = options.prompt.length - 1; i >= 0; i--) {\n const message = options.prompt[i];\n if (message.role === 'user') {\n for (const part of message.content) {\n if (part.type === 'text') {\n prompt += (prompt ? '\\n' : '') + part.text;\n }\n }\n break;\n }\n }\n if (systemMessage) {\n prompt = systemMessage + '\\n' + prompt;\n }\n\n // Extract image from user messages\n let imageBytes: Uint8Array | undefined;\n let imageMediaType = 'image/png';\n for (let i = options.prompt.length - 1; i >= 0; i--) {\n const message = options.prompt[i];\n if (message.role === 'user') {\n for (const part of message.content) {\n if (\n part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'image'\n ) {\n switch (part.data.type) {\n case 'reference': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'data': {\n if (part.data.data instanceof Uint8Array) {\n imageBytes = part.data.data;\n } else {\n imageBytes = convertBase64ToUint8Array(part.data.data);\n }\n break;\n }\n case 'url': {\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n const response = await fetchFn(part.data.url.toString());\n const arrayBuffer = await response.arrayBuffer();\n imageBytes = new Uint8Array(arrayBuffer);\n break;\n }\n }\n if (isFullMediaType(part.mediaType)) {\n imageMediaType = part.mediaType;\n } else if (imageBytes !== undefined) {\n const detected = detectMediaType({\n data: imageBytes,\n topLevelType: getTopLevelMediaType(part.mediaType),\n });\n if (detected !== undefined) {\n imageMediaType = detected;\n }\n }\n break;\n }\n }\n break;\n }\n }\n\n const jobConfig: Record<string, unknown> = {\n prompt,\n include_messages: true,\n };\n\n if (prodiaOptions?.aspectRatio !== undefined) {\n jobConfig.aspect_ratio = prodiaOptions.aspectRatio;\n }\n\n const body = {\n type: this.modelId,\n config: jobConfig,\n };\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n // Always use multipart form-data since img2img requires image input\n const formData = new FormData();\n formData.append(\n 'job',\n new Blob([JSON.stringify(body)], { type: 'application/json' }),\n 'job.json',\n );\n if (imageBytes) {\n const fileExtension =\n imageMediaType === 'image/png'\n ? '.png'\n : imageMediaType === 'image/jpeg'\n ? '.jpg'\n : imageMediaType === 'image/webp'\n ? '.webp'\n : '';\n formData.append(\n 'input',\n new Blob([imageBytes], { type: imageMediaType }),\n 'input' + fileExtension,\n );\n }\n\n const { value: multipartResult, responseHeaders } = await postFormDataToApi(\n {\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data',\n },\n formData,\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createLanguageMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n },\n );\n\n const { jobResult, textContent, fileContent } = multipartResult;\n\n const content: Array<LanguageModelV4Content> = [];\n if (textContent !== undefined) {\n content.push({ type: 'text', text: textContent });\n }\n for (const file of fileContent) {\n content.push({\n type: 'file',\n mediaType: file.mediaType,\n data: { type: 'data', data: file.data },\n });\n }\n\n return {\n content,\n finishReason: { unified: 'stop' as const, raw: undefined },\n usage: {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n },\n warnings,\n providerMetadata: {\n prodia: buildProdiaProviderMetadata(jobResult),\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n async doStream(options: LanguageModelV4CallOptions) {\n const result = await this.doGenerate(options);\n\n const stream = new ReadableStream<LanguageModelV4StreamPart>({\n start(controller) {\n controller.enqueue({\n type: 'stream-start',\n warnings: result.warnings,\n });\n\n controller.enqueue({\n type: 'response-metadata',\n modelId: result.response?.modelId,\n timestamp: result.response?.timestamp,\n });\n\n for (const part of result.content) {\n if (part.type === 'text') {\n const id = generateId();\n controller.enqueue({ type: 'text-start', id });\n controller.enqueue({\n type: 'text-delta',\n id,\n delta: part.text,\n });\n controller.enqueue({ type: 'text-end', id });\n } else if (part.type === 'file') {\n controller.enqueue({\n type: 'file',\n mediaType: part.mediaType,\n data: part.data,\n });\n }\n }\n\n controller.enqueue({\n type: 'finish',\n usage: result.usage,\n finishReason: result.finishReason,\n providerMetadata: result.providerMetadata,\n });\n\n controller.close();\n },\n });\n\n return {\n stream,\n response: {\n headers: result.response?.headers,\n },\n };\n }\n}\n\ninterface LanguageMultipartResult {\n jobResult: ProdiaJobResult;\n textContent: string | undefined;\n fileContent: Array<{ mediaType: string; data: Uint8Array }>;\n}\n\nfunction createLanguageMultipartResponseHandler() {\n return async ({\n response,\n }: {\n response: Response;\n }): Promise<{\n value: LanguageMultipartResult;\n responseHeaders: Record<string, string>;\n }> => {\n const contentType = response.headers.get('content-type') ?? '';\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\n if (!boundaryMatch) {\n throw new Error(\n `Prodia response missing multipart boundary in content-type: ${contentType}`,\n );\n }\n const boundary = boundaryMatch[1];\n\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n const parts = parseMultipart(bytes, boundary);\n\n let jobResult: ProdiaJobResult | undefined;\n let textContent: string | undefined;\n const fileContent: Array<{ mediaType: string; data: Uint8Array }> = [];\n\n for (const part of parts) {\n const contentDisposition = part.headers['content-disposition'] ?? '';\n const partContentType = part.headers['content-type'] ?? '';\n\n if (contentDisposition.includes('name=\"job\"')) {\n const jsonStr = new TextDecoder().decode(part.body);\n jobResult = await parseJSON({\n text: jsonStr,\n schema: zodSchema(prodiaJobResultSchema),\n });\n } else if (contentDisposition.includes('name=\"output\"')) {\n if (\n partContentType.startsWith('text/') ||\n contentDisposition.includes('.txt')\n ) {\n textContent = new TextDecoder().decode(part.body);\n } else if (partContentType.startsWith('image/')) {\n fileContent.push({\n mediaType: partContentType,\n data: part.body,\n });\n }\n }\n }\n\n if (!jobResult) {\n throw new Error('Prodia multipart response missing job part');\n }\n\n return {\n value: { jobResult, textContent, fileContent },\n responseHeaders,\n };\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 prodiaLanguageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Aspect ratio for the output image.\n */\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '4:5',\n '5:4',\n '4:7',\n '7:4',\n '9:16',\n '16:9',\n '9:21',\n '21:9',\n ])\n .optional(),\n }),\n ),\n);\n\nexport type ProdiaLanguageModelOptions = InferSchema<\n typeof prodiaLanguageModelOptionsSchema\n>;\n","import type {\n Experimental_VideoModelV4 as VideoModelV4,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n downloadBlob,\n parseJSON,\n parseProviderOptions,\n postFormDataToApi,\n postToApi,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport {\n buildProdiaProviderMetadata,\n parseMultipart,\n prodiaFailedResponseHandler,\n prodiaJobResultSchema,\n type ProdiaJobResult,\n type ProdiaModelConfig,\n} from './prodia-api';\nimport { prodiaVideoModelOptionsSchema } from './prodia-video-model-options';\nimport type { ProdiaVideoModelId } from './prodia-video-model-settings';\n\nexport class ProdiaVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ProdiaVideoModelId,\n private readonly config: ProdiaModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<NonNullable<VideoModelV4['doGenerate']>>[0],\n ): Promise<Awaited<ReturnType<NonNullable<VideoModelV4['doGenerate']>>>> {\n const warnings: Array<SharedV4Warning> = [];\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions: options.providerOptions,\n schema: prodiaVideoModelOptionsSchema,\n });\n\n const jobConfig: Record<string, unknown> = {};\n\n if (options.prompt !== undefined) {\n jobConfig.prompt = options.prompt;\n }\n if (options.seed !== undefined) {\n jobConfig.seed = options.seed;\n }\n if (prodiaOptions?.resolution !== undefined) {\n jobConfig.resolution = prodiaOptions.resolution;\n }\n\n const body = {\n type: this.modelId,\n config: jobConfig,\n };\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 let multipartResult: {\n jobResult: ProdiaJobResult;\n videoBytes: Uint8Array;\n videoMediaType: string;\n };\n let responseHeaders: Record<string, string> | undefined;\n\n if (options.image) {\n // img2vid: multipart form-data request\n const imageData = await resolveVideoFileData(\n options.image,\n options.abortSignal,\n );\n const formData = new FormData();\n formData.append(\n 'job',\n new Blob([JSON.stringify(body)], { type: 'application/json' }),\n 'job.json',\n );\n formData.append(\n 'input',\n new Blob([imageData.bytes], { type: imageData.mediaType }),\n 'input' + getExtension(imageData.mediaType),\n );\n\n const result = await postFormDataToApi({\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data; video/mp4',\n },\n formData,\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createVideoMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n multipartResult = result.value;\n responseHeaders = result.responseHeaders;\n } else {\n // txt2vid: JSON request\n const result = await postToApi({\n url: `${this.config.baseURL}/job?price=true`,\n headers: {\n ...combinedHeaders,\n Accept: 'multipart/form-data; video/mp4',\n 'Content-Type': 'application/json',\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler: prodiaFailedResponseHandler,\n successfulResponseHandler: createVideoMultipartResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n multipartResult = result.value;\n responseHeaders = result.responseHeaders;\n }\n\n const { jobResult, videoBytes, videoMediaType } = multipartResult;\n\n return {\n videos: [\n {\n type: 'binary',\n data: videoBytes,\n mediaType: videoMediaType,\n },\n ],\n warnings,\n providerMetadata: {\n prodia: {\n videos: [buildProdiaProviderMetadata(jobResult)],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\n\ninterface VideoMultipartResult {\n jobResult: ProdiaJobResult;\n videoBytes: Uint8Array;\n videoMediaType: string;\n}\n\nfunction createVideoMultipartResponseHandler() {\n return async ({\n response,\n }: {\n response: Response;\n }): Promise<{\n value: VideoMultipartResult;\n responseHeaders: Record<string, string>;\n }> => {\n const contentType = response.headers.get('content-type') ?? '';\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\n if (!boundaryMatch) {\n throw new Error(\n `Prodia response missing multipart boundary in content-type: ${contentType}`,\n );\n }\n const boundary = boundaryMatch[1];\n\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n const parts = parseMultipart(bytes, boundary);\n\n let jobResult: ProdiaJobResult | undefined;\n let videoBytes: Uint8Array | undefined;\n let videoMediaType = 'video/mp4';\n\n for (const part of parts) {\n const contentDisposition = part.headers['content-disposition'] ?? '';\n const partContentType = part.headers['content-type'] ?? '';\n\n if (contentDisposition.includes('name=\"job\"')) {\n const jsonStr = new TextDecoder().decode(part.body);\n jobResult = await parseJSON({\n text: jsonStr,\n schema: zodSchema(prodiaJobResultSchema),\n });\n } else if (contentDisposition.includes('name=\"output\"')) {\n videoBytes = part.body;\n if (partContentType.startsWith('video/')) {\n videoMediaType = partContentType;\n }\n } else if (partContentType.startsWith('video/')) {\n videoBytes = part.body;\n videoMediaType = partContentType;\n }\n }\n\n if (!jobResult) {\n throw new Error('Prodia multipart response missing job part');\n }\n if (!videoBytes) {\n throw new Error('Prodia multipart response missing output video');\n }\n\n return {\n value: { jobResult, videoBytes, videoMediaType },\n responseHeaders,\n };\n };\n}\n\nasync function resolveVideoFileData(\n file: NonNullable<\n Parameters<NonNullable<VideoModelV4['doGenerate']>>[0]['image']\n >,\n abortSignal?: AbortSignal,\n): Promise<{ bytes: Uint8Array; mediaType: string }> {\n if (file.type === 'file') {\n const data =\n typeof file.data === 'string'\n ? convertBase64ToUint8Array(file.data)\n : file.data;\n return { bytes: data, mediaType: file.mediaType };\n }\n // URL type - download via downloadBlob so the user-supplied URL is routed\n // through the SSRF guard (validateDownloadUrl) instead of being fetched\n // directly, preventing requests to private/internal addresses.\n const blob = await downloadBlob(file.url, { abortSignal });\n const arrayBuffer = await blob.arrayBuffer();\n const mediaType = blob.type || 'application/octet-stream';\n return { bytes: new Uint8Array(arrayBuffer), mediaType };\n}\n\nfunction getExtension(mediaType: string): string {\n const map: Record<string, string> = {\n 'image/png': '.png',\n 'image/jpeg': '.jpg',\n 'image/webp': '.webp',\n 'video/mp4': '.mp4',\n 'video/webm': '.webm',\n };\n return map[mediaType] ?? '';\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const prodiaVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Video resolution (e.g. \"480p\", \"720p\").\n */\n resolution: z.string().optional(),\n }),\n ),\n);\n\nexport type ProdiaVideoModelOptions = InferSchema<\n typeof prodiaVideoModelOptionsSchema\n>;\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":["zodSchema","z","zodSchema","combineHeaders","parseJSON","parseProviderOptions","resolve","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","zodSchema","lazySchema","zodSchema","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders","resolve","parseJSON","zodSchema","combineHeaders","convertBase64ToUint8Array","parseJSON","parseProviderOptions","postFormDataToApi","postToApi","resolve","zodSchema","lazySchema","zodSchema","z","parseProviderOptions","combineHeaders","resolve","postFormDataToApi","postToApi","parseJSON","zodSchema","convertBase64ToUint8Array"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/prodia",
|
|
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",
|
|
@@ -24,6 +24,8 @@ import type { ProdiaImageModelId } from './prodia-image-settings';
|
|
|
24
24
|
export class ProdiaImageModel implements ImageModelV4 {
|
|
25
25
|
readonly specificationVersion = 'v4';
|
|
26
26
|
readonly maxImagesPerCall = 1;
|
|
27
|
+
readonly supportsFileInputs = false;
|
|
28
|
+
readonly supportsMaskInputs = false;
|
|
27
29
|
|
|
28
30
|
get provider(): string {
|
|
29
31
|
return this.config.provider;
|