Integrating Dall-E using Vanilla JS and Node.js: A Step-by-Step Guide

Introduction

DALL-E Image is a generative image model that can create images from text descriptions. It is based on the DALL-E model, which was released by OpenAI in January 2021. DALL-E Image uses a pre-trained VQ-VAE encoder to compress images into discrete codes, and then feeds them to a transformer decoder to generate images.

In this blog post, I will show you how to integrate DALL-E Image with vanilla JS and Node.js, so you can create your own web app that allows users to generate images from text. You will need the following:

Prerequisites

•  A DALL-E Image API key, which you can get from https://dall-e-image.openai.com/

•  A Node.js server, which will handle the requests to the DALL-E Image API and serve the static files

•  A vanilla JS client, which will send the text input to the server and display the generated images

Step 1: Install Dependencies

We’ll need a few libraries to handle the server and frontend. Install the required dependencies using npm:

npm install express body-parser axios

Step 2: Set up the Backend

First, we need to set up a simple Node.js server that will act as a proxy for the DALL-E Image API. We will use the Express framework and the Axios library for this. Create a new folder for your project.

Next, create a file called server.js and paste the following code:

// Import Express and Axios
const express = require('express');
const axios = require('axios');

// Create an Express app
const app = express();

// Define a port number
const port = 3000;

// Define a route for the DALL-E Image API
app.get('/dalle-image', async (req, res) => {
// Get the text input from the query string
const text = req.query.text;

// Check if the text is valid
if (!text) {
// Return an error message if not
res.status(400).send('Please provide a text input');
return;
}

// Define the DALL-E Image API URL
const url = 'https://dall-e-image.openai.com/v1/images:generate';

// Define the DALL-E Image API key
// Replace this with your own key
const key = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

// Define the DALL-E Image API parameters
const params = {
text: text,
num_images: 4,
diversity: 0.5,
truncation: 0.7,
size: [256, 256]
};

try {
// Make a POST request to the DALL-E Image API with Axios
const response = await axios.post(url, params, {
headers: {
'Authorization': `Bearer ${key}`
}
});

// Get the data from the response
const data = response.data;

// Check if the data is valid
if (!data || !data.images) {
// Return an error message if not
res.status(500).send('Something went wrong with the DALL-E Image API');
return;
}

// Return the data as JSON
res.json(data);
} catch (error) {
// Handle any errors
console.error(error);
res.status(500).send('Something went wrong with the server');
}
});

// Serve static files from the public folder
app.use(express.static('public'));

// Start listening on the port
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
});

This code defines a route for /dalle-image, which takes a text input from the query string and sends it to the DALL-E Image API with Axios. It then returns the data from the API as JSON, or an error message if something goes wrong.

You also need to replace the key variable with your own DALL-E Image API key, which you can get from https://dall-e-image.openai.com/.

Step 3: Set up the FrontEnd

Next, we need to set up a simple vanilla JS client that will send the text input to the server and display the generated images. Create a new folder called public inside your project folder and create two files inside it: index.html and script.js.
Paste the following code into index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DALL-E Image Demo</title>
<style>
/* Add some basic styles */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}

h1 {
text-align: center;
}

form {
display: flex;
flex-direction: column;
align-items: center;
}

input {
width: 80%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
}

button {
width: 20%;
padding: 10px;
margin-top: 10px;
border: none;
border-radius: 5px;
background-color: #0078d4;
color: white;
cursor: pointer;
}

.images {
display: flex;
flex-wrap: wrap;
justify-content: center;
margin-top: 20px;
}


.image {
width: 256px;
height: 256px;
margin: 10px;
}
</style>
</head>
<body>
<h1>DALL-E Image Demo</h1>
<form id="form">
<input id="input" type="text" placeholder="Enter a text description" required>
<button id="button" type="submit">Generate</button>
</form>
<div id="images" class="images"></div>
<!-- Load the script.js file -->
<script src="script.js"></script>
</body>
</html>

This code defines a simple HTML structure with a form, an input, a button and a div for the images. It also adds some basic styles and loads the script.js file.

Paste the following code into script.js:

// Get the elements from the document
const form = document.getElementById('form');
const input = document.getElementById('input');
const button = document.getElementById('button');
const images = document.getElementById('images');


// Add an event listener for the form submission
form.addEventListener('submit', async (event) => {
// Prevent the default behavior of the form
event.preventDefault();


// Get the text input from the input element
const text = input.value;


// Check if the text is valid
if (!text) {
// Alert the user if not
alert('Please enter a text description');
return;
}


// Disable the button and clear the images div
button.disabled = true;
images.innerHTML = '';


try {
// Define the server URL
const url = '/dalle-image';


// Define the query string parameters
const params = new URLSearchParams({ text });


// Make a GET request to the server with fetch
const response = await fetch(`${url}?${params}`);


// Check if the response is ok
if (!response.ok) {
// Throw an error if not
throw new Error(`Something went wrong with the server (${response.status})`);
}


// Get the data from the response as JSON
const data = await response.json();


// Check if the data is valid
if (!data || !data.images) {
// Throw an error if not
throw new Error('Something went wrong with the DALL-E Image API');
}


// Loop through the images array in the data
for (const image of data.images) {
// Create a new image element
const img = document.createElement('img');


// Set the src attribute to the image data URL
img.src = image.data;


// Set the class attribute to 'image'
img.className = 'image';


// Append the image element to the images div
images.appendChild(img);
}
} catch (error) {
// Handle any errors
console.error(error);
alert(error.message);
} finally {
// Enable the button again
button.disabled = false;
}
});

This code adds an event listener for the form submission, which gets the text input from the input element and sends it to the server with fetch. It then gets the data from the server as JSON and loops through the images array in the data. For each image, it creates a new image element and sets its src attribute to the image data URL. It then appends the image element to the images div. It also handles any errors and enables or disables the button accordingly.

Conclusion

In this blog post, we have learned how to integrate DALL-E Image with vanilla JS and Node.js, using the Express framework and the Axios library. We have created a simple web app that allows users to generate images from text descriptions, using the DALL-E Image API. We have also seen how to handle the requests and responses from the API, and how to display the generated images on the web page. We hope you enjoyed this tutorial and learned something new. Feel free to experiment with different text inputs and see what kind of images you can create with DALL-E Image. Have fun!

#AI #ChatGPT #Dall-E