ES ▾
Obtener clave de API

Generador de prompts para Stable Diffusion con LLM: configuración en Python

Actualizado

Si quieres un generador de prompts para Stable Diffusion con LLM que expanda unas pocas palabras en un prompt completo y bien estructurado, solo necesitas un modelo de texto y unas treinta líneas de Python. El modelo escribe el prompt como texto; no renderiza imágenes, así que aún debes pasar el resultado por SDXL o la herramienta de imágenes que uses.

Embudo de vidrio transformando unas pocas palabras brillantes en una larga cinta de detalles que va hacia un lienzo en blanco
Diorama de un pequeño escenario con burbujas de diálogo brillantes que representan un escenario de rol de texto

Puntos clave

  • El LLM solo escribe texto. Envía su salida a tu propia configuración de SDXL, ComfyUI o Automatic1111.
  • El modo JSON devuelve un prompt positivo y un prompt negativo que puedes analizar sin regex.
  • Una expansión cuesta menos de $0,0001, así que 1000 prompts cuestan unos $0,09.
  • Mantén los prompts concisos: los codificadores de texto de SDXL solo leen los primeros 77 tokens de cada fragmento.

Lo que hace y no hace el LLM

Los modelos de imágenes responden bien a prompts densos y específicos: sujeto, entorno, lente, iluminación, medio, estado de ánimo y una lista de cosas a evitar. La mayoría de la gente escribe tres palabras y obtiene un resultado plano. Un LLM cierra esa brecha tomando tu idea breve y escribiendo la versión larga en un formato consistente.

Sé claro sobre la división de tareas. Este servicio es una API de solo texto. No genera imágenes, audio ni video, y no tiene incrustaciones ni ajuste fino. Se sitúa delante de tu pipeline de imágenes y escribe las instrucciones que este pipeline lee. Es un endpoint compatible con OpenAI que sirve un modelo de peso abierto de un proveedor independiente, no un producto de ningún proveedor de modelos de imagen.

El modelo está ajustado para responder sin rechazos de contenido para uso adulto lícito, lo cual es importante para artistas y desarrolladores de juegos cuyos temas (terror, violencia en ficción, temas maduros) se bloquean en otros lugares. El contenido sexual que involucre a menores de edad es un límite estricto y nunca se produce.

Paso 1: obtener una clave y probar una llamada

Regístrate con Google o con correo electrónico y contraseña, luego abre la página de clave de API. Una prueba con un clic añade $0,50 de crédito, válido por 7 días y sin necesidad de tarjeta. Eso es suficiente para miles de expansiones de prompts, como muestra la sección de costos.

Verifica que todo funcione con curl:

curl https://api.sdxlapi.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [
      {"role": "system", "content": "You write Stable Diffusion prompts."},
      {"role": "user", "content": "lighthouse in a storm"}
    ]
  }'

Cualquier SDK de OpenAI funciona una vez que cambies la URL base y la clave. Los detalles están en la documentación.

Paso 2: un prompt de sistema que da salida estable

El prompt de sistema es de donde proviene la calidad. Indica al modelo el formato objetivo, el orden de los elementos, un límite de longitud y qué omitir. Una versión que funciona bien como punto de partida:

Convierte ideas breves de imágenes en prompts para SDXL. Escribe un prompt positivo de 40 a 60 palabras: sujeto primero, luego entorno, composición, iluminación, medio o estilo, y estado de ánimo. Usa frases separadas por comas, sin oraciones completas. Luego escribe un prompt negativo de hasta 15 frases cortas. No añadas texto, marcas de agua ni leyendas a la imagen. Devuelve JSON con las claves "prompt" y "negative".

El límite de palabras es importante. Los codificadores de texto CLIP de SDXL leen prompts en fragmentos de 77 tokens, y cualquier cosa más allá de eso se corta o se maneja mediante una función de fragmentación en tu interfaz. Apuntar a 40 a 60 palabras mantiene la mayoría de los prompts dentro de un solo fragmento, con los detalles más importantes primero.

Usa una temperatura baja a media (0.7 a 0.9) para que el estilo se mantenga consistente pero dos ejecuciones de la misma idea difieran. Si necesitas una salida idéntica para pruebas, pasa un seed fijo.

Paso 3: el script de Python

Este script lee ideas de una lista, solicita JSON e imprime el par de prompts. Usa el paquete oficial de Python de OpenAI con la URL base cambiada.

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.sdxlapi.com/v1", api_key="YOUR_KEY")

SYSTEM = (
    "You turn short image ideas into prompts for SDXL. Write one positive "
    "prompt of 40 to 60 words: subject, setting, composition, lighting, "
    "medium or style, mood, as comma-separated phrases. Then a negative "
    "prompt of up to 15 short phrases. Return JSON with keys "
    "'prompt' and 'negative'."
)

def expand(idea: str) -> dict:
    resp = client.chat.completions.create(
        model="uncensored",
        messages=[
            {"role": "system", "content": SYSTEM},
            {"role": "user", "content": idea},
        ],
        response_format={"type": "json_object"},
        temperature=0.8,
        max_tokens=400,
    )
    return json.loads(resp.choices[0].message.content)

