Перейти к основному содержимому

Правила триггеров и безопасность

На этой странице подробно описаны конфигурация правил триггеров и механизм конвейера безопасности системы Channel. Правила триггеров определяют когда Agent отвечает; конвейер безопасности определяет может ли сообщение вообще достичь Agent.

Правила триггеров

Правила триггеров настраиваются через ChannelTriggerConfig. Каждый экземпляр Channel может настроить их независимо.

:::info Личные сообщения всегда активируют триггер Независимо от того, как настроены правила триггеров, личные сообщения (DM) всегда активируют ответ Agent. Правила триггеров влияют только на сообщения в групповых чатах. :::

Режим all — отвечать на все сообщения

Agent генерирует ответ на каждое сообщение в группе.

{
"mode": "all"
}

Лучше всего подходит для:

  • Персональных ботов
  • Тестовых сред
  • Небольших групп с малым числом участников

Примечание: Использование этого режима в активной многопользовательской группе приведёт к большому количеству вызовов API. Рекомендуется использовать совместно с ограничением частоты.

Режим mention — отвечать при упоминании @

Agent отвечает только тогда, когда его упоминают через @. Сообщения без совпадения кэшируются как контекст (до 50 сообщений) и отправляются Agent вместе с активирующим сообщением, чтобы он понимал фон разговора в группе.

{
"mode": "mention",
"mentionName": "Clawia"
}

Лучше всего подходит для:

  • Общих серверов Discord/Slack
  • Многопользовательских рабочих групп
  • Когда вы не хотите, чтобы бот отвечал слишком часто

Поле mentionName: Установите имя пользователя бота на платформе. Система проверяет, содержит ли сообщение @Clawia (с учётом регистра), чтобы определить, активируется ли триггер.

Режим keyword — совпадение по ключевому слову

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

{
"mode": "keyword",
"keywords": ["help", "assist", "Clawia"]
}

Лучше всего подходит для:

  • Сценариев службы поддержки, где пользователи вводят «help» для активации бота
  • Каналов, посвящённых определённой теме

Правило сопоставления: Триггер срабатывает, если сообщение содержит хотя бы одно из ключевых слов. Например, сообщение Please help me look into this совпадает с ключевым словом help.

Режим dm_only — только личные сообщения

Agent отвечает только на личные сообщения и полностью игнорирует групповые сообщения (без кэширования, без ответа).

{
"mode": "dm_only"
}

Лучше всего подходит для:

  • Развёртывания бота на публичном сервере с приёмом только личных разговоров
  • Сценариев, чувствительных к конфиденциальности

Общие параметры

Следующие параметры можно сочетать с любым режимом триггера:

ignoreBot — игнорировать собственные сообщения бота

{
"mode": "all",
"ignoreBot": true
}

При значении true сообщения, отправленные самим ботом, не активируют ответ, что предотвращает петли самоответов.

allowFrom — список разрешённых отправителей

{
"mode": "all",
"allowFrom": ["123456789", "987654321"]
}

Ограничивает ответы Agent только пользователями из списка разрешённых. allowFrom содержит идентификаторы пользователей платформы (например, Discord user ID).

  • Пустой массив или ["*"] означает, что разрешены все пользователи
  • Сопоставление ID нечувствительно к регистру
  • Эта проверка имеет приоритет над режимом триггера: пользователи не из списка разрешённых не активируют ответ, даже если упомянут бота через @

Механизм кэширования сообщений

В режимах mention и keyword несовпадающие сообщения не отбрасываются — они кэшируются в скользящем окне:

  • Каждая пара «экземпляр Channel + сеанс чата» поддерживает независимый буфер сообщений
  • Буфер хранит не более 50 последних сообщений (FIFO)
  • Когда условие триггера выполнено, все сообщения из буфера отправляются Agent вместе с активирующим сообщением
  • Групповые сообщения оборачиваются в XML-формат, включающий отправителя, временную метку и другой контекст

Это позволяет Agent понимать фон группового разговора при упоминании, а не видеть лишь одно сообщение.

Конвейер безопасности

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

Сообщение поступает

├── [1] RateLimiter ─── Превышена частота? → Тихо отбросить

├── [2] InputSanitizer ─── Содержит управляющие символы? → Удалить и продолжить

├── [3] PromptGuardian ─── Обнаружена атака инъекцией? → Заблокировать + ответить отклоняющим сообщением

├── [4] UserPermissionService ─── Роль пользователя запрещена? → Заблокировать

├── [5] ChannelPermissionGate ─── Это ответ на запрос подтверждения? → Потребить сообщение

└── Сопоставление с правилом триггера → Направить к Agent

Уровень 1: RateLimiter — ограничение частоты

Ограничитель частоты со скользящим окном, реализованный в памяти без необходимости в постоянном хранении.

КонфигурацияПо умолчаниюОписание
enabledfalseВключить ли ограничение частоты
maxPerMinute20Максимум сообщений от одного пользователя в минуту
maxPerHour200Максимум сообщений от одного пользователя в час
globalMaxPerMinute60Максимум сообщений от всех пользователей вместе в минуту

Поведение: Сообщения, превысившие лимит, тихо отбрасываются (без ответа, без уведомления отправителя).

Ключ ограничения частоты: Отслеживается по channelId + senderId; сообщения от одного пользователя в одном экземпляре Channel используют общую квоту.

подсказка

Ограничение частоты по умолчанию отключено. Рекомендуется включать его для ботов, работающих с публичной аудиторией, чтобы предотвратить злонамеренный спам, увеличивающий расходы на API.

Уровень 2: InputSanitizer — очистка входных данных

Удаляет невидимые управляющие символы Unicode из сообщений, предотвращая атаки на основе кодировки и обфускации.

