File size: 1,843 Bytes
1a092fb
f4aba6e
1a092fb
 
ee22812
1a092fb
f4aba6e
 
 
 
 
1a092fb
ee22812
1a092fb
 
 
ee22812
 
1a092fb
 
ee22812
 
1a092fb
 
ee22812
 
1a092fb
 
ee22812
ccfda8f
1a092fb
 
 
 
f4aba6e
 
1a092fb
3a09171
 
 
 
 
f4aba6e
ee22812
 
1a092fb
 
 
ee22812
1a092fb
f4aba6e
 
1a092fb
 
ee22812
f4aba6e
 
 
ee22812
 
1a092fb
 
 
f4aba6e
 
 
 
1a092fb
 
 
 
 
 
 
 
f4aba6e
1a092fb
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"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);
  });
};