# Исправление 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.