§
   º”u»!`Æã                   ól   — d Z ddlZddlZddlZddlZddlmZ ddlm	Z
 ddlmZ dZ G d„ d¦  «        ZdS )	zlLive content source of the Millionaire game: one continuous AI chat per game session (see content/__init__).é    N)Ú	AIHandler)Úmillionaire_prompts)ÚTtsVoice©ÚAÚBÚCÚDc                   óX   — e Zd ZdZdZdZ	 	 dd„Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zdd„ZdS )Ú	AiContentÚaiÚ u    AI vytvÃ¡Å™Ã­ unikÃ¡tnÃ­ otÃ¡zkyNc	                 óä   — || _         || _        || _        || _        || _        || _        || _        |pi | _        t          ¦   «         | _	        d| _
        d| _        |                      ¦   «          d S )Nr   )Ú
media_typeÚtitleÚplotÚgenreÚepisode_titleÚseason_numberÚepisode_numberÚ
actor_datar   ÚvoiceÚsystem_promptÚ
session_idÚ_reset_chat)	Úselfr   r   r   r   r   r   r   r   s	            úb/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/games/content/ai.pyÚ__init__zAiContent.__init__   st   € à$ˆŒØˆŒ
ØˆŒ	ØˆŒ
Ø*ˆÔØ*ˆÔØ,ˆÔØ$Ð*¨ˆŒÝ‘Z”ZˆŒ
ØˆÔØˆŒØ×ÒÑÔÐÐÐó    c           
      óH  — |                       ¦   «          dt          j        ¦   «         j        dd…         › �| _        ddlm}  || j        | j        ¦  «         t          j	        | j
        | j        | j        | j        | j        | j        | j        | j        ¬¦  «        | _        dS )zeNew game: fresh chat history, a session id for cumulative usage tracking and the fixed system prompt.Úmillionaire_Né   r   )Údescribe_session)r   r   r   r   r   r   r   r   )r   ÚuuidÚuuid4Úhexr   Úwcs.ai.UsageTrackerr#   r   ÚpromptsÚbuild_system_promptr   r   r   r   r   r   r   r   )r   r#   s     r   ÚbeginzAiContent.begin#   s©   € à×ÒÑÔÐØ@­¬©¬Ô)9¸#¸2¸#Ô)>Ð@Ð@ˆŒØ8Ð8Ð8Ð8Ð8Ð8ØÐ˜œ¨$¬*Ñ5Ô5Ð5Ý$Ô8Ø”¨d¬j¸t¼yÐPTÔPZØÔ,¸DÔ<NØÔ.¸4¼?ðLñ Lô LˆÔÐÐr   c                 ó2  — g | _         | j        t          j        v rt	          j        t          j        d¦  «        nd gdz  | _        t           	                    t          d¦  «        | _        t          j        ¦   «         | _        d| _        d| _        i | _        d S )Né	   r   )Úchat_historyr   r(   ÚANGLE_MEDIAÚrandomÚsampleÚQUESTION_ANGLESÚanglesÚdictÚfromkeysÚLETTERSÚcorrect_countsÚ	threadingÚLockÚ_lockÚ_askedÚ_joinedÚ	_finished©r   s    r   r   zAiContent._reset_chat.   s}   € ØˆÔàDHÄOÕW^ÔWjÐDjÐDj•v”}¥WÔ%<¸aÑ@Ô@Ð@Ø!˜F Q™Jð 	Œå"Ÿmšm­G°QÑ7Ô7ˆÔÝ”^Ñ%Ô%ˆŒ
ØˆŒØˆŒØˆŒˆˆr   c                 óN   — |                       t          j        ¦   «         ¦  «        S ©N)Ú_chatr(   Úbuild_welcome_messager=   s    r   ÚwelcomezAiContent.welcome9   s   € Ø�zŠz�'Ô7Ñ9Ô9Ñ:Ô:Ð:r   c                 ó¤   — d|cxk    rdk    rn n| j         |dz
           nd }|                      t          j        ||¦  «        | j        ¬¦  «        S )Né   r,   )Ú	transform)r2   r@   r(   Úbuild_question_messageÚ_place_correct)r   Ú	round_numÚangles      r   ÚquestionzAiContent.question<   s_   € à./°9Ð.AÐ.AÒ.AÐ.AÀÒ.AÐ.AÐ.AÐ.AÐ.A�”˜I¨™MÔ*Ð*ÀtˆØ�zŠz�'Ô8¸ÀEÑJÔJÐVZÔViˆzÑjÔjÐjr   c                 óö  ‡ ‡‡‡	— |                      d¦  «        Š	t          |                      dd¦  «        ¦  «                             ¦   «                              ¦   «         Št	          ‰	t
          ¦  «        r.t          ‰	¦  «        t          t          ¦  «        k    s	‰t          vr|S t          ‰ j
                             ¦   «         ¦  «        Št          j        ˆˆ fd„t          D ¦   «         ¦  «        }ˆˆ	fd„t          D ¦   «         }t          j        |¦  «         i }t          D ]'}||k    r‰	‰         n|                     ¦   «         ||<   Œ(‰ j
        |xx         dz  cc<   t          |¦  «        }||d<   ||d<   |S )a  Move the right answer to a random letter that has been right least often in this game.

        Models put the right answer mostly under A or B; the position is chosen here instead, evenly enough that the
        letters stay balanced over nine rounds yet cannot be predicted.
        ÚoptionsÚcorrectr   c                 ó<   •— g | ]}‰j         |         ‰d z   k    ¯|‘ŒS )rD   )r6   )Ú.0ÚletterÚfewestr   s     €€r   ú
<listcomp>z,AiContent._place_correct.<locals>.<listcomp>L   s3   ø€ ÐjÐjÐj¨6ÀÔ@SÐTZÔ@[Ð_eÐhiÑ_iÒ@iÐ@i Ð@iÐ@iÐ@ir   c                 ó,   •— g | ]}|‰k    ¯‰|         ‘ŒS © rT   )rO   rP   rM   rL   s     €€r   rR   z,AiContent._place_correct.<locals>.<listcomp>M   s'   ø€ ÐLÐLÐL V¸&ÀGÒ:KÐ:K�˜”Ð:KÐ:KÐ:Kr   rD   )ÚgetÚstrÚstripÚupperÚ
isinstancer3   ÚsortedÚlistr5   Úminr6   Úvaluesr/   ÚchoiceÚshuffleÚpop)
r   ÚdataÚtargetÚwrongÚplacedrP   ÚresultrM   rQ   rL   s
   `      @@@r   rG   zAiContent._place_correctA   st  øøøø€ ð —(’(˜9Ñ%Ô%ˆÝ�d—h’h˜y¨"Ñ-Ô-Ñ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ˆÝ˜'¥4Ñ(Ô(ð 	­F°7©O¬O½tÅG¹}¼}Ò,LÐ,LÐPWÕ_fÐPfÐPfØˆKÝ�TÔ(×/Ò/Ñ1Ô1Ñ2Ô2ˆÝ”ÐjÐjÐjÐjÐjµWÐjÑjÔjÑkÔkˆØLÐLÐLÐLÐL­wÐLÑLÔLˆÝŒ�uÑÔÐØˆÝð 	Sð 	SˆFØ17¸6Ò1AÐ1A˜W WÔ-Ð-ÀuÇyÂyÁ{Ä{ˆF�6‰NˆNØÔ˜FÐ#Ð#Ô# qÑ(Ð#Ð#Ñ#Ý�d‘”ˆØ"ˆˆyÑØ"ˆˆyÑØˆr   c                 ój  — |                      dg ¦  «        }|                      dd¦  «        }g d¢}|                      t          j        ||dk     r||         nd|t	          |¦  «        k     r||         nd|dk     r||         nd|t	          |¦  «        k     r||         nd||dk    ¬	¦  «        ¦  «        S )
NrL   rM   r   r   é   r   r   r,   )rH   Úplayer_answer_letterÚplayer_answer_textÚcorrect_answer_letterÚcorrect_answer_textÚ
is_correctÚis_last_round)rU   r@   r(   Úbuild_feedback_messageÚlen)r   rH   Úanswer_indexrl   rJ   rL   Úcorrect_indexÚletterss           r   ÚfeedbackzAiContent.feedbackX   sÖ   € Ø—,’,˜y¨"Ñ-Ô-ˆØ Ÿš Y°Ñ2Ô2ˆØ&Ð&Ð&ˆØ�zŠz�'Ô8ØØ:FÈÒ:JÐ:J ¨Ô!6Ð!6ÐPSØ8DÅsÈ7Á|Ä|Ò8SÐ8S˜w |Ô4Ð4ÐY[Ø<IÈAÒ<MÐ<M '¨-Ô"8Ð"8ÐSVØ:GÍ#ÈgÉ,Ì,Ò:VÐ:V ¨Ô 6Ð 6Ð\^Ø!Ø$¨š>ð,ñ ,ô ,ñ -ô -ð 	-r   c                 ó¦   — t          j        | j        | j        |d         |d         | j        | j        | j        | j        | j        | j	        ¬¦
  «
        S )NrJ   rL   )
