Criar uma api em nodejs para integrar com a api do dalle2

Fiz uma implementação que utiliza apenas a API fetch. Esta api é  fornecida nativamente a partir do nodejs 18.x.x. Você pode tentar executar este código tendo como dependências do seu projeto apenas a lib express e a lib dotenv e nodemon.

Por motivos de simplificação fiz este código em um único arquivo afim de facilitar o entendimento do projeto, você pode baixar uma versão modular deste mesmo desenvolvimento no github, o link se encontra no final da postagem.

Um exemplo de implementação, é o seguinte:

require('dotenv').config();
const express = require('express');
const cors = require('cors');

const app = express();
app.use(cors());
app.use(express.json());

app.post('/', async (req, res) => {
    try {
        const url = 'https://api.openai.com/v1/images/generations';
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${process.env.APIKEY}`,
            },
            body: JSON.stringify({
                prompt: "A cute baby sea otter",
                n: 2,
                size: "1024x1024"
            })
        });
        const resposta = await response.json();
        res.status(200).json({ message: resposta.data }) //aqui está o seu array com as urls das imagens
    } catch (error) {
        res.status(500).json({
            message: error
        });
    };
});

Desta forma é possível fazer a chamada à api, as imagens geradas pelo DALLE estão na resposta da seguinte forma:

exemplo de resposta

{
	"message": [
		{
			"url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-C6MUT4TF9kyqxG6NdGXH0RHT/user-6MRefEqVTOZhtoxFiD8XQ5sC/img-l1QuVOniykCIs2OsQrNTW4u7.png?st=2022-12-15T12%3A45%3A40Z&se=2022-12-15T14%3A45%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-15T08%3A13%3A27Z&ske=2022-12-16T08%3A13%3A27Z&sks=b&skv=2021-08-06&sig=w1oE1nVMtOmZD0a6YO/QRwfOPZ6c6NfE6BqYfDVQWqQ%3D"
		},
		{
			"url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-C6MUT4TF9kyqxG6NdGXH0RHT/user-6MRefEqVTOZhtoxFiD8XQ5sC/img-udkOO8A2K3wNLp9AqOWQWaY4.png?st=2022-12-15T12%3A45%3A40Z&se=2022-12-15T14%3A45%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-15T08%3A13%3A27Z&ske=2022-12-16T08%3A13%3A27Z&sks=b&skv=2021-08-06&sig=lcp%2BKvS/zYUYrgsdj7a5xeRnrKnHVtfmxiKFKouOwjw%3D"
		}
	]
}

A requisição demorou cerca de 7s para retornar, e as imagens geradas foram estas, que você pode utilizar o link para acessar diretamente:

inserir a descrição da imagem aqui
inserir a descrição da imagem aqui

Se quiser uma versão modular deste mesmo projeto pode acessar diretamente em meu github.

Neste exemplo veja que o  body da nossa requisição está fixo, e sempre envia o mesmo texto para a API do dalle. Segue o destaque de onde isso está sendo feito.

const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${process.env.APIKEY}`,
        },
        body: JSON.stringify({
            prompt: "A cute baby sea otter",
            n: 2,
            size: "1024x1024"
       })
});

Neste caso podemos fazer uma pequena alteração em nosso serviço para que a gente possa enviar um texto junto com a requisição POST. E assim podemos substituir o texto que enviamos para a api do dalle.

const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${process.env.APIKEY}`,
        },
        body: JSON.stringify({
            prompt: req.body.frase,
            n: 2,
            size: "1024x1024"
        })
});

Agora ao fazer o envio de uma requisição para o nosso serviço, podemos passar a frase diretamente para o API REST , com essa modificação temos o seguinte resultado final:

const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${process.env.APIKEY}`,
        },
        body: JSON.stringify({
            prompt: req.body.frase,
            n: 2,
            size: "1024x1024"
        })
});

Então podemos fazer uma requisição no postman / curl para o nosso serviço passando uma frase.


Para implementar esta solução utilizei a documentação do dalle.