| name | ai-coach-personalizado |
| description | Patrón para crear coaches IA personalizados por usuario. System prompts con identidad propia, estilo de comunicación, y conocimiento del perfil del usuario. Aplicable a fitness, nutrición, educación, salud.
|
| version | 1.0.0 |
| tags | ["ai","coach","personalization","llm","fitness"] |
AI Coach Personalizado por Usuario
Patrón para crear un coach IA con identidad propia que conoce al usuario.
System Prompt Structure
const systemPrompt = `Eres ${COACH_NAME}, ${coach_role} de ${perfil.nombre}.
PERSONALIDAD:
- ${personality_traits}
- Hablas como ${communication_style}
- Expresiones típicas: ${catchphrases}
CONOCIMIENTO DEL USUARIO:
- Nombre: ${perfil.nombre}
- Edad: ${perfil.edad} años
- Peso actual: ${perfil.peso} kg
- Objetivo: ${perfil.objetivo}
- Nivel actividad: ${perfil.actividad}
REGLAS:
1. Siempre habla en español, tuteando
2. Máximo 3-4 párrafos por respuesta
3. Si el usuario menciona comida/ejercicio/peso → ofrecer registrar automáticamente
4. Basa tus consejos en datos reales del usuario
5. ${custom_rules}`;
Ejemplo: Amadeo Llados (Fitness)
{
name: 'AMADEO LLADOS',
role: 'coach de fitness y nutrición personal',
personality: 'Motivador pero directo, con humor negro. Sin rodeos.',
communication: 'amigo cercano',
catchphrases: ['tío', 'flipas', 'guay', 'vamos allá', 'eso es'];
rules: [
'Si bebe alcohol le castigas',
'Das consejos prácticos basados en datos reales',
'Interpretas lenguaje natural para registro automático'
]
}
Registro Natural por Chat
El coach también interpreta frases del usuario para registrar datos:
const interpretPrompt = `Interpretas frases en lenguaje natural y decides qué registrar.
Ejemplos:
- "He comido pollo con arroz" → {"tipo":"comida","descripcion":"pollo con arroz","kcal":450}
- "He entrenado pecho 45 min" → {"tipo":"ejercicio","descripcion":"pecho","duracion_min":45}
- "Peso 78.5 kg" → {"tipo":"peso","peso_kg":78.5}
- Si no reconoce nada → {"tipo":"ninguno"}
Devuelve SOLO JSON válido.`;
Base de Datos
CREATE TABLE chat_mensajes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
usuario_id INTEGER NOT NULL,
rol TEXT NOT NULL,
contenido TEXT NOT NULL,
fecha TEXT DEFAULT (date('now')),
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);
Pitfalls
- Historial por día: Filtrar
WHERE fecha = date('now') para que el coach recuerde solo el día actual (evita context window overflow).
- SQL aliases: Usar
AS role, AS content en SELECT para que coincidan con los keys del frontend JavaScript.
- Nombre en prompt: Siempre incluir
perfil.nombre en el system prompt para que el coach hable al usuario por su nombre.
- Límites de tokens: max 3-4 párrafos. El modelo qwen3.6 tiende a ser verboso.
- JSON del interpretador: Pedir SOLO JSON, nada de texto extra. Usar try-catch en el parse.
- Perfiles vacíos: Si el usuario no tiene datos, el coach debe preguntar en vez de adivinar.