translate Доступно на: EN VI
info Переведено с помощью ИИ

Входящие и мосты QuotyAI

Омниканальные входящие и мосты

QuotyAI использует двухканальную архитектуру для обработки разговоров с клиентами на всех платформах. Хотите ли вы полного владения данными с помощью Нативных входящих или предпочитаете использовать существующую инфраструктуру Chatwoot с мостами входящих — QuotyAI дает вам гибкость выбора подходящего подхода для вашего бизнеса.


Два способа управления разговорами

QuotyAI реализует два различных подхода к управлению каналами общения:

  1. Нативные входящие (Native Inboxes): Каналы, где история переписки хранится непосредственно в MongoDB QuotyAI — вы полностью владеете данными.
  2. Мосты входящих (Inbox Bridges): Прокси-соединения с внешними экземплярами Chatwoot — QuotyAI обрабатывает сообщения, но история переписки хранится внешне.

Обзор архитектуры

                   ┌─────────────────────────────────────────────────────┐
                   │                    Канальный слой                              │
                   │  Telegram │ Facebook │ WhatsApp │ Instagram │ Voice/LiveKit   │
                   └──────────────────────┬────────────────────────────────┘

                         ┌──────────────┴──────────────┐
                         │                             │
                  ┌──────▼────────┐          ┌───────▼────────┐
                  │ Нативные     │          │  Мосты        │
                  │ входящие     │          │  входящих     │
                  │ (владелец    │          │  (прокси-слой)│
                  │  данных)     │          │               │
                  └──────┬────────┘          └───────┬────────┘
                         │                           │
                         ▼                           ▼
                  ┌───────────────┐          ┌────────────────┐
                  │ БД QuotyAI  │          │ API Chatwoot  │
                  │ (полное      │          │ (внешнее      │
                  │  хранение)   │          │  хранилище)   │
                  └───────┬───────┘          └───────┬────────┘
                         │                           │
                         └──────────────┬─────────────┘

                         ┌──────────────────────────────┐
                         │  Единая AI-обработка          │
                         │  (Продающие + Управляющие     │
                         │   ассистенты)                 │
                         └──────────────────────────────┘

Нативные входящие: Полное владение данными

Что такое нативные входящие?

Нативные входящие — это каналы связи, в которых QuotyAI владеет полным жизненным циклом разговора. Каждое сообщение, цепочка переписки и профиль контакта хранятся непосредственно в вашей MongoDB. Вы получаете полный контроль, исчерпывающие аудиторские журналы и богатую обработку вложений с OCR.

Поддерживаемые каналы

Канал Значение Enum Статус
Telegram TELEGRAM ✅ Активен
Facebook Messenger FACEBOOK ✅ Активен
Instagram INSTAGRAM ✅ Активен
WhatsApp WHATSAPP ✅ Активен
Голос (LiveKit) LIVEKIT ✅ Активен

Архитектура хранения данных

┌──────────────────────────────────────────────────────┐
│                    MongoDB (БД QuotyAI)                │
├──────────────────────────────────────────────────────┤
│ native-inboxes                → Конфиги и учетные данные входящих    │
│ native-inbox-conversations    → Цепочки переписки                     │
│ native-inbox-contacts         → Единые профили контактов             │
│ native-inbox-telegram-messages → Сообщения Telegram                  │
│ native-inbox-facebook-messages → Сообщения Facebook                  │
│ voice-inboxes                 → Конфиги голосовых входящих           │
│ voice-inbox-sessions          → Сессии голосовых звонков             │
└──────────────────────────────────────────────────────┘

Основные модели данных

NativeInboxDoc (Конфигурация входящих)

export interface NativeInboxDoc {
  _id: ObjectId;
  tenantId: ObjectId;
  businessEntityId: ObjectId;  // Ссылка на вашу бизнес-сущность
  name: string;
  channel: NativeInboxChannelType;  // TELEGRAM, FACEBOOK и т.д.
  status: NativeInboxStatus;  // 'active' | 'disabled' | 'disconnected'
  
