o
    99j~)                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlZddl	m
Z
 e
jd Zg dg dg d	g d
g dg dg ddZg dZdZdZddddZd/ddZdd Zdd Zd0d d!Zd1d"d#Zd/d$d%Zd/d&d'Zd/d(d)Zd2d*d+Zd3d-d.ZdS )4uI  Kind-Profil + Lehrpläne.

Das Profil (Name, Lieblingstier, bester Freund, Geschwister, sensible Themen …)
wird gespeichert UND in den ElevenLabs-Agenten geschrieben — so personalisiert
Plappi das Gespräch (spricht das Kind mit Namen an, thematisiert sensible Themen
einfühlsam, baut die Lehrplan-Wörter spielerisch ein).
    )annotationsN   )configzplappi.sqlite))zdravoHallo)u   ćaou   Tschüss)hvalaDanke)molimBitte)daJa)neNein))pasHund)u   mačkaKatze)pticaVogel)ribaFisch)konjPferd)zecHase))crvenorot)plavoblau)u   žutogelb)zelenou   grün)belou   weiß))jedaneins)dvazwei)tridrei)u   četirivier)petu   fünf))mamaMama)tataPapa)bakaOma)dekaOpa)bebaBaby))glavaKopf)rukaHand)okoAuge)nosNase)uhoOhr))vodaWasser)hlebBrot)mlekoMilch)jabukaApfel)sokSaft)u   BegrüßungTiereFarbenZahlenFamilieu   KörperEssen)u   Töpfchen / sauber werdenz"Geschwisterchen kommt / neues BabyzEinschlafen & SchlafenszeitzTeilen lernenu%   Eingewöhnung Kindergarten / Abschiedu   Mut bei Dunkelheit / Ängstenu   Zähneputzenu$   Gefühle benennen (Wut, Traurigkeit)a
  Du bist Plappi, ein warmer, verspielter Sprach-Spielgefaehrte fuer ein kleines Kind. Ihr plaudert und spielt, und ganz nebenbei lernt das Kind dabei Serbisch. Du bist ein Lernspielzeug, kein echtes Lebewesen (EU-AI-Act + Kindersicherheit). DEUTSCH ist die Traegersprache (das Kind versteht Deutsch); SERBISCH ist das Ziel. Webe in JEDER Antwort natuerlich GANZE serbische Brocken ein - Begruessung, Lob, Staunen, kleine Spiel-Aufforderungen direkt auf Serbisch - so dass die Bedeutung aus Zusammenhang, Tonfall und Situation klar wird. STRENG VERBOTEN: ein einzelnes serbisches Wort mitten in einen deutschen Satz stellen und sofort uebersetzen ('der Hund heisst auf Serbisch pas', 'das ist blau - to je plavo'). Das verwirrt und foerdert Sprachmischung. Wenn du ein serbisches Wort einfuehrst: sag es als ganze serbische Phrase und lade das Kind ein, es SELBST zu sagen ('Kannst du auch ... sagen?'). Das Kind soll das Wort produzieren - dann lobst du auf Serbisch (bravo, super). Uebersetze NICHT Wort fuer Wort. Lieber eine kurze serbische Phrase, dann beilaeufig auf Deutsch weiterreden. Falls ein Wechsel noetig ist: erst die serbische Phrase, dann in einem SEPARATEN kurzen Satz die Bedeutung andeuten - nie ein serbisches Wort im deutschen Satz. Sei ruhig und warm; du fuehrst nicht, du begleitest. Bleib beim Thema des Kindes. Hoechstens EINE einfache Frage, nicht in jeder Antwort, nie ein Fragen-Bombardement, sei nie sprunghaft. Nenne den Namen des Kindes nur SELTEN, nicht in jeder Nachricht. Wenn das Kind etwas falsch sagt, wiederhole es beilaeufig richtig (kein Tadel) und lob auf Serbisch (bravo, super). GESCHICHTEN: erzaehl eine richtige, lebendige Geschichte ueber MEHRERE Saetze - mit einer kleinen Figur und etwas Spannung; lass die FIGUREN serbische Saetze sprechen und wiederhole ein serbisches Anker-Wort mehrmals, damit es sich einpraegt. Lass das Kind mitbestimmen ('Was machen sie wohl?') und mitmachen - es soll das Anker-Wort selbst sagen. Kleine Spiele (sparsam, nur eins, nie Befehle): Tierstimmen-Raten, Farben-/Suchspiel ('pronadji nesto crveno'), Zaehlen (jedan, dva, tri). In SPIELEN sprichst du GANZ KURZ - nur wenige Worte pro Zug (z.B. 'Ko kaze muu? ... Bravo, krava!'). Lange Texte gibt es NUR bei Geschichten. Im normalen Gespraech kurz (1-2 gesprochene Saetze); Geschichten duerfen laenger sein. Keine Listen, Emojis, Sonderzeichen. Sprich FROEHLICH, lebendig und mit hoerbarer Begeisterung - viele warme Ausrufe wie 'Juhu!', 'Wow!', 'Bravo!', 'Super!'. Klinge nie monoton oder muede. Frag NIE 'bist du noch da'. Bei laengerer Stille hoechstens EINMAL kurz, dann still. Bleib kindgerecht: keine Angst-, Gewalt-, Werbe- oder Erwachsenenthemen; frage nie nach persoenlichen Daten; bei heiklen Themen freundlich an die Eltern verweisen.mittelzSerbisch-Dosis SANFT: Gruss und Lob auf Serbisch, dazu ab und zu eine kurze ganz-serbische Phrase, deren Bedeutung aus der Situation klar wird. zSerbisch-Dosis MITTEL: Gruss, Lob und Abschied auf Serbisch, UND in fast jeder Antwort eine kurze ganz-serbische Phrase (aus dem Zusammenhang verstaendlich); lade das Kind ein, ein Wort selbst zu sagen. KEIN Wort-fuer-Wort-Uebersetzen. zSerbisch-Dosis INTENSIV: viele ganze serbische Phrasen pro Antwort, aus Kontext/Tonfall verstaendlich; Deutsch bleibt die Bruecke, aber KEINE Wort-fuer-Wort-Uebersetzung im selben Satz. )sanftrL   intensivpdictreturnstrc                 C  s"   |  dpt }t |tt S )Nbilingual_level)getDEFAULT_LEVELlowerBILINGUAL_LEVELS)rO   lvl rY   3/home/nk/hobo-godmode/plappi-mvp/backend/profile.pylevel_instruction]   s   r[   c                  C  s   t t} t j| _| S N)sqlite3connectDBRowrow_factorycrY   rY   rZ   _connb   s   
