Flujo de generación de imagen por cinco créditos
Sigue una tarea asíncrona de pago por autenticación, permisos, créditos idempotentes, worker durable, almacenamiento privado y compensación.
Verificado con el commit
b16b416.
La generación de imagen es el ejemplo mínimo de un flujo de pago con forma de producción. El proveedor local genera SVG y no llama a un modelo comercial; el valor es la cadena que lo rodea. Cada solicitud aceptada cuesta exactamente cinco créditos comunes de la organización.
ENABLE_DEMO_FEATURES=true
ENABLE_IMAGE_GENERATION_MOCK=true
IMAGE_GENERATION_MOCK_FAILURES=0Ejecuta pnpm dev:all, inicia sesión con la cuenta demo y abre /es/tasks/image-generation. La UI conserva una clave idempotente y consulta el estado tenant-scoped.
- La API comprueba origen, límite, auth,
tasks.image_generationy cuota mensual. (user_uuid, type, idempotency_key)identifica la tarea; una huella rechaza otra petición con la misma clave.task_image:<task uuid>identifica el gasto de cinco créditos; replays concurrentes devuelven el débito existente.task_image_generation:<task uuid>deduplica el job durable y repara caídas entre tarea, gasto y despacho.- El worker llama al proveedor con UUID estable, escribe y verifica un objeto privado Garage/S3 y activa su archivo.
- La consulta firma una URL corta después de resolver el archivo dentro de la organización.
pending_payment → queued → running → succeeded
↘ refunding → failedEl proveedor dispone de cinco intentos y el job de ocho, reservando tres para compensación. El fallo terminal entra en refunding, añade un reembolso determinista y solo entonces marca failed. El replay no duplica proveedor ni reembolso.
Usa IMAGE_GENERATION_MOCK_FAILURES=5 para probar el fallo. Tests de base prueban un gasto y un reembolso; Playwright prueba replay, cambio exacto de cinco créditos, worker, Garage y descarga firmada.
Implementa el proveedor real en src/services/ai/image.ts y conserva la clave idempotente, AbortSignal y los contratos de tarea, crédito, job, almacenamiento y error. Las credenciales y los tipos del SDK permanecen dentro del adaptador.
Cambiar el adaptador no activa por sí solo la generación en producción. La página, la ruta API y el servicio de tareas comprueban isImageGenerationMockEnabled(), que siempre es false en producción. Sustituye esas comprobaciones de admisión demo por una configuración explícita de la función de producción, conservando las verificaciones de origen, autenticación, derechos, cuotas y créditos.
El tipo GeneratedImage actual solo permite image/svg+xml, la extensión svg y el proveedor mock. Define y valida los tipos de salida, extensiones, identidad del proveedor y metadatos de archivo permitidos antes de aceptar sus bytes. Prueba la admisión en producción junto con reintentos, entrega privada y compensación.
Relacionado: Libro de créditos, Storage privado, Jobs durables y Pruebas y CI.