Добавлены разделы: - "Something went wrong" после удаления модели из models.providers.zai.models - Kiro 402 credits_exhausted — месячный кредит AWS, reset 1 числа - cx/gpt-5.4 free plan rolling 3h window, не подходит для primary - Как добавить Kiro-учётку через OmniRoute UI (нужен SSH-туннель или or.dttb.ru в NPM) Обновлена memory feedback_openclaw_models.md: - В 2026.4.15 в config нужен префикс zai/, но sessions.json оставлять как есть - После очистки каталога — /new в Telegram, sed по sessions.json ломает Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
27 KiB
OpenClaw — основной AI-бот (LXC 137)
Справочник по установке, настройке и починке OpenClaw. Обновлён 2026-04-17.
Что это
OpenClaw (в Telegram/Nextcloud — "Максимка") — основной AI-бот Олега. Multi-channel AI gateway: принимает сообщения из Telegram и Nextcloud Talk, отвечает через OmniRoute (бесплатные модели) и умеет делегировать сложные задачи на code-server (Opus 4.7 через Max подписку).
- NPM пакет:
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" |
Установка (из чистого LXC)
# 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.
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), в
.envOPENCLAW_GATEWAY_PORT - 18789/openclaw/canvas/ — Canvas host (UI)
- Если запущен в
--dev: gateway 19001
Конфигурация: openclaw.json
Единый JSON, валидируется zod-схемой с additionalProperties: false на большинстве секций. Любой лишний ключ ломает старт с Config invalid.
Просмотр и правка
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— переменные окружения gatewayupdate— 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 wizardmeta— версия/метаданныеlogging— уровни и вывод логовbrowser— headless browser настройкиui— UI preferencesmodels— провайдеры + каталог моделейbindings— key bindingsbroadcast— broadcast/notificationaudio— входы/выходы аудиоsession— управление сессиями и persistencecron— scheduled tasks через gatewayweb— web server / APIdiscovery— service discovery (Tailscale + CoreDNS)canvasHost— Canvastalk— голос/речьplugins— плагиныdiagnostics— OpenTelemetry, cache-tracecli— CLI баннер, startupsecrets— secret providersmcp— MCP-сервера
Провайдеры моделей (наш стек)
В openclaw.json → models.providers у Олега настроены:
openrouteranthropiczai— OmniRoute через ZenAI адаптерomniroute— прямой OmniRoute (localhost:20128 на code-server)zai-orig— оригинальный zai endpoint
Модели в сессиях — НЕ ТРОГАЙ
В 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 Modelsglm/glm-5.1— Z.AI GLMgemini-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-режим:
#!/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. Старые поля больше не принимаются.
cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak-$(date +%F-%H%M)openclaw doctor --fix— мигрирует что может- Если не помогло — получить expected schema:
openclaw config schema(JSON), сравнить со своим config - Частые исправления:
acp.agents→ перенести содержимое вagents.list(массив!), удалить из acpagents.listкак{"name": {...}}→ переделать в[{"id":"name", ...}]- Удалить неизвестные top-level ключи
Проблема: Gateway падает с Cannot find module 'dist/index.js'
Временная ошибка во время npm install (файлы распаковываются). Подождать, сервис сам поднимется через Restart=always.
Проблема: Bot "залип" — не отвечает в Telegram/Talk
Порядок проверки:
pct status 137— LXC запущен?pct exec 137 -- systemctl --user is-active openclaw-gateway.service— gateway активен?pct exec 137 -- openclaw status— каналы ON? сессии есть?journalctl --user -u openclaw-gateway.service --since "10 min ago" | grep -iE "error|fail"— последние ошибки- Если 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.
Проблема: периодические сбои 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.
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.4omniroute— те же модели
В 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".
Как починить окончательно (рекомендуется):
# Бэкап
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:
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
- OmniRoute не проксирован через NPM (проверено 2026-04-18) — только прямой доступ по
http://10.0.0.179:20128из LAN/NetBird, или SSH-туннель:Для долгосрочного использования — добавитьsshpass -p '1qaz!QAZ' ssh -L 20128:10.0.0.179:20128 root@10.0.0.250 -N # открывать http://localhost:20128or.dttb.ruв NPM (WS support ON для OAuth device-code). - В OR UI → Providers → Kiro → + Add connection.
- Получить OAuth device-code, открыть ссылку в приватной вкладке / отдельном Chrome-профиле (чтобы Google не подставил основной аккаунт), залогиниться новой Google-учёткой, Allow.
- Проверка:
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 внутри контейнера.
Обновление
# Версия установленная 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 — схема меняется.
Полезные команды
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.
Бэкап и восстановление
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. - 2026-04-17 — обновление 2026.4.10 → 2026.4.15, починка config (удалён
acp.agents,agents.listobject → удалён), починка wrapper (claude→claude -p), создан DELEGATION.md. Решение: decisions/2026-04-17-code-server-upgrade.md.