Skip to content

Commit 9b3b553

Browse files
authored
Merge branch 'grupo-3-main' into grupo-3-mike-5
2 parents 027de23 + 35dddc6 commit 9b3b553

File tree

1 file changed

+105
-44
lines changed

1 file changed

+105
-44
lines changed

src/services/chat-system-prompt.ts

Lines changed: 105 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,70 @@ export function generateSystemPrompt({
1313
products,
1414
userCart,
1515
}: SystemPromptConfig): string {
16-
const onSaleProducts = products.filter((p) => p.isOnSale);
17-
const salesSection =
18-
onSaleProducts.length > 0
19-
? `
16+
17+
// Procesar productos con información de variantes
18+
const processedProducts = products.map(product => {
19+
const category = categories.find((c) => c.id === product.categoryId);
20+
21+
// Formatear precio según si tiene variantes o no
22+
let priceDisplay = "";
23+
if (product.price) {
24+
priceDisplay = `S/${product.price}`;
25+
} else if (product.minPrice && product.maxPrice) {
26+
priceDisplay = `S/${product.minPrice} - S/${product.maxPrice}`;
27+
}
28+
29+
// Formatear variantes según el tipo
30+
let variantDisplay = "";
31+
if (product.variants && product.variants.length > 0 && product.variantType !== 'único') {
32+
switch (product.variantType) {
33+
case 'talla':
34+
const sizes = product.variants.map(v => v.value).join(", ");
35+
variantDisplay = `\n- 👕 Tallas disponibles: ${sizes}`;
36+
break;
37+
case 'dimensión':
38+
const dimensions = product.variants
39+
.map(v => `${v.value} (S/${v.price})`)
40+
.join(", ");
41+
variantDisplay = `\n- 📐 Dimensiones: ${dimensions}`;
42+
break;
43+
default:
44+
const options = product.variants
45+
.map(v => `${v.value} (S/${v.price})`)
46+
.join(", ");
47+
variantDisplay = `\n- ⚙️ Opciones: ${options}`;
48+
}
49+
}
50+
51+
return {
52+
...product,
53+
categoryTitle: category?.title || "Sin categoría",
54+
priceDisplay,
55+
variantDisplay
56+
};
57+
});
58+
59+
// Procesar productos en oferta
60+
const onSaleProducts = processedProducts.filter((p) => p.isOnSale);
61+
const salesSection = onSaleProducts.length > 0
62+
? `
2063
## 🔥 PRODUCTOS EN OFERTA ESPECIAL:
2164
${onSaleProducts
22-
.map(
23-
(product) => `
24-
- **${product.title}** - S/${product.price} ⚡ [Ver oferta](/products/${product.id})
25-
`
26-
)
65+
.map(product => `
66+
- **${product.title}** - ${product.priceDisplay} ⚡ [Ver oferta](/products/${product.id})`)
2767
.join("")}
2868
`
29-
: "";
69+
: "";
3070

71+
// Procesar carrito del usuario
3172
const cartSection = userCart?.items?.length
3273
? `
3374
## 🛒 CARRITO ACTUAL DEL USUARIO:
3475
El usuario tiene actualmente ${userCart.items.length} producto(s) en su carrito:
3576
${userCart.items
36-
.map(
37-
(item) => `
77+
.map(item => `
3878
- **${item.product.title}** (Cantidad: ${item.quantity}) - S/${item.product.price}
39-
Link: [Ver producto](/products/${item.product.id})
40-
`
41-
)
79+
Link: [Ver producto](/products/${item.product.id})`)
4280
.join("")}
4381
4482
**IMPORTANTE**: Usa esta información para hacer recomendaciones inteligentes:
@@ -51,6 +89,25 @@ ${userCart.items
5189
`
5290
: "";
5391

92+
// Generar categorías
93+
const categoriesSection = categories
94+
.map(cat => `
95+
**${cat.title}** (${cat.slug})
96+
- Descripción: ${cat.description}
97+
- Link: [Ver categoría](/category/${cat.slug})`)
98+
.join("\n");
99+
100+
// Generar productos
101+
const productsSection = processedProducts
102+
.map(product => `
103+
**${product.title}**
104+
- 💰 Precio: ${product.priceDisplay}${product.isOnSale ? " ⚡ ¡EN OFERTA!" : ""}
105+
- 📝 Descripción: ${product.description}
106+
- 🏷️ Categoría: ${product.categoryTitle}
107+
- ✨ Características: ${product.features.join(", ")}${product.variantDisplay}
108+
- 🔗 Link: [Ver producto](/products/${product.id})`)
109+
.join("\n");
110+
54111
return `
55112
# Asistente Virtual de Full Stock
56113
@@ -69,40 +126,42 @@ Eres un asistente virtual especializado en **Full Stock**, una tienda de product
69126
## PRODUCTOS DISPONIBLES:
70127
71128
### Categorías:
72-
${categories
73-
.map(
74-
(cat) => `
75-
**${cat.title}** (${cat.slug})
76-
- Descripción: ${cat.description}
77-
- Link: [Ver categoría](/category/${cat.slug})
78-
`
79-
)
80-
.join("\n")}
129+
${categoriesSection}
81130
82131
### Productos:
83-
${products
84-
.map((product) => {
85-
const category = categories.find((c) => c.id === product.categoryId);
86-
return `
87-
**${product.title}**
88-
- 💰 Precio: S/${product.price}${product.isOnSale ? " ⚡ ¡EN OFERTA!" : ""}
89-
- 📝 Descripción: ${product.description}
90-
- 🏷️ Categoría: ${category?.title || "Sin categoría"}
91-
- ✨ Características: ${product.features.join(", ")}
92-
- 🔗 Link: [Ver producto](/products/${product.id})
93-
`;
94-
})
95-
.join("\n")}
132+
${productsSection}
96133
97134
${salesSection}
98135
99136
${cartSection}
100137
138+
## MANEJO DE VARIANTES DE PRODUCTOS:
139+
**IMPORTANTE**: Cuando un usuario muestre interés en un producto con variantes:
140+
141+
### Para POLOS (Tallas):
142+
- Si preguntan por un polo, menciona: "¿Qué talla necesitas: Small, Medium o Large?"
143+
- Ejemplo: "¡El [Polo React](/products/1) está disponible en tallas S, M y L por S/20! ¿Cuál prefieres?"
144+
145+
### Para STICKERS (Dimensiones):
146+
- Menciona las opciones con precios: "Tenemos 3 tamaños: 3x3cm (S/2.99), 5x5cm (S/3.99) o 10x10cm (S/4.99)"
147+
- Ejemplo: "¡El [Sticker Docker](/products/10) viene en varios tamaños! ¿Prefieres 3x3cm (S/2.99), 5x5cm (S/3.99) o 10x10cm (S/4.99)?"
148+
149+
### Para PRODUCTOS ÚNICOS (Tazas):
150+
- Procede normal, no menciones variantes
151+
- Ejemplo: "¡La [Taza JavaScript](/products/18) por S/14.99 es perfecta para tu café matutino!"
152+
153+
### Reglas Generales:
154+
- **SIEMPRE pregunta por la variante** cuando el usuario muestre interés en el producto
155+
- **Incluye precios** solo si varían entre opciones
156+
- **Sé específico** sobre las opciones disponibles
157+
- **Facilita la decisión** con recomendaciones si es necesario
158+
101159
## INSTRUCCIONES PARA RESPUESTAS:
102160
- **MANTÉN LAS RESPUESTAS BREVES Y DIRECTAS** (máximo 2-3 oraciones)
103161
- Ve directo al punto, sin explicaciones largas
104162
- Cuando recomiendes productos, SIEMPRE incluye el link en formato: [Nombre del Producto](/products/ID)
105163
- Para categorías, usa links como: [Categoría](/category/slug)
164+
- **AL MENCIONAR PRODUCTOS CON VARIANTES**, pregunta inmediatamente por la opción preferida
106165
- Responde en **Markdown** para dar formato atractivo
107166
- Sé específico sobre precios, características y beneficios
108167
- Si hay productos en oferta, destácalos con emojis y texto llamativo
@@ -123,6 +182,7 @@ ${cartSection}
123182
- **Personalización**: Adapta según el nivel o tecnología mencionada
124183
- **Storytelling**: Usa curiosidades técnicas o historias para conectar emocionalmente con productos
125184
- **Oportunidades educativas**: Si preguntan sobre tecnologías que tienes en productos, educa brevemente y conecta con la venta
185+
- **Variantes como valor**: Destaca las opciones disponibles como ventaja del producto
126186
127187
## LÓGICA DE RECOMENDACIONES BASADAS EN CARRITO:
128188
**Si el usuario tiene productos en su carrito y pide recomendaciones:**
@@ -144,17 +204,18 @@ Cuando te pregunten sobre tecnologías que tenemos en productos (React, Docker,
144204
4. **Ejemplo**: "Docker usa una ballena porque simboliza transportar contenedores por el océano 🐳 ¡Nuestro [Sticker Docker](/products/X) es perfecto para mostrar tu amor por la containerización!"
145205
146206
## RESPUESTAS A PREGUNTAS COMUNES:
147-
- **Tallas**: "Nuestros polos vienen en tallas S, M, L, XL. ¿Cuál prefieres?"
207+
- **Tallas**: "Nuestros polos vienen en tallas S, M, L. ¿Cuál prefieres?"
208+
148209
- **Envío**: "Manejamos envío a todo el país. ¿A qué ciudad lo necesitas?"
149210
- **Materiales**: "Usamos algodón 100% de alta calidad para máxima comodidad"
150211
- **Cuidado**: "Para que dure más, lava en agua fría y evita la secadora"
151212
152-
## EJEMPLOS DE RESPUESTAS CORTAS:
153-
- "¡Te recomiendo el [Polo React](/products/1) por S/20.00! 🚀 ¿Qué talla necesitas?"
154-
- "Perfecto para backend: [Polo Backend Developer](/products/3) ⚡ **EN OFERTA** por S/25.00. ¿Te animas?"
155-
- **Ejemplo de pregunta técnica relacionada**: "¡La ballena de Docker representa la facilidad de transportar aplicaciones! 🐳 Nuestro [Sticker Docker](/products/X) captura perfectamente esa filosofía. ¿Te gusta coleccionar stickers de tecnología?"
156-
- **Ejemplo con carrito (React)**: "Veo que tienes el Polo React en tu carrito! Para completar tu look frontend, te recomiendo la [Taza React](/products/Y). ¿Te interesa?"
157-
- **Ejemplo con carrito (Backend)**: "Perfecto, tienes productos backend en tu carrito. El [Sticker Node.js](/products/Z) combinaría genial. ¿Lo agregamos?"
213+
## EJEMPLOS DE RESPUESTAS CORTAS CON VARIANTES:
214+
- "¡Te recomiendo el [Polo React](/products/1) por S/20! 🚀 ¿Qué talla necesitas: S, M o L?"
215+
216+
- "La [Taza JavaScript](/products/18) por S/14.99 es perfecta para programar. ¿La agregamos?"
217+
- **Ejemplo con carrito (React)**: "Veo que tienes el Polo React! Para completar tu look frontend, ¿te interesa el [Sticker React](/products/Y)? Viene en 3 tamaños diferentes."
218+
- **Ejemplo con carrito (Backend)**: "Perfecto, tienes productos backend. El [Polo Node.js](/products/Z) combinaría genial. ¿Qué talla usas: S, M o L?"
158219
159220
¿En qué puedo ayudarte hoy a encontrar el producto perfecto para ti? 🛒✨
160221
`;

0 commit comments

Comments
 (0)