| "use server"; | |
| import { HfInference } from "@huggingface/inference"; | |
| import fs from "fs/promises"; | |
| import { Form } from "@/_types"; | |
| import prisma from "@/_utils/prisma"; | |
| export async function generate({ brand_name, industry, description }: Form) { | |
| if (!process.env.PUBLIC_FILE_UPLOAD_DIR) { | |
| throw new Error("PUBLIC_FILE_UPLOAD_DIR is not set"); | |
| } | |
| const inference = new HfInference(process.env.HF_ACCESS_TOKEN, { | |
| use_cache: false, | |
| }); | |
| const prompt: any = await inference | |
| .chatCompletion({ | |
| model: "meta-llama/Meta-Llama-3.1-70B-Instruct", | |
| messages: [ | |
| { role: "user", content: "lee, a noodle restaurant" }, | |
| { | |
| role: "assistant", | |
| content: | |
| 'logo,Minimalist,A pair of chopsticks and a bowl of rice with the word "Lee",', | |
| }, | |
| { role: "user", content: "cat shop" }, | |
| { role: "assistant", content: "wablogo,Minimalist,Leaf and cat,logo," }, | |
| { role: "user", content: "Ato, real estate company" }, | |
| { | |
| role: "assistant", | |
| content: | |
| 'logo,Minimalist,A man stands in front of a door,his shadow forming the word "A",', | |
| }, | |
| { role: "user", content: `${brand_name}, ${description}, ${industry}` }, | |
| ], | |
| temperature: 0.5, | |
| max_tokens: 1024, | |
| top_p: 0.7, | |
| }) | |
| .then((res) => res) | |
| .catch((err) => { | |
| return { error: err.message }; | |
| }); | |
| if (prompt?.error) { | |
| return { | |
| error: prompt.error, | |
| }; | |
| } | |
| if (prompt?.choices[0]?.message?.content) { | |
| const hfRequest = await inference.textToImage({ | |
| inputs: prompt.choices[0].message.content, | |
| model: "Shakker-Labs/FLUX.1-dev-LoRA-Logo-Design", | |
| parameters: { | |
| num_inference_steps: 24, | |
| guidance_scale: 3.5, | |
| }, | |
| }); | |
| const buffer = await hfRequest.arrayBuffer(); | |
| const array = new Uint8Array(buffer); | |
| const newImage = await prisma.logo.create({ | |
| data: { | |
| name: prompt.choices[0].message.content, | |
| }, | |
| }); | |
| const indexFile = newImage.id; | |
| 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}/${indexFile}.png`, | |
| array | |
| ); | |
| return { data: indexFile }; | |
| } | |
| return { | |
| error: "Failed to generate logo", | |
| }; | |
| } | |