Utiliza la macro de ONLYOFFICE para rellenar las celdas con datos de OpenAI

22 febrero 2023By Sergey

La tecnología de IA ha hecho importantes avances y se ha convertido en una valiosa herramienta que puede automatizar nuestro flujo de trabajo. En nuestra entrada anterior, hablamos de la macro de ONLYOFFICE que puede generar ensayos usando la API de OpenAI. En esta entrada del blog, te mostraremos una macro que rellena una hoja de cálculo con datos obtenidos por OpenAI.

Utiliza la macro de ONLYOFFICE para rellenar las celdas con datos de OpenAI

Uso de la API de OpenAI

La última vez nos conectamos a la API de OpenAI a través de la plataforma RapidAPI. Es una forma rápida y cómoda de gestionar las solicitudes fetch. Sin embargo, el plan básico solo ofrece 100 solicitudes al mes. Así que, esta vez, vamos a hacerlo mejor y crear nuestro propio servidor Node.js Express. Utilizará la librería de OpenAI para servir las solicitudes de la API directamente al modelo de lenguaje apropiado. También nos permitirá evitar los errores CORS al realizar una solicitud fetch desde un navegador.

¡Ojo! Hacer solicitudes a OpenAI directamente solo está disponible tras registrar una cuenta de OpenAI y adquirir una clave de API personal.

Configuración de un servidor

En primer lugar, creamos una nueva carpeta para nuestro servidor y configuramos un nuevo proyecto Node.js mediante la ejecución del siguiente comando en el terminal:

$ npm init -y

A continuación, instalamos las siguientes dependencias:

  • Paquete express – es un framework esencial que facilita la funcionalidad del servidor.
  • Paquete cors – proporciona middleware para habilitar CORS.
  • Paquete openai – proporciona un cómodo acceso a la API de OpenAI desde Node.js.
  • Paquete dotenv – carga variables del entorno desde un archivo .env a process.env.

Para instalarlos, ejecutamos el comando npm install en el terminal:

$ npm install express
$ npm install openai
$ npm install dotenv --save
$ npm install cors

Después creamos el archivo .env. Allí almacenaremos nuestras claves API:

OPEN_AI_API_KEY="<YourOpenAIkey"
SECOND_API_KEY="YourAPIkey"

El parámetro OPEN_AI_API_KEY contiene tu clave API obtenida de OpenAI, y el parámetro SECOND_API_KEY es la clave API para nuestro servidor. La incorporaremos en la solicitud fetch entrante por medidas de seguridad.

A continuación inicializamos los paquetes instalados en el archivo index.js:

const express = require('express');
const cors = require('cors');
const { Configuration, OpenAIApi } = require('openai');
require('dotenv').config();
const app = express();

const openai = new OpenAIApi(configuration);
app.use(cors());
app.use(express.json());

Una solicitud correcta a OpenAI debe incluir la clave API de OpenAI. Para ello, extraemos esta clave API del archivo .env y la almacenamos en la variable de configuración:

const configuration = new Configuration({
  apiKey: process.env.OPEN_AI_API_KEY,
});

A continuación añadimos una ruta post desde la que enviaremos una solicitud a OpenAI:

