import fetch from "node-fetch"; import express from 'express'; import { Readable } from "stream"; import sharp from "sharp"; import * as config from '../config.js'; import { FluxSchnell } from '../lib/@randydev/flux-1-schnell.js'; import { authenticateApiKey, apiLimiter } from '../middleware/midware.js'; const FluxRoutes = express.Router(); /** * @param {string} args - The input string */ async function schellwithflux(args) { const EncodeBaseUrl = "aHR0cHM6Ly9hcGktaW5mZXJlbmNlLmh1Z2dpbmdmYWNlLmNvL21vZGVscy9ibGFjay1mb3Jlc3QtbGFicy9GTFVYLjEtc2NobmVsbA=="; try { const response = await fetch(atob(EncodeBaseUrl), { method: "POST", headers: { "Authorization": `Bearer ${config.HUGGING_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ inputs: args }), }); if (!response.ok) { console.error(`API Error: ${response.status}`); return null; } return await response.arrayBuffer(); } catch (error) { console.error("Error fetching data:", error.message); return null; } } /** * @swagger * /api/v1/flux/black-forest-labs/flux-1-schnell: * get: * summary: black forest labs * tags: [FLUX] * parameters: * - in: query * name: query * required: true * description: User's input query * schema: * type: string * example: "A beautiful sunset over the mountains" * - in: header * name: x-api-key * required: true * description: API key for authentication * schema: * type: string * example: "lu api key di @aknuserbot telegram" * responses: * 200: * description: Success */ FluxRoutes.get('/api/v1/flux/black-forest-labs/flux-1-schnell', authenticateApiKey, apiLimiter, async (req, res) => { try { const query = req.query.query; const result = await FluxSchnell(query); const imageBytes = Buffer.from(result, "base64"); const processedImage = await sharp(imageBytes).jpeg().toBuffer(); res.set("Content-Type", "image/jpeg"); Readable.from(processedImage).pipe(res); } catch (error) { res.status(401).json({ error: error.message }); } }); /** * @swagger * /api/v1/flux/fluxai-ai: * post: * summary: Generate an image using Flux AI. * tags: [FLUX] * description: This endpoint interacts with Flux AI to generate an image based on the query. * requestBody: * required: true * content: * application/json: * schema: * type: object * required: * - query * properties: * query: * type: string * description: The input query for image generation. * example: "A beautiful sunset over the mountains" * parameters: * - in: header * name: x-api-key * required: true * description: API key for authentication. * schema: * type: string * example: "lu api key di @aknuserbot telegram" * responses: * 200: * description: A successfully processed image. * content: * image/jpeg: * schema: * type: string * format: binary * 400: * description: Missing query parameter. * content: * application/json: * schema: * type: object * properties: * error: * type: string * example: "Query parameter is missing" * 500: * description: Internal server error. * content: * application/json: * schema: * type: object * properties: * error: * type: string * example: "Internal server error" */ FluxRoutes.post("/api/v1/flux/fluxai-ai", authenticateApiKey, apiLimiter, async (req, res) => { try { const { query } = req.body; if (!query) { return res.status(400).json({ error: "Query parameter is missing" }); } const imageBytes = await schellwithflux(query); if (!imageBytes) { return res.status(500).json({ error: "Failed to fetch image bytes" }); } const buffer = Buffer.isBuffer(imageBytes) ? imageBytes : Buffer.from(imageBytes); const processedImage = await sharp(buffer).jpeg().toBuffer(); res.set("Content-Type", "image/jpeg"); Readable.from(processedImage).pipe(res); } catch (error) { console.error("Error processing image:", error.message); res.status(500).json({ error: "Internal server error" }); } }); export { FluxRoutes };