@@ -18,7 +18,9 @@ import { InferenceClientProviderOutputError } from "../errors.js";
1818import { isUrl } from "../lib/isUrl.js" ;
1919import type { BodyParams , HeaderParams , UrlParams } from "../types.js" ;
2020import { omit } from "../utils/omit.js" ;
21- import { TaskProviderHelper , type TextToImageTaskHelper , type TextToVideoTaskHelper } from "./providerHelper.js" ;
21+ import { TaskProviderHelper , type ImageToImageTaskHelper , type TextToImageTaskHelper , type TextToVideoTaskHelper } from "./providerHelper.js" ;
22+ import type { ImageToImageArgs } from "../tasks/cv/imageToImage.js" ;
23+ import { base64FromBytes } from "../utils/base64FromBytes.js" ;
2224export interface ReplicateOutput {
2325 output ?: string | string [ ] ;
2426}
@@ -152,3 +154,65 @@ export class ReplicateTextToVideoTask extends ReplicateTask implements TextToVid
152154 throw new InferenceClientProviderOutputError ( "Received malformed response from Replicate text-to-video API" ) ;
153155 }
154156}
157+
158+ export class ReplicateImageToImageTask extends ReplicateTask implements ImageToImageTaskHelper {
159+ override preparePayload ( params : BodyParams ) : Record < string , unknown > {
160+ const inputs = params . args . inputs as Blob ;
161+ const parameters = params . args . parameters as Record < string , unknown > | undefined ;
162+
163+ return {
164+ input : {
165+ ...omit ( params . args , [ "inputs" , "parameters" ] ) ,
166+ ...( parameters || { } ) ,
167+ prompt : parameters ?. prompt || "" ,
168+ image : inputs , // This will be processed in preparePayloadAsync
169+ } ,
170+ version : params . model . includes ( ":" ) ? params . model . split ( ":" ) [ 1 ] : undefined ,
171+ } ;
172+ }
173+
174+ async preparePayloadAsync ( args : ImageToImageArgs ) : Promise < import ( "../types.js" ) . RequestArgs > {
175+ const { inputs, parameters, ...restArgs } = args ;
176+
177+ // Convert Blob to base64 data URL
178+ const bytes = new Uint8Array ( await inputs . arrayBuffer ( ) ) ;
179+ const base64 = base64FromBytes ( bytes ) ;
180+ const imageInput = `data:${ inputs . type || "image/jpeg" } ;base64,${ base64 } ` ;
181+
182+ return {
183+ ...restArgs ,
184+ inputs : imageInput ,
185+ parameters : {
186+ ...parameters ,
187+ image : imageInput ,
188+ } ,
189+ } ;
190+ }
191+
192+ override async getResponse ( response : ReplicateOutput ) : Promise < Blob > {
193+ if (
194+ typeof response === "object" &&
195+ ! ! response &&
196+ "output" in response &&
197+ Array . isArray ( response . output ) &&
198+ response . output . length > 0 &&
199+ typeof response . output [ 0 ] === "string"
200+ ) {
201+ const urlResponse = await fetch ( response . output [ 0 ] ) ;
202+ return await urlResponse . blob ( ) ;
203+ }
204+
205+ if (
206+ typeof response === "object" &&
207+ ! ! response &&
208+ "output" in response &&
209+ typeof response . output === "string" &&
210+ isUrl ( response . output )
211+ ) {
212+ const urlResponse = await fetch ( response . output ) ;
213+ return await urlResponse . blob ( ) ;
214+ }
215+
216+ throw new InferenceClientProviderOutputError ( "Received malformed response from Replicate image-to-image API" ) ;
217+ }
218+ }
0 commit comments