# Micro CRM

Документация и описание платформы

**Micro CRM** включает в себя:

* Управление клиентами и контактами
* Чаты и коммуникации
* Telegram-боты с [визуальным конструктором](/konstruktor-chat-botov)
* Транзакции и финансовый учет
* Автоматические напоминания
* Шаблоны сообщений
* Воронка продаж (Kanban)
* Аналитика и отчеты
* Система ролей и компаний
* Административная панель

***

## Основные разделы платформы

### Дашборд&#x20;

**Назначение:** Главный экран с обзором ключевых метрик

#### **Функциональность:**

* Статистика активных клиентов
* График динамики роста клиентов
* Последние транзакции
* Предстоящие напоминания
* Обзор лидов

#### **Метрики:**

* Количество активных клиентов
* Рост за месяц (%)
* Распределение клиентов по статусам
* Финансовые показатели

***

### Клиенты

**Назначение:** Управление базой клиентов

#### **Функциональность:**

* Просмотр списка клиентов (таблица)
* Фильтрация по статусу и категории
* Поиск по имени, email, телефону
* Создание нового клиента
* Редактирование информации
* Удаление клиента
* Настройка категорий клиентов
* Пользовательские поля (custom fields)

#### **Поля клиента:**

* Основная информация: имя, email, телефон, Telegram
* Статус: active, inactive, blocked
* Категория (настраиваемая)
* Пользовательские поля (динамические)
* Дата создания и обновления

***

### Чаты

**Назначение:** Коммуникация с клиентами через различные каналы

#### **Функциональность:**

* Список чатов с клиентами
* История переписки
* Отправка текстовых сообщений
* Отправка файлов (изображения, документы)
* Использование шаблонов
* Создание сделки из чата
* Поддержка Markdown форматирования
* Индикация непрочитанных сообщений

***

### Чат-бот

**Назначение:** Автоматизация общения через Telegram-ботов

#### **Экран "Сценарии чат-бота":**

Отображает список всех созданных сценариев бота с возможностью управления ими.

#### **Элементы интерфейса:**

* Заголовок: "Сценарии чат-бота"
* Описание: "Управление сценариями работы вашего Telegram бота"
* Поле поиска с плейсхолдером "Поиск по названию или описанию..."
* Кнопка "+ Создать сценарий"

#### **Карточки сценариев:**

Каждый сценарий отображается в виде карточки с информацией:

* **Название сценария** - отображается крупным текстом
* **Триггеры** - показывает команды, которые запускают сценарий (например: `/start`, `/sell`)
* **Кнопки действий:**
  * ✏️ **Редактировать** - открывает визуальный редактор сценария
  * 📊 **Статистика** - показывает метрики использования сценария
  * 📋 **Дублировать** - создает копию сценария
  * 🗑️ **Удалить** - удаляет сценарий с подтверждением

#### **Функциональность списка сценариев:**

* Создание нового сценария
* Редактирование существующего
* Дублирование сценария
* Удаление сценария
* Активация/деактивация
* Поиск по названию и описанию
* Фильтрация по активности

#### [**Визуальный редактор:**](/konstruktor-chat-botov)

* Drag & Drop интерфейс для создания потоков
* [Палитра узлов](/konstruktor-chat-botov/tipy-uzlov) (триггеры, действия, условия)
* Редактор свойств узлов
* Валидация конфигурации
* Предупреждения о конфликтах триггеров
* Автоматическая раскладка узлов
* Zoom и панорамирование
* Экспорт/импорт JSON

#### [**AI Ассистент:**](/konstruktor-chat-botov/rabota-s-ii-pomoshnikom)

* Генерация сценариев по описанию
* Модификация существующих сценариев (в разработке)
* Объяснение логики узлов
* Предложения по улучшению

***

### Транзакции

**Назначение:** Учет финансовых операций

#### **Функциональность:**

* Список транзакций
* Создание новой транзакции
* Редактирование
* Удаление
* Фильтрация по типу (income/expense)
* Поиск по описанию
* Связь с клиентом

#### **Поля транзакции:**

* Тип (доход/расход)
* Сумма
* Валюта
* Категория
* Описание
* Клиент (опционально)
* Дата
* Статус

***

### Напоминания

**Назначение:** Автоматические уведомления и задачи

#### **Функциональность:**

* Список напоминаний
* Создание напоминания
* Редактирование
* Отметка как выполненное
* Удаление
* Фильтры по статусу
* Уведомления через Telegram

#### **Поля напоминания:**

* Заголовок
* Описание
* Дата и время
* Повторение (однократно/ежедневно/еженедельно)
* Связь с клиентом
* Назначенный пользователь
* Статус (pending/completed)

***

### Шаблоны

**Назначение:** Готовые шаблоны сообщений

#### **Функциональность:**

* Библиотека шаблонов
* Создание шаблона
* Редактирование
* Удаление
* Категории шаблонов
* Предпросмотр с подстановкой переменных
* Использование в чатах

#### **Переменные в шаблонах:**

* `{{client.name}}` - имя клиента
* `{{client.email}}` - email
* `{{client.phone}}` - телефон
* `{{company.name}}` - название компании
* `{{user.name}}` - имя отправителя

***

### Продажи

**Назначение:** Kanban-доска для управления сделками

#### **Функциональность:**

* Визуализация воронки продаж
* Drag & Drop перемещение сделок
* Создание сделки
* Редактирование сделки
* Настройка этапов (колонок)
* Настройка статусов сделок
* Фильтрация и поиск

#### **Этапы по умолчанию:**

* Новый лид
* Квалификация
* Предложение
* Переговоры
* Закрыто (успешно/неуспешно)

***

### Отчеты

**Назначение:** Аналитика и статистика

#### **Функциональность:**

* Отчет по клиентам
* Отчет по транзакциям
* Отчет по продажам
* Отчет по активности пользователей
* Графики и диаграммы
* Экспорт данных
* Временные фильтры

### Компания

**Назначение:** Управление компанией и командой

**Доступ:** Только для Владельца и Главного менеджера

#### **Вкладки:**

**1. Общие настройки**

* Название компании
* Описание
* Логотип
* Контактная информация

**2. Сотрудники**

* Список сотрудников компании
* Роли и права доступа
* Приглашение новых сотрудников (по email)
* Редактирование ролей
* Удаление сотрудников

***

### Настройки

**Назначение:** Личные настройки пользователя

#### **Вкладки:**

**1. Профиль**

* Имя пользователя
* Email
* Телефон
* Telegram ID (для связи с ботами)
* Часовой пояс
* Смена пароля

**2. Тема**

* Светлая
* Темная
* Системная

**3. Тарифный план**

* Текущий план
* Использование лимитов
* История платежей
* Обновление плана

&#x20;**4. Интеграции**

* Telegram Bot (токен)
* WhatsApp Business (в разработке)
* Webhook URL
* SMTP настройки для email

**4. AI провайдеры**

* Настройка API ключей для AI
* Выбор модели
* Тестирование подключения

***

## Интеграции

### Telegram

* Создание и управление ботами
* Отправка сообщений через Bot API
* Inline клавиатуры
* Медиа файлы

### WhatsApp Business (в разработке)

* Отправка сообщений
* Получение сообщений
* Шаблоны WhatsApp
* Медиа файлы

### Webhook

* Входящие webhook
* Обработка событий
* Логирование запросов

### Email (SMTP)

* Настройка SMTP сервера
* Отправка писем клиентам
* Приглашения в компанию
* Уведомления

***

## Безопасность

### Row Level Security (RLS)

* Все таблицы защищены RLS
* Пользователи видят только данные своих компаний
* Проверка на уровне базы данных

### Роли и права

* Владелец компании - полный доступ
* Главный менеджер - управление командой
* Менеджер - работа с клиентами
* Сотрудник - базовый функционал

### Контроль доступа к триггерам ботов

* Публичные триггеры - доступны всем
* Только сотрудники компании
* Конкретные роли
* Конкретный человек
* Настраиваемые сообщения при отказе


# Конструктор чат-ботов

Руководство по работе с визуальным редактором чат-ботов

***

Визуальный редактор чат-ботов в Micro CRM — это инструмент для создания сценариев Telegram-ботов без написания кода. Вы создаёте логику бота, соединяя между собой специальные блоки (узлы/ноды), каждый из которых выполняет определённую функцию.

<figure><img src="/files/tQdVhxmHkzJb3hONnscI" alt=""><figcaption></figcaption></figure>

#### Основные понятия

* **Узел (нода)** — блок, выполняющий одно действие (отправка сообщения, проверка условия и т.д.)
* **Связь** — соединение между узлами, определяющее последовательность действий
* **Триггер** — точка входа в сценарий (команда, текст, нажатие кнопки)
* **Сценарий** — полная схема работы бота, состоящая из узлов и связей


# Основы работы с редактором

### Структура интерфейса

* **Холст (Canvas)** — рабочая область, где вы размещаете и соединяете узлы
* **Палитра узлов** — панель слева с доступными типами узлов
* **Редактор узла** — боковая панель справа для настройки выбранного узла
* **Панель инструментов** — верхняя панель с кнопками управления сценарием

<figure><img src="/files/DV1K94GECTEsWhVTB9cD" alt=""><figcaption></figcaption></figure>

### Добавление узлов

1. Выберите нужный тип узла в палитре слева
2. Перетащите узел из палитры на холст

### Соединение узлов

1. Наведите курсор на круглую точку справа от узла (исходящее соединение)
2. Зажмите левую кнопку мыши и потяните линию к точке слева другого узла (входящее соединение)
3. Отпустите кнопку — соединение создано

<figure><img src="/files/5Fk4HU9nkDy1eOeAWa7o" alt=""><figcaption></figcaption></figure>

### Удаление соединений

* Наведите на линию соединения и нажмите на появившуюся кнопку **×**

<figure><img src="/files/oiUB8Z7CeDcjtj1zxzRU" alt=""><figcaption></figcaption></figure>

### Общие элементы узлов

Все узлы имеют общие элементы управления и настройки:

#### 1. Точки подключения (Handles)

* **Левая точка (серая)** — входящее соединение (откуда приходит управление)
* **Правая точка (цветная)** — исходящее соединение (куда передаётся управление)
* У некоторых узлов несколько исходящих точек (например, условия имеют "true" и "false")

#### 2. Название узла

* Отображается в верхней части узла
* Можно редактировать в редакторе узла справа
* Помогает ориентироваться в сложных сценариях

#### 3. Комментарий

* Необязательное текстовое поле для заметок
* Отображается над узлом при заполнении
* Полезно для документирования логики

#### 4. Кнопки управления (появляются при наведении)

* **Копировать** (значок копирования, левый верхний угол) — создаёт дубликат узла
* **Удалить** (корзина, правый верхний угол) — удаляет узел и все его связи

#### 5. Цветовая схема

Каждый тип узла имеет свой цвет для быстрой идентификации:

* 🟢 **Зелёный** — Триггеры (точки входа)
* 🔵 **Синий** — Действия (отправка сообщений, сохранение данных)
* 🟡 **Жёлтый** — Условия (проверки и ветвления)
* 🟣 **Фиолетовый** — ИИ Агент (работа с искусственным интеллектом)
* 🟠 **Оранжевый** — HTTP запросы (работа с API)
* 🔴 **Красный** — Выход из бота


# Типы узлов

Система узлов для создания чат-ботов представляет собой визуальный конструктор, где каждый узел выполняет определенную функцию в сценарии взаимодействия с пользователем

### [Триггеры](/konstruktor-chat-botov/tipy-uzlov/triggery) <a href="#undefined" id="undefined"></a>

Определяют точки входа в сценарий:

* **Команда** — запуск по `/start`, `/help`
* **Содержит текст** — активация по ключевым словам
* **Точный текст** — срабатывание при точном совпадении
* **Кнопка (Callback)** — реакция на inline-кнопки

### Действия <a href="#undefined" id="undefined"></a>

Выполняют основные операции:

* [**Отправить сообщение**](/konstruktor-chat-botov/tipy-uzlov/otpravit-soobshenie) — отправка текста с Markdown, кнопками, ожиданием ответа
* [**Сохранить в контекст**](/konstruktor-chat-botov/tipy-uzlov/sokhranit-v-kontekst) — сохранение данных в переменные
* [**HTTP запрос** ](/konstruktor-chat-botov/tipy-uzlov/http-zapros)— обращение к внешним API
* [**Задержка**](/konstruktor-chat-botov/tipy-uzlov/zaderzhka) — паузы в сценарии
* [**Уведомление**](/konstruktor-chat-botov/tipy-uzlov/zaderzhka) — отправка сообщений сотрудникам
* [**Выход из бота**](/konstruktor-chat-botov/tipy-uzlov/vykhod-iz-bota) — завершение сценария
* [**ИИ агент**](/konstruktor-chat-botov/tipy-uzlov/ii-agent) — генерация ответов через AI

### [Условия](/konstruktor-chat-botov/tipy-uzlov/usloviya) <a href="#undefined" id="undefined"></a>

Проверяют условия и направляют логику:

* **Проверка текста** — анализ сообщений пользователя
* **Переменная** — сравнение значений
* **Клиент существует** — проверка в CRM
* **Есть покупки** — проверка транзакций
* **Время суток** — проверка времени

### CRM операции <a href="#crm" id="crm"></a>

Интеграция с системой управления клиентами:

* [**Управление клиентом**](/konstruktor-chat-botov/tipy-uzlov/upravlenie-klientom) — обновление данных, создание транзакций и сделок
* [**Найти сотрудника**](/konstruktor-chat-botov/tipy-uzlov/naiti-sotrudnika) — поиск менеджеров по критериям

***

**Ключевые особенности:** Все узлы поддерживают переменные `{{context.variable}}`, имеют настройки контроля доступа по ролям и могут объединяться в сложные сценарии с ветвлением логики. Система обеспечивает полный цикл взаимодействия от триггера до завершения сценария с интеграцией CRM и внешних сервисов.


# Триггеры

## **Команда**

**Запускается когда:** пользователь отправляет команду (например, `/start`)

### **Настройки:**

* **Команда** — название команды без слэша (например, `start`, `help`, `menu`)
* Команды не чувствительны к регистру

### **Пример использования:**

```
/start → запуск приветственного сценария
/help → показ справки
/menu → главное меню бота
```

## **Содержит текст**

**Запускается когда:** сообщение пользователя содержит указанную фразу

### **Настройки:**

* **Текст** — ключевое слово или фраза
* Регистр не учитывается
* Проверяется вхождение подстроки

### **Пример использования:**

```
"цена" → показ прайс-листа
"контакт" → отправка контактной информации
"помощь" → вызов поддержки
```

## **Точный текст**

**Запускается когда:** сообщение пользователя точно совпадает с указанным текстом

### **Настройки:**

* **Текст** — точное сообщение
* Регистр не учитывается
* Должно совпадать полностью

### **Пример использования:**

```
"да" → подтверждение действия
"нет" → отмена действия
"готово" → завершение процесса
```

## **Кнопка (Callback)**

**Запускается когда:** пользователь нажимает на inline-кнопку

### **Настройки:**

* **Callback данные** — уникальный идентификатор кнопки
* Должен совпадать с callback\_data кнопки в узле "Отправить сообщение"

### **Пример использования:**

```
"buy_product_1" → обработка покупки товара 1
"show_catalog" → показ каталога
"confirm_order" → подтверждение заказа
```

## **Контроль доступа к триггерам**

Вы можете ограничить доступ к любому триггеру, чтобы его могли использовать только определенные люди.

<figure><img src="/files/u2MTzdUo8VIL3s9Ze7s5" alt=""><figcaption></figcaption></figure>

### **Визуальная индикация в редакторе**

<figure><img src="/files/FJke0pMx1wDwfMn84iMg" alt=""><figcaption></figcaption></figure>

Триггеры с ограниченным доступом отображают специальный значок справа от названия:

* 👥 **Сотрудники** — доступ только для сотрудников компании
* 🎭 **Роли** — доступ для конкретных ролей
* 👤 **Персона** — доступ для одного человека

Публичные триггеры не показывают значок (доступны всем).

### **Уровни доступа**

1. **Публичный (по умолчанию)** — триггер доступен всем пользователям бота
   * При создании нового триггера автоматически устанавливается этот уровень