КонфигурацияПо умолчаниюОписание
enabledtrueВключить ли очистку входных данных
stripControlCharstrueУдалять ли управляющие символы

Типы удаляемых символов:

  • Нулевые байты (\x00)
  • Пробелы нулевой ширины (​-‏)
  • Управляющие символы двунаправленного текста Unicode ( -‮)
  • Маркер BOM ()
  • Другие управляющие символы C0/C1 (обычные пробельные символы, такие как переводы строк и табуляции, сохраняются)

Поведение: Очищенное сообщение передаётся на следующий уровень. В журнал записывается количество символов, удалённых из исходного сообщения. Сообщение не блокируется.

Уровень 3: PromptGuardian — обнаружение инъекций в промпт

Использует AI (LLM) для проверки безопасности сообщений на семантическом уровне, обнаруживая инъекции в промпт, джейлбрейки и состязательные манипуляции.

КонфигурацияВариантыОписание
modeoff / monitor / blockРежим работы

Описание режимов:

РежимПоведение
offПолностью отключён, нулевые накладные расходы (по умолчанию)
monitorОбнаруживает и записывает в журнал, но не блокирует сообщения. Используйте для оценки частоты ложных срабатываний
blockБлокирует сообщение при обнаружении инъекции и отвечает отправителю юмористическим отклоняющим сообщением

Принципы проектирования:

  • Fail-open (отказ с разрешением): если LLM-проверка превышает таймаут (10 секунд) или завершается ошибкой, сообщение автоматически пропускается, чтобы сбой уровня безопасности не блокировал нормальное общение
  • Короткие сообщения (менее 10 символов) пропускают проверку
  • Результаты проверки безопасных сообщений кэшируются (ключ — хэш SHA-256), чтобы избежать повторных проверок

Уровень 4: UserPermissionService — права пользователей

Система управления доступом на основе ролей. Внешние пользователи, отправляющие первое сообщение, автоматически регистрируются с ролью guest.

Иерархия ролей

Роли от высшей к низшей:

РольЧатВыполнение инструментовТребует подтвержденияУправление пользователямиУправление настройками
ownerРазрешеноРазрешеноНетРазрешеноРазрешено
adminРазрешеноРазрешеноНетРазрешеноНет
trustedРазрешеноРазрешеноНетНетНет
memberРазрешеноРазрешеноДаНетНет
guestРазрешеноНетНетНет
blockedНетНетНетНет

Описание полей:

  • Чат: разрешено ли сообщению достигать Agent (canChat)
  • Выполнение инструментов: может ли пользователь активировать вызовы инструментов, таких как чтение/запись файлов и команды оболочки (canUseTool)
  • Требует подтверждения: должен ли отправитель подтвердить в Channel выполнение чувствительных инструментов (оболочка, запись файлов) перед их запуском (requireConfirmation)
  • Управление пользователями: может ли пользователь управлять пользователями с более низкими ролями (canManageUsers)
  • Управление настройками: может ли пользователь изменять настройки Agent и безопасности (canManageSettings)

Поведение по умолчанию:

  • Новые пользователи автоматически регистрируются как guest; они могут общаться в чате, но не могут активировать инструменты
  • Сообщения от пользователей с ролью blocked тихо отбрасываются, а пользователь получает уведомление о блокировке
  • Администраторы могут изменять роли пользователей через интерфейс Elftia

Уровень 5: ChannelPermissionGate — подтверждение операций

Когда пользователь с ролью member активирует чувствительный инструмент (команды оболочки, запись файлов и т.д.), система не выполняет его напрямую — вместо этого она отправляет запрос подтверждения в Channel:

⚠️ Permission Required

Clawia wants to execute: **Shell Command**
> npm test

Reply: **y** (approve) / **n** (deny) / **always** (always allow this tool)
⏱ Auto-denied in 5 minutes. [confirm-xxx]

Варианты ответа на подтверждение:

ОтветЭффект
y / yes / ok / confirmОдобрить это выполнение
n / no / cancel / denyОтклонить это выполнение
always / always allowОдобрить и запомнить эту комбинацию инструмент + аргумент; автоматически одобрять последующие вызовы

Ключевые детали:

  • Запросы подтверждения автоматически отклоняются по истечении 5 минут без ответа
  • Максимум 5 ожидающих подтверждений на один Channel + сеанс чата
  • Область действия always точна до комбинации инструмент + аргумент (например, «всегда разрешать Bash: npm test» не даёт автоматического одобрения «Bash: rm -rf /»)
  • Роли owner, admin и trusted никогда не требуют подтверждения; инструменты выполняются напрямую
  • Роль guest не может активировать инструменты вовсе и никогда не достигает шага подтверждения

Рекомендации по настройке безопасности

Личное использование

{
"rateLimiter": { "enabled": false },
"sanitizer": { "enabled": true },
"promptGuardian": { "mode": "off" }
}

Для личного использования строгая безопасность не нужна. Достаточно сохранить включённую очистку входных данных.

Небольшая команда

{
"rateLimiter": { "enabled": true, "maxPerMinute": 30, "maxPerHour": 300 },
"sanitizer": { "enabled": true },
"promptGuardian": { "mode": "monitor" }
}

Включите ограничение частоты для предотвращения случайного флуда. Сначала используйте PromptGuardian в режиме monitor для оценки частоты ложных срабатываний.

Публичный доступ

{
"rateLimiter": { "enabled": true, "maxPerMinute": 10, "maxPerHour": 100 },
"sanitizer": { "enabled": true },
"promptGuardian": { "mode": "block" }
}

Включите полный конвейер безопасности. Строгое ограничение частоты + блокировка инъекций в промпт. Рекомендуется сочетать со списком разрешённых allowFrom или режимом триггера mention.