Резюме
- OpenAI открыла инцидент с API в 00:55:27 UTC 29 июля после появления повышенного числа ошибок с кодом
invalid_prompt. - Компания сообщила, что применила меры по смягчению в 01:39:33 и отметила восстановление всех затронутых сервисов в 02:20:19; публичный таймлайн составил 1 час 24 минуты 52 секунды.
- В записи об инциденте не указано, какой HTTP-статус сопровождал
invalid_prompt; при этом Python SDK OpenAI сопоставляет фактический HTTP 400 сBadRequestErrorи исключает обычный код 400 из набора ответов, которые повторяются по умолчанию. - Поэтому клиентская система, которая безвозвратно отклоняет каждый ответ с
invalid_prompt, может ошибочно классифицировать сбой провайдера как дефект полезных данных и оставить корректные операции незавершёнными. - OpenAI не раскрыла первопричину, долю отказов, географию, перечень затронутых моделей или эндпоинтов, число запросов и общее число клиентов; не каждую ошибку с таким кодом в этом интервале можно отнести к инциденту.
Ошибка API выполняет две задачи одновременно. Она сообщает, что операция не удалась, и подсказывает, кто должен действовать дальше. Тайм-аут предлагает вызывающей стороне подождать или повторить запрос. Ограничение частоты предлагает замедлиться. Некорректный промпт обычно указывает разработчику исправить входные данные.
Инцидент OpenAI 29 июля нарушил это аккуратное разделение. На самой странице статуса повышенные ошибкиinvalid_promptназваны инцидентом провайдера, затрагивающим API. Для оператора важен не просто тот факт, что запросы не выполнялись. Важно, что лексика отказа указывала на клиента, тогда как реагирование на инцидент оставалось за поставщиком.
Такое расхождение может быть опаснее, чем однозначная серверная ошибка. Если это ответ 500, он часто попадает в очередь повторов и на панель инцидентов. Если это ответ 400, он, как правило, попадает в очередь необрабатываемых сообщений, в сообщение валидации для пользователя или в счётчик постоянных отказов. OpenAI не сообщила, какой статус возвращался в этом инциденте, поэтому сохранение фактического транспортного статуса — часть контроля, а не факт, который можно вывести из названия кода.
Таксономия SDK усиливает первый диагноз
Официальный Python-клиент OpenAI сопоставляет ответ HTTP 400 сBadRequestError. Это разумный вариант по умолчанию: большинство ответов 400 действительно означают запрос, который сервер не примет без изменений. Клиент отдельно классифицирует ошибки аутентификации, прав доступа, отсутствия ресурса, конфликта, валидации, ограничения частоты и сбои сервера.
Его политика повторов следует той же логике. В документации указано, что ошибки соединения, тайм-ауты 408, конфликты 409, ограничения частоты 429 и ответы с кодом от 500 и выше по умолчанию получают две автоматические повторные попытки. Реализация также учитывает явную инструкциюx-should-retryдо применения этих правил по статусам. Обычный код 400 проходит дальше как «не повторять».
Ничто в этом инциденте не делает эту общую политику неправильной. Автоматически повторять каждый некорректный запрос — значит тратить ёмкость, скрывать дефекты приложения и иногда умножать побочные эффекты. Вывод здесь более узкий: код статуса и класс исключения — это свидетельство, а не безошибочное распределение ответственности.
Подтверждение не должно превращаться в слепые повторы
Устойчивому клиенту нужен второй уровень классификации. Когда внезапная серия ранее корректных форм запросов начинает возвращать один и тот же номинально постоянный код ошибки, система может сопоставить временной ряд с официальной лентой инцидентов провайдера. Если провайдер подтверждает соответствующее событие сервиса, клиент может перевести затронутые операции из состояния «некорректно навсегда» в состояние «на карантине до контролируемого повторного выполнения».
Это не повод безостановочно нагружать API. Очередь должна быть ограниченной, с откатами, учитывать указания провайдера и различать операции, которые безопасно повторить, и те, которые, возможно, уже вступили в силу. Тестовый запрос или синтетическая проба позволяют убедиться, что путь исправен, прежде чем выпускать отложенный объём.
Это решение должно также сохранять настоящую валидацию входных данных. Часть запросов в этом интервале действительно могла быть некорректной. Инцидент провайдера и ошибки клиента могут существовать одновременно. Бесконечно повторять одну и ту же некорректную полезную нагрузку — значит превращать аккуратную обработку инцидента в шум.
Идентификаторы запросов — мост между двумя взглядами на сбой
Python SDK показывает идентификатор запроса для неудачных исключенийAPIStatusError. Этот идентификатор позволяет клиенту указать поставщику конкретную транзакцию, не полагаясь только на локальную метку времени или строку ошибки. Во время инцидента классификации сохранить его ценнее, чем сводить каждую ошибку кinvalid_prompt.
Операторам также следует сохранять эндпоинт, модель, статус, код ошибки, версию SDK, номер попытки и безопасный для конфиденциальности отпечаток формы запроса. Отпечаток может показать, что ранее корректный шаблон полезных данных внезапно перестал работать, не помещая в журнал инцидента сырые промпты, секреты или персональные данные.
Так появляются два параллельных журнала. Запись клиента отвечает на вопросы, что было отправлено, что вернулось и был ли повтор. Запись провайдера отвечает, когда публичный инцидент был открыт, по нему приняты меры и он закрыт. Одна не заменяет другую, но их метки времени могут показать, когда внешне локальная проблема валидации превратилась в коррелированный сбой сервиса.
«Устранено» закрывает баннер, но не очередь клиента
Структурированная запись статуса OpenAI относит расследование к 00:55:27 UTC, меры по смягчению и мониторинг к 01:39:33, а устранение к 02:20:19. Страница статуса указывает API как затронутый компонент и называет воздействие незначительным.
Эти факты не описывают время простоя каждого клиента. OpenAI предупреждает, что метрики доступности агрегируются по тарифам, моделям и типам ошибок, а индивидуальный опыт может отличаться. В записи нет знаменателя, по которому можно было бы рассчитать, сколько запросов или организаций было затронуто.
Устранение означает, что OpenAI сочла указанный сервис восстановленным. Оно не означает, что отброшенные задания клиента вернулись, очередь необработанных сообщений опустела или пользователь повторно отправил работу. Поэтому восстановление требует сверки: выявить сбои внутри интервала инцидента, исключить настоящие дефекты валидации, один раз повторить подходящие операции и проверить итоговое состояние.
Недостающие факты после инцидента по-прежнему важны
OpenAI не раскрыла первопричину и не объяснила, почему инцидент проявился какinvalid_prompt. Она не назвала сопутствующий HTTP-статус, не перечислила затронутые модели или эндпоинты, не опубликовала кривую частоты ошибок, не указала географию и не привела количественные данные по запросам и клиентам. Без этих фактов было бы неверно утверждать, что все одноимённые ошибки — или все ответы 400 — в этом интервале вызваны одной неисправностью провайдера.
Тем не менее публичные свидетельства подтверждают конкретный операционный вывод. Таксономии ошибок — это контракты между поставщиками и клиентской автоматизацией. Когда инцидент провайдера нарушает такой контракт, самый безопасный ответ — не постоянное отклонение и не повторы без разбора. Это третье состояние: подтверждённая неопределённость с сохранёнными доказательствами, ограниченным повторным выполнением и явным шагом сверки после восстановления.
Следующее полезное раскрытие объяснило бы причину ошибочной классификации и то, изменила ли OpenAI сервис или семантику ошибок. До тех пор команды могут улучшать собственную плоскость управления. Они могут сделать вопрос «кто, судя по всему, виноват» пересматриваемым диагнозом, а не свойством, навсегда зашитым в одно имя ошибки.


