Skip to main content

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

Один и тот же контент может завершиться совершенно по-разному в режиме потоковой передачи и без него при срабатывании фильтра контента:
  1. Без потоковой передачи: когда официальный маршрут активирует фильтр безопасности контента, APIYI автоматически повторно генерирует запрос через другой официальный маршрут. Ваш клиент получает полный результат, при этом тарификация происходит только один раз.
  2. С потоковой передачей: вывод отправляется клиенту по мере генерации, поэтому переключить маршрут в процессе потока невозможно. Запрос завершается с finish_reason: "content_filter", а уже сгенерированная часть тарифицируется в обычном порядке.
  3. Как выбрать: используйте потоковую передачу для контента, отображаемого пользователям посимвольно/по токенам (чат, ответы агента); используйте режим без потоковой передачи для контента, который программа обрабатывает только после полного завершения (сценарии, раскадровки, перевод, структурированные данные).

Два этапа, на которых происходит фильтрация

Фильтр безопасности контента провайдера может сработать на двух этапах, и оба они проявляются в режиме потоковой передачи: В обоих случаях HTTP-статус равен 200, и stream штатно завершается с data: [DONE]. В журналах ошибок HTTP ничего не появляется; только последнее событие в stream сообщает о том, что произошло.

Потоковая передача против непотоковой

Автоматическое переключение при сбое для непотоковых запросов значительно повышает вероятность успеха, но она не составляет 100%. Контент, который явно нарушает правила использования поставщика, все равно может быть отклонен самой моделью на другом маршруте; структуру такого ответа см. в Как выглядит отказ модели OpenAI?.

Результаты тестирования

2026-09-25 (UTC+8) мы отправили один и тот же набор сценариев раскадровки фильма в gpt-5.6-terra в обоих режимах с одинаковыми параметрами (max_tokens=35000, temperature=0, reasoning_effort=high): Повторная отправка того же контента в режиме потоковой передачи дает практически аналогичный результат. Срабатывание фильтрации зависит главным образом от контента, а не от везения.

Как выглядит прерванный stream

Последнее событие, содержащее choices, не содержит контента, только причину завершения:
Когда вывод обрывается на этапе генерации, отказ на английском языке добавляется прямо в конец собранного текста без переноса строки. Например, раскадровка на китайском языке обрывается на середине предложения, и сразу за ней следует I'm sorry, but I cannot assist with that request.Если вы передадите этот текст без изменений в запрос на продолжение, модель увидит отказ в своем контексте, и вероятность повторной блокировки возрастет. Удалите это предложение перед продолжением.

Как выбрать

Используйте потоковую передачу

  • Чат, служба поддержки и ответы агентов, где пользователям нужно видеть вывод немедленно
  • Сценарии, в которых пользователи могут остановить генерацию на полпути
  • Повседневное общение редко вызывает срабатывание фильтрации контента, поэтому удобство потоковой передачи важнее

Используйте режим без потоковой передачи

  • Сценарии, раскадровки, главы книг и другие объемные творческие тексты
  • Пакетный перевод, извлечение информации, структурированный JSON
  • Результаты, которые парсятся и сохраняются перед показом пользователям
  • Контент, который с высокой вероятностью затрагивает деликатные сюжетные темы (драки, травмы, преступления)
Один продукт может использовать оба подхода: передавать чат в потоковом режиме, а сценарии или раскадровки генерировать без потоковой передачи. Для последних просто установите stream в false, оставив все остальное без изменений. Запрос без потоковой передачи возвращает ответ только после того, как он сгенерирован полностью. Длинные ответы моделей рассуждений могут занимать от 30 до 100 секунд и более, поэтому установите клиентский таймаут для таких запросов как минимум на 300 секунд; см. Как избежать таймаутов API?. Если вашему интерфейсу требуется индикация прогресса, показывайте состояние «генерация» и выводите результат, как только он будет готов.

Если вам необходимо использовать stream

1

Записывайте finish_reason во время чтения stream

Если finish_reason в последнем событии, содержащем choices, равен content_filter, ответ был отфильтрован. Не полагайтесь на код состояния HTTP.
2

Удаляйте завершающий отказ

Когда вывод прерывается на этапе генерации, текст заканчивается отказом на английском языке. Удалите его перед тем, как решить, что делать с частичным выводом.
3

Повторите попытку без потоковой передачи

Отправьте усеченную часть повторно в виде непотокового запроса, чтобы платформа могла автоматически переключить маршруты. Это оказывается успешным гораздо чаще, чем продолжение с потоковой передачей.
4

Перефразируйте, если блокировки продолжаются

Если для той же задачи завершается сбоем даже непотоковый запрос, опишите чувствительные детали более общими словами и повторите попытку. Не отправляйте тот же контент повторно без изменений.
Вот минимальный пример: чтение stream, удаление отказа при фильтрации и затем повторная попытка без потоковой передачи.
В этом примере весь ответ просто генерируется заново без потоковой передачи, что является самым простым подходом. Если в вашем рабочем процессе необходимо сохранить частичный вывод, передайте partial в качестве контекста и попросите модель продолжить, но отправьте это продолжение также без потоковой передачи.

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

Да. Провайдер фактически сгенерировал этот контент, поэтому он тарифицируется за фактические входные и выходные tokens. Для контента, который может вызывать срабатывание фильтрации, режим без потоковой передачи обходится дешевле: тарифицируется только успешная попытка.
Нет. Фильтрация применяется провайдером, и APIYI не может отключить её или изменить степень её строгости. Платформа может лишь повторить отфильтрованный запрос без потоковой передачи по другому официальному маршруту.
Строгость фильтрации между официальными маршрутами несколько различается, к тому же модель каждый раз формулирует ответ по-разному, поэтому пограничный контент в один раз может пройти, а в другой — оборваться. Явно чувствительный контент блокируется всегда.
Обрыв на этапе генерации происходит уже после того, как контент был отправлен, и ваш клиент уже получил и отобразил первую половину. Повторная генерация с нуля по другому маршруту в этот момент не будет соответствовать тому, что уже было показано. Поэтому запросы с потоковой передачей должны обрабатываться вашим клиентом, как только он обнаружит content_filter.

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

Как выглядит отказ модели OpenAI?

Формат ответа и его обнаружение при отказе самой модели

Вызовы с потоковой передачей и без потоковой передачи

Интеграция, тарификация и распространенные заблуждения для обоих режимов

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

Настройки тайм-аута для длинных ответов без потоковой передачи

Безопасность контента и соответствие требованиям

Политика платформы в отношении безопасности контента и соответствия требованиям