Usa la macro ONLYOFFICE per popolare le celle con i dati da OpenAI

27 febbraio 2023By Elena

La tecnologia AI ha fatto progressi significativi ed è diventata uno strumento importante in grado di automatizzare il nostro flusso di lavoro. Nel nostro post precedente, abbiamo parlato della macro ONLYOFFICE che può generare testi utilizzando l’API OpenAI. In questo post, ti mostreremo una macro che popola un foglio di calcolo con i dati ottenuti da OpenAI. Use ONLYOFFICE macro to populate cells with OpenAI data

Utilizzo di OpenAI API

L’ultima volta ci siamo collegati all’API di OpenAI tramite la piattaforma RapidAPI. È un modo rapido e conveniente per mediare le richieste di recupero. Tuttavia, il piano base offre solo 100 richieste al mese. Stavolta, facciamo una prova e creeremo il nostro server Node.js Express. Utilizzerà la libreria OpenAI per servire le richieste API direttamente al modello linguistico appropriato. Ci consentirà inoltre di aggirare gli errori CORS quando effettuiamo una richiesta di recupero da un browser..

Nota! Effettuare richieste direttamente a OpenAI è disponibile solo registrando un account OpenAI e acquisendo una chiave API personale.

Configurazione di server

Innanzitutto, creiamo una nuova cartella per il nostro server e impostiamo un nuovo progetto Node.js eseguendo il comando:

$ npm init -y

Poi installiamo le dipendenze:

  • pacchetto express – è un framework essenziale che facilita la funzionalità del server.
  • pacchetto cors  – fornisce il middleware per abilitare CORS.
  • pacchetto openai – fornisce un comodo accesso all’API OpenAI da Node.js.
  • pacchetto dotenv – carica le variabili di ambiente da un file .env nel process.env.

Per installarli, esegui il comandonpm instal nel terminale:

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

Successivamente, creiamo il file .env. Memorizzeremo lì le nostre chiavi API:

OPEN_AI_API_KEY="<YourOpenAIkey"
SECOND_API_KEY="YourAPIkey"

Il parametro OPEN_AI_API_KEY contiene la chiave API ottenuta da OpenAI e il parametro SECOND_API_KEY è la chiave API per il nostro server. Lo incorporeremo nella richiesta di recupero in arrivo per le misure di sicurezza.

Poi inizializziamo i pacchetti installati nel file 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 richiesta di successo a OpenAI deve includere la chiave API OpenAI. Per fare ciò, estraiamo questa chiave API dal file .env e la memorizziamo nella variabile di configurazione:

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

Quindi aggiungiamo un post route da cui invieremo una richiesta a OpenAI:

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

Vogliamo anche implementare la nostra chiave API per le misure di sicurezza. Questa seconda chiave API dovrebbe essere inclusa in una richiesta di recupero. A tale proposito, il nostro server deve controllare la richiesta di recupero in entrata e convalidare la chiave API inclusa. Per ottenere ciò, aggiungiamo il seguente codice al nostro percorso:

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;
  }

Se la chiave API è corretta, inviamo una richiesta 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);
  • Il parametro model specifica il nome del modello di linguaggio da utilizzare per la generazione del testo. In questo caso si tratta di text-davinci-003, ovvero il modello più avanzato per la generazione di testi.
  • Il parametro prompt specifica il testo o il contesto per il modello di linguaggio da cui generare il testo. Otterremo questo valore dal corpo della richiesta di recupero.
  • Il parametro temperatura controlla la casualità del testo generato. Un valore pari a 0 indica che il testo è completamente deterministico, mentre valori più alti risulteranno in un testo più vario e inaspettato.
  • Il parametro max-tokens indica la lunghezza massima del testo generato in token (ovvero parole o sottotipi di parole).

Infine, abbiamo configurato il nostro server per l’ascolto sulla porta 3000:

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

L’intero codice index.js è il seguente:

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');
});

Costruzione della macro

Per prima cosa, facciamo una richiesta di recupero al nostro server:

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>'
})
})

Abbiamo specificato i valori prompt e apiKey nel corpo della richiesta. Tieni presente che questi parametri differiranno a seconda dei dati che desideri ricevere e della chiave API del tuo server.

Successivamente, analizziamo la risposta dati JSON:

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

Suddividiamo il testo della risposta per riga in un array di stringhe e scegliamo come target il foglio di calcolo attivo:

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

Successivamente, creiamo un ciclo nidificato che itera righe e sulle colonne del foglio di calcolo, utilizzando la funzione split(). Usiamo il metodo SetValue per popolare ogni cella con i dati della risposta e tagliarla di spazi bianchi:

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;
        }

L’intero codice della macro è il seguente:

(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;
        }
});
})();

Ora apriamo l’editor del foglio di calcolo ed eseguiamo la nostra macro!

Speriamo che utilizzerai i consigli visualizzati in questo post del blog e renderai il tuo flusso di lavoro più efficiente. Ti invitiamo di utilizzare i nostri vari metodi API e a incorporarli nelle tue attività quotidiane di routine.

Se hai domande o idee da condividere, sentiti libero di lasciare commenti o contattarci. Siamo aperti alle tue idee e vorremmo collaborare con te. Buona fortuna per le tue esplorazioni!