2. **Только сотрудники компании** — триггер могут активировать только те пользователи, чей Telegram аккаунт привязан к учетной записи сотрудника в вашей компании через настройки профиля
3. **Конкретные роли** — выберите одну или несколько ролей компании:
   * Владелец
   * Главный менеджер
   * Менеджер
   * Сотрудник
4. **Конкретный человек** — только один выбранный сотрудник компании может использовать этот триггер

### **Сообщение при отказе в доступе:**

Когда доступ НЕ публичный, вы можете настроить сообщение, которое будет отправляться пользователям при попытке использовать ограниченный триггер.

Если сообщение не указано, пользователь просто не получит никакого ответа от бота.

### **Примеры использования:**

* **Команда `/admin`** — доступна только владельцу и главному менеджеру
  * Сообщение при отказе: "Извините, эта команда доступна только руководству."
* **Команда `/stats`** — доступна менеджерам и выше
  * Сообщение при отказе: "Для просмотра статистики обратитесь к вашему менеджеру."
* **Команда `/secret`** — доступна только конкретному сотруднику
  * Без сообщения при отказе (пользователь не получит ответа)
* **Команда `/help`** — публичная команда, доступна всем

### **Важные замечания**

* Для работы контроля доступа пользователь должен привязать свой Telegram аккаунт к учетной записи в компании
* Привязка осуществляется через настройки профиля в личном кабинете
* Если пользователь не привязал аккаунт, он будет считаться внешним пользователем
* Внешние пользователи могут использовать только публичные триггеры


# Отправить сообщение

Отправляет сообщение пользователю. Самый используемый узел.

## **Основные настройки**

### **Текст сообщения**

* Основное содержимое сообщения
* Поддерживает Markdown (жирный, курсив, ссылки)
* Можно использовать переменные: `{{client.name}}`, `{{context.score}}`

### **Примеры Markdown**

```
*жирный текст*
_курсив_
[текст ссылки](https://example.com)
```

## **Кнопки**

Вы можете добавить до 10 inline-кнопок к сообщению.

#### **Для каждой кнопки настройте:**

1. **Текст** — надпись на кнопке (то, что видит пользователь)
2. **Callback данные** — уникальный идентификатор для обработки нажатия

### **Пример**

```
Текст: "Купить 🛒"
Callback: "buy_product_123"
```

Затем у вас появится на ноде зеленая исходящая точка, обозначающая действие кнопки

<figure><img src="/files/ieR6VQ3QocHXlpThjonA" alt=""><figcaption></figcaption></figure>

### **Расположение кнопок**

* По умолчанию кнопки располагаются вертикально (друг под другом)
* Используйте интерфейс для настройки положения кнопок

### **Пример настройки расположения**

<figure><img src="/files/lbJfSU6vMgW4ApIaQk7y" alt=""><figcaption></figcaption></figure>

## **Ожидать ответ пользователя**

<figure><img src="/files/sCQIsxQSXpA1NmWPV1bE" alt=""><figcaption></figcaption></figure>

**Важная опция!** Определяет, будет ли бот ждать ответа от пользователя.

### **Когда включить**

* ✅ Когда нужно получить текстовый ответ (имя, email, комментарий)
* ✅ Когда задаёте вопрос и ждёте текста
* ❌ Когда используете только кнопки
* ❌ Когда просто информируете пользователя

### **Как это работает**

* **Включено (⏳)** — после отправки сообщения бот остановится и будет ждать текстовый ответ пользователя. Ответ можно сохранить в переменную.
* **Выключено** — сообщение отправится, и управление сразу перейдёт к следующему узлу

### **Дополнительные настройки при включённом ожидании**

1. **Сохранить ответ в переменную** — имя переменной для сохранения ответа пользователя

   ```
   Пример: user_name
   Использование: {{context.user_name}}
   ```
2. **Обработчик ответа** — узел, который выполнится после получения ответа

   * Создаёт отдельную исходящую точку с иконкой 💬
   * Соедините её с узлом, который обработает полученный ответ

   <figure><img src="/files/Bc2uyLtD3f4SuwhjVJlj" alt=""><figcaption></figcaption></figure>

### **Пример сценария с ожиданием**

```
[Отправить сообщение: "Как вас зовут?" ⏳]
         ↓ (сохранить в: user_name)
         💬 (обработчик ответа)
         ↓
[Отправить сообщение: "Приятно познакомиться, {{context.user_name}}!"]
```

## **Медиафайлы**

Можно прикрепить изображение, видео или документ.

<figure><img src="/files/5A8fyHtC3ilKuFBgp45L" alt=""><figcaption></figcaption></figure>

### **Настройки**

