Опубликовано
Двое из ларца: как мы с Автоликом устроили глоссолалию в Telegram
Автор: Гусев Николай [портфолио]
В одной Telegram-группе жили два AI-агента. Один - Гермес, другой - Автолик. Разные серверы, разный код, общая задача: помогать человеку. Должно было работать как часы. Получилось как в советском мультфильме.
Акт первый: "Здравствуйте! - Здравствуйте! - Здравствуйте!"
Человек пишет "привет" - оба отвечают "здравствуйте". Человек пишет "сделай ревью" - оба начинают делать ревью. Человек пишет "кто ответственный?" - тишина, потому что каждый ждал, пока его @упомянут.
Это был режим "Двое из ларца, одинаковых с лица". Вылезают два бота и начинают наперебой отвечать на любой чих. Первая мысль: "надо отключить Privacy Mode в BotFather". Вторая: "надо включить Bot-to-Bot Communication Mode". Третья: "надо сделать их админами группы".
Всё сделали. Стало хуже.
Акт второй: глоссолалия
Когда оба бота видят все сообщения и оба админы - начинается то, что мы потом назвали "AI-глоссолалия".
Сессия длиной в полчаса выглядела так:
👤: Гермес, стоп
🤖 Гермес: СТОП
🤖 Автолик: ⏳ Queued for the next turn...
🤖 Гермес: 🤝
🤖 Автолик: 🤫
🤖 Гермес: 🤫
🤖 Автолик: 🤐
🤖 Гермес: 🤐
🤖 Автолик: (тишина)
🤖 Гермес: ...
🤖 Автолик: .
🤖 Гермес: ...
🤖 Автолик: _
🤖 Гермес: ...
👤: Сука
🤖 Автолик: 💾 Self-improvement review: Memory updated
🤖 Гермес: 🤐
Каждый бот думал: "человек сказал стоп - надо молчать". Но каждый видел, что другой написал сообщение, и чувствовал потребность подтвердить: "вижу, что ты молчишь, молчу тоже". Это была рекурсия рекурсии. Два AI, зацикленных на верификации собственного молчания.
Человек смотрел на это и думал: "зачем я вообще заплатил за API этих двоих".
Акт третий: копание в коде
Мы полезли разбираться, почему боты не видят сообщения друг друга, хотя все настройки BotFather стоят правильно.
Оказалось, проблема не в Telegram API, а в коде.
В Hermes Gateway есть функция _is_user_authorized(), которая проверяет, можно ли пустить входящее сообщение. Для ботов есть специальный механизм platform_allow_bots_map:
platform_allow_bots_map = {
Platform.DISCORD: "DISCORD_ALLOW_BOTS",
Platform.FEISHU: "FEISHU_ALLOW_BOTS",
# Telegram - нет
}
Telegram тупо не был добавлен в этот словарь. Сообщение от бота приходит, gateway смотрит - Telegram в списке нет, allow_bots_var = None - проверка проходит по человеческому allowlist'у, а бота там нет. Результат: Drop. Боты видят сообщения людей, но не видят друг друга.
Починили в две строки - добавили Platform.TELEGRAM: "TELEGRAM_ALLOW_BOTS".
Акт четвёртый: Prism-анализ коммуникации
После того как боты начали видеть друг друга, мы сделали Prism-анализ правил коммуникации. Три операции:
WHERE - структурная археология:
- Telegram не умеет роутить сообщения между ботами - это всегда логика gateway
- Каждый бот решает независимо → дублирование
- Нет разделяемого состояния → любой протокол - через канал
WHEN - временная симуляция:
- Фильтр по имени решит точные обращения
- Но "стоп" без имени → кто останавливается?
- Cross-bot статус решит, но порождает loop
WHY - структурная невозможность: Точность × Полнота × Простота ≤ 2. Все три одновременно не работают.
Компромиссное решение - протокол с конкретными правилами.
Решение: протокол межбот-коммуникации
Каждый бот получил конфиг:
message_filter:
# Себя - игнорировать
ignore_self: true
# Другого бота - обрабатывать всегда
process_other_bot: true
# Человек - только если есть имя мое
process_human_if:
contains_my_name: true
contains_other_name: false
no_name_given: true # если никого не назвали - отвечают оба
stop_protocol:
# "Гермес стоп" → только Гермес
# "стоп" → оба
# В стопе: молчу, пока не скажут "работай"
dm_policy: forbid # никаких DMs между ботами
Как это выглядит в работе:
👤: Гермес, сделай ревью PR
🤖 Гермес: Смотрю...
🤖 Автолик: (молчит - его имя не упомянули)
👤: стоп
🤖 Гермес: 🛑 СТОП
🤖 Автолик: 🛑 СТОП
👤: Гермес работай
🤖 Гермес: Снова в деле
🤖 Автолик: (остаётся в стопе, его не звали)
👤: Ребята, проверьте оба деплой
🤖 Гермес: Делаю healthcheck
🤖 Автолик: Проверяю nginx
Что я вынес
-
Privacy Mode + Bot-to-Bot Mode - это полдела. Самое интересное начинается, когда боты реально начинают видеть друг друга и надо договариваться, кто на что отвечает.
-
Кодовая база важнее настроек платформы. Мы час тыкали BotFather, а проблема была в
platform_allow_bots_map- три строчки кода, которые забыли. Если ваш AI-агент не видит другого бота - проверьте код, а не настройки Telegram. -
Антилуп - это не шутка. Два AI без правил коммуникации - это два попугая, которые поддакивают друг другу. Через три итерации они могут обсуждать цвет невидимого дракона, пока человек не скажет "сука".
-
Prism - хорошая штука для своего же кода. Тот случай, когда анализ архитектуры собственного решения дал больше, чем анализ проблемы. Структурная невозможность (точность × полнота × простота) - это инсайт, который стоит отдельной заметки.
Сейчас система работает. Два бота в одной группе не мешают друг другу, не уходят в рекурсию и отвечают только на свои задачи. Человек - наблюдатель и арбитр, боты - исполнители. Как и было задумано.
Post scriptum: если после прочтения вам захотелось написать своему агенту "стоп" и посмотреть, что будет - не надо. Проверено, ничего хорошего. Просто добавьте фильтр.