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 ?