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

93 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Балда / Валера — эксплуатация
## Расположение
- 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 "<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` обязательно:
```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
```