Prépare la payload, exécute le modèle Flux 1.1 Pro et écris l’image WebP en Node. Maîtrise Replicate, buffer base64 et gestion de fichiers TypeScript.
On construit d’abord l’objet input.
Il contient tous les paramètres attendus par le modèle.
But : rester explicite pour éviter les erreurs côté Replicate.
1const input = {2prompt: prompt, // ^? Le texte descriptif fourni par l'utilisateur3aspect_ratio: "1:1", // Image carrée4output_format: "webp", // Format compressé, idéal pour le web5output_quality: 80, // Qualité visuelle vs poids du fichier6safety_tolerance: 2, // Filtre de contenu7prompt_upsampling: true, // Upscale léger automatique8}
prompt vient du schéma Zod GenerateImageSchema. On est donc déjà type-safe.
On appelle ensuite replicate.run.
Le modèle black-forest-labs/flux-1.1-pro génère l’image à partir du prompt.
1const output = await replicate.run(2"black-forest-labs/flux-1.1-pro", // nom complet du modèle3{ input }, // payload définie plus haut4)
replicate.run renvoie ici un binaire encodé en base64.
Pour plus de détails sur replicate.run, voir la doc officielle :
Replicate API reference
Dernière étape :
Buffer.images.1import { randomBytes } from "crypto"2import { join } from "path"3import { writeFile } from "fs/promises"45// 1. nom de fichier aléatoire6const filenameHash = randomBytes(8).toString("hex")78// 2. chemin complet vers /images/<hash>.jpg (resté .jpg pour compat.)9const filePath = join(process.cwd(), "images", `${filenameHash}.jpg`)1011// 3. conversion base64 -> Buffer puis écriture disque12const outputBuffer = Buffer.from(output.toString(), "base64")13await writeFile(filePath, outputBuffer)
Pourquoi pas directement .webp ?
Le format final dépend du header output_format, mais l’extension peut rester .jpg.
Le serveur pourra préciser le Content-Type correct lors du download.
input → paramètres clairs pour le modèle.replicate.run → récupère un binaire base64.Cette fonction est prête à être branchée sur ta route Hono protégée par middleware auth :
génère, décompte un crédit, persiste l’image, c’est tout.
Testez vos connaissances avec 4 questions
Quel est le rôle principal de l’objet "input" que l’on construit avant d’appeler replicate.run ?
Quelle est la nature exacte de la valeur renvoyée par la fonction replicate.run dans cet exemple ?
Pourquoi crée-t-on un nom de fichier aléatoire via randomBytes avant d’écrire l’image sur disque ?
L’extension du fichier enregistré est « .jpg » alors que le header output_format vaut « webp ». Quelle est la raison avancée ?