Skip to main content

Симптомы

Вы разрабатываете или отлаживаете приложение для генерации изображений на своем компьютере с запущенным VPN- или прокси-клиентом (многие разработчики держат его включенным, чтобы инструменты ИИ для написания кода имели доступ к интернету). При этом наблюдается следующее:
  • Запросы на генерацию изображений часто завершаются ошибками соединения, такими как socket hang up, ECONNRESET, RemoteDisconnected или Connection aborted
  • Таймаут вашего клиента составляет 600 или даже 900 секунд, однако запросы обрываются примерно через 90–180 секунд
  • Несколько запросов часто завершаются сбоем в один и тот же момент, словно их оборвали вместе
  • Проблема чаще затрагивает более медленные модели (например, gpt-image-2-vip, обработка одного изображения в которых обычно занимает 60–120 секунд)
  • В логах вызовов большинство этих запросов отображаются как успешные и тарифицированные

Краткий ответ

Это не лимит параллельных запросов и не таймаут APIYI. Прокси на вашем компьютере закрывает соединения, по которым некоторое время не передаются данные.Во время генерации изображения данные по соединению вообще не передаются. Чем дольше длится генерация, тем выше вероятность того, что прокси сочтет соединение простаивающим и закроет его. Направьте api.apiyi.com напрямую (в обход прокси), и проблема исчезнет. APIYI доступен напрямую из материкового Китая.

Почему это происходит

Запрос на генерацию изображений без потоковой передачи проходит три этапа:
  1. Загрузка: отправляются prompt и референсные изображения, что занимает от нескольких секунд до нескольких десятков секунд
  2. Ожидание: сервер генерирует изображение, обычно в течение 60–200 секунд. В это время по соединению не передаются данные
  3. Скачивание: готовое изображение возвращается целиком за один раз
Проблема заключается во 2-м этапе. Чтобы освободить ресурсы, прокси-клиенты и прокси-серверы устанавливают для каждого соединения таймаут простоя: если в течение этого времени данные не передаются ни в одном из направлений, соединение закрывается. В широко используемом ядре Xray / V2Ray за это отвечает параметр connIdle со значением по умолчанию 300 секунд, однако оператор прокси-сервера может установить гораздо меньшее значение, и вы не можете ни увидеть, ни изменить его со своего компьютера. В исследованном нами случае это значение составляло около 90 секунд. В результате:
  • Таймаут вашего клиента не поможет. Таймаут определяет лишь то, сколько времени готова ждать ваша программа. Прокси посередине закрывает соединение первым, и ваша программа просто видит разрыв соединения
  • Почему они завершаются сбоем пачками: прокси обычно выполняет проверку по таймеру и закрывает сразу все соединения, которые простаивали слишком долго, поэтому несколько запросов, ожидающих изображения, завершаются сбоем в одну и ту же секунду
  • Почему чаты и инструменты разработки работают нормально: чаты с потоковой передачей постоянно отправляют данные, поэтому соединение никогда не простаивает. Генерация изображений ничего не передает на протяжении нескольких минут
Прерванные запросы обычно все равно тарифицируются. Запрос уже поступил в APIYI, и генерация началась. Разрыв соединения не останавливает процесс, поэтому изображение генерируется и тарифицируется в обычном порядке, но результат так и не доходит до вашей программы. Проверяйте фактические списания в журналах вызовов, а не по количеству ошибок в вашей программе.

Как подтвердить

1

Проверьте время выполнения

Зафиксируйте, сколько времени выполнялся каждый неудачный запрос до возникновения ошибки. Если длительность группируется вокруг фиксированного значения (например, 90 или 180 секунд), и несколько запросов часто завершаются сбоем в одну и ту же секунду, причиной практически наверняка является тайм-аут простоя прокси.
2

Сравните с логами вызовов

