Files
obsidian-vault/personal/projects/balda/balda-valera.md
T

4.4 KiB
Raw Blame History

Балда / Валера — эксплуатация

Расположение

  • 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 обрабатываются

После перезапуска: нужно один раз написать @Валера <текст> чтобы создать сессию в теме.

Диагностика молчания

  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 не появляется):
    curl -u "<bot_email>:<api_key>" 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 — видны все шаги от входа до ошибки.

Ключевые грабли

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