@ai-sdk/replicate 3.0.43 → 3.0.45
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 +20 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +98 -13
- package/dist/index.js.map +1 -1
- package/docs/60-replicate.mdx +2 -0
- package/package.json +3 -3
- package/src/replicate-image-model-options.ts +13 -0
- package/src/replicate-image-model.ts +114 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @ai-sdk/replicate
|
|
2
2
|
|
|
3
|
+
## 3.0.45
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c0df1d1: fix(replicate): poll image predictions that exceed the synchronous wait duration
|
|
8
|
+
- Updated dependencies [0455398]
|
|
9
|
+
- @ai-sdk/provider-utils@5.0.44
|
|
10
|
+
|
|
11
|
+
## 3.0.44
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [215b25e]
|
|
16
|
+
- Updated dependencies [d4d96bf]
|
|
17
|
+
- Updated dependencies [a7dd893]
|
|
18
|
+
- Updated dependencies [3456e2c]
|
|
19
|
+
- Updated dependencies [c4e76de]
|
|
20
|
+
- @ai-sdk/provider-utils@5.0.43
|
|
21
|
+
- @ai-sdk/provider@4.0.17
|
|
22
|
+
|
|
3
23
|
## 3.0.43
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ declare class ReplicateImageModel implements ImageModelV4 {
|
|
|
31
31
|
}): ReplicateImageModel;
|
|
32
32
|
constructor(modelId: ReplicateImageModelId, config: ReplicateImageModelConfig);
|
|
33
33
|
doGenerate({ prompt, n, aspectRatio, size, seed, providerOptions, headers, abortSignal, files, mask, }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>>;
|
|
34
|
+
private pollPrediction;
|
|
35
|
+
private getCompletedPrediction;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
type ReplicateVideoModelId = 'minimax/video-01' | 'minimax/video-01:6c1e4171-288a-4ca2-a738-894f0e87699d' | 'stability-ai/stable-video-diffusion:3f0457e4619daac51203dedb472816fd4af51f3149fa7a9e0b5ffcf1b8172438' | (string & {});
|
|
@@ -97,6 +99,8 @@ declare const replicate: ReplicateProvider;
|
|
|
97
99
|
declare const replicateImageModelOptionsSchema: _ai_sdk_provider_utils.LazySchema<{
|
|
98
100
|
[x: string]: unknown;
|
|
99
101
|
maxWaitTimeInSeconds?: number | null | undefined;
|
|
102
|
+
pollIntervalMillis?: number | null | undefined;
|
|
103
|
+
maxPollAttempts?: number | null | undefined;
|
|
100
104
|
guidance_scale?: number | null | undefined;
|
|
101
105
|
num_inference_steps?: number | null | undefined;
|
|
102
106
|
negative_prompt?: string | null | undefined;
|
package/dist/index.js
CHANGED
|
@@ -10,11 +10,15 @@ import {
|
|
|
10
10
|
} from "@ai-sdk/provider-utils";
|
|
11
11
|
|
|
12
12
|
// src/replicate-image-model.ts
|
|
13
|
+
import {
|
|
14
|
+
InvalidResponseDataError
|
|
15
|
+
} from "@ai-sdk/provider";
|
|
13
16
|
import {
|
|
14
17
|
combineHeaders,
|
|
15
18
|
convertImageModelFileToDataUri,
|
|
16
19
|
createBinaryResponseHandler,
|
|
17
20
|
createJsonResponseHandler,
|
|
21
|
+
delay,
|
|
18
22
|
getFromApi,
|
|
19
23
|
parseProviderOptions,
|
|
20
24
|
postJsonToApi,
|
|
@@ -57,6 +61,17 @@ var replicateImageModelOptionsSchema = lazySchema(
|
|
|
57
61
|
* - When set to a positive number: Uses that duration (`prefer: wait=N`)
|
|
58
62
|
*/
|
|
59
63
|
maxWaitTimeInSeconds: z2.number().positive().nullish(),
|
|
64
|
+
/**
|
|
65
|
+
* Interval in milliseconds between polling attempts when the prediction
|
|
66
|
+
* does not complete within the synchronous wait duration.
|
|
67
|
+
* Defaults to 500 milliseconds.
|
|
68
|
+
*/
|
|
69
|
+
pollIntervalMillis: z2.number().int().positive().nullish(),
|
|
70
|
+
/**
|
|
71
|
+
* Maximum number of polling attempts before giving up.
|
|
72
|
+
* Defaults to 240 attempts.
|
|
73
|
+
*/
|
|
74
|
+
maxPollAttempts: z2.number().int().positive().nullish(),
|
|
60
75
|
/**
|
|
61
76
|
* Guidance scale for classifier-free guidance.
|
|
62
77
|
* Higher values make the output more closely match the prompt.
|
|
@@ -88,6 +103,8 @@ var replicateImageModelOptionsSchema = lazySchema(
|
|
|
88
103
|
);
|
|
89
104
|
|
|
90
105
|
// src/replicate-image-model.ts
|
|
106
|
+
var DEFAULT_POLL_INTERVAL_MILLIS = 500;
|
|
107
|
+
var DEFAULT_MAX_POLL_ATTEMPTS = 240;
|
|
91
108
|
var FLUX_2_MODEL_PATTERN = /^black-forest-labs\/flux-2-/;
|
|
92
109
|
var MAX_FLUX_2_INPUT_IMAGES = 8;
|
|
93
110
|
var ReplicateImageModel = class _ReplicateImageModel {
|
|
@@ -169,21 +186,20 @@ var ReplicateImageModel = class _ReplicateImageModel {
|
|
|
169
186
|
maskInput = convertImageModelFileToDataUri(mask);
|
|
170
187
|
}
|
|
171
188
|
}
|
|
172
|
-
const { maxWaitTimeInSeconds, ...inputOptions } = replicateOptions != null ? replicateOptions : {};
|
|
173
|
-
const preferHeader = maxWaitTimeInSeconds != null ? { prefer: `wait=${maxWaitTimeInSeconds}` } : { prefer: "wait" };
|
|
174
189
|
const {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
190
|
+
maxWaitTimeInSeconds,
|
|
191
|
+
pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS,
|
|
192
|
+
maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS,
|
|
193
|
+
...inputOptions
|
|
194
|
+
} = replicateOptions != null ? replicateOptions : {};
|
|
195
|
+
const preferHeader = maxWaitTimeInSeconds != null ? { prefer: `wait=${maxWaitTimeInSeconds}` } : { prefer: "wait" };
|
|
196
|
+
const resolvedHeaders = this.config.headers ? await resolve(this.config.headers) : void 0;
|
|
197
|
+
const { value: initialPrediction, responseHeaders } = await postJsonToApi({
|
|
178
198
|
url: (
|
|
179
199
|
// different endpoints for versioned vs unversioned models:
|
|
180
200
|
version != null ? `${this.config.baseURL}/predictions` : `${this.config.baseURL}/models/${modelId}/predictions`
|
|
181
201
|
),
|
|
182
|
-
headers: combineHeaders(
|
|
183
|
-
this.config.headers ? await resolve(this.config.headers) : void 0,
|
|
184
|
-
headers,
|
|
185
|
-
preferHeader
|
|
186
|
-
),
|
|
202
|
+
headers: combineHeaders(resolvedHeaders, headers, preferHeader),
|
|
187
203
|
body: {
|
|
188
204
|
input: {
|
|
189
205
|
prompt,
|
|
@@ -205,7 +221,20 @@ var ReplicateImageModel = class _ReplicateImageModel {
|
|
|
205
221
|
abortSignal,
|
|
206
222
|
fetch: this.config.fetch
|
|
207
223
|
});
|
|
208
|
-
const
|
|
224
|
+
const prediction = await this.pollPrediction({
|
|
225
|
+
prediction: initialPrediction,
|
|
226
|
+
headers: combineHeaders(resolvedHeaders, headers),
|
|
227
|
+
pollIntervalMillis: pollIntervalMillis != null ? pollIntervalMillis : DEFAULT_POLL_INTERVAL_MILLIS,
|
|
228
|
+
maxPollAttempts: maxPollAttempts != null ? maxPollAttempts : DEFAULT_MAX_POLL_ATTEMPTS,
|
|
229
|
+
abortSignal
|
|
230
|
+
});
|
|
231
|
+
if (prediction.output == null) {
|
|
232
|
+
throw new InvalidResponseDataError({
|
|
233
|
+
data: prediction,
|
|
234
|
+
message: "Replicate image generation completed without output."
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
const outputArray = Array.isArray(prediction.output) ? prediction.output : [prediction.output];
|
|
209
238
|
const images = await Promise.all(
|
|
210
239
|
outputArray.map(async (url) => {
|
|
211
240
|
const { value: image } = await getFromApi({
|
|
@@ -231,9 +260,65 @@ var ReplicateImageModel = class _ReplicateImageModel {
|
|
|
231
260
|
}
|
|
232
261
|
};
|
|
233
262
|
}
|
|
263
|
+
async pollPrediction({
|
|
264
|
+
prediction,
|
|
265
|
+
headers,
|
|
266
|
+
pollIntervalMillis,
|
|
267
|
+
maxPollAttempts,
|
|
268
|
+
abortSignal
|
|
269
|
+
}) {
|
|
270
|
+
let currentPrediction = prediction;
|
|
271
|
+
for (let i = 0; i < maxPollAttempts; i++) {
|
|
272
|
+
const completedPrediction2 = this.getCompletedPrediction(currentPrediction);
|
|
273
|
+
if (completedPrediction2 != null) {
|
|
274
|
+
return completedPrediction2;
|
|
275
|
+
}
|
|
276
|
+
const { value } = await getFromApi({
|
|
277
|
+
url: currentPrediction.urls.get,
|
|
278
|
+
validateUrl: true,
|
|
279
|
+
credentialedOrigin: this.config.baseURL,
|
|
280
|
+
trustedOrigin: this.config.baseURL,
|
|
281
|
+
headers,
|
|
282
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
283
|
+
replicateImageResponseSchema
|
|
284
|
+
),
|
|
285
|
+
failedResponseHandler: replicateFailedResponseHandler,
|
|
286
|
+
abortSignal,
|
|
287
|
+
fetch: this.config.fetch
|
|
288
|
+
});
|
|
289
|
+
currentPrediction = value;
|
|
290
|
+
if (i < maxPollAttempts - 1) {
|
|
291
|
+
await delay(pollIntervalMillis, { abortSignal });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const completedPrediction = this.getCompletedPrediction(currentPrediction);
|
|
295
|
+
if (completedPrediction != null) {
|
|
296
|
+
return completedPrediction;
|
|
297
|
+
}
|
|
298
|
+
throw new Error(
|
|
299
|
+
`Replicate image generation did not complete after ${maxPollAttempts} polling attempts.`
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
getCompletedPrediction(prediction) {
|
|
303
|
+
var _a;
|
|
304
|
+
if (prediction.status === "failed" || prediction.status === "canceled") {
|
|
305
|
+
throw new InvalidResponseDataError({
|
|
306
|
+
data: prediction,
|
|
307
|
+
message: `Replicate image generation ${prediction.status}: ${(_a = prediction.error) != null ? _a : "Unknown error"}`
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
if (prediction.output != null || prediction.status === "succeeded") {
|
|
311
|
+
return prediction;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
234
314
|
};
|
|
235
315
|
var replicateImageResponseSchema = z3.object({
|
|
236
|
-
|
|
316
|
+
status: z3.enum(["starting", "processing", "succeeded", "failed", "canceled"]),
|
|
317
|
+
output: z3.union([z3.array(z3.string()), z3.string()]).nullish(),
|
|
318
|
+
error: z3.string().nullish(),
|
|
319
|
+
urls: z3.object({
|
|
320
|
+
get: z3.string()
|
|
321
|
+
})
|
|
237
322
|
});
|
|
238
323
|
|
|
239
324
|
// src/replicate-video-model.ts
|
|
@@ -503,7 +588,7 @@ var replicatePredictionSchema = z5.object({
|
|
|
503
588
|
});
|
|
504
589
|
|
|
505
590
|
// src/version.ts
|
|
506
|
-
var VERSION = true ? "3.0.
|
|
591
|
+
var VERSION = true ? "3.0.45" : "0.0.0-test";
|
|
507
592
|
|
|
508
593
|
// src/replicate-provider.ts
|
|
509
594
|
function createReplicate(options = {}) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/replicate-provider.ts","../src/replicate-image-model.ts","../src/replicate-error.ts","../src/replicate-image-model-options.ts","../src/replicate-video-model.ts","../src/replicate-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n validateBaseURL,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { ReplicateImageModel } from './replicate-image-model';\nimport type { ReplicateImageModelId } from './replicate-image-settings';\nimport { ReplicateVideoModel } from './replicate-video-model';\nimport type { ReplicateVideoModelId } from './replicate-video-settings';\nimport { VERSION } from './version';\n\nexport interface ReplicateProviderSettings {\n /**\n * API token that is being send using the `Authorization` header.\n * It defaults to the `REPLICATE_API_TOKEN` environment variable.\n */\n apiToken?: string;\n\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers.\n * The default prefix is `https://api.replicate.com/v1`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface ReplicateProvider extends ProviderV4 {\n /**\n * Creates a Replicate image generation model.\n */\n image(modelId: ReplicateImageModelId): ReplicateImageModel;\n\n /**\n * Creates a Replicate image generation model.\n */\n imageModel(modelId: ReplicateImageModelId): ReplicateImageModel;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n\n /**\n * Creates a Replicate video generation model.\n */\n video(modelId: ReplicateVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a Replicate video generation model.\n */\n videoModel(modelId: ReplicateVideoModelId): Experimental_VideoModelV4;\n}\n\n/**\n * Create a Replicate provider instance.\n */\nexport function createReplicate(\n options: ReplicateProviderSettings = {},\n): ReplicateProvider {\n const baseURL =\n withoutTrailingSlash(validateBaseURL(options.baseURL)) ??\n 'https://api.replicate.com/v1';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiToken,\n environmentVariableName: 'REPLICATE_API_TOKEN',\n description: 'Replicate',\n })}`,\n ...options.headers,\n },\n `ai-sdk/replicate/${VERSION}`,\n );\n\n const createImageModel = (modelId: ReplicateImageModelId) =>\n new ReplicateImageModel(modelId, {\n provider: 'replicate',\n baseURL,\n headers: getHeaders(),\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: ReplicateVideoModelId) =>\n new ReplicateVideoModel(modelId, {\n provider: 'replicate.video',\n baseURL,\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' as const,\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n video: createVideoModel,\n videoModel: createVideoModel,\n };\n}\n\n/**\n * Default Replicate provider instance.\n */\nexport const replicate = createReplicate();\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { replicateFailedResponseHandler } from './replicate-error';\nimport { replicateImageModelOptionsSchema } from './replicate-image-model-options';\nimport type { ReplicateImageModelId } from './replicate-image-settings';\n\ninterface ReplicateImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\n// Flux-2 models support up to 8 input images with input_image, input_image_2, etc.\nconst FLUX_2_MODEL_PATTERN = /^black-forest-labs\\/flux-2-/;\nconst MAX_FLUX_2_INPUT_IMAGES = 8;\n\nexport class ReplicateImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n\n get maxImagesPerCall(): number {\n // Flux-2 models support up to 8 input images\n return this.isFlux2Model ? MAX_FLUX_2_INPUT_IMAGES : 1;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get isFlux2Model(): boolean {\n return FLUX_2_MODEL_PATTERN.test(this.modelId);\n }\n\n static [WORKFLOW_SERIALIZE](model: ReplicateImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ReplicateImageModelId;\n config: ReplicateImageModelConfig;\n }) {\n return new ReplicateImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ReplicateImageModelId,\n private readonly config: ReplicateImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n aspectRatio,\n size,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n\n const [modelId, version] = this.modelId.split(':');\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n // Parse provider options\n const replicateOptions = await parseProviderOptions({\n provider: 'replicate',\n providerOptions,\n schema: replicateImageModelOptionsSchema,\n });\n\n // Handle image input from files\n let imageInputs: Record<string, string> = {};\n if (files != null && files.length > 0) {\n if (this.isFlux2Model) {\n // Flux-2 models use input_image, input_image_2, input_image_3, etc.\n for (\n let i = 0;\n i < Math.min(files.length, MAX_FLUX_2_INPUT_IMAGES);\n i++\n ) {\n const key = i === 0 ? 'input_image' : `input_image_${i + 1}`;\n imageInputs[key] = convertImageModelFileToDataUri(files[i]);\n }\n if (files.length > MAX_FLUX_2_INPUT_IMAGES) {\n warnings.push({\n type: 'other',\n message: `Flux-2 models support up to ${MAX_FLUX_2_INPUT_IMAGES} input images. Additional images are ignored.`,\n });\n }\n } else {\n // Other models use single 'image' parameter\n imageInputs = { image: convertImageModelFileToDataUri(files[0]) };\n if (files.length > 1) {\n warnings.push({\n type: 'other',\n message:\n 'This Replicate model only supports a single input image. Additional images are ignored.',\n });\n }\n }\n }\n\n // Handle mask input (not supported by Flux-2 models)\n let maskInput: string | undefined;\n if (mask != null) {\n if (this.isFlux2Model) {\n warnings.push({\n type: 'other',\n message:\n 'Flux-2 models do not support mask input. The mask will be ignored.',\n });\n } else {\n maskInput = convertImageModelFileToDataUri(mask);\n }\n }\n\n // Extract maxWaitTimeInSeconds from provider options and prepare the rest for the request body\n const { maxWaitTimeInSeconds, ...inputOptions } = replicateOptions ?? {};\n\n // Build the prefer header based on maxWaitTimeInSeconds:\n // - undefined/null: use default sync wait (prefer: wait)\n // - positive number: use custom wait duration (prefer: wait=N)\n const preferHeader: Record<string, string> =\n maxWaitTimeInSeconds != null\n ? { prefer: `wait=${maxWaitTimeInSeconds}` }\n : { prefer: 'wait' };\n\n const {\n value: { output },\n responseHeaders,\n } = await postJsonToApi({\n url:\n // different endpoints for versioned vs unversioned models:\n version != null\n ? `${this.config.baseURL}/predictions`\n : `${this.config.baseURL}/models/${modelId}/predictions`,\n\n headers: combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n headers,\n preferHeader,\n ),\n\n body: {\n input: {\n prompt,\n aspect_ratio: aspectRatio,\n size,\n seed,\n num_outputs: n,\n ...imageInputs,\n ...(maskInput != null ? { mask: maskInput } : {}),\n ...inputOptions,\n },\n // for versioned models, include the version in the body:\n ...(version != null ? { version } : {}),\n },\n\n successfulResponseHandler: createJsonResponseHandler(\n replicateImageResponseSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n // download the images:\n const outputArray = Array.isArray(output) ? output : [output];\n const images = await Promise.all(\n outputArray.map(async url => {\n const { value: image } = await getFromApi({\n url,\n // url is an output image URL from the provider response; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n successfulResponseHandler: createBinaryResponseHandler(),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n return image;\n }),\n );\n\n return {\n images,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n\nconst replicateImageResponseSchema = z.object({\n output: z.union([z.array(z.string()), z.string()]),\n});\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst replicateErrorSchema = z.object({\n detail: z.string().optional(),\n error: z.string().optional(),\n});\n\nexport const replicateFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: replicateErrorSchema,\n errorToMessage: error =>\n error.detail ?? error.error ?? 'Unknown Replicate error',\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider options schema for Replicate image generation.\n *\n * Note: Different Replicate models support different parameters.\n * This schema includes common parameters, but you can pass any\n * model-specific parameters through the passthrough.\n */\nexport const replicateImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n /**\n * Maximum time in seconds to wait for the prediction to complete in sync mode.\n * By default, Replicate uses sync mode with a 60-second timeout.\n *\n * - When not specified: Uses default 60-second sync wait (`prefer: wait`)\n * - When set to a positive number: Uses that duration (`prefer: wait=N`)\n */\n maxWaitTimeInSeconds: z.number().positive().nullish(),\n\n /**\n * Guidance scale for classifier-free guidance.\n * Higher values make the output more closely match the prompt.\n */\n guidance_scale: z.number().nullish(),\n\n /**\n * Number of denoising steps. More steps = higher quality but slower.\n */\n num_inference_steps: z.number().nullish(),\n\n /**\n * Negative prompt to guide what to avoid in the generation.\n */\n negative_prompt: z.string().nullish(),\n\n /**\n * Output image format.\n */\n output_format: z.enum(['png', 'jpg', 'webp']).nullish(),\n\n /**\n * Output image quality (1-100). Only applies to jpg and webp.\n */\n output_quality: z.number().min(1).max(100).nullish(),\n\n /**\n * Strength of the transformation for img2img (0-1).\n * Lower values keep more of the original image.\n */\n strength: z.number().min(0).max(1).nullish(),\n }),\n ),\n);\n\nexport type ReplicateImageModelOptions = InferSchema<\n typeof replicateImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonResponseHandler,\n type FetchFunction,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { replicateFailedResponseHandler } from './replicate-error';\nimport {\n replicateVideoModelOptionsSchema,\n type ReplicateVideoModelOptions,\n} from './replicate-video-model-options';\nimport type { ReplicateVideoModelId } from './replicate-video-settings';\n\ninterface ReplicateVideoModelConfig {\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 class ReplicateVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1; // Replicate video models support 1 video at a time\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ReplicateVideoModelId,\n private readonly config: ReplicateVideoModelConfig,\n ) {}\n\n private async buildInput(options: {\n prompt?: string;\n image?:\n | { type: 'url'; url: string }\n | { type: 'file'; data: string | Uint8Array; mediaType: string };\n aspectRatio?: string;\n resolution?: string;\n duration?: number;\n fps?: number;\n seed?: number;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n input: Record<string, unknown>;\n warnings: SharedV4Warning[];\n replicateOptions: ReplicateVideoModelOptions | undefined;\n }> {\n const warnings: SharedV4Warning[] = [];\n\n const replicateOptions = (await parseProviderOptions({\n provider: 'replicate',\n providerOptions: options.providerOptions,\n schema: replicateVideoModelOptionsSchema,\n })) as ReplicateVideoModelOptions | undefined;\n\n const input: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n input.prompt = options.prompt;\n }\n\n if (options.image != null) {\n if (options.image.type === 'url') {\n input.image = options.image.url;\n } else {\n input.image = convertImageModelFileToDataUri(options.image);\n }\n }\n\n if (options.aspectRatio) {\n input.aspect_ratio = options.aspectRatio;\n }\n\n if (options.resolution) {\n input.size = options.resolution;\n }\n\n if (options.duration) {\n input.duration = options.duration;\n }\n\n if (options.fps) {\n input.fps = options.fps;\n }\n\n if (options.seed) {\n input.seed = options.seed;\n }\n\n if (replicateOptions != null) {\n const opts = replicateOptions;\n if (opts.guidance_scale !== undefined && opts.guidance_scale !== null) {\n input.guidance_scale = opts.guidance_scale;\n }\n if (\n opts.num_inference_steps !== undefined &&\n opts.num_inference_steps !== null\n ) {\n input.num_inference_steps = opts.num_inference_steps;\n }\n if (\n opts.motion_bucket_id !== undefined &&\n opts.motion_bucket_id !== null\n ) {\n input.motion_bucket_id = opts.motion_bucket_id;\n }\n if (opts.cond_aug !== undefined && opts.cond_aug !== null) {\n input.cond_aug = opts.cond_aug;\n }\n if (opts.decoding_t !== undefined && opts.decoding_t !== null) {\n input.decoding_t = opts.decoding_t;\n }\n if (opts.video_length !== undefined && opts.video_length !== null) {\n input.video_length = opts.video_length;\n }\n if (opts.sizing_strategy !== undefined && opts.sizing_strategy !== null) {\n input.sizing_strategy = opts.sizing_strategy;\n }\n if (\n opts.frames_per_second !== undefined &&\n opts.frames_per_second !== null\n ) {\n input.frames_per_second = opts.frames_per_second;\n }\n if (\n opts.prompt_optimizer !== undefined &&\n opts.prompt_optimizer !== null\n ) {\n input.prompt_optimizer = opts.prompt_optimizer;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'maxWaitTimeInSeconds',\n 'guidance_scale',\n 'num_inference_steps',\n 'motion_bucket_id',\n 'cond_aug',\n 'decoding_t',\n 'video_length',\n 'sizing_strategy',\n 'frames_per_second',\n 'prompt_optimizer',\n ].includes(key)\n ) {\n input[key] = value;\n }\n }\n }\n\n return { input, warnings, replicateOptions };\n }\n\n async handleWebhookOption(\n options: Parameters<NonNullable<VideoModelV4['handleWebhookOption']>>[0],\n ) {\n const { url, received } = await options.webhook();\n return { webhookUrl: url, received };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { input, warnings } = await this.buildInput(options);\n\n const [modelId, version] = this.modelId.split(':');\n\n const predictionUrl =\n version != null\n ? `${this.config.baseURL}/predictions`\n : `${this.config.baseURL}/models/${modelId}/predictions`;\n\n const { value: prediction, responseHeaders } = await postJsonToApi({\n url: predictionUrl,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: {\n input,\n ...(version != null ? { version } : {}),\n ...(options.webhookUrl != null\n ? {\n webhook: options.webhookUrl,\n webhook_events_filter: ['completed'],\n }\n : {}),\n },\n successfulResponseHandler: createJsonResponseHandler(\n replicatePredictionSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n operation: { getUrl: prediction.urls.get },\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { getUrl } = options.operation as { getUrl: string };\n\n const { value: prediction, responseHeaders } = await getFromApi({\n url: getUrl,\n // getUrl comes from the provider response body.\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n replicatePredictionSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n if (prediction.status === 'failed') {\n return {\n status: 'error' as const,\n error: `Video generation failed: ${prediction.error ?? 'Unknown error'}`,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n if (prediction.status === 'canceled') {\n return {\n status: 'error' as const,\n error: 'Video generation was canceled',\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n if (prediction.status === 'succeeded') {\n if (!prediction.output) {\n throw new AISDKError({\n name: 'REPLICATE_VIDEO_GENERATION_ERROR',\n message: 'No video URL in response',\n });\n }\n\n return {\n status: 'completed',\n videos: [\n { type: 'url', url: prediction.output, mediaType: 'video/mp4' },\n ],\n warnings: [],\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n replicate: {\n videos: [{ url: prediction.output }],\n predictionId: prediction.id,\n metrics: prediction.metrics,\n },\n },\n };\n }\n\n // starting or processing\n return {\n status: 'pending',\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n\nconst replicatePredictionSchema = z.object({\n id: z.string(),\n status: z.enum(['starting', 'processing', 'succeeded', 'failed', 'canceled']),\n output: z.string().nullish(),\n error: z.string().nullish(),\n urls: z.object({\n get: z.string(),\n }),\n metrics: z\n .object({\n predict_time: z.number().nullish(),\n })\n .nullish(),\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type ReplicateVideoModelOptions = {\n // Polling configuration\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n maxWaitTimeInSeconds?: number | null;\n\n // Common video generation options\n guidance_scale?: number | null;\n num_inference_steps?: number | null;\n\n // Stable Video Diffusion specific\n motion_bucket_id?: number | null;\n cond_aug?: number | null;\n decoding_t?: number | null;\n video_length?: string | null;\n sizing_strategy?: string | null;\n frames_per_second?: number | null;\n\n // MiniMax specific\n prompt_optimizer?: boolean | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nexport const replicateVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n maxWaitTimeInSeconds: z.number().positive().nullish(),\n guidance_scale: z.number().nullish(),\n num_inference_steps: z.number().nullish(),\n motion_bucket_id: z.number().nullish(),\n cond_aug: z.number().nullish(),\n decoding_t: z.number().nullish(),\n video_length: z.string().nullish(),\n sizing_strategy: z.string().nullish(),\n frames_per_second: z.number().nullish(),\n prompt_optimizer: z.boolean().nullish(),\n })\n .loose(),\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":["z","z","z","combineHeaders","convertImageModelFileToDataUri","createJsonResponseHandler","getFromApi","parseProviderOptions","postJsonToApi","resolve","z","lazySchema","zodSchema","z","parseProviderOptions","convertImageModelFileToDataUri","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","getFromApi","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/replicate-provider.ts","../src/replicate-image-model.ts","../src/replicate-error.ts","../src/replicate-image-model-options.ts","../src/replicate-video-model.ts","../src/replicate-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n validateBaseURL,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { ReplicateImageModel } from './replicate-image-model';\nimport type { ReplicateImageModelId } from './replicate-image-settings';\nimport { ReplicateVideoModel } from './replicate-video-model';\nimport type { ReplicateVideoModelId } from './replicate-video-settings';\nimport { VERSION } from './version';\n\nexport interface ReplicateProviderSettings {\n /**\n * API token that is being send using the `Authorization` header.\n * It defaults to the `REPLICATE_API_TOKEN` environment variable.\n */\n apiToken?: string;\n\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers.\n * The default prefix is `https://api.replicate.com/v1`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface ReplicateProvider extends ProviderV4 {\n /**\n * Creates a Replicate image generation model.\n */\n image(modelId: ReplicateImageModelId): ReplicateImageModel;\n\n /**\n * Creates a Replicate image generation model.\n */\n imageModel(modelId: ReplicateImageModelId): ReplicateImageModel;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n\n /**\n * Creates a Replicate video generation model.\n */\n video(modelId: ReplicateVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a Replicate video generation model.\n */\n videoModel(modelId: ReplicateVideoModelId): Experimental_VideoModelV4;\n}\n\n/**\n * Create a Replicate provider instance.\n */\nexport function createReplicate(\n options: ReplicateProviderSettings = {},\n): ReplicateProvider {\n const baseURL =\n withoutTrailingSlash(validateBaseURL(options.baseURL)) ??\n 'https://api.replicate.com/v1';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiToken,\n environmentVariableName: 'REPLICATE_API_TOKEN',\n description: 'Replicate',\n })}`,\n ...options.headers,\n },\n `ai-sdk/replicate/${VERSION}`,\n );\n\n const createImageModel = (modelId: ReplicateImageModelId) =>\n new ReplicateImageModel(modelId, {\n provider: 'replicate',\n baseURL,\n headers: getHeaders(),\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: ReplicateVideoModelId) =>\n new ReplicateVideoModel(modelId, {\n provider: 'replicate.video',\n baseURL,\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' as const,\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n video: createVideoModel,\n videoModel: createVideoModel,\n };\n}\n\n/**\n * Default Replicate provider instance.\n */\nexport const replicate = createReplicate();\n","import {\n InvalidResponseDataError,\n type ImageModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type Resolvable,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { replicateFailedResponseHandler } from './replicate-error';\nimport { replicateImageModelOptionsSchema } from './replicate-image-model-options';\nimport type { ReplicateImageModelId } from './replicate-image-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_MAX_POLL_ATTEMPTS = 240;\n\ninterface ReplicateImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\n// Flux-2 models support up to 8 input images with input_image, input_image_2, etc.\nconst FLUX_2_MODEL_PATTERN = /^black-forest-labs\\/flux-2-/;\nconst MAX_FLUX_2_INPUT_IMAGES = 8;\n\nexport class ReplicateImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n\n get maxImagesPerCall(): number {\n // Flux-2 models support up to 8 input images\n return this.isFlux2Model ? MAX_FLUX_2_INPUT_IMAGES : 1;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get isFlux2Model(): boolean {\n return FLUX_2_MODEL_PATTERN.test(this.modelId);\n }\n\n static [WORKFLOW_SERIALIZE](model: ReplicateImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ReplicateImageModelId;\n config: ReplicateImageModelConfig;\n }) {\n return new ReplicateImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ReplicateImageModelId,\n private readonly config: ReplicateImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n aspectRatio,\n size,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n\n const [modelId, version] = this.modelId.split(':');\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n // Parse provider options\n const replicateOptions = await parseProviderOptions({\n provider: 'replicate',\n providerOptions,\n schema: replicateImageModelOptionsSchema,\n });\n\n // Handle image input from files\n let imageInputs: Record<string, string> = {};\n if (files != null && files.length > 0) {\n if (this.isFlux2Model) {\n // Flux-2 models use input_image, input_image_2, input_image_3, etc.\n for (\n let i = 0;\n i < Math.min(files.length, MAX_FLUX_2_INPUT_IMAGES);\n i++\n ) {\n const key = i === 0 ? 'input_image' : `input_image_${i + 1}`;\n imageInputs[key] = convertImageModelFileToDataUri(files[i]);\n }\n if (files.length > MAX_FLUX_2_INPUT_IMAGES) {\n warnings.push({\n type: 'other',\n message: `Flux-2 models support up to ${MAX_FLUX_2_INPUT_IMAGES} input images. Additional images are ignored.`,\n });\n }\n } else {\n // Other models use single 'image' parameter\n imageInputs = { image: convertImageModelFileToDataUri(files[0]) };\n if (files.length > 1) {\n warnings.push({\n type: 'other',\n message:\n 'This Replicate model only supports a single input image. Additional images are ignored.',\n });\n }\n }\n }\n\n // Handle mask input (not supported by Flux-2 models)\n let maskInput: string | undefined;\n if (mask != null) {\n if (this.isFlux2Model) {\n warnings.push({\n type: 'other',\n message:\n 'Flux-2 models do not support mask input. The mask will be ignored.',\n });\n } else {\n maskInput = convertImageModelFileToDataUri(mask);\n }\n }\n\n // Extract maxWaitTimeInSeconds from provider options and prepare the rest for the request body\n const {\n maxWaitTimeInSeconds,\n pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS,\n maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS,\n ...inputOptions\n } = replicateOptions ?? {};\n\n // Build the prefer header based on maxWaitTimeInSeconds:\n // - undefined/null: use default sync wait (prefer: wait)\n // - positive number: use custom wait duration (prefer: wait=N)\n const preferHeader: Record<string, string> =\n maxWaitTimeInSeconds != null\n ? { prefer: `wait=${maxWaitTimeInSeconds}` }\n : { prefer: 'wait' };\n\n const resolvedHeaders = this.config.headers\n ? await resolve(this.config.headers)\n : undefined;\n\n const { value: initialPrediction, responseHeaders } = await postJsonToApi({\n url:\n // different endpoints for versioned vs unversioned models:\n version != null\n ? `${this.config.baseURL}/predictions`\n : `${this.config.baseURL}/models/${modelId}/predictions`,\n\n headers: combineHeaders(resolvedHeaders, headers, preferHeader),\n\n body: {\n input: {\n prompt,\n aspect_ratio: aspectRatio,\n size,\n seed,\n num_outputs: n,\n ...imageInputs,\n ...(maskInput != null ? { mask: maskInput } : {}),\n ...inputOptions,\n },\n // for versioned models, include the version in the body:\n ...(version != null ? { version } : {}),\n },\n\n successfulResponseHandler: createJsonResponseHandler(\n replicateImageResponseSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const prediction = await this.pollPrediction({\n prediction: initialPrediction,\n headers: combineHeaders(resolvedHeaders, headers),\n pollIntervalMillis: pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS,\n maxPollAttempts: maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS,\n abortSignal,\n });\n\n if (prediction.output == null) {\n throw new InvalidResponseDataError({\n data: prediction,\n message: 'Replicate image generation completed without output.',\n });\n }\n\n // download the images:\n const outputArray = Array.isArray(prediction.output)\n ? prediction.output\n : [prediction.output];\n const images = await Promise.all(\n outputArray.map(async url => {\n const { value: image } = await getFromApi({\n url,\n // url is an output image URL from the provider response; validate it.\n validateUrl: true,\n trustedOrigin: this.config.baseURL,\n successfulResponseHandler: createBinaryResponseHandler(),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n return image;\n }),\n );\n\n return {\n images,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollPrediction({\n prediction,\n headers,\n pollIntervalMillis,\n maxPollAttempts,\n abortSignal,\n }: {\n prediction: ReplicateImagePrediction;\n headers: Record<string, string | undefined>;\n pollIntervalMillis: number;\n maxPollAttempts: number;\n abortSignal: AbortSignal | undefined;\n }): Promise<ReplicateImagePrediction> {\n let currentPrediction = prediction;\n\n for (let i = 0; i < maxPollAttempts; i++) {\n const completedPrediction =\n this.getCompletedPrediction(currentPrediction);\n if (completedPrediction != null) {\n return completedPrediction;\n }\n\n const { value } = await getFromApi({\n url: currentPrediction.urls.get,\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers,\n successfulResponseHandler: createJsonResponseHandler(\n replicateImageResponseSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n currentPrediction = value;\n\n if (i < maxPollAttempts - 1) {\n await delay(pollIntervalMillis, { abortSignal });\n }\n }\n\n const completedPrediction = this.getCompletedPrediction(currentPrediction);\n if (completedPrediction != null) {\n return completedPrediction;\n }\n\n throw new Error(\n `Replicate image generation did not complete after ${maxPollAttempts} polling attempts.`,\n );\n }\n\n private getCompletedPrediction(\n prediction: ReplicateImagePrediction,\n ): ReplicateImagePrediction | undefined {\n if (prediction.status === 'failed' || prediction.status === 'canceled') {\n throw new InvalidResponseDataError({\n data: prediction,\n message: `Replicate image generation ${prediction.status}: ${prediction.error ?? 'Unknown error'}`,\n });\n }\n\n if (prediction.output != null || prediction.status === 'succeeded') {\n return prediction;\n }\n }\n}\n\nconst replicateImageResponseSchema = z.object({\n status: z.enum(['starting', 'processing', 'succeeded', 'failed', 'canceled']),\n output: z.union([z.array(z.string()), z.string()]).nullish(),\n error: z.string().nullish(),\n urls: z.object({\n get: z.string(),\n }),\n});\n\ntype ReplicateImagePrediction = z.infer<typeof replicateImageResponseSchema>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst replicateErrorSchema = z.object({\n detail: z.string().optional(),\n error: z.string().optional(),\n});\n\nexport const replicateFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: replicateErrorSchema,\n errorToMessage: error =>\n error.detail ?? error.error ?? 'Unknown Replicate error',\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider options schema for Replicate image generation.\n *\n * Note: Different Replicate models support different parameters.\n * This schema includes common parameters, but you can pass any\n * model-specific parameters through the passthrough.\n */\nexport const replicateImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n /**\n * Maximum time in seconds to wait for the prediction to complete in sync mode.\n * By default, Replicate uses sync mode with a 60-second timeout.\n *\n * - When not specified: Uses default 60-second sync wait (`prefer: wait`)\n * - When set to a positive number: Uses that duration (`prefer: wait=N`)\n */\n maxWaitTimeInSeconds: z.number().positive().nullish(),\n\n /**\n * Interval in milliseconds between polling attempts when the prediction\n * does not complete within the synchronous wait duration.\n * Defaults to 500 milliseconds.\n */\n pollIntervalMillis: z.number().int().positive().nullish(),\n\n /**\n * Maximum number of polling attempts before giving up.\n * Defaults to 240 attempts.\n */\n maxPollAttempts: z.number().int().positive().nullish(),\n\n /**\n * Guidance scale for classifier-free guidance.\n * Higher values make the output more closely match the prompt.\n */\n guidance_scale: z.number().nullish(),\n\n /**\n * Number of denoising steps. More steps = higher quality but slower.\n */\n num_inference_steps: z.number().nullish(),\n\n /**\n * Negative prompt to guide what to avoid in the generation.\n */\n negative_prompt: z.string().nullish(),\n\n /**\n * Output image format.\n */\n output_format: z.enum(['png', 'jpg', 'webp']).nullish(),\n\n /**\n * Output image quality (1-100). Only applies to jpg and webp.\n */\n output_quality: z.number().min(1).max(100).nullish(),\n\n /**\n * Strength of the transformation for img2img (0-1).\n * Lower values keep more of the original image.\n */\n strength: z.number().min(0).max(1).nullish(),\n }),\n ),\n);\n\nexport type ReplicateImageModelOptions = InferSchema<\n typeof replicateImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createJsonResponseHandler,\n type FetchFunction,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { replicateFailedResponseHandler } from './replicate-error';\nimport {\n replicateVideoModelOptionsSchema,\n type ReplicateVideoModelOptions,\n} from './replicate-video-model-options';\nimport type { ReplicateVideoModelId } from './replicate-video-settings';\n\ninterface ReplicateVideoModelConfig {\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 class ReplicateVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1; // Replicate video models support 1 video at a time\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: ReplicateVideoModelId,\n private readonly config: ReplicateVideoModelConfig,\n ) {}\n\n private async buildInput(options: {\n prompt?: string;\n image?:\n | { type: 'url'; url: string }\n | { type: 'file'; data: string | Uint8Array; mediaType: string };\n aspectRatio?: string;\n resolution?: string;\n duration?: number;\n fps?: number;\n seed?: number;\n providerOptions?: Record<string, Record<string, unknown>>;\n }): Promise<{\n input: Record<string, unknown>;\n warnings: SharedV4Warning[];\n replicateOptions: ReplicateVideoModelOptions | undefined;\n }> {\n const warnings: SharedV4Warning[] = [];\n\n const replicateOptions = (await parseProviderOptions({\n provider: 'replicate',\n providerOptions: options.providerOptions,\n schema: replicateVideoModelOptionsSchema,\n })) as ReplicateVideoModelOptions | undefined;\n\n const input: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n input.prompt = options.prompt;\n }\n\n if (options.image != null) {\n if (options.image.type === 'url') {\n input.image = options.image.url;\n } else {\n input.image = convertImageModelFileToDataUri(options.image);\n }\n }\n\n if (options.aspectRatio) {\n input.aspect_ratio = options.aspectRatio;\n }\n\n if (options.resolution) {\n input.size = options.resolution;\n }\n\n if (options.duration) {\n input.duration = options.duration;\n }\n\n if (options.fps) {\n input.fps = options.fps;\n }\n\n if (options.seed) {\n input.seed = options.seed;\n }\n\n if (replicateOptions != null) {\n const opts = replicateOptions;\n if (opts.guidance_scale !== undefined && opts.guidance_scale !== null) {\n input.guidance_scale = opts.guidance_scale;\n }\n if (\n opts.num_inference_steps !== undefined &&\n opts.num_inference_steps !== null\n ) {\n input.num_inference_steps = opts.num_inference_steps;\n }\n if (\n opts.motion_bucket_id !== undefined &&\n opts.motion_bucket_id !== null\n ) {\n input.motion_bucket_id = opts.motion_bucket_id;\n }\n if (opts.cond_aug !== undefined && opts.cond_aug !== null) {\n input.cond_aug = opts.cond_aug;\n }\n if (opts.decoding_t !== undefined && opts.decoding_t !== null) {\n input.decoding_t = opts.decoding_t;\n }\n if (opts.video_length !== undefined && opts.video_length !== null) {\n input.video_length = opts.video_length;\n }\n if (opts.sizing_strategy !== undefined && opts.sizing_strategy !== null) {\n input.sizing_strategy = opts.sizing_strategy;\n }\n if (\n opts.frames_per_second !== undefined &&\n opts.frames_per_second !== null\n ) {\n input.frames_per_second = opts.frames_per_second;\n }\n if (\n opts.prompt_optimizer !== undefined &&\n opts.prompt_optimizer !== null\n ) {\n input.prompt_optimizer = opts.prompt_optimizer;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'maxWaitTimeInSeconds',\n 'guidance_scale',\n 'num_inference_steps',\n 'motion_bucket_id',\n 'cond_aug',\n 'decoding_t',\n 'video_length',\n 'sizing_strategy',\n 'frames_per_second',\n 'prompt_optimizer',\n ].includes(key)\n ) {\n input[key] = value;\n }\n }\n }\n\n return { input, warnings, replicateOptions };\n }\n\n async handleWebhookOption(\n options: Parameters<NonNullable<VideoModelV4['handleWebhookOption']>>[0],\n ) {\n const { url, received } = await options.webhook();\n return { webhookUrl: url, received };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { input, warnings } = await this.buildInput(options);\n\n const [modelId, version] = this.modelId.split(':');\n\n const predictionUrl =\n version != null\n ? `${this.config.baseURL}/predictions`\n : `${this.config.baseURL}/models/${modelId}/predictions`;\n\n const { value: prediction, responseHeaders } = await postJsonToApi({\n url: predictionUrl,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: {\n input,\n ...(version != null ? { version } : {}),\n ...(options.webhookUrl != null\n ? {\n webhook: options.webhookUrl,\n webhook_events_filter: ['completed'],\n }\n : {}),\n },\n successfulResponseHandler: createJsonResponseHandler(\n replicatePredictionSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n operation: { getUrl: prediction.urls.get },\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { getUrl } = options.operation as { getUrl: string };\n\n const { value: prediction, responseHeaders } = await getFromApi({\n url: getUrl,\n // getUrl comes from the provider response body.\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n replicatePredictionSchema,\n ),\n failedResponseHandler: replicateFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n if (prediction.status === 'failed') {\n return {\n status: 'error' as const,\n error: `Video generation failed: ${prediction.error ?? 'Unknown error'}`,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n if (prediction.status === 'canceled') {\n return {\n status: 'error' as const,\n error: 'Video generation was canceled',\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n if (prediction.status === 'succeeded') {\n if (!prediction.output) {\n throw new AISDKError({\n name: 'REPLICATE_VIDEO_GENERATION_ERROR',\n message: 'No video URL in response',\n });\n }\n\n return {\n status: 'completed',\n videos: [\n { type: 'url', url: prediction.output, mediaType: 'video/mp4' },\n ],\n warnings: [],\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n replicate: {\n videos: [{ url: prediction.output }],\n predictionId: prediction.id,\n metrics: prediction.metrics,\n },\n },\n };\n }\n\n // starting or processing\n return {\n status: 'pending',\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n\nconst replicatePredictionSchema = z.object({\n id: z.string(),\n status: z.enum(['starting', 'processing', 'succeeded', 'failed', 'canceled']),\n output: z.string().nullish(),\n error: z.string().nullish(),\n urls: z.object({\n get: z.string(),\n }),\n metrics: z\n .object({\n predict_time: z.number().nullish(),\n })\n .nullish(),\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type ReplicateVideoModelOptions = {\n // Polling configuration\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n maxWaitTimeInSeconds?: number | null;\n\n // Common video generation options\n guidance_scale?: number | null;\n num_inference_steps?: number | null;\n\n // Stable Video Diffusion specific\n motion_bucket_id?: number | null;\n cond_aug?: number | null;\n decoding_t?: number | null;\n video_length?: string | null;\n sizing_strategy?: string | null;\n frames_per_second?: number | null;\n\n // MiniMax specific\n prompt_optimizer?: boolean | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nexport const replicateVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n maxWaitTimeInSeconds: z.number().positive().nullish(),\n guidance_scale: z.number().nullish(),\n num_inference_steps: z.number().nullish(),\n motion_bucket_id: z.number().nullish(),\n cond_aug: z.number().nullish(),\n decoding_t: z.number().nullish(),\n video_length: z.string().nullish(),\n sizing_strategy: z.string().nullish(),\n frames_per_second: z.number().nullish(),\n prompt_optimizer: z.boolean().nullish(),\n })\n .loose(),\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":["z","z","completedPrediction","z","combineHeaders","convertImageModelFileToDataUri","createJsonResponseHandler","getFromApi","parseProviderOptions","postJsonToApi","resolve","z","lazySchema","zodSchema","z","parseProviderOptions","convertImageModelFileToDataUri","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","getFromApi","z"]}
|
package/docs/60-replicate.mdx
CHANGED
|
@@ -257,6 +257,8 @@ const { images } = await generateImage({
|
|
|
257
257
|
Common provider options for image generation:
|
|
258
258
|
|
|
259
259
|
- **maxWaitTimeInSeconds** _number_ - Maximum time in seconds to wait for the prediction to complete in sync mode. By default, Replicate uses [sync mode](https://replicate.com/docs/topics/predictions/create-a-prediction#timeout-duration) with a 60-second timeout. Set to a positive number to use a custom duration (e.g., `120` for 2 minutes). When not specified, uses the default 60-second wait.
|
|
260
|
+
- **pollIntervalMillis** _number_ - Interval in milliseconds between polling attempts when a prediction does not complete within the synchronous wait duration. Defaults to 500 milliseconds.
|
|
261
|
+
- **maxPollAttempts** _number_ - Maximum number of polling attempts before giving up. Defaults to 240 attempts.
|
|
260
262
|
- **guidance_scale** _number_ - Guidance scale for classifier-free guidance. Higher values make the output more closely match the prompt.
|
|
261
263
|
- **num_inference_steps** _number_ - Number of denoising steps. More steps = higher quality but slower.
|
|
262
264
|
- **negative_prompt** _string_ - Negative prompt to guide what to avoid in the generation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/replicate",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.45",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ai-sdk/provider": "4.0.
|
|
33
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
32
|
+
"@ai-sdk/provider": "4.0.17",
|
|
33
|
+
"@ai-sdk/provider-utils": "5.0.44"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@ai-sdk/test-server": "2.0.1",
|
|
@@ -24,6 +24,19 @@ export const replicateImageModelOptionsSchema = lazySchema(() =>
|
|
|
24
24
|
*/
|
|
25
25
|
maxWaitTimeInSeconds: z.number().positive().nullish(),
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Interval in milliseconds between polling attempts when the prediction
|
|
29
|
+
* does not complete within the synchronous wait duration.
|
|
30
|
+
* Defaults to 500 milliseconds.
|
|
31
|
+
*/
|
|
32
|
+
pollIntervalMillis: z.number().int().positive().nullish(),
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Maximum number of polling attempts before giving up.
|
|
36
|
+
* Defaults to 240 attempts.
|
|
37
|
+
*/
|
|
38
|
+
maxPollAttempts: z.number().int().positive().nullish(),
|
|
39
|
+
|
|
27
40
|
/**
|
|
28
41
|
* Guidance scale for classifier-free guidance.
|
|
29
42
|
* Higher values make the output more closely match the prompt.
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
InvalidResponseDataError,
|
|
3
|
+
type ImageModelV4,
|
|
4
|
+
type SharedV4Warning,
|
|
5
|
+
} from '@ai-sdk/provider';
|
|
2
6
|
import {
|
|
3
7
|
combineHeaders,
|
|
4
8
|
convertImageModelFileToDataUri,
|
|
5
9
|
createBinaryResponseHandler,
|
|
6
10
|
createJsonResponseHandler,
|
|
11
|
+
delay,
|
|
7
12
|
getFromApi,
|
|
8
13
|
parseProviderOptions,
|
|
9
14
|
postJsonToApi,
|
|
@@ -19,6 +24,9 @@ import { replicateFailedResponseHandler } from './replicate-error';
|
|
|
19
24
|
import { replicateImageModelOptionsSchema } from './replicate-image-model-options';
|
|
20
25
|
import type { ReplicateImageModelId } from './replicate-image-settings';
|
|
21
26
|
|
|
27
|
+
const DEFAULT_POLL_INTERVAL_MILLIS = 500;
|
|
28
|
+
const DEFAULT_MAX_POLL_ATTEMPTS = 240;
|
|
29
|
+
|
|
22
30
|
interface ReplicateImageModelConfig {
|
|
23
31
|
provider: string;
|
|
24
32
|
baseURL: string;
|
|
@@ -142,7 +150,12 @@ export class ReplicateImageModel implements ImageModelV4 {
|
|
|
142
150
|
}
|
|
143
151
|
|
|
144
152
|
// Extract maxWaitTimeInSeconds from provider options and prepare the rest for the request body
|
|
145
|
-
const {
|
|
153
|
+
const {
|
|
154
|
+
maxWaitTimeInSeconds,
|
|
155
|
+
pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS,
|
|
156
|
+
maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS,
|
|
157
|
+
...inputOptions
|
|
158
|
+
} = replicateOptions ?? {};
|
|
146
159
|
|
|
147
160
|
// Build the prefer header based on maxWaitTimeInSeconds:
|
|
148
161
|
// - undefined/null: use default sync wait (prefer: wait)
|
|
@@ -152,21 +165,18 @@ export class ReplicateImageModel implements ImageModelV4 {
|
|
|
152
165
|
? { prefer: `wait=${maxWaitTimeInSeconds}` }
|
|
153
166
|
: { prefer: 'wait' };
|
|
154
167
|
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
168
|
+
const resolvedHeaders = this.config.headers
|
|
169
|
+
? await resolve(this.config.headers)
|
|
170
|
+
: undefined;
|
|
171
|
+
|
|
172
|
+
const { value: initialPrediction, responseHeaders } = await postJsonToApi({
|
|
159
173
|
url:
|
|
160
174
|
// different endpoints for versioned vs unversioned models:
|
|
161
175
|
version != null
|
|
162
176
|
? `${this.config.baseURL}/predictions`
|
|
163
177
|
: `${this.config.baseURL}/models/${modelId}/predictions`,
|
|
164
178
|
|
|
165
|
-
headers: combineHeaders(
|
|
166
|
-
this.config.headers ? await resolve(this.config.headers) : undefined,
|
|
167
|
-
headers,
|
|
168
|
-
preferHeader,
|
|
169
|
-
),
|
|
179
|
+
headers: combineHeaders(resolvedHeaders, headers, preferHeader),
|
|
170
180
|
|
|
171
181
|
body: {
|
|
172
182
|
input: {
|
|
@@ -191,8 +201,25 @@ export class ReplicateImageModel implements ImageModelV4 {
|
|
|
191
201
|
fetch: this.config.fetch,
|
|
192
202
|
});
|
|
193
203
|
|
|
204
|
+
const prediction = await this.pollPrediction({
|
|
205
|
+
prediction: initialPrediction,
|
|
206
|
+
headers: combineHeaders(resolvedHeaders, headers),
|
|
207
|
+
pollIntervalMillis: pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS,
|
|
208
|
+
maxPollAttempts: maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS,
|
|
209
|
+
abortSignal,
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
if (prediction.output == null) {
|
|
213
|
+
throw new InvalidResponseDataError({
|
|
214
|
+
data: prediction,
|
|
215
|
+
message: 'Replicate image generation completed without output.',
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
194
219
|
// download the images:
|
|
195
|
-
const outputArray = Array.isArray(output)
|
|
220
|
+
const outputArray = Array.isArray(prediction.output)
|
|
221
|
+
? prediction.output
|
|
222
|
+
: [prediction.output];
|
|
196
223
|
const images = await Promise.all(
|
|
197
224
|
outputArray.map(async url => {
|
|
198
225
|
const { value: image } = await getFromApi({
|
|
@@ -219,8 +246,82 @@ export class ReplicateImageModel implements ImageModelV4 {
|
|
|
219
246
|
},
|
|
220
247
|
};
|
|
221
248
|
}
|
|
249
|
+
|
|
250
|
+
private async pollPrediction({
|
|
251
|
+
prediction,
|
|
252
|
+
headers,
|
|
253
|
+
pollIntervalMillis,
|
|
254
|
+
maxPollAttempts,
|
|
255
|
+
abortSignal,
|
|
256
|
+
}: {
|
|
257
|
+
prediction: ReplicateImagePrediction;
|
|
258
|
+
headers: Record<string, string | undefined>;
|
|
259
|
+
pollIntervalMillis: number;
|
|
260
|
+
maxPollAttempts: number;
|
|
261
|
+
abortSignal: AbortSignal | undefined;
|
|
262
|
+
}): Promise<ReplicateImagePrediction> {
|
|
263
|
+
let currentPrediction = prediction;
|
|
264
|
+
|
|
265
|
+
for (let i = 0; i < maxPollAttempts; i++) {
|
|
266
|
+
const completedPrediction =
|
|
267
|
+
this.getCompletedPrediction(currentPrediction);
|
|
268
|
+
if (completedPrediction != null) {
|
|
269
|
+
return completedPrediction;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const { value } = await getFromApi({
|
|
273
|
+
url: currentPrediction.urls.get,
|
|
274
|
+
validateUrl: true,
|
|
275
|
+
credentialedOrigin: this.config.baseURL,
|
|
276
|
+
trustedOrigin: this.config.baseURL,
|
|
277
|
+
headers,
|
|
278
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
279
|
+
replicateImageResponseSchema,
|
|
280
|
+
),
|
|
281
|
+
failedResponseHandler: replicateFailedResponseHandler,
|
|
282
|
+
abortSignal,
|
|
283
|
+
fetch: this.config.fetch,
|
|
284
|
+
});
|
|
285
|
+
currentPrediction = value;
|
|
286
|
+
|
|
287
|
+
if (i < maxPollAttempts - 1) {
|
|
288
|
+
await delay(pollIntervalMillis, { abortSignal });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const completedPrediction = this.getCompletedPrediction(currentPrediction);
|
|
293
|
+
if (completedPrediction != null) {
|
|
294
|
+
return completedPrediction;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
throw new Error(
|
|
298
|
+
`Replicate image generation did not complete after ${maxPollAttempts} polling attempts.`,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
private getCompletedPrediction(
|
|
303
|
+
prediction: ReplicateImagePrediction,
|
|
304
|
+
): ReplicateImagePrediction | undefined {
|
|
305
|
+
if (prediction.status === 'failed' || prediction.status === 'canceled') {
|
|
306
|
+
throw new InvalidResponseDataError({
|
|
307
|
+
data: prediction,
|
|
308
|
+
message: `Replicate image generation ${prediction.status}: ${prediction.error ?? 'Unknown error'}`,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (prediction.output != null || prediction.status === 'succeeded') {
|
|
313
|
+
return prediction;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
222
316
|
}
|
|
223
317
|
|
|
224
318
|
const replicateImageResponseSchema = z.object({
|
|
225
|
-
|
|
319
|
+
status: z.enum(['starting', 'processing', 'succeeded', 'failed', 'canceled']),
|
|
320
|
+
output: z.union([z.array(z.string()), z.string()]).nullish(),
|
|
321
|
+
error: z.string().nullish(),
|
|
322
|
+
urls: z.object({
|
|
323
|
+
get: z.string(),
|
|
324
|
+
}),
|
|
226
325
|
});
|
|
326
|
+
|
|
327
|
+
type ReplicateImagePrediction = z.infer<typeof replicateImageResponseSchema>;
|