Lleva las preferencias del cliente (estilo, color, material) al render

Hasta ahora el render solo se condicionaba con tipo/m²/calidad + notas de texto
libre por zona; lo que el cliente decía hablando con Luisa o en la llamada
(estilo, colores, materiales) se guardaba en estilo/tasteText pero NO viajaba al
generador de imagen, así que el render no lo representaba.

- b2c (perfil.ts): el payload de PERFIL_WEBHOOK_URL incluye ahora
  preferencias:{estilo, gustos} (gustos = tasteText). Claves vacías se omiten.
- worker (webhook.dto): nuevo PreferenciasDto opcional.
- worker (prompt-builder): construirUserContent (función pura) inyecta el estilo
  y los gustos del cliente como bloque dedicado y omite el "modern" por defecto
  cuando hay preferencias; el system prompt prioriza colores/materiales del
  cliente sobre un estilo genérico.
- worker (pipeline): enhebra preferencias hasta generarPrompt.
- worker (sandbox): acepta estilo/gustos para poder probarlos.
- docs/arquitectura-integracion: documenta el campo preferencias.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Carlos Narro
2026-06-10 18:17:45 +02:00
parent f6e0347143
commit ad87e45892
7 changed files with 88 additions and 15 deletions

View File

@@ -52,6 +52,13 @@ export async function señalarPerfilCompleto(leadId: string): Promise<boolean> {
urgencia: lead.urgencia,
presupuestoTarget: lead.presupuestoTarget,
},
// Gustos estéticos del cliente (estilo + resumen en texto libre de lo que pidió hablando con
// Luisa / en la llamada): se mandan al generador para que el render los represente. Se omiten
// las claves vacías (JSON.stringify descarta undefined).
preferencias: {
estilo: lead.estilo || undefined,
gustos: lead.tasteText || undefined,
},
empresa: { tenantId: lead.tenantId, nombre: tenant.nombreEmpresa },
zonas: Array.from(zonas, ([zona, d]) => ({
zona,