  // Учетные данные для конкретного канала (встроенные)
  credentials: NativeInboxChannelCredentialsDoc;
  // Telegram: { botToken, botUsername }
  // Facebook:  { pageId, accessToken, appSecret }
  // WhatsApp: { phoneNumberId, businessAccountId }
  
  webhookUrl: string;
  webhookSecret?: string;  // Для верификации
  
  // AI-конфигурация
  defaultAiReplyAssistantAssignment?: ConversationAiAssignmentDoc;
  
  createdAt: Date;
  updatedAt?: Date;
  deletedAt?: Date;  // Мягкое удаление
}

NativeInboxConversationDoc (Цепочка переписки)

export interface NativeInboxConversationDoc {
  _id: ObjectId;
  tenantId: ObjectId;
  inboxId: ObjectId;
  contactId: ObjectId;
  channel: NativeInboxChannelType;
  
  // Назначение AI (может переопределять настройки входящих)
  aiReplyAssistantAssignment?: ConversationAiAssignmentDoc;
  
  customAttributes?: Record<string, unknown>;
  externalId: string;  // ID чата Telegram, PSID Facebook и т.д.
  
  lastInboundMessage?: { text?: string; createdAt: Date };
  lastOutboundMessage?: { text?: string; createdAt: Date };
  
  createdAt: Date;
  updatedAt?: Date;
  deletedAt?: Date;
}

BaseNativeInboxMessageDoc (Сообщение)

export interface BaseNativeInboxMessageDoc {
  _id: ObjectId;
  tenantId: ObjectId;
  conversationId: ObjectId;
  inboxId: ObjectId;
  
  direction: MessageDirection;  // 'inbound' | 'outbound'
  status: MessageStatusEnum;  // 'sent' | 'delivered' | 'read' | 'failed'
  text?: string;
  
  sender: NativeInboxMessageSenderDoc;
  // { id: string; type: 'customer' | 'ai' | 'human_agent' | 'system' }
  
  // Расширенные вложения (все хранятся с URL в GCS)
  attachedImages?: NativeInboxMessageImageAttachmentDoc[];     // + данные OCR
  attachedVideos?: NativeInboxMessageVideoAttachmentDoc[];
  attachedAudios?: NativeInboxMessageAudioAttachmentDoc[];
  attachedFiles?: NativeInboxMessageFileAttachmentDoc[];
  attachedLocations?: NativeInboxMessageLocationAttachmentDoc[];
  attachedContacts?: NativeInboxMessageContactAttachmentDoc[];
  attachedStickers?: NativeInboxMessageStickerAttachmentDoc[];
  
  externalId?: string;  // ID сообщения на платформе
  metadata?: NativeInboxMessageMetadata;  // { runId для observability }
  
  visibleForCustomer: boolean;
  visibleForAi: boolean;
  
  createdAt: Date;
  deletedAt?: Date;
}

Как работают нативные входящие

Flow получения сообщений

Клиент отправляет сообщение

API Telegram/Facebook отправляет вебхук в QuotyAI

Приемник вебхуков (проверка секрета, ограничение частоты запросов)

Очередь событий (на основе приоритета, асинхронная обработка)

Сервис воркфлоу разговоров

        ├─→ Найти/Создать контакт (единый профиль)
        ├─→ Найти/Создать разговор
        ├─→ Сохранить сообщение (с OCR для изображений)
        └─→ Вызвать AI-ассистента

        AI генерирует ответ

        Отправка через SDK канала (Telegram SDK, Facebook SDK)

        Сохранение исходящего сообщения в MongoDB

Система очередей событий

UnifiedEventQueueService обеспечивает надежную асинхронную обработку:

export enum QueuedEventType {
  MESSAGE = 'message',
  EDITED_MESSAGE = 'edited_message',
  CALLBACK_QUERY = 'callback_query',
  POSTBACK = 'postback',
  // ... 20+ поддерживаемых типов событий
}

export enum EventPriority {
  HIGH = 0,    // Сообщения пользователей, платежи
  NORMAL = 1,  // Подтверждения доставки
  LOW = 2,     // Уведомления о прочтении, реакции
}

