Перейти к содержанию

▍Личный ассистент

Запускаем личного ассистента на базе N8N в Docker Swarm

Вводная часть

Что нам понадобится для запуска:

  1. Установленный Docker или Docker Swarm
  2. Traefik + Домен и белый IP адрес
  3. Развёрнутый N8N
  4. Созданный бот в Telegram
  5. Пополненный баланс в OpenAI, т.к. без этого до API не достучаться. Какой-нибудь аналог платиру вам в помощь.

OpenAI Billing


Итак, приступим.

Сразу привяжем N8N к Telergam, OpenAI, Google Mail и Google Calendar.

Подключаем Telergam бота

Для этого перейдём слева в раздел Personal и вкладка Credentials, где нажмём на кнопку Add first credential

N8N Credentials

Набираем Telegram и в выпадающем списке выбираем нужную интеграцию N8N Credentials Telegram

Вводим полученный токен и сохраняем N8N Credentials Telegram

Если всё гуд, то должна появиться зелёная плашка N8N Credentials Telegram

Подключаем OpenAI API

Заходим на страницу https://platform.openai.com/api-keys, авторизуемся под своей учёткой и нажимаем на кнопку Create new secret key

N8N OpenAI API

Вводим произвольное имя в поле Name N8N OpenAI API

Копируем ключ N8N OpenAI API

и по аналогии с Telegram на вкладке Credentials вводим openai, и выбираем нужный пункт

N8N Credentials OpenAI API

где добавляем ключ в API Key

N8N Credentials OpenAI API

должен быть успех

N8N Credentials OpenAI API

Подключение Google сервисов

Для этого нам потребуется создать Google: OAuth2 single service.

Заходим, авторизуемся в консоль Google Cloud и переходим в раздел APIs & Services

N8N Credentials Google API

Далее переходим в Library N8N Credentials Google API

Спускаемся ниже, находим раздел Google Workspace и переходим в подразделы Google Calendar API, и Gmail API N8N Credentials Google API

где активируем их N8N Credentials Google API

возвращаемся чуть назад и переходим в раздел OAuth consent screen N8N Credentials Google API

далее в раздел Audience N8N Credentials Google API

и жмём кнопку Get started N8N Credentials Google API

вводим произвольное имя приложения и выбираем свой почтовый ящик N8N Credentials Google API

выбираем параметр External N8N Credentials Google API

в контактную информацию также вводим свой ящик N8N Credentials Google API

ставим галочку и жмём продолжить N8N Credentials Google API

снова переходим в раздел Audience и добавляем тестового пользователя (тот же самый ящик, что и везде был указан, также хочу заметить, что без тестового пользователя работать интеграция не будет). N8N Credentials Google API

Снова возвращаемся назад и переходим в раздел Credentials, где нажимаем на Create credentials и выбираем пункт Oauth client ID N8N Credentials Google API

выбираем пункт Web application N8N Credentials Google API

вводим произвольное имя и жмём Create N8N Credentials Google API

теперь у нас есть нужные нам Client ID и Client secret (копируем эти данные) N8N Credentials Google API

Возвращаемся в наш дашборд N8N на вкладку Credentials вводим Gmail, и выбираем нужный пункт

N8N Credentials OpenAI API

где вводим полученные ранее данные и жмём Sign in with Google N8N Credentials Google API

нас перекинет на страницу гугла, где выбираем все пункты N8N Credentials Google API

по итогу у нас снова должен быть успех. N8N Credentials Google API

Если его нет, то возможно потребуется добавить URL редиректа в настройках клиента N8N Credentials Google API

По аналогии, используя тот же Client ID и Client Secret подключаем Google Calendar.

N8N Credentials Google API

В итоге у нас должно быть подключено четыре интеграции

N8N Credentials List

Настройка Workflow

Наконец мы добрались до настройки уже самого рабочего процесса. Ниже будет приведён примера основы, которую можно будет далее дорабатывать под конкретные нужды, как в конструкторе лего, собирая его из готовых блоков.

А теперь создаём новый проект

N8N Workflow

Копируем данное содержимое и сохраняем его в файл main.json

