---
date: 2026-04-17
type: project
tags: [dttb, bot]
---

# OpenClaw — основной AI-бот (LXC 137)

Справочник по установке, настройке и починке OpenClaw. Обновлён 2026-05-26.

## Что это

**OpenClaw** (в Telegram/Nextcloud — **"Антошка"**, ранее "Максимка"; переименовано 2026-05-26 чтобы не путаться с НИИКН-ботом @maximka_assistant_bot на LXC 133) — основной AI-бот Олега. Multi-channel AI gateway: принимает сообщения из Telegram и Nextcloud Talk, отвечает на Opus 4.7 через Max-подписку (`cc/`), с fallback на бесплатные модели через OmniRoute. Тяжёлые задачи делегирует на code-server (тоже Opus 4.7 через Max).

- **NPM пакет:** [`openclaw`](https://www.npmjs.com/package/openclaw)
- **GitHub:** https://github.com/openclaw/openclaw
- **Автор конфига:** установлен и ведётся Олегом под персонажа "Антошка" (бывш. "Максимка") 🤖

## Где живёт

| Параметр | Значение |
|----------|----------|
| Proxmox LXC | **137** (hostname `openclaw`) |
| IP | 10.0.0.239 (LAN) / 100.70.167.54 (NetBird) |
| CPU / RAM | 2 vCPU / 6 GB |
| Node.js | v24.x |
| Доступ | `sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 137 -- bash"` |

## Самолечение и сторожа (2026-06-01)

Антошка защищён от падений в три слоя — при поломке чинится сам и пишет Олегу в TG (через свой токен `8020760639:…`, chat `1292155421`):

1. **systemd** — user-сервис `openclaw-gateway` (`Restart=always` + `loginctl enable-linger root`): мгновенный авто-рестарт при краше + старт после ребута. (`systemctl --user`, нужен `XDG_RUNTIME_DIR=/run/user/0`.)
2. **`/root/antoshka-watch-self.sh`** (cron `*/5`, внутри LXC 137) — глубокая проверка того, что systemd не ловит: служба активна + порт 18789 слушает, DNS не FakeIP (198.18/19.x), Telegram достижим (getMe), нет crash-loop (рост `NRestarts`). Лечит (рестарт gateway / NetBird), алертит с дедупом + «отбой». Алерт уходит даже если gateway лежит (токен ≠ gateway). State: `/root/.antoshka-watch-self.{last,nrestarts}`.
3. **`/root/antoshka-host-watchdog.sh`** (cron `*/5`, на Proxmox-хосте `10.0.0.250`) — если контейнер 137 лёг целиком (внутренний сторож не сработает) → `pct start 137` + алерт. State: `/root/.antoshka-host-watchdog.last`. (Хост достаёт Telegram через домашний обход — проверено getMe.)

Боевой тест 2026-05-31: `systemctl --user stop openclaw-gateway` → self-watchdog поймал (служба=inactive, порт=0) → перезапустил → ⚠️-алерт → следующий прогон ✅-отбой. Парный скрипт в обратную сторону — `/root/antoshka-watch-alex.sh` (Антошка стережёт пилот Алекса, cron `*/3`).

## Установка (из чистого LXC)

```bash
# Ubuntu LXC с Node ≥ 20
apt update && apt install -y nodejs npm
npm install -g openclaw
openclaw setup              # интерактивный онбординг
openclaw configure          # настройка каналов, моделей, креденшалов
```

Бинарь попадает в `/usr/bin/openclaw` (shim), код в `/usr/lib/node_modules/openclaw/`.

## Структура на диске

```
/root/.openclaw/                      ← state dir (OPENCLAW_STATE_DIR)
├── openclaw.json                     ← главный config
├── openclaw.json.bak                 ← автобэкап (последний)
├── openclaw.json.bak-YYYY-MM-DD-...  ← ручные бэкапы (сам делай перед правками)
├── agents/
│   ├── main/
│   │   ├── sessions/
│   │   │   ├── sessions.json         ← индекс сессий (key → id, model, tokens)
│   │   │   ├── <uuid>.jsonl          ← полная переписка сессии (messages, tool calls)
│   │   │   └── <uuid>.jsonl.reset.*  ← архив после /reset
│   │   └── agent/models.json         ← модели доступные агенту (в кэше)
│   ├── codex/
│   └── claude-code/
├── nextcloud-talk/                   ← state Nextcloud Talk канала
├── credentials/
├── memory/                           ← векторная память (если включена)
├── canvas/                           ← Canvas host контент
├── delivery-queue/
├── flows/
├── exec-approvals.json               ← whitelist команд для exec tool
└── storage.sqlite? (нет в openclaw, только у omniroute)

/root/clawd/                          ← рабочая папка бота (workspace)
├── IDENTITY.md                       ← личность бота (имя, язык, аватар)
├── INFRASTRUCTURE.md                 ← карта инфраструктуры для бота
├── TOOLS.md                          ← креды, порты, ссылки (важно держать актуальным)
├── DELEGATION.md                     ← инструкция как делегировать на Opus/code-server
├── MEMORY.md                         ← что помнить постоянно
├── SOUL.md                           ← характер, вайб
├── USER.md                           ← что знать про пользователя (Олега)
├── AGENTS.md                         ← про суб-агентов
├── HEARTBEAT.md                      ← статус-флаг для self-check
├── HAPP-VPN.md                       ← текущие VPN настройки пользователя
├── tasks.md                          ← TODO бота
├── scripts/                          ← рабочие скрипты (wrapper, monitor, cron)
│   ├── claude-code-wrapper.sh        ← **делегирование на Opus 4.7**
│   ├── email_monitor.py              ← cron */10, Авито уведомления
│   ├── znam-pairing-check.sh         ← cron */3
│   └── nextcloud-talk-bot.py         ← legacy (старый бот, не используется)
├── knowledge-base/                   ← база знаний бота
├── memory/                           ← его заметки
├── projects/                         ← проекты
├── prompts/                          ← системные промпты
└── claude-code-sessions/             ← сессии claude CLI на этой машине (не на code-server)

/root/.config/systemd/user/
└── openclaw-gateway.service          ← **systemd --user** service (не /etc/systemd/system!)
```

## Сервис (systemd user)

OpenClaw gateway — systemd **user**-level unit, не system. Все команды с `--user`.

```bash
systemctl --user status openclaw-gateway.service
systemctl --user restart openclaw-gateway.service
systemctl --user reset-failed openclaw-gateway.service  # при restart loop
journalctl --user -u openclaw-gateway.service -n 50 --no-pager
```

Unit запускает:
```
ExecStart=/usr/bin/node /usr/lib/node_modules/openclaw/dist/index.js gateway --port 18789
```

Порты:
- **18789** — gateway (WebSocket + HTTP), в `.env` `OPENCLAW_GATEWAY_PORT`
- **18789/__openclaw__/canvas/** — Canvas host (UI)
- Если запущен в `--dev`: gateway 19001

## Конфигурация: `openclaw.json`

Единый JSON, валидируется zod-схемой с `additionalProperties: false` на большинстве секций. **Любой лишний ключ ломает старт** с `Config invalid`.

### Просмотр и правка

```bash
openclaw config file                        # путь к активному конфигу
openclaw config get gateway.port            # значение по dot-path
openclaw config set gateway.port 18789      # изменить
openclaw config unset acp.agents            # удалить ключ
openclaw config schema                      # полная JSON schema — узнать какие поля допустимы
openclaw config validate                    # проверить без рестарта
openclaw doctor                             # диагностика
openclaw doctor --fix                       # автофикс (не всесильный, делай бэкап)
```

### Секции конфига (по schema)

- `env` — переменные окружения gateway
- `update` — auto-update настройки, канал релизов
- `agents` — defaults (модель, workspace, concurrency) + **list** (массив агентов, не объект!)
- `acp` — Agent Control Protocol. Допустимые ключи: `enabled, dispatch, backend, defaultAgent, allowedAgents, maxConcurrentSessions, stream, runtime`. **`agents` запрещён!**
- `auth` — API ключи профилей
- `channels` — telegram, nextcloud-talk, discord и т.д.
- `messages` — маршрутизация сообщений
- `commands` — кастомные slash-команды
- `hooks` — webhook и event-хуки
- `skills` — skill-паки
- `tools` — browser, search, file, runtime и пр.
- `gateway` — настройки WS-сервера (порт, auth, binding)
- `wizard` — состояние setup wizard
- `meta` — версия/метаданные
- `logging` — уровни и вывод логов
- `browser` — headless browser настройки
- `ui` — UI preferences
- `models` — провайдеры + каталог моделей
- `bindings` — key bindings
- `broadcast` — broadcast/notification
- `audio` — входы/выходы аудио
- `session` — управление сессиями и persistence
- `cron` — scheduled tasks через gateway
- `web` — web server / API
- `discovery` — service discovery (Tailscale + CoreDNS)
- `canvasHost` — Canvas
- `talk` — голос/речь
- `plugins` — плагины
- `diagnostics` — OpenTelemetry, cache-trace
- `cli` — CLI баннер, startup
- `secrets` — secret providers
- `mcp` — MCP-сервера

### Провайдеры моделей (наш стек)

В `openclaw.json → models.providers` у Олега настроены:
- `openrouter`
- `anthropic`
- `zai` — OmniRoute через ZenAI адаптер
- `omniroute` — прямой OmniRoute (10.0.0.179:20128 на code-server)
- `zai-orig` — оригинальный zai endpoint

### Текущий primary / fallback (2026-05-26)

```
primary:     omniroute/cc/claude-opus-4-7        (Max OAuth — Opus 4.7)
fallback 1:  omniroute/cc/claude-sonnet-4-6      (Max OAuth — Sonnet)
fallback 2:  omniroute/kr/claude-sonnet-4.5      (Kiro Free Tier — Sonnet)
fallback 3:  omniroute/cx/gpt-5.4                (Codex — последний резерв)
```

**Не переключать primary на `kr/claude-opus-4.7`** — Kiro AWS Free Tier на Opus 4.7 = нулевая квота (см. [decisions/2026-05-26-antoshka-opus47-kiro-not-viable](../../decisions/2026-05-26-antoshka-opus47-kiro-not-viable.md)). На Sonnet 4.5 Kiro работает месяцами, на Opus 4.7 учётка выгорает с первых запросов.

**Не переключать на `gh/claude-opus-4.7`** — GitHub Models имеет модель, но адаптер OmniRoute шлёт под `integrator="vscode-chat"` без доступа к ней. Все запросы → 400.

### Модели в сессиях — **НЕ ТРОГАЙ**

В `agents/main/sessions/sessions.json` и `agent/models.json` модели хранятся в формате:
- `kr/claude-sonnet-4.5` — Kiro провайдер
- `cx/gpt-5.4` — Codex (OpenAI)
- `gh/claude-sonnet-4.5` — GitHub Models
- `glm/glm-5.1` — Z.AI GLM
- `gemini-cli/gemini-2.5-pro` — Google Gemini CLI

**Не добавляй префикс `zai/`!** Это прямая адресация Kiro/Codex/GH/GLM провайдеров. Работает.

`openclaw models list` показывает только `zai/*` — это view того что openclaw регистрирует локально, но провайдеры резолвят и `kr/...` напрямую.

Лог вида:
```
[diagnostic] FailoverError: Unknown model: kr/claude-sonnet-4.5 ... next=zai/kr/claude-sonnet-4.5
```
— **безвредный warning** с автофоллбеком. Игнорируй. Это НЕ причина того что бот не отвечает.

## Делегирование на code-server (Opus 4.7)

Для сложных задач (большой рефакторинг, генерация кода) бот делегирует на LXC 132 (code-server) где установлен Claude Code CLI с Max подпиской.

**Wrapper:** `/root/clawd/scripts/claude-code-wrapper.sh`

Текущая (рабочая, 2026-04-17) реализация — non-interactive print-режим:
```bash
#!/bin/bash
# Wrapper: делегирует задачу на code-server (LXC 132), Opus 4.7.
# Использование:
#   claude-code-wrapper.sh "текст задачи"
#   echo "задача" | claude-code-wrapper.sh
set -e
if [ -t 0 ] && [ $# -eq 0 ]; then
  echo "ERROR: нужен prompt в аргументе или на stdin" >&2
  exit 2
fi
PROMPT="${*:-$(cat)}"
PROMPT_B64=$(printf %s "$PROMPT" | base64 -w0)
ssh -o StrictHostKeyChecking=no root@10.0.0.250 \
  "pct exec 132 -- bash -c \"cd /root && echo $PROMPT_B64 | base64 -d | claude -p --output-format text\""
```

Ключевое: **`claude -p`** (print-режим). Без `-p` запускается REPL и виснет.

Инструкция для самого бота — в `/root/clawd/DELEGATION.md`.

## Каналы

### Telegram
- Bot token хранится в `channels.telegram.token` (через `ref:env` или напрямую)
- `dmPolicy` и `groupPolicy` — доступ. **Open policy небезопасно** (security audit ругается), используй `allowlist` + `allowFrom`
- Bot username указан в openclaw status

### Nextcloud Talk
- URL `http://10.0.0.230:11001` (Nextcloud AIO)
- Пользователь `maximka` / `MaximkaBot2026`
- Основная беседа token: `aecax6yg`
- Админ: `admin` / `1qaz!QAZ`

## Частые проблемы и их решения

### Проблема: `Config invalid ... Unrecognized key`
Новая версия openclaw ужесточила schema. Старые поля больше не принимаются.
1. `cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak-$(date +%F-%H%M)`
2. `openclaw doctor --fix` — мигрирует что может
3. Если не помогло — получить expected schema: `openclaw config schema` (JSON), сравнить со своим config
4. Частые исправления:
   - `acp.agents` → перенести содержимое в `agents.list` (**массив**!), удалить из acp
   - `agents.list` как `{"name": {...}}` → переделать в `[{"id":"name", ...}]`
   - Удалить неизвестные top-level ключи

### Проблема: Gateway падает с `Cannot find module 'dist/index.js'`
Временная ошибка во время `npm install` (файлы распаковываются). Подождать, сервис сам поднимется через Restart=always.

### Проблема: Bot "залип" — не отвечает в Telegram/Talk
Порядок проверки:
1. `pct status 137` — LXC запущен?
2. `pct exec 137 -- systemctl --user is-active openclaw-gateway.service` — gateway активен?
3. `pct exec 137 -- openclaw status` — каналы ON? сессии есть?
4. `journalctl --user -u openclaw-gateway.service --since "10 min ago" | grep -iE "error|fail"` — последние ошибки
5. Если gateway в restart-loop: `systemctl --user reset-failed openclaw-gateway.service` перед рестартом

### Проблема: Бот застревает при делегировании на Opus
Wrapper запускал `claude` без `-p` → интерактивный REPL → висел. Решение уже в wrapper (2026-04-17). Если опять: проверить что `/root/clawd/scripts/claude-code-wrapper.sh` использует `claude -p --output-format text`, а не голый `claude`.

### Проблема: Crash-loop каждые ~40 сек с `CIAO PROBING/ANNOUNCEMENT CANCELLED` (bonjour плагин)

**Симптомы (2026-04-27, openclaw 2026.4.24):**
- `systemctl --user is-active openclaw-gateway.service` → `active`, но `NRestarts` растёт каждую минуту
- В логе `/tmp/openclaw/openclaw-<date>.log`: цикл `gateway ready (8 plugins: ..., bonjour, ...)` → `[openclaw] Unhandled promise rejection: CIAO PROBING CANCELLED` (или `CIAO ANNOUNCEMENT CANCELLED`) → `wrote stability bundle ... unhandled_rejection.json` → `Main process exited, code=exited, status=1/FAILURE` → systemd рестартит через 5 сек
- В журналах раньше предупреждение: `bonjour: watchdog detected non-announced service; attempting re-advertise`
- Telegram молчит (бот не успевает обработать update между рестартами)

**Корень:** плагин `bonjour` использует `@homebridge/ciao` для mDNS-анонса. Если LXC сеть не пускает multicast (типичная история для bridged-LXC за NPM), ciao периодически отменяет PROBING/ANNOUNCEMENT, выбрасывает rejection, который не отлавливается и валит весь node-процесс.

**Починка:** отключить bonjour-плагин — он по умолчанию загружается, даже если не прописан в `plugins.entries`.

```bash
pct exec 137 -- bash -c '
  cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak.$(date +%F-%H%M)
  python3 -c "
import json
p = \"/root/.openclaw/openclaw.json\"
d = json.load(open(p))
d.setdefault(\"plugins\",{}).setdefault(\"entries\",{})[\"bonjour\"] = {\"enabled\": False}
json.dump(d, open(p,\"w\"), indent=2, ensure_ascii=False)
"
  XDG_RUNTIME_DIR=/run/user/0 systemctl --user restart openclaw-gateway.service
'
```

**Проверка успеха:** в логе должно быть `ready (7 plugins: acpx, browser, device-pair, nextcloud-talk, phone-control, talk-voice, telegram)` — без `bonjour`. `NRestarts=0` после рестарта, аптайм > 60 сек.

**Что bonjour даёт и что теряем:** mDNS-анонс gateway по `_openclaw-gw._tcp.local.` для автодискавери в LAN. У нас доступ всегда по фиксированному IP (10.0.0.239) или через `bot.dttb.ru` — не нужен.

### Проблема: Telegram polling stall + OmniRoute fetch failed (DNS отдаёт FakeIP)

**Симптомы (2026-04-27):**
- В логе `Telegram webhook cleanup failed: Network request for 'deleteWebhook' failed!`, `[telegram] Polling stall detected (no completed getUpdates for 240s); forcing restart`
- `OpenRouter pricing fetch failed (timeout 30s)`, OmniRoute через себя возвращает `502 [kiro/...]: fetch failed (reset after 5s)`
- Из контейнера `getent ahostsv4 api.telegram.org` отдаёт `198.18.0.6` (или другой `198.18.x`)
- `curl https://api.telegram.org/` → `Failed to connect ... port 443 after Xms`
- Но curl `--resolve api.telegram.org:443:149.154.166.110` → `200 OK` за ~150мс — то есть **сама сеть работает**, просто DNS даёт неработающий IP

**Корень:** дефолтный `/etc/resolv.conf` в LXC 137 после создания указывает на gateway `10.0.0.1` (это OpenWrt/MikroTik LionART с Mihomo/sing-box). Mihomo возвращает **FakeIP** (`198.18.0.0/15` per RFC 6815) для проксируемых доменов. FakeIP перенаправляется TPROXY-правилами на самом маршрутизаторе → его собственный proxy-выход. **Из LXC 137 трафик в `198.18/15`** некуда идти — нет route и нет TPROXY на этой машине, connection просто фейлится.

**Fix — DNS на честные `1.1.1.1` / `8.8.8.8`** (UDP/53 на них уходит через NetBird `wt0` → Финка-exit → реальный ответ):

```bash
pct set 137 --nameserver '1.1.1.1 8.8.8.8'
pct exec 137 -- bash -c 'cat > /etc/resolv.conf <<EOF
# 1.1.1.1 / 8.8.8.8 reachable via NetBird wt0 (Finland exit)
# 10.0.0.1 returns FakeIP 198.18.x without proxy route - DO NOT USE
search dttb.ru
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF'
pct exec 137 -- bash -c 'XDG_RUNTIME_DIR=/run/user/0 systemctl --user restart openclaw-gateway.service'
```

**Проверка:**
```bash
# DNS — реальный IP, не FakeIP
pct exec 137 -- getent ahostsv4 api.telegram.org   # → 149.154.x.x
# HTTP — 302/200
pct exec 137 -- curl -4 -sS -o /dev/null -w "%{http_code}\n" https://api.telegram.org/
# В логе после рестарта появится:
#   webhook listening on http://10.0.0.239:8788/nextcloud-talk-webhook
#   Delivery recovery complete: N recovered  ← старые отложенные сообщения обработались
```

**Почему `pct set --nameserver` обязателен** — `/etc/resolv.conf` в LXC при перезагрузке/миграции перегенерируется из конфига Proxmox (`/etc/pve/lxc/137.conf`). Правка только live-файла откатится.

**Что осталось как warning, но не блокирует:**
- `OpenRouter pricing fetch failed` — публичный pricing API через NetBird-выход иногда таймаутит, обновление кэша цен (бот работает на текущих).
- `embedded acpx runtime backend probe failed: Failed to spawn agent command: claude-code` — на LXC 137 нет `claude-code` в PATH. Это для **локального** делегирования через ACP. Реальное делегирование на Opus идёт через CLIProxy на code-server (LXC 132), не через embedded acpx.

**Не путать с IPv6-проблемой** (раздел выше) — там `Network request failed` тоже, но процесс не падает и DNS отдаёт правильные IP. Здесь же `Failed to connect` — значит резолв вернул broken IP.

### Проблема: периодические сбои `sendChatAction failed: Network request failed` и "Something went wrong" (причина — IPv6)

**Корень (обнаружено 2026-04-17):** в LXC 137 IPv6 настроен, но наружу не маршрутизируется. `curl -4 https://api.telegram.org/` → 302 OK; `curl -6 https://api.telegram.org/` → connection failed. Node.js по умолчанию может резолвить AAAA первым и застревать на IPv6. Это даёт случайные `Network request failed` в Telegram API → у бота не отправляется typing-индикатор и ответ, пользователь видит "Something went wrong".

**Починка:** форсировать IPv4 через `NODE_OPTIONS=--dns-result-order=ipv4first` в systemd unit.

```bash
UNIT=/root/.config/systemd/user/openclaw-gateway.service
cp $UNIT $UNIT.bak-$(date +%F-%H%M)
sed -i "/^Environment=OPENCLAW_GATEWAY_PORT=/a Environment=NODE_OPTIONS=--dns-result-order=ipv4first" $UNIT
systemctl --user daemon-reload
systemctl --user restart openclaw-gateway.service
```

Проверка: после рестарта в логах gateway не должно быть `sendChatAction failed: Network request failed` при нормальной работе.

### Проблема: `FailoverError: Unknown model: kr/...`

Ошибка пользователю "⚠️ Something went wrong while processing your request. Please try again, or use /new to start a fresh session." отправляется OpenClaw когда *external run* не вернул осмысленную ошибку (не OAuth, не API key, не session mismatch — см. `buildExternalRunFailureText` в `agent-runner.runtime-*.js`). То есть это fallback-сообщение для **неклассифицированных** ошибок.

**Корень на нашей инсталляции (2026-04-17):**
В `openclaw.json → models.providers` **дублированы** два провайдера, указывающие на один и тот же OmniRoute (`10.0.0.179:20128`):
- `zai` — модели `kr/claude-sonnet-4.5`, `gh/claude-sonnet-4.5`, `glm/glm-5.1`, `cx/gpt-5.4`
- `omniroute` — те же модели

В 2026.4.15 openclaw регистрирует модели **с префиксом провайдера** (`zai/kr/...`). Запрос без префикса (`kr/claude-sonnet-4.5`, как хранится в старых сессиях) не резолвится → FailoverError → fallback на `zai/kr/claude-sonnet-4.5` через `agents.defaults.model.fallbacks`. Fallback обычно успешен (+3-8 сек к ответу), но иногда падает → пользователь видит "Something went wrong".

**Как починить окончательно (рекомендуется):**

```bash
# Бэкап
cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak-dedup-$(date +%F)

# Вариант A: удалить дубликат-провайдер omniroute (оставить zai)
openclaw config unset models.providers.omniroute

# Вариант B: обновить model в индексе сессий (НЕ в .jsonl файлах!)
python3 <<'PY'
import json
p = '/root/.openclaw/agents/main/sessions/sessions.json'
d = json.load(open(p))
for k, v in d.items():
    m = v.get('model')
    if m and not m.startswith('zai/') and not m.startswith('openai/'):
        v['model'] = 'zai/' + m
json.dump(d, open(p, 'w'), indent=2)
PY

# После любого варианта:
systemctl --user restart openclaw-gateway.service
```

**ВАЖНО — что НЕ делать (уроки 2026-04-17):**
- НЕ трогай `agent/models.json` — там `id` моделей из registry провайдеров; замена id на `zai/...` сломает Kiro провайдер (бот "перестаёт отвечать").
- НЕ трогай `.jsonl` файлы в `sessions/` — это неизменяемая история сообщений.
- **Даже точечное изменение поля `model` в sessions.json для одной сессии — ломает бота** (проверено: обновил только `agent:main:telegram:group:@heartbeat` с `kr/...` на `zai/kr/...`, бот перестал отвечать, откат из бэкапа вернул работу). Причина не совсем ясна, возможно конфликт между session.model и зарегистрированными в runtime моделями.
- НЕ удалять провайдер `zai` или `omniroute` — оба пробовали, ломает.

**Реальная причина периодических "Something went wrong" — IPv6**, не провайдеры моделей. См. раздел выше про `NODE_OPTIONS=--dns-result-order=ipv4first`. FailoverError `kr/...` → `zai/kr/...` — это автофоллбек который работает, не трогай.

### Проблема: "Something went wrong" после очистки каталога моделей (2026-04-18)

Если в `openclaw.json → models.providers.zai.models` удалить какую-то модель (например `cx/gpt-5.4`), **существующие сессии** в `sessions.json` с захардкоженной удалённой моделью начинают падать:
```
FailoverError: Unknown model: cx/gpt-5.4 (model_not_found)
All models failed: ... | Unknown model: cx/gpt-5.4
```
Бот возвращает "Something went wrong". Дефолт `agents.defaults.model` **не влияет на существующие сессии** — они хранят `model` внутри `sessions.json` при создании.

**Лечение:** попросить пользователя в Максимке нажать `/new` — новая сессия возьмёт актуальную default модель. Sessions.json руками не править — это ломает бота (проверено 2026-04-17).

### Проблема: Kiro массово возвращает 402 "You have reached the limit" (исчерпан месячный кредит AWS)

**Симптомы:**
- В `call_logs` дневная нагрузка сегодня меньше обычной, но внезапно 402
- `provider_connections.test_status = credits_exhausted` на обеих Kiro-учётках одновременно
- OmniRoute на `/v1/chat/completions` для `kr/*` возвращает `No credentials for provider: kiro` (после backoff)

**Причина:** Kiro использует CodeWhisperer через AWS Free Tier с **месячным кредитным лимитом**, не суточным. За неделю обычно ~120M tok_in / 2 учётки = ~60M/учётку → за 3-4 недели квота выбирается.

**Сброс:** месячный reset AWS — **1-е число месяца 00:00 UTC**. До этого дня учётка не работает.

**Диагностика капасити через storage.sqlite:**
```sql
SELECT date(timestamp) AS day, COUNT(*) AS calls, SUM(tokens_in) AS tok
FROM call_logs WHERE provider='kiro' AND status=200
GROUP BY date(timestamp) ORDER BY day DESC LIMIT 14;
```

**Ручной сброс флага `credits_exhausted` НЕ помогает** — OmniRoute снимает его, делает первый запрос, получает 402 и сразу возвращает в backoff. Это не визуальный глюк, это реальный отказ от upstream Kiro.

**Решение:** добавить новые Kiro OAuth-учётки через OmniRoute UI. Нужна свежая Google-учётка для каждой (Kiro логинится только через Google SSO); OR создаст новую запись в `provider_connections`, существующие gmail перезаписывает. Одна Kiro-учётка даёт ~250-300M токенов в месяц — этого хватает на ~277 вызовов/день текущей нагрузки бота почти в одиночку.

### Проблема: cx/gpt-5.4 учётки быстро упираются в 429

**Codex free plan** (`workspacePlanType":"free"` в `provider_specific_data`) — **rolling ~3-часовое окно** на учётку, ~10-15 успешных запросов за окно. Не ChatGPT Plus!

7 учёток в ротации дают ~120 успехов/сутки суммарно при равномерной нагрузке (из исторических call_logs 2026-04-11..12). Этого не хватает чтобы нести основной трафик бота (~450 вызовов/день).

**Вывод:** cx — только как резерв, primary оставлять на Kiro.

### Как добавить новую Kiro/OpenClaw-учётку через OmniRoute UI

1. OmniRoute **не проксирован через NPM** (проверено 2026-04-18) — только прямой доступ по `http://10.0.0.179:20128` из LAN/NetBird, или SSH-туннель:
   ```bash
   sshpass -p '1qaz!QAZ' ssh -L 20128:10.0.0.179:20128 root@10.0.0.250 -N
   # открывать http://localhost:20128
   ```
   Для долгосрочного использования — добавить `or.dttb.ru` в NPM (WS support ON для OAuth device-code).
2. В OR UI → Providers → Kiro → **+ Add connection**.
3. Получить OAuth device-code, открыть ссылку в **приватной вкладке / отдельном Chrome-профиле** (чтобы Google не подставил основной аккаунт), залогиниться новой Google-учёткой, Allow.
4. Проверка: `sqlite3 /root/.omniroute/storage.sqlite "SELECT COUNT(*) FROM provider_connections WHERE provider='kiro';"` — должен увеличиться.

### Проблема: CPU/load высокий
В LXC 137 `/proc/loadavg` показывает **нагрузку хоста Proxmox**, не контейнера. Смотри реальную нагрузку через `top`/`ps aux --sort=-%cpu` внутри контейнера.

## Обновление

```bash
# Версия установленная vs актуальная
cat /usr/lib/node_modules/openclaw/package.json | grep version
npm view openclaw version

# Обновить
npm install -g openclaw@latest

# Перезапустить gateway
systemctl --user restart openclaw-gateway.service
systemctl --user status openclaw-gateway.service

# После обновления часто нужно:
openclaw doctor --fix
```

**Перед обновлением делай бэкап** `/root/.openclaw/openclaw.json` — схема меняется.

## Полезные команды

```bash
openclaw status                         # общий статус + сессии + каналы
openclaw status --all                   # расширенный
openclaw logs --follow                  # live tail gateway
openclaw gateway probe                  # диагностика reachability
openclaw models list                    # модели (только zai/*)
openclaw sessions list                  # все сессии
openclaw doctor                         # health-check
openclaw security audit                 # аудит безопасности (ACP/каналы)
openclaw security audit --deep          # подробный
openclaw memory status --deep           # состояние векторной памяти
openclaw --version                      # версия
openclaw config file                    # путь к config
openclaw config schema                  # JSON schema
```

## Что связано с OpenClaw (не путать)

- **LXC 129** — `clawdbot-1` (старый бот, @maxim_dttb_bot). **Удалён 2026-04-14**. Данные перенесены в `/root/clawd/` на LXC 137.
- **LXC 132** — `code-server` (VS Code IDE + OmniRoute + CLIProxy). Не бот, а dev-среда + backend для ресёрча.
- **LXC 134** — `ZnamSecurityBot`. Отдельный Telegram-бот безопасности, не OpenClaw.

## Бэкап и восстановление

```bash
openclaw backup create                  # архив state (/root/.openclaw/backups/)
openclaw backup verify <archive>        # проверка
# Или ручной:
tar czf /root/openclaw-state-$(date +%F).tar.gz /root/.openclaw /root/clawd
```

Ключевые файлы для ручного бэкапа:
- `/root/.openclaw/openclaw.json` — конфиг
- `/root/.openclaw/agents/main/sessions/` — история сессий
- `/root/clawd/*.md` — personality и инструкции
- `/root/.config/systemd/user/openclaw-gateway.service` — systemd unit

## История изменений (релевантное)

- **2026-04-14** — LXC 129 (старый Clawdbot) удалён, данные в `/root/clawd/` на LXC 137. Решение: [decisions/2026-04-14-openclaw-claude-code-pipeline.md](../../decisions/2026-04-14-openclaw-claude-code-pipeline.md).
- **2026-04-17** — обновление 2026.4.10 → 2026.4.15, починка config (удалён `acp.agents`, `agents.list` object → удалён), починка wrapper (`claude` → `claude -p`), создан DELEGATION.md. Решение: [decisions/2026-04-17-code-server-upgrade.md](../../decisions/2026-04-17-code-server-upgrade.md).
- **2026-04-27** — две независимые проблемы привели к "бот молчит":
  1. openclaw 2026.4.24 в crash-loop каждые ~40 сек на `Unhandled promise rejection: CIAO PROBING/ANNOUNCEMENT CANCELLED` (mDNS bonjour-плагин). Лечится отключением `plugins.entries.bonjour.enabled = false`.
  2. После починки crash-loop всплыла FakeIP DNS — `/etc/resolv.conf` смотрел на `10.0.0.1`, тот отдавал `198.18.0.6` для api.telegram.org (Mihomo FakeIP без proxy-маршрута из LXC). Лечится переключением DNS на `1.1.1.1 8.8.8.8` через `pct set --nameserver` (резолвят через NetBird wt0). См. два новых раздела в "Частые проблемы".
- **2026-05-26** — переименование "Максимка" → **"Антошка"** (чтобы не путаться с НИИКН @maximka_assistant_bot). Эксперимент с `kr/claude-opus-4.7` как primary провалился — все 5 Kiro-учёток в `credits_exhausted/banned`, Max-подписка `cc/claude-opus-4-7` оставлена основным каналом. Решение: [decisions/2026-05-26-antoshka-opus47-kiro-not-viable.md](../../decisions/2026-05-26-antoshka-opus47-kiro-not-viable.md).
