Почему curl работает, а Claude Code не подключается: проверьте протокол

Разберитесь, почему curl работает, а Claude Code — нет. Сравните запросы по протоколу, аутентификацию, базовые URL и минимальный тест клиента через Ofox.

Каменный мост, нарисованный чёрной тушью на кремовой карточке; тёплый серый фон, ржаво-красные полосы и надпись Claude Code.

Если API-запрос через curl проходит, а Claude Code не работает, сначала проверьте, отправляли ли они запросы одного типа. Успешный запрос OpenAI Chat Completions доказывает, что сработали один маршрут и одни учётные данные. Он не доказывает, что сработают запрос Anthropic Messages, потоковый ответ или процесс, в котором запущен Claude Code.

Мы воспроизвели это различие с Ofox и Claude Haiku 5.5. Модель ответила через Chat Completions. Запрос Messages с намеренно неверным URL вернул HTTP 401. Корректный совместимый с Anthropic маршрут вернул READY, а минимальный запрос из Claude Code также завершился успешно. После того как мы исправили сочетание маршрута и протокола в HTTP-проверке, получили успешный ответ. Мы не воспроизводили сбой сеанса Claude Code, поэтому этот результат не подтверждает способ устранения сбоев клиента и не означает, что причина любой ошибки подключения — базовый URL.

Это руководство для разработчиков, у которых уже есть рабочие учётные данные API, но которым нужно выяснить, почему не подключается клиент для программирования. Если вы впервые настраиваете провайдера, воспользуйтесь руководством по настройке Claude Code. Здесь не меняйте существующие настройки проекта, пока не установите, на каком уровне возникает сбой.

Что именно показал наш тест

В тесте использовались Claude Code 2.1.296, идентификатор модели Ofox anthropic/claude-haiku-5.5 и короткие запросы без конфиденциальных данных. Это отдельные запросы, а не тесты доступности или скорости.

ПроверкаЗапрос или конфигурацияНаблюдаемый результат
Текстовый запрос OpenAI-compatible/v1/chat/completions, аутентификация BearerHTTP 200; получен запрошенный JSON
Запрос Messages с намеренно неверной конфигурацией/v1/v1/messages, x-api-keyHTTP 401; в ответе запрошена аутентификация Bearer
Текстовый запрос Anthropic-compatible/anthropic/v1/messages, x-api-keyHTTP 200; READY
Минимальный запуск Claude CodeБазовый URL /anthropic, модель указана явно, инструменты отключеныКод завершения 0; is_error: false; результат READY

В запросе с неверной конфигурацией сочетались ошибочный путь и способ аутентификации, не подходящий для этого маршрута. Это не позволяет определить, какой из этих факторов вызвал бы сбой первым, если изменить их по отдельности. В частности, ответ 401 не доказывает, что сам API-ключ недействителен: те же учётные данные сработали на подходящем маршруте.

Клиент также выдал предупреждение unrecognized_model для идентификатора модели с пространством имён, хотя запрос завершился. Сохраняйте это предупреждение при диагностике: не считайте его признаком неудачного ответа и не делайте вывод, что поддерживаются все функции. В этой проверке инструменты были отключены; мы не тестировали рабочий процесс программирования, MCP, переключение учётной записи или длительные потоковые сеансы.

Сопоставьте конечную точку, тело запроса и учётные данные

Запишите параметры проверки: провайдера, базовый URL, полный путь, идентификатор модели, заголовок аутентификации и формат тела запроса. Не копируйте название модели из примера для одного провайдера в пример другого, не проверив соответствие идентификаторов.

Контракт клиентаURL Ofox, использованный в этом тестеФормат тела
OpenAI Chat Completionshttps://api.ofox.ai/v1/chat/completionsmodel, messages
Anthropic Messageshttps://api.ofox.ai/anthropic/v1/messagesmodel, messages, max_tokens
Базовый URL Claude Codehttps://api.ofox.ai/anthropicКлиент добавляет путь операции

Для этой совместимой с Anthropic конфигурации нельзя просто подставить /v1 в конец базового URL, используемого OpenAI SDK: это не взаимозаменяемый вариант. Также не вставляйте полный URL /v1/messages в поле базового адреса, где ожидается префикс.

В документации Anthropic по шлюзам конфигурация шлюза отделяется от конфигурации нижележащего провайдера. Там также прямо не гарантируется поддержка моделей, отличных от Claude, при маршрутизации через сторонние шлюзы. В этом тесте использовалась модель Claude; успешная текстовая проверка на другой модели не подтвердила бы полную совместимость с Claude Code.

Англоязычный пример кода Haiku в интерфейсе Ofox с базовым URL Anthropic

Настоящий общедоступный интерфейс Ofox с примером кода на английском языке; снимок сделан 12 октября. На нём указаны маршрут Anthropic и модель. Это не снимок результата теста в CLI.

Отправьте минимальный запрос Messages

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

curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 45 \
  'https://api.ofox.ai/anthropic/v1/messages' \
  -H "x-api-key: $OFOX_API_KEY" \
  -H 'anthropic-version: 2023-06-01' \
  -H 'content-type: application/json' \
  --data '{"model":"anthropic/claude-haiku-5.5","max_tokens":64,"messages":[{"role":"user","content":"Reply with READY only."}]}'

