"use strict"; const dotenv = require("dotenv"); const fs = require("fs").promises; const HfInference = require("@huggingface/inference").HfInference; dotenv.config(); const inference = new HfInference(process.env.HF_TOKEN); const REPO_NAME = "black-forest-labs/FLUX.1-schnell"; const IMAGE_SIZES = { square: { width: 1024, height: 1024, }, "portrait-3_4": { width: 768, height: 1024, }, "portrait-9_16": { width: 576, height: 1024, }, "landscape-4_3": { width: 1024, height: 768, }, "landscape-16_9": { width: 1024, height: 576, }, }; module.exports = async function (fastify, opts) { fastify.get("/:inputs", async function (request, reply) { let { inputs } = request.params; const { format } = request.query; if (format) { inputs = inputs + " " + format; } const slug = inputs.replace(/[^a-zA-Z0-9-_ ]/g, "").replace(/ /g, "-"); const file = await fs .readFile(process.env.PUBLIC_FILE_UPLOAD_DIR + "/" + slug + ".png") ?.catch(() => null); if (file) { return reply.header("Content-Type", "image/jpeg").send(file); } const { height, width } = IMAGE_SIZES[format ?? "square"] ?? IMAGE_SIZES["square"]; const hfRequest = await inference.textToImage({ inputs, model: REPO_NAME, parameters: { height, width, }, }); const buffer = await hfRequest.arrayBuffer(); const array = new Uint8Array(buffer); const dir = await fs .opendir(process.env.PUBLIC_FILE_UPLOAD_DIR) .catch(() => null); if (!dir) await fs.mkdir(process.env.PUBLIC_FILE_UPLOAD_DIR); await fs.writeFile( process.env.PUBLIC_FILE_UPLOAD_DIR + "/" + slug + ".png", array ); return reply.header("Content-Type", "image/jpeg").send(array); }); };