Краткий ответ
- Длительность в журнале идёт до того момента, когда шлюз завершает обработку;
- Ваш клиент не считается завершившимся, пока не придёт последний байт body ответа и соединение не сигнализирует о завершении.
Что на самом деле покрывает длительность в логе
Общая задержка вызова делится на пять этапов:duration_for_view (длительность вызова в секундах), is_stream и request_id (указывайте это поле при сообщении о проблеме).
Шаг 1: определите разрыв для сегмента с помощью одного curl
Это отправная точка для всего ниже. Сначала выполните это, затем решите, какой раздел подходит.Чтение результата
Сопоставьте ваши числа с этой таблицей — она определяет, что делать дальше:Шаг 2: как измерять «данные пришли, но соединение так и не завершилось»
Если таблица указывает на третью строку, вам нужно более точное наблюдение: читайте ответ чанк за чанком, фиксируя время прихода каждого чанка и интервалы между ними. Вопрос, на который нужно ответить, — после прихода последнего байта как долго соединение ещё оставалось открытым?- Python
- Node.js
tail_99 свыше 30 секунд или max_gap свыше 30 секунд считается одним случаем «зависания хвоста». Признак — max_gap, возникающий в момент, когда счётчик байтов уже достиг 100%: каждый байт уже пришёл, и только после этого началось ожидание.
Шаг 3: измерение пропускной способности между двумя серверами
Между двумя машинами, которыми вы владеете
Используйтеiperf3 для измерения реальной пропускной способности — это самый точный вариант:
От вашего сервера к нашему API
iperf3 нельзя использовать на этом участке — у нас не запущен iperf-сервер. Вместо этого измеряйте фактическую скорость по реальным вызовам:
Проверьте, достаточно ли вашей пропускной способности
Тело ответа с изображением — это один цельный блок base64. Измеренные объёмы:Шаг 4: какие поля должна записывать ваша инструментация
Чтобы точно описать симптом — для собственного анализа или чтобы отправить его нам — записывайте как минимум такие данные для каждого вызова:duration_for_view из лога консоли —
- Если значения близки → проблема в downstream-передаче; проверьте пропускную способность и параллельные запросы;
- Если значения далеко друг от друга → проблема в сигнале завершения или на стороне клиента.
Четыре меры, которые сразу снижают риск
Переключитесь на вывод URL — изменение с наибольшим эффектом
gpt-image-2-vip и gpt-image-2-all принимают response_format: "url", возвращая ссылку на изображение вместо base64. Тело ответа уменьшается примерно с 2.6 MB до примерно 0.3 KB — это одновременно устраняет проблемы со скачиванием и сигналом завершения, поскольку маленький ответ содержит Content-Length, и клиент сам понимает, когда всё завершено.Если ваш бизнес зависит от вывода URL, переключите группу token’а на image2_OSS: детерминированный вывод URL, который не будет деградировать до base64 при нехватке ресурсов, с коэффициентом тарифа 1x без наценки.Уменьшите тело ответа
output_format=jpeg с output_compression уменьшает размер более чем наполовину по сравнению с PNG; снижайте size и quality до того уровня, который вам действительно нужен, вместо того чтобы по умолчанию брать 4K. Сжатие входных референсных изображений до менее чем 1.5MB помогает и на этапе загрузки.Ограничьте параллельные запросы уровнем, который поддерживает ваша пропускная способность
Разделите таймаут на три части и завершайте проактивно, как только данные получены
Часто задаваемые вопросы
Я так и не получил результат — почему с меня всё равно списали?
Я так и не получил результат — почему с меня всё равно списали?
Поможет ли увеличение таймаута с 600 до 1200 секунд?
Поможет ли увеличение таймаута с 600 до 1200 секунд?
- Медленная загрузка (низкая скорость, число байт всё ещё растёт): да, увеличение таймаута поможет вам получить результат.
- Сигнал завершения так и не пришёл (байты полностью переданы уже давно, в конце нет ничего нового): нет. Мы измеряли ещё 330 секунд ожидания в этом состоянии без единого нового байта; более длинный таймаут лишь откладывает момент, когда вы это заметите. Здесь вам нужно завершать его на клиенте принудительно.
Это моя проблема или проблема вашего шлюза?
Это моя проблема или проблема вашего шлюза?
- Указывает на вас: явно низкий
speed_download, скорость, которая падает по мере роста параллельных запросов, потери пакетов вmtr, либо curl работает нормально, а таймаут случается только в коде вашего приложения. - Указывает на нас: байты были полностью переданы уже давно, а в конце долгое время не приходит ни одного нового байта. У шлюза действительно была проблема с «отложенным сигналом завершения» — её первопричиной было то, что учёт тарификации на image-пути блокировал обработку запросов — исправлено и подтверждено релизом upstream 13 августа 2026 года. Даже в полностью здоровые периоды примерно 4% запросов всё равно ждут сигнал завершения ещё 10–79 секунд, при этом их данные уже полностью доставлены.
Есть ли async API? Я бы предпочёл не держать соединение открытым
Есть ли async API? Я бы предпочёл не держать соединение открытым
Можно ли обойти это, поменяв endpoint или машину?
Можно ли обойти это, поменяв endpoint или машину?
api-cf.apiyi.com проходит через Cloudflare и возвращает 524 примерно через 100 секунд, что непригодно для долгих image-запросов.Три легко упускаемых клиентских причины
Если curl показывает, что всё в порядке, а таймаут возникает только в коде вашего приложения, ищите здесь:- Таймаут означает не то, что вы думаете. Ваши 600 секунд — это общий таймаут или только таймаут чтения? У Node
undiciесть три независимых таймаута —headersTimeout,bodyTimeoutиconnect.timeout— значения по умолчанию для которых намного ниже того, что вы задали на внешнем уровне, и изменение только внешнего таймаута не даёт эффекта. - Очередь в connection pool. Когда pool переполнен, отсчёт начинается до фактической отправки request. Это ожидание для нас полностью невидимо — в backend log нет записи о request, пока он действительно не уйдёт. Диагностика: если соответствующей записи в log нет, обычно это именно этот класс причин.
- Между ними есть ещё один слой. У самостоятельно размещённого nginx значение
proxy_read_timeoutпо умолчанию — 60 секунд, а load balancers, API gateways и serverless platform задают собственные верхние пределы. Проверьте таймаут на каждом переходе; самый маленький из них — ваш реальный таймаут.
Что включать в отчёт
Если после самопроверки вам всё ещё нужна наша помощь, отправьте всё это вместе, чтобы сэкономить несколько итераций:- Идентификаторы запросов (нескольких достаточно, не нужен полный набор)
- Время по сегментам: время до первого байта / время до последнего байта / общее время / размер body ответа в байтах
- Когда это произошло, с указанием часового пояса (например,
2026-08-13 15:57 (UTC+8)) - Параллельные запросы на тот момент и ваша исходящая пропускная способность
- Какую модель и какую группу token вы использовали
Связанные документы
Как избежать тайм-аутов API?
Задержка завершения запроса на генерацию изображений
Обрывы соединения Image API
Какую параллельные запросы я могу использовать?
Лучшие практики для Image API
Чтение суммы тарификации в ваших логах
Свяжитесь с нами
Поддержка WeCom
