Агентство недвижимости получает 40 заявок в неделю, и половина из них — реклама и рассылки. Руководитель тратит утро, чтобы найти среди них три живых. В этом уроке ассистент сделает это за него: разберёт каждое письмо, отделит рекламу, у заявок определит срочность и напишет черновик ответа. Отправит ответ только после вашего нажатия кнопки.
Чему научитесь в этом уроке:
• научить модель возвращать разбор письма в виде полей: тип, срочность, суть, черновик;
• обработать пачку писем, а не только первое;
• отправлять ответ клиенту только после вашего «да» в Telegram.
Как устроен сценарий
- Email Trigger (IMAP) — тот же узел, что в уроке 3.3: письмо появилось в папке.
- Basic LLM Chain разбирает письмо и возвращает ответ в виде JSON (текста с полями в фигурных скобках).
- Code раскладывает ответ модели по полям.
- If отсеивает рекламу.
- Telegram → Send and Wait for Response присылает вам заявку и черновик с кнопками «Отправить» и «Отклонить» и ждёт.
- If по нажатой кнопке и Send Email отправляет ответ.
Шаг 1. Модель разбирает письмо
Создайте новый сценарий и скопируйте в него почтовый узел из урока 3.3. Назовите его «Новое письмо». Добавьте Basic LLM Chain с вашей моделью. В Prompt (User Message) впишите:
От: {{ $json.from.text }}
Тема: {{ $json.subject }}
Текст: {{ ($json.text || ($json.html || '').replace(/<[^>]+>/g, ' ')).replace(/\s+/g, ' ').trim().slice(0, 1500) }}
Системное сообщение просит вернуть не текст, а поля. Так дальше в сценарии можно проверять тип письма без модели:
Ты помощник агентства недвижимости «Квадрат» (Тверь). Ты разбираешь входящие письма.
Верни только JSON без пояснений и без разметки, ровно с полями:
{"type": "оценка" | "покупка" | "продажа" | "вопрос о цене" | "реклама" | "другое",
"urgency": "сегодня" | "на неделе" | "не срочно",
"summary": "одна строка: кто и что хочет",
"draft": "черновик ответа клиенту, 2–4 предложения, вежливо, по-русски"}
Для рекламы и рассылок draft пустой.
В черновике не называй цен, сроков и скидок, если их нет в письме: предложи созвониться или уточнить детали.
Не выдумывай фактов о клиенте.
Строка про цены в черновике важна: модель не знает вашего прайса, и без запрета она вежливо назовёт выдуманную цену. Если хотите, чтобы черновик отвечал по прайсу, вставьте прайс в это сообщение по образцу урока 4.3.
Шаг 2. Раскладываем ответ по полям
Добавьте узел Code с именем «Разбор в поля». Код важен в одном месте: если в папке накопилось несколько писем, почтовый узел отдаёт их пачкой, и разбирать нужно каждое. Первая версия этого кода брала только первое письмо. Им оказалась реклама, и сценарий молча ничего не прислал, хотя в пачке было три заявки.
// Для каждого письма достаём JSON из ответа модели; если не вышло, отмечаем для ручного разбора
const letters = $('Новое письмо').all();
return $input.all().map((item, i) => {
const raw = item.json.text || '';
const letter = letters[i].json;
let r;
try { r = JSON.parse(raw.replace(/^[^{]*/, '').replace(/[^}]*$/, '')); }
catch (e) { r = { type: 'другое', urgency: 'сегодня', summary: 'Не удалось разобрать, посмотрите письмо сами', draft: '' }; }
return { json: { ...r, from: letter.from?.text || '', to: letter.to?.text || '', subject: letter.subject || '' } };
});
Если модель вернула не JSON, код не падает, а помечает письмо «посмотрите сами» и срочность «сегодня»: лучше лишний раз показать вам письмо, чем потерять заявку.
Шаг 3. Фильтр рекламы и ваше «да»
Узел If с именем «Не реклама?»: условие {{ $json.type }} is not equal to реклама. К выходу true подключите Telegram → Send and Wait for Response:
- Chat ID — ваш номер, как в брифинге;
- Message:
Новая заявка ({{ $json.type }}, {{ $json.urgency }}), на следующих строкахОт: {{ $json.from }},{{ $json.summary }}иЧерновик: {{ $json.draft }}; - Response Type: Approval, Type of Approval: Approve and Disapprove, подписи кнопок «Отправить» и «Отклонить»;
- в Options добавьте Limit Wait Time: 1 час. Пока вы не нажали кнопку, запуск висит в ожидании, и без предела неотвеченные заявки копятся. Если за час вы не ответили, сценарий пойдёт дальше без нажатия: ответ клиенту не уйдёт, а письмо останется в папке. Найдите такие заявки во вкладке Executions или в почте и ответьте сами.

