▍Личный ассистент¶
Запускаем личного ассистента на базе N8N в Docker Swarm¶
Вводная часть¶
Что нам понадобится для запуска:
- Установленный Docker или Docker Swarm
- Traefik + Домен и белый IP адрес
- Развёрнутый N8N
- Созданный бот в Telegram
- Пополненный баланс в OpenAI, т.к. без этого до API не достучаться. Какой-нибудь аналог платиру вам в помощь.
Итак, приступим.
Сразу привяжем N8N к Telergam, OpenAI, Google Mail и Google Calendar.
Подключаем Telergam бота¶
Для этого перейдём слева в раздел Personal
и вкладка Credentials
, где нажмём на кнопку Add first credential
Набираем Telegram и в выпадающем списке выбираем нужную интеграцию
Вводим полученный токен и сохраняем
Если всё гуд, то должна появиться зелёная плашка
Подключаем OpenAI API¶
Заходим на страницу https://platform.openai.com/api-keys, авторизуемся под своей учёткой и нажимаем на кнопку Create new secret key
Вводим произвольное имя в поле Name
и по аналогии с Telegram на вкладке Credentials
вводим openai, и выбираем нужный пункт
где добавляем ключ в API Key
должен быть успех
Подключение Google сервисов¶
Для этого нам потребуется создать Google: OAuth2 single service
.
Заходим, авторизуемся в консоль Google Cloud и переходим в раздел APIs & Services
Спускаемся ниже, находим раздел Google Workspace
и переходим в подразделы Google Calendar API
, и Gmail API
возвращаемся чуть назад и переходим в раздел OAuth consent screen
вводим произвольное имя приложения и выбираем свой почтовый ящик
в контактную информацию также вводим свой ящик
ставим галочку и жмём продолжить
снова переходим в раздел Audience
и добавляем тестового пользователя (тот же самый ящик, что и везде был указан, также хочу заметить, что без тестового пользователя работать интеграция не будет).
Снова возвращаемся назад и переходим в раздел Credentials
, где нажимаем на Create credentials
и выбираем пункт Oauth client ID
выбираем пункт Web application
вводим произвольное имя и жмём Create
теперь у нас есть нужные нам Client ID
и Client secret
(копируем эти данные)
Возвращаемся в наш дашборд N8N на вкладку Credentials
вводим Gmail, и выбираем нужный пункт
где вводим полученные ранее данные и жмём Sign in with Google
нас перекинет на страницу гугла, где выбираем все пункты
по итогу у нас снова должен быть успех.
Если его нет, то возможно потребуется добавить URL редиректа в настройках клиента
По аналогии, используя тот же Client ID
и Client Secret
подключаем Google Calendar.
В итоге у нас должно быть подключено четыре интеграции
Настройка 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]
замените на свой и далее необходимо импортировать файл в проект Должно получиться что-то вроде такого
Для отладки нужно нажать Execute workflow
и отправить сообщение вашему телеграм боту, после чего должен сработать тригер и начаться процесс обработки.
Если кому интересно как это работает в живую, то записал короткий ролик, с которым можно ознакомиться у меня в телеграм канале.