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

5.2 KiB
Raw Permalink Blame History

date, type, tags
date type tags
2026-02-26 decision
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:

"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.