4.4 KiB
4.4 KiB
Балда / Валера — эксплуатация
Расположение
- 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)
Запуск / рестарт
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 обрабатываются
После перезапуска: нужно один раз написать @Валера <текст> чтобы создать сессию в теме.
Диагностика молчания
- Проверить логи:
docker logs balda-agent-valera-1 --tail 50 - Проверить что Events API polling запустился:
zulip events queue registeredв логах - Стухший NATS-таск (симптом: логов нет после @mention)
Фикс:docker-compose restart(NATS embedded, состояние в памяти) - Бот не подписан на стримы (симптом:
processing zulip message trigger=streamне появляется):Если пустой — должен подписаться при следующем старте. Или вручную через API.curl -u "<bot_email>:<api_key>" https://zulip.qentra.top/api/v1/users/me/subscriptions
Патчи в коде (общие с Клавдием)
В zulip_handler.go добавлены:
botName— извлекается из bot_email (часть до @). Используется чтобы отличить свой @mention от чужого.extractOtherMention()— проверяет текст на @Name, где Name не равен botName и не @all/@everyone. Если найден чужой @mention — сообщение игнорируется.- Детальное логирование в
handleAutoClaimMention— видны все шаги от входа до ошибки.
Ключевые грабли
1. OPENAI_BASE_URL — обязательная env var
Norma не читает base_url из config.yaml для provider: deepseek. Она читает env OPENAI_BASE_URL.
Без неё запросы уходят на api.openai.com (401).
В .env обязательно:
OPENAI_BASE_URL=https://api.deepseek.com/v1
ВАЖНО: docker-compose restart не перечитывает .env. Нужно docker-compose up -d (пересоздание контейнера).
2. DOCKER_OPTS — пустая строка убивает старт
Если DOCKER_OPTS="" (или пустая строка в .env), norma падает на парсинге float:
strconv.ParseFloat: parsing ""
Должен быть валидный JSON:
DOCKER_OPTS={"max_tokens": 2048, "temperature": 0.7}
3. composerestart vs compose up -d
docker-compose restart— не перечитывает.env, не пересоздаёт контейнерdocker-compose up -d— пересоздаёт контейнер с обновлённым.env
При изменении .env всегда использовать up -d.
Конфигурация провайдера
В config.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