93 lines
4.4 KiB
Markdown
93 lines
4.4 KiB
Markdown
# Балда / Валера — эксплуатация
|
||
|
||
## Расположение
|
||
- 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
|
||
```
|