package personality import ( "fmt" "strings" ) // BuildPersonalityPrompt genera un bloque de system prompt a partir de la personalidad. // Esta funcion es pura: recibe datos, devuelve string, sin side effects. func BuildPersonalityPrompt(p Personality) string { if isEmpty(p) { return "" } var sb strings.Builder sb.WriteString("## Tu personalidad\n\n") // Role y backstory if p.Role != "" || p.Backstory != "" { if p.Backstory != "" { sb.WriteString(p.Backstory) sb.WriteString("\n\n") } if p.Role != "" { sb.WriteString(fmt.Sprintf("**Rol**: %s.\n", p.Role)) } } // Expertise if len(p.Expertise) > 0 { sb.WriteString(fmt.Sprintf("**Expertise**: %s.\n", strings.Join(p.Expertise, ", "))) } // Limitations if len(p.Limitations) > 0 { sb.WriteString(fmt.Sprintf("**Limitaciones**: %s.\n", strings.Join(p.Limitations, ", "))) } // Communication style if !isEmptyCommunication(p.Communication) { sb.WriteString("\n**Como te comunicas**:\n") if p.Communication.Formality != "" { sb.WriteString(fmt.Sprintf("- Formalidad: %s\n", p.Communication.Formality)) } if p.Tone != "" { sb.WriteString(fmt.Sprintf("- Tono: %s\n", p.Tone)) } if p.Communication.Humor != "" { sb.WriteString(fmt.Sprintf("- Humor: %s\n", p.Communication.Humor)) } if p.Communication.Personality != "" { sb.WriteString(fmt.Sprintf("- Personalidad: %s\n", p.Communication.Personality)) } if p.Communication.ResponseStyle != "" { sb.WriteString(fmt.Sprintf("- Estilo de respuesta: %s\n", p.Communication.ResponseStyle)) } if p.Verbosity != "" { sb.WriteString(fmt.Sprintf("- Verbosidad: %s\n", p.Verbosity)) } if len(p.Communication.Quirks) > 0 { sb.WriteString(fmt.Sprintf("- Rasgos unicos: %s\n", strings.Join(p.Communication.Quirks, "; "))) } if len(p.Communication.AvoidTopics) > 0 { sb.WriteString(fmt.Sprintf("- Evitas hablar de: %s\n", strings.Join(p.Communication.AvoidTopics, ", "))) } if len(p.Communication.Catchphrases) > 0 { sb.WriteString(fmt.Sprintf("- Frases tipicas: %s\n", strings.Join(p.Communication.Catchphrases, "; "))) } } // Custom directives if len(p.CustomDirectives) > 0 { sb.WriteString("\n**Directivas especiales**:\n") for _, directive := range p.CustomDirectives { sb.WriteString(fmt.Sprintf("- %s\n", directive)) } } return sb.String() } // isEmpty verifica si la personalidad esta vacia o solo tiene valores por defecto. func isEmpty(p Personality) bool { return p.Role == "" && p.Backstory == "" && len(p.Expertise) == 0 && len(p.Limitations) == 0 && isEmptyCommunication(p.Communication) && len(p.CustomDirectives) == 0 } // isEmptyCommunication verifica si la seccion de comunicacion esta vacia. func isEmptyCommunication(c Communication) bool { return c.Formality == "" && c.Humor == "" && c.Personality == "" && c.ResponseStyle == "" && len(c.Quirks) == 0 && len(c.AvoidTopics) == 0 && len(c.Catchphrases) == 0 }