Починка clawdbot LXC 129: cliproxy провайдер, сессия 2026-02-26
- decisions: полный разбор трёх ошибок и их исправлений - notes: лог сессии Claude Code (cliproxy fix + видеоархив ЧОП) - snippets: шаблон конфига clawdbot для CLIProxy Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
89
decisions/2026-02-26-clawdbot-129-cliproxy-fix.md
Normal file
89
decisions/2026-02-26-clawdbot-129-cliproxy-fix.md
Normal file
@@ -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.
|
||||||
56
notes/2026-02-26-claude-code-session-clawdbot-fix.md
Normal file
56
notes/2026-02-26-claude-code-session-clawdbot-fix.md
Normal file
@@ -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 (перенести в постоянное место)
|
||||||
84
snippets/clawdbot-cliproxy-config.md
Normal file
84
snippets/clawdbot-cliproxy-config.md
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user