Сегодня Anthropic закрыла использование своих подписок в сторонних инструментах вроде OpenClaw — они больше не покрываются подпиской. А использование по API обходится во много раз дороже. Весь вечер разбирался и обошёл блокировку. Всё работает как раньше.

Расскажу как, потому что процесс для меня оказался интереснее результата. Забавно, что я не пишу код, и помогал мне в обходе их блокировкок Opus 4.6.

Отправная точка

Суть блокировки: Anthropic на уровне сервера определяет, откуда пришёл запрос. Если из Claude Code / Cowork или чата — покрывается подпиской. Если из OpenClaw или любого другого стороннего инструмента — идёт в Extra Usage, где платишь pay-per-token по ценам API. Я не делаю ничего сложного, но проверил что мой OpenClaw на Opus за вечер спокойно нажигает на десятки долларов.

Запрос к API по сути просто HTTP-запрос с заголовком, телом и токеном. Я подумал, что если сформировать запрос так, чтобы он выглядел как от Claude Code — Anthropic не должен отличить.

CLIProxyAPI

Нашёл проект CLIProxyAPI (23 тысячи звёзд на GitHub). Это Go-прокси, который берёт OAuth-токен от Claude Code и пересылает запросы в Anthropic API с заголовками настоящего Claude Code: user-agent, billing header, client_id. Для Anthropic запрос выглядит идентично тому, как если бы ты сам работал в терминале.

Поставил. Авторизовался через OAuth (прокси даёт ссылку, открываешь в браузере, логинишься, токен сохраняется на сервере). Поднял на localhost. Направил OpenClaw на него и отключил Extra Usage.

Не сработало. Та же ошибка — "You're out of extra usage".

Начал копать дальше

Первое что сделал — отправил простой запрос через curl напрямую в прокси. "Say hi". Работает. Anthropic отвечает, а Extra Usage отключён и всё идет через подписку.

Значит прокси сам по себе работает, а проблема в том, что именно OpenClaw отправляет в теле запроса.

Очевидная гипотеза — Anthropic ищет "OpenClaw" в запросе. В системном промпте OpenClaw прямо написано "You are a personal assistant running inside OpenClaw" — найти очень легко. Плюс ещё 109 упоминаний в промпте.

Написал с Opus промежуточный прокси, который стоит между OpenClaw и CLIProxyAPI, перехватывает тело запроса, заменяет "OpenClaw" на "Assistant" и отправляет дальше в прокси.

Но всё ещё не работает. Приходит та же ошибка.

Начал сужать проблему

Значит детектируют не по слову, и нужно было понять по чему именно. Запрос OpenClaw к API это JSON файл, в котором есть системный промпт, 17 инструментов, история сообщений, метаданные.

Дал задачу Opus, чтобы он перебирал слова и блоки запроса. Убрал историю сообщений, оставил только системный промпт — работает. Добавил tools — не работает. Убрал tools, вернул историю — работает.

Так определил, что дело именно в tools которые передаются в теле запроса. OpenClaw отправляет 17 инструментов (read, write, exec, web_search и так далее). Большинство из них есть и в Claude Code. Но некоторые — уникальные для OpenClaw.

Разбил tools на группы и начал тестировать каждую отдельно:

  • read, edit, write -- ок

  • exec, process -- ок

  • sessions_list, sessions_history, sessions_send -- ок

  • web_search, web_fetch -- ок

  • image, memory_search, memory_get -- ок

  • subagents -- блок

  • session_status -- блок

Каждая группа по отдельности проходит. Но как только добавляешь subagents или session_status -- всё, запрос улетает в Extra Usage.

Получается, что в Anthropic знают конкретные имена инструментов, которых нет в Claude Code, ищут их, и если находят в теле запроса — отправляют его на Extra Usage. Всего два инструмента из семнадцати — и этого достаточно, чтобы определить что запрос не от Claude Code.

Придумал решение

Поверх CLIProxyAPI сделать еще один прокси, который заменяет имена инструментов в обе стороны.

В запросе: subagents → sub_dispatchsession_status → check_status. Для Anthropic это выглядит как незнакомые, но легитимные кастомные tools.

В ответе обратная замена. Когда модель вызывает sub_dispatch, OpenClaw получает subagents и обрабатывает как обычно. Для streaming-ответов прокси буферизирует каждое событие отдельно и заменяет в каждом.

133 строки на Node.js, никаких зависимостей. Systemd сервис с автозапуском и перезапуском при падении.

Итоговая цепочка получилась такая: OpenClaw → replace-proxy (8318) → CLIProxyAPI (8317) → api.anthropic.com

Что в итоге нужно для настройки

1. CLIProxyAPI

Прокси к Anthropic, имитирующий Claude Code. Нужно авторизоваться, открыть ссылку в браузере и залогиниться. Прокси стартует на выбранном порту.

2. Replace-proxy

Минимальный HTTP-прокси на Node.js, который:

  • Перехватывает тело запроса и заменяет subagents → sub_dispatchsession_status → check_status (плюс OpenClaw → Assistant на всякий случай)

  • В ответах делает обратную замену и обрабатывает все построчно

Код очень простой, Opus сделал за минуту.

3. Настройка OpenClaw

В openclaw.json добавить кастомный провайдер:

{
  "models": {
    "providers": {
      "custom-proxy": {
        "baseUrl": "<http://localhost>:<порт твой>",
        "apiKey": "<api-key-из-конфига-CLIProxyAPI>",
        "api": "anthropic-messages",
        "models": [
          {"id": "claude-opus-4-6", "contextWindow": 1000000, "maxTokens": 16384},
          {"id": "claude-sonnet-4-6", "contextWindow": 200000, "maxTokens": 16384}
        ]
      }
    }
  }
}

Сделать его дефолтным, а после перезапустить весь OpenClaw

openclaw config set "agents.defaults.model.primary" "custom-proxy/claude-opus-4-6"

Переключение моделей дальше работает как обычно через чат. Нужно только не забыть прописать все нужные модели в конфиге провайдера.

Важно помнить

Технически это обход ограничений Anthropic. Аккаунт наверное могут забанить. Но думаю, многие готовы пойти на этот риск, потому что альтернатива — платить за каждый токен поверх подписки, которая и так $200/мес.

CLIProxyAPI хранит refresh_token и обновляет access_token сам. Но если refresh_token протухнет нужно будет заново авторизоваться через браузер.

Anthropic может обновить детекцию. Сегодня они ловят по двум tool-ам. Завтра могут начать ловить по структуре промпта, по паттернам запросов, по чему-то ещё. Но прямо сейчас работает.

Я бы не пытался повторить это для коммерческого использования.

Выводы для меня

Весь процесс занял один вечер. Самое интересное для меня не сам результат, а путь к нему. Я не технарь и не пишу код, но генерируя правильные гипотезы и проводя серию экспериментов с ИИ, уже сегодня можно делать вещи, которые раньше требовали серьезных навыков разработки.

https://t.me/marketdecide