// ========================================== // SERVER WITH ENDPOINTS // ========================================== require('dotenv').config(); const express = require('express'); const app = express(); const port = process.env.PORT || 7860; const apiHandler = require('./apiHandler'); const bodyParser = require('body-parser'); const fs = require('fs'); // Middleware to parse JSON bodies app.use(bodyParser.json()); // Middleware to parse multipart/form-data for file uploads const multer = require('multer'); const upload = multer({ dest: 'uploads/' }); // ------------------------------------------ // Chat Completions Endpoint // ------------------------------------------ app.post('/chat/completions', (req, res) => { if (req.body.stream) { // For streaming, the apiHandler manages the response and error handling apiHandler.createChatCompletion(req.body, res); } else { // Non-streaming apiHandler .createChatCompletion(req.body) .then((data) => { res.json(data); }) .catch((error) => { res.status(500).json(error); }); } }); // ------------------------------------------ // Image Generation Endpoint // ------------------------------------------ app.post('/images/generations', async (req, res) => { try { const data = await apiHandler.createImage(req.body); res.json(data); } catch (error) { res.status(500).json(error); } }); // ------------------------------------------ // Image Editing Endpoint // ------------------------------------------ app.post('/images/edits', upload.fields([{ name: 'image' }, { name: 'mask' }]), async (req, res) => { try { // Add file paths to request body req.body.image = req.files['image'][0].path; req.body.mask = req.files['mask'][0].path; const data = await apiHandler.createImageEdit(req.body); res.json(data); // Clean up uploaded files fs.unlinkSync(req.body.image); fs.unlinkSync(req.body.mask); } catch (error) { res.status(500).json(error); } }); // ------------------------------------------ // Image Variations Endpoint // ------------------------------------------ app.post('/images/variations', upload.single('image'), async (req, res) => { try { // Add file path to request body req.body.image = req.file.path; const data = await apiHandler.createImageVariation(req.body); res.json(data); // Clean up uploaded file fs.unlinkSync(req.body.image); } catch (error) { res.status(500).json(error); } }); // ------------------------------------------ // Audio Transcription Endpoint // ------------------------------------------ app.post('/audio/transcriptions', upload.single('file'), async (req, res) => { try { // Add file path to request body req.body.file = req.file.path; const data = await apiHandler.createTranscription(req.body); res.json(data); // Clean up uploaded file fs.unlinkSync(req.body.file); } catch (error) { res.status(500).json(error); } }); // ------------------------------------------ // Text to Speech Endpoint // ------------------------------------------ app.post('/audio/speech', async (req, res) => { try { await apiHandler.createSpeech(req.body, res); } catch (error) { if (!res.headersSent) { res.status(500).json(error); } else { console.error('Error after headers sent:', error); } } }); // ------------------------------------------ // Vision Endpoint // ------------------------------------------ app.post('/vision', async (req, res) => { try { const data = await apiHandler.createVisionAnalysis(req.body); res.json(data); } catch (error) { res.status(500).json(error); } }); // ------------------------------------------ // Start the Server // ------------------------------------------ app.listen(port, () => { console.log(`Server running on port ${port}`); });