MILAGPT
Начните с «Для бизнеса»: три шага до запуска.
Записаться на разборОткроется Telegram
RU·EN
Документация · Команда Мил

Команда Мил: слышат друг друга и не сжигают подписку

Контент, реклама и админ — три Милы в одном чате? По умолчанию Мила ботов не слушает: два бота, которые отвечают друг другу, — самый быстрый способ сжечь подписку. Своих она слышит по строгим правилам: бот из вашего списка, обращение по @имени или ответом на её сообщение, не больше 20 сообщений в час от одного бота. У каждой строки ниже — ссылка на код.

Владельцу, у которого несколько Мил — контент, реклама, админ — работают в одном чате.

Четыре правила

Сообщение другой Милы доходит, только если сошлись все четыре

Кормилец сессии, install/companion-feeder.py, подаёт входящие из Telegram в разговор Милы. Сообщения людей проходят всегда, как и раньше. Сообщение бота — только при четырёх условиях. team-hearing.md:3-6 companion-feeder.py:274-276 team-hearing.md:10-17 companion-feeder.py:316-339 team-hearing.md:19 companion-feeder.py:320-321

01 · СВОЙ

Бот из вашего списка

Отправитель есть в реестре наших ботов — файле our-bots.json. Чужих ботов Мила не слышит никогда.

team-hearing.md:12-13 companion-feeder.py:323-326
02 · АДРЕС

Обращение к ней

В тексте есть @имя её бота, в любом регистре, — или это ответ на её сообщение.

team-hearing.md:14-15 companion-feeder.py:327-330 companion-feeder.py:292 test_team_hearing.py:16
03 · НЕ СВОЁ

Не её собственное

Сообщение её же бота обратно ей не подаётся.

team-hearing.md:16 companion-feeder.py:325
04 · ЛИМИТ

Не больше 20 в час

От одного бота — не больше 20 сообщений за скользящий час. Остальные кормилец отбрасывает.

team-hearing.md:30-31 companion-feeder.py:331-339
Как позвать коллегу

@имя её бота или ответ на её сообщение

Правило для Милы простое: чтобы достучаться до другой, пиши @имя_её_бота или отвечай на её сообщение. Иначе она не услышит. team-hearing.md:19-21

Имя роли словами, вроде «@Контент», не сработает — только имя пользователя бота. Кого как звать, команда держит в таблице canon/TEAM-CONTACTS.md: кто, что делает, как позвать. В репозитории лежит шаблон, а вашу таблицу обновления не трогают. TEAM-CONTACTS.example.md:3-4 TEAM-CONTACTS.example.md:12 release.json:50-58 release.json:77

Когда Мила отвечает на сообщение, цитата уходит в разговор до 3000 знаков и экранируется, как весь остальной конверт. team-hearing.md:25-26 companion-feeder.py:84-86

Как позвать коллег · шаблон
  • Админ. Инфраструктура, деньги. Звать @<admin_bot>.
  • Клиенты. Работа с клиентами. Звать @<bot>.
  • Контент. Тексты, картинки, видео. Звать @<bot>. TEAM-CONTACTS.example.md:6-10
Реестр

Кого слышать — решает один файл

our-bots.json — JSON-массив имён ботов без @, регистр любой. Скопируйте our-bots.example.json и впишите свой список. Кормилец ищет файл по пути из COMPANION_OUR_BOTS, по умолчанию ~/.mila-companion/our-bots.json. Файл в .gitignore: настоящий список в репозиторий не попадёт. team-hearing.md:37-41 our-bots.example.json:1 companion-feeder.py:277 team-hearing.md:43-45 .gitignore:5

Нет файла или он битый — реестр пуст, и Мила не слышит ни одного бота. Сбой закрывает дверь, а не открывает. team-hearing.md:45-46 companion-feeder.py:290-294

Имя своего бота Мила берёт из COMPANION_BOT_USERNAME, а если переменной нет — из журнала приёмника receiver.log. team-hearing.md:54 companion-feeder.py:297-313

# ~/.mila-companion/our-bots.json
["acme_content_bot",
 "acme_traffic_bot",
 "acme_admin_bot"]
Ограничитель петли

20 сообщений в час — и петля обрывается

Ограничитель считает поданные сообщения от каждого бота-отправителя за последние 3600 секунд. Двадцать первое кормилец не подаёт и пишет в свой журнал строку bot-loop-guard @имя с числом сообщений за час. companion-feeder.py:278-280 companion-feeder.py:331-338 team-hearing.md:30-32 companion-feeder.py:335

Человек в том же чате ничего не замечает: людей лимит не считает. team-hearing.md:32-33 companion-feeder.py:320-321

Порог задаёт COMPANION_BOT_PAIR_MAX. Если там не число, остаётся 20. companion-feeder.py:283-287

Переменных четыре, у каждой есть значение по умолчанию. team-hearing.md:48-55

# переменная → по умолчанию
COMPANION_OUR_BOTS
  ~/.mila-companion/our-bots.json
COMPANION_BOT_PAIR_MAX
  20
COMPANION_BOT_USERNAME
  из receiver.log
COMPANION_STATE
  ~/.mila-companion/state
Проверка

Девять случаев в одном тесте

python3 install/test_team_hearing.py ждёт ALL OK. Общий прогон tests/run_all.sh берёт его вместе с остальными test_*. team-hearing.md:57 test_team_hearing.py:27 tests/run_all.sh:14-16

Случаи — те же правила, по одному: человек, бот без адреса, упоминание, ответ, чужой бот, сама себе, лимит и цитата.

Что проверяет тест
  • Человек — слышит. test:14
  • Свой бот без @имени — не слышит. test:15
  • @имя другим регистром — слышит. test:16
  • Ответ на её сообщение — слышит. test:17
  • Чужой бот с её @именем — не слышит. test:18
  • Её же бот — не слышит. test:19
  • 22 подряд — 20 слышит, 2 нет. test:20-22
  • Порог 2 — третье не слышит. test:23-24
  • Цитата в 2500 знаков — доходит целиком. test:25-26
Честно

Чего правило не делает

В репозитории

Каждую строку можно прочитать самому

Файлы, по которым Милы слышат друг друга, в репозитории mila
ФайлЧто делает
docs/team-hearing.mdправила адресации, реестр, ограничитель, настройки (на английском)
install/companion-feeder.pyкормилец: gate_message решает, подать ли сообщение бота
install/test_team_hearing.pyтест: девять случаев, ждёт ALL OK
our-bots.example.jsonпример реестра: три бота
TEAM-CONTACTS.example.mdшаблон «кого как звать» (на английском)
docs/REFERENCE.mdстрока о кормильце в справочнике (на английском)
Открытый код · Apache-2.0

Форкните, научите, пришлите PR

Набор открыт: умения, хуки, инструменты и шаблоны. Запустите python3 install/test_team_hearing.py: девять случаев с этой страницы, ответ — ALL OK.

Факты на странице: github.com/shakhruz/mila (main, 88d0704), проверено 27.10.2026; test_team_hearing.py напечатал ALL OK. Сообщения в телефоне — случаи из этого теста. «Mila», «MILAGPT» и логотип — товарные знаки MILAGPT.