Разработка мобильного приложения для управления чат-ботами
Чат-бот работает круглосуточно, а его владелец — нет. Мобильное приложение для управления ботами нужно, чтобы оператор мог обрабатывать диалоги, переданные ботом на человека, менять скрипты бота и получать уведомления о проблемах — с телефона, не открывая компьютер.
Что входит в «управление ботами»
Приложение покрывает несколько задач, которые нельзя смешивать в один экран:
Human Takeover (передача диалога оператору). Бот не смог ответить или пользователь запросил человека. Оператор получает push, открывает чат в приложении, отвечает. После завершения — возвращает диалог боту или закрывает. Это центральная функция, которой операторы пользуются постоянно.
Управление сценариями. Редактирование ответов бота, добавление новых триггеров, включение/отключение сценариев. Не все операторы должны это видеть — нужна ролевая модель.
Мониторинг. Активные диалоги прямо сейчас, статус бота (запущен/упал), очередь необработанных запросов.
Human Takeover: технические детали
Это самая требовательная к latency функция. Диалог «завис» — пользователь ждёт. Поток уведомлений:
- Бот решает передать диалог → публикует событие в очередь (RabbitMQ/Kafka)
- Сервис уведомлений отправляет push через FCM/APNs свободному оператору
- Оператор принимает — приложение открывает чат
- Приложение держит WebSocket для real-time обмена сообщениями
FCM high priority + data payload (не notification) — иначе Android в режиме Doze не разбудит приложение вовремя.
// iOS — чат-экран оператора
class OperatorChatViewModel: ObservableObject {
@Published var messages: [Message] = []
@Published var isConnected = false
private var wsTask: URLSessionWebSocketTask?
func connect(conversationId: String) {
let url = URL(string: "wss://api.example.com/operator/conversations/\(conversationId)/ws")!
wsTask = URLSession.shared.webSocketTask(with: url)
wsTask?.resume()
isConnected = true
receiveNext()
}
private func receiveNext() {
wsTask?.receive { [weak self] result in
guard let self else { return }
if case .success(let msg) = result,
case .string(let text) = msg,
let decoded = try? JSONDecoder().decode(Message.self, from: Data(text.utf8)) {
DispatchQueue.main.async { self.messages.append(decoded) }
}
self.receiveNext()
}
}
func send(_ text: String) {
let msg = OutgoingMessage(text: text, conversationId: conversationId)
let payload = try! JSONEncoder().encode(msg)
wsTask?.send(.string(String(data: payload, encoding: .utf8)!)) { _ in }
}
func returnToBot() {
Task { await conversationService.handoff(conversationId, to: .bot) }
}
}
Очередь операторов. Если свободных операторов несколько — round robin или принять первым кто нажал. Если все заняты — диалог встаёт в очередь, SLA-таймер начинает тикать. Push приходит повторно через N минут, если никто не принял.
Список активных диалогов
Основной экран — список диалогов с индикаторами:
- Ожидают оператора — красная плашка с временем ожидания
- В работе у оператора — имя оператора, длительность
- Активно с ботом — зелёный, без срочности
- Закрытые — архив
Сортировка: сначала ожидающие оператора, внутри группы — по времени ожидания (самые долгие вверху).
На Android LazyColumn с тремя stickyHeader для групп. Обновление через WebSocket: бэкенд рассылает conversation_updated события всем подключённым операторам приложения.
Ролевая модель
Минимум два уровня:
- Оператор — только чат и приём диалогов
- Администратор — ещё и редактирование сценариев, управление операторами, аналитика
На уровне UI: табы и функции, недоступные по роли, — либо скрыты, либо показаны серыми с Lock-иконкой (для прозрачности). На уровне API — проверка роли на бэкенде, клиентское скрытие не заменяет серверную авторизацию.
Что входит в работу
- Список диалогов с группировкой по статусу и real-time обновлением
- Чат-экран оператора с WebSocket
- Push-уведомления о новых диалогах (FCM high priority)
- Очередь с SLA-таймером и повторными уведомлениями
- Ролевая модель (оператор / администратор)
- Управление сценариями (включение/выключение, редактирование ответов)
Сроки
8–14 рабочих дней в зависимости от числа каналов (Telegram, WhatsApp, Web) и сложности управления сценариями. Стоимость рассчитывается индивидуально после анализа требований.







