@ai-sdk/prodia 1.0.13 → 1.0.15
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 +14 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/docs/65-prodia.mdx +2 -2
- package/package.json +3 -3
- package/src/index.ts +5 -1
- package/src/prodia-image-model.ts +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @ai-sdk/prodia
|
|
2
2
|
|
|
3
|
+
## 1.0.15
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 99fbed8: feat: normalize provider specific model options type names and ensure they are exported
|
|
8
|
+
|
|
9
|
+
## 1.0.14
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [7168375]
|
|
14
|
+
- @ai-sdk/provider@3.0.8
|
|
15
|
+
- @ai-sdk/provider-utils@4.0.14
|
|
16
|
+
|
|
3
17
|
## 1.0.13
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -7,7 +7,7 @@ import { ProviderV3, ImageModelV3 } from '@ai-sdk/provider';
|
|
|
7
7
|
*/
|
|
8
8
|
type ProdiaImageModelId = 'inference.flux-fast.schnell.txt2img.v2' | 'inference.flux.schnell.txt2img.v2' | (string & {});
|
|
9
9
|
|
|
10
|
-
declare const
|
|
10
|
+
declare const prodiaImageModelOptionsSchema: _ai_sdk_provider_utils.LazySchema<{
|
|
11
11
|
steps?: number | undefined;
|
|
12
12
|
width?: number | undefined;
|
|
13
13
|
height?: number | undefined;
|
|
@@ -15,7 +15,7 @@ declare const prodiaImageProviderOptionsSchema: _ai_sdk_provider_utils.LazySchem
|
|
|
15
15
|
loras?: string[] | undefined;
|
|
16
16
|
progressive?: boolean | undefined;
|
|
17
17
|
}>;
|
|
18
|
-
type
|
|
18
|
+
type ProdiaImageModelOptions = InferSchema<typeof prodiaImageModelOptionsSchema>;
|
|
19
19
|
|
|
20
20
|
interface ProdiaProviderSettings {
|
|
21
21
|
/**
|
|
@@ -55,4 +55,4 @@ declare const prodia: ProdiaProvider;
|
|
|
55
55
|
|
|
56
56
|
declare const VERSION: string;
|
|
57
57
|
|
|
58
|
-
export { type ProdiaImageModelId, type ProdiaImageProviderOptions, type ProdiaProvider, type ProdiaProviderSettings, VERSION, createProdia, prodia };
|
|
58
|
+
export { type ProdiaImageModelId, type ProdiaImageModelOptions, type ProdiaImageModelOptions as ProdiaImageProviderOptions, type ProdiaProvider, type ProdiaProviderSettings, VERSION, createProdia, prodia };
|
package/dist/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { ProviderV3, ImageModelV3 } from '@ai-sdk/provider';
|
|
|
7
7
|
*/
|
|
8
8
|
type ProdiaImageModelId = 'inference.flux-fast.schnell.txt2img.v2' | 'inference.flux.schnell.txt2img.v2' | (string & {});
|
|
9
9
|
|
|
10
|
-
declare const
|
|
10
|
+
declare const prodiaImageModelOptionsSchema: _ai_sdk_provider_utils.LazySchema<{
|
|
11
11
|
steps?: number | undefined;
|
|
12
12
|
width?: number | undefined;
|
|
13
13
|
height?: number | undefined;
|
|
@@ -15,7 +15,7 @@ declare const prodiaImageProviderOptionsSchema: _ai_sdk_provider_utils.LazySchem
|
|
|
15
15
|
loras?: string[] | undefined;
|
|
16
16
|
progressive?: boolean | undefined;
|
|
17
17
|
}>;
|
|
18
|
-
type
|
|
18
|
+
type ProdiaImageModelOptions = InferSchema<typeof prodiaImageModelOptionsSchema>;
|
|
19
19
|
|
|
20
20
|
interface ProdiaProviderSettings {
|
|
21
21
|
/**
|
|
@@ -55,4 +55,4 @@ declare const prodia: ProdiaProvider;
|
|
|
55
55
|
|
|
56
56
|
declare const VERSION: string;
|
|
57
57
|
|
|
58
|
-
export { type ProdiaImageModelId, type ProdiaImageProviderOptions, type ProdiaProvider, type ProdiaProviderSettings, VERSION, createProdia, prodia };
|
|
58
|
+
export { type ProdiaImageModelId, type ProdiaImageModelOptions, type ProdiaImageModelOptions as ProdiaImageProviderOptions, type ProdiaProvider, type ProdiaProviderSettings, VERSION, createProdia, prodia };
|
package/dist/index.js
CHANGED
|
@@ -53,7 +53,7 @@ var ProdiaImageModel = class {
|
|
|
53
53
|
const prodiaOptions = await (0, import_provider_utils.parseProviderOptions)({
|
|
54
54
|
provider: "prodia",
|
|
55
55
|
providerOptions,
|
|
56
|
-
schema:
|
|
56
|
+
schema: prodiaImageModelOptionsSchema
|
|
57
57
|
});
|
|
58
58
|
let width;
|
|
59
59
|
let height;
|
|
@@ -184,7 +184,7 @@ var stylePresets = [
|
|
|
184
184
|
"texture",
|
|
185
185
|
"craft-clay"
|
|
186
186
|
];
|
|
187
|
-
var
|
|
187
|
+
var prodiaImageModelOptionsSchema = (0, import_provider_utils.lazySchema)(
|
|
188
188
|
() => (0, import_provider_utils.zodSchema)(
|
|
189
189
|
import_v4.z.object({
|
|
190
190
|
/**
|
|
@@ -376,7 +376,7 @@ var prodiaFailedResponseHandler = (0, import_provider_utils.createJsonErrorRespo
|
|
|
376
376
|
});
|
|
377
377
|
|
|
378
378
|
// src/version.ts
|
|
379
|
-
var VERSION = true ? "1.0.
|
|
379
|
+
var VERSION = true ? "1.0.15" : "0.0.0-test";
|
|
380
380
|
|
|
381
381
|
// src/prodia-provider.ts
|
|
382
382
|
var defaultBaseURL = "https://inference.prodia.com/v2";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/prodia-provider.ts","../src/prodia-image-model.ts","../src/version.ts"],"sourcesContent":["export type { ProdiaImageProviderOptions } from './prodia-image-model';\nexport type { ProdiaImageModelId } from './prodia-image-settings';\nexport type { ProdiaProvider, ProdiaProviderSettings } from './prodia-provider';\nexport { createProdia, prodia } from './prodia-provider';\nexport { VERSION } from './version';\n","import {\n type ImageModelV3,\n NoSuchModelError,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { ProdiaImageModel } from './prodia-image-model';\nimport type { ProdiaImageModelId } from './prodia-image-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 ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: ProdiaImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: ProdiaImageModelId): ImageModelV3;\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 embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n const languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n };\n\n return {\n specificationVersion: 'v3',\n imageModel: createImageModel,\n image: createImageModel,\n languageModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const prodia = createProdia();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport type { InferSchema, Resolvable } from '@ai-sdk/provider-utils';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n type FetchFunction,\n lazySchema,\n parseProviderOptions,\n postToApi,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\n\nexport class ProdiaImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ProdiaImageModelId,\n private readonly config: ProdiaImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n size,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<SharedV3Warning> = [];\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions,\n schema: prodiaImageProviderOptionsSchema,\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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\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: multipartResult, responseHeaders } = await postToApi({\n url: `${this.config.baseURL}/job`,\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: [\n {\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 },\n ],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\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 prodiaImageProviderOptionsSchema = 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 ProdiaImageProviderOptions = InferSchema<\n typeof prodiaImageProviderOptionsSchema\n>;\n\ninterface ProdiaImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst 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 .object({\n seed: z.number().optional(),\n })\n .passthrough()\n .optional(),\n metrics: z\n .object({\n elapsed: z.number().optional(),\n ips: z.number().optional(),\n })\n .optional(),\n});\n\ntype ProdiaJobResult = z.infer<typeof prodiaJobResultSchema>;\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 = prodiaJobResultSchema.parse(JSON.parse(jsonStr));\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\ninterface MultipartPart {\n headers: Record<string, string>;\n body: Uint8Array;\n}\n\nfunction parseMultipart(data: Uint8Array, boundary: string): 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\nconst 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","// 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":["import_provider_utils"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/prodia-provider.ts","../src/prodia-image-model.ts","../src/version.ts"],"sourcesContent":["export type {\n ProdiaImageModelOptions,\n /** @deprecated Use `ProdiaImageModelOptions` instead. */\n ProdiaImageModelOptions as ProdiaImageProviderOptions,\n} from './prodia-image-model';\nexport type { ProdiaImageModelId } from './prodia-image-settings';\nexport type { ProdiaProvider, ProdiaProviderSettings } from './prodia-provider';\nexport { createProdia, prodia } from './prodia-provider';\nexport { VERSION } from './version';\n","import {\n type ImageModelV3,\n NoSuchModelError,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { ProdiaImageModel } from './prodia-image-model';\nimport type { ProdiaImageModelId } from './prodia-image-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 ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: ProdiaImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: ProdiaImageModelId): ImageModelV3;\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 embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n const languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n };\n\n return {\n specificationVersion: 'v3',\n imageModel: createImageModel,\n image: createImageModel,\n languageModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const prodia = createProdia();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport type { InferSchema, Resolvable } from '@ai-sdk/provider-utils';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n type FetchFunction,\n lazySchema,\n parseProviderOptions,\n postToApi,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\n\nexport class ProdiaImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ProdiaImageModelId,\n private readonly config: ProdiaImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n size,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<SharedV3Warning> = [];\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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\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: multipartResult, responseHeaders } = await postToApi({\n url: `${this.config.baseURL}/job`,\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: [\n {\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 },\n ],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\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\ninterface ProdiaImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst 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 .object({\n seed: z.number().optional(),\n })\n .passthrough()\n .optional(),\n metrics: z\n .object({\n elapsed: z.number().optional(),\n ips: z.number().optional(),\n })\n .optional(),\n});\n\ntype ProdiaJobResult = z.infer<typeof prodiaJobResultSchema>;\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 = prodiaJobResultSchema.parse(JSON.parse(jsonStr));\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\ninterface MultipartPart {\n headers: Record<string, string>;\n body: Uint8Array;\n}\n\nfunction parseMultipart(data: Uint8Array, boundary: string): 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\nconst 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","// 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":["import_provider_utils"]}
|
package/dist/index.mjs
CHANGED
|
@@ -39,7 +39,7 @@ var ProdiaImageModel = class {
|
|
|
39
39
|
const prodiaOptions = await parseProviderOptions({
|
|
40
40
|
provider: "prodia",
|
|
41
41
|
providerOptions,
|
|
42
|
-
schema:
|
|
42
|
+
schema: prodiaImageModelOptionsSchema
|
|
43
43
|
});
|
|
44
44
|
let width;
|
|
45
45
|
let height;
|
|
@@ -170,7 +170,7 @@ var stylePresets = [
|
|
|
170
170
|
"texture",
|
|
171
171
|
"craft-clay"
|
|
172
172
|
];
|
|
173
|
-
var
|
|
173
|
+
var prodiaImageModelOptionsSchema = lazySchema(
|
|
174
174
|
() => zodSchema(
|
|
175
175
|
z.object({
|
|
176
176
|
/**
|
|
@@ -362,7 +362,7 @@ var prodiaFailedResponseHandler = createJsonErrorResponseHandler({
|
|
|
362
362
|
});
|
|
363
363
|
|
|
364
364
|
// src/version.ts
|
|
365
|
-
var VERSION = true ? "1.0.
|
|
365
|
+
var VERSION = true ? "1.0.15" : "0.0.0-test";
|
|
366
366
|
|
|
367
367
|
// src/prodia-provider.ts
|
|
368
368
|
var defaultBaseURL = "https://inference.prodia.com/v2";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/prodia-provider.ts","../src/prodia-image-model.ts","../src/version.ts"],"sourcesContent":["import {\n type ImageModelV3,\n NoSuchModelError,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { ProdiaImageModel } from './prodia-image-model';\nimport type { ProdiaImageModelId } from './prodia-image-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 ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: ProdiaImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: ProdiaImageModelId): ImageModelV3;\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 embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n const languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n };\n\n return {\n specificationVersion: 'v3',\n imageModel: createImageModel,\n image: createImageModel,\n languageModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const prodia = createProdia();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport type { InferSchema, Resolvable } from '@ai-sdk/provider-utils';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n type FetchFunction,\n lazySchema,\n parseProviderOptions,\n postToApi,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\n\nexport class ProdiaImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ProdiaImageModelId,\n private readonly config: ProdiaImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n size,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<SharedV3Warning> = [];\n\n const prodiaOptions = await parseProviderOptions({\n provider: 'prodia',\n providerOptions,\n schema: prodiaImageProviderOptionsSchema,\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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\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: multipartResult, responseHeaders } = await postToApi({\n url: `${this.config.baseURL}/job`,\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: [\n {\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 },\n ],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\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 prodiaImageProviderOptionsSchema = 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 ProdiaImageProviderOptions = InferSchema<\n typeof prodiaImageProviderOptionsSchema\n>;\n\ninterface ProdiaImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst 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 .object({\n seed: z.number().optional(),\n })\n .passthrough()\n .optional(),\n metrics: z\n .object({\n elapsed: z.number().optional(),\n ips: z.number().optional(),\n })\n .optional(),\n});\n\ntype ProdiaJobResult = z.infer<typeof prodiaJobResultSchema>;\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 = prodiaJobResultSchema.parse(JSON.parse(jsonStr));\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\ninterface MultipartPart {\n headers: Record<string, string>;\n body: Uint8Array;\n}\n\nfunction parseMultipart(data: Uint8Array, boundary: string): 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\nconst 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","// 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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/prodia-provider.ts","../src/prodia-image-model.ts","../src/version.ts"],"sourcesContent":["import {\n type ImageModelV3,\n NoSuchModelError,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { ProdiaImageModel } from './prodia-image-model';\nimport type { ProdiaImageModelId } from './prodia-image-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 ProviderV3 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: ProdiaImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: ProdiaImageModelId): ImageModelV3;\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 embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n const languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n };\n\n return {\n specificationVersion: 'v3',\n imageModel: createImageModel,\n image: createImageModel,\n languageModel,\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const prodia = createProdia();\n","import type { ImageModelV3, SharedV3Warning } from '@ai-sdk/provider';\nimport type { InferSchema, Resolvable } from '@ai-sdk/provider-utils';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n type FetchFunction,\n lazySchema,\n parseProviderOptions,\n postToApi,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ProdiaImageModelId } from './prodia-image-settings';\n\nexport class ProdiaImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ProdiaImageModelId,\n private readonly config: ProdiaImageModelConfig,\n ) {}\n\n private async getArgs({\n prompt,\n size,\n seed,\n providerOptions,\n }: Parameters<ImageModelV3['doGenerate']>[0]) {\n const warnings: Array<SharedV3Warning> = [];\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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\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: multipartResult, responseHeaders } = await postToApi({\n url: `${this.config.baseURL}/job`,\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: [\n {\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 },\n ],\n },\n },\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n}\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\ninterface ProdiaImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst 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 .object({\n seed: z.number().optional(),\n })\n .passthrough()\n .optional(),\n metrics: z\n .object({\n elapsed: z.number().optional(),\n ips: z.number().optional(),\n })\n .optional(),\n});\n\ntype ProdiaJobResult = z.infer<typeof prodiaJobResultSchema>;\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 = prodiaJobResultSchema.parse(JSON.parse(jsonStr));\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\ninterface MultipartPart {\n headers: Record<string, string>;\n body: Uint8Array;\n}\n\nfunction parseMultipart(data: Uint8Array, boundary: string): 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\nconst 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","// 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":";AAAA;AAAA,EAEE;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACRP;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAGX,IAAM,mBAAN,MAA+C;AAAA,EAQpD,YACW,SACQ,QACjB;AAFS;AACQ;AATnB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAAA,EASzB;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA8C;AAC5C,UAAM,WAAmC,CAAC;AAE1C,UAAM,gBAAgB,MAAM,qBAAqB;AAAA,MAC/C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,QAAI;AACJ,QAAI;AACJ,QAAI,MAAM;AACR,YAAM,CAAC,UAAU,SAAS,IAAI,KAAK,MAAM,GAAG;AAC5C,cAAQ,OAAO,QAAQ;AACvB,eAAS,OAAO,SAAS;AACzB,UACE,CAAC,YACD,CAAC,aACD,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,MAAM,GACvB;AACA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,wBAAwB,IAAI;AAAA,QACvC,CAAC;AACD,gBAAQ;AACR,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,YAAqC;AAAA,MACzC;AAAA,IACF;AAEA,SAAI,+CAAe,WAAU,QAAW;AACtC,gBAAU,QAAQ,cAAc;AAAA,IAClC,WAAW,UAAU,QAAW;AAC9B,gBAAU,QAAQ;AAAA,IACpB;AAEA,SAAI,+CAAe,YAAW,QAAW;AACvC,gBAAU,SAAS,cAAc;AAAA,IACnC,WAAW,WAAW,QAAW;AAC/B,gBAAU,SAAS;AAAA,IACrB;AAEA,QAAI,SAAS,QAAW;AACtB,gBAAU,OAAO;AAAA,IACnB;AACA,SAAI,+CAAe,WAAU,QAAW;AACtC,gBAAU,QAAQ,cAAc;AAAA,IAClC;AACA,SAAI,+CAAe,iBAAgB,QAAW;AAC5C,gBAAU,eAAe,cAAc;AAAA,IACzC;AACA,SAAI,+CAAe,WAAU,UAAa,cAAc,MAAM,SAAS,GAAG;AACxE,gBAAU,QAAQ,cAAc;AAAA,IAClC;AACA,SAAI,+CAAe,iBAAgB,QAAW;AAC5C,gBAAU,cAAc,cAAc;AAAA,IACxC;AAEA,UAAM,OAAO;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,IACV;AAEA,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAAA,EAEA,MAAM,WACJ,SAC0D;AA1G9D;AA2GI,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErD,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,kBAAkB;AAAA,MACtB,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,MACjC,QAAQ;AAAA,IACV;AAEA,UAAM,EAAE,OAAO,iBAAiB,gBAAgB,IAAI,MAAM,UAAU;AAAA,MAClE,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS;AAAA,QACP,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,QACJ,SAAS,KAAK,UAAU,IAAI;AAAA,QAC5B,QAAQ;AAAA,MACV;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B,+BAA+B;AAAA,MAC1D,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,EAAE,WAAW,WAAW,IAAI;AAElC,WAAO;AAAA,MACL,QAAQ,CAAC,UAAU;AAAA,MACnB;AAAA,MACA,kBAAkB;AAAA,QAChB,QAAQ;AAAA,UACN,QAAQ;AAAA,YACN;AAAA,cACE,OAAO,UAAU;AAAA,cACjB,KAAI,eAAU,WAAV,mBAAkB,SAAQ,QAAQ;AAAA,gBACpC,MAAM,UAAU,OAAO;AAAA,cACzB;AAAA,cACA,KAAI,eAAU,YAAV,mBAAmB,YAAW,QAAQ;AAAA,gBACxC,SAAS,UAAU,QAAQ;AAAA,cAC7B;AAAA,cACA,KAAI,eAAU,YAAV,mBAAmB,QAAO,QAAQ;AAAA,gBACpC,qBAAqB,UAAU,QAAQ;AAAA,cACzC;AAAA,cACA,GAAI,UAAU,cAAc,QAAQ;AAAA,gBAClC,WAAW,UAAU;AAAA,cACvB;AAAA,cACA,GAAI,UAAU,cAAc,QAAQ;AAAA,gBAClC,WAAW,UAAU;AAAA,cACvB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,SAAS,KAAK;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,gCAAgC;AAAA,EAAW,MACtD;AAAA,IACE,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,MAIP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAI/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAIpD,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAIrD,aAAa,EAAE,KAAK,YAAY,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAI3C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAI3C,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,IACpC,CAAC;AAAA,EACH;AACF;AAgBA,IAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,IAAI,EAAE,OAAO;AAAA,EACb,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,OAAO,EACJ,OAAO;AAAA,IACN,SAAS,EAAE,OAAO;AAAA,EACpB,CAAC,EACA,SAAS;AAAA,EACZ,QAAQ,EACL,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EACA,YAAY,EACZ,SAAS;AAAA,EACZ,SAAS,EACN,OAAO;AAAA,IACN,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,CAAC,EACA,SAAS;AACd,CAAC;AASD,SAAS,iCAAiC;AACxC,SAAO,OAAO;AAAA,IACZ;AAAA,EACF,MAKM;AAlRR;AAmRI,UAAM,eAAc,cAAS,QAAQ,IAAI,cAAc,MAAnC,YAAwC;AAC5D,UAAM,kBAA0C,CAAC;AACjD,aAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,sBAAgB,GAAG,IAAI;AAAA,IACzB,CAAC;AAED,UAAM,gBAAgB,YAAY,MAAM,oBAAoB;AAC5D,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR,+DAA+D,WAAW;AAAA,MAC5E;AAAA,IACF;AACA,UAAM,WAAW,cAAc,CAAC;AAEhC,UAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,UAAM,QAAQ,IAAI,WAAW,WAAW;AAExC,UAAM,QAAQ,eAAe,OAAO,QAAQ;AAE5C,QAAI;AACJ,QAAI;AAEJ,eAAW,QAAQ,OAAO;AACxB,YAAM,sBAAqB,UAAK,QAAQ,qBAAqB,MAAlC,YAAuC;AAClE,YAAM,mBAAkB,UAAK,QAAQ,cAAc,MAA3B,YAAgC;AAExD,UAAI,mBAAmB,SAAS,YAAY,GAAG;AAC7C,cAAM,UAAU,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;AAClD,oBAAY,sBAAsB,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,MAC7D,WAAW,mBAAmB,SAAS,eAAe,GAAG;AACvD,qBAAa,KAAK;AAAA,MACpB,WAAW,gBAAgB,WAAW,QAAQ,GAAG;AAC/C,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,WAAO;AAAA,MACL,OAAO,EAAE,WAAW,WAAW;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAOA,SAAS,eAAe,MAAkB,UAAmC;AAC3E,QAAM,QAAyB,CAAC;AAChC,QAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,KAAK,QAAQ,EAAE;AAC9D,QAAM,mBAAmB,IAAI,YAAY,EAAE,OAAO,KAAK,QAAQ,IAAI;AAEnE,QAAM,YAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,KAAK,KAAK,SAAS,cAAc,QAAQ,KAAK;AAC5D,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAI,KAAK,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG;AACpC,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO;AACT,gBAAU,KAAK,CAAC;AAAA,IAClB;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,UAAU,SAAS,GAAG,KAAK;AAC7C,UAAM,QAAQ,UAAU,CAAC,IAAI,cAAc;AAC3C,UAAM,MAAM,UAAU,IAAI,CAAC;AAE3B,QAAI,gBAAgB;AACpB,aAAS,IAAI,GAAG,IAAI,iBAAiB,UAAU,eAAe,KAAK;AACjE,UAAI,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,GAAG;AAClD,wBAAgB;AAAA,MAClB;AAAA,IACF;AACA,QACE,iBACA,UAAU,CAAC,IAAI,iBAAiB,UAAU,KAAK,QAC/C;AACA;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,QAAI,KAAK,SAAS,MAAM,MAAQ,KAAK,YAAY,CAAC,MAAM,IAAM;AAC5D,mBAAa;AAAA,IACf,WAAW,KAAK,SAAS,MAAM,IAAM;AACnC,mBAAa;AAAA,IACf;AAEA,QAAI,UAAU;AACd,QAAI,KAAK,UAAU,CAAC,MAAM,MAAQ,KAAK,UAAU,CAAC,MAAM,IAAM;AAC5D,iBAAW;AAAA,IACb,WAAW,KAAK,UAAU,CAAC,MAAM,IAAM;AACrC,iBAAW;AAAA,IACb;AAEA,UAAM,WAAW,KAAK,MAAM,WAAW,OAAO;AAE9C,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UACE,SAAS,CAAC,MAAM,MAChB,SAAS,IAAI,CAAC,MAAM,MACpB,SAAS,IAAI,CAAC,MAAM,MACpB,SAAS,IAAI,CAAC,MAAM,IACpB;AACA,oBAAY;AACZ;AAAA,MACF;AACA,UAAI,SAAS,CAAC,MAAM,MAAQ,SAAS,IAAI,CAAC,MAAM,IAAM;AACpD,oBAAY;AACZ;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,IAAI;AACpB;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,MAAM,GAAG,SAAS;AAC/C,UAAM,YAAY,IAAI,YAAY,EAAE,OAAO,WAAW;AACtD,UAAM,UAAkC,CAAC;AACzC,eAAW,QAAQ,UAAU,MAAM,OAAO,GAAG;AAC3C,YAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,UAAI,WAAW,GAAG;AAChB,cAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,EAAE,YAAY;AACvD,cAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,YAAY,YAAY;AAC5B,QAAI,SAAS,SAAS,MAAM,IAAM;AAChC,kBAAY,YAAY;AAAA,IAC1B;AACA,UAAM,OAAO,SAAS,MAAM,SAAS;AAErC,UAAM,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EAC9B;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAM,8BAA8B,+BAA+B;AAAA,EACjE,aAAa;AAAA,EACb,gBAAgB,WAAS;AAnb3B;AAobI,UAAM,SAAS,kBAAkB,UAAU,KAAK;AAChD,QAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,UAAM,EAAE,SAAS,QAAQ,OAAO,WAAW,IAAI,OAAO;AACtD,QAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAI,UAAU,MAAM;AAClB,UAAI;AACF,eAAO,KAAK,UAAU,MAAM;AAAA,MAC9B,SAAQ;AAAA,MAER;AAAA,IACF;AACA,YAAO,uCAAc,YAAd,YAAyB;AAAA,EAClC;AACF,CAAC;;;AC/bM,IAAM,UACX,OACI,WACA;;;AFkDN,IAAM,iBAAiB;AAEhB,SAAS,aACd,UAAkC,CAAC,GACnB;AA3DlB;AA4DE,QAAM,UAAU,sBAAqB,aAAQ,YAAR,YAAmB,cAAc;AACtE,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,iBAAiB,OAAO;AAAA,EAC1B;AAEF,QAAM,mBAAmB,CAAC,YACxB,IAAI,iBAAiB,SAAS;AAAA,IAC5B,UAAU;AAAA,IACV,SAAS,4BAAW;AAAA,IACpB,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,iBAAiB,CAAC,YAAoB;AAC1C,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,sBAAsB;AAAA,IACtB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,EACtB;AACF;AAEO,IAAM,SAAS,aAAa;","names":[]}
|
package/docs/65-prodia.mdx
CHANGED
|
@@ -128,7 +128,7 @@ const { image } = await generateImage({
|
|
|
128
128
|
Prodia image models support additional options through the `providerOptions.prodia` object:
|
|
129
129
|
|
|
130
130
|
```ts
|
|
131
|
-
import { prodia, type
|
|
131
|
+
import { prodia, type ProdiaImageModelOptions } from '@ai-sdk/prodia';
|
|
132
132
|
import { generateImage } from 'ai';
|
|
133
133
|
|
|
134
134
|
const { image } = await generateImage({
|
|
@@ -140,7 +140,7 @@ const { image } = await generateImage({
|
|
|
140
140
|
height: 768,
|
|
141
141
|
steps: 4,
|
|
142
142
|
stylePreset: 'cinematic',
|
|
143
|
-
} satisfies
|
|
143
|
+
} satisfies ProdiaImageModelOptions,
|
|
144
144
|
},
|
|
145
145
|
});
|
|
146
146
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/prodia",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.15",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@ai-sdk/provider": "3.0.
|
|
32
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
31
|
+
"@ai-sdk/provider": "3.0.8",
|
|
32
|
+
"@ai-sdk/provider-utils": "4.0.14"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "20.17.24",
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export type {
|
|
1
|
+
export type {
|
|
2
|
+
ProdiaImageModelOptions,
|
|
3
|
+
/** @deprecated Use `ProdiaImageModelOptions` instead. */
|
|
4
|
+
ProdiaImageModelOptions as ProdiaImageProviderOptions,
|
|
5
|
+
} from './prodia-image-model';
|
|
2
6
|
export type { ProdiaImageModelId } from './prodia-image-settings';
|
|
3
7
|
export type { ProdiaProvider, ProdiaProviderSettings } from './prodia-provider';
|
|
4
8
|
export { createProdia, prodia } from './prodia-provider';
|
|
@@ -37,7 +37,7 @@ export class ProdiaImageModel implements ImageModelV3 {
|
|
|
37
37
|
const prodiaOptions = await parseProviderOptions({
|
|
38
38
|
provider: 'prodia',
|
|
39
39
|
providerOptions,
|
|
40
|
-
schema:
|
|
40
|
+
schema: prodiaImageModelOptionsSchema,
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
let width: number | undefined;
|
|
@@ -188,7 +188,7 @@ const stylePresets = [
|
|
|
188
188
|
'craft-clay',
|
|
189
189
|
] as const;
|
|
190
190
|
|
|
191
|
-
export const
|
|
191
|
+
export const prodiaImageModelOptionsSchema = lazySchema(() =>
|
|
192
192
|
zodSchema(
|
|
193
193
|
z.object({
|
|
194
194
|
/**
|
|
@@ -219,8 +219,8 @@ export const prodiaImageProviderOptionsSchema = lazySchema(() =>
|
|
|
219
219
|
),
|
|
220
220
|
);
|
|
221
221
|
|
|
222
|
-
export type
|
|
223
|
-
typeof
|
|
222
|
+
export type ProdiaImageModelOptions = InferSchema<
|
|
223
|
+
typeof prodiaImageModelOptionsSchema
|
|
224
224
|
>;
|
|
225
225
|
|
|
226
226
|
interface ProdiaImageModelConfig {
|