Files
knowledge-base/decisions/2026-02-26-clawdbot-129-cliproxy-fix.md

96 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-02-26
type: decision
tags: [decision, bot]
---
# Исправление 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.