Найдите тот же временной интервал в логах вызовов. Если ваша программа сообщила о разрыве соединения, но в логе отображается успешный тарифицированный запрос, значит, APIYI завершил генерацию изображения, а соединение обратно к вам было разорвано.
3

Запустите небольшую партию через прямой маршрут

Направьте api.apiyi.com напрямую, как описано ниже, и запустите генерацию 10-20 изображений с теми же параметрами. Если разрывы исчезнут, причиной был прокси.

Как это исправить

Добавьте правило прямого подключения (direct) для APIYI в вашем прокси-клиенте. Весь остальной трафик продолжит идти через прокси, поэтому работа ваших инструментов разработки на базе ИИ не будет нарушена.Для Clash / Clash Verge / mihomo добавьте следующее в начало раздела rules в файле конфигурации:
Для v2rayN и аналогичных клиентов добавьте apiyi.com в список прямого подключения (direct) в настройках маршрутизации.
В режиме TUN или глобальном режиме прокси перехватывает трафик от всех программ на компьютере, и обойти его программно в вашем коде невозможно. Единственное решение — настроить такое правило прямого подключения.

Произойдет ли это после развертывания на сервере?

Обычно нет. Серверы, как правило, работают без прокси и подключаются к APIYI напрямую, поэтому прокси не закрывает неактивные соединения. Это также рекомендуемая конфигурация для продакшена: облачный сервер в материковом Китае может обращаться к api.apiyi.com напрямую. Если между вашим сервером и APIYI есть другие уровни, у них также есть таймауты неактивности. Проверьте их при развертывании: Генерация одного изображения обычно занимает от 60 до 200 секунд, что укладывается в стандартные лимиты облачных NAT. Дополнительная настройка требуется только в том случае, если вы используете собственный обратный прокси или трафик сервера также идет через прокси.

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

Это помогает в случае облачных NAT-шлюзов, поскольку зонды keepalive сообщают NAT, что соединение всё ещё активно. Однако это практически не даёт эффекта при использовании прокси-клиентов: они определяют простой по наличию реальных данных, а зонды keepalive данными не считаются. Для сценария локальной разработки решением по-прежнему остаётся прямая маршрутизация.
Их запросы либо быстро возвращают ответ, либо непрерывно передают данные через потоковую передачу, поэтому соединение никогда не простаивает 90 секунд и дольше. С этой проблемой сталкиваются только такие запросы, как генерация изображений, которые ничего не отправляют в течение нескольких минут, а затем возвращают весь результат разом.
Обе проблемы вызваны локальным прокси, но симптомы различаются. В случае с пустой ошибкой 502 прокси сам формирует ответ 502 без тела. Здесь же соединение обрывается во время ожидания изображения, и ваша программа видит разорванное соединение. Решение для обеих ситуаций одинаковое: направлять запросы к APIYI в обход прокси.
Эти обрывы происходят на прокси между вами и APIYI уже после того, как APIYI сгенерировал изображение и выполнил тарификацию. Если сумма существенна, отправьте в службу поддержки временной интервал (с указанием часового пояса, например 16:30-17:00 (UTC+8)) и ваше имя пользователя, и мы вместе проверим журналы вызовов.
Эндпоинты генерации изображений в настоящее время возвращают ответ синхронно, без опроса по task ID; см. раздел Существует ли асинхронный API для изображений? Можно ли опрашивать результаты по task ID?. Как только для APIYI будет настроена прямая маршрутизация, само по себе долгое ожидание перестанет быть проблемой.

Связанные документы

Скрипт возвращает 502, но в логах вызовов ничего нет?

Пустая ошибка 502, сформированная локальным прокси; для исправления настройте обход системного прокси

Нужен ли прокси для использования API?

Прямой доступ из материкового Китая, прокси или VPN не требуются

Как избежать таймаутов API?

Настройки таймаутов и пошаговая диагностика

Есть ли асинхронный API для изображений?

Почему ответы синхронные и как сделать для них асинхронную обертку