Tutoriel
Rejet pour politique de contenu HiAPI (CONTENT_POLICY_VIOLATION) : causes et correctifs
Comprendre ce code d'erreur, où le rencontrer, et comment modifier le contenu pour qu'il passe la validation
Lorsque vous soumettez une tâche de génération via l'interface unifiée de tâches asynchrones de HiAPI, si le prompt ou les ressources d'entrée ne passent pas la validation de sécurité, vous recevez le code d'erreur métier CONTENT_POLICY_VIOLATION. La documentation officielle le décrit comme « le contenu n'a pas passé la validation de sécurité », avec la recommandation de « modifier le prompt ou le contenu d'entrée puis réessayer ». Il ne s'agit ni d'un problème d'authentification, ni de solde, ni de paramètres — c'est le contenu lui-même qui a été bloqué. Cet article explique à quoi cela ressemble, où le voir, et comment le corriger.
I. Symptômes du problème
Le rejet pour politique de contenu se manifeste sous deux formes, selon que le blocage survient au stade de la soumission ou au stade de l'exécution de la tâche. CONTENT_POLICY_VIOLATION est un code d'erreur métier de l'interface asynchrone unifiée, partageant la même énumération que le error_code synchrone à la création de la tâche et le data.error.code de l'état terminal (il n'est pas marqué comme « uniquement à la création », il peut donc apparaître aux deux endroits).
Forme A : rejet synchrone à la création. Lors de l'appel à POST /v1/tasks, le contenu n'a pas passé la validation ; une enveloppe d'échec est renvoyée avec error_code à CONTENT_POLICY_VIOLATION. La forme de l'enveloppe est la suivante (conformément à la réponse d'échec de la documentation officielle, code est le statut HTTP et error_code le code métier) :
{
"code": 400,
"message": "...",
"data": null,
"error_code": "CONTENT_POLICY_VIOLATION"
}
Dans ce cas, vous n'obtenez pas de taskId — la tâche n'a jamais été créée.
Forme B : état terminal fail après exécution de la tâche. Vous avez déjà obtenu un taskId et la tâche a démarré avant d'être jugée non conforme. En interrogeant GET /v1/tasks/{taskId}, le HTTP reste 200 (le message de l'enveloppe est même success, ce qui signifie seulement « cette requête a réussi », pas que votre tâche a réussi) ; le véritable échec se cache dans data :
{
"code": 200,
"data": {
"taskId": "tk-hiapi-...",
"status": "fail",
"error": { "code": "CONTENT_POLICY_VIOLATION", "message": "..." }
},
"message": "success"
}
Règle de diagnostic en une phrase : ne vous fiez pas uniquement au code de statut HTTP. Lisez sur trois niveaux — statut HTTP (la requête a-t-elle été acceptée) → code d'erreur métier (error_code / data.error.code, pourquoi le rejet) → état de la tâche (où en est data.status). Dès que le champ code (le error_code de l'enveloppe synchrone ou le data.error.code de l'état terminal) vaut CONTENT_POLICY_VIOLATION, il s'agit d'un blocage par la modération de contenu, sans rapport avec un timeout, une rupture de lien ou une erreur de paramètre. Le texte de message peut varier légèrement selon le scénario ; le signal fiable est ce code, ne cherchez pas à faire correspondre le texte du message par expression régulière.
Dans le Playground / « essai en ligne » des pages de modèles, lorsqu'un blocage du même type se produit, la page affiche directement un message en ligne « n'a pas passé la validation de sécurité », plutôt que de vous laisser analyser le code vous-même — c'est la différence de présentation entre le parcours d'essai web (synchrone) et le parcours API que vous appelez par code.
II. Causes courantes (par probabilité décroissante)
- Le prompt contient du contenu non autorisé. Le plus courant. Les contenus NSFW / adultes, violence explicite ou sanglants sont bloqués par la validation de sécurité. Notez que de nombreux modèles ne prennent eux-mêmes explicitement pas en charge le contenu NSFW, et certains modèles (comme GPT Image 2) suivent en outre la politique de contenu de leur fournisseur (par exemple la politique de contenu d'OpenAI).
- Les images d'entrée / ressources de référence n'ont pas passé la validation. Dans les tâches image-vers-image (i2i) ou vidéo-vers-image de référence, ce n'est pas seulement le prompt qui est validé — les images que vous téléversez ou référencez, ainsi que les ressources de référence, doivent aussi passer la validation. Un prompt propre avec une image d'entrée non conforme donne quand même
CONTENT_POLICY_VIOLATION. - Après un changement de modèle, vous tombez sur une politique plus stricte. Les politiques de contenu varient en rigueur selon les modèles. Il est normal qu'un même prompt passe sur le modèle A et soit rejeté sur le modèle B, en particulier dans les domaines sensibles comme les portraits réalistes, les visages de célébrités, ou les ressources de marque / sous droits d'auteur.
- Confondre le rejet avec une autre erreur. Un véritable blocage de contenu est pris pour un « hoquet du service » et réessayé à l'identique encore et encore — le même contenu ne passera jamais, quel que soit le nombre de tentatives, c'est une attente inutile.
III. Étapes de correction
- Confirmez d'abord le code d'erreur. Lisez le code exact depuis le
error_codede la réponse synchrone ou ledata.error.codede l'état terminal. Vérifiez qu'il s'agit bien deCONTENT_POLICY_VIOLATIONet non deTASK_FAILED(échec générique, souvent un problème transitoire ou un lien d'image d'entrée inaccessible) ou deINVALID_REQUEST(corps de requête invalide). Le code différe, la correction diffère complètement. - Nettoyez le prompt point par point. Retirez les énoncés NSFW / adultes, violence explicite, etc., et remplacez-les par une formulation conforme avant de soumettre. La modification doit être ciblée, pas une suppression de mots au hasard.
- Vérifiez toutes les ressources d'entrée. En image-vers-image / génération de référence, remplacez les images d'entrée et de référence susceptibles de déclencher la validation — elles doivent passer la validation comme le prompt.
- Vérifiez la politique du modèle cible. Consultez les restrictions indiquées sur la page du modèle (par exemple la page du modèle GPT Image 2 indique clairement « ne prend pas en charge le contenu NSFW, suit la politique de contenu d'OpenAI ») ; si vous devez changer de modèle, comparez les capacités et politiques des modèles sur le marché des modèles.
- Réessayez après modification. La recommandation de la documentation pour ce code est précisément « modifier le prompt ou le contenu d'entrée puis réessayer ». À noter : une tâche échouée n'est pas facturée — le quota réservé à la création est intégralement remboursé lorsque la tâche atteint l'état terminal d'échec ; la tâche bloquée par la validation ne coûte donc rien en elle-même ; mais soumettre à l'identique le même contenu non conforme ne passera pas, modifiez d'abord puis soumettez.
IV. Exemple de vérification minimale
Pour écarter d'abord l'hypothèse « est-ce ma clé / mon intégration qui pose problème », lancez un POST /v1/tasks avec un prompt manifestement conforme et voyez si vous obtenez normalement un taskId (utilisez l'id brut gpt-image-2 pour model) :
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" }
}'
- Retourne
{"code":200,"data":{"taskId":"tk-hiapi-..."}}→ votre clé et votre intégration fonctionnent ; le problème de la requête précédemment rejetée est donc dans le contenu ; revenez à la section III pour nettoyer le prompt / l'image d'entrée. - Retourne
HTTP 401+{"error":{"code":"permission_denied",...}}→ c'est un problème d'authentification (clé incorrecte /Authorization: Bearerabsent), pas une politique de contenu. - Même un prompt conforme renvoie
error_code: "CONTENT_POLICY_VIOLATION"→ cas plutôt rare ; réexaminez si ce prompt contient des mots sensibles que vous auriez négligés, ou essayez une description plus neutre.
V. Pour aller plus loin
- Tableau complet des codes d'erreur métier de l'interface asynchrone unifiée (y compris la signification et les recommandations de traitement pour
CONTENT_POLICY_VIOLATION,TASK_FAILED,INVALID_REQUEST, etc.) : documentation de l'interface asynchrone unifiée. - Pour vérifier les restrictions de contenu d'un modèle : consultez la page du modèle correspondante ou le marché des modèles.
VI. FAQ
Q : Quelle est la différence entre CONTENT_POLICY_VIOLATION et TASK_FAILED ?
R : Le premier signifie que le contenu n'a pas passé la validation de sécurité ; la correction consiste à modifier le prompt / les ressources d'entrée. Le second est un échec générique, dont la cause la plus courante est un lien URL d'image / vidéo d'entrée inaccessible ou une fluctuation transitoire ; la correction consiste à corriger l'URL / réessayer. Ce sont deux codes d'erreur métier différents, ne les confondez pas. Il suffit de lire error.code pour les distinguer.
Q : Une tâche rejetée pour politique de contenu me sera-t-elle facturée ? R : Non. Selon la documentation, lorsque la tâche atteint l'état terminal d'échec, le quota réservé à la création est intégralement remboursé. Une tâche bloquée par la validation ne génère aucun frais en elle-même.
Q : Pourquoi le même prompt affiche-t-il un message explicite « n'a pas passé la validation » dans « l'essai en ligne » du site web, alors qu'avec l'API je n'obtiens qu'un code ?
R : L'essai web est un parcours synchrone, qui affiche directement le résultat de la validation sous forme de message en ligne ; le parcours API place le résultat dans error_code / data.error.code du corps de réponse, à charge pour votre code de le lire et de brancher. L'information est identique, seule la présentation diffère.
Q : Je n'ai modifié que le prompt, pas l'image d'entrée, pourquoi est-ce encore rejeté ? R : La validation de sécurité couvre les ressources d'entrée, pas seulement le prompt. En image-vers-image / génération de référence, remplacez d'abord les images d'entrée et de référence susceptibles de déclencher la validation.
Q : HiAPI dispose-t-il d'une page publique « politique de contenu » consultable ? R : Il n'existe pas de page de politique de contenu indépendante. Les restrictions de contenu de chaque modèle figurent sur la page du modèle correspondant (par exemple « ne prend pas en charge le contenu NSFW ») ; les conditions au niveau de la plateforme se trouvent dans les conditions de service et la politique de confidentialité.
Q : Des tentatives répétées peuvent-elles « finir par passer » ? R : Non. Le même contenu non conforme ne passera jamais, quel que soit le nombre de tentatives, cela ne fait qu'occuper inutilement le polling. Modifiez d'abord le contenu selon la section III, puis soumettez.
Articles similaires
Voir tous les articles →-
Tutoriel
Comment appeler hailuo-2.3-fast/image-to-video via l'API HiAPI : curl et Python en pratique
La première requête exploitable du palier image-vers-vidéo rapide et économique — de l'ID du modèle au téléchargement du MP4
-
Tutoriel
Comment appeler hailuo-2.3/text-to-video via l'API HiAPI : curl, Python et exemples de requêtes exécutables
-
Tutoriel
Utiliser Kandinsky 6.0 Pro texte-vers-vidéo sur HiAPI : tutoriel curl et Python
Démonstration pratique axée sur la requête : construire l'appel du prompt au clip vidéo, soumettre la requête, interroger l'état d'achèvement et télécharger le résultat