for idea in ["lighthouse in a storm", "abandoned greenhouse at dawn"]:
    result = expand(idea)
    print(idea, "->", result["prompt"])
    print("negative:", result["negative"], "\n")

El modo JSON (response_format con json_object) hace que la respuesta se analice correctamente. En producción, envuelve siempre json.loads en un bloque try y reintenta una vez si falla, porque una respuesta larga cortada en max_tokens puede terminar a mitad de un objeto.

Paso 4: enviar prompts a tu herramienta de imágenes

La salida son cadenas de texto plano, por lo que cualquier interfaz puede procesarla. Con una instalación local de Automatic1111 o ComfyUI, envía los dos campos a su API. Con un script que recorra un archivo CSV de ideas, escribe los resultados en un archivo y colócalos en cola como un lote.

  • Guarda la idea, el prompt y el prompt negativo juntos, para que puedas rastrear una buena imagen de vuelta a la instrucción que la produjo.
  • Añade una línea de estilo de tu propia lista ("fotografía cinematográfica", "ilustración en tinta") como un campo adicional en el mensaje del usuario cuando quieras una serie con un aspecto coincidente.
  • Mantén una pequeña biblioteca de prompts que funcionaron, y alimenta dos o tres de ellos en el prompt de sistema como ejemplos. Los ejemplos de pocos disparos dirigen el estilo de manera más fiable que los adjetivos.

Para un proyecto de roleplay o de juegos, el mismo patrón puede ilustrar escenas de una historia, con el LLM transformando los últimos párrafos en una descripción visual. El artículo sobre escenarios de juego de rol cubre el aspecto narrativo.

Problemas comunes y soluciones

Aparecen algunos problemas en casi todos los proyectos de generador de prompts.

El modelo añade comentarios

Las respuestas que comienzan con "Aquí tienes tu prompt" rompen los pipelines. El modo JSON elimina la mayoría de esto. Si trabajas en texto plano, di "salida solo el prompt, sin preámbulo" y añade una secuencia de parada para una línea que nunca quieras ver.

Cada prompt se ve igual

Temperatura baja y una plantilla estricta dan resultados uniformes. Sube la temperatura a 1,0, varía la línea de estilo que pasas, o pide tres alternativas y elige una. Las penalizaciones (frequency_penalty, presence_penalty) se pasan a través y pueden romper frases repetidas.

Los prompts son demasiado largos para el modelo de imágenes

Pon un límite estricto de palabras en el prompt de sistema y verifica la longitud en el código. Truncar a mano elimina los últimos detalles, que suelen ser los menos importantes, pero es mejor que el modelo escriba corto desde el principio.

Llegas a un 429

Enviaste demasiadas peticiones por minuto o a la vez. Retrocede unos segundos y reintenta; la respuesta puede incluir Retry-After: 5. Un lote con un grupo de hilos pequeño de 4 a 8 trabajadores se mantiene dentro de los límites de una clave completa.

Cuánto cuestan 1.000 prompts

La tarifa es $0,15 por 1M de tokens de entrada y $0,50 por 1M de tokens de salida. Una expansión típica envía un prompt de sistema de unos 150 tokens más una idea de 15 tokens, llamémosle 170 tokens de entrada, y recibe unos 120 tokens de JSON.

  • Entrada: 170 × $0,15 / 1M = $0,0000255.
  • Salida: 120 × $0,50 / 1M = $0,00006.
  • Por prompt: unos $0.0000855.
  • 1.000 prompts: unos $0,0855, o $0,09.

Redondea al alza para prompts de sistema más largos o ejemplos few-shot. Si añades 600 tokens de ejemplos, la entrada se convierte en 770 tokens y 1.000 prompts cuestan aproximadamente $0,1155 por la entrada + $0,06 por la salida, unos $0,18 en total. De cualquier forma, el crédito de prueba de $0,50 cubre varias miles de expansiones. Las peticiones fallidas no se cobran, y el crédito prepagado no caduca; consulta la página de precios para recargas ($20 a $500, con cripto).

Preguntas y respuestas

¿Puede el LLM generar la imagen de Stable Diffusion en sí misma?

No. Solo genera texto. Pasas su prompt a SDXL, ComfyUI, Automatic1111 o cualquier otra herramienta de imágenes que ejecutes.

¿Qué longitud debe tener un prompt para SDXL?

Funciona bien con entre 40 y 60 palabras, colocando los detalles clave al principio, porque los codificadores de texto leen en bloques de 77 tokens.

¿Rechaza temas maduros u oscuros?

El modelo está ajustado para responder sin rechazos por contenido para uso adulto lícito. Nunca se genera contenido que involucre a menores de edad.

¿Qué nombre de modelo debo enviar?

Envía uncensored como el ID del modelo, con la URL base https://api.sdxlapi.com/v1 y tu clave como token Bearer.

¿Puedo ejecutar muchos prompts en paralelo?

Una clave completa permite 8 peticiones simultáneas y 300 por minuto; una clave de prueba permite 2 y 60. Una respuesta 429 significa esperar y reintentar.

Tu clave está a un formulario de distancia

Crea una cuenta, copia la clave, cambia la URL base. Esa es toda la configuración.

Obtener clave de API