r   r   rJ   rL   r   r   r   r   r   r   )
Ú
ai_handlerÚgenerate_director_tipr   r   r   r   r   r   r   r   )r   rJ   s     r   ÚtipzAiContent.tipe   sW   € ÝÔ/Ø”¨d¬jÀ8ÈJÔCWÐaiÐjsÔatØ” $¤*¸DÔ<NÐ^bÔ^pØÔ.¸4¼?ðLñ Lô Lð 	Lr   c                 ó‚  — d|dœ}| j         5  | j        }| xj        dz  c_        | j        |gz   }ddd¦  «         n# 1 swxY w Y   d}	 t          j        | j        || j        ¬¦  «        \  }}|r ||¦  «        }|dt          j        |d¬¦  «        dœf}|| j         5  || j	        |<   | j
        | j	        v r[| j	                             | j
        ¦  «        }	|	r| j        t          |	¦  «        z   | _        | xj
        dz  c_
        | j
        | j	        v °[ddd¦  «         S # 1 swxY w Y   S # | j         5  || j	        |<   | j
        | j	        v r[| j	                             | j
        ¦  «        }	|	r| j        t          |	¦  «        z   | _        | xj
        dz  c_
        | j
        | j	        v °[ddd¦  «         w # 1 swxY w Y   w xY w)	a–  One exchange of the continuous chat: ask the AI, return the parsed JSON (after `transform`).

        Exchanges may run at the same time (the next question is asked while the feedback is written, the first one
        with the welcome). A request sees the exchanges finished before it; the answers join the chat in the order
        they were asked, so the chat always alternates user / assistant.
        Úuser)ÚroleÚcontentrD   N)r   Ú	assistantF)Úensure_ascii)r9   r:   r-   ru   Úgenerate_millionaire_chatr   r   ÚjsonÚdumpsr<   r;   r`   r[   )
r   Úuser_messagerE   ry   ÚnumberÚmessagesÚpairra   Ú_usageÚjoineds
             r   r@   zAiContent._chatk   s°  € ð ¨<Ð8Ð8ˆØŒZð 	2ð 	2Ø”[ˆFØˆKŒK˜1ÑˆKŒKØÔ(¨D¨6Ñ1ˆHð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð ˆð	&Ý%Ô?ÀÔ@RÐT\ØKOÌ?ð\ñ \ô \‰LˆD�&àð 'Ø �y ‘”�Ø ;½4¼:ÀdÐY^Ð;_Ñ;_Ô;_Ð`Ð`ÐaˆDØà”ð &ð &Ø)-�”˜vÑ&Ø”l d¤nÐ4Ð4Ø!œ^×/Ò/°´Ñ=Ô=�FØð MØ,0Ô,=ÅÀVÁÄÑ,L˜Ô)Ø�L”L AÑ%�L”Lð	 ”l d¤nÐ4Ð4ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ø�”ð &ð &Ø)-�”˜vÑ&Ø”l d¤nÐ4Ð4Ø!œ^×/Ò/°´Ñ=Ô=�FØð MØ,0Ô,=ÅÀVÁÄÑ,L˜Ô)Ø�L”L AÑ%�L”Lð	 ”l d¤nÐ4Ð4ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &øøøsT   �#<¼A ÁA Á
AD* ÂA4DÄD"	Ä%D"	Ä*F>Ä2A4F2Æ&F>Æ2F6Æ6F>Æ9F6Æ:F>)r   r   r   NNNr?   )Ú__name__Ú
__module__Ú__qualname__ÚnameÚbadgeÚ
rules_noter   r*   r   rB   rJ   rG   rs   rw   r@   rT   r   r   r   r      sÃ   € € € € € Ø€DØ€EØ3€Jà]aØ15ðð ð ð ð	Lð 	Lð 	Lð	ð 	ð 	ð;ð ;ð ;ðkð kð kð
ð ð ð.-ð -ð -ðLð Lð Lð&ð &ð &ð &ð &ð &r   r   )Ú__doc__r   r/   r7   r$   Úwcs.air   ru   Ú	wcs.gamesr   r(   Úwcs.games.voicer   r5   r   rT   r   r   ú<module>r‘      s©   ðà rÐ rØ €€€Ø €€€Ø Ð Ð Ð Ø €€€à *Ð *Ð *Ð *Ð *Ð *Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø $Ð $Ð $Ð $Ð $Ð $à
€ðw&ð w&ð w&ð w&ð w&ñ w&ô w&ð w&ð w&ð w&r   