[2026-06-16] zulip-router: fix — use Eagle credentials, not a new bot

This commit is contained in:
Alexey Martemyanov
2026-06-16 13:14:34 +06:00
parent 7668508911
commit c838b7a26a
+22 -27
View File
@@ -5,7 +5,7 @@ _Последнее обновление: 2026-06-16_
## Цель
Event-роутер между Zulip и balda-ботами (Валера, Клавдий).
Решает проблему конкурентного получения событий — сейчас оба бота через Events API видят все сообщения одновременно.
Решает проблему конкурентного получения событий — сейчас оба бота видят все сообщения одновременно.
## Проблема (root cause)
@@ -17,16 +17,16 @@ Event-роутер между Zulip и balda-ботами (Валера, Кла
```
Zulip
├── Events API ← Валера (valera-bot, poll на :8091)
── Events API ← Клавдий (claudio-bot, poll на :8092)
└── Webhook → оба (outgoing webhook bot_type=3 через @mention)
├── Events API ← Валера (valera-bot, poll на :8091) — отключён
── Events API ← Клавдий (claudio-bot, poll на :8092) — отключён
└── Webhook → оба (outgoing webhook через @mention)
```
## Архитектура (с роутером)
```
Zulip Event Queue
↓ poll (отдельный бот-роутер или reuse одного из существующих)
↓ poll (credentials Eagle из ~/.hermes/config.yaml)
[zulip-router] (~/Docker/zulip-router/)
├── @Валера / @Valera → POST http://balda-agent-valera-1:8091/zulip/webhook
├── @Клавдий / @Klavdiy → POST http://claudio-agent-claudio-1:8092/zulip/webhook
@@ -34,7 +34,7 @@ Zulip Event Queue
↕ ownership: stream+topic → bot (TTL 24h, persisted to /data/ownership.json)
```
**Важно:** таргеты — не Hermes инстансы, а balda-боты (Go бинарники). У каждого уже есть webhook endpoint `/zulip/webhook`.
**Ключевое:** credentials — Eagle/Орла (не новый бот). Роутер регистрирует свою event queue (отдельную от очереди Eagle).
## Правила маршрутизации
@@ -46,16 +46,15 @@ Zulip Event Queue
## Что меняется в balda
После деплоя роутера у обоих ботов нужно **отключить Events API polling** в config.yaml:
После деплоя роутера Events API polling уже отключён у обоих ботов (сделано 2026-06-16):
```yaml
zulip:
events_polling:
enabled: false # ← было true
enabled: false
```
После этого сообщения приходят **только через webhook** (от роутера).
Перезапуск: `docker-compose up -d` (в каждом compose).
Сообщения приходят **только через webhook** от роутера.
## Код
@@ -75,45 +74,41 @@ zulip:
**Compose:** `~/Docker/zulip-router/docker-compose.yaml`
### Перед запуском: создать бота-роутера в Zulip
### Credentials: Eagle, не новый бот
Нужен **отдельный** бот (не valera-bot, не claudio-bot).
Роутер использует credentials Eagle/Орла из `~/.hermes/config.yaml``platforms.zulip`.
1. В Zulip: **Settings → Bots → Add a new bot**
2. Тип: **Outgoing webhook**
3. Имя: `zulip-router` (или любое)
4. Bot email: скопировать (понадобится в .env)
5. API key: скопировать (понадобится в .env)
6. Endpoint URL: не заполнять (роутер сам поллит, webhook от Zulip ему не нужен)
7. Сохранить
Не создавать нового бота. Eagle уже имеет права на чтение всех публичных стримов.
### Env vars
Создать `~/Docker/zulip-router/.env`:
```env
ZULIP_ROUTER_BOT_EMAIL=zulip-router-bot@zulip.qentra.top
ZULIP_ROUTER_API_KEY=<api-key из шага 5>
# Куда форвардить
```env
# Credentials Eagle/Орла — из ~/.hermes/config.yaml
ZULIP_BOT_EMAIL=eagle-bot@zulip.qentra.top
ZULIP_API_KEY=<скопировать из конфига Eagle>
# Куда форвардить (Docker DNS, сеть balda_default)
VALERA_WEBHOOK=http://balda-agent-valera-1:8091/zulip/webhook
CLAUDIO_WEBHOOK=http://claudio-agent-claudio-1:8092/zulip/webhook
```
### Запуск
```bash
cd ~/Docker/zulip-router
docker-compose up -d
docker logs zulip-router --tail 20 # проверить что poll loop запущен
docker logs zulip-router --tail 20 # проверить poll loop
```
## TODO
- [ ] Написать код роутера (~260 LOC)
- [ ] Создать compose `~/Docker/zulip-router/docker-compose.yaml`
- [ ] Создать бота-роутера в Zulip (или реюзнуть valera-bot/claudio-bot), получить API key
- [ ] Набить `.env` с credentials Eagle (из `~/.hermes/config.yaml`)
- [ ] `docker-compose up -d`
- [ ] Проверить логи: `docker logs zulip-router --tail 50`
- [ ] Отключить `events_polling.enabled` у Валеры → `docker-compose up -d`
- [ ] Отключить `events_polling.enabled` у Клавдия → `docker-compose up -d`
- [ ] Протестировать: @Клавдий и @Валера в разных топиках
- [ ] Проверить ownership: сообщение в топик без @mention → последний бот
- [ ] Удалить `extractOtherMention()` патч из кода (больше не нужен)