{
  "name": "N8N-assistant",
  "nodes": [
    {
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.telegramTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ],
      "id": "738053cc-2a8d-482a-8f9e-cd822c3a309f",
      "name": "Telegram Trigger",
      "webhookId": "b440c3a6-24af-4995-b4ae-4f5cade5ab34",
      "notesInFlow": false,
      "credentials": {
        "telegramApi": {
          "id": "WDcASsnIyXww98tR",
          "name": "Telegram account"
        }
      }
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.message.voice }}",
                    "rightValue": "",
                    "operator": {
                      "type": "object",
                      "operation": "notEmpty",
                      "singleValue": true
                    },
                    "id": "f4f88d89-59fe-401c-b2ca-9e3b04014b78"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Voice"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "30b27a87-45da-4f5c-8fb4-80e8e72be7af",
                    "leftValue": "={{ $json.message.chat }}",
                    "rightValue": "",
                    "operator": {
                      "type": "object",
                      "operation": "notEmpty",
                      "singleValue": true
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Text"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        220,
        0
      ],
      "id": "f85b1c3f-ee7e-4fc0-8506-cb661340838e",
      "name": "Switch"
    },
    {
      "parameters": {
        "resource": "file",
        "fileId": "={{ $json.message.voice.file_id }}"
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        420,
        -80
      ],
      "id": "eea97975-f5d2-4539-881e-05b584778155",
      "name": "Download File",
      "webhookId": "eb7696c7-747b-4433-87eb-47fa76fc7a38",
      "credentials": {
        "telegramApi": {
          "id": "WDcASsnIyXww98tR",
          "name": "Telegram account"
        }
      }
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        640,
        -80
      ],
      "id": "29ae7583-2638-4dc3-913f-49f9d88da06c",
      "name": "Transcribe",
      "credentials": {
        "openAiApi": {
          "id": "oulGNhGcBYoS1e8t",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "6c5c72c1-e608-463b-bc0c-ccd622390b89",
              "name": "message.text",
              "value": "={{ $json.message.text }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        420,
        80
      ],
      "id": "c959ad3f-ae75-4534-8d19-979230fb0ec8",
      "name": "Set \"Text\""
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        760,
        320
      ],
      "id": "cd6807d2-dd15-47f6-8c84-1695bda8ea4e",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "id": "oulGNhGcBYoS1e8t",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "chatId": "832293187",
        "text": "={{ $json.output }}",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1200,
        80
      ],
      "id": "c1df1d78-d00e-4a40-9672-2ac91080a4ad",
      "name": "Telegram",
      "webhookId": "3a87b6c9-d73c-42e6-8712-548947b8cad8",
      "credentials": {
        "telegramApi": {
          "id": "WDcASsnIyXww98tR",
          "name": "Telegram account"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Telegram Trigger').item.json.update_id }}"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        940,
        320
      ],
      "id": "5d239f70-c20b-4481-8304-1e8f707084ef",
      "name": "Simple Memory"
    },
    {
      "parameters": {
        "operation": "getAll",
        "calendar": {
          "__rl": true,
          "value": "[email protected]",
          "mode": "list",
          "cachedResultName": "[email protected]"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        1240,
        320
      ],
      "id": "e999082b-e568-4a22-a13e-550b32721054",
      "name": "Get Events",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "VE9fStUKt1dAhzMr",
          "name": "Google Calendar account"
        }
      }
    },
    {
      "parameters": {
        "calendar": {
          "__rl": true,
          "value": "[email protected]",
          "mode": "list",
          "cachedResultName": "[email protected]"
        },
        "start": "={{ $fromAI(\"startDate\") }}",
        "end": "={{ $fromAI(\"endDate\") }}",
        "useDefaultReminders": "={{ true }}",
        "additionalFields": {
          "summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}"
        }
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        1100,
        320
      ],
      "id": "209ce3ee-93d3-4b0b-a68e-611e26ea6465",
      "name": "Create Event",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "VE9fStUKt1dAhzMr",
          "name": "Google Calendar account"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.message.text }}\n{{ $json.text }}",
        "options": {
          "systemMessage": "=You are a helpful assistant.\nToday's date is {{ $now }}."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2,
      "position": [
        840,
        80
      ],
      "id": "389db1a2-f962-4c3b-bb69-1f042a9aab41",
      "name": "Личный ассистент"
    }
  ],
  "pinData": {},
  "connections": {
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Download File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set \"Text\"",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download File": {
      "main": [
        [
          {
            "node": "Transcribe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe": {
      "main": [
        [
          {
            "node": "Личный ассистент",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set \"Text\"": {
      "main": [
        [
          {
            "node": "Личный ассистент",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Личный ассистент",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Личный ассистент",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Get Events": {
      "ai_tool": [
        [
          {
            "node": "Личный ассистент",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Create Event": {
      "ai_tool": [
        [
          {
            "node": "Личный ассистент",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Личный ассистент": {
      "main": [
        [
          {
            "node": "Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Moscow",
    "callerPolicy": "workflowsFromSameOwner"
  },
  "versionId": "23051992-29b6-46d5-badf-3ec42c1d4c55",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "a5d51d84a9eb0f3f8e4450d5b717d02a3b8b8872addfb74eaf508526532a3cfd"
  },
  "id": "IL9JO6dB8beBygg2",
  "tags": []
}
почтовый ящик [email protected] замените на свой и далее необходимо импортировать файл в проект

N8N Workflow

Должно получиться что-то вроде такого

N8N Workflow

Для отладки нужно нажать Execute workflow и отправить сообщение вашему телеграм боту, после чего должен сработать тригер и начаться процесс обработки.

N8N Workflow

Если кому интересно как это работает в живую, то записал короткий ролик, с которым можно ознакомиться у меня в телеграм канале.

К началу