Возможности:

  • Обработка на основе приоритета (HIGH → NORMAL → LOW)
  • Автоматические повторные попытки с экспоненциальной задержкой (макс. 3 попытки)
  • Ограничение частоты по ID чата
  • Идемпотентность (предотвращает дублирующую обработку)
  • Конкурентная обработка с настраиваемыми лимитами

Ключевые сервисы

Сервис Ответственность
TelegramChannelLifecycleService CRUD входящих, проверка токена бота, настройка/удаление вебхука
TelegramWebhookReceiverService Прием вебхуков, проверка секрета, постановка в очередь событий
TelegramConversationWorkflowService Обработка сообщений, сохранение в БД, управление контактами
FacebookChannelLifecycleService Аналогично для Facebook/Instagram
UnifiedNativeInboxLifecycleService Унифицированные операции чтения по всем нативным входящим
UnifiedNativeInboxConversationService Поиск разговоров, пагинация, назначение AI

Мосты входящих: Прокси-архитектура

Что такое мосты входящих?

Мосты входящих — это прокси-соединения с внешними экземплярами Chatwoot. В отличие от нативных входящих, QuotyAI НЕ хранит историю переписки. Вместо этого он проксирует запросы к API Chatwoot в реальном времени, обрабатывая AI локально.

Ключевая концепция: Прокси vs Хранение

┌──────────────────────────────────────────────────────┐
│                    QuotyAI хранит                          │
├──────────────────────────────────────────────────────┤
│ chatwoot-inbox-bridges             → Только конфиги мостов   │
│ external-chatwoot-accounts         → Учетные данные внешних аккаунтов │
│ external-chatwoot-reviewed-conversations → Маркеры проверки   │
└──────────────────────┬────────────────────────────────┘

                       │ Прокси-запросы

┌──────────────────────────────────────────────────────┐
│                  Экземпляр Chatwoot                        │
├──────────────────────────────────────────────────────┤
│ Разговоры (хранятся здесь)                               │
│ Сообщения (хранятся здесь)                               │
│ Контакты (хранятся здесь)                                │
└──────────────────────────────────────────────────────┘

Поддержка через Chatwoot

Поскольку Chatwoot поддерживает 10+ каналов, мосты входящих косвенно поддерживают:

  • Facebook Messenger, Instagram, WhatsApp
  • Email, веб-виджеты чата
  • Slack, Microsoft Teams
  • Любые кастомные каналы через API

Модели данных

ChatwootInboxBridgeDoc (Конфигурация моста)

export interface ChatwootInboxBridgeDoc {
  _id: ObjectId;
  tenantId: ObjectId;
  name: string;
  isActive: boolean;
  
  // Ссылка на внешний аккаунт Chatwoot
  parentExternalAccountId?: ObjectId;
  
  // Данные для подключения к Chatwoot
  chatwootHost?: string;              // Например, "https://chatwoot.example.com"
  chatwootUserAdminToken?: string;     // API-токен администратора
  chatwootAccountId?: number;          // Числовой ID аккаунта
  chatwootAgentBotId?: number;         // ID бота в Chatwoot
  chatwootAgentBotAccessToken?: string; // Токен доступа бота
  
  // Идентификация входящих
  createdChatwootInboxId?: number;       // Для внутреннего Chatwoot QuotyAI
  latestConnectedChatwootInboxId?: number; // Последний подключенный входящий
  
  // Подключение AI-ассистента
  apiKeyId: ObjectId;                   // Для аутентификации вебхуков
  assistantRole?: AssistantRole;          // 'sales' | 'accountant'
  assistantId?: ObjectId;                 // Ссылка на SalesAssistantDoc
  
  // URL
  managementUrl?: string;   // URL управления Chatwoot
  messengerUrl?: string;  // Публичный URL бота
  
  createdAt: Date;
  updatedAt?: Date;
  deletedAt?: Date;
}

ExternalChatwootAccountDoc (Внешний аккаунт)

