From 27b8d7dc4da36a216186db345562612c6e621b4a Mon Sep 17 00:00:00 2001 From: Claude Code Date: Thu, 26 Feb 2026 19:13:37 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=BA=D0=B0=20cl?= =?UTF-8?q?awdbot=20LXC=20129:=20cliproxy=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=B9=D0=B4=D0=B5=D1=80,=20=D1=81=D0=B5=D1=81=D1=81=D0=B8?= =?UTF-8?q?=D1=8F=202026-02-26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - decisions: полный разбор трёх ошибок и их исправлений - notes: лог сессии Claude Code (cliproxy fix + видеоархив ЧОП) - snippets: шаблон конфига clawdbot для CLIProxy Co-Authored-By: Claude Opus 4.6 --- .../2026-02-26-clawdbot-129-cliproxy-fix.md | 89 +++++++++++++++++++ ...-02-26-claude-code-session-clawdbot-fix.md | 56 ++++++++++++ snippets/clawdbot-cliproxy-config.md | 84 +++++++++++++++++ 3 files changed, 229 insertions(+) create mode 100644 decisions/2026-02-26-clawdbot-129-cliproxy-fix.md create mode 100644 notes/2026-02-26-claude-code-session-clawdbot-fix.md create mode 100644 snippets/clawdbot-cliproxy-config.md diff --git a/decisions/2026-02-26-clawdbot-129-cliproxy-fix.md b/decisions/2026-02-26-clawdbot-129-cliproxy-fix.md new file mode 100644 index 0000000..b88c9e2 --- /dev/null +++ b/decisions/2026-02-26-clawdbot-129-cliproxy-fix.md @@ -0,0 +1,89 @@ +# Исправление clawdbot на LXC 129 — cliproxy провайдер + +**Дата:** 2026-02-26 +**Статус:** решено + +## Проблема + +Бот @maxim_dttb_bot (LXC 129, 10.0.0.206) не отвечал на сообщения в Telegram. + +## Симптомы и ошибки (по порядку) + +### 1. `FailoverError: No available auth profile for anthropic` +- Модель была `anthropic/claude-opus-4-6`, но прямого Anthropic API нет — всё через CLIProxy +- **Решение:** сменить на `cliproxy/claude-opus-4-6` + +### 2. `Unhandled API in mapOptionsForApi: undefined` +- Краш при попытке ответить — `model.api` приходит как `undefined` +- Причина: в `models.json` был сломанный `openrouter` провайдер без поля `api` +- pi-coding-agent валидирует ВСЕ провайдеры вместе, и если хоть один сломан — отбрасываются ВСЕ кастомные модели +- Fallback код (`buildInlineProviderModels`) не копирует `api` с уровня провайдера на модель +- **Решение:** добавить `api: "anthropic-messages"` к каждой модели в `clawdbot.json` + удалить openrouter из `models.json` + +### 3. `HTTP 401 authentication_error: invalid x-api-key` +- Запрос уходил в Anthropic API напрямую, минуя CLIProxy +- Причина: `model.baseUrl` было `undefined` → Anthropic SDK использовал дефолтный `https://api.anthropic.com` +- Корень: всё тот же сломанный `models.json` — ModelRegistry отбрасывала кастомные провайдеры, и `baseUrl` из конфига cliproxy не попадал в model объект +- **Решение:** удалить сломанные провайдеры из `models.json`, оставить только `cliproxy` + +### 4. Дополнительные проблемы +- Старый `ANTHROPIC_API_KEY` в `env` секции `clawdbot.json` перехватывал запросы +- Старый `config.yaml` с прямым API ключом конфликтовал +- `ANTHROPIC_API_KEY` и `CLAWDBOT_CONFIG` в systemd env создавали implicit провайдеры + +## Что было сделано + +### Файлы на LXC 129 (10.0.0.206) + +**`/root/.clawdbot/clawdbot.json`:** +- Модель: `cliproxy/claude-opus-4-6` (fallback: `cliproxy/claude-sonnet-4-6`) +- Добавлен `models.providers.cliproxy` с baseUrl, apiKey, api, models +- Добавлен `auth.profiles.cliproxy:default` +- Удалены: `anthropic` и `openrouter` провайдеры, `anthropic:default` auth profile +- Удалён `env.ANTHROPIC_API_KEY` (старый прямой ключ) + +**`/root/.clawdbot/agents/main/agent/models.json`:** +- Удалены сломанные провайдеры `openrouter` (без api) и `anthropic` +- Оставлен только `cliproxy` + +**`/etc/systemd/system/clawdbot.service`:** +- Удалены `Environment=ANTHROPIC_API_KEY` и `Environment=CLAWDBOT_CONFIG` +- Оставлены: `CLIPROXY_API_KEY=sk-clawdbot-proxy`, `CLAWDBOT_GATEWAY_TOKEN` + +**`/opt/clawdbot/config.yaml`:** +- Переименован в `config.yaml.bak` (старый конфиг с прямым API ключом) + +## Архитектура провайдера cliproxy + +``` +Telegram → clawdbot → cliproxy provider → http://localhost:8317 → CLIProxy → Anthropic API + (apiKey: sk-clawdbot-proxy) (OAuth token) +``` + +### Конфиг cliproxy в clawdbot.json: +```json +"models": { + "providers": { + "cliproxy": { + "baseUrl": "http://localhost:8317", + "apiKey": "sk-clawdbot-proxy", + "api": "anthropic-messages", + "models": [ + {"id": "claude-sonnet-4-6", "name": "Claude Sonnet 4.6", "api": "anthropic-messages", "contextWindow": 200000, "maxTokens": 8192}, + {"id": "claude-opus-4-6", "name": "Claude Opus 4.6", "api": "anthropic-messages", "contextWindow": 200000, "maxTokens": 8192}, + {"id": "claude-haiku-4-5-20251001", "name": "Claude Haiku 4.5", "api": "anthropic-messages", "contextWindow": 200000, "maxTokens": 8192} + ] + } + } +} +``` + +## Важные выводы (баги clawdbot 2026.1.24-3) + +1. **`models.json` — all-or-nothing валидация.** Если один провайдер невалиден, ВСЕ кастомные провайдеры отбрасываются. Загружаются только 632 встроенные модели. + +2. **`buildInlineProviderModels()` не копирует `baseUrl` и `api` с уровня провайдера.** Они должны быть явно на каждой модели. + +3. **`resolveModel()` fallback не включает `baseUrl`.** Модель создаётся без baseUrl → Anthropic SDK идёт на api.anthropic.com. + +4. **`env.ANTHROPIC_API_KEY` в clawdbot.json перехватывает запросы** даже если провайдер cliproxy. Удалять если используется CLIProxy. diff --git a/notes/2026-02-26-claude-code-session-clawdbot-fix.md b/notes/2026-02-26-claude-code-session-clawdbot-fix.md new file mode 100644 index 0000000..05be8dd --- /dev/null +++ b/notes/2026-02-26-claude-code-session-clawdbot-fix.md @@ -0,0 +1,56 @@ +# Сессия Claude Code: починка clawdbot + видеоархив ЧОП + +**Дата:** 2026-02-26 +**Участники:** Олег + Claude Code (Opus 4.6, LXC 132) + +## Что делали в этой сессии + +### 1. Починка @maxim_dttb_bot (LXC 129) + +Бот перестал отвечать. Три последовательных проблемы: +- `FailoverError: No available auth profile for anthropic` → модель anthropic/ сменена на cliproxy/ +- `Unhandled API in mapOptionsForApi: undefined` → models.json имел сломанный openrouter, из-за чего все кастомные провайдеры отбрасывались +- `HTTP 401 invalid x-api-key` → baseUrl не пробрасывался в model объект, запросы шли в api.anthropic.com мимо CLIProxy + +Полное решение в `decisions/2026-02-26-clawdbot-129-cliproxy-fix.md` + +### 2. SSH доступ к LXC 129 + +Пароль перестал работать. Proxmox WebSocket termproxy (pve_exec.py) — сложный протокол, ненадёжно. Олег вручную добавил SSH ключ claude-code через Proxmox console. + +### 3. Документация на Nextcloud + +Сохранили `infrastructure.md` и `journal.md` на dttb.ru в папку `Документация/`. +WebDAV: `https://dttb.ru/remote.php/dav/files/admin/` + +### 4. Knowledge-base репозиторий + +Склонирован `http://git.dttb.ru/oleg/knowledge-base.git` в `/root/knowledge-base/` на LXC 132 (code-server). + +## Предыдущая сессия (из summary) + +### Бот @ZnamSecurityBot (LXC 134) — видеоархив ЧОП +- Настроен бот для охранников: поиск записей по камере и времени +- Скрипт `/root/clawd/scripts/find_recordings.py` на LXC 134 +- HTTP файл-сервер на VM 104 (порт 8091) +- Видео сжимаются ffmpeg (480p, crf35) до <200 KB — upload всего 3-30 KB/s +- Docker `agentdvr-faststart` на VM 104: moov atom + H.264 level 4.1 для iPhone +- Бот падал в crashloop от sendVideo timeout — решено компрессией + очисткой сессий + +## Ключевые файлы изменённые в сессии + +| Файл | Хост | Что изменено | +|------|------|--------------| +| `/root/.clawdbot/clawdbot.json` | LXC 129 | cliproxy провайдер, модель, auth, убран ANTHROPIC_API_KEY | +| `/root/.clawdbot/agents/main/agent/models.json` | LXC 129 | Удалены сломанные openrouter и anthropic | +| `/etc/systemd/system/clawdbot.service` | LXC 129 | Убраны ANTHROPIC_API_KEY, CLAWDBOT_CONFIG | +| `/opt/clawdbot/config.yaml` | LXC 129 | Переименован в .bak | +| `Документация/infrastructure.md` | Nextcloud | Обновлена полная документация | +| `Документация/journal.md` | Nextcloud | Создан журнал изменений | + +## Нерешённые вопросы + +- Бот @maxim_dttb_bot — проверить что отвечает после всех исправлений (последний тест ожидает сообщения от пользователя) +- Upload скорость 3-30 KB/s — видео >200 KB не проходят в Telegram +- rec.dttb.ru → LAN only (10.0.0.195) — не доступен извне +- Faststart cron на VM 104 в /tmp/ — не переживёт reboot (перенести в постоянное место) diff --git a/snippets/clawdbot-cliproxy-config.md b/snippets/clawdbot-cliproxy-config.md new file mode 100644 index 0000000..66c74c0 --- /dev/null +++ b/snippets/clawdbot-cliproxy-config.md @@ -0,0 +1,84 @@ +# Конфиг clawdbot для работы через CLIProxy + +Шаблон для настройки clawdbot с провайдером cliproxy (проксирование через CLIProxy). + +## clawdbot.json — минимальный рабочий конфиг провайдера + +```json +{ + "auth": { + "profiles": { + "cliproxy:default": { + "provider": "cliproxy", + "mode": "api_key" + } + } + }, + "models": { + "providers": { + "cliproxy": { + "baseUrl": "http://localhost:8317", + "apiKey": "sk-clawdbot-proxy", + "api": "anthropic-messages", + "models": [ + { + "id": "claude-sonnet-4-6", + "name": "Claude Sonnet 4.6", + "api": "anthropic-messages", + "reasoning": false, + "input": ["text"], + "contextWindow": 200000, + "maxTokens": 8192 + }, + { + "id": "claude-opus-4-6", + "name": "Claude Opus 4.6", + "api": "anthropic-messages", + "reasoning": false, + "input": ["text"], + "contextWindow": 200000, + "maxTokens": 8192 + }, + { + "id": "claude-haiku-4-5-20251001", + "name": "Claude Haiku 4.5", + "api": "anthropic-messages", + "reasoning": false, + "input": ["text"], + "contextWindow": 200000, + "maxTokens": 8192 + } + ] + } + } + }, + "agents": { + "defaults": { + "model": { + "primary": "cliproxy/claude-opus-4-6", + "fallbacks": ["cliproxy/claude-sonnet-4-6"] + } + } + } +} +``` + +## Важно! + +1. **`api` должен быть на КАЖДОЙ модели** — баг в clawdbot 2026.1.24-3: `buildInlineProviderModels()` не копирует `api` с уровня провайдера +2. **Не ставить `ANTHROPIC_API_KEY` в env** — перехватывает запросы мимо CLIProxy +3. **Проверить `models.json`** после изменений: `~/.clawdbot/agents/main/agent/models.json` — если там сломанный провайдер, все кастомные модели отбрасываются +4. **baseUrl для удалённого CLIProxy:** `http://10.0.0.206:8317` (для ботов на других контейнерах) + +## systemd service + +```ini +[Service] +Environment=CLIPROXY_API_KEY=sk-clawdbot-proxy +Environment=CLAWDBOT_GATEWAY_TOKEN=changeme123 +ExecStart=/usr/bin/clawdbot gateway --bind lan --allow-unconfigured --token changeme123 +``` + +НЕ добавлять: +- `ANTHROPIC_API_KEY` — конфликтует с cliproxy +- `CLAWDBOT_CONFIG` — старый формат config.yaml