app.post('/completion', async (req, res) => {
}

También queremos implementar nuestra clave API por medidas de seguridad. Esta segunda clave API debe incluirse en una solicitud fetch. En este sentido, nuestro servidor debe comprobar la solicitud fetch entrante y validar la clave API incluida. Para conseguirlo, añadimos el siguiente código a nuestra ruta:

app.post('/completion', async (req, res) => {
  const requestApiKey = req.body.apiKey;
  
  if (!requestApiKey) {
    res.status(400).send({ error: "Error: API Key is missing." });
    return;
  }
  if (requestApiKey !== process.env.SECOND_API_KEY) {
    res.status(401).send({ error: "Error: API Key is incorrect." });
    return;
  }

Si la clave API es correcta, enviamos una solicitud a OpenAI:

const completion = await openai.createCompletion({
    model: 'text-davinci-003',
    prompt: req.body.prompt,
    temperature: 0,
    max_tokens: 300,
  });
  res.json(completion.data.choices[0].text);
  • El parámetro model especifica el nombre del modelo de lenguaje que se utilizará para generar texto. En este caso, es text-davinci-003, que es el modelo más avanzado para la generación de texto.
  • El parámetro prompt especifica el texto o contexto a partir del cual el modelo de lenguaje generará el texto. Obtendremos este valor del cuerpo de la solicitud fetch.
  • El parámetro temperature controla la aleatoriedad del texto generado. Un valor de 0 significa que el texto es completamente determinista, mientras que valores más altos darán como resultado un texto más variado e inesperado.
  • El parámetro max-tokens indica la longitud máxima del texto generado en tokens (es decir, palabras o subpalabras).

Por último, configuramos nuestro servidor para que utilice el puerto 3000:

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

El código completo de index.js es el siguiente:

const express = require('express');
const cors = require('cors');
const { Configuration, OpenAIApi } = require('openai');
require('dotenv').config();
const app = express();
const configuration = new Configuration({
  apiKey: process.env.OPEN_AI_API_KEY,
});
const openai = new OpenAIApi(configuration);
app.use(cors());
app.use(express.json());
app.post('/completion', async (req, res) => {
  const requestApiKey = req.body.apiKey;
  
  if (!requestApiKey) {
    res.status(400).send({ error: "Error: API Key is missing." });
    return;
  }
  if (requestApiKey !== process.env.SECOND_API_KEY) {
    res.status(401).send({ error: "Error: API Key is incorrect." });
    return;
  }
  const completion = await openai.createCompletion({
    model: 'text-davinci-003',
    prompt: req.body.prompt,
    temperature: 0,
    max_tokens: 300,
  });
  res.json(completion.data.choices[0].text);
});
app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Creación de la macro

En primer lugar, hacemos una solicitud fetch a nuestro servidor:

fetch('http://<your_server_address>/completion', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
prompt: 'List the 10 wealthiest countries in the world. Provide GPT figures',
apiKey: '<YourAPIkey>'
})
})

Especificamos los valores prompt y apiKey en el cuerpo de la solicitud. Ten en cuenta que estos parámetros variarán en función de los datos que quieras recibir y de la clave API de tu servidor.

A continuación, analizamos la respuesta como datos JSON:

.then(response => response.json())

Dividimos el texto de respuesta por saltos de línea en una matriz de cadenas y apuntamos a la hoja de cálculo activa:

.then(data => {
var arrAllRows = data.split(/\r?\n|\r/);
var wSheet = Api.GetActiveSheet()

A continuación, creamos un bucle anidado que itera sobre las filas y columnas de la hoja de cálculo, utilizando la función split(). Utilizamos el método SetValue para rellenar cada celda con los datos de la respuesta y eliminar los espacios en blanco:

var i = 0;
var j = 0;
  for (var singleRow = 0; singleRow < arrAllRows.length; singleRow++) {
            var rowCells = arrAllRows[singleRow].split('-');
            for (var rowCell = 0; rowCell < rowCells.length; rowCell++) {
                wSheet.GetCells(i,j).SetValue(rowCells[rowCell].trim());
                j = j + 1;
            } 
            i = i + 1;
            j = 1;
        }

El código completo de la macro es el siguiente:

(function()
{
   fetch('http://<your_server_address>/completion', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
prompt: 'List the 10 wealthiest countries in the world. Provide GPT figures',
apiKey: 'dfhgsd63456efgdfhjikhfzf435332fdhd'
})
})
.then(response => response.json())
.then(data => {
var arrAllRows = data.split(/\r?\n|\r/);
var wSheet = Api.GetActiveSheet();
var i = 0;
var j = 0;
  for (var singleRow = 0; singleRow < arrAllRows.length; singleRow++) {
            var rowCells = arrAllRows[singleRow].split('-');
            for (var rowCell = 0; rowCell < rowCells.length; rowCell++) {
                wSheet.GetCells(i,j).SetValue(rowCells[rowCell].trim());
                j = j + 1;
            } 
            i = i + 1;
            j = 1;
        }
});
})();

Ahora vamos a abrir el editor de hojas de cálculo y a ejecutar nuestra macro:

Esperamos que utilices los conceptos mencionados en esta entrada del blog y hagas que tu flujo de trabajo sea más eficiente. Te invitamos a que aproveches las ventajas de nuestros distintos métodos API y los incorpores a tu rutina diaria.

Si tienes alguna pregunta o idea para compartir, no dudes en dejarnos tus comentarios o ponerte en contacto con nosotros. Estamos abiertos a escuchar tus ideas para colaborar contigo. Te deseamos mucha suerte en tus exploraciones.