export interface ExternalChatwootAccountDoc {
  _id: ObjectId;
  tenantId: ObjectId;
  name: string;
  host: string;                    // URL экземпляра Chatwoot
  accountId: number;                // ID аккаунта Chatwoot
  userAdminAccessToken: string;     // API-токен администратора
  createdAt: Date;
  deletedAt?: Date;
}

Как работают мосты входящих

Flow создания моста

Пользователь создает мост в QuotyAI

ExternalChatwootService.createExternalChatwootInboxBridge()

1. Получение внешнего аккаунта (host, токен из БД QuotyAI)
2. Создание документа моста в MongoDB (получение _id для URL вебхука)

3. Создание бота-агента в Chatwoot через API
   POST /api/v1/widget/bots

4. Обновление моста с токеном доступа и ID бота
5. Возврат данных моста пользователю

Обработка вебхуков (входящие сообщения)

Когда Chatwoot получает сообщение, он отправляет вебхук в QuotyAI:

// ChatwootWebhookProcessorService
async processWebhookEvent(
  payload: ChatwootWebhookPayload,
  tenantId: ObjectId,
  chatwootInboxBridge: ExternalChatwootInboxBridge
): Promise<void> {
  
  switch (payload.event) {
    case 'message_created':
      if (chatwootInboxBridge.assistantRole === 'sales') {
        await this.unifiedChatbotService.processIncomingMessage(
          InboxBridgeType.CHATWOOT,  // Тип канала
          tenantId,
          assistantId,
          { 
            payload, 
            chatwootInboxBridge,
            attachments: [...] 
          },
          signal
        );
      }
      break;
    // ... обработка других событий
  }
}

Чтение разговоров (прокси-паттерн)

// ChatwootConversationsService
async getExternalConversations(
  externalAccountId: string,
  tenantId: ObjectId,
  query: Record<string, unknown>
): Promise<Conversation[]> {
  
  // Получение учетных данных аккаунта из БД QuotyAI
  const fullAccount = await this.getFullExternalChatwootAccountById(...);
    
  // Прямой прокси к API Chatwoot (НЕ из БД QuotyAI)
  const response = await conversationList({
    baseUrl: fullAccount.host,
    headers: { 'api_access_token': fullAccount.userAdminAccessToken },
    path: { account_id: fullAccount.accountId },
    query: query
  });
    
  return response.data?.data?.payload || [];
}

Отметка разговоров как проверенных

QuotyAI хранит маркер в своей собственной БД:

// ChatwootConversationsService.markConversationAsReviewed()
await this.reviewedConversationsCollection.insertOne({
  tenantId,
  businessEntityId: new ObjectId(dto.businessEntityId),
  accountId: dto.accountId,
  inboxId: dto.inboxId,
  conversationId: dto.conversationId,
  reviewerNotes: dto.reviewerNotes,
  reviewedAt: new Date(),
  createdAt: new Date()
});

Единая AI-обработка

Как нативные входящие, так и мосты входящих используют один и тот же конвейер AI-обработки через адаптеры для конкретных каналов.

UnifiedSalesAssistantChatbotService

export class UnifiedSalesAssistantChatbotService {
  private readonly adapters: Map<UnifiedInboxChannelType, IChatAdapter>;
  
  constructor() {
    // Регистрация адаптеров для каждого типа канала
    this.adapters.set(InboxBridgeType.CHATWOOT, this.chatwootAdapter);
    this.adapters.set(NativeInboxChannelType.FACEBOOK, this.facebookAdapter);
    this.adapters.set(NativeInboxChannelType.TELEGRAM, this.telegramAdapter);
    this.adapters.set(StatelessApiChannelType.STATELESS_API, this.statelessApiAdapter);
  }
  
  async processIncomingMessage(
    channelType: UnifiedInboxChannelType,
    tenantId: ObjectId,
    assistantId: ObjectId,
    input: ChannelInput,  // Разный для каждого канала
    abortSignal: AbortSignal
  ): Promise<ProcessedMessageResult> {
    
    const adapter = this.adapters.get(channelType);
    // Адаптер обрабатывает:
    // 1. Построение AI-контекста (история переписки и т.д.)
    // 2. Вызов LLM
    // 3. Отправку ответа обратно в канал
  }
}

