Cline — популярный открытый агент для программирования в VS Code. При подключении собственного API большинство выбирает в настройках OpenAI Compatible и указывает Base URL, API Key и ID модели. Ошибки обычно группируются на четырёх уровнях: учётные данные, путь, лимиты и сеть. Если менять модель при первом красном сообщении, десятиминутная проблема конфигурации легко превращается в полдня поиска.

Эффективнее действовать так: сначала посмотреть код состояния и тело ошибки, затем воспроизвести проблему минимальным запросом и только потом менять модель, контекст или промпт. Ниже разобраны 401, 404, 429, переполнение контекста, вызовы инструментов и тайм-ауты, указаны расположение логов Cline и чек-лист для обращения в поддержку.

Примечание: Cline — товарный знак Cline Bot Inc.; VS Code — товарный знак Microsoft Corporation; OpenAI — товарный знак OpenAI, Inc. Статья носит технический характер; автор не связан с перечисленными компаниями. Интерфейс, меню и тексты ошибок меняются от версии к версии — ориентируйтесь на установленную у вас версию.

1. Порядок диагностики: сначала уровень, потом конфигурация

Симптом или код Обычное значение Что проверить первым Повторять ли
401 Ключ отсутствует, неверен или недействителен Ключ, поле Provider, состояние аккаунта Нет
403 У ключа нет прав или сработала политика Права на модель, настройки команды, баланс Нет
404 Неверный путь или модель не существует Base URL, ID модели Нет
429 Превышены частота, параллельность или квота Расход, общий ключ, стратегия повторов Да, с задержкой
400/413 Неверный формат запроса или слишком длинный контекст Контекст, параметры, max_tokens После исправления
Тайм-аут или обрыв потока Прокси, TLS, простой соединения, перегрузка сервера Сетевой путь, настройки стриминга По ситуации
Сбой вызова инструментов Модель или шлюз не поддерживает протокол Возможности модели, совместимость API Нет

При диагностике фиксируйте переменные: тот же ключ, тот же Base URL, тот же ID модели; меняйте только один параметр за раз. Если изменить три сразу, даже после восстановления будет непонятно, что именно помогло.

2. 401 и 403: сначала ключ, затем поле Provider

В списке Provider у Cline есть и OpenAI, и OpenAI Compatible. При подключении стороннего шлюза обычно нужен второй. Если выбрать первый, запрос может уходить на адрес OpenAI по умолчанию, и ваш ключ, естественно, не будет принят.

Проверяйте в таком порядке:

  • Ключ скопирован полностью, без пробелов, переводов строк и кавычек. При копировании из чата легко захватить скрытые символы.
  • Ключ вставлен в форму правильного Provider. Поля разных Provider в Cline разделены; ошибка места сразу даёт 401.
  • Ключ не удалён, не отключён и не истёк — сверьтесь с консолью шлюза.
  • На аккаунте есть доступный баланс. При недостатке средств возможны 401, 402 или 403; ориентируйтесь на тело ошибки.
  • Base URL указывает на среду, к которой относится ключ. Тестовый ключ на боевом адресе обычно даёт 401.
  • В командной версии не ограничены ли личные ключи или сторонние endpoint. Если политика действует, даже правильная локальная конфигурация не поможет.

Сначала проверьте адрес и ключ минимальным запросом:

export API_KEY="sk-ваш-ключ"

curl -sS -o /tmp/cline_models.json -w "%{http_code}\n" \
  "https://ai.zhongshangqihang.com/v1/models" \
  -H "Authorization: Bearer $API_KEY"

head -c 300 /tmp/cline_models.json

Ответ 200 означает, что адрес, ключ и протокол в целом работают; при 401 попробуйте тот же ключ в тестовом разделе консоли шлюза, чтобы понять, проблема в самом ключе или в полях Cline и сетевом уровне.

3. 404: Base URL и ID модели делят причину пополам

404 не обязательно означает, что модель отключили; чаще всего неверно собран путь:

  • В Base URL не хватает /v1, запрос попадает в веб-маршрут и возвращает HTML или 404.
  • В Base URL указан /v1/chat/completions, а клиент добавляет путь ещё раз — получается дубль.
  • В OpenAI-совместимое поле вписан Anthropic /v1/messages или наоборот.
  • Регистр, дефисы и суффикс версии ID модели не совпадают со шлюзом.
  • Модель не открыта для текущего аккаунта, тарифа или региона.