Ожидаемый результат — ответ Messages, в поле content которого есть текстовый блок со значением READY. Проверяйте одновременно HTTP-статус и тело ответа. HTML-страница входа, пустое тело успешного ответа или объект ошибки не считаются корректным ответом модели.

Если команда завершилась с ошибкой, сохраните HTTP-статус, тип ошибки и идентификатор запроса, если он есть. При обращении к провайдеру укажите идентификатор запроса; не включайте заголовки авторизации и личные запросы. Тайм-аут подключения, ошибка сертификата и HTTP 401 возникают на разных уровнях, поэтому исправлять их одинаковым способом не следует.

Запустите клиент без нагрузки проекта

В установленной у нас версии флаг --bare включает минимальный режим клиента; --tools "" отключает инструменты для этой текстовой проверки. Прежде чем использовать флаги, зависящие от версии, проверьте claude --help для своей версии.

claude --version

(
  unset ANTHROPIC_AUTH_TOKEN
  export ANTHROPIC_BASE_URL='https://api.ofox.ai/anthropic'
  export ANTHROPIC_API_KEY="$OFOX_API_KEY"
  claude --bare -p 'Reply with READY only.' \
    --model 'anthropic/claude-haiku-5.5' \
    --tools '' --no-session-persistence --output-format json
)

Круглые скобки ограничивают изменения переменных окружения этой проверкой. Мы запустили её из пустого временного каталога. Она не изменяет настройки проекта и не снимает корпоративные ограничения. Если организация ограничивает выбор провайдеров, используйте разрешённую точку назначения; эта процедура не предназначена для обхода управляемых политик.

Успешный результат должен соответствовать трём условиям: код завершения 0, is_error: false и ожидаемый ответ. В нашем запуске процесс занял 2,64 секунды от начала до конца. Значение стоимости в CLI не сверялось со счётом Ofox, поэтому его нельзя считать окончательной суммой, списанной шлюзом. Даже правильный ответ подтверждает только это минимальное подключение.

Если результаты проверок различаются

Если запрос Messages проходит, а клиент — нет, сравните окружение процесса. Окружение оболочки и процесс, запущенный из IDE, могут получать разные значения переменных. Исправив настройки запуска, перезапустите проблемный клиент и проверьте, какой провайдер и модель он использует фактически. Не выводите целиком все переменные окружения: среди них могут быть ключи.

Затем проверьте область действия настроек. В руководстве Claude Code по настройкам описаны пользовательские, проектные, локальные и управляемые настройки. Проверьте фактически применённое значение, а не предполагайте, что сработал файл, который вы редактировали последним. Перед изменением настроек сохраните их копию. Если сбой возникает только в одном репозитории, сначала сравните его проектную конфигурацию с чистой проверкой, а не меняйте глобальные настройки.

СимптомСледующая проверка, которая поможет различить причиныЧего избегать
HTTP 401 или 403Проверьте соответствие маршрута, тип учётных данных и политику провайдераНе меняйте рабочий ключ, не проверив маршрут
Модель не найденаСравните точный идентификатор со списком доступных моделей этого провайдераНе считайте маркетинговое название идентификатором API
Ошибка сертификата или проксиСравните утверждённые сетевые настройки процесса, в котором возникает ошибкаНе отключайте проверку TLS
Минимальный ответ проходит, длительный сеанс — нетСоберите данные о завершении потока и тайм-аутахНе называйте текстовую проверку тестом потоковой передачи
Текст работает, вызов инструмента — нетОтдельно проверьте протокол запроса инструмента и его результатаНе вините только модель на том основании, что текстовый запрос прошёл
Ошибка возникает только в IDEПерезапустите её с нужным окружением и повторно проверьте настройкиНе меняйте одновременно несколько несвязанных глобальных настроек

Для подключения DeepSeek отдельно используйте статью о настройке DeepSeek в Claude Code: там описан контракт другого провайдера. Не смешивайте его прямую конечную точку с примером Ofox из этой статьи.

Возвращайтесь к обычной работе постепенно

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

В полезном отчёте укажите версию клиента, операционную систему, маршрут провайдера, конфигурацию модели без секретов, время сбоя, идентификатор запроса и самый короткий запрос, на котором его удаётся воспроизвести. Отдельно перечислите проверки, которые прошли. Фраза «curl работает» становится полезным свидетельством только тогда, когда понятно, какой именно протокол проверялся.

Часто задаваемые вопросы

Доказывает ли успешный запрос curl, что Claude Code настроен правильно?
Нет. Он доказывает, что сработал именно этот запрос. Прежде чем делать выводы о клиенте, сравните фактический путь, способ аутентификации, модель и окружение процесса.
Стоит ли отключать проверку сертификата, чтобы устранить ошибку подключения?
Нет. Проверьте цепочку сертификатов и утверждённые настройки прокси. Отключение проверки скрывает проблему и ослабляет защиту соединения.
Доказывает ли тест клиента, что вызовы инструментов и программирование будут работать?
Нет. В нашем тесте инструменты были намеренно отключены. Прежде чем полагаться на эту конфигурацию, отдельно проверьте вызов инструмента только для чтения и типичную задачу по проекту.