После него второй If: {{ $json.data.approved }} is true. К выходу true подключите Send Email. Учётные данные SMTP создайте так же, как IMAP в уроке 3.3: Host smtp.yandex.ru, Port 465, SSL/TLS включено, тот же пароль приложения. Поля письма:
- From Email и To Email:
{{ $('Разбор в поля').item.json.to }}и{{ $('Разбор в поля').item.json.from }}— от вашего адреса отправителю заявки; - Subject:
Re: {{ $('Разбор в поля').item.json.subject }}, Text:{{ $('Разбор в поля').item.json.draft }}.
Проверяйте на себе. Первые запуски делайте с заявками, которые вы сами отправили со второго ящика. При подготовке урока ответ «Re: Сколько стоит двушка на Обводном канале?» пришёл на второй ящик через несколько секунд после нажатия «Отправить». Только после такой проверки направляйте сценарий на настоящие письма.
Шаг 4. Публикация и проверка
Проверяйте почтовые сценарии опубликованными. Ожидание в редакторе («Waiting for you to receive an email») при подготовке урока зависло и не реагировало на новые письма. Опубликуйте сценарий и перенесите непрочитанную заявку из папки и обратно, как в уроке 3.3. Учтите, что модель разбирает каждое письмо отдельно: пачка из 10 писем на прогоне разбиралась от одной до пяти минут, и сообщение в Telegram пришло не сразу.
На прогоне из 10 писем модель отнесла к рекламе 7 (промокоды, круизы, «смартфоны оптом», предложение о раскрутке сайта) и нашла три заявки: покупка со срочностью «сегодня», вопрос о цене и оценка. Ни одной ошибки.
Если не получилось
- Сценарий отработал, а в Telegram пусто. Посмотрите выход узла «Не реклама?»: если всё ушло в false, все письма в пачке — реклама. Если в «Разбор в поля» только одна строка, у вас старый код, который берёт первое письмо.
- Модель пишет текст вместо JSON. В системном сообщении должна быть строка «Верни только JSON без пояснений». Код всё равно не упадёт, а пометит письмо «посмотрите сами».
- Ошибка входа в Send Email. Проверьте порт 465 и включённый SSL/TLS. Пароль тот же, что для IMAP.
- Сообщения с кнопками копятся. Не задан Limit Wait Time.
Контрольный вопрос. В папке пять непрочитанных писем: четыре рекламных и одна заявка. Сценарий отработал без ошибок, а сообщения в Telegram нет. В узле «Разбор в поля» одна строка — рекламная. В чём причина?
Подсказка: Сколько строк должно быть в выходе «Разбор в поля» для пяти писем?
На курсе задания проверяются автоматически. Подобрать курс
Контрольный вопрос. Зачем в Send and Wait for Response ставить Limit Wait Time?
Подсказка: Что происходит с запуском, пока вы не нажали кнопку?
На курсе задания проверяются автоматически. Подобрать курс
Задание. МИССИЯ «Заявки без завала». Соберите сценарий разбора заявок с подтверждением. Отправьте себе со второго ящика 3 заявки по своему бизнесу и 2 рекламных письма, положите их в рабочую папку. Приложите: (1) скриншот сценария; (2) скриншот выхода «Разбор в поля» с пятью строками; (3) скриншот сообщения с кнопками в Telegram; (4) скриншот письма-ответа во втором ящике; (5) одну-две фразы: был ли черновик пригоден к отправке без правок. Принято, если: в разборе пять строк и реклама отделена; сообщение пришло с кнопками; ответ дошёл на второй ящик только после нажатия «Отправить»; задан Limit Wait Time; на скриншотах закрыты адреса.
Подсказка: Если черновики слишком общие, добавьте в системное сообщение 2–3 строки о своём бизнесе и пример хорошего ответа.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
На курсе задания проверяются автоматически. Подобрать курс
Что дальше
Черновики пока не знают ваших цен. В следующем уроке дадим ассистенту прайс и научим отвечать по нему.
Итог:
• модель возвращает разбор письма полями, и дальше сценарий решает без неё;
• код разбирает всю пачку писем, а не только первое;
• ответ клиенту уходит только после вашей кнопки «Отправить».
