HiAPI
Blog

Tutorial

Cómo cambiar el estilo de una imagen con IA: guía de transferencia de estilo imagen a imagen con la API de hiapi

Sep 4, 2026
Cómo cambiar el estilo de una imagen con IA: guía de transferencia de estilo imagen a imagen con la API de hiapi

Cambiar el estilo de una foto con IA —convertir una toma casual en un fotograma de anime, una foto de producto de estudio o una ilustración en acuarela— no es un endpoint especial de "transferencia de estilo". Es simplemente una llamada normal de imagen a imagen: envías una imagen de origen y una instrucción de texto que indica el estilo objetivo, y el modelo devuelve una nueva imagen. Lo que realmente determina si obtienes un cambio de estilo limpio o una regeneración a medias es cómo redactas esa instrucción, no algún parámetro ajustable. Esta guía describe el mecanismo de solicitud en la API unificada de tareas de hiapi, el patrón de prompt que evita que el cambio de estilo se desvíe hacia una imagen nueva, y cómo elegir entre dos modelos de imagen a imagen verificados según cuánta libertad creativa desees.

\n

Qué necesitas preparar

\n
    \n
  1. Una clave de API de hiapi: obténla desde tu panel de control. Se coloca en el encabezado Authorization: Bearer sk-... de cada solicitud.
  2. \n
  3. Una URL de imagen de origen accesible públicamente. Los servidores de hiapi descargan la imagen por sí mismos, por lo que las rutas localhost o los buckets privados sin URL firmada no funcionarán. Las URL prefirmadas de S3/R2/GCS sí sirven.
  4. \n
\n

Cada id de modelo y campo a continuación se revalidó contra la API en línea antes de publicarse, incluida una prueba de error forzado para confirmar los valores de enumeración actuales.

\n

Por qué el cambio de estilo necesita una "cláusula de conservación"

\n

Ninguno de los dos modelos de esta guía ofrece un parámetro numérico de intensidad o fuerza: enviar uno (strength: 0.5) se rechaza directamente con el error additional properties 'strength' not allowed. La intensidad del estilo se controla completamente mediante la redacción del prompt, lo que significa que una instrucción como "make this a Studio Ghibli anime frame" solo le dice al modelo qué añadir, pero no qué mantener sin cambios: la identidad del sujeto, la pose y la composición pueden ser reinterpretadas libremente por el modelo.

\n

La solución es escribir siempre dos cláusulas en el prompt:

\n
    \n
  1. Estilo objetivo, expresado con una referencia visual concreta (un medio, un género artístico, una apariencia específica: "anime cel-shading", "1970s film photography", "clean studio product shot on white"), en lugar de adjetivos vagos como "cooler".
  2. \n
  3. Una cláusula de conservación explícita: nombra lo que no debe cambiar: "keep the same subject, pose, and composition", "keep the text and logo unchanged", "keep the camera angle".
  4. \n
\n

Un prompt como "Restyle this photo as a woodblock print. Keep the subject's pose, framing, and the position of every object in the scene." le da al modelo un objetivo y una restricción en la misma instrucción, que es la mayor palanca para obtener un cambio de estilo en lugar de una regeneración.

\n

Ejemplo mínimo funcional: curl

\n

Este ejemplo usa seedream-5.0-pro/image-to-image, que funciona bien para cambiar el estilo y tiene un esquema estricto y completamente validado:

\n
curl -s -X POST https://api.hiapi.ai/v1/tasks \\\n  -H "Authorization: Bearer sk-YOUR_KEY" \\\n  -H "Content-Type: application/json" \\\n  -d '{\n    "model": "seedream-5.0-pro/image-to-image",\n    "input": {\n      "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.",\n      "image_urls": ["https://your-bucket.example.com/portrait.jpg"],\n      "aspect_ratio": "3:4",\n      "resolution": "2K"\n    }\n  }'\n
\n

