Tutoriel
Comment changer le style d'une image avec l'IA : guide de transfert de style image-vers-image avec l'API hiapi
Changer le style d'une photo avec l'IA — transformer un cliché pris sur le vif en image d'animation, en photo produit de studio ou en illustration aquarelle — ne relève pas d'un point de terminaison « transfert de style » spécial. C'est simplement un appel image-vers-image ordinaire : vous envoyez une image source et une instruction textuelle indiquant le style cible, et le modèle renvoie une nouvelle image. Ce qui détermine si vous obtenez un changement de style propre ou une régénération partielle, c'est la façon dont vous rédigez cette instruction, et non un paramètre ajustable. Ce guide couvre le mécanisme de requête sur l'API unifiée tasks de hiapi, les schémas de prompt qui empêchent un changement de style de dériver vers une nouvelle image, et comment choisir entre deux modèles image-vers-image validés selon le degré de liberté créative que vous souhaitez.
Ce dont vous avez besoin
- Une clé API hiapi — à récupérer depuis votre tableau de bord. Elle est placée dans l'en-tête
Authorization: Bearer sk-...de chaque requête. - Une URL d'image source accessible publiquement. Les serveurs de hiapi récupèrent l'image eux-mêmes, donc un chemin
localhostou un bucket privé sans URL signée ne fonctionnera pas. Les URL S3/R2/GCS pré-signées, en revanche, sont acceptées.
Chaque identifiant de modèle et chaque champ ci-dessous ont été revérifiés sur l'API en production avant publication, y compris via une sonde forçant une erreur afin de confirmer les valeurs d'énumération actuelles.
Pourquoi un changement de style exige une « clause de préservation »
Aucun des deux modèles de ce guide ne propose de paramètre numérique d'intensité ou de force — en envoyer un (strength: 0.5) est directement rejeté, avec l'erreur additional properties 'strength' not allowed. L'intensité du style est entièrement contrôlée par la formulation du prompt, ce qui signifie qu'une instruction comme "make this a Studio Ghibli anime frame" indique seulement au modèle ce qu'il faut ajouter, sans lui dire ce qui doit rester inchangé — l'identité du sujet, la pose et la composition peuvent être librement réinterprétées par le modèle.
La solution consiste à toujours écrire deux propositions dans le prompt :
- Le style cible, énoncé avec une référence visuelle concrète (un médium, un courant artistique, un rendu précis — « anime cel-shading », « 1970s film photography », « clean studio product shot on white »), plutôt qu'avec un adjectif vague comme « plus cool ».
- Une clause de préservation explicite — qui nomme ce qui ne doit pas changer : « keep the same subject, pose, and composition », « keep the text and logo unchanged », « keep the camera angle ».
Un prompt comme "Restyle this photo as a woodblock print. Keep the subject's pose, framing, and the position of every object in the scene." donne au modèle à la fois un objectif et une contrainte dans la même instruction : c'est le levier le plus efficace pour obtenir un changement de style plutôt qu'une régénération.
Exemple minimal fonctionnel : curl
Cet exemple utilise seedream-5.0-pro/image-to-image, qui réussit très bien les changements de style et possède un schéma strict, entièrement validé :
curl -s -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer sk-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedream-5.0-pro/image-to-image",
"input": {
"prompt": "Restyle this portrait as a watercolor painting with visible brush texture and soft bleeding edges. Keep the subject'\''s pose, expression, and framing exactly as in the source.",
"image_urls": ["https://your-bucket.example.com/portrait.jpg"],
"aspect_ratio": "3:4",
"resolution": "2K"
}
}'
aspect_ratio est obligatoire et provient d'une énumération fixe — actuellement 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9. Ce point de terminaison n'a pas d'option « correspondre à l'image source », donc choisissez la valeur la plus proche du ratio réel de l'image source (photo portrait → 3:4 ou 9:16, plutôt que 16:9), afin d'éviter que le modèle n'ajoute des marges ou ne recadre la composition pour s'adapter.
Une création réussie renvoie l'identifiant de tâche dans data.taskId :
{ "data": { "taskId": "<your-task-id>" } }
Interrogez ensuite jusqu'à l'état terminal :
curl -s https://api.hiapi.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer sk-YOUR_KEY"
data.status finit par valoir success (sortie dans data.output[0].url) ou fail (détails dans data.error).
Script Python complet : créer, interroger, télécharger
Uniquement avec la bibliothèque standard :
import json
import time
import urllib.request
API = "https://api.hiapi.ai/v1/tasks"
KEY = "sk-YOUR_KEY"
def call(url, payload=None):
req = urllib.request.Request(
url,
data=json.dumps(payload).encode() if payload is not None else None,
headers={
"Authorization": f"Bearer {KEY}",
"Content-Type": "application/json",
},
method="POST" if payload is not None else "GET",
)
with urllib.request.urlopen(req) as resp:
return json.load(resp)
# 1. Create the restyle task
create = call(API, {
"model": "seedream-5.0-pro/image-to-image",
"input": {
"prompt": (
"Restyle this street photo as a 1980s film-grain photograph with warm, "
"faded colors. Keep the same subject, pose, and every object in the "
"same position in the frame."
),
"image_urls": ["https://your-bucket.example.com/street.jpg"],
"aspect_ratio": "16:9",
"resolution": "2K",
},
})
task_id = create["data"]["taskId"]
print("task created:", task_id)
# 2. Poll until terminal state
while True:
task = call(f"{API}/{task_id}")["data"]
if task["status"] == "success":
break
if task["status"] == "fail":
err = task.get("error") or {}
raise RuntimeError(f"task failed: {err.get('code')} {err.get('message')}")
time.sleep(5)
# 3. Download immediately -- output URLs expire
image_url = task["output"][0]["url"]
urllib.request.urlretrieve(image_url, "restyled.png")
print("saved restyled.png")
Choisir un modèle selon la liberté créative souhaitée
Les deux modèles ont été revérifiés en ligne et aucun n'accepte de paramètre strength, mais ils diffèrent par le degré de contrôle que vous avez sur l'influence de l'image source :
seedream-5.0-pro/image-to-image |
grok-imagine-quality/image-to-image |
|
|---|---|---|
| Images de référence | 1 à 10 URL publiques | 1 à 3 URL publiques |
resolution |
1K / 2K (majuscules) |
1k / 2k (minuscules) — facultatif |
| Contrôle de la composition | énumération fixe à 8 valeurs pour aspect_ratio, pas de correspondance automatique |
aspect_ratio: "auto" suit le cadre de l'entrée |
| Idéal pour | un changement de style précis à partir d'une seule référence, lorsque vous connaissez déjà le ratio cible | un changement de style rapide, quand vous voulez que la sortie hérite de la composition exacte de la source sans choisir de ratio vous-même |
Si votre clause de préservation contient « same framing » et que vous ne voulez pas calculer manuellement le rapport hauteur/largeur de l'image source, utiliser grok-imagine-quality/image-to-image avec aspect_ratio: "auto" est la voie la plus directe — remplacez-le dans la requête ci-dessus, avec jusqu'à 3 valeurs dans image_urls et resolution réglé sur 2k en minuscules.
Points d'attention pour la production
Sur un serveur, privilégiez le callback à l'interrogation répétée. Ajoutez un objet callback au moment de la requête, et hiapi effectuera un POST unique à l'état terminal, sans que vous ayez à interroger le service :
{
"model": "seedream-5.0-pro/image-to-image",
"input": { "...": "..." },
"callback": { "url": "https://your-server.example.com/hiapi-hook", "when": "final" }
}
Considérez la charge utile du callback comme un signal, non comme une source de vérité — récupérez-en l'identifiant de tâche et refaites vous-même un GET /v1/tasks/<id> avant d'agir. Pour les scripts et les notebooks, une interrogation toutes les 5 secondes suffit.
Rendez les tentatives idempotentes. Lors de la création de la tâche, stockez votre propre correspondance image source → taskId. Si votre processus plante en cours d'interrogation, il doit, au redémarrage, se raccrocher au taskId stocké plutôt que de resoumettre — une resoumission est une seconde tâche facturée.
Les erreurs que vous rencontrerez réellement :
401permission_denied— clé mal formée ou absente. L'en-tête doit être exactementAuthorization: Bearer sk-....400INVALID_REQUEST— violation du schéma, par exempleaspect_ratio: value must be one of '1:1', '4:3', ...ouadditional properties 'strength' not allowed. Les schémas des deux modèles sont stricts — ne transposez pas les paramètres d'une famille de modèles à l'autre.image_urls must be an array— vous avez passé une chaîne nue au lieu d'une liste, même pour une seule image de référence.
Lectures associées
- Référence champ par champ complète du modèle principal de ce guide : Comment utiliser seedream-5.0-pro/image-to-image.
- Des prompts de changement de style prêts à copier, avec de vrais résultats avant/après : Recettes de prompts image-vers-image pour Grok Imagine Quality.
- Comparaison de la qualité de sortie entre modèles sur une même édition : Les meilleures API image-vers-image en 2026.
- Tarification actuelle par image : page de tarification.
- Référence API complète : documentation hiapi.
Questions fréquentes
Le transfert de style dispose-t-il d'un curseur d'intensité ou de force ?
Non. Aucun des deux modèles de ce guide n'accepte le champ strength — l'envoyer est considéré comme une propriété non reconnue et rejeté. L'intensité du style est contrôlée uniquement par le degré de précision et de force de la description stylistique dans le prompt.
Comment empêcher le modèle de modifier la pose ou l'identité de mon sujet ? Ajoutez au prompt une clause de préservation explicite nommant ce qui doit rester inchangé — pose, expression, composition, position des objets. Lorsque les contraintes sont écrites explicitement plutôt que suggérées, le modèle reste plus conservateur dans son changement de style.
Puis-je conserver automatiquement le rapport hauteur/largeur exact de l'image source ?
Oui avec grok-imagine-quality/image-to-image — réglez aspect_ratio: "auto". Avec seedream-5.0-pro/image-to-image, il n'y a pas d'option automatique ; choisissez dans son énumération fixe la valeur la plus proche du ratio réel de l'image source.
Mes images source doivent-elles être des URL publiques ?
Elles doivent être récupérables par les serveurs de hiapi via HTTPS. Les URL pré-signées de buckets privés conviennent ; les chemins localhost ou non authentifiés et inaccessibles ne conviennent pas.
Puis-je générer en parallèle plusieurs variantes de style à partir d'une même photo ?
Oui — chaque variante est une tâche indépendante. Lancez plusieurs appels POST /v1/tasks avec les mêmes image_urls et des instructions de style différentes, puis interrogez ou utilisez un callback pour chaque taskId.
Quelle différence entre changer le style et faire de l'inpainting ou de la suppression d'objet ? Le changement de style modifie le rendu de toute l'image tout en conservant le contenu ; l'inpainting ou la suppression d'objet modifie des zones précises tout en conservant le style de rendu. Ce sont des schémas de prompt différents sur la même catégorie de point de terminaison image-vers-image — si vous avez en réalité besoin d'inpainting et de suppression d'objet, consultez le guide de l'inpainting et de la suppression d'objet.
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