Кнопка Verify в Cline в основном проверяет доступность адреса и ключа и не подтверждает, что каждая модель открыта текущему аккаунту. Всё равно отправьте реальный диалоговый запрос. Если /v1/models возвращает список, а диалог даёт 404, подозревайте прежде всего ID модели, а не ключ. Надёжнее копировать ID из списка моделей или со страницы тарифов, а не набирать вручную.

4. 429: лимит частоты, параллельность и квота — не одно и то же

429 означает, что запрос превысил лимит скорости, параллельности или токенов. Типичные случаи:

  • Превышено число запросов или токенов в минуту.
  • Несколько человек используют один ключ и делят квоту.
  • Агент подряд читает файлы и запускает команды, отправляя много запросов за короткое время.
  • Повторы идут без задержки: чем больше неудач, тем больше запросов — возникает «шторм повторов».
  • Длинный контекст занимает большую часть квоты и оставляет меньше места параллельным запросам.

Сначала смотрите заголовки ответа и тело ошибки. Если есть Retry-After, ждите указанное время; если нет — используйте экспоненциальную задержку со случайным разбросом. 401 и 404 не повторяйте: повтор только усилит проблему. Ниже пример обработки запросов:

import random
import time
import httpx

RETRYABLE = {429, 500, 502, 503, 504}

def chat(payload, key, url="https://ai.zhongshangqihang.com/v1/chat/completions"):
    for attempt in range(4):
        try:
            resp = httpx.post(
                url,
                json=payload,
                headers={"Authorization": f"Bearer {key}"},
                timeout=httpx.Timeout(120.0, connect=10.0),
            )
        except httpx.TimeoutException:
            if attempt == 3:
                raise
            time.sleep(min(30, 2 ** attempt) + random.random())
            continue

        if resp.status_code in (400, 401, 403, 404, 413):
            raise RuntimeError(f"{resp.status_code}: {resp.text[:300]}")

        if resp.status_code in RETRYABLE:
            retry_after = resp.headers.get("Retry-After", "")
            wait = float(retry_after) if retry_after.isdigit() else 2 ** attempt
            time.sleep(min(30, wait) + random.random())
            continue

        resp.raise_for_status()
        data = resp.json()
        choice = data["choices"][0]
        if choice.get("finish_reason") == "error":
            raise RuntimeError(f"stream error: {choice.get('error')}")
        return data

    raise RuntimeError("Повторы исчерпаны")

Этот код отделяет «неповторяемые ошибки аутентификации и пути» от «повторяемых ограничений и серверных ошибок». Ошибка потокового ответа может скрываться в finish_reason, хотя HTTP-статус остаётся 200, поэтому её нужно проверять отдельно. В production учитывайте, что Retry-After может быть HTTP-датой, а не числом.

5. Переполнение контекста и сбой вызовов инструментов

Переполнение контекста обычно возвращает 400 или 413, а в теле ошибки встречаются context_length_exceeded, maximum context length и похожие строки. Cline отправляет открытые файлы, вывод терминала, найденные фрагменты и историю диалога вместе, поэтому фактический контекст часто длиннее ожидаемого.

В Model Configuration Cline параметры Context Window и Max Output Tokens обычно нужно подтвердить или заполнить вручную. Слишком большое значение приводит к отказу; слишком маленькое заставляет Cline раньше сжимать контекст. Что делать: создать новую задачу, исключить артефакты сборки и логи, закрыть лишние вкладки, сначала суммировать длинные документы, перезапускать затянувшиеся диалоги.

Сбой вызовов инструментов — отдельная категория. OpenAI-совместимый endpoint должен не только поддерживать чат, но и реализовывать нативный протокол tools/function calling. Некоторые шлюзы и модели умеют только базовый диалог: обычные вопросы работают, а агент при чтении файла получает 400 или другую ошибку. Тогда сначала определите, что «чат работает, а падают только инструменты», затем проверьте поддержку инструментов моделью и настройку Computer Use в Cline.

6. Тайм-ауты, обрыв потока и сбой соединения

Тайм-аут часто не возвращает HTTP-статус: запрос долго висит, появляется ECONNRESET, ошибка сертификата или ответ обрывается на середине. Частые причины:

  • Корпоративный прокси или firewall задаёт простой для долгих соединений.
  • Прокси буферизует SSE, и потоковые данные не передаются вовремя.
  • VPN, защитное ПО или DNS блокируют домен API.
  • Сильное расхождение системного времени ломает проверку TLS-сертификата.
  • Задача агента слишком длинная, и один запрос превышает лимит клиента или шлюза.

