Как Мила сделала: разборы и новости
Контент, реклама и админ — три Милы в одном чате? По умолчанию Мила ботов не слушает: два бота, которые отвечают друг другу, — самый быстрый способ сжечь подписку. Своих она слышит по строгим правилам: бот из вашего списка, обращение по @имени или ответом на её сообщение, не больше 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
Отправитель есть в реестре наших ботов — файле our-bots.json. Чужих ботов Мила не слышит никогда.
В тексте есть @имя её бота, в любом регистре, — или это ответ на её сообщение.
Сообщение её же бота обратно ей не подаётся.
team-hearing.md:16 companion-feeder.py:325От одного бота — не больше 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-10our-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"]
Ограничитель считает поданные сообщения от каждого бота-отправителя за последние 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
Случаи — те же правила, по одному: человек, бот без адреса, упоминание, ответ, чужой бот, сама себе, лимит и цитата.
install/companion-feeder.py: он подаёт входящие из журнала в сессию Claude Code. companion-feeder.py:3-11 REFERENCE.md:97_bot; все остальные проходят как люди. companion-feeder.py:317-321receiver.log, — она не слышит ни одного бота. companion-feeder.py:322-326 team-hearing.md:54 companion-feeder.py:297-313our-bots.json и canon/TEAM-CONTACTS.md у каждой команды свои; в репозитории только примеры. team-hearing.md:43-45 .gitignore:5 TEAM-CONTACTS.example.md:12 release.json:50-58 release.json:77| Файл | Что делает |
|---|---|
| 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 | строка о кормильце в справочнике (на английском) |
Набор открыт: умения, хуки, инструменты и шаблоны. Запустите 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.