aspect_ratio es obligatorio y proviene de una enumeración fija: actualmente 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9. Este endpoint no tiene una opción de "coincidir con la imagen de origen", así que elige el valor más cercano a la proporción real de la imagen de origen (foto vertical → 3:4 o 9:16, no 16:9) para evitar que el modelo añada bordes o recorte la composición para adaptarla.

\n

Tras crearse correctamente, devuelve el id de tarea en data.taskId:

\n
{ "data": { "taskId": "<your-task-id>" } }\n
\n

Consulta repetidamente hasta llegar al estado terminal:

\n
curl -s https://api.hiapi.ai/v1/tasks/YOUR_TASK_ID \\\n  -H "Authorization: Bearer sk-YOUR_KEY"\n
\n

data.status termina siendo success (la salida está en data.output[0].url) o fail (los detalles están en data.error).

\n

Script completo de Python: crear, consultar, descargar

\n

Usa solo la biblioteca estándar:

\n
import json\nimport time\nimport urllib.request\n\nAPI = "https://api.hiapi.ai/v1/tasks"\nKEY = "sk-YOUR_KEY"\n\n\ndef call(url, payload=None):\n    req = urllib.request.Request(\n        url,\n        data=json.dumps(payload).encode() if payload is not None else None,\n        headers={\n            "Authorization": f"Bearer {KEY}",\n            "Content-Type": "application/json",\n        },\n        method="POST" if payload is not None else "GET",\n    )\n    with urllib.request.urlopen(req) as resp:\n        return json.load(resp)\n\n\n# 1. Create the restyle task\ncreate = call(API, {\n    "model": "seedream-5.0-pro/image-to-image",\n    "input": {\n        "prompt": (\n            "Restyle this street photo as a 1980s film-grain photograph with warm, "\n            "faded colors. Keep the same subject, pose, and every object in the "\n            "same position in the frame."\n        ),\n        "image_urls": ["https://your-bucket.example.com/street.jpg"],\n        "aspect_ratio": "16:9",\n        "resolution": "2K",\n    },\n})\ntask_id = create["data"]["taskId"]\nprint("task created:", task_id)\n\n# 2. Poll until terminal state\nwhile True:\n    task = call(f"{API}/{task_id}")["data"]\n    if task["status"] == "success":\n        break\n    if task["status"] == "fail":\n        err = task.get("error") or {}\n        raise RuntimeError(f"task failed: {err.get('code')} {err.get('message')}")\n    time.sleep(5)\n\n# 3. Download immediately -- output URLs expire\nimage_url = task["output"][0]["url"]\nurllib.request.urlretrieve(image_url, "restyled.png")\nprint("saved restyled.png")\n
\n

Elige el modelo según la libertad creativa que desees

\n

Ambos modelos se revalidaron en línea y ninguno acepta el parámetro strength, pero difieren en cuánto puedes controlar la influencia de la imagen de origen:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
seedream-5.0-pro/image-to-imagegrok-imagine-quality/image-to-image
Imágenes de referencia1–10 URL públicas1–3 URL públicas
resolution1K / 2K (mayúsculas)1k / 2k (minúsculas) — opcional
Control de composiciónEnumeración fija de 8 valores de aspect_ratio, sin coincidencia automáticaaspect_ratio: "auto" sigue el encuadre de entrada
Ideal paraCambio de estilo preciso con una sola referencia, cuando ya conoces la proporción objetivoCambio de estilo rápido en el que deseas que la salida herede la composición exacta de la imagen de origen sin elegir la proporción manualmente
\n

Si tu cláusula de conservación incluye "same framing" y no quieres calcular manualmente la relación de aspecto de la imagen de origen, usar grok-imagine-quality/image-to-image con aspect_ratio: "auto" es la ruta más directa: sustitúyelo en la solicitud anterior, con image_urls de hasta 3 elementos y resolution en minúsculas 2k.

\n

Consideraciones para producción

\n

En el servidor, prioriza las devoluciones de llamada sobre el sondeo. Añade un objeto callback al solicitar y hiapi hará un POST una vez al llegar al estado terminal, sin que tengas que sondear:

