OpenAI API Example in NodeJS
Tags: openai, node, tutorial, beginners
Published: 2023-02-02 17:55:05

Back in November, OpenAI [announced](https://openai.com/blog/dall-e-api-now-available-in-public-beta/) that developers can begin building apps with the DALL·E API. I wanted to play around with it, so I made a simple CLI for it and wanted to share how easy it is to get started using their API.

(If you don't want to read the article and just want to see the final code, you can view that [here](https://github.com/jakeflavin/open-ai-example).)


## Prerequisites
- You must have NodeJS installed on your machine.
- You should already have an OpenAI account. If you do not have an account, you can use [this link to sign up](https://beta.openai.com/signup).


## Set Up
First lets set up a new NodeJS project for our CLI. OpenAI has conveniently made a library for us to use. We will be using that as well as Commander to help with making the CLI portion of that app. Our package.json looks like this:

```json
  "name": "open-ai-example",
  "version": "1.0.0",
  "description": "An example application that integrates with OpenAI API.",
  "main": "generate.js",
  "keywords": [],
  "author": "Jake Flavin",
  "license": "ISC",
  "dependencies": {
    "commander": "10.0.0",
    "openai": "3.1.0"
  }
}
```


## Using the OpenAI API
Next, lets create a folder called `api` and add a new file in it called `openai.js`. Your project structure should look like this: 

```
open-ai-example/
├── api/
│   ├── openai.js
└── package.json
```

The API for creating an image needs 5 params total, which includes your API key. You can find your API key in your OpenAI account settings. For this example, we will only be accepting 2 of the params as CLI argument and the rest will be hard coded. 

First, lets create a shell of a method that accepts the API key and a prompt.

```javascript
const { Configuration, OpenAIApi } = require("openai");

async function createImage (prompt, key) {
    return "";
}

module.exports = {
    createImage
}
```

Next, we will need to create and configure our `OpenAIApi` object. There are a few different configuration options available, but the only required item is the API key. Our plan is to accept the API key as a CLI argument, so we just need to make sure we pass that value along here.

```javascript
const { Configuration, OpenAIApi } = require("openai");

async function createImage (prompt, key) {
    const openai = new OpenAIApi(new Configuration({
        apiKey: key
    }));

    return "";
}

module.exports = {
    createImage
}
```

Now that we have our configuration ready, we can start to make use of the `createImage` method given to us. This method accepts a `createImageRequest` object. We will set the prompt via the input param and hard code the rest. 

```javascript
const { Configuration, OpenAIApi } = require("openai");

async function createImage (prompt, key) {
    const openai = new OpenAIApi(new Configuration({
        apiKey: key
    }));

    const response = await openai.createImage({
        prompt: prompt,
        n: 1, // number of images to generate, OpenAI charges per image generated
        size: "256x256", // this is the cheapest image size
        response_format: "b64_json" // the format we want the data returned
    })

    return "";
}

module.exports = {
    createImage
}
```

Finally, we want to return the image. We asked OpenAI for one image in base64 format, therefore we can pull out the base64 string and return it. 

```javascript
const { Configuration, OpenAIApi } = require("openai");

async function createImage (prompt, key) {
    const openai = new OpenAIApi(new Configuration({
        apiKey: key
    }));

    const response = await openai.createImage({
        prompt: prompt,
        n: 1, // number of images to generate, OpenAI charges per image generated
        size: "256x256", // this is the cheapest image size
        response_format: "b64_json" // the format we want the data returned
    })

    return response.data.data[0].b64_json;
}

module.exports = {
    createImage
}

```


## Putting the CLI Together
Next, we will create a new file that will be responsible for the CLI set up that will eventually call the `createImage` method we just created. Lets call that file `generate.js`. 

Your project structure should not look like this:

```
open-ai-example/
├── api/
│   ├── openai.js
├── generate.js
└── package.json
```

Now we can start setting up our CLI. We can name our program "generate". 

```javascript
const { Command } = require('commander');

const program = new Command();

program.name('generate')
    .description('CLI to generate products.')
    .version('1.0.0');

program.parse();
```

We can add a new command that will call our new `createImage` method. We will need to tell commander what arguments and options we want to accept. We want the `propmt` as the first argument and the API key as a option. 

```javascript
const { Command } = require('commander');
const openai = require("./api/openai");

const program = new Command();

program.name('generate')
    .description('CLI to generate products.')
    .version('1.0.0');

program.command('image')
    .description('Generate an Image (using OpenAI\'s DALL·E API)')
    .argument('<prompt>', 'The prompt to generate the image from.')
    .option('--key <key>', 'Your OpenAI API key.')
    .action(async (prompt, options) => {
        const base64Image = await openai.createImage(prompt, options.key);
        console.log(base64Image)
    });

program.parse();

```


We can now test by running our CLI. Make sure you use your own API key.

```shell
node generate.js image "cat in space" --key "<API_KEY>"

iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAAaGVYSWZNTQAqAAAACAACknwAAgAAACkAAAAmkoYAAgAAABgAAABQAAAAAE9wZW5BSS0tYTIxYmJmNTU0YjMxZTUwNDEzOGZiYTNjYmYzMDg5MDQAAE1hZGUgd2l0aCBPcGVuQUkgREFMTC1FAAuqeMkAAQAASURBVHgBACuB1H4BCwwU/Pv6BwcJ/v8B/Pv6/f/6AQD9BgUOCgoP9PXv//7+AgIGCwoQ+fr3/f36//35/P38AQEDAgMCBAIHBgcK9vb1BAUF/Pv7AQH//v39BAIIAgEF/QD+CwkWAQH+9Pbp//4AAAEADwwd8e72Cwkc//4HAgIG///7+fj0AQEHAP8IAgIK/v0GAwANAwAP/f4GAQAHAQIGAQAFAwAP/AD9Af8DAwEQAQEIEB0PPhcZCdwBHwwAQUcFFBr98+79/QD8AwIB6OH78PkBCgwRBPn8G0QJ2OTl7dX/AN78Dfv1HRIIyern8REA+e3z//j/FAADC/oGCAAA1/PW9RMW5/TRBvrp7/33CAIEEgcIAgP4AwYU4Pj7+wfuBwED//oBBAEK//X4HAkPJwIaBfwE+f8F7v0ICQUUIBIX6+fYBgL//f//7P397f4A+gEIAf8F8gAC6gIH/AAD+QP88gD39f/n/Pvn/gL5/wEABgME///7BgUD+/v3AP8F/wH9AAH//gEB+wD0+P3s/v/3BAIBCQgYAAEJ+frs/f75//79AQMECAYOAP79BgkF/f/3Awb/BgIL9PTq/gL0/f76+/z3BQQKBwcK///++vv7AP7+/f76/f/2AwIBAAECCggNAQAD+vr4/wD/BAYDBQQH/gABAP8ACgoM+Pn5+fr4/gH8/vz8Af8FBAMI9PbvDw8J+Pfz+/v5/Pr8BAYFAwQJDgsQ/Pr58vPrAQID///8/P76AwMFBAME+/r4AAAD/v/9CQkMAAH+9/b1BAUB/fz6///9AAADAAAB////AgICAAEA/v78AP8BAgICAAEB/v79/v7+AQICAQAAAgIDAAAB///+AP///wD/AP//AQEDAQEC//8A/wD9AgEDAgIB+vr5AQIA//8BAgEB/v/+AQICAP////8ABwYI/f/9AP//+/v6AAH/Af8AAAABBQQG/Pz6AQEBAgME//79/v8BAgMDAAD/AwIDAQMC/Pv6//8AFhUg7u/p/fz5AgEEBgcF+Pn2AQAA/fz8BPv7+AAAAfz8+v//BAQEBgD8/P///fz8+fLy7gAA/....
```

If you see a long base64 string be printed to the console, congrats! You have successfully used OpenAI's DALL·E API.

Finally, lets write the base64 string to the file system so we can see the image that is generated. We will add a new option for the file location with a default value.

```javascript
const { Command } = require('commander');
const openai = require("./api/openai");
const fs = require ("fs");

const program = new Command();

program.name('generate')
    .description('CLI to generate products.')
    .version('1.0.0');

program.command('image')
    .description('Generate an Image (using OpenAI\'s DALL·E API)')
    .argument('<prompt>', 'The prompt to generate the image from.')
    .option('--key <key>', 'Your OpenAI API key.')
    .option('--file', 'The file location you want the image to be placed.', 'image.png')
    .action(async (prompt, options) => {
        const base64Image = await openai.createImage(prompt, options.key);
        fs.writeFile(options.file, base64Image, {encoding: 'base64'}, function(err) {
            console.log('File created.');
        });
    });

program.parse();

```

Now we can re-run the same command and we should see a new image be created on the file system. 

```shell
node generate.js image "cat in space" --key "<API_KEY>"
File created.

```


This is the image that was generated with this prompt. I might print it and frame it.

![Image of a cat in space that was generated by Open AI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h0ssjavejh4734qle2ei.png)

You can view the final result [here in my github repo](https://github.com/jakeflavin/open-ai-example). Let me know what you think!

done;