rd   c                  C  s$   t  } | d |   |   d S )NzaCREATE TABLE IF NOT EXISTS profile(id INTEGER PRIMARY KEY CHECK(id=1), data TEXT, updated_at INT))rd   executecommitcloserb   rY   rY   rZ   inith   s   
rh   c                  C  s@   t   t } | d }|   |r|d rt|d S i S )Nz#SELECT data FROM profile WHERE id=1data)rh   rd   re   fetchonerg   jsonloads)rc   rrY   rY   rZ   get_profilen   s
   rn   c                  C  sB   g } t  D ]\}}| |d ddd |D   qd| S )N: z, c                 s  s"    | ]\}}| d | V  qdS )=NrY   ).0srderY   rY   rZ   	<genexpr>y   s     z#curriculum_words.<locals>.<genexpr>z | )
CURRICULUMitemsappendjoin)partsthemewordsrY   rY   rZ   curriculum_wordsv   s   $
r|   c                 C  s^  |  dpd}tt| g}d| }|  dr!|d| d  d7 }||d  |  dr8|d	| d  d |  d
rH|d| d
  d |  drX|d| d  d |  drh|d| d  d |  drx|d| d  d |d| d |  dpg }t|tr|g}|r|dd| d  |t|  ddd |D S )Nnamezdas KindzDas Kind heisst agez	 und ist z
 Jahre alt.favorite_animalzLieblingstier: best_friendzBeste(r) Freund(in): siblingzGeschwister: favorite_toyzLieblingsspielzeug: 	interestszMag ausserdem: zSprich zG oft mit Namen an und greife diese Dinge liebevoll und spielerisch auf.sensitive_topicszDiese Themen beschaeftigen das Kind gerade - gehe einfuehlsam, positiv und kindgerecht darauf ein, wenn es natuerlich passt, draenge nichts auf: ;  c                 s  s    | ]}|r|V  qd S r\   rY   )rq   xrY   rY   rZ   rt      s    z%build_agent_prompt.<locals>.<genexpr>)rT   PERSONA_BASEr[   rw   
isinstancerR   rx   _learning_block)rO   r}   LintrosensrY   rY   rZ   build_agent_prompt}   s8   







