From 44dd6578d1cdfa83fac213ac3c1ed926dc041e0d Mon Sep 17 00:00:00 2001 From: Taiga Date: Mon, 15 Jun 2026 15:55:50 +0000 Subject: [PATCH] [2026-06-15] taiga-vault: personal/projects/balda/balda-valera.md personal/projects/balda/claudio-klaudiy.md --- personal/projects/balda/balda-valera.md | 62 ++++++++++++++++++++++ personal/projects/balda/claudio-klaudiy.md | 51 ++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 personal/projects/balda/balda-valera.md create mode 100644 personal/projects/balda/claudio-klaudiy.md diff --git a/personal/projects/balda/balda-valera.md b/personal/projects/balda/balda-valera.md new file mode 100644 index 00000000..156125a9 --- /dev/null +++ b/personal/projects/balda/balda-valera.md @@ -0,0 +1,62 @@ +# Балда / Валера — эксплуатация + +## Расположение +- Repo: `~/Developer/balda/` +- **Рабочий compose**: `~/Docker/balda-agent/docker-compose.yaml` → контейнер `balda-agent-valera-1` +- Config (persistent): `~/Docker/balda-agent/.config/balda/config.yaml` +- Env: `~/Docker/balda-agent/.env` +- Дублирующий compose `~/Developer/balda/compose.valera.yaml` — НЕ использовать (сеть `balda_default` без DNS) + +## Запуск / рестарт +```bash +cd ~/Docker/balda-agent +docker-compose restart + +# Rebuild после изменений в коде: +docker-compose build && docker-compose up -d +``` + +## Архитектура получения сообщений +Валера — **outgoing webhook bot** (bot_type=3). Zulip отправляет webhook только для @mention и DM. + +Для получения всех сообщений в теме — Events API polling (горутина в коде): +- `events_polling.enabled: true` в config.yaml +- Очередь регистрируется с `all_public_streams=true` +- Бот подписывается на все публичные стримы при старте (`SubscribeToPublicStreams`) +- После @mention создаётся сессия; последующие сообщения без @mention обрабатываются + +**После перезапуска**: нужно один раз написать `@Валера <текст>` чтобы создать сессию в теме. + +## Диагностика молчания +1. Проверить логи: `docker logs balda-agent-valera-1 --tail 50` +2. Проверить что Events API polling запустился: `zulip events queue registered` в логах +3. Стухший NATS-таск (симптом: логов нет после @mention) + Фикс: `docker-compose restart` (NATS embedded, состояние в памяти) +4. Бот не подписан на стримы (симптом: `processing zulip message trigger=stream` не появляется): + ```bash + curl -u ":" https://zulip.qentra.top/api/v1/users/me/subscriptions + ``` + Если пустой — должен подписаться при следующем старте. Или вручную через API. + +## Патчи в коде (общие с Клавдием) + +В `zulip_handler.go` добавлены: +1. `botName` — извлекается из bot_email (часть до @). Используется чтобы отличить свой @mention от чужого. +2. `extractOtherMention()` — проверяет текст на @**Name**, где Name не равен botName и не @**all**/@**everyone**. Если найден чужой @mention — сообщение игнорируется. +3. Детальное логирование в `handleAutoClaimMention` — видны все шаги от входа до ошибки. + +## Конфигурация провайдера +В `config.yaml` обязательно: +```yaml +balda: + provider: deepseek + zulip: + events_polling: + enabled: true + stream_only_with_session: true +runtime: + providers: + deepseek: + openai: + base_url: https://api.deepseek.com/v1 +``` diff --git a/personal/projects/balda/claudio-klaudiy.md b/personal/projects/balda/claudio-klaudiy.md new file mode 100644 index 00000000..f0c55bad --- /dev/null +++ b/personal/projects/balda/claudio-klaudiy.md @@ -0,0 +1,51 @@ +# Клавдий (Claudio) — эксплуатация + +## Расположение + +| Item | Value | +|------|-------| +| Repo | `~/Developer/balda/` (один код с Валерой) | +| Compose | `~/Docker/claudio-agent/docker-compose.yaml` → контейнер `claudio-agent-claudio-1` | +| Config | `~/Docker/claudio-agent/.config/balda/config.yaml` | +| Env | `~/Docker/claudio-agent/.env` | +| Dockerfile | `~/Docker/claudio-agent/Dockerfile.claudio` | + +## Запуск / рестарт + +```bash +cd ~/Docker/claudio-agent +docker-compose restart # без пересборки +docker-compose build && docker-compose up -d # после изменений в коде +``` + +## Архитектура получения сообщений + +Клавдий — **outgoing webhook bot** (bot_type=3). Zulip отправляет webhook только для @mention и DM. + +Для получения всех сообщений в теме — **Events API polling**: +- Подписан на все публичные стримы при старте +- После @mention создаётся сессия; последующие сообщения без @mention обрабатываются + +## Отличие от Валеры + +- **Провайдер**: `claude` (claude-sonnet-4-6) через Claude Proxy (контейнер, порт 3457) +- **Порт webhook**: 8092 (у Валеры 8091) +- **База**: отдельная SQLite (NATS embedded) + +## Проблемы и решения + +### Валера отвечал вместо Клавдия на @mention + +**Причина**: у Валеры в `allowed_owners` был `admin@zulip.local` (реальный email юзера), а у Клавдия — `amartemyanov@duckduckgo.com` (не совпадает). `isAllowedOwner` возвращал false. + +**Решение**: добавлен `admin@zulip.local` в allowed_owners Клавдия. + +### Валера отвечал на @mention других ботов (через Events API) + +**Причина**: оба бота подписаны на Events API с `all_public_streams=true`. Когда кто-то писал `@Клавдий`, Валера получал это сообщение через Events API и, имея активную сессию в том же треде, отвечал. + +**Решение**: пропатчен `zulip_handler.go` — добавлена проверка `extractOtherMention()`: если сообщение со стрима содержит @mention другого бота, игнорировать. + +### При первом запуске не отвечает на @mention + +Нужен `/start owner=` в DM. Токен генерируется при первом старте и пишется в лог: `docker logs claudio-agent-claudio-1 | grep -i owner`