# Requerimientos Funcionales - PMC-004 Generation

**Módulo:** Generation (Motor IA)
**Versión:** 1.0.0
**Fecha:** 2025-12-08

---

## Generación de Imágenes

### RF-PMC-004-001: Generar Imagen Text-to-Image

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-001 |
| **Nombre** | Generar Imagen Text-to-Image |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de entrada:**
- prompt: string (requerido)
- negative_prompt: string (opcional)
- width: number (default: 1024)
- height: number (default: 1024)
- seed: number (opcional, aleatorio si no se especifica)
- steps: number (default: 30)
- cfg_scale: number (default: 7.5)
- lora_id: UUID (opcional)
- brand_id: UUID (opcional, para cargar LoRA automáticamente)

**Criterios de aceptación:**
- [ ] Imagen se genera correctamente
- [ ] Parámetros se aplican
- [ ] LoRA se carga si especificado
- [ ] Asset se crea automáticamente

---

### RF-PMC-004-002: Generar Imagen Image-to-Image

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-002 |
| **Nombre** | Generar Imagen Image-to-Image |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de entrada:**
- input_image: file/URL (requerido)
- prompt: string (requerido)
- strength: number (0.0-1.0, default: 0.75)
- Otros parámetros de T2I

**Criterios de aceptación:**
- [ ] Imagen input se procesa correctamente
- [ ] Strength afecta resultado
- [ ] Formatos soportados: PNG, JPG, WebP

---

### RF-PMC-004-003: Aplicar Inpainting

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-003 |
| **Nombre** | Aplicar Inpainting |
| **Prioridad** | P2 |
| **Actor** | Creative |

**Datos de entrada:**
- input_image: file/URL (requerido)
- mask_image: file (requerido)
- prompt: string (requerido)
- Otros parámetros de generación

**Descripción:**
Regenerar solo la parte enmascarada de una imagen.

**Criterios de aceptación:**
- [ ] Máscara define área a regenerar
- [ ] Resto de imagen preservado
- [ ] Editor de máscara en UI

---

### RF-PMC-004-004: Aplicar Upscaling

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-004 |
| **Nombre** | Aplicar Upscaling |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de entrada:**
- input_image: file/URL (requerido)
- scale: number (2 o 4)
- model: string (default: "RealESRGAN")

**Criterios de aceptación:**
- [ ] Imagen se escala correctamente
- [ ] Calidad mejorada, no solo interpolación
- [ ] Formatos de salida preservados

---

### RF-PMC-004-005: Generar Batch de Imágenes

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-005 |
| **Nombre** | Generar Batch de Imágenes |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de entrada:**
- base_params: object (parámetros comunes)
- count: number (cantidad a generar)
- variation_type: string (seed, prompt_variation)

**Criterios de aceptación:**
- [ ] N imágenes generadas
- [ ] Seeds diferentes por imagen
- [ ] Todas vinculadas al mismo job

---

### RF-PMC-004-006: Remover Fondo

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-006 |
| **Nombre** | Remover Fondo |
| **Prioridad** | P2 |
| **Actor** | Creative |

**Datos de entrada:**
- input_image: file/URL (requerido)

**Criterios de aceptación:**
- [ ] Fondo removido correctamente
- [ ] Salida PNG con transparencia
- [ ] Bordes suaves en objetos

---

## Generación de Texto

### RF-PMC-004-007: Generar Copy Publicitario

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-007 |
| **Nombre** | Generar Copy Publicitario |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de entrada:**
- context: object
  - product_name: string
  - product_description: string
  - brand_tone: string
  - target_audience: string
  - objective: string
- type: enum (title, description, cta, full_post)
- max_length: number (opcional)
- variations: number (default: 3)

**Criterios de aceptación:**
- [ ] Texto generado coherente
- [ ] Tono respeta brand guidelines
- [ ] Múltiples variaciones disponibles

---

### RF-PMC-004-008: Generar Hashtags

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-008 |
| **Nombre** | Generar Hashtags |
| **Prioridad** | P2 |
| **Actor** | Creative |

**Datos de entrada:**
- context: string (descripción del contenido)
- count: number (default: 10)
- platform: string (instagram, twitter, linkedin)