Типы входных данных каналов

Разные каналы имеют разные структуры входных данных:

// Для нативного Telegram входящего
export interface TelegramChannelInput {
  tenantId: ObjectId;
  conversationId: string;
  message: string;
  chatId: string;
  senderId: string;
  inbox: NativeInboxDoc;
  inboxId: string;
}

// Для нативного Facebook входящего
export interface FacebookChannelInput {
  tenantId: ObjectId;
  conversationId: string;
  message: string;
  pageId: string;
  psid: string;
  senderId: string;
  inbox: NativeInboxDoc;
  inboxId: string;
}

// Для моста Chatwoot
export interface ChatwootChannelInput {
  tenantId: ObjectId;
  conversationId: number;  // ID разговора в Chatwoot
  message: string;
  payload: ChatwootWebhookPayload;  // Полный payload вебхука
  chatwootInboxBridge: ExternalChatwootInboxBridge;
  attachments?: ChatwootAttachment[];
}

Интеграция с бизнес-сущностями

Оба типа входящих подключаются к бизнес-сущностям для AI-контекста и конфигурации.

┌──────────────────────────────────────────────────────┐
│                   Бизнес-сущность                          │
├──────────────────────────────────────────────────────┤
│ • Правила и формулы ценообразования                   │
│ • Услуги и каталог                                    │
│ • Факты о бизнесе (FAQ, политики)                     │
│ • Инструкции для AI-ассистентов                       │
│ • Конфигурация (часовой пояс, валюта, отрасль)     │
└──────────────┬───────────────────────────────────────┘

         ┌──────┴──────┐
         │             │
         ▼             ▼
  ┌──────▼────────┐  ┌────────────────┐
  │ Продающий    │  │ Управляющий    │
  │ ассистент    │  │ ассистент      │
  └──────┬────────┘  └────────┬─────────┘
         │                 │
         ▼                 ▼
  ┌──────▼────────┐  ┌────────────────┐
  │ Нативные     │  │ Мосты         │
  │ входящие     │  │ входящих      │
  │ (Telegram,   │  │ (Chatwoot)    │
  │  Facebook...) │  │               │
  └────────────────┘  └────────────────┘

Назначение AI-ассистента

На уровне нативных входящих:

// NativeInboxDoc.defaultAiReplyAssistantAssignment
{
  mode: "fixed_assistant",  // или "dynamic_latest"
  assistantId: ObjectId,        // Ссылка на SalesAssistantDoc
  assistantRole: "sales",       // или "accountant"
  businessEntityId: ObjectId,
  sendingMessageMode: "ai_only",  // или "human_only", "ai_with_handover"
  handover?: { handedOverAt, handedOverBy, reason }
}

На уровне разговора (переопределяет входящие):

// NativeInboxConversationDoc.aiReplyAssistantAssignment
// Та же структура — может переопределять назначение на уровне входящих

На уровне моста входящих:

// ChatwootInboxBridgeDoc
{
  assistantRole: "sales",
  assistantId: ObjectId,
  // ... URL вебхука использует apiKeyId для аутентификации
}

Сравнение возможностей

Возможность Нативные входящие Мост входящих (Chatwoot)
Владение данными MongoDB QuotyAI Внешняя БД Chatwoot
Хранение разговоров Нативное (MongoDB) Внешнее (API Chatwoot)
Получение сообщений Из локальной БД Прокси к API Chatwoot
Обработка вебхуков Получение → Хранение → Обработка Получение → Обработка (не хранится)
Поддерживаемые каналы Telegram, Facebook, Instagram, WhatsApp, Voice Любые каналы, поддерживаемые Chatwoot (10+)
Сложность настройки Прямая API-интеграция Требуется экземпляр Chatwoot
Хранение вложений URL в GCS + OCR Chatwoot управляет хранением
Проверенные разговоры Н/П Маркеры хранятся в QuotyAI
Унификация контактов Да (по всем каналам) Chatwoot управляет контактами
Голосовая поддержка Да (LiveKit) Через Chatwoot
Передача управления AI Нативная реализация Через UI Chatwoot + API
OCR-обработка Встроенная (изображения) Недоступна
Аудиторский журнал Полный (все в MongoDB) Ограничен (QuotyAI хранит только маркеры)

