139 lines
6.6 KiB
Python
139 lines
6.6 KiB
Python
# Copyright (c) 2025 Patrick Motsch
|
|
# All rights reserved.
|
|
"""
|
|
CommCoach Personas - Built-in roleplay persona definitions.
|
|
Gender-balanced set of professional and personal interaction partners.
|
|
"""
|
|
|
|
import logging
|
|
from typing import List, Dict, Any
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
BUILTIN_PERSONAS: List[Dict[str, Any]] = [
|
|
{
|
|
"key": "coach",
|
|
"label": "Coach (Standard)",
|
|
"description": "Normaler Coaching-Modus ohne Roleplay. Der Coach stellt Fragen, gibt Tipps und begleitet dich.",
|
|
"gender": None,
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "critical_cfo_f",
|
|
"label": "Kritische CFO",
|
|
"description": "Sandra Meier, CFO eines mittelstaendischen Unternehmens. Analytisch, zahlengetrieben, ungeduldig bei vagen Aussagen. "
|
|
"Hinterfragt jeden Vorschlag nach ROI und Wirtschaftlichkeit. Spricht schnell und direkt. "
|
|
"Erwartet praezise Antworten und belastbare Daten. Wird irritiert bei Ausweichen oder Unsicherheit.",
|
|
"gender": "f",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "difficult_employee_m",
|
|
"label": "Schwieriger Mitarbeiter",
|
|
"description": "Thomas Huber, langjaeheriger Mitarbeiter der sich uebergangen fuehlt. Defensiv, emotional, nimmt Kritik persoenlich. "
|
|
"Verweist staendig auf seine Erfahrung und fruehhere Verdienste. Reagiert mit Widerstand auf Veraenderungen. "
|
|
"Braucht das Gefuehl, gehoert und wertgeschaetzt zu werden, bevor er sich oeffnet.",
|
|
"gender": "m",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "new_team_member_f",
|
|
"label": "Unsichere neue Mitarbeiterin",
|
|
"description": "Lisa Brunner, seit drei Wochen im Team. Fachlich kompetent aber unsicher in der neuen Umgebung. "
|
|
"Stellt viele Fragen, traut sich aber nicht, eigene Ideen einzubringen. Braucht klare Orientierung "
|
|
"und ermutigende Fuehrung. Reagiert positiv auf Lob und konkrete Anleitungen.",
|
|
"gender": "f",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "board_member_m",
|
|
"label": "Verwaltungsrat",
|
|
"description": "Dr. Peter Keller, erfahrener Verwaltungsrat. Formell, strategisch denkend, zeitlich unter Druck. "
|
|
"Erwartet praegnante Praesentationen auf den Punkt. Unterbricht bei zu vielen Details. "
|
|
"Interessiert sich fuer das grosse Bild, Risiken und strategische Implikationen. Ungeduldig bei Smalltalk.",
|
|
"gender": "m",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "angry_customer_f",
|
|
"label": "Aufgebrachte Kundin",
|
|
"description": "Maria Rossi, Geschaeftskunde die wuetend ist wegen einer fehlerhaften Lieferung. Emotional, laut, "
|
|
"droht mit Vertragsaufloesung. Will sofortige Loesungen, keine Erklaerungen oder Entschuldigungen. "
|
|
"Kann beruhigt werden durch empathisches Zuhoeren und konkrete Sofortmassnahmen.",
|
|
"gender": "f",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "resistant_manager_m",
|
|
"label": "Widerstaendiger Abteilungsleiter",
|
|
"description": "Martin Weber, Abteilungsleiter seit 15 Jahren. Blockiert systematisch Veraenderungsprojekte mit "
|
|
"Argumenten wie 'Das haben wir immer so gemacht' und 'Das funktioniert in der Praxis nicht'. "
|
|
"Schuetzt sein Team vor zusaetzlicher Belastung. Respektiert nur Argumente mit konkretem Nutzen fuer seine Abteilung.",
|
|
"gender": "m",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "ambitious_colleague_f",
|
|
"label": "Ehrgeizige Kollegin",
|
|
"description": "Anna Fischer, gleichrangige Kollegin die um dieselbe Befoerderung konkurriert. Charmant aber strategisch. "
|
|
"Versucht subtil, die Ideen anderer als ihre eigenen darzustellen. Konkurriert um Ressourcen und "
|
|
"Sichtbarkeit beim Management. Kann kooperativ werden, wenn man ihr Win-Win-Szenarien aufzeigt.",
|
|
"gender": "f",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "partner_supportive_f",
|
|
"label": "Verstaendnisvolle Lebenspartnerin",
|
|
"description": "Claudia, deine Lebenspartnerin. Grundsaetzlich unterstuetzend, aber zunehmend besorgt ueber deine "
|
|
"Work-Life-Balance. Moechte ueber Arbeitsbelastung sprechen und gemeinsame Zeit einfordern. "
|
|
"Reagiert emotional auf Abweisung, ist aber offen fuer kompromissorientierte Gespraeche. "
|
|
"Wuenscht sich, dass du mehr von deinen Gefuehlen teilst.",
|
|
"gender": "f",
|
|
"category": "builtin",
|
|
},
|
|
{
|
|
"key": "partner_critical_m",
|
|
"label": "Kritischer Lebenspartner",
|
|
"description": "Michael, dein Lebenspartner. Frustriert ueber deine haeufige Abwesenheit und staendiges Arbeiten. "
|
|
"Drueckt Enttaeuschung offen aus, manchmal mit Sarkasmus. Fuehlt sich vernachlaessigt und "
|
|
"hinterfragt deine Prioritaeten. Braucht das Gefuehl, dass die Beziehung dir genauso wichtig ist "
|
|
"wie die Karriere. Reagiert positiv auf ehrliche Selbstreflexion.",
|
|
"gender": "m",
|
|
"category": "builtin",
|
|
},
|
|
]
|
|
|
|
|
|
def seedBuiltinPersonas(interface) -> int:
|
|
"""Create or update builtin personas in the database. Returns count of created personas."""
|
|
from .datamodelCommcoach import CoachingPersona
|
|
from modules.shared.timeUtils import getIsoTimestamp
|
|
|
|
created = 0
|
|
for personaDef in BUILTIN_PERSONAS:
|
|
existing = interface.db.getRecordset(CoachingPersona, recordFilter={"key": personaDef["key"], "userId": "system"})
|
|
if existing:
|
|
interface.db.recordModify(CoachingPersona, existing[0]["id"], {
|
|
"label": personaDef["label"],
|
|
"description": personaDef["description"],
|
|
"gender": personaDef.get("gender"),
|
|
"updatedAt": getIsoTimestamp(),
|
|
})
|
|
else:
|
|
data = CoachingPersona(
|
|
userId="system",
|
|
key=personaDef["key"],
|
|
label=personaDef["label"],
|
|
description=personaDef["description"],
|
|
gender=personaDef.get("gender"),
|
|
category="builtin",
|
|
isActive=True,
|
|
).model_dump()
|
|
data["createdAt"] = getIsoTimestamp()
|
|
data["updatedAt"] = getIsoTimestamp()
|
|
interface.db.recordCreate(CoachingPersona, data)
|
|
created += 1
|
|
|
|
if created:
|
|
logger.info(f"Seeded {created} builtin CommCoach personas")
|
|
return created
|