**Criterios de aceptación:**
- [ ] Hashtags relevantes generados
- [ ] Formato correcto (#hashtag)
- [ ] Sin espacios ni caracteres inválidos

---

### RF-PMC-004-009: Adaptar Tono de Texto

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-009 |
| **Nombre** | Adaptar Tono de Texto |
| **Prioridad** | P2 |
| **Actor** | Creative |

**Datos de entrada:**
- input_text: string (requerido)
- target_tone: string (formal, casual, playful, professional)

**Criterios de aceptación:**
- [ ] Mensaje preservado, tono cambiado
- [ ] Opciones de tono claras

---

## Workflows

### RF-PMC-004-010: Listar Workflow Templates

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-010 |
| **Nombre** | Listar Workflow Templates |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de salida:**
- Lista de workflows disponibles
- Por cada uno: nombre, descripción, tipo, inputs requeridos

**Criterios de aceptación:**
- [ ] Workflows de sistema incluidos
- [ ] Workflows custom del tenant incluidos
- [ ] Filtro por tipo/categoría

---

### RF-PMC-004-011: Ver Detalle de Workflow

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-011 |
| **Nombre** | Ver Detalle de Workflow |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de salida:**
- Descripción completa
- Inputs requeridos y opcionales
- Outputs esperados
- Ejemplos de resultado
- Tiempo estimado

**Criterios de aceptación:**
- [ ] Schema de inputs documentado
- [ ] Ejemplos visuales disponibles

---

### RF-PMC-004-012: Ejecutar Workflow

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-012 |
| **Nombre** | Ejecutar Workflow |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de entrada:**
- workflow_id: UUID (requerido)
- inputs: object (según schema del workflow)
- campaign_id: UUID (opcional)
- brand_id: UUID (opcional)

**Flujo:**
1. Sistema valida inputs contra schema
2. Sistema verifica cuotas del tenant
3. Sistema crea GenerationJob
4. Sistema encola job
5. Sistema retorna job_id

**Criterios de aceptación:**
- [ ] Validación de inputs funciona
- [ ] Job se crea correctamente
- [ ] ID retornado para tracking

---

### RF-PMC-004-013: Crear Workflow Template (Admin)

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-013 |
| **Nombre** | Crear Workflow Template |
| **Prioridad** | P3 |
| **Actor** | Tenant Admin |

**Datos de entrada:**
- name: string
- description: text
- type: enum
- comfyui_workflow: JSON
- input_schema: JSON
- output_config: object

**Criterios de aceptación:**
- [ ] Workflow se almacena correctamente
- [ ] Schema de inputs validado
- [ ] Disponible para usuarios del tenant

---

## Modelos Personalizados

### RF-PMC-004-014: Listar Modelos Custom

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-014 |
| **Nombre** | Listar Modelos Custom |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de salida:**
- Lista de LoRAs, checkpoints disponibles
- Status de cada uno
- Brand asociada (si aplica)

**Criterios de aceptación:**
- [ ] Solo modelos del tenant
- [ ] Filtro por tipo y brand
- [ ] Preview images mostradas

---

### RF-PMC-004-015: Registrar Modelo Custom

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-015 |
| **Nombre** | Registrar Modelo Custom |
| **Prioridad** | P1 |
| **Actor** | Tenant Admin |

**Datos de entrada:**
- name: string (requerido)
- type: enum (lora, checkpoint, embedding)
- file: upload (requerido)
- purpose: string
- trigger_word: string (para LoRAs)
- brand_id: UUID (opcional)
- preview_images: array[file]

**Criterios de aceptación:**
- [ ] Archivo subido a storage
- [ ] Registro en BD
- [ ] Disponible para generación

---

### RF-PMC-004-016: Eliminar Modelo Custom

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-016 |
| **Nombre** | Eliminar Modelo Custom |
| **Prioridad** | P2 |
| **Actor** | Tenant Admin |

**Criterios de aceptación:**
- [ ] Confirmación requerida
- [ ] Archivo eliminado de storage
- [ ] Registro eliminado de BD

---

### RF-PMC-004-017: Iniciar Entrenamiento de LoRA

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-017 |
| **Nombre** | Iniciar Entrenamiento de LoRA |
| **Prioridad** | P2 |
| **Actor** | Tenant Admin |

**Datos de entrada:**
- name: string
- training_images: array[file] (mínimo 10)
- base_model: string
- steps: number (default: 1000)
- learning_rate: number (default: 0.0001)
- trigger_word: string (requerido)

**Criterios de aceptación:**
- [ ] Mínimo 10 imágenes validado
- [ ] Job de entrenamiento creado
- [ ] Status actualizado durante entrenamiento
- [ ] Modelo disponible al completar

---

## Cola de Tareas

### RF-PMC-004-018: Ver Estado de Cola

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-018 |
| **Nombre** | Ver Estado de Cola |
| **Prioridad** | P1 |
| **Actor** | Creative, Tenant Admin |

**Datos de salida:**
- Jobs en cola (pending)
- Jobs procesando
- Jobs completados (recientes)
- Jobs fallidos (recientes)

**Criterios de aceptación:**
- [ ] Actualización en tiempo real
- [ ] Filtro por usuario/campaña
- [ ] Progreso visible para jobs activos

---

### RF-PMC-004-019: Ver Detalle de Job

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-019 |
| **Nombre** | Ver Detalle de Job |
| **Prioridad** | P1 |
| **Actor** | Creative |

**Datos de salida:**
- Parámetros de entrada
- Status y progreso
- Timestamps
- Outputs generados
- Error (si falló)

**Criterios de aceptación:**
- [ ] Toda la información visible
- [ ] Links a assets generados

---

### RF-PMC-004-020: Cancelar Job

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-020 |
| **Nombre** | Cancelar Job |
| **Prioridad** | P2 |
| **Actor** | Creative |

**Precondiciones:**
- Job en status "queued"

**Criterios de aceptación:**
- [ ] Job cambia a "cancelled"
- [ ] No se ejecuta
- [ ] Cuota no consumida

---

### RF-PMC-004-021: Reintentar Job Fallido

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-021 |
| **Nombre** | Reintentar Job Fallido |
| **Prioridad** | P2 |
| **Actor** | Creative |

**Precondiciones:**
- Job en status "failed"

**Criterios de aceptación:**
- [ ] Nuevo job creado con mismos parámetros
- [ ] Original marcado como "retried"
- [ ] Hasta 3 reintentos permitidos

---

### RF-PMC-004-022: Cambiar Prioridad de Job (Admin)

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-022 |
| **Nombre** | Cambiar Prioridad de Job |
| **Prioridad** | P3 |
| **Actor** | Tenant Admin |

**Precondiciones:**
- Job en status "queued"

**Criterios de aceptación:**
- [ ] Prioridad actualizada
- [ ] Posición en cola recalculada

---

## Integración ComfyUI

### RF-PMC-004-023: Enviar Workflow a ComfyUI

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-023 |
| **Nombre** | Enviar Workflow a ComfyUI |
| **Prioridad** | P1 |
| **Actor** | Sistema |

**Descripción:**
El sistema debe enviar workflows a ComfyUI para ejecución.

**Criterios de aceptación:**
- [ ] Payload correcto enviado
- [ ] Respuesta de ComfyUI procesada
- [ ] Errores manejados correctamente

---

### RF-PMC-004-024: Recibir Resultados de ComfyUI

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-024 |
| **Nombre** | Recibir Resultados de ComfyUI |
| **Prioridad** | P1 |
| **Actor** | Sistema |

**Descripción:**
El sistema debe procesar callbacks/webhooks de ComfyUI con resultados.

**Criterios de aceptación:**
- [ ] Imágenes descargadas y almacenadas
- [ ] Assets creados automáticamente
- [ ] Job actualizado a "completed"

---

### RF-PMC-004-025: Monitorear Progreso en ComfyUI

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-025 |
| **Nombre** | Monitorear Progreso en ComfyUI |
| **Prioridad** | P2 |
| **Actor** | Sistema |

**Descripción:**
Tracking de progreso durante ejecución del workflow.

**Criterios de aceptación:**
- [ ] Websocket conectado a ComfyUI
- [ ] Progreso actualizado en tiempo real
- [ ] Propagado a frontend

---

## Validaciones

### RF-PMC-004-026: Validar Cuota Antes de Generación

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-026 |
| **Nombre** | Validar Cuota Antes de Generación |
| **Prioridad** | P1 |
| **Actor** | Sistema |

**Descripción:**
Verificar límites del tenant antes de aceptar job.

**Criterios de aceptación:**
- [ ] Generaciones mensuales verificadas
- [ ] Storage verificado para outputs
- [ ] Error claro si excede límite

---

### RF-PMC-004-027: Agregar Negative Prompts Automáticos

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-027 |
| **Nombre** | Agregar Negative Prompts Automáticos |
| **Prioridad** | P2 |
| **Actor** | Sistema |

**Descripción:**
Añadir negative prompts de calidad estándar.

**Negative prompts por defecto:**
- "blurry, low quality, watermark, signature, bad anatomy, deformed..."

**Criterios de aceptación:**
- [ ] Negativos agregados automáticamente
- [ ] Usuario puede sobreescribir
- [ ] Configurables por tenant

---

### RF-PMC-004-028: Cargar Identidad de Marca Automáticamente

| Campo | Valor |
|-------|-------|
| **ID** | RF-PMC-004-028 |
| **Nombre** | Cargar Identidad de Marca Automáticamente |
| **Prioridad** | P1 |
| **Actor** | Sistema |

**Descripción:**
Al generar para una campaña/marca, cargar automáticamente:
- LoRAs asociados
- Colores de marca (para prompts)
- Forbidden words (para negative prompts)
- Tono de voz (para texto)

**Criterios de aceptación:**
- [ ] LoRA se inyecta en workflow
- [ ] Colores incluidos en prompt si aplica
- [ ] Forbidden words en negative prompt

---

## Resumen

| Prioridad | Cantidad |
|-----------|----------|
| P1 | 17 |
| P2 | 9 |
| P3 | 2 |
| **Total** | **28** |

---

**Documento generado por:** Requirements-Analyst
**Fecha:** 2025-12-08