Для диагностики отправьте тот же запрос с "stream": false. Если непоточный режим работает, проблема в потоковом канале или прокси; затем проверьте curl -N напрямую, чтобы исключить клиент Cline. Если корпоративный прокси выполняет TLS-инспекцию, добавьте корневой сертификат компании в цепочку доверия и при необходимости задайте NODE_EXTRA_CA_CERTS. Отключение http.proxyStrictSSL допустимо только как временная мера и не рекомендуется для production. Не считайте API рабочим только потому, что ping проходит: ping не проверяет TLS, сертификаты и путь.

7. Логи и диагностика: сначала доказательства, потом вопрос

В VS Code откройте View → Output и выберите Cline в списке каналов — там видны логи расширения в реальном времени. В CLI логи обычно лежат в ~/.cline/data/logs/cline.log, открыть их можно командой cline doctor log; в JetBrains часто используется ~/.cline/cline-core-service.log. Точные пути смотрите в документации текущей версии.

Полезная запись для диагностики содержит: время, код состояния, код ошибки, ID модели, хост Base URL, ID запроса, длительность и число повторов. ID запроса обычно находится в заголовках ответа и может называться request-id, x-request-id или иначе у конкретного шлюза. Для поддержки один лог с ID запроса полезнее десяти скриншотов.

Не записывайте полный ключ, полные промпты и пользовательский код. В ключе оставляйте первые и последние четыре символа, чувствительные данные маскируйте. Сам лог может содержать фрагменты кода — проверьте его перед передачей.

8. Чек-лист для поддержки

  1. Зафиксируйте текст ошибки, код состояния, время и ID запроса.
  2. Запросите /v1/models через curl, проверьте адрес и ключ.
  3. Проверьте, что Base URL заканчивается на /v1 и путь не дублируется.
  4. Скопируйте ID модели из списка, сверьте регистр и суффикс версии.
  5. Проверьте новый ключ, чтобы исключить истёкший ключ, квоту или политику команды.
  6. Сначала отправьте непоточный запрос с коротким контекстом, затем постепенно верните стриминг и длинный контекст.
  7. Смените сеть или прокси, чтобы исключить DNS, TLS и корпоративный прокси.
  8. Если всё перечисленное в порядке, передайте в поддержку шлюза или Cline логи, шаги воспроизведения и ID запроса.

9. Частые вопросы

Ключ работает в другом месте, а в Cline даёт 401?

Сначала проверьте, выбран ли Provider OpenAI Compatible, затем — совпадает ли Base URL со средой ключа. В командной версии также убедитесь, что личные ключи не ограничены.

404 всегда означает, что модель отключили?

Нет. Чаще всего в Base URL не хватает или лишний /v1, либо ID модели набран с ошибкой. Откройте список моделей и скопируйте ID для проверки.

429 означает нехватку баланса?

Не обязательно. 429 говорит о превышении скорости, параллельности или квоты; при недостатке средств возможны 401, 402 или 403. Ориентируйтесь на тело ошибки.

Почему падают только потоковые запросы?

В первую очередь проверьте буферизацию прокси, простой соединения и переиспользование соединений. Сравните с непоточным режимом и протестируйте curl -N напрямую.

Где смотреть логи Cline?

В VS Code: View → Output → Cline; в CLI — ~/.cline/data/logs/cline.log или cline doctor log. В разных версиях и на разных платформах пути отличаются; ориентируйтесь на текущую документацию.

Что дальше

Создайте тестовый ключ в ZSQH AI Gateway, прогоните по curl-командам из статьи аутентификацию, модели и стриминг, затем перенесите настройки в Cline. Доступность моделей и цены смотрите на странице тарифов; при диагностике сначала фиксируйте переменные, затем меняйте их по одному.

Читайте также:

Примечание: Cline — товарный знак Cline Bot Inc.; VS Code — товарный знак Microsoft Corporation; OpenAI — товарный знак OpenAI, Inc. Статья носит технический характер; автор не связан с перечисленными компаниями. Тексты ошибок, меню и поведение интерфейса могут меняться — ориентируйтесь на документацию проекта.