Руководство
Отказ по контентной политике HiAPI (CONTENT_POLICY_VIOLATION): причины и исправление
Разбираем этот код ошибки, где его увидеть и как доработать контент до прохождения проверки
При отправке задачи генерации в единый асинхронный API HiAPI, если промпт или входные материалы не прошли проверку безопасности, вы получите бизнес-код ошибки CONTENT_POLICY_VIOLATION. Официальная документация описывает его как «контент не прошёл проверку безопасности», а рекомендация по устранению — «изменить промпт или входной контент и повторить попытку». Это не проблема аутентификации, не проблема баланса или параметров — заблокирован сам контент. В этой статье разберём, как это выглядит, где его увидеть и как исправить.
I. Симптомы проблемы
Отказ по контентной политике встречается в двух формах в зависимости от того, произошла ли блокировка на этапе отправки или на этапе выполнения задачи. CONTENT_POLICY_VIOLATION — это бизнес-код ошибки единого асинхронного API; он использует тот же набор перечислений, что и синхронный error_code при создании задачи, и data.error.code в терминальном состоянии задачи (он не помечен как «только при создании», поэтому может появляться в обоих местах).
Форма A: синхронный отказ при создании. При вызове POST /v1/tasks контент не прошёл проверку, возвращается конверт ошибки, где error_code равен CONTENT_POLICY_VIOLATION. Форма конверта следующая (по официальной документации неуспешного ответа: code — HTTP-статус, error_code — бизнес-код):
{
"code": 400,
"message": "...",
"data": null,
"error_code": "CONTENT_POLICY_VIOLATION"
}
В этом случае получить taskId невозможно — задача вообще не создалась.
Форма B: терминальное состояние fail после запуска задачи. taskId уже получен, задача запущена, и только потом вынесено решение о несоответствии. При опросе GET /v1/tasks/{taskId} HTTP по-прежнему 200 (поле message конверта может быть даже success — это означает лишь «данный запрос успешен», а не успех вашей задачи), а реальная ошибка скрыта в data:
{
"code": 200,
"data": {
"taskId": "tk-hiapi-...",
"status": "fail",
"error": { "code": "CONTENT_POLICY_VIOLATION", "message": "..." }
},
"message": "success"
}
Правило определения в одном предложении: не смотрите только на HTTP-статус. Читайте в три уровня — HTTP-статус (принят ли запрос) → бизнес-код ошибки (error_code / data.error.code, почему отказано) → состояние задачи (data.status, на каком шаге остановилась). Если поле code (синхронный error_code или терминальный data.error.code) равно CONTENT_POLICY_VIOLATION, это блокировка модерацией контента, и это совсем не то же самое, что таймаут, обрыв соединения или ошибка параметров. Текст message может немного отличаться в зависимости от ситуации; стабильный сигнал для определения — этот код, не пытайтесь сопоставлять текст message регулярными выражениями.
При срабатывании аналогичной блокировки в Playground / «Онлайн-попытке» на странице модели страница сразу показывает встроенное сообщение «не прошло проверку безопасности», а не передаёт вам код для самостоятельного разбора — это разница в представлении между веб-путём попытки (синхронным) и API-путём, который вы вызываете из кода.
II. Частые причины (по убыванию вероятности)
- В промпте есть недопустимый контент. Самое частое. NSFW / взрослый контент, откровенное насилие и кровь и т.п. блокируются проверкой безопасности. Учтите, что многие модели сами по себе явно не поддерживают NSFW-контент, а некоторые модели (например, GPT Image 2) также следуют контентной политике своего разработчика (например, контентной политике OpenAI).
- Входное изображение / референсный материал не прошёл проверку. В задачах вроде image-to-image (i2i) и генерации видео по референсному изображению проверяется не только промпт — загруженные или указанные вами изображения и референсные материалы тоже должны пройти проверку. Промпт чистый, но входное изображение не соответствует правилам — всё равно
CONTENT_POLICY_VIOLATION. - После смены модели вы наткнулись на более строгую политику. Контентные политики разных моделей различаются по строгости. Один и тот же промпт может пройти на модели A и быть отклонён на модели B — это нормально, особенно в чувствительных направлениях вроде реалистичных портретов, изображений знаменитостей, брендовых / защищённых авторским правом материалов.
- Отказ ошибочно принят за другую ошибку. Настоящая блокировка контента воспринимается как «сбой сервиса» и повторяется с тем же содержимым снова и снова — сколько ни повторяй одинаковый контент, он не пройдёт, вы просто зря ждёте.
III. Шаги исправления
- Сначала подтвердите код ошибки. Считайте точный код из синхронного ответа
error_codeили из терминальногоdata.error.code. Убедитесь, что этоCONTENT_POLICY_VIOLATION, а неTASK_FAILED(общий сбой, чаще всего из-за временных проблем или недоступности ссылки на входное изображение) и неINVALID_REQUEST(некорректное тело запроса). Разные коды — совершенно разные способы исправления. - Почистите промпт по пунктам. Уберите формулировки NSFW / взрослого характера, откровенного насилия и т.п., замените на допустимые и отправьте снова. Изменения должны быть целенаправленными, а не случайным удалением слов.
- Проверьте все входные материалы. При image-to-image / генерации по референсу замените входные и референсные изображения, которые могут вызвать проверку — они, как и промпт, должны пройти модерацию.
- Сверьтесь с политикой целевой модели. Посмотрите на странице этой модели её ограничения (например, страница модели GPT Image 2 явно указывает «не поддерживает NSFW-контент, следует контентной политике OpenAI»); если нужно сменить модель, сравните возможности и политики моделей в маркетплейсе моделей.
- Повторите попытку после исправления. Рекомендация документации по этому коду — «изменить промпт или входной контент и повторить попытку». Учтите: за неуспешные задачи плата не взимается — зарезервированная при создании сумма полностью возвращается после перехода задачи в терминальное состояние fail, так что сама заблокированная задача не стоит денег; но повторная отправка того же нарушающего контента без изменений не пройдёт — сначала измените, потом отправляйте.
IV. Минимальный пример проверки
Если хотите сначала исключить «проблему с моим ключом / подключением», отправьте один запрос POST /v1/tasks с явно допустимым промптом и посмотрите, получается ли нормально taskId (model — голый id gpt-image-2):
curl -s -X POST "https://api.hiapi.ai/v1/tasks" \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"input": { "prompt": "a cozy coffee shop storefront at sunrise, warm light" }
}'
- Возвращает
{"code":200,"data":{"taskId":"tk-hiapi-..."}}→ ваш ключ и подключение в порядке; значит, проблема в том отклонённом запросе — в контенте, вернитесь к разделу III и почистите промпт / входное изображение. - Возвращает
HTTP 401+{"error":{"code":"permission_denied",...}}→ это проблема аутентификации (неверный ключ / не переданAuthorization: Bearer), а не контентная политика. - Даже допустимый промпт возвращает
error_code: "CONTENT_POLICY_VIOLATION"→ бывает редко; пересмотрите, нет ли в промпте упущенных вами чувствительных слов, или попробуйте более нейтральное описание.
V. Дополнительное чтение
- Полная таблица бизнес-кодов ошибок единого асинхронного API (с описанием значений и рекомендаций по устранению для
CONTENT_POLICY_VIOLATION,TASK_FAILED,INVALID_REQUESTи др.): документация единого асинхронного API. - Если нужно уточнить контентные ограничения модели: смотрите на соответствующей странице модели или в маркетплейсе моделей.
VI. FAQ
Вопрос: В чём разница между CONTENT_POLICY_VIOLATION и TASK_FAILED?
Ответ: Первый — контент не прошёл проверку безопасности, способ исправления — изменить промпт / входные материалы; второй — общий сбой, чаще всего из-за недоступности URL входного изображения / видео или временных колебаний, способ исправления — исправить URL / повторить. Это разные бизнес-коды ошибок, не путайте. Различить можно, прочитав error.code.
Вопрос: Спишутся ли с меня деньги, если задача отклонена по контентной политике? Ответ: Нет. Согласно документации, после перехода задачи в терминальное состояние fail зарезервированная при создании сумма возвращается полностью. Сама заблокированная задача не создаёт расходов.
Вопрос: Почему для одного и того же промпта на веб-странице «Онлайн-попытка» видно явное сообщение «не прошло проверку», а через API я получаю только код?
Ответ: Веб-попытка — синхронный путь, результат проверки отображается сразу встроенным сообщением; API-путь передаёт результат в теле ответа в error_code / data.error.code, и ваш код должен его прочитать и обработать. Информация одинакова, различается только способ представления.
Вопрос: Я изменил только промпт, входное изображение не трогал — почему всё равно отказ? Ответ: Проверка безопасности охватывает входные материалы, а не только промпт. При image-to-image / генерации по референсу сначала замените входные и референсные изображения, которые могут вызвать проверку.
Вопрос: Есть ли у HiAPI публичная страница «Контентная политика», где это можно посмотреть? Ответ: Отдельной страницы контентной политики нет. Контентные ограничения каждой модели указаны на странице этой модели (например, «не поддерживает NSFW-контент»), а условия на уровне платформы — в Условиях обслуживания и Политике конфиденциальности.
Вопрос: Можно ли «проскочить» повторными попытками? Ответ: Нет. Сколько ни повторяй одинаковый нарушающий контент, он не пройдёт — только зря потратите опросы. Сначала измените контент по разделу III, потом отправляйте.
Похожие статьи
Все статьи →-
Руководство
Как вызвать hailuo-2.3-fast/image-to-video через HiAPI API: практика с curl и Python
Первый рабочий запрос к быстрому и недорогому уровню генерации видео по изображению — от ID модели до загрузки MP4
-
Руководство
Как вызывать hailuo-2.3/text-to-video через API HiAPI: curl, Python и рабочие примеры запросов
-
Руководство
Использование Kandinsky 6.0 Pro для преобразования текста в видео на HiAPI: руководство по curl и Python
Практическая демонстрация с упором на запросы: построение вызова от промпта до видеоклипа, отправка запроса, опрос статуса завершения и скачивание результата