* **Тип медиа** — выберите: изображение, видео или документ
* **URL медиа** — прямая ссылка на файл (должна начинаться с http\:// или https\://)

### **Требования к URL**

* ✅ Должен быть публично доступен
* ✅ Должен вести напрямую к файлу
* ❌ Не должен требовать авторизации


# Сохранить в контекст

Сохраняет значение в переменную контекста для использования в дальнейшем сценарии.

<figure><img src="/files/heRjrIETnt067ojTtGul" alt=""><figcaption></figcaption></figure>

## **Настройки**

* **Переменная** — имя переменной (без `{{}}`)
* **Значение** — что сохранить (может быть текст, число, формула, другая переменная)

## **Примеры**

```
Переменная: score
Значение: 0

Переменная: score
Значение: {{context.score}} + 1

Переменная: greeting
Значение: Привет, {{client.name}}!
```


# HTTP запрос

Отправляет HTTP запрос к внешнему API.

<figure><img src="/files/JlzzHRvAM7YXUHsBLTf9" alt=""><figcaption></figcaption></figure>

## **Настройки**

1. **Метод** — выберите тип запроса:
   * GET — получение данных
   * POST — отправка данных
   * PUT — обновление данных
   * DELETE — удаление данных
2. **URL** — адрес API endpoint
3. **Заголовки** (необязательно) — дополнительные HTTP заголовки в формате JSON

   ```json
   {
     "Authorization": "Bearer TOKEN",
     "Content-Type": "application/json"
   }
   ```
4. **Тело запроса** (для POST/PUT) — данные в формате JSON

   ```json
   {
     "user_id": "{{client.telegram}}",
     "message": "{{message.text}}"
   }
   ```
5. **Сохранить ответ в** — переменная для сохранения ответа API

<figure><img src="/files/hzhPOsWjYDTtLnbsEj6u" alt=""><figcaption></figcaption></figure>

## **Пример использования**

```
Метод: POST
URL: https://api.example.com/users
Тело: {"name": "{{context.user_name}}"}
Сохранить в: api_response
```


# Задержка

Приостанавливает выполнение сценария на указанное время.

<figure><img src="/files/xLReesYdr8i5DC0wQKE2" alt=""><figcaption></figcaption></figure>

### **Настройки**

* **Задержка (секунды)** — количество секунд паузы (1-3600)

### **Пример использования**

* Имитация "печатает..."
* Пауза между сообщениями для читаемости
* Ожидание перед проверкой результата


# Уведомления

Отправляет уведомление сотруднику компании.

<figure><img src="/files/TOMc0mkjjjATXreNc0xz" alt=""><figcaption></figcaption></figure>

## **Настройки**

1. **Канал уведомления** — выберите способ доставки:
   * Telegram — отправка в Telegram
   * Email — отправка на почту
2. **Получатели** — выберите одного или нескольких сотрудников из списка
3. **Сообщение** — текст уведомления
   * Можно использовать переменные
   * Поддерживает Markdown
4. **Тема** (только для Email) — тема письма

## **Пример использования**

```
Канал: Telegram
Получатели: [Менеджер по продажам, Директор]
Сообщение: Новая заявка от {{client.name}}, телефон: {{context.phone}}
```


# ИИ агент

Использует AI для генерации ответов на основе контекста разговора

<figure><img src="/files/IcHJhJFuQ92pz2OLAljc" alt=""><figcaption></figcaption></figure>

## **Настройки**

### **Провайдер AI**

Выберите поставщика AI модели:

* Gemini 2.5 Flash (модель по умолчанию - системная)
* **OpenAI** — GPT-5,
* **Anthropic** — Claude
* **Google** — Gemini
* OpenRoute

Для работы необходимо настроить API ключ в настройках -> Интеграции.

### **Модель**

Выберите конкретную модель:

* GPT-5 — самая мощная, но медленная и дорогая
* Gemini — быстрая и доступная
* Claude-4.5 — хороший баланс

### **Системный промпт**

Инструкция для AI, определяющая его роль и поведение.

#### **Пример:**

```
Ты — менеджер по продажам компании TechStore.
Твоя задача — помочь клиенту выбрать ноутбук.
Задавай уточняющие вопросы о бюджете и требованиях.
Будь вежливым и профессиональным.
```

### **Пользовательский промт**

Запрос к AI с контекстом текущего диалога.

#### **Можно использовать переменные:**

```
Клиент написал: {{message.text}}
Его имя: {{client.name}}
Предыдущие покупки: {{transactions.count}}

Ответь на вопрос клиента о наших товарах.
```

### **Параметры генерации**

* **Температура** (0.0-2.0) — креативность ответов
  * 0.0 — предсказуемые, точные ответы
  * 1.0 — баланс
  * 2.0 — креативные, разнообразные ответы
* **Max tokens** — максимальная длина ответа (100-4000)

### **Сохранить ответ**

Переменная для сохранения ответа AI.

#### **Пример:**

```
Сохранить в: ai_recommendation
Использование: {{context.ai_recommendation}}
```


# Условия

Узел условия проверяет определённое условие и направляет поток по одной из двух веток.

<figure><img src="/files/PZPwTXLAw3UO4YIEEJsT" alt=""><figcaption></figcaption></figure>

#### **Все условия имеют два выхода:**

* ✅ **TRUE (зелёная точка)** — условие выполнено
* ❌ **FALSE (красная точка)** — условие не выполнено

## **Проверка текста**

Проверяет текст последнего сообщения пользователя.

<figure><img src="/files/sqrZ3P0Z0WVNHXBiegSv" alt=""><figcaption></figcaption></figure>

### **Типы проверок**

1. **Содержит** — сообщение содержит указанную подстроку

   ```
   Значение: "да"
   "да, согласен" → TRUE
   "хорошо" → FALSE
   ```
2. **Равно** — сообщение точно совпадает (регистр не учитывается)

   ```
   Значение: "отмена"
   "отмена" → TRUE
   "отмена заказа" → FALSE
   ```
3. **Начинается с** — сообщение начинается с указанного текста

   ```
   Значение: "/cmd"
   "/cmd start" → TRUE
   "команда /cmd" → FALSE
   ```
4. **Заканчивается на** — сообщение заканчивается указанным текстом

   ```
   Значение: "?"
   "как дела?" → TRUE
   "привет" → FALSE
   ```
5. **Регулярное выражение** — для сложных проверок

   ```
   Значение: "^[0-9]+$"
   "12345" → TRUE
   "123abc" → FALSE
   ```

## **Переменная**

Проверяет значение переменной контекста.

<figure><img src="/files/Fbx3VI2b5e6tf7dDOwBc" alt=""><figcaption></figcaption></figure>

### **Операторы сравнения**

* `==` — равно
* `!=` — не равно
* `>` — больше
* `<` — меньше
* `>=` — больше или равно
* `<=` — меньше или равно
* `contains` — содержит (для строк)

### **Примеры**

```
{{context.score}} > 10
{{context.user_name}} == "Иван"
{{context.answers}} contains "да"
```

## **Клиент существует**

Проверяет, есть ли в CRM клиент с данным Telegram ID.

<figure><img src="/files/Xz63wLgXBhKky54JPOrO" alt=""><figcaption></figcaption></figure>

### **Использование**

* TRUE → клиент найден в базе
* FALSE → новый пользователь

### **Пример сценария**

```
[Клиент существует?]
    ├─ TRUE → "Рады видеть вас снова!"
    └─ FALSE → "Добро пожаловать! Давайте познакомимся."
```

## **Есть покупки**

Проверяет, есть ли у клиента завершённые транзакции.

<figure><img src="/files/bZgH8fc7fUl2d7RPsurx" alt=""><figcaption></figcaption></figure>

### **Использование**

* TRUE → клиент совершал покупки
* FALSE → клиент новый или не покупал

### **Пример сценария**

```
[Есть покупки?]
    ├─ TRUE → "Спасибо за покупки! Вот персональная скидка: {{context.discount_code}}"
    └─ FALSE → "Специально для вас скидка на первый заказ!"
```

## **Время суток**

Проверяет текущее время в часовом поясе компании.

<figure><img src="/files/6Nnb2WxjALv69vLPgKMI" alt=""><figcaption></figcaption></figure>

### **Периоды**

* Утро — 06:00-11:59
* День — 12:00-17:59
* Вечер — 18:00-22:59
* Ночь — 23:00-05:59

### **Использование**

```
[Время суток?]
    ├─ Утро → "Доброе утро! ☀️"
    ├─ День → "Добрый день! 🌤️"
    ├─ Вечер → "Добрый вечер! 🌆"
    └─ Ночь → "Доброй ночи! Мы работаем круглосуточно! 🌙"
```


# Управление клиентом

Выполняет операции над клиентами в вашей CRM системе: обновляет информацию, создаёт транзакции и сделки

<figure><img src="/files/PqyrCZGmngxGBDOudXnf" alt=""><figcaption></figcaption></figure>

## **Основные возможности**

### **Выбор целевого клиента**

Сначала выберите, с каким клиентом работать:

1. **Текущий пользователь бота** — клиент, который сейчас общается с ботом
   * Автоматически находится по Telegram ID
   * Если клиента нет в базе, он будет создан автоматически
2. **Конкретный клиент** — выбор клиента из списка CRM
   * Используйте поиск по имени, email или телефону
   * Полезно для операций от имени менеджера

## **Типы действий**

После выбора клиента, укажите действие:

***

## **Обновить информацию**

#### **Когда использовать:**

* ✅ Сохранение данных, собранных в диалоге (имя, телефон, email)
* ✅ Обновление категории клиента (VIP, постоянный и т.д.)
* ✅ Установка пользовательских полей (бонусные баллы, дата последнего заказа)

### **Что можно обновлять**

*Статические поля клиента:*

* **Имя** — полное имя клиента
* **Телефон** — номер телефона
* **Email** — адрес электронной почты
* **Telegram** — username в Telegram
* **Категория** — категория клиента (Новые, Постоянные, VIP и др.)
* **Статус** — активен/неактивен
* **День рождения** — дата рождения

*Контекстные переменные* (пользовательские поля):

* **Бонусные баллы** — накопленные баллы лояльности
* **Дата последнего заказа** — когда клиент делал заказ
* **Предпочитаемый продукт** — любимый товар/услуга
* **VIP статус** — является ли VIP клиентом
* Любые другие поля, которые вы настроили в разделе "Клиенты → Настройки"

### **Настройки**

Для каждого поля укажите:

1. **Название поля** — выберите из списка или введите имя контекстной переменной
2. **Значение** — что сохранить (может содержать переменные типа `{{context.user_name}}`)
3. **Тип поля** — статическое поле или контекстная переменная

### **Доступные поля**

#### **Назначить менеджера**

Для назначения менеджера клиенту есть два способа:

1. **Выбрать из списка** — выберите конкретного активного сотрудника компании из выпадающего списка

   ```
   Пример: Выбираете "Иван Петров" из списка
   Результат: UUID менеджера автоматически подставится
   ```
2. **Из переменной** — используйте переменную с UUID менеджера

   ```
   Пример: {{context.manager_id}}
   Использование: После ноды "Найти сотрудника"
   ```

**💡 Совет:** Используйте ноду "Найти сотрудника" перед "Управлением клиентом" для автоматического выбора менеджера по критериям (например, менеджер с минимальным количеством клиентов).

#### **Категория клиента**&#x20;

Категорию можно выбрать **только из существующих** категорий, настроенных в разделе "Клиенты" → "Настройки" → "Категории".

* ✅ Выберите категорию из выпадающего списка
* ❌ Нельзя ввести произвольное значение
* ❌ Нельзя создать новую категорию через бота

```
Пример настроенных категорий:
- Новый клиент (🟢 зелёный)
- VIP клиент (🟡 золотой)  
- Проблемный клиент (🔴 красный)
```

### **Пример использования**

```
[Найти сотрудника] → Найти менеджера с минимумом клиентов
     ↓ (сохранить в: free_manager_id)
     ↓
[Управление клиентом] → Обновить информацию
Поля:
  - Назначить менеджера: {{context.free_manager_id}} (из переменной)
  - Категория: "Новый клиент" (из списка)
```

#### **Пример сценария: регистрация клиента**

```
[Отправить сообщение ⏳]
Текст: "Как вас зовут?"
Ожидать ответ: ВКЛ
Сохранить в: user_name
         ↓ 💬
         ↓
[Отправить сообщение ⏳]
Текст: "Укажите ваш телефон:"
Ожидать ответ: ВКЛ
Сохранить в: user_phone
         ↓ 💬
         ↓
[Управление клиентом]
Целевой клиент: Текущий пользователь
Действие: Обновить информацию
Поля:
  - Имя: {{context.user_name}} (статическое)
  - Телефон: {{context.user_phone}} (статическое)
  - Дата регистрации: {{now}} (контекстная переменная)
```

***

## **Создать транзакцию**

### **Когда использовать**

* ✅ Фиксация покупки или платежа
* ✅ Начисление бонусов
* ✅ Учёт возвратов или списаний

### **Настройки**

1. **Сумма транзакции** (обязательно) — числовое значение или переменная

   ```
   Примеры:
   5000
   {{context.payment_amount}}
   {{context.price * context.quantity}}
   ```
2. **Описание** (необязательно) — пояснение к транзакции

   ```
   Примеры:
   Оплата заказа №{{context.order_id}}
   Начисление бонусов
   Возврат средств
   ```
3. **Категория** (необязательно) — тип транзакции для отчётности

   ```
   Примеры:
   Продажа
   Возврат
   Бонусы
   ```

### **Пример сценария**

```
[Отправить сообщение ⏳]
Текст: "Укажите сумму покупки:"
Ожидать ответ: ВКЛ
Сохранить в: purchase_amount
         ↓ 💬
         ↓
[Управление клиентом]
Целевой клиент: Текущий пользователь
Действие: Создать транзакцию
Сумма: {{context.purchase_amount}}
Описание: Покупка через Telegram бот
Категория: Продажа
         ↓
[Отправить сообщение]
Текст: "Покупка на сумму {{context.purchase_amount}} руб. зарегистрирована! ✅"
```

***

## **Создать сделку**

### **Когда использовать**

* ✅ Клиент проявил интерес к товару/услуге
* ✅ Начало переговоров о сотрудничестве
* ✅ Фиксация заявки на консультацию
* ✅ Создание лида для менеджера

### **Настройки**

1. **Название сделки** (обязательно) — краткое описание

   ```
   Примеры:
   Запрос консультации
   Интерес к тарифу Premium
   Заказ корпоративного обучения
   Сделка: {{context.product_name}}
   ```
2. **Сумма** (необязательно) — предполагаемая сумма сделки

   ```
   Примеры:
   50000
   {{context.estimated_amount}}
   ```
3. **Статус** (необязательно) — этап сделки
   * **Новая** — только что создана (по умолчанию)
   * **В работе** — ведутся переговоры
   * **Выиграна** — сделка успешно закрыта
   * **Проиграна** — сделка не состоялась
4. **Описание** (необязательно) — дополнительные детали

   ```
   Примеры:
   Клиент интересуется {{context.product_name}}
   Заявка получена через Telegram бот
   Требуется связаться в течение 24 часов
   ```
5. **Категория** (необязательно) — тип сделки

   ```
   Примеры:
   Входящий запрос
   Повторная продажа
   Корпоративный клиент
   ```

### **Пример сценария**

Создание сделки с уведомлением менеджера

```
[Триггер: Кнопка "Заказать консультацию"]
         ↓
[Отправить сообщение ⏳]
Текст: "Какой продукт вас интересует?"
Ожидать ответ: ВКЛ
Сохранить в: product_interest
         ↓ 💬
         ↓
[Управление клиентом]
Целевой клиент: Текущий пользователь
Действие: Создать сделку
Название: Запрос консультации
Сумма: (не указана)
Статус: Новая
Описание: Клиент интересуется: {{context.product_interest}}
Категория: Входящий запрос
         ↓
[Уведомление]
Канал: Telegram
Получатели: [Менеджер по продажам]
Сообщение: "🔔 Новая сделка!
Клиент: {{client.name}}
Интерес: {{context.product_interest}}
Telegram: @{{client.telegram}}"
         ↓
[Отправить сообщение]
Текст: "Спасибо! Менеджер свяжется с вами в ближайшее время."
```

***

## **Использование переменных**

Все поля поддерживают переменные:

### **Из контекста**

* `{{context.variable_name}}` — переменные, сохранённые ранее
* `{{message.text}}` — последнее сообщение пользователя

### **Данные клиента**

* `{{client.name}}` — имя текущего клиента
* `{{client.phone}}` — телефон клиента
* `{{client.email}}` — email клиента

### **Специальные**

* `{{now}}` — текущая дата и время
* `{{callback_data}}` — данные нажатой кнопки

### **Вычисления**

```
{{context.price * 1.2}}  — цена + 20%
{{context.score + 10}}   — добавить 10 баллов
```

***

## **Советы по использованию**

#### **✅ Хорошие практики:**

1. **Всегда сохраняйте контакты клиента**

   ```
   После сбора имени и телефона → Обновить информацию
   ```
2. **Создавайте сделки при явном интересе**

   ```
   Клиент нажал "Хочу купить" → Создать сделку + Уведомить менеджера
   ```
3. **Фиксируйте транзакции после оплаты**

   ```
   После подтверждения платежа → Создать транзакцию
   ```
4. **Используйте контекстные переменные для бизнес-логики**

   ```
   Сохраняйте: количество заказов, средний чек, дату последней покупки
   ```

#### **❌ Чего избегать:**

1. Не обновляйте поля пустыми значениями без необходимости
2. Не создавайте дубликаты транзакций в одном сценарии
3. Не забывайте указывать описание для транзакций и сделок

***

## **Комбинирование с другими узлами**

### **С уведомлениями**

```
[Создать сделку] → [Уведомление менеджеру]
```

### **С условиями**

```
[Условие: сумма > 10000]
  ├─ true → [Обновить категорию на VIP]
  └─ false → [Стандартная обработка]
```

### **С ИИ Агентом**

```
[ИИ Агент: Квалификация лида]
         ↓
[Условие: лид качественный?]
  ├─ true → [Создать сделку]
  └─ false → [Поблагодарить и завершить]
```


# Найти сотрудника

Автоматически находит сотрудника компании по различным критериям и сохраняет его ID для дальнейшего использования.

<figure><img src="/files/WmhKrWhtJByHUOE9MdIQ" alt=""><figcaption></figcaption></figure>

## **Когда использовать**

* ✅ Автоматическое распределение новых клиентов между менеджерами
* ✅ Поиск наименее загруженного менеджера
* ✅ Назначение ответственного по имени или роли
* ✅ Отправка уведомлений конкретному сотруднику
* ✅ Создание системы балансировки нагрузки

## **Настройки**

<figure><img src="/files/hFKYoEcXrsVlyULv8LnP" alt=""><figcaption></figcaption></figure>

## **Тип поиска**

Выберите критерий поиска сотрудника:

### **По ФИО**

Ищет сотрудника по имени или фамилии.

**Режим поиска:**

* **Точное совпадение** — полное совпадение имени
* **Содержит** — имя содержит указанный текст
* **Начинается с** — имя начинается с указанного текста

**Значение:** Введите имя или используйте переменную `{{context.name}}`

#### **Пример:**

```
Тип: По ФИО
Режим: Содержит
Значение: Иванов
→ Найдет: "Иван Иванов", "Иванова Мария"
```

### **По Email**&#x20;

Ищет сотрудника по адресу электронной почты.

**Режим поиска:** Точное совпадение / Содержит / Начинается с

#### **Пример:**

```
Тип: По Email
Режим: Точное совпадение
Значение: manager@company.com
```

### **По Telegram**&#x20;

Ищет сотрудника по username в Telegram.

**Важно:** Сотрудник должен привязать свой Telegram к профилю в системе.

**Пример:**

```
Тип: По Telegram
Режим: Точное совпадение
Значение: @ivan_manager
```

### **По количеству клиентов**

#### **Самый полезный тип для автоматического распределения**

Ищет сотрудника по количеству назначенных ему клиентов.

#### **Режим поиска:**

* **Минимум клиентов** — найдет менеджера с наименьшей загрузкой (идеально для распределения)
* **Максимум клиентов** — найдет самого загруженного менеджера
* **Равно** — найдет менеджера с точным количеством клиентов

### **Примеры использования**

#### **Автоматическое распределение новых клиентов:**

```
[Триггер: Новый клиент написал /start]
     ↓
[Найти сотрудника]
Тип: По количеству клиентов
Режим: Минимум клиентов
Сохранить в: free_manager
     ↓
[Управление клиентом]
Действие: Обновить информацию
Поля:
  - Назначить менеджера: {{context.free_manager}}
     ↓
[Уведомление]
Получатели: {{context.free_manager}}
Сообщение: "Вам назначен новый клиент!"
```

#### **Найти самого опытного менеджера:**

```
Тип: По количеству клиентов
Режим: Максимум клиентов
→ Для сложных VIP клиентов
```

### **По роли**

Ищет сотрудника с указанной ролью в компании.

**Доступные роли:**

* Владелец
* Директор
* Главный менеджер
* Менеджер
* Сотрудник

**Важно:** Если несколько сотрудников имеют эту роль, вернется случайный из них.

#### **Пример:**

```
Тип: По роли
Роль: Главный менеджер
→ Для эскалации сложных вопросов
```

### **Случайный**

Выбирает случайного активного сотрудника.

**Когда использовать:**

* Равномерное распределение без учёта загрузки
* Для тестирования
* Ротация ответственных

**Сохранить результат в**

**Обязательное поле!** Имя переменной для сохранения `user_id` найденного сотрудника.

**Примеры:**

* `manager_id` — для назначения менеджера
* `support_id` — для отправки в поддержку
* `responsible_person` — для ответственного лица

**Использование результата:**

```
{{context.manager_id}} — в ноде "Управление клиентом"
{{context.support_id}} — в ноде "Уведомление"
```

### **Если не найден**

Что делать, если сотрудник по критериям не найден:

* **Пропустить и продолжить** ✅ (рекомендуется) — выполнение продолжается, переменная остаётся пустой
* **Остановить выполнение** — сценарий прекращается
* **Установить null** — переменная получает значение `null`, выполнение продолжается

#### **Только активные**

**По умолчанию включено** — ищет только среди активных сотрудников (не уволенных, не заблокированных).

***

### **Примеры сценариев**

**Сценарий 1: Автоматическое распределение лидов**

```
[Триггер: Команда /newlead]
     ↓
[Отправить сообщение ⏳]
Текст: "Укажите имя клиента:"
Ожидать ответ: ВКЛ
Сохранить в: client_name
     ↓ 💬
     ↓
[Найти сотрудника]
Тип: По количеству клиентов
Режим: Минимум клиентов
Сохранить в: assigned_manager
Если не найден: Пропустить
     ↓
[Управление клиентом]
Целевой клиент: Текущий пользователь
Действие: Обновить информацию
Поля:
  - Имя: {{context.client_name}}
  - Назначить менеджера: {{context.assigned_manager}}
  - Категория: "Новый лид"
     ↓
[Создать сделку]
Название: "Новый лид: {{context.client_name}}"
Статус: Новая
     ↓
[Уведомление]
Канал: Telegram
Получатели: {{context.assigned_manager}}
Сообщение: "🎯 Вам назначен новый лид!
Имя: {{context.client_name}}
Telegram: @{{client.telegram}}"
```

**Сценарий 2: Эскалация в поддержку**

```
[Триггер: Кнопка "Проблема"]
     ↓
[Найти сотрудника]
Тип: По роли
Роль: Главный менеджер
Сохранить в: support_manager
     ↓
[Уведомление]
Канал: Telegram
Получатели: {{context.support_manager}}
Сообщение: "⚠️ Клиент сообщил о проблеме
Клиент: {{client.name}}
Контакт: {{client.phone}}"
     ↓
[Отправить сообщение]
Текст: "Ваш запрос передан менеджеру. Ожидайте ответа."
```

**Сценарий 3: Проверка перед назначением**

```
[Найти сотрудника]
Тип: По количеству клиентов
Режим: Минимум клиентов
Сохранить в: new_manager
Если не найден: Установить null
     ↓
[Условие: Менеджер найден?]
Тип: Сравнение переменных
Переменная: {{context.new_manager}}
Оператор: Не равно
Значение: null
     ↓ true
     ├─→ [Назначить менеджера]
     │
     ↓ false
     └─→ [Отправить сообщение]
         Текст: "Извините, все менеджеры заняты. Мы свяжемся с вами позже."
```

***

### **Советы по использованию**

**✅ Лучшие практики:**

1. **Используйте "Минимум клиентов" для распределения**

   ```
   Это автоматически балансирует нагрузку между менеджерами
   ```
2. **Всегда проверяйте результат**

   ```
   После find_employee → добавьте condition для проверки найден ли сотрудник
   ```
3. **Комбинируйте с уведомлениями**

   ```
   Найденный сотрудник должен получить уведомление о назначении
   ```
4. **Используйте "Только активные"**

   ```
   Избегайте назначения уволенным или неактивным сотрудникам
   ```

**❌ Чего избегать:**

1. Не забывайте указывать имя переменной для сохранения
2. Не используйте "Остановить выполнение" без необходимости
3. Не полагайтесь на случайный выбор для важных клиентов
4. Не забывайте про режим "Если не найден"

***

### **Интеграция с другими нодами**

**С управлением клиентом:**

```
[Найти сотрудника] → [Управление клиентом]
Результат поиска → Поле assigned_manager_id
```

**С уведомлениями:**

```
[Найти сотрудника] → [Уведомление]
Результат поиска → Получатели уведомления
```

**С условиями:**

```
[Найти сотрудника] → [Условие: Найден?] 
                          ├─ true → [Продолжить]
                          └─ false → [Альтернативный путь]
```


# Выход из бота

Завершает текущий сценарий и выходит из бота

<figure><img src="/files/S65cOenl3lQBtdsNbQ8Q" alt=""><figcaption></figcaption></figure>

### **Настройки**

* **Сообщение** (необязательно) — прощальное сообщение пользователю

### **Примеры использования**

```
"Спасибо за обращение! До встречи! 👋"
"Заявка принята. Мы свяжемся с вами в ближайшее время."
```

**Важно:** После этого узла бот перестанет отвечать на сообщения в этом сценарии. Для нового взаимодействия нужен новый триггер.


# Работа с переменными

Переменные позволяют сохранять и использовать данные в сценариях.

### Синтаксис

Переменные записываются в двойных фигурных скобках:

```
{{название.переменная}}
```

### Доступные переменные

#### **Сообщение пользователя**

```
{{message.text}} — текст последнего сообщения
```

#### **Контекст (ваши переменные)**

```
{{context.переменная}} — любая переменная, сохранённая через "Сохранить в контекст"

Примеры:
{{context.user_name}}
{{context.score}}
{{context.selected_product}}
```

#### **Данные кнопки**

```
{{callback_data}} — callback_data нажатой кнопки
```

#### **Данные клиента из CRM**

```
{{client.name}} — имя клиента
{{client.email}} — email
{{client.phone}} — телефон
{{client.telegram}} — Telegram ID
{{client.category}} — категория клиента
```

#### **Транзакции клиента**

```
{{transactions.total}} — общая сумма покупок
{{transactions.count}} — количество покупок
{{transactions.last_date}} — дата последней покупки
```

#### **Данные Telegram пользователя**

```
{{user.first_name}} — имя в Telegram
{{user.last_name}} — фамилия в Telegram
{{user.username}} — username в Telegram
```

***

### Формулы и выражения

Можно использовать математические и логические операции:

#### **Математика**

```
{{context.score}} + 10
{{transactions.total}} * 0.1
{{context.count}} - 1
```

#### **Сравнения**

```
{{context.score}} > 100
{{client.category}} == "VIP"
{{transactions.count}} >= 5
```

#### **Логические операции**

```
{{context.age}} > 18 and {{client.category}} == "verified"
{{context.score}} > 50 or {{transactions.total}} > 10000
```

#### **Строковые функции**

```
{{context.text}} contains "ключевое слово"
{{message.text}} starts_with "/"
{{client.name}} ends_with "ов"
```

***

### Примеры использования

#### **Пример 1: Персонализация**

```
Узел: Отправить сообщение
Текст: "Здравствуйте, {{client.name}}! 

У вас {{transactions.count}} покупок на сумму {{transactions.total}} руб."
```

#### **Пример 2: Накопление баллов**

```
Узел 1: Сохранить в контекст
Переменная: score
Значение: 0

Узел 2: Сохранить в контекст (после правильного ответа)
Переменная: score
Значение: {{context.score}} + 10

Узел 3: Отправить сообщение
Текст: "Ваш счёт: {{context.score}} баллов! 🎉"
```

#### **Пример 3: Условие с переменной**

```
Узел: Условие - Переменная
Условие: {{context.score}} >= 100

TRUE → "Поздравляем! Вы набрали {{context.score}} баллов и получаете подарок! 🎁"
FALSE → "Продолжайте играть! Для подарка нужно 100 баллов, у вас: {{context.score}}"
```

***

### Практические примеры

#### Пример 1: Простой приветственный бот

**Цель:** Бот приветствует пользователя по имени и показывает меню.

**Схема:**

```
[Триггер: Команда "/start"]
         ↓
[Действие: Отправить сообщение]
Текст: "Привет, {{user.first_name}}! 👋

Я — бот компании Example. Чем могу помочь?"

Кнопки:
- "О компании" | callback: "about"
- "Услуги" | callback: "services"
- "Контакты" | callback: "contacts"
```

**Добавляем обработку кнопок:**

```
[Триггер: Кнопка "about"]
         ↓
[Действие: Отправить сообщение]
Текст: "Мы — ведущая компания в сфере IT..."
```

***

#### Пример 2: Сбор контактных данных

**Цель:** Запросить у пользователя имя и телефон, сохранить в CRM.

**Схема:**

```
[Триггер: Команда "/contact"]
         ↓
[Действие: Отправить сообщение ⏳]
Текст: "Как вас зовут?"
Ожидать ответ: ВКЛ
Сохранить ответ в: user_name
         ↓ 💬 (обработчик ответа)
         ↓
[Действие: Отправить сообщение ⏳]
Текст: "Приятно познакомиться, {{context.user_name}}! 

Теперь укажите ваш номер телефона:"
Ожидать ответ: ВКЛ
Сохранить ответ в: user_phone
         ↓ 💬 (обработчик ответа)
         ↓
[Действие: HTTP запрос]
Метод: POST
URL: https://your-crm.com/api/leads
Тело: {
  "name": "{{context.user_name}}",
  "phone": "{{context.user_phone}}",
  "telegram": "{{user.username}}"
}
         ↓
[Действие: Отправить сообщение]
Текст: "Спасибо, {{context.user_name}}! 

Ваши данные сохранены. Мы свяжемся с вами в ближайшее время по номеру {{context.user_phone}}."
```

***

#### Пример 3: Бот-викторина с подсчётом баллов

**Цель:** Задать 3 вопроса, подсчитать правильные ответы, выдать результат.

**Схема:**

```
[Триггер: Команда "/quiz"]
         ↓
[Действие: Сохранить в контекст]
Переменная: score
Значение: 0
         ↓
[Действие: Отправить сообщение]
Текст: "Начинаем викторину! 🎯

Вопрос 1: Столица России?"
Кнопки:
- "Москва" | callback: "q1_correct"
- "Санкт-Петербург" | callback: "q1_wrong"
- "Казань" | callback: "q1_wrong"

[Триггер: Кнопка "q1_correct"]
         ↓
[Действие: Сохранить в контекст]
Переменная: score
Значение: {{context.score}} + 1
         ↓
[Действие: Отправить сообщение]
Текст: "Правильно! ✅ Ваш счёт: {{context.score}}

Вопрос 2: ..."

[Триггер: Кнопка "q1_wrong"]
         ↓
[Действие: Отправить сообщение]
Текст: "Неправильно! ❌ Ваш счёт: {{context.score}}

Вопрос 2: ..."

... (аналогично для вопросов 2 и 3)

После всех вопросов:

[Условие: Переменная]
Условие: {{context.score}} >= 2
         ↓
    TRUE → "Отлично! Вы набрали {{context.score}} из 3! 🏆"
    FALSE → "Попробуйте ещё раз! Вы набрали {{context.score}} из 3."
```

***

#### Пример 4: Бот с ИИ помощником

**Цель:** Бот использует AI для ответов на вопросы о товарах.

**Схема:**

```
[Триггер: Команда "/ask"]
         ↓
[Действие: Отправить сообщение ⏳]
Текст: "Задайте ваш вопрос о наших товарах, и я помогу вам с выбором! 🤖"
Ожидать ответ: ВКЛ
Сохранить ответ в: user_question
         ↓ 💬
         ↓
[ИИ Агент]
Провайдер: OpenAI
Модель: GPT-5
Системный промпт: "Ты — консультант магазина электроники TechStore. 
Помогаешь клиентам выбрать товары. 
Каталог: ноутбуки (от 30000 руб), смартфоны (от 15000 руб), наушники (от 2000 руб).
Всегда будь вежлив и предлагай 2-3 варианта."

Пользовательский промпт: "Клиент спрашивает: {{context.user_question}}

Имя клиента: {{user.first_name}}
Количество предыдущих покупок: {{transactions.count}}"

Температура: 0.7
Max tokens: 500
Сохранить ответ в: ai_answer
         ↓
[Действие: Отправить сообщение]
Текст: "{{context.ai_answer}}

Хотите задать ещё вопрос?"
Кнопки:
- "Да" | callback: "ask_again"
- "Оформить заказ" | callback: "make_order"

[Триггер: Кнопка "ask_again"]
         ↓
(возврат к началу сценария)
```

***

#### Пример 5: Бот с уведомлениями менеджеру

**Цель:** При заявке клиента отправить уведомление менеджеру в Telegram.

**Схема:**

```
[Триггер: Команда "/order"]
         ↓
[Действие: Отправить сообщение ⏳]
Текст: "Укажите ваше имя:"
Ожидать ответ: ВКЛ
Сохранить в: client_name
         ↓ 💬
         ↓
[Действие: Отправить сообщение ⏳]
Текст: "Укажите ваш телефон:"
Ожидать ответ: ВКЛ
Сохранить в: client_phone
         ↓ 💬
         ↓
[Действие: Уведомление]
Канал: Telegram
Получатели: [Менеджер по продажам]
Сообщение: "🔔 Новая заявка!

Имя: {{context.client_name}}
Телефон: {{context.client_phone}}
Telegram: @{{user.username}}

Время: {{now}}"
         ↓
[Действие: Отправить сообщение]
Текст: "Спасибо, {{context.client_name}}! 
```


# Работа с ИИ помощником

Редактор ботов имеет встроенного ИИ помощника, который может помочь вам создать или доработать сценарий бота. Помощник работает в двух режимах: **Режим планирования** и **Режим создания**.

<figure><img src="/files/oaa9BH3JYEXc2ZWw0Y5Y" alt=""><figcaption></figcaption></figure>

#### Как открыть ИИ помощника

В правом верхнем углу редактора найдите кнопку с иконкой **"ИИ помощник"** (мозг). Нажмите на неё, чтобы открыть панель помощника справа.

<figure><img src="/files/BkOKI8gEwlcV5bRtQvxx" alt=""><figcaption></figcaption></figure>

### Режим планирования&#x20;

**Что это:** Режим диалога, в котором ИИ помогает вам продумать бизнес-логику бота через вопросы и ответы.

**Когда использовать:**

* Когда вы только начинаете создавать бота и не уверены в структуре
* Когда нужна помощь в проработке бизнес-логики
* Когда хотите получить экспертные рекомендации по построению сценария

**Как работает:**

1. **Диалог с помощником:**
   * Опишите своими словами, что должен делать бот
   * ИИ задаст вам уточняющие вопросы
2. **Примеры вопросов от ИИ:**

   ```
   - "Расскажите подробнее о вашей целевой аудитории?"
   - "Какие данные о клиенте вам нужно собрать?"
   - "Нужна ли интеграция с CRM или другими системами?"
   - "Как должен бот реагировать на разные типы ответов?"
   ```
3. **Создание плана:**
   * Когда ИИ соберёт достаточно информации, он создаст **структурированный план сценария**
   * План включает:
     * Описание всех узлов
     * Логику переходов
     * Примеры сообщений
     * Рекомендации по переменным
4. **Применение плана:**

   * План отобразится в чате с кнопкой **"Применить план"**

   <figure><img src="/files/nYPxtxBmCpNfx45SEvyw" alt=""><figcaption></figcaption></figure>

   * При нажатии на кнопку:
     * Вы автоматически переключитесь в **Режим создания**
     * ИИ начнёт генерировать сценарий на основе плана
     * Сгенерированный сценарий автоматически загрузится в редактор

**Пример диалога:**

```
Вы: Нужен бот для сбора заявок на консультацию
ИИ: Расскажите подробнее о вашей целевой аудитории?
Вы: Это владельцы малого бизнеса, интересующиеся автоматизацией
ИИ: Какие данные нужно собрать в заявке?
Вы: Имя, компанию, телефон, описание задачи
ИИ: Нужна ли интеграция с CRM?
Вы: Да, нужно отправлять в нашу CRM через webhook
ИИ: [создаёт план с узлами приветствия, сбора данных, отправки в CRM]
```

### Режим создания

**Что это:** Режим прямой генерации сценария бота на основе ваших текстовых запросов.

**Когда использовать:**

* Когда вы точно знаете, что нужно сделать
* Когда нужно добавить конкретный функционал

**Как работает:**

1. **Прямой запрос:**
   * Напишите конкретное описание того, что нужно создать
   * ИИ сразу сгенерирует сценарий
   * Не будет задавать уточняющих вопросов
2. **История запросов:**
   * Сохраняются последние 20 запросов
3. **Примеры промптов:**

   **Создание с нуля:**

   ```
   "Создай бота для опроса удовлетворённости клиентов. 
   Нужно спросить оценку от 1 до 5, если меньше 4 - 
   попросить комментарий, сохранить всё в контекст"
   ```

   **Доработка существующего (в процессе разработки):**

   ```
   "Добавь после сбора email проверку через HTTP запрос 
   к API валидации. Если email невалидный - попроси ввести заново"
   ```

   **Добавление AI агента:**

   ```
   "После приветствия добавь AI агента, который будет 
   отвечать на вопросы о продукте. Используй модель 
   Gemini Flash, промпт: 'Ты эксперт по нашему продукту'"
   ```
4. **Валидация и автоисправление:**
   * ИИ автоматически проверяет сгенерированную конфигурацию
   * Если находит ошибки - пытается исправить их
5. **Ручное редактирование:**
   * Если автоисправление не помогло, появится диалог
   * Можно вручную отредактировать JSON
   * Встроенная подсветка синтаксиса и проверка ошибок
6. **Автоматическая раскладка:**
   * После успешной загрузки узлы автоматически раскладываются на холсте

### Переключение между режимами

Вверху панели помощника есть две вкладки:

* **💭 Planning** - режим планирования
* **⚙️ Creation** - режим создания

**Рекомендованный workflow:**

1. Начните с **Planning** для проработки идеи
2. Примените план - автоматически переключитесь в **Creation**
3. Дорабатывайте детали в **Creation** режиме
4. При необходимости кардинальных изменений - вернитесь в **Planning**

### Работа с ошибками

**Автоматическое исправление:**

1. ИИ генерирует JSON
2. Система валидирует конфигурацию
3. Если есть ошибки:
   * ИИ получает описание ошибок
   * Пытается исправить (до 3 попыток)
   * Показывает процесс исправления в чате

**Ручное редактирование:**

* Если автоисправление не помогло
* Появится диалог **"Edit JSON Manually"**
* Встроенный редактор с подсветкой синтаксиса
* Показывает конкретные ошибки валидации

**Типичные ошибки:**

* Отсутствующий trigger у кнопок
* Неправильные типы условий
* Отсутствие обязательных полей
* Невалидные URLs для медиа

### Лучшие практики при работе с ИИ помощником

**Формулировка запросов:**

✅ **Хорошо:**

```
"Создай бота для записи на консультацию. Нужно собрать 
имя, телефон, удобное время. После сбора отправить 
уведомление менеджеру и сохранить в CRM"
```

❌ **Плохо:**

```
"Сделай бота"
```

**Конкретизируйте детали:**

* Какие данные собирать
* Какие условия проверять
* Какие интеграции нужны
* Какие сообщения показывать

**Итеративная доработка:**

* Не пытайтесь создать всё сразу
* Создайте базовый сценарий
* Потом добавляйте фичи по одной
* Тестируйте после каждого изменения

**Проверяйте результат:**

* После генерации просмотрите узлы на холсте
* Проверьте логику переходов
* Протестируйте бота в Telegram
* При необходимости попросите ИИ доработать

### Ограничения и лимиты

**Токены:**

* Каждый запрос потребляет токены из лимита вашего тарифного плана
* Сложные сценарии требуют больше токенов
* При достижении лимита появится ошибка&#x20;

**Rate Limits:**

* Ограничение на количество запросов в минуту
* При превышении появится ошибка
* Подождите несколько секунд перед следующим запросом

**Размер конфигурации:**

* Очень сложные боты (>50 узлов) могут генерироваться дольше
* Если генерация обрывается - система предложит продолжить

**Качество генерации:**

* ИИ лучше работает с конкретными, структурированными запросами
* Чем подробнее описание - тем точнее результат
* Всегда проверяйте и тестируйте сгенерированный сценарий

#### Примеры использования

**Пример 1: Создание бота с нуля (Planning → Creation)**

1. Открываем Planning режим
2. Пишем: "Нужен бот для обработки входящих обращений клиентов"
3. Отвечаем на вопросы ИИ о бизнес-логике
4. Применяем созданный план
5. Дорабатываем детали в Creation режиме

**Пример 2: Добавление AI агента (Creation)**

```
"После узла приветствия добавь AI агента. 
Используй провайдер Gemini Flash.
Системный промпт: 'Ты помощник магазина электроники'.
Пользовательский промпт: '{{message.text}}'.
Сохрани ответ в переменную ai_response.
Включи режим ожидания ответа"
```

**Пример 3: Добавление условий (Creation)**

```
"Добавь проверку: если в контексте score >= 7, 
отправь сообщение 'Отлично!' и перейди к узлу благодарности,
иначе отправь 'Спасибо за честность' и перейди к узлу уточнений"
```

**Пример 4: Интеграция с API (Creation)**

```
"После сбора email добавь HTTP запрос к 
https://api.example.com/validate-email
Метод POST, отправь {email: '{{context.email}}'}
Сохрани результат в context.validation_result"
```


# Советы и лучшие практики

### Организация потока

**✅ Хорошо:**

* Располагайте узлы слева направо и сверху вниз
* Группируйте связанные узлы близко друг к другу
* Используйте комментарии для сложных участков
* Давайте узлам понятные названия ("Запрос имени", "Проверка возраста")

**❌ Плохо:**

* Хаотичное расположение узлов
* Пересекающиеся линии соединений
* Названия по умолчанию ("Action Node 1", "Condition 2")

### Работа с кнопками

**✅ Хорошо:**

```
Текст кнопки: "Купить товар"
Callback: "buy_product_123"

→ Создать триггер "Кнопка" с callback "buy_product_123"
или
→ Создать связь от Кнопка" с callback "buy_product_123"
```

**❌ Плохо:**

```
Текст кнопки: "Купить"
Callback: "btn1" (неинформативно)

→ Забыть создать триггер для обработки
→ Забыть создать связь от кнопки 
```

**Правило:** Всегда создавайте триггеры для кнопок!

### Использование ожидания ответа

**✅ Когда включать ⏳:**

* Запрос имени, телефона, email
* Вопросы, требующие текстового ответа
* Получение комментария или отзыва

**❌ Когда не включать:**

* При использовании кнопок (они не требуют текстового ответа)
* Информационные сообщения
* Сообщения-подтверждения

Исключения:

Когда у вас есть вопрос, требующий ответа, но его можно пропустить, в таком случае можно ставить и кнопку и ожидание ответа, у вас появится 2 разных выхода из ноды, где можно обработать оба варианта.&#x20;

### Переменные

**✅ Хорошо:**

```
Переменная: user_age
Переменная: selected_product_id
Переменная: payment_confirmed
```

**❌ Плохо:**

```
Переменная: var1 (неинформативно)
Переменная: Возраст пользователя (пробелы и кириллица могут вызвать проблемы)
```

**Правило:** Используйте английские буквы, цифры и подчёркивания.

### Оптимизация

**Избегайте дублирования**

Если один и тот же текст используется несколько раз:

❌ Плохо:

```
[Узел 1] → Текст: "Спасибо за обращение!"
[Узел 2] → Текст: "Спасибо за обращение!"
[Узел 3] → Текст: "Спасибо за обращение!"
```

✅ Хорошо:

```
[Узел 1] ─┐
[Узел 2] ─┼→ [Общий узел] → Текст: "Спасибо за обращение!"
[Узел 3] ─┘
```

**Используйте условия эффективно**

```
✅ Хорошо:
[Условие: Клиент существует?]
    ├─ TRUE → персонализированное приветствие
    └─ FALSE → регистрация нового клиента

❌ Плохо:
Проверять существование клиента в каждом узле отдельно
```

### Тестирование

Перед запуском сценария:

1. ✅ Проверьте все триггеры (есть ли обработчики для всех кнопок?)
2. ✅ Протестируйте все ветки условий (TRUE и FALSE)
3. ✅ Проверьте переменные (сохраняются ли и используются ли правильно?)
4. ✅ Убедитесь, что нет "тупиковых" узлов (без выходов)
5. ✅ Проверьте URL медиафайлов (доступны ли они публично?)

### Документирование

Используйте комментарии к узлам:

```
Узел: Условие - Переменная
Название: "Проверка возраста"
Комментарий: "Проверяем, что пользователю есть 18 лет перед показом контента для взрослых"
```

Это поможет вам и вашим коллегам понимать логику сценария.

***

### Заключение

Визуальный редактор чат-ботов — мощный инструмент для создания сложных сценариев без программирования. Следуя этому руководству, вы сможете:

* ✅ Создавать логичные и понятные сценарии
* ✅ Использовать все возможности узлов
* ✅ Правильно работать с переменными и условиями
* ✅ Интегрировать AI для умных ответов
* ✅ Избегать типичных ошибок

**Помните:** Начинайте с простых сценариев и постепенно усложняйте их. Тестируйте каждое изменение.

Удачи в создании ботов! 🚀


# Changelog


# 1.2.1

Минорное обновление - 2026-05-06

Минорное обновление: переименовали два путающих раздела, починили глобального ИИ-помощника, прокачали узлы YouTube — теперь субтитры работают и на чужих видео, добавили рефералки и UTM-метки в команды бота, и десятки UX-улучшений.

***

## **Добавлено**&#x20;

### **1. Узлы YouTube — 6 новых узлов в конструкторе**

Подключили полноценную работу с YouTube через интеграцию Google. Каждая компания подключает свои Google Cloud credentials в разделе «Интеграции» и получает свою независимую квоту YouTube Data API (10 000 единиц в день, своя на каждую компанию). В палитре конструктора узлы заблокированы до тех пор, пока YouTube не включён в интеграции — после подключения становятся доступны 6 узлов:

* **Поиск.** Находит видео, каналы или плейлисты по поисковому запросу. Можно фильтровать по конкретному каналу, выбирать тип (Видео / Каналы / Плейлисты), сортировку (релевантность, дата, просмотры, рейтинг, алфавит) и количество результатов от 1 до 50. Результат — массив с заголовками, описаниями, превью и метаданными. Запросы кешируются на сутки, поэтому повторный одинаковый поиск не сжигает квоту.
* **Инфо о видео.** Полная информация о видео по ссылке или ID. Поддерживает все форматы ссылок YouTube (короткие, обычные, Shorts, или просто 11-символьный ID). В ответе — название, описание, канал, дата публикации, длительность, превью, число просмотров / лайков / комментариев, теги, категория. Удобно подавать в ИИ-агента «расскажи о чём видео» или сохранять данные о популярном видео в карточку клиента.
* **Аналитика канала.** Сводка по подключённому каналу за выбранный период (от 1 до 30 дней). Показывает подписчиков, общие просмотры за всё время, число видео, метрики последних 10 видео и сводку за период (просмотры, время просмотра, средняя длительность, прирост / отток подписчиков). Идеально передаётся в ИИ-агент: типовой сценарий «каждый понедельник в 9 утра — взять аналитику — попросить ИИ дать 5 рекомендаций по контенту — отправить уведомление в колокольчик» работает в 4 узла.
* **Редактировать видео.** Изменяет метаданные собственного видео (где OAuth-аккаунт владеет каналом). В редакторе узла есть выпадающий список последних 30 видео канала — выбираете нужное, поля автоматически заполняются текущими значениями, дальше можно править только то, что нужно (заголовок, описание, теги). Незаполненные поля не трогаются.
* **Сменить обложку.** Загружает кастомную обложку для собственного видео из URL изображения (JPEG / PNG до 2 МБ). Поддерживает переменные сценария — например, можно автоматически устанавливать обложку, сгенерированную узлом nano-banana, на новое видео сразу после его загрузки.
* **Субтитры.** Получает текст субтитров с любого публичного YouTube-видео — можно передать в ИИ-агента для саммари, перевода, поиска по содержимому, генерации цитат. Подробнее про этот узел — в пункте 2 ниже.

В карточке Google-интеграции в настройках появился live-счётчик использованной квоты за сегодня с разбивкой по операциям — видно, сколько единиц съело редактирование, сколько — поиск, и так далее. Когда квота на исходе, видно заранее.

ИИ-помощник конструктора (нижняя правая фиолетовая иконка) знает про все 6 узлов и про типовые сценарии — попросите его «сделай саммари видео по ссылке которую пришлёт пользователь» или «каждую неделю давай мне рекомендации по моему каналу» и он соберёт сценарий сам.

***

## Изменено

***

### **1. Понятные названия разделов знаний**

«База знаний» → **«Справочник»**, «RAG-пространство» → **«AI-база знаний»**.

Раньше пользователи путались: оба раздела про «знания», но работают по-разному. Теперь имена явно отражают назначение:

* **Справочник** — для FAQ, прайсов, расписаний, таблиц данных. Содержимое целиком уходит в ИИ-помощника.
* **AI-база знаний** — для больших документов (PDF, DOCX), по которым ИИ ищет ответ через семантический поиск.

В палитре конструктора узел называется «AI-база знаний (RAG)» — для опытных пользователей пометка «(RAG)» сохранена, чтобы понимать, что речь именно про векторный поиск по документам.

Старые ссылки и закладки на раздел «База знаний» автоматически переадресуются на новый адрес — ничего не сломается.

***

### **2. Узел «YouTube: Субтитры» — работает на любых видео**

Подробнее про сам узел — см. пункт 1 раздела «Добавлено». Здесь — что было дополнительно сделано в течение релиза.

Изначально субтитры можно было получать только через официальный API Google — это работало 100% для своих видео (где OAuth-аккаунт владеет каналом), но для чужих API возвращало 403, и узел падал. Дальше попробовали несколько способов получать субтитры с чужих видео без расхода квоты — Google активно блокирует server-side получение субтитров через свои API и через прямой парсинг страницы.

В итоге узел работает в двух режимах:

* **Для своих видео** — официальный API Google (стабильно, контракт Google, расход квоты 250 единиц на видео)
* **Для чужих видео** — публичный путь через сторонний сервис (стабильно, без расхода квоты Google)

В редакторе узла галочка «Сначала пробовать официальный API» — оставляйте включённой для своих видео и выключайте для чужих, чтобы не сжечь 250 единиц квоты на 403-ответ от Google. Если включена и видео чужое — узел сам поймёт это по ответу 403 и автоматически перейдёт на публичный путь.

Ответ узла приходит в виде структурированных данных: полный текст одной строкой плюс массив сегментов с таймкодами для синхронизации с моментами видео. В тестере сценария он рендерится в красивом коллапсном блоке с кнопкой «Копировать JSON» (см. пункт 7 ниже).

***

### **3. Триггер «Команда» — поддержка реферальных ссылок**

Telegram и MAX позволяют запустить бота по ссылке вида `t.me/bot?start=ref123` — это удобно для рефералок, UTM-меток рекламных кампаний и одноразовых токенов.

Раньше бот игнорировал хвост после команды. Теперь после срабатывания триггера хвост автоматически попадает в две переменные сценария:

* одна — сырой текст (например, «ref123»)
* вторая — то же, но с URL-декодом

Эти переменные сразу видны в пикере переменных всех нижестоящих узлов — можно сохранять в карточку клиента, отправлять в API, фильтровать в условиях, и так далее. В редакторе триггера добавили подсказку с примером ссылки.

***

## Исправлено

***

### **4. Глобальный ИИ-помощник — починили молчание**

Помощник в правом нижнем углу больше не отвечает «Не получил содержательного ответа от ИИ. Попробуйте переформулировать вопрос». Теперь он реально отвечает на ваш вопрос — про баланс, тариф, задачи, клиентов.

***

### **5. Глобальный ИИ-помощник — кнопка закрыть на мобиле**

На мобильных устройствах помощник открывался на весь экран, а закрыть его было нечем. Добавили кнопку «×» в шапке рядом с кнопкой очистки истории — теперь видна и на телефоне, и на ПК.

***

### **6. Глобальный ИИ-помощник — индикатор больше не висит**

После того как помощник дал финальный ответ, серая плашка «Обрабатываю результаты…» продолжала висеть ещё пару секунд. Теперь она пропадает сразу при появлении ответа.

***

## Улучшено

***

### **7. JSON-ответы в тестере сценариев**

В режиме тестирования сценария если узел вернул ответ в формате JSON (например, узел «Субтитры» с массивом сегментов или HTTP-запрос с JSON-ответом) — теперь ответ рендерится в моноширинном блоке кода с подсветкой, отступами и кнопкой «Копировать JSON» в правом верхнем углу. Высота блока ограничена, длинные ответы не раздувают чат — они листаются скроллом внутри блока. Раньше JSON выводился простыней текста и портил читаемость.

***

### **8. Чат конструктора — текст пользовательских сообщений теперь яркий**

В чате конструктора (где вы общаетесь с ИИ-помощником при создании сценария) ваши сообщения отображались блёклым серым шрифтом на фиолетовом фоне — плохо читалось. Теперь текст белый и контрастный, как и должно быть.

***

### **9. Конструктор — карточки для незнакомых узлов**

Если в сценарий попал узел нового типа, которого ваш браузер ещё не знает (например, обновился сервер, а вкладка с конструктором ещё не перезагружена), раньше отображался безымянный серый прямоугольник — выглядел как баг. Теперь показываем красивую градиентную карточку «Новый узел — возможно появится в следующем обновлении» с иконкой и кнопкой удаления, в стиле остальных узлов.

***

### **10. Колокольчик уведомлений — большая прокачка**

Центр уведомлений в правом верхнем углу стал заметно удобнее и надёжнее.

**Что нового:**

* **Отдельная вкладка для задач.** Раньше уведомления о задачах смешивались с уведомлениями о клиентах в одной вкладке — было сложно быстро увидеть просрочки. Теперь под колокольчиком пять вкладок-иконок с tooltip и счётчиком непрочитанных по каждой: «Все», «Клиенты», «Тревоги», «Рассылки», «Задачи». Клик переключает фильтр.
* **Клик по уведомлению о задаче открывает саму задачу.** Раньше переводило просто на страницу «Задачи», теперь сразу открывается попап нужной задачи.
* **Упоминания в комментариях.** Если коллега тегнул вас через `@имя` в комментарии к задаче — придёт отдельное уведомление «Вас упомянули в комментарии» с превью текста, помимо общего «Новый комментарий» всем участникам. Работает и self-mention (если тегнули сами себя — придёт).
* **Уведомления из сценариев бота попадают в колокольчик.** Узел «Уведомление» в сценарии теперь не только шлёт сообщение в Telegram/MAX, но и создаёт запись в колокольчике у получателей внутри платформы. Раньше дублирующая копия терялась.
* **Клик по «общей» рассылке открывает красивый диалог-карточку** с заголовком, иконкой, временем, полным текстом (с поддержкой markdown — жирный, курсив, заголовки, списки, цитаты, ссылки, код) и кнопками-действиями (открыть URL, выполнить callback). Раньше открывался обычный popup, в нём текст шёл сжатой стеной.
* **Корректная типография в уведомлениях.** Заголовки, списки, цитаты и блоки кода в текстах рассылок и задач теперь рендерятся с правильными отступами, маркерами и border'ами — раньше всё было плоской стеной без оформления.
* **Удалённые рассылки сразу пропадают** из колокольчика во всех открытых вкладках браузера, без F5.
* **Попап колокольчика стал компактнее**: ширина уменьшена, табы переведены на иконки с tooltip — больше не загромождает экран. Сдвинут правее, чтобы не наезжать на сайдбар.
* **Безопасная доставка.** Если сообщение пришло пока вы были оффлайн или в фоновой вкладке, оно гарантированно догонит вас — приложение само рефетчит уведомления при возврате к окну и регулярно проверяет фоном.

***


# 1.2.0

Крупное обновление платформы  — 2026-04-24

## Крупное обновление платформы:&#x20;

* чат-виджет для сайтов
* промокоды
* магазин AI-токенов
* 6 новых узлов конструктора (распознавание и синтез речи, задержка, генерация изображений, запрос данных, возврат клиента)
* веб-поиск у ИИ-агента
* подписанные ссылки и полная изоляция файлового хранилища
* защита от перегрузок и флуда
* публичные шаринг-ссылки с TTL
* ИИ-агенты платформы понимают токены и черновики
* undo/redo в редакторе сценариев
* десятки улучшений UX и безопасности.

***

## Добавлено

***

### **1. Чат-виджет для сайта**

Новый канал связи — встраиваемый чат-виджет для сайтов клиентов (аналог JivoSite), настраивается в разделе **Интеграции**.

* Подключается одним `<script>`, работает через WebSocket — сообщения оператора приходят мгновенно без опроса
* Поддерживает сценарии бота с инлайн-кнопками, обмен файлами и фото, смайлы, markdown в ответах
* **Кнопки быстрого старта** — до 5 кнопок на приветственном экране с привязкой к отдельным сценариям через триггер **«Виджет: Callback кнопка»**
* **Prechat-форма** идентификации посетителя (имя, email, телефон)
* **Узел «Запросить данные»** — инлайн-форма с полями (текст, email, телефон, число, дата, выбор из списка) с маской и валидацией; заменяет поле ввода, а не показывается как сообщение в истории
* **Мобильная адаптация** — на экранах уже 640px виджет открывается в полный экран; inline-кнопки переносятся; iOS Safari больше не зумит инпуты
* **Бейдж непрочитанных** на баббле, если оператор написал пока вы были вне сайта
* **Бейдж «Бот» / «Оператор»** над каждым сообщением — видно, кто пишет
* **Передача содержимого страницы** в ИИ-агента через переменную `{{context.page_body}}` — можно отвечать на вопросы по тексту страницы, где сейчас клиент
* **URL страницы** клиента в контексте сценария через `{{context.page_url}}` — обновляется при каждом сообщении
* **Пауза бота** при ответе оператора на 5 минут — после паузы сценарий стартует с чистого состояния
* **Тайм-аут сессии** 3 часа — после паузы клиент видит приветствие с кнопками быстрого старта
* **Защита от переполнения хранилища** — если у компании закончилось место, скрепка автоматически скрывается
* Разрешённые типы файлов: изображения (JPEG, PNG, GIF, WebP) и PDF — опасные типы отклоняются на сервере
* Виджет учитывается как отдельный источник клиентов в статистике

***

### **2. Промокоды для активации платных тарифов**

Система промокодов — администратор платформы может раздавать бесплатный доступ к платным тарифам на фиксированный срок.

**Для пользователя** (Настройки → Подписка):

* Кнопка **«Ввести промокод»** рядом со «Сменить тариф»
* По успешной активации вы мгновенно переходите на указанный тариф — без списания с баланса
* Во время промо карточка баланса показывает **«Промо до DD.MM.YYYY»** и подпись «После — даунгрейд, без списания», чтобы не было страха неожиданного автосписания
* По окончании срока система сама возвращает прежний тариф, токены не обнуляются — переносятся с кэпом по лимиту нового тарифа

**Для администратора** (Админка → Управление тарифами → вкладка «Промокоды»):

* Создание кода (только латиница, цифры, дефис и подчёркивание)
* Привязка к любому активному платному тарифу (Pro, Business)
* Срок промо в днях, дата окончания, максимальное число использований
* Ограничение на список пользователей через мультиселект с поиском по email и названию компании — или публичный код
* Статистика активаций: сколько раз применили, в скольких компаниях, когда последний раз
* Включение / выключение / удаление

**Проверки:**

* Нельзя применить промокод на тариф **ниже** текущего
* Нельзя применить промокод на **тот же** тариф — продлевать через промо не получится
* Параллельные промокоды не активируются — пока идёт один, второй отклоняется
* Промо на Business поверх админского `custom_token_limit` корректно перебивает override на время промо и восстанавливает его после
* Защита от перебора: 10 неверных попыток в час — блокировка на 60 минут

***

### **3. Магазин дополнительных AI-токенов**

В карточке **«AI Токены»** появилась кнопка **«Пополнить токены»** с 4 пакетами: 100K за 150 ₽, 500K за 600 ₽ (−20%), 1M за 1000 ₽ (−33%), 5M за 4000 ₽ (−47%). Оплата с баланса компании; если средств не хватает — кнопка превращается в «Пополнить баланс на N ₽» и ведёт в обычный топ-ап.

Купленные токены — **отдельный кошелёк**: не сгорают в конце месяца, переносятся между месяцами. Расход идёт в правильном порядке: сначала тратится тарифный лимит, и только когда он исчерпан — купленные. При остатке ниже 10% карточка подсвечивается красным с предупреждением «рекомендуем пополнить». Если и тарифные, и купленные закончились — AI-запросы блокируются с понятным сообщением.

В **Админка → Управление тарифами → Пакеты AI-токенов** можно создавать, редактировать, включать/выключать и удалять пакеты — у каждого настраивается название, количество токенов, цена, процент скидки, порядок сортировки и видимость. Изменения применяются мгновенно.

***

### **4. Новые узлы конструктора**

**Текст в речь** (иконка громкоговорителя, изумрудная). Озвучивает текст голосом через Gemini TTS:

* 30 голосов с русско-английскими описаниями характера (Уверенный, Бодрый, Информативный, Лёгкий и т.д.)
* Одноголосая озвучка или диалог двух спикеров с указанием их имён
* Два режима: **Авто** (ИИ-режиссёр сам расставляет интонации) и **Ручной** (вы сами добавляете теги)
* Каталог аудио-тегов прямо в редакторе: эмоции (`[excited]`, `[sad]`...), манера речи (`[whispers]`, `[sarcastic]`...), звуковые эффекты (`[laughs]`, `[sighs]`...)
* Доставка как настоящее **голосовое** в Telegram (`sendVoice`), как audio-attachment в MAX, как audio-сообщение в виджете
* Лимит 30 000 символов ввода, максимум 2 спикера
* Индикатор «записывает голосовое» в чате во время генерации

**Речь в текст** (иконка микрофона). Принимает URL аудио и возвращает распознанный текст в переменную сценария. По умолчанию автоматически берёт аудио из входящего сообщения — работает с голосовыми Telegram, MAX, Avito, виджета. Автоопределение языка или принудительный код. Результат сохраняется в `{{transcript_text}}`, `{{transcript_text_lang}}`, `{{transcript_text_confidence}}`.

**ИИ-агент с распознаванием голоса** — галочка «Расшифровывать голосовые» в настройках узла ИИ-агент. При входящем аудио от клиента агент автоматически получает текстовую расшифровку и может ответить как на обычное сообщение. Транскрипт доступен в переменных `{{_user_audio_transcript}}`.

**Nano Banana** — генерация и редактирование изображений через Gemini / OpenAI-совместимые API. Поддерживает вход из переменных (фото от клиента) и статических изображений из хранилища компании.

**Задержка** — после полной переработки узел наконец реально работает. Поддерживает интервалы от 1 секунды до суток и больше, надёжно переживает перезапуски сервера. Новая опция **«Поведение при повторном входе»**: «Сбрасывать таймер» или **«Игнорировать (fire-once)»** — для кейсов «напомнить через 24 часа после первого контакта», когда вторичные заходы не должны обнулять обратный отсчёт.

**Возврат клиента** — новый триггер для автоматической реактивации лидов. Сам инициирует общение с клиентами, которые уже побывали в сценарии и замолчали: брошенная корзина, реактивация, дожим лида. Настройки: база отсчёта (последнее сообщение клиента или активность сессии), задержка N минут/часов/дней, частота (1 раз / после каждого прохождения / раз в N времени), поведение при активной сессии (не трогать или заменить на новую ветку). Жёсткие лимиты от спама: минимум 5 минут на задержку, 1 час между повторами, максимум 100 срабатываний на клиента, не более 50 за один прогон планировщика — чтобы не попасть под рейт-лимит Telegram / MAX / Avito.

**Запросить данные** — инлайн-форма для виджета (см. пункт 1 про виджет).

***

### **5. ИИ-агент с веб-поиском и доступом к содержимому страницы**

В узле **«ИИ-агент»** появилась опция **«Разрешить поиск в интернете»** — модель Gemini может искать актуальную информацию в Google, читать страницы и проверять факты перед ответом. Полезно для анализа URL клиента, свежих новостей, цен, справок. Работает одновременно с continueTriggers — модель сама решает, искать или перейти по сценарию.

Плюс **сервер-сайд фетч страницы** для кейса «документный ассистент»: если в system prompt есть `{{context.page_url}}` и включён веб-поиск, handler автоматически качает HTML, очищает и докладывает в промпт. Модель видит реальный текст документа и отвечает по нему.

Источники, которые модель реально использовала, сохраняются в логах узла: список URL с заголовками и поисковые запросы, улетевшие в Google — полезно для отладки.

В логах сценария теперь сохраняется:

* `grounding_sources` — список URL с заголовками, которые модель использовала
* `grounding_queries` — поисковые запросы, которые улетели в Google

Повышенное списание токенов: +5000 токенов за каждый grounded-запрос (отражает фиксированную цену Google Search у Google). Настраивается в админке → «Биллинг ИИ».

***

### **6. Undo/Redo в редакторе сценариев**

Добавили классическое отмена/возврат действий на холсте, как в текстовых редакторах:

* **`Ctrl+Z`** (или `Cmd+Z` на Mac) — откатить последнее действие: перемещение узла, удаление узла/связи, добавление узла/связи, редактирование свойств
* **`Ctrl+Shift+Z`** / **`Ctrl+Y`** — вернуть отменённое действие

Хранится до 50 последних состояний в рамках сессии редактирования. Работает на любой раскладке клавиатуры (русской, английской) — распознаёт физическую клавишу, а не символ. Горячие клавиши показаны в подсказке внизу холста.

***

### **7. Новые возможности AI-ассистента платформы**

AI-ассистент в шапке теперь видит существенно больше контекста:

* **Разделение черновик / опубликованная версия** сценария — на вопрос «что я изменил в боте X» ассистент покажет отдельно опубликованную версию и draft
* **Цели сценария** — отвечает на запросы «какие цели у бота Y», «что считается успехом»
* **Честная картина по токенам** — на вопрос «сколько осталось токенов» показывает использование / лимит / остаток, с разбивкой по планированию, генерации, агентам, RAG и задачам. Раньше отвечал «весь лимит в вашем распоряжении» без счётчика использованных
* **Понимание типовых фраз** — «последний сценарий», «включи бота X», «какие задачи на сегодня»

ИИ-ассистент конструктора обновлён до версии v11 — знает про все новые узлы (TTS, STT, Возврат клиента, Задержка с режимом ignore, форматирование markdown) и корректно генерирует сценарии с первого раза.

Кнопка **«Очистить историю»** действительно удаляет сессию, а не только прячет сообщения в UI.

***

### **8. Публичные шаринг-ссылки с TTL**

В меню каждого файла хранилища появился пункт **«Поделиться (TTL-ссылка)»** с выбором срока действия: 1 час / 6 часов / 1 сутки / 7 дней / 30 дней / бессрочно.

* Мгновенный **отзыв** по клику — получатель увидит страницу «Ссылка недоступна»
* В таблице файлов бейдж **«Расшарен»** с подсказкой о сроке и количестве скачиваний
* Фото, видео, аудио, PDF — открываются прямо в браузере
* HTML, SVG, XML — принудительно скачиваются
* Имя файла в диалоге «Сохранить как» — чистое, без технических префиксов

Старое «Копировать URL» теперь выдаёт подписанную ссылку на 1 час; для долговременного шаринга — «Поделиться».

***

**9. Память ИИ-агентов**

В настройках узлов **ИИ-агент** и **RAG-диалог** появился чекбокс **«Память о клиенте»** с опциональной настраиваемой инструкцией. Агент может запоминать важные факты о клиентах (предпочтения, бюджет, историю обращений) между разговорами. Клиент определяется автоматически из текущего чата. Записи памяти сохраняются в базу знаний (коллекция «Память ИИ-агентов»), привязываются к клиентам и видны:

* В разделе **База знаний** с бейджами привязанных клиентов
* В карточке клиента на вкладке **«Память ИИ»**

***

**10. Защита от спама и флуда**

Введены лимиты на все входные точки:

* **Виджет** — 5 сообщений за 10 сек / 20 за минуту на посетителя
* **Telegram / MAX / Avito webhook** — 30 сообщений в минуту на внешнего пользователя (один спамер не блокирует остальных клиентов компании)
* **Отправка сообщений оператором** — 15/60 на пару `оператор + чат`
* При превышении виджет показывает клиенту «⏳ Вы пишете слишком быстро…» вместо падения
* Квота считается **per-вкладку** — открыли конструктор в нескольких вкладках, каждая получает свой бюджет

***

**11. Изоляция файлового хранилища по компаниям**

Критичный апдейт безопасности:

* **Кнопки «Скачать»** и превью используют короткоживущие подписанные ссылки — никаких постоянных публичных URL
* **Логотипы виджетов** подписываются индивидуально под каждого гостя чата
* Двойная проверка доступа для виджета

***

## Улучшено

***

### **Сайдбар**

* **Новый логотип** MicroCRM в шапке вместо иконки-молнии на градиенте. Название без градиента — обычным текстом, читается в любой теме
* **Контекстное меню на логотипе** — правый клик открывает меню: открыть сайт, скопировать логотип в буфер (PNG), скачать логотип, скачать favicon
* **ФИО и тариф вместо email** — в футере сайдбара ФИО из профиля и бейдж тарифа (Free / Pro / Business). При наведении — карточка со статистикой (AI токены, клиенты, сотрудники, сценарии, чаты, шаблоны, проекты) с прогресс-барами: жёлтым при приближении к лимиту, красным при превышении
* **Версия продукта** в правом нижнем углу — клик открывает <https://book.microcrm.online/changelog> в новой вкладке
* **Колокольчик уведомлений** переехал к имени пользователя в футер — в шапке стало свободнее, подсказки о непрочитанных рядом с личным блоком

### **Чаты**

* **Разделители дат** в чате — «Сегодня», «Вчера», «5 апреля» с учётом таймзоны
* **Визуальное выделение бот-сообщений** — фиолетовый фон, рамка и иконка бота
* **Вкладки «Сообщения» / «Бот»** — вкладка «Сообщения» показывает только переписку с оператором, диалог с ботом — на вкладке «Бот». Входящие сообщения во время бот-сессии больше не падают в «Сообщения»
* **Непрочитанные наверху списка** — чаты с непрочитанными всегда в начале списка, внутри каждой группы по времени последнего сообщения
* **Бейдж непрочитанных в сайдбаре** — красная цифра рядом с пунктом «Чаты» в реальном времени
* **Сохранение бот-диалога в CRM** — вкладка «Бот» показывает и вопросы клиента, и ответы бота
* **Форма `request_input`** от узла «Запросить данные» рендерится как карточка с полями и иконками
* **Инлайн-кнопки виджета** отмечаются индикатором «Нажата кнопка» — видно что клиент нажал, а не написал
* **Кросс-канальная передача медиа** между Telegram и MAX сохраняется корректно, включая ссылки в тексте
* **Видео любого размера** пересылается между Telegram и MAX — раньше файлы больше 20 МБ не передавались

### **Экран входа**

* **Переключатель темы** в правом верхнем углу — можно адаптировать экран входа до логина
* **Новые фоновые видео** (светлая / тёмная тема) — раздаются с нашего прокси, без зависимости от стороннего CDN

### **Переключатель компаний**

* **Сортировка по алфавиту** — сначала активные русские, потом активные английские, затем так же неактивные
* **Выравнивание по левому краю** — название в шапке больше не «прыгает» по центру
* **Автовыбор самой старой компании-владельца** при входе — больше не нужно переключаться после логина

### **Редактор сценариев**

* **AI-кнопка на холсте** переименована с «ИИ помощник» на короткое **«AI»**, автоматически уезжает при открытой панели свойств узла, скрывается когда уже открыт AI-ассистент
* **Анимированная подсветка AI-кнопки** — вращающаяся conic-gradient рамка, пульсирующее свечение, shimmer на иконке.
* **Хендлы (точки соединения)** обновлены: 22px, бордер в цвете узла, фон узла — визуально аккуратнее
* **Плавное перемещение узлов** — `snapToGrid` выключен
* **Тултипы переменных** в текстах сообщений — наведение на `{{...}}` показывает, к чему относится переменная (имя клиента, текст сообщения и т.д.)
* **Клик по переменной** ставит курсор для редактирования — раньше тултип перехватывал клик
* **Логи сценария** — длинные ошибки не растягивают панель, есть скролл внутри блока. В свёрнутой карточке превью ошибки до 70 символов с многоточием. Короткий ID виджет-посетителя (первые 6 символов) вместо полного UUID
* **Статичные иконки lucide** вместо эмодзи в типах триггеров — единообразно с остальным UI

### **Сообщения и форматирование**

* **Markdown-редактор для всех сообщений** во всех узлах-отправителях (Отправить сообщение, Уведомления, Avito, каналы Telegram и MAX, Выход из бота) — жирный, курсив, зачёркнутый, моноширинный, ссылки, маркированные и нумерованные списки, предпросмотр. Переменные `{{context.xxx}}` подсвечены цветом — сразу видно подстановки
* **Автоконвертация формата** под получателя: Telegram и MAX — HTML, Avito — plain text, виджет — markdown напрямую
* **Markdown в ответах бота виджета** — жирный, курсив, код, зачёркнутый, ссылки, заголовки, списки, блоки кода. Безопасно, без XSS

### **AI-провайдеры**

* **Редизайн карточек** в админке в стиле «Подписки»: градиент, скруглённые углы, крупное название модели, pulse-индикатор, стеклянная плашка статистики
* **Три назначения на карточке**: Текст / Картинки / Звук — без открытия редактора
* **Актуальный список моделей Gemini** — убраны устаревшие 1.5, добавлены 2.5/2.0/3.x включая TTS
* **Выбор модели из списка** у всех провайдеров + возможность ввести свою
* **Переключатели возможностей** (текст / изображения / звук) отдельными тогглами вместо одного чекбокса
* **Тест подключения** работает для TTS-моделей Gemini с правильным форматом запроса

### **Узел ТТС**

* Компактное отображение «куда сохранится аудио» — одна строка с иконкой дискеты
* Чистый UI — без лишних пояснений и технических подписей

### **Прочее**

* **Стилизация «Настройки клиентов»** в стиле «Подписки»: gradient-header, rounded-2xl карточки, иконки типов переменных
* **Оффканвас «Добавить клиента»** — hero-header с gradient, стилизованные бейджи TG / MAX
* **Раздел Интеграции** в настройках — две колонки на десктопе, одна на мобилке
* **Все системные AI-вызовы** (cron, webhook, задачи, каналы, RAG) идут через прокси — IP-лимиты внешних API больше не упираются в один адрес

***

## Исправлено

***

* **Дубликаты клиентов** при одновременных сообщениях — если один посетитель писал несколько сообщений почти одновременно, создавалось 2-5 клиентов. Теперь параллельные запросы физически не могут создать дубль
* **Сохранение ссылок** при кросспостинге Telegram → MAX — ранее markdown-ссылки теряли кликабельность
* **Промо-тариф не показывает автосписание** — вместо «Веха списания / 9990 ₽» во время промо видно «Промо до / без списания»
* **UI после активации промокода обновляется мгновенно** — без перезагрузки страницы
* **Двойной учёт токенов** в некоторых кейсах исчерпания тарифа — расход корректно распределяется между тарифом и купленным кошельком
* **Триггер «Возврат клиента»** — исправлена частота «после каждого нового прохождения сценария»
* **Включение тёмной темы на экране входа** — переключатель теперь доступен до логина
* **Ошибка 409 при создании виджета** для второй компании — владелец нескольких компаний наконец может создать виджет для каждой
* **WebSocket виджета** — исправлена корневая причина, из-за которой сообщения оператора не доходили до клиента в виджете
* **Классификация Сообщения vs Бот** в виджете — если модель вернула пустой ответ, но сессия активна, сообщение всё равно идёт на вкладку «Бот»
* **Порядок сообщений в Telegram-чате** — клиентское `/start` больше не отображается после ответа бота
* **Ctrl+Z на русской раскладке** — работает на любой раскладке (распознаём физическую клавишу)
* **Ctrl+Z реально откатывает** — раньше snapshot находился, но визуально ничего не менялось из-за ошибки в стеке истории
* **Кнопки на узлах после Ctrl+Z** — больше не «мёртвые», обработчики re-attach'ятся
* **Телеграм-индикатор** при обработке голосовых — теперь «печатает», а раньше «записывает голосовое»-
* **ИИ-ассистент задач путал вопросы с командами** — «какие задачи просрочены?» больше не обрабатывается как попытка создать задачу
* **Тултип тарифа в сайдбаре** больше не прячется за виджетами дашборда
* **AI-ассистент платформы** не отвечает пустым сообщением — пользователь получает понятный текст «Не получил содержательного ответа, попробуйте переформулировать»
* **ИИ-ассистент конструктора** правит черновик сценария, а не опубликованную рабочую версию
* **Кнопка «Применить план»** не затирает существующий сценарий — при наличии узлов идёт в режим редактирования, при пустом — в режим создания
* **Кнопка «Применить изменения»** под сообщением AI больше не висит активной после применения
* **Image-only AI-ключи** больше не показываются в текстовых ИИ-узлах — они видны только в узле Nano Banana для генерации изображений
* **Email-подтверждение при регистрации** — раньше при регистрации любой фейковый email автоподтверждался. Теперь подтверждение только после клика по ссылке в письме
* **Диалог «Поделиться файлом»** — кнопка копирования реально кладёт ссылку в буфер обмена; ссылка всегда HTTPS; работает в HTTP-контексте через fallback
* **Сообщения клиента во время бот-сессии** не увеличивают счётчик непрочитанных
* **Настройки узлов «MAX Канал» и «Триггер поста в канале»** не сбрасываются при сохранении сценария
* **Токены каналов** корректно находятся в кросс-платформенных сценариях (TG-бот управляет MAX-каналом и наоборот)
* **Защита от зацикливания кросспостинга** — бот не подхватывает свои же сообщения

***

## Безопасность

***

* **ACL-проверки на финансовых RPC** — нельзя дёрнуть с чужим company\_id и сжечь токены, купить пакет за счёт чужого баланса, прочитать чужие балансы или статистику
* **Изоляция файлового хранилища** по компаниям — все приватные bucket'ы (чат-медиа, озвучка, пользовательское хранилище, документы) закрыты на уровне БД
* **Подписанные ссылки с TTL** вместо постоянных публичных URL — для скачивания, превью, шаринга, виджет-чатов
* **SSRF-защита** в сервер-сайд фетче страниц из виджета — блокируются loopback, приватные сети, link-local (AWS metadata), IPv6 ULA
* **Stored-XSS защита** для расшаренных файлов — HTML/SVG/XML/JS принудительно скачиваются, а не рендерятся в браузере под доменом CRM
* **Защита от перебора промокодов**
* **Whitelist по расширению файла** при отдаче через shared-ссылку — даже если заливать `picture.jpg` с HTML-байтами внутри, он отдастся как image/jpeg, HTML не выполнится
* **Rate-limiting** на все входные точки с настраиваемыми лимитами

***


# v1.1.1

Журнал изменений — Micro CRM v1.1.1

## Обновление чатов, кросспостинга каналов и тарифных ограничений.

***

#### Добавлено

***

**Кросспостинг видео без ограничения размера**

Видео любого размера теперь корректно пересылаются между каналами Telegram и MAX. Ранее файлы больше 20 МБ не передавались из-за ограничений Telegram Bot API.

**Разделители дат в чате**

Между сообщениями разных дней отображается разделитель с датой: «Сегодня», «Вчера», «5 апреля» и т.д. Учитывается таймзона пользователя.

**Визуальное выделение бот-сообщений**

Сообщения бота в чате теперь выделены фиолетовым фоном и рамкой с иконкой бота. Чётко отличаются от сообщений клиентов и операторов.

**Медиа-кросспостинг каналов TG и MAX**

При кросспостинге между каналами Telegram и MAX передаются фото, видео и документы. Медиа автоматически скачивается с исходной платформы и загружается в целевую. Сохраняется связь оригинал-копия для синхронизации редактирований.

**Переменные триггера канала**

Триггер «Пост в канале» отображает все доступные переменные в быстром списке: текст поста, ID, канал, платформа, тип медиа, URL медиа.

**Переключатель типа медиа в MAX Канале**

В узле MAX Канал добавлена возможность указать тип медиа через переменную (динамически) для автоматического кросспостинга.

***

#### Улучшено

***

**Вкладки «Сообщения» и «Бот» в чате**

Вкладка «Сообщения» теперь показывает только переписку с оператором — диалог с ботом доступен только на вкладке «Бот». Ранее бот-сообщения отображались на обеих вкладках.

**Непрочитанные чаты наверху списка**

Чаты с непрочитанными сообщениями всегда отображаются в начале списка. Внутри каждой группы сортировка по времени последнего сообщения.

**Badge непрочитанных в сайдбаре**

В боковом меню рядом с пунктом «Чаты» отображается красный badge с количеством непрочитанных сообщений. Обновляется в реальном времени.

**Сохранение бот-диалога в CRM**

Ответы бота сохраняются в истории чата. Вкладка «Бот» показывает полный диалог клиента с ботом — и вопросы клиента, и ответы бота.

**Улучшенные логи сценария**

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

**Автоматический маппинг постов**

При кросспостинге система автоматически сохраняет связь оригинал-копия. При редактировании поста доступна переменная `forwarded_message_id` для обновления пересланной копии.

***

#### Исправлено

***

* Тарифные ограничения теперь корректно скрывают новых клиентов сверх лимита, стимулируя переход на следующий тариф. Ранее показывались самые свежие чаты вместо первых по дате создания
* Сообщения клиента во время бот-сессии больше не увеличивают счётчик непрочитанных
* Чат больше не прыгает наверх списка при клике — перемещение только при новом сообщении
* Настройки узлов «MAX Канал» и «Триггер поста в канале» не сбрасываются при сохранении сценария
* Токены каналов корректно находятся в кросс-платформенных сценариях (TG-бот управляет MAX-каналом и наоборот)
* Защита от зацикливания кросспостинга — бот не подхватывает свои же сообщения
* Узел MAX показывает только MAX-каналы, узел Telegram — только Telegram-каналы
* Убрано ложное предупреждение на узлах каналов при корректной конфигурации
* Длинные сообщения в превью чата обрезаются многоточием
* Загрузка медиа в MAX через двухшаговый процесс работает корректно


# v1.1.0

Журнал изменений — Micro CRM v1.1.0

Крупное обновление платформы: глобальный ИИ-агент, система задач, база знаний, интеграция Google, 10 новых узлов конструктора, шаблоны сценариев, драфт/публикация, миграция на Gemini 3 Flash и десятки визуальных улучшений.

***

## Добавлено

***

### **1. Глобальный ИИ-агент**

Новый уровень AI-автоматизации — глобальный ИИ-агент доступен из любого раздела платформы.

* **3-уровневая архитектура оркестратора**: Агенты → Скиллы → Инструменты
* **Реестр агентов**
* **Скиллы**&#x20;
* **Инструменты**&#x20;
* **MD-инструкции**&#x20;

***

### **2. ИИ-агент задач**

Специализированный AI-ассистент для работы с задачами.

* **Создание проекта по описанию**: ИИ декомпозирует текстовое описание на проект с задачами и подзадачами
* **Приоритизация задач**: автоматическое назначение приоритетов на основе контекста

***

### **3. Раздел «Задачи»**

Полноценная система управления задачами с проектами, канбаном, календарём и ИИ.

#### **Вкладки:**

* **Канбан-доска** — визуальное управление задачами с drag-and-drop перемещением между колонками (To Do, In Progress, Review, Done). Настраиваемые колонки с цветами
* **Список** — табличное представление задач с сортировкой, фильтрацией по статусу, приоритету, исполнителю, дедлайну
* **Календарь** — задачи на временной шкале, привязка к датам, визуализация дедлайнов
* **AI-ассистент** — создание проектов и задач через чат с ИИ

#### **Функции задач:**

* Проекты для группировки задач
* Подзадачи (чеклисты внутри задачи)
* Приоритеты: Low, Medium, High, Critical
* Назначение исполнителя из сотрудников компании
* Дедлайны с cron-проверкой
* Повторяющиеся задачи&#x20;
* Теги и категории
* Комментарии к задачам
* Уведомления о дедлайнах и изменениях

***

### **4. Раздел «База знаний»**

Структурированное хранилище данных компании с ИИ-ассистентом.

#### **Вкладки:**

* **Таблицы** — структурированные данные в формате таблиц (аналог Airtable/Notion)
  * Создание таблиц с типизированными колонками (текст, число, дата, enum, boolean, JSON)
  * CRUD записей с inline-редактированием
  * Сортировка и фильтрация по колонкам
  * Авто-маппинг колонок при импорте
  * Экспорт в Google Sheets (через интеграцию Google)
* **Текст** — текстовые документы и заметки
  * Rich-text редактор на TipTap (WYSIWYG)
  * Категоризация документов
  * Полнотекстовый поиск
* **AI-ассистент** — чат с ИИ по данным базы знаний
  * ИИ может читать, создавать и обновлять записи через tool\_calls

***

### **5. Интеграция с Google**

Подключение сервисов Google через OAuth 2.0.

* **Google Drive** — просмотр и управление файлами
* **Google Sheets** — чтение, запись, создание таблиц. Экспорт данных из базы знаний
* **Google Docs** — просмотр и редактирование документов
* **Google Calendar** — просмотр событий, создание встреч

***

### **6. Новые узлы конструктора ботов**

#### **Узел «Задачи» (`task`)**

Управление задачами из сценария бота: создание, обновление, поиск задач, создание подзадач. Привязка к проектам и исполнителям.

#### **Узел «Управление каналом MAX» (`max_channel`)**

Управление каналами и группами MAX мессенджера. **13 операций в 4 категориях:**

| Категория      | Операции                                                                  |
| -------------- | ------------------------------------------------------------------------- |
| Информация     | Инфо о канале, количество участников, список админов, инфо об участнике   |
| Модерация      | Бан, разбан, ограничение прав                                             |
| Контент        | Отправка сообщений (текст + медиа), редактирование, удаление, закрепление |
| Редактирование | Изменение названия, описания                                              |

* Автоматическое определение каналов при добавлении бота
* 3 источника канала: управляемый, из переменной, ручной ввод
* Обработка ошибок: stop / continue / error output
* Сохранение результатов в переменные контекста

#### **Узлы Google (4 узла)**

* **Google Drive** — загрузка, скачивание, поиск файлов
* **Google Sheets** — чтение и запись данных в таблицы
* **Google Docs** — чтение и создание документов
* **Google Calendar** — просмотр событий, создание встреч

#### **Узлы базы знаний (Knowledge)**

* **Поиск по базе знаний** — семантический поиск по документам и таблицам
* **CRUD записей** — создание, обновление, удаление записей в таблицах базы знаний

#### **Узел «Switch»**&#x20;

Мульти-ветвление по значению переменной. Аналог `switch/case` — несколько выходов на основе одной переменной. Более наглядная альтернатива цепочке условий.

#### **Триггер «Событие задач»**&#x20;

Запуск сценария при изменении задач: создание, обновление статуса, назначение исполнителя, приближение дедлайна. Фильтрация по проекту и типу события.

#### **Триггер «Пост в канале»**

Запуск сценария при публикации в каналах Telegram и MAX. Поддержка событий: новый пост, редактирование, удаление. Фильтрация по платформе, каналу, тексту (содержит/regex). Данные поста доступны в контексте.

***

### **7. Обновлённый узел «ИИ Агент»**

Значительное обновление возможностей ИИ-агента:

* **Режим чат-сессии**: бот ведёт диалог в цикле, собирая данные (имя, даты, телефон) и вызывая триггеры когда вся информация собрана. Раньше требовалось 10+ узлов — теперь один
* **Tool Calls**: AI может вызывать функции-триггеры для перехода к следующему этапу с извлечёнными данными
* **Множественные сообщения**: AI отправляет несколько сообщений подряд через разделитель `---` — выглядит как живой оператор
* **История диалога**: сохранение контекста между сообщениями в сессии
* **Команды выхода**: настраиваемые команды завершения сессии (стоп, выход, /exit)
* **Описание контекста**: многострочное поле для описания контекста срабатывания триггера

***

### **8. Шаблоны сценариев**

Маркетплейс готовых сценариев.

* **Создание шаблонов** из существующих сценариев с описанием, тегами и категориями
* **AI-генерация шаблонов** по текстовому описанию&#x20;
* **Применение шаблона** — создание сценария из шаблона с адаптацией под интеграцию
* **Продажа шаблонов** — монетизация для авторов сценариев
* **Административное управление** — модерация, публикация, удаление

***

### **9. История версий и драфт/публикация**

* **Драфт-режим**: при сохранении изменения попадают в драфт, а не в продакшн
* **Кнопка «Опубликовать»** — применяет черновик к работающему боту
* **Тестирование по драфту** — тестовый чат использует драфт вместо прода
* **История версий**: до 5 версий с возможностью отката
* **Бейдж «Опубликовано»** на текущей production-версии в истории

***

### **10. Импорт и экспорт сценариев**

* **Экспорт** сценария в JSON-файл для бэкапа или переноса
* **Импорт** сценария из JSON-файла с валидацией структуры
* Совместимость между разными инстансами платформы

***

## Улучшено

***

### **Обновлённый сайдбар**

* Несколько разделов схлопнуты в подменю для компактности
* Группировка: CRM (клиенты, чаты, сделки), Автоматизация (конструктор, задачи), Данные (база знаний, хранилище, отчёты)

### **Обновлённый интерфейс конструктора**

* **Единый тулбар** — два ряда кнопок объединены в компактный двухрядный тулбар
* **Верхний ряд** — навигация и основные действия (сохранить, опубликовать, тест)
* **Нижний ряд** — инструменты (палитра, AI-ассистент, история, настройки)
* Кнопки стали контрастнее на светлой теме
* **Палитра узлов** — переделана: округлые карточки с цветными иконками, без левой полоски, компактные заголовки категорий

### **Улучшенная генерация сценариев**

* **6-этапное автоисправление JSON**: escape управляющих символов, исправление кавычек в русском тексте, пропущенные запятые, обрезанные строки, trailing commas, баланс скобок
* **Авто-продолжение** при обрезке ответа модели
* **Новый редактор JSON** на CodeMirror с подсветкой синтаксиса, нумерацией строк, сворачиванием блоков
* **Кнопка «Авто-исправление»** и контекст ошибки с 3 строками вокруг проблемного места

### **RAG-диалог**

* Добавлено поле «Начальный запрос» — бот сразу отвечает на вопрос вместо приветствия
* Убран неработающий слайдер «Порог схожести»
* Эмодзи заменены на иконки lucide-react
* Надёжный вызов триггеров выхода — стабильный переход между RAG и другими узлами

### **AI-провайдер по умолчанию**

* Миграция на **Gemini 3 Flash**

### **Конфликты триггеров**

* Одинаковые триггеры в Telegram и MAX сценариях больше не считаются конфликтом

### **Смена платформы сценария**

* При изменении messenger\_type (Telegram ↔ MAX) теперь обновляется и `integration_id`

### **Мелкие визуальные улучшения**

* Обновлённые карточки сценариев
* Улучшенные диалоги подключения интеграций
* Обновлённый дизайн страницы тарифных планов
* Улучшенное отображение лимитов и использования ресурсов
* Кнопка переключения темы в заголовке сайдбара
* Кнопка сворачивания/разворачивания сайдбара на десктопе
* Тёмная тема чатов с стеклянными панелями и backdrop-blur
* Градиентные аватары ИИ-ассистента
* Адаптивный мобильный интерфейс чатов и конструктора

***

## Исправлено

* AI Agent: исправлен бесконечный цикл при возврате из RAG в агента
* AI Agent: tool\_calls корректно определяются в non-streaming режиме
* RAG: исправлена ошибка авторизации с service\_role ключом
* Смена платформы сценария сохраняет `integration_id`
* Создание проекта через ИИ-ассистент задач привязывает задачи к правильному проекту
* MAX-бот корректно находит сценарии по integration\_id


# v1.0.1

Журнал изменений — Micro CRM v1.0.1

## Добавлено

## **Узел «Телеграм Канал»**&#x20;

Новый тип ноды для управления Telegram-каналами и группами через Bot API.\
Позволяет выполнять **27 действий** без написания кода.

### **Источники канала**&#x20;

| Источник          | Описание                                                                                                           |
| ----------------- | ------------------------------------------------------------------------------------------------------------------ |
| `managed_channel` | Канал из БД (`bot_managed_channels`), автоматически добавляется при добавлении бота в канал через `my_chat_member` |
| `variable`        | `chat_id` из переменной контекста: `{{context.my_channel_id}}`                                                     |
| `manual`          | Ручной ввод `chat_id` (например, `-1001234567890`)                                                                 |

**5 категорий, 27 действий:**

### **1. Информация — 4 действия**

| Действие          | Telegram метод          | Параметры |
| ----------------- | ----------------------- | --------- |
| Инфо о канале     | `getChat`               | —         |
| Кол-во участников | `getChatMemberCount`    | —         |
| Список админов    | `getChatAdministrators` | —         |
| Инфо об участнике | `getChatMember`         | `user_id` |

### **2. Модерация  — 5 действий**

| Действие           | Telegram метод                    | Параметры                                  |
| ------------------ | --------------------------------- | ------------------------------------------ |
| Бан                | `banChatMember`                   | `user_id`, `until_date`, `revoke_messages` |
| Разбан             | `unbanChatMember`                 | `user_id`, `only_if_banned`                |
| Ограничить права   | `restrictChatMember`              | `user_id`, `permissions`, `until_date`     |
| Повысить до админа | `promoteChatMember`               | `user_id`, `promote_rights` (10+ прав)     |
| Титул админа       | `setChatAdministratorCustomTitle` | `user_id`, `custom_title`                  |

### **3. Ссылки-приглашения  — 6 действий**

| Действие         | Telegram метод           | Параметры                                                     |
| ---------------- | ------------------------ | ------------------------------------------------------------- |
| Экспорт ссылки   | `exportChatInviteLink`   | —                                                             |
| Создать ссылку   | `createChatInviteLink`   | `name`, `member_limit`, `expire_date`, `creates_join_request` |
| Изменить ссылку  | `editChatInviteLink`     | `invite_link`, `name`, `member_limit`, `expire_date`          |
| Отозвать ссылку  | `revokeChatInviteLink`   | `invite_link`                                                 |
| Принять заявку   | `approveChatJoinRequest` | `user_id`                                                     |
| Отклонить заявку | `declineChatJoinRequest` | `user_id`                                                     |

### **4. Редактирование канала  — 8 действий**

| Действие            | Telegram метод         | Параметры                            |
| ------------------- | ---------------------- | ------------------------------------ |
| Изменить название   | `setChatTitle`         | `title`                              |
| Изменить описание   | `setChatDescription`   | `description`                        |
| Установить фото     | `setChatPhoto`         | `photo` (URL)                        |
| Удалить фото        | `deleteChatPhoto`      | —                                    |
| Изменить права      | `setChatPermissions`   | `permissions` (объект прав)          |
| Закрепить сообщение | `pinChatMessage`       | `message_id`, `disable_notification` |
| Открепить сообщение | `unpinChatMessage`     | `message_id` (опц.)                  |
| Открепить все       | `unpinAllChatMessages` | —                                    |

### **5. Контент  — 5 действий**

| Действие            | Telegram метод                                         | Параметры                                                               |
| ------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------- |
| Отправить сообщение | `sendMessage` / `sendPhoto`/`Video`/`Audio`/`Document` | `text`, `media_type`, `media_url`, `parse_mode`, `disable_notification` |
| Редактировать       | `editMessageText`                                      | `message_id`, `text`, `parse_mode`                                      |
| Удалить             | `deleteMessage`                                        | `message_id`                                                            |
| Копировать          | `copyMessage`                                          | `from_chat_id`, `message_id`                                            |
| Переслать           | `forwardMessage`                                       | `from_chat_id`, `message_id`                                            |

## **Медиа-контент**

\
При отправке сообщения можно приложить медиа (`photo`, `video`, `audio`, `document`).\
Текст используется как `caption` (лимит Telegram: 1024 символа).\
URL медиа поддерживает переменные: `{{context.photo_url}}`.

### **Сохранение результатов:**

* `saveResultToVariable` — результат API-вызова целиком
* `saveMessageIdVariable` — `message_id` отправленного сообщения (для последующего редактирования/удаления/закрепления)

### **Обработка ошибок**

| Режим              | Поведение                                              |
| ------------------ | ------------------------------------------------------ |
| `stop`             | Остановка сценария, ошибка в логах                     |
| `continue`         | Игнорировать ошибку, перейти к следующему узлу         |
| `use_error_output` | Перейти по отдельному выходу «Ошибка» (красный handle) |

При ошибке текст сохраняется в `errorVariable`.

## **Валидация прав бота:**

\
Для управляемых каналов (`managed_channel`) перед вызовом API проверяются сохранённые права бота из `bot_managed_channels.bot_permissions`. Если права недостаточны — ошибка **до** вызова API.

**Автоматическое распознавание каналов:**\
При добавлении бота в канал/группу Telegram отправляет событие `my_chat_member`. Вебхук автоматически сохраняет канал в `bot_managed_channels` с правами и типом.

***

## **Узел «Тип сообщения»**

* Маршрутизация по типу входящего сообщения: текст, фото, видео, аудио, документ, стикер, контакт, локация
* Автоматическая установка глобальных переменных: `_message_type`, `_photo_url`, `_video_url`, `_media_count`, `_message_text`
* Поддержка нескольких вложений с нумерацией (`_photo_url_1`, `_photo_url_2`)

***

## **Узел «Nano Banana» (генерация изображений)**

* Генерация и редактирование изображений через AI-провайдеров с флагом `supports_image_generation`
* Поддержка синхронных (Gemini, OpenAI) и асинхронных (Kie AI) провайдеров
* Одновременная отправка результата в чат и сохранение в переменную (Base64 с префиксом `data:image/png;base64,`)
* Очистка текста от пустых Markdown-плейсхолдеров

***

## Улучшено

### **Узел «Отправить сообщение»**&#x20;

* Кнопка быстрой вставки переменных (`+`) в поле URL медиа-вложений (`VariableInput`)
* Единообразный UI для всех полей ввода переменных

### **Узел «HTTP-запрос»**&#x20;

* Прямой вызов `fetch` вместо AI-прокси для корректной обработки заголовков
* Корректный захват не-JSON ответов (текст, HTML) в контекст
* Жёсткое ожидание завершения запроса при `waitForApiResponse: true`

### **Узел «JSON Processor»**&#x20;

* Система мульти-маппинга: `rootVariable` + `mappings` для извлечения нескольких полей одновременно
* Редактор с полем «Sample JSON» (до 50 КБ), live-preview и кнопкой «Заполнить из примера»
* Приоритет `rootVariable` над `saveToVariable`
* Автоматическая миграция существующих узлов при загрузке сценария

### **AI-ассистент конструктора ботов**

* Анализ первого сообщения: пропуск вопросов, ответы на которые уже даны
* Паттерн cURL → HTTP → JSON Processor → Сообщение для интеграций с внешними API
* Документация медиа-переменных: `saveResponseTo` → `context.{alias}_url`, `_type`, `_data` и др.
* Правила использования `mediaAttachments` вместо вставки URL в текст

### **Дашборд**

* Обновлённый дизайн виджетов и карточек метрик
* Улучшенная визуализация графиков

### **Интеграции**

* Улучшенный UI диалогов подключения интеграций
* Обновлённое отображение статусов подключения

### **Подписка и биллинг**

* Обновлённый дизайн страницы тарифных планов
* Улучшенное отображение лимитов и использования ресурсов


# v1.0b

Первая бета-версия платформы Micro CRM — мультиканальная CRM-система для малого и среднего бизнеса с конструктором чат-ботов, интеграциями мессенджеров.

#### Добавлено

**1. Аутентификация и управление доступом**

* Двухфакторная аутентификация (2FA) с генерацией и проверкой кодов
* Управление активными сессиями пользователя

**2. Компании и команда**

* Управление ролями и правами сотрудников внутри компании
* Кастомизация прав для каждой роли на уровне компании

**3. CRM: Клиенты**

* Полный CRUD клиентов с постраничной навигацией
* Фильтрация и поиск по имени, телефону, email, тегам
* Категории клиентов с настраиваемыми цветами
* Теги клиентов (массив строк)
* Группы клиентов с конструктором фильтров (по полям, тегам, категориям, датам)
* Объединение дубликатов клиентов с выбором полей-победителей
* Пользовательские переменные клиентов (ключ-значение, типизированные)
* Вкладка истории сообщений в карточке клиента
* Вкладка сделок в карточке клиента
* Назначение ответственного менеджера

**4. Чаты и мессенджеры**

* Единое окно чатов из всех каналов (Telegram, MAX, Avito)
* Интеграция Telegram: подключение бота по токену, установка вебхука, получение аватаров
* Интеграция MAX (ex-VK Teams): подключение бота, вебхук, обмен сообщениями
* Интеграция Avito: OAuth-авторизация, вебхук для входящих сообщений, получение объявлений
* Отправка сообщений через все каналы с единым API
* Вкладки чатов с настройкой: создание, переименование, цвета, привязка клиентов, drag-and-drop сортировка
* Полнотекстовый поиск по чатам
* Отображение информации об объявлении Avito в чате (название, цена, фото, ссылка)
* Черновики сообщений (автосохранение при переключении чатов)
* Отправка сообщений из шаблонов с подстановкой переменных
* Вложение файлов: изображения, документы, видео, аудио

**5. Конструктор ботов (Chatbot)**

* **2 новых типа нод:**
  * **Avito-триггер** — входящие сообщения Avito с фильтрацией по объявлениям и типам
    * 4 типа триггеров: (любое сообщение), (первое сообщение в новом чате),  (ключевые слова), (точное совпадение)
      * Фильтрация по объявлению с отображением названия объявления из кеша
        * Визуальный стиль
        * Бейдж «Требуется платный тариф Avito Pro»
  * **Отправка Avito-сообщения** — текст и изображения через Avito API
    * Два типа: текстовое сообщение (до 1000 символов) и изображение (URL + подпись)
    * Режим «Ожидание ответа»: сохранение ответа пользователя в переменную сценария, специальный handle «Текстовый ответ»
    * Предупреждение о превышении лимита 1000 символов
    * Визуальный стиль
  * **Платформенная фильтрация нод**: в сценариях Avito скрыты Telegram-специфичные ноды, в сценариях Telegram/MAX скрыты Avito-ноды; Avito-ноды выделены отдельной категорией «Avito» в палитре с cyan-маркером
  * **Контекстные переменные Avito**: `message_text`, `avito_user_id`, `avito_chat_id`, `item_id`, `item_title`, `item_price`, `item_url`, `is_new_chat` — доступны во всех нодах через шаблоны `{{context.variable}}`
* **Стикер-заметка** — визуальная заметка на холсте (Markdown, настраиваемые цвета, resize)
* Статистика сценария: графики выполнений, ошибок, уникальных пользователей за 24ч/7д/30д
* Логи выполнения сценария с фильтрацией по статусу, дате, пользователю
* Предупреждение об отключенных нодах (без входящих связей)
* Предупреждение о конфликтах триггеров между сценариями
* Предупреждение о несохранённых изменениях при уходе со страницы
* Предупреждение о паузе сценария (приостановка по биллингу)
* AI-ассистент v2.0 для построения сценариев (генерация нод по текстовому описанию)
* Переменные сценария с автоподстановкой в текстовых полях

**6. Движок выполнения ботов (Backend)**

* Абсолютно новая - Модульная архитектура движка. Переработан каждый блок для оптимизации и ускорения работы.&#x20;

**7. Шаблоны сообщений**

* AI-генерация шаблонов по текстовому описанию
* Предпросмотр шаблонов с подстановкой тестовых данных
* Управление переменными шаблонов

**8. Реферальная система**

* Уникальная реферальная ссылка для каждого пользователя
* Статистика: клики, регистрации, начисления
* Автоматическое начисление бонусов при регистрации реферала
* Перевод реферального баланса в основной

**9. Хранилище и документы**

* Загрузка медиафайлов (изображения, видео, документы, аудио)
* Медиа-селектор для выбора из загруженных файлов
* Удаление и очистка заблокированных медиа
* Загрузка и парсинг документов (PDF, DOCX, TXT и др.)
* RAG-система:
  * Генерация эмбеддингов документов
  * Чат по документам с поиском по семантической близости
* Управление документами компании

**10. Дашборд**

* Настраиваемые виджеты с drag-and-drop:
  * Метрики (клиенты, чаты, сделки, доход)
  * График активности (новые клиенты, сообщения по дням)
  * Статистика чатов (по каналам, статусам)
  * Распределение клиентов (по категориям, источникам)
  * Последняя активность (лента событий)
  * Напоминания (ближайшие задачи)
  * График доходов
  * Группы клиентов (счётчики по группам)
* Настройки графиков (период, тип диаграммы)
* Сохранение пользовательских настроек дашборда

#### Изменено

**Страница «Чаты»**&#x20;

* Реализована тёмная тема чатов с локализованными CSS-классами
* Удалён бейдж «Активный» из заголовка чата
* Элемент активного чата в списке
* На мобильных: скрыта кнопка «Очистить историю» в заголовке чата
* На мобильных: добавлен отступ у поля ввода для предотвращения перекрытия навигацией
* Поле ввода на мобильных: авторасширение
* При переключении чатов: синхронизация поля ввода с черновиками, сброс файлов, пересчёт высоты
* Кастомный скроллбар для тёмной темы чатов

**Карточка сценария**

* Новый макет карточки с закруглением и эффектом при наведении
* На десктопе: узкая левая панель  с кнопкой Play/Pause, иконка сценария&#x20;
* На мобильных: левая панель скрыта, иконка уменьшена, кнопки Play/Pause и действия (редактировать, дублировать, логи, удалить) вынесены в отдельную горизонтальную строку под заголовком
* Подвал карточки: уменьшенный шрифт на мобильных, метаданные в строку
* Метки триггеров упрощены до текста, первый триггер подсвечивается синим цветом

**Боковая панель**

* Кнопка переключения темы (Sun/Moon) вынесена в заголовок сайдбара, доступна и на мобильных через меню «Ещё»
* Добавлена кнопка сворачивания/разворачивания сайдбара на десктопе (круглая кнопка на границе)

**Конструктор ботов**

* Панель свойств ноды не открывается автоматически на мобильных устройствах после сохранения сценария
* Фон конструктора изменен

**ИИ-помощник конструктора ботов**

* Переработана тёмная тема панели&#x20;
* Минимальные отступы сообщений&#x20;
* Сообщения пользователя
* Сообщения ассистента


