Разработка

Краткий пересказ сути google документа с переводом на нужный язык

Олег Заньков
October 4, 2023

Мы сделаем цепочку которая позволит выдавать краткую суть документа на нужном язык.
Важно! У API ChatGPT есть ограничение на 4000+ знаков, большие документы не получиться обрабатывать, максимум примерно одну страницу стандартного текстового документа.

Подготовка

Вначале как всегда убедимся что у нас есть всё что нам потребуется для создания цепочки: аккаунт на ChatGPT и Personal key от него, так же аккаунт Google и так же его токен;

В Nodul не так давно уже добавили интеграции со многими сервисами, пока именно документов ещё не реализовано, но скоро уже должны и его подтянуть. Так что пока получим токен старым способом по инструкции в нашей статье, только в списке выбрать "Google Docs API v..." scope "https://www.googleapis.com/auth/documents";

Personal key в ChatGPT можно посмотреть или создать здесь в настройках профиля:

Personal key в настройках аккаунта ChatGPT

Создание цепочки в Nodul

Первым делом как всегда создаём узел: "+ Добавить узел" => "Http" => "Webhook";

Скопируем сразу его адрес;

Сохраните изменения;

Подготовим предварительно так же запрос для rest клиента(Postman, Insomnia):

REQ для rest клиента:


  curl --request POST \
  --url https://webhook.nodul.ru/69/dev/8b8b0b68-df1f-45ab-b1a3-94baf3a0626d
  --header 'Content-Type: application/x-www-form-urlencoded'
  --data 'personalTokenChatGPT=Ваш токен ChatGPT'
  --data 'googleDocToken=Ваш google токен'
  --data 'docID=ID нужного google документа'
  --data 'language=английский'

Поменяйте ссылку на Webhook на вашу;
Далее подставим в personalTokenChatGPT свой ключ от ChatGPT;
Следующим подставим в googleDocToken свой токен от Google Doc;

Поменяем docID на ID нужного документа, его можно взять из адресной строки;

Если нужно можно поменять язык перевода в параметре language;

Следующим добавим узел "HTTP request" для получения содержимого документа: "+ Добавить узел" => "Http" => "HTTP request";

Сохраняем;
Свяжем узлы вместе;
Запустим и вызовем цепочку для передачи данных между узлами;

Сформируем поле "Url": в начало подставим адрес "https://docs.googleapis.com/v1/documents/", после него укажем параметр body.docID из "Webhook" узла;

Проверим что метод выбран по умолчанию "GET";

В Заголовках добавим два:

  • Content-Type с значением: application/json
  • Authorization в значении введём Bearer, после выберем параметр из "Webhook" узла с названием: body.googleDocToken

Сохраним изменения;

Свяжем узлы вместе;
Запустим и вызовем цепочку для передачи данных между узлами;

Следующим добавим узел "JavaScript" для получения содержимого документа: "+ Добавить узел" => "Code" => "JavaScript";

Вставим в него содержимое из блока ниже:


  const responseResult = JSON.parse(data["{{2.body.body.content}}"]);
  let docText = "";

  function parseResponse(response) {
     const tempArray = [];
     if (typeof response !== String) {
        tempArray.push(...response);
     } else {
        tempArray.push(JSON.parse(...response));
     }
     Array.isArray(response)
          ? response.forEach(
              (arrayItem) => { 
                 if (arrayItem.paragraph) {
                    arrayItem.paragraph.elements.forEach(paragraphItem => {
                       docText += `${paragraphItem.textRun.content}`;
                    });
                 }
              }
           )
          : Object.fromEntries(
              Object.entries(response)
                  .map(([objectItemKey, objectItemValue]) => [objectItemKey, parseResponse(objectItemValue, s)]));
  }
  parseResponse(responseResult);
  const resultRawJSON = JSON.stringify({
    "model":"text-davinci-003",
    "prompt":`Напиши краткий пересказ основной сути текста на ${data["{{1.body.language}}"]}: ${docText}`,
    "temperature":0,
    "max_tokens":1400
  });
  return {
     resultRawJSON
  }

Сохраняем;
Свяжем узлы вместе;
Запустим и вызовем цепочку для передачи данных между узлами;

Откроем снова настройки узла "JavaScript";

Проверим во всех конструкциях вида "data["{{2.body.body.content}}"]" и "data["{{2.body.body.content}}"]" что номер узлов соответствует тем от которых получаем данные, если нет заменим на нужные(напомню что 1 это номер узла который написан сразу под узлом над названием типа узла, далее если это запрос то выбирается поле объекта отвечающее за тип переданных/полученных данных - body для форм или query для query параметров);

Если были изменения сохраним их;

Добавим теперь ещё один "Http request": "+ Добавить узел" => "Http" => "HTTP request";

Сохраняем;
Свяжем узлы вместе;
Запустим и вызовем цепочку для передачи данных между узлами;

Сформируем поле "Url": в начало подставим адрес "https://api.openai.com/v1/completions";

Поменяем метод запроса на "POST";

У тела в "raw": подставим переменную resultRawJSON из предыдущего "JavaScript" узла;

В Заголовках добавим два:

  • Content-Type с значением: application/json
  • Authorization в значении введём Bearer, после выберем параметр из "Webhook" узла с названием: body.personalTokenChatGPT

Сохраним изменения;

В конце чтобы вернуть полученный текст от ChatGPT добавим узел "Webhook response":"+ Добавить узел" => "Http" => "Webhook response";

Сохраняем;
Свяжем узлы вместе;
Запустим и вызовем цепочку для передачи данных между узлами;

Подставим в ответ готовый вариант если был успешный ответ из предыдущего запроса body.choices.[0].text:

Запустим полную цепочку и вызовем её;

После в ответе нам должен вернутся краткий пересказ документа на английском языке;

Готовая цепочка будет выглядеть в конце так;

Спасибо за внимание, увидимся в новых статьях!😉

Ссылки:

Основные:

Nodl

ChatGPT

ChatGPT API Key

Информация:  

ChatGPT API Documentation

Google API Documentation

Другие статьи