\n
{\n  "model": "seedream-5.0-pro/image-to-image",\n  "input": { "...": "..." },\n  "callback": { "url": "https://your-server.example.com/hiapi-hook", "when": "final" }\n}\n
\n

Trata la carga útil de la devolución de llamada como una señal y no como la fuente de la verdad: obtén de ella el id de tarea y vuelve a obtener GET /v1/tasks/<id> por tu cuenta antes de actuar. Para scripts y notebooks, sondear cada 5 segundos es suficiente.

\n

Haz que los reintentos sean idempotentes. Al crear una tarea, almacena tu propio mapeo imagen de origen → taskId. Si tu proceso se cae a mitad del sondeo, al reiniciar debes reasociar el taskId almacenado en lugar de reenviar la solicitud, ya que reenviarla supone una segunda tarea facturada.

\n

Errores que encontrarás en la práctica:

\n
    \n
  • 401 permission_denied: clave con formato incorrecto o ausente. El encabezado debe ser exactamente Authorization: Bearer sk-....
  • \n
  • 400 INVALID_REQUEST: infracción del esquema, por ejemplo aspect_ratio: value must be one of '1:1', '4:3', ... o additional properties 'strength' not allowed. Los esquemas de ambos modelos son estrictos: no apliques parámetros de una familia de modelos a otra.
  • \n
  • image_urls must be an array: se pasó una cadena sin formato de lista en lugar de una lista, incluso con una sola imagen de referencia.
  • \n
\n

Lecturas relacionadas

\n\n

Preguntas frecuentes

\n

¿La transferencia de estilo tiene un control deslizante de intensidad o fuerza?\nNo. Ninguno de los dos modelos de esta guía acepta el campo strength: enviarlo se rechaza como propiedad no reconocida. La intensidad del estilo se controla completamente mediante la especificidad y la fuerza de la descripción del estilo en el prompt.

\n

¿Cómo evito que el modelo cambie la pose o la identidad de mi sujeto?\nAñade al prompt una cláusula de conservación explícita que nombre lo que debe permanecer sin cambios: pose, expresión, composición, posición de los objetos. Cuando las restricciones se escriben explícitamente en lugar de sugerirse, el modelo es más conservador al cambiar el estilo.

\n

¿Puedo conservar automáticamente la relación de aspecto exacta de la imagen de origen?\nEn grok-imagine-quality/image-to-image sí: establece aspect_ratio: "auto". En seedream-5.0-pro/image-to-image no hay opción automática; elige de su enumeración fija el valor más cercano a la proporción real de la imagen de origen.

\n

¿Mi imagen de origen debe ser una URL pública?\nDebe poder ser descargada por los servidores de hiapi mediante HTTPS. Las URL prefirmadas de buckets privados sirven; las rutas localhost o no autenticadas e inaccesibles no.

\n

¿Puedo generar varias variantes de estilo a partir de una foto en paralelo?\nSí: cada variante es una tarea independiente. Lanza varias llamadas POST /v1/tasks con los mismos image_urls y distintas instrucciones de estilo, y luego sondea o usa devoluciones de llamada para cada taskId por separado.

\n

¿Cuál es la diferencia entre cambiar el estilo y el retoque o la eliminación de objetos?\nCambiar el estilo modifica cómo se renderiza toda la imagen mientras mantiene el contenido igual; el retoque o la eliminación de objetos modifica zonas específicas mientras mantiene el estilo de renderizado igual. Son patrones de prompt diferentes en el mismo tipo de endpoint de imagen a imagen. Si lo que realmente necesitas es retoque y eliminación de objetos, consulta la guía de retoque y eliminación de objetos.

\n

Artículos relacionados

Ver todos los artículos →

Empieza a crear con artefactos de IA persistentes

Consigue tu API key y llama a modelos de imagen, vídeo y audio a través de una única API basada en tasks.

Leer la documentación de la API