Детали технической реализации

Коллекции базы данных

Коллекция Назначение Хранит
native-inboxes Конфигурации входящих tenantId, channel, учетные данные, webhookUrl, назначение AI
native-inbox-conversations Цепочки переписки tenantId, inboxId, contactId, externalId, назначение AI
native-inbox-contacts Единые профили контактов tenantId, name, email, channelIdentifiers[]
native-inbox-telegram-messages Сообщения Telegram conversationId, text, events[], attachedImages[], данные OCR
native-inbox-facebook-messages Сообщения Facebook Та же структура, что в Telegram
voice-inboxes Конфиги голосовых входящих tenantId, name, voiceSettings, assistantId
voice-inbox-sessions Сессии голосовых звонков voiceInboxId, roomName, transcript[], callStatus
chatwoot-inbox-bridges Конфигурации мостов host, accountId, agentBotId, токены доступа, назначение ассистентов
external-chatwoot-accounts Учетные данные внешних аккаунтов URL host, accountId, административный токен доступа
external-chatwoot-reviewed-conversations Маркеры проверки accountId, inboxId, conversationId, заметки проверяющего

Архитектура сервисов

┌──────────────────────────────────────────────────────┐
│                    API слой (Hono)                         │
├──────────────────────────────────────────────────────┤
│ /omnichannel/inbox-lifecycles/* → Маршруты CRUD входящих    │
│ /omnichannel/conversations/* → Маршруты разговоров          │
│ /omnichannel/webhooks/* → Эндпоинты вебхуков              │
└──────────────┬──────────────────────────────────────────┘

         ┌──────┴──────┐
         │             │
         ▼             ▼
  ┌──────▼────────┐  ┌────────────────┐
  │ Нативные     │  │ Сервисы       │
  │ сервисы      │  │ Chatwoot      │
  ├──────┬────────┤  ├────────┬─────────┤
  │ Telegram     │  │ Внешний        │
  │ Facebook    │  │ Chatwoot       │
  │ Жизненный   │  │ Сервис         │
  │ цикл        │  │ Мост           │
  │ Воркфлоу   │  │ Разговоры     │
  │ Вебхук      │  │               │
  └────────────────┘  └────────────────┘
         │             │
         └──────┬──────┘

┌──────────────────────────────────────────────────────┐
│              Единая AI-обработка                       │
│        UnifiedSalesAssistantChatbotService              │
├──────────────────────────────────────────────────────┤
│ • Адаптеры каналов (Chatwoot, Facebook, Telegram)     │
│ • Система навыков (8 модульных навыков с инструментами)   │
│ • Динамический раннер (изолированное выполнение TypeScript) │
│ • Наблюдаемость (Полные аудиторские журналы)               │
└──────────────────────────────────────────────────────┘

Пример конфигурации: Создание нативного входящего Telegram

// POST /omnichannel/inbox-lifecycles/telegram/inboxes/
const response = await fetch('/api/omnichannel/inbox-lifecycles/telegram/inboxes/', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    telegramApiToken: '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
    name: 'Мой Telegram бот',
    businessEntityId: '507f1f77bcf86cd799439011',
    apiKeyId: '507f1f77bcf86cd799439012'
  })
});

// Ответ включает:
// - ID входящего
// - Информацию о боте (id, username)
// - Статус вебхука
// - Автоматически созданные бизнес-сущность и ассистент (если запрошено)

Пример конфигурации: Создание моста входящих Chatwoot

// POST /omnichannel/inbox-lifecycles/chatwoot/external-instance/inbox-bridges/
const response = await fetch('/api/omnichannel/inbox-lifecycles/chatwoot/external-instance/inbox-bridges/', {
  method: 'POST',
  body: JSON.stringify({
    name: 'Мой мост Chatwoot',
    parentExternalAccountId: '507f1f77bcf86cd799439013',
    assistantRole: 'sales',
    assistantId: '507f1f77bcf86cd799439014',
    apiKeyId: '507f1f77bcf86cd799439015'
  })
});

// Это действие:
// 1. Создает документ моста в MongoDB
// 2. Создает бота-агента в Chatwoot
// 3. Настраивает URL вебхука
// QuotyAI НЕ хранит разговоры — только конфигурацию моста

Чтение разговоров: Нативные vs Мосты

// Нативные входящие: Из локальной MongoDB
// POST /omnichannel/conversations/native-inbox-conversations/search
const nativeConv = await fetch('/api/omnichannel/conversations/native-inbox-conversations/search', {
  method: 'POST',
  body: JSON.stringify({
    page: 1,
    limit: 20,
    channel: 'TELEGRAM',
    sort: 'lastMessageAt',
    order: 'desc'
  })
});

// Мост входящих: Прокси из API Chatwoot
// GET /omnichannel/conversations/chatwoot-bridge-conversations/conversations/:bridgeId
const bridgeConv = await fetch(`/api/omnichannel/conversations/chatwoot-bridge-conversations/conversations/${bridgeId}?limit=20`);
// Внутренне вызывает API Chatwoot и возвращает разговоры

Когда что использовать?

Выбирайте нативные входящие, если хотите:

  • Полное владение данными — все данные в вашей MongoDB
  • Прямую интеграцию с каналом — без посредников
  • Богатую обработку вложений — OCR, анализ изображений
  • Единые профили контактов по всем каналам
  • Конвергенцию голоса и чата — один и тот же ассистент обрабатывает оба
  • Полные аудиторские журналы — каждое сообщение в вашей БД
  • Кастомные воркфлоу — полный контроль над обработкой

Лучше всего для: Бизнеса, который хочет полного контроля, нуждается в OCR-обработке или работает с чувствительными данными.

Выбирайте мосты входящих, если вы:

  • Уже используете Chatwoot — используйте существующую инфраструктуру
  • Нуждаетесь в более широкой поддержке каналов — Chatwoot поддерживает 10+ каналов
  • Хотите UI/функции Chatwoot — управление разговорами, интерфейс агента
  • Предпочитаете не дублировать данные — разговоры остаются в Chatwoot
  • Имеете сложные потребности в маршрутизации — продвинутые правила маршрутизации Chatwoot

Лучше всего для: Бизнеса, уже работающего на Chatwoot, или тех, кому нужны каналы, которые QuotyAI пока не поддерживает нативно.


Сила единого AI

Оба подхода предоставляют одинаковые возможности AI-ассистента через единый UnifiedSalesAssistantChatbotService, обеспечивая неизменное качество обслуживания клиентов независимо от типа входящих.

Клиент отправляет сообщение через Telegram

Нативные входящие (сохраняют сообщение)
        ↓                    ИЛИ
Клиент отправляет сообщение через Chatwoot

Мост входящих (прокси к Chatwoot)

        ┌────────────────────────────────────────────┐
        │  Один и тот же конвейер AI-обработки              │
        │  • 80+ языков                                │
        │  • Время ответа 1-2 секунды                  │
        │  • Детерминированное ценообразование           │
        │  • Передача управления человеку            │
        └────────────────────────────────────────────┘

Клиент получает неизменно качественный ответ

Итог

Двухканальная архитектура входящих QuotyAI дает вам гибкость выбора подходящего подхода:

Что учитывать Рекомендация
Важен суверенитет данных Используйте нативные входящие
Уже работаете на Chatwoot Используйте мосты входящих
Нужна OCR/обработка вложений Используйте нативные входящие
Нужно 10+ каналов быстро Используйте мосты входящих
Конвергенция голоса и чата Используйте нативные входящие
Хотите простую настройку Любой — оба подхода просты

Оба подхода являются полноправными участниками экосистемы QuotyAI с полной интеграцией AI-ассистентов, поддержкой бизнес-сущностей и всесторонней наблюдаемостью.