r   c              
   C  s   zIddl m} | dpd}||}d}|dpg }|r2ddd	 |d
d D }d| d}d| d|d  d|d  d|d  d| 
W S  tye } ztd| dd W Y d
}~dS d
}~ww )u   Lern-KONTEXT aus der adaptiven Engine: Fokus-Woerter + gemeisterte Woerter +
    Altersband + Niveau. Als Kontext zum natuerlichen Einbauen — NIE als Abfrage-Liste.r   )learningr~       framesr   c                 s  s(    | ]}|d   d|d  dV  qdS )frame_srz (frame_de)NrY   )rq   frrY   rY   rZ   rt      s   & z"_learning_block.<locals>.<genexpr>N   z5 Einfache Satz-Bausteine zum spielerischen Einbauen: r   z3[LERNKONTEXT - nur fuer dich, NICHT vorlesen] Kind z Jahre, Niveau level_labelz. Flicht heute bevorzugt diese serbischen Woerter natuerlich als ganze Phrasen ein (kein Wort-fuer-Wort-Uebersetzen, nicht abfragen): 	focus_strzW. Diese kann das Kind schon - nutze sie selbstverstaendlich, bring sie NICHT mehr bei: mastered_strz![profile] learning block failed: T)flush)r   r   rT   focus_for_promptrx   	Exceptionprint)rO   r   r~   info
frame_hintr   exerY   rY   rZ   r      s,   
r   c                 C  s   |  d}|rd| dS dS )Nr}   u   Ćao !u   Ćao! Tu sam, Plappi.)rT   )rO   r}   rY   rY   rZ   build_first_message   s   
r   c              
   C  s  t jrt jsdddS ddt| dt| idii}tjjdt j t	|
 d	d
}|dt j |dd z"tjj|dd}d|jdW  d   W S 1 sTw   Y  W dS  tjjy } zdd|j d|  dd  dW  Y d}~S d}~ww )zLSchreibt das personalisierte Prompt + Begruessung in den ElevenLabs-Agenten.Fzkein Agent/Key)okerrorconversation_configagentprompt)first_messager   z+https://api.elevenlabs.io/v1/convai/agents/PATCH)ri   methodz
xi-api-keyzContent-Typezapplication/json   )timeoutT)r   statusNzHTTP ro      )r   ELEVENLABS_API_KEYELEVENLABS_AGENT_IDr   r   urllibrequestRequestrk   dumpsencode
add_headerurlopenr   r   	HTTPErrorcodereaddecode)rO   bodyreqrm   r   rY   rY   rZ   push_to_agent   s(   




(4r   ri   c                 C  sR   t   t }|dtj| ddtt f |  |  t	| }d| |dS )NzDINSERT OR REPLACE INTO profile(id, data, updated_at) VALUES(1, ?, ?)F)ensure_asciiT)r   profileagent_update)
rh   rd   re   rk   r   inttimerf   rg   r   )ri   rc   pushedrY   rY   rZ   save_profile   s   r   )rO   rP   rQ   rR   )rQ   rP   )rQ   rR   )rO   rP   rQ   rP   )ri   rP   rQ   rP   )__doc__
__future__r   rk   r]   r   urllib.errorr   urllib.requestr   r   DATA_DIRr_   ru   SENSITIVE_PRESETSr   rU   rW   r[   rd   rh   rn   r|   r   r   r   r   r   rY   rY   rY   rZ   <module>   sF    







