Ir al contenido principal

Ejecuta tu propia LoRA en una API alojada: una URL en lugar de una cola de subida

Ejecuta una LoRA entrenada en una API alojada de Qwen Image con una URL: sin subida, con script, precios por imagen y qué enlaces fallan ya o más tarde.

Autor
SpicyAPI Engineering
Publicado
Lectura
15 min de lectura
Actualizado
Un invernadero de acuarela en invierno visto desde fuera al anochecer, luz cálida tras el vidrio empañado, nieve en los marcos y una bicicleta apoyada en la puerta

Un ejemplo publicado de LoRA de Qwen Image 2.1: un peso de estilo cargado mediante el campo loras.

Tienes una LoRA entrenada en .safetensors en un bucket o en un repositorio de Hugging Face y quieres usarla sin registrarla, subirla ni esperar aprobación. En Qwen Image 2.1 LoRA eso es un campo de la petición: una URL y un número de fuerza que se descargan cuando se ejecuta la tarea. El modelo se ejecuta sin censura y los pesos a los que apuntas no se revisan.

Eso elimina la cola de subida y traslada una dependencia a la ruta de tu petición: el alojamiento que sirve tus pesos. Aquí abajo: cómo probar tu archivo en el Playground, el código para ejecutarlo, qué enlaces defectuosos fallan al instante y cuáles más tarde, y cuánto cuesta.

Lo esencial

  • Una LoRA es un campo de la petición, no algo que se registre. loras admite hasta tres entradas {path, scale}; no se sube, escanea ni aprueba nada.
  • Ambos endpoints lo aceptan, texto a imagen y edición por referencia, así que los pesos también se pueden aplicar a fotogramas que ya tienes.
  • Algunos enlaces defectuosos fallan al instante, otros solo después de que la tarea se acepte. Una página web en lugar de un archivo es un 400; un alojamiento caído o un enlace que caduca más tarde se aceptan y fallan después, con la retención reembolsada.
  • Cargar no es lo mismo que funcionar. Compara con una ejecución sin los pesos, el mismo prompt y la misma seed.
  • El número de LoRAs no cambia el precio; en la edición, lo cambia el número de imágenes de referencia.

Pruébalo primero en el Playground

  1. Abre la página de texto a imagen y quédate en la pestaña Playground, en la vista Form. Inicia sesión con una cuenta con saldo para ejecutar.
  2. Escribe un prompt que describa la escena, no el estilo; que los pesos aporten el aspecto.
  3. Bajo Style LoRAs, pega el enlace directo al archivo en LoRA file y ajusta Strength (1 es un inicio normal). Add item te da hasta tres pesos.
  4. Elige 1k para un primer vistazo económico y luego ejecuta el modelo.
  5. Para ver si los pesos hicieron algo, fija una Seed, ejecuta una vez, pulsa Remove item y vuelve a ejecutar con el mismo prompt y la misma seed.

El cuerpo de la petición del Playground es el mismo JSON que acepta la API, así que una configuración que funcione aquí se puede copiar tal cual al código. Si falla aquí, corrige el enlace o los pesos antes de escribir una línea de código.

Luego ejecútalo desde código

Instala el SDK de Python (pip install spicyapi), define SPICY_API_KEY en el entorno de tu servidor y ejecuta:

python
import uuid
from spicyapi import SpicyClient, output_assets

client = SpicyClient()  # reads SPICY_API_KEY from the environment

task = client.create_task(
    model="alibaba/qwen-image-2.1-lora/text-to-image",
    input_data={
        "prompt": "A fishing harbour at first light, rowing boats at their moorings, "
                  "the far quay dissolving into mist over the water.",
        "loras": [{
            "path": "https://huggingface.co/your-account/your-style-lora/resolve/<commit-sha>/style.safetensors",
            "scale": 1,
        }],
        "aspect_ratio": "3:2",
        "resolution": "1k",
        "output_format": "webp",
    },
    idempotency_key=str(uuid.uuid4()),
)

final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
    raise RuntimeError(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
print(output_assets(final)[0]["url"])  # copy the image to your own storage now

Crear, esperar, descargar, reintentos y códigos de error están cubiertos en la guía de tareas y la referencia del SDK de Python. Los resultados caducan, así que consulta retención y entrega antes de construir sobre el enlace devuelto.

O deja que un agente lo ejecute

Cuando un asistente debe ejecutar las generaciones, las tres herramientas oficiales muestran el precio y te preguntan antes de una llamada de pago.

  • CLI. Pon el mismo objeto input en input.json y luego:

``bash spicyapi tasks create --model alibaba/qwen-image-2.1-lora/text-to-image --input-file input.json --wait ``

Consulta la documentación de la CLI; npx @spicyapi/cli funciona sin instalar.

  • Servidor MCP. Añade el servidor MCP a tu asistente y pídele: "Ejecuta Qwen Image 2.1 LoRA con este prompt y este enlace de pesos con fuerza 1." Llama a spicyapi_task_create, que se detiene para tu confirmación de precio, y luego a spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill instala el Agent Skill, que hace que un asistente de código lea el esquema del modelo en vivo en lugar de adivinar campos.

El array loras

loras admite hasta tres entradas { "path", "scale" } en ambos endpoints, texto a imagen y edición por referencia (de 1 a 10 imágenes).

PropiedadValorPor qué importa
Entradas por peticiónHasta 3Una cuarta se rechaza al instante: loras: must contain at most 3 items
pathEnlace HTTPS directo a un archivo .safetensorsSe descarga en el momento de la generación, en cada tarea, desde donde lo alojes
scaleDe 0 a 4, por defecto 1Fuerza frente al modelo base; 1 es la fuerza inicial habitual. Por encima de 4 se rechaza
  • Usa un enlace de archivo, no una página de repositorio. Se rechaza una URL de repositorio de Hugging Face o una página blob/main/.... Usa el enlace resolve/... al archivo en sí.
  • No hay registro. Nunca obtienes un identificador para un peso ni existe una lista de "mis LoRAs". La seed estabiliza una serie pero no reproduce un fotograma, así que guarda la lista {path, scale}, el prompt, los ajustes y el ID de tarea junto a cada salida.

Elige pesos documentados como compatibles con la tarea exacta. Los ejemplos publicados de Qwen Image 2.1 incluyen adaptadores de generación 2512 y adaptadores de edición Edit 2511/2509, así que una versión antigua en el nombre de archivo no los vuelve incompatibles por sí sola. Esas tareas antiguas también están disponibles mediante Qwen Image 2512 LoRA, y nuestra guía de Qwen Image 2.1 LoRA explica qué archivos antiguos se mantienen.

Qué enlaces defectuosos fallan al enviar la petición

Cuando envías pesos, la API prueba el enlace. Si el alojamiento responde y lo que vuelve no es un archivo, obtienes un 400 antes de que exista tarea alguna y antes de que se retengan fondos:

Tu pathResultado
Enlace directo a archivo en un alojamiento que responde (un enlace resolve/... de Hugging Face, tu bucket)Aceptado
Un archivo que devuelve 404400: The LoRA link in loras does not lead to a file on <host>. Use the direct download link to the .safetensors file, not the model's web page
Una página web en lugar de un archivo (página de repositorio, página blob/, cualquier HTML)El mismo 400
Una ruta de Hugging Face privada o que no existe400: needs a sign-in on huggingface.co, so the model cannot download it
Un alojamiento que no resuelve, texto que no es URL o un nombre user/repo sueltoAceptado por la cotización; puede fallar tras la aceptación
Un enlace que funciona ahora y deja de funcionar más tardeAceptado; falla tras la aceptación

Las imágenes de referencia del endpoint de edición reciben el mismo trato: un archivo image_urls ausente es un 400 que nombra el alojamiento.

Las dos filas aceptadas son las que debes vigilar. Un enlace que muere después (un enlace firmado caducado, un repositorio que se vuelve privado, un archivo renombrado o borrado) hace fallar toda petición que lo reference, porque los pesos se descargan en cada tarea. Según nuestra prueba de octubre de 2026, una tarea cuyo alojamiento de pesos no resuelve fue aceptada y falló enseguida (unos 3 segundos) con invalid_request; la retención se reembolsó (cost fue 0, settled fue true) y el mensaje decía que no se había podido cargar una LoRA desde el enlace proporcionado. invalid_request es también lo que devuelve una entrada incorrecta, así que el código por sí solo no apunta al enlace, y con varios pesos el mensaje no nombra la entrada. Prepara el diagnóstico antes de necesitarlo: tras una cotización aceptada, un fallo invalid_request significa comprobar primero las URL de los pesos.

Acota el problema vaciando el array

Cuando una tarea aceptada falla, envía la misma petición una vez con loras vacío y sin cambiar nada más. Si tiene éxito, el problema apunta al adaptador, a su carga o a su interacción con la petición; comprueba el enlace, el formato de archivo, la compatibilidad y la pila uno por uno. Un segundo fallo hace que el código de error de la tarea, las imágenes de origen y el estado del servicio sean las siguientes comprobaciones.

Conserva un peso canario

Conserva un archivo de pesos pequeño que alojes tú mismo, que nunca rotes y cuyo efecto sea inconfundible, como un peso de estilo intenso. Cuando un lote empieza a fallar, ejecuta una generación con el canario. Si funciona, sospecha de tu URL de pesos. Si también falla, comprueba el errorCode de la tarea y el estado del servicio antes de tocar la configuración de almacenamiento.

Comprueba en el despliegue, no en cada petición

Ejecuta una cotización gratuita (spicyapi tasks quote --model alibaba/qwen-image-2.1-lora/text-to-image --input-file input.json) para cada URL de pesos que referencie tu configuración, en tu canalización de despliegue y al arrancar el servicio. Detecta enlaces claramente inservibles, no la compatibilidad del adaptador. No cotices antes de cada generación; añade latencia y el enlace aún puede morir un minuto después.

Fija la dirección para que no pueda moverse

  • Hugging Face: resolve/main/... sigue una rama. Fija el commit: resolve/<commit-sha>/<file>.safetensors.
  • Tu propio almacenamiento: incluye un hash de contenido en la clave, como character-v7-4f9c81.safetensors, y nunca sobrescribas una clave.
  • URL firmadas que caducan: evítalas en configuraciones de larga vida. Para trabajos recurrentes usa una dirección estable, o genera un enlace nuevo justo antes de cada envío que sobreviva a la tarea y a cualquier reintento.
  • Repositorios de terceros: los autores pueden renombrar, cerrar o borrar un repositorio en cualquier momento. Si un archivo es imprescindible, cópialo a un almacenamiento que controles, respetando su licencia, y fija tu copia.

¿Hizo algo la LoRA?

Cuadro puntillista de un bulevar arbolado en una tarde luminosa, personas caminando bajo los plátanos y un carrito de flores junto al bordillo, construido con puntos densos de color puro

Un ejemplo de estilo publicado de Qwen Image 2.1 LoRA. Muestra lo que un peso de estilo puede hacer con un fotograma.

La respuesta no tiene ningún campo que diga que tus pesos se aplicaron, así que juzga a partir de la imagen. Un archivo puede descargarse correctamente y aun así cambiar casi nada, por pesos incompatibles, una frase de activación ausente, una escala débil o adaptadores que se solapan.

  1. Elige un prompt cuyo fallo sea obvio: un sujeto que el modelo base renderiza de forma fotográfica, con un estilo que el peso debe imponer.
  2. Describe la escena, no el estilo. Pide "loose impressionist brushwork" y el prompt por sí solo lo produce, así que darás el peso por bueno. Deja que el archivo aporte el aspecto.
  3. Ejecuta el mismo prompt y la misma seed sin pesos y compara. Si el resultado es indistinguible, la comparación no ha mostrado un efecto visible del adaptador.
  4. Cambia un valor cada vez: escala 1, luego 2, luego 3. Un peso que se hace visiblemente más fuerte solo estaba débil; uno que sigue inerte en cada paso probablemente está construido para otra base. Comprueba también el modelo base y las palabras de activación que recomienda el autor.
  5. Escribe el veredicto junto a la URL y mantén los pesos conformes y no conformes en listas separadas.

Los pesos se descargan antes de generar, así que la primera llamada con un archivo nuevo es más lenta en decenas de segundos, más para archivos mayores (unos 25 segundos extra para un archivo de 1.2 GB). Cuenta con 90 a 120 segundos para la llamada en frío.

Tres espacios

Tres entradas cubren la pila habitual: un peso de personaje que sujeta a la persona, un peso de estilo de casa con menos fuerza y un peso de detalle para piel o tela.

  • Mueve una escala por ejecución. Si cambias dos, no puedes atribuir el resultado.
  • Deja espacio a los pesos de apoyo. Un peso de estilo con la misma fuerza que el peso de personaje tiende a competir con él; baja mucho la entrada de apoyo por debajo de 1.
  • No repitas en el prompt lo que un peso ya aporta.
  • Esta familia no tiene prompt negativo. Pon las exclusiones en el prompt.

Cuánto cuesta

Los precios son por imagen:

Endpoint1k1.5k2k
Texto a imagen$0.03$0.054$0.102
Edición, 1 referencia$0.042$0.078$0.15
  • El número de LoRAs no cambia el precio. Una entrada y tres cotizan lo mismo.
  • Cargar pesos tiene prima sobre el modelo base. Qwen Image 2.1 sin el array cuesta $0.024 en 1k y $0.048 en 2k, así que un trabajo que no necesite pesos debería llamar a la familia base.
  • En la edición, cada imagen de referencia extra añade una cantidad fija: $0.012 en 1k y $0.024 en 2k.
Petición de edición1k2k
1 referencia$0.042$0.15
2 referencias$0.054$0.174
5 referencias$0.09$0.246
10 referencias$0.15$0.366

En resumen: la petición que más cuesta es la de muchas imágenes de referencia en 2k, no la de tres LoRAs.

Cien fotogramas de texto a imagen cuestan $3.00 en 1k y $10.20 en 2k; cien ediciones con diez referencias en 2k cuestan $36.60. Itera en 1k y promociona los mejores a 2k.

Editar con pesos

Aplica un peso de personaje a un fotograma que ya aprobaste, con un peso de estilo de casa debajo y con menos fuerza:

json
{
  "model": "alibaba/qwen-image-2.1-lora/edit",
  "input": {
    "prompt": "The source image is the character. Keep her face, her hair and the cut of the coat exactly as they are. Restage her on a wet city street at night, lit by shop windows from the left.",
    "image_urls": ["https://cdn.example.com/approved/frame-0412.png"],
    "loras": [
      { "path": "https://cdn.example.com/weights/character-v7-4f9c81.safetensors", "scale": 1 },
      { "path": "https://cdn.example.com/weights/house-grade-v2-0ab3de.safetensors", "scale": 0.45 }
    ],
    "aspect_ratio": "4:5",
    "resolution": "2k"
  }
}

Envíalo con el mismo código, usando alibaba/qwen-image-2.1-lora/edit como modelo. Copia los valores de campo del esquema en vivo de la página del modelo; la guía de generación de imágenes explica en qué difieren los endpoints de imagen.

Pesos sin censura y de categorías restringidas

Esta familia es sin censura: no hay marca de madurez, ni revisión de los pesos a los que apuntas, ni análisis de contenido añadido por SpicyAPI. Tus obligaciones no cambian: solo adultos, pesos y datos de entrenamiento que puedas usar, ningún menor en ninguna entrada o salida, ninguna imagen íntima no consentida y ninguna imitación engañosa de una persona real identificable.

Siguientes pasos

Para el modelo base, consulta nuestra prueba de Qwen Image 2.1; para edición sin campo de máscara, nuestra prueba de Qwen Image Edit. El catálogo más amplio de modelos de imagen lista el esquema en vivo y la estimación de cada modelo.

Preguntas frecuentes

¿Puedo ejecutar mi propia LoRA en una API sin subirla?

Sí. loras admite hasta tres entradas {path, scale}, donde path es un enlace directo a un archivo .safetensors. No hay endpoint de subida, cola de aprobación ni lista de permitidos.

¿Acepta enlaces de Hugging Face?

Sí, como https://huggingface.co/<user>/<repo>/resolve/<commit-sha>/<file>.safetensors. Las páginas de repositorio, las páginas blob/ y las rutas privadas o inexistentes se rechazan.

¿Por qué falló mi petición de LoRA sin un error útil?

Lo más habitual es que el path dejara de funcionar después de que la tarea fuera aceptada. Un alojamiento caído, un enlace firmado caducado o un repositorio que pasó a privado fallan con invalid_request, que también devuelve una entrada incorrecta, así que el código por sí solo no nombra el enlace. La retención se reembolsa. Acota el problema con loras vacío o comprueba primero las URL de los pesos.

Mi LoRA apenas cambia la imagen. ¿Qué ocurre?

Comprueba su compatibilidad declarada, su frase de activación y su escala; luego compárala sola, sin las otras entradas. Los archivos antiguos de Qwen no son todos incompatibles: varios se usan en los ejemplos publicados de este endpoint. Sigue los pasos de escala anteriores antes de descartar el archivo.

¿Cuántas LoRAs puedo apilar y apilar cuesta más?

Tres por petición, cada una con su propia fuerza. Una cuarta se rechaza al instante. Una entrada y tres cotizan el mismo precio, así que elige los pesos que necesitas, no menos. En la edición, lo que mueve el precio es el número de imágenes de referencia.

¿Puedo usar una LoRA al editar una imagen existente?

Sí. El endpoint de edición acepta el mismo array loras con entre una y diez imágenes de referencia. Envía el fotograma aprobado como referencia, di en el prompt qué debe cambiar y deja que los pesos aporten la identidad.

¿Qué hace scale y qué debería fijar?

Pondera la LoRA frente al modelo base, de 0 a 4, con 1 como fuerza inicial habitual. Por debajo de 1 se afina un aspecto; por encima de 1 un peso domina.

¿Cómo reproduzco una imagen hecha con una pila concreta?

Guarda la pila. No hay registro y la seed no reproduce un fotograma, así que conserva la lista {path, scale}, el prompt y los ajustes junto a la salida, con cada ruta fijada a una dirección que no pueda moverse.

También en English · 日本語 · 한국어 · Deutsch · Français · Português (Brasil) · Русский · Italiano · Polski