§
   ¶N˜·îbã                   ó²   — d 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
mZ  e¦   «         Zdd„Z G d„ d¦  «        Z e¦   «         Zdd
ededededef
d„ZdS )um   
AI Provider abstraction layer pro rÅ¯znÃ© poskytovatele AI.
Podporuje OpenAI, Anthropic Claude a Google AI.
é    N)Úaccounts©Úsend_prompt)Útrack_ai_failureÚtrack_ai_usagec                 ó–  — 	 ddl m} t          j        | ¦  «        }t          j        |¦  «        }t          j        |¦  «        s ||¬¦  «        S |t          j        |¦  «        f}|t          v rdS 	 t          j        |¦  «        rt           	                    |¦  «         dS t          j        d|› d�t          j        ¬¦  «         n=# t          $ r0}t          j        d|› d	|› �t          j        ¬¦  «         Y d
}~nd
}~ww xY w ||¬¦  «        S # t          $ r.}t          j        d|› �t          j        ¬¦  «         Y d
}~dS d
}~ww xY w)uã   
    Kontroluje AI API klÃ­Ä� a v pÅ™Ã­padÄ› chyby zobrazÃ­ dialog.
    VracÃ­ True pokud je klÃ­Ä� v poÅ™Ã¡dku, False pokud nastala chyba.
    
    Args:
        provider: VolitelnÃ½ parametr pro specifikaci poskytovatele
    r   )Úshow_ai_login_dialog©ÚproviderTz[plugin.video.milionar] u    API klÃ­Ä� je neplatnÃ½)Úlevelu1   [plugin.video.milionar] Chyba pÅ™i ovÄ›Å™ovÃ¡nÃ­ u    API klÃ­Ä�e: Nz3[plugin.video.milionar] Error checking AI API key: F)Úwcs.login.DialogAILoginr	   r   ÚresolveÚnameÚhas_keyÚget_keyÚ_validated_keysÚvalidateÚaddÚxbmcÚlogÚ
LOGWARNINGÚ	ExceptionÚLOGERROR)r   r	   Úcurrent_providerÚprovider_nameÚcheckedÚes         ú_/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/ai/AIProvider.pyÚ!check_ai_api_key_and_handle_errorr      sÈ  € ðØ@Ð@Ð@Ð@Ð@Ð@Ý#Ô+¨HÑ5Ô5ÐÝ œÐ&6Ñ7Ô7ˆõ ÔÐ 0Ñ1Ô1ð 	CØ'Ð'Ð1AÐBÑBÔBÐBð $¥XÔ%5Ð6FÑ%GÔ%GÐHˆØ•oÐ%Ð%Ø�4ð	BÝÔ Ð!1Ñ2Ô2ð Ý×#Ò# GÑ,Ô,Ð,Ø�tåŒHÐW°ÐWÐWÐWÕ_cÔ_nÐoÑoÔoÐoÐoøÝð 	Bð 	Bð 	BÝŒHÐiÈÐiÐiÐfgÐiÐiÕquô  rAð  Bñ  Bô  Bð  Bð  Bð  Bð  Bð  Bð  Bøøøøð	Bøøøà#Ð#Ð-=Ð>Ñ>Ô>Ð>øåð ð ð ÝŒÐJÀqÐJÐJÕRVÔR_Ð`Ñ`Ô`Ð`ØˆuˆuˆuˆuˆuøøøøðøøøsN   ‚AD ÁD Á2.C Â"$C ÃD Ã
DÃ&C<Ã7D Ã<DÄD Ä
EÄ#EÅEc                   óâ   — e Zd ZdZdd„Z	 	 ddededed	ed
edefd„Zddedededefd„Z	ddededefd„Z
ddededefd„Zddededefd„Zddededefd„Zdefd„Zdefd„Zdefd„Zdefd„ZdS )Ú
AIProvideru(   ZÃ¡kladnÃ­ tÅ™Ã­da pro AI poskytovatele.Nc                 óÄ   — t          j        ¦   «         | _        |p| j                             d¦  «        pd| _        d| j                             ¦   «         v r	d| _        d S d S )NÚai_providerÚmistral)Ú	xbmcaddonÚAddonÚaddonÚ
getSettingr   Úlower)Úselfr   s     r   Ú__init__zAIProvider.__init__:   sd   € Ý”_Ñ&Ô&ˆŒ
à (Ð ]¨D¬J×,AÒ,AÀ-Ñ,PÔ,PÐ ]ÐT]ˆÔà˜Ô-×3Ò3Ñ5Ô5Ð5Ð5Ø$-ˆDÔ!Ð!Ð!ð 6Ð5ó    FÚotherÚpromptÚmodelÚ	use_toolsÚ
usage_typeÚ
session_idÚreturnc                 ó0  ‡ ‡‡‡‡— t          ‰ j        ¬¦  «        st          d¦  «        ‚ˆˆˆˆ ˆfd„ˆˆˆˆ fd„ˆˆˆˆ fd„ˆˆˆˆ fd„ˆˆˆˆ fd„dœ                     ‰ j        ¦  «        }|€t          d
‰ j        › �¦  «        ‚‰p‰                      ¦   «         }t          j        ¦   «         }		  |¦   «         }
nP# t          $ rC}t          ‰ j        ||||t          t          j        ¦   «         |	z
  dz  ¦  «        ¦  «         ‚ d	}~ww xY wt          |
t          ¦  «        r6t          |
¦  «        dk    r#t          |
d         t          ¦  «        r|
d         ni }t          t          j        ¦   «         |	z
  dz  ¦  «        |d<   t          ‰ j        ||||¬¦  «         |
S )u¼  
        OdeÅ¡le prompt podle vybranÃ©ho poskytovatele.
        Automaticky kontroluje API klÃ­Ä� pÅ™ed odeslÃ¡nÃ­m a zapÃ­Å¡e volÃ¡nÃ­ (i selhanÃ©) do historie nÃ¡kladÅ¯.
        
        Args:
            prompt (str): Text promptu
            model (str, optional): SpecifickÃ½ model (pokud None, pouÅ¾ije se z nastavenÃ­)
            use_tools (bool): PouÅ¾Ã­t tools jako web search (pouze pro OpenAI)
            usage_type (str): K Ä�emu volÃ¡nÃ­ slouÅ¾Ã­ (millionaire_chat, quiz, ...); Å™Ã­dÃ­ tÅ™Ã­dÄ›nÃ­ v CenÃ¡ch AI
            session_id (str, optional): ID hry; volÃ¡nÃ­ jednÃ© hry se v historii spojÃ­
            
        Returns:
            tuple: (response_text, usage_data)
        r
   u5   AI API klÃ­Ä� nenÃ­ nastaven nebo dialog byl zruÅ¡en.c                  ó$   •—  ‰j         ‰‰‰fi ‰ ¤ŽS ©N)Ú_send_openai_prompt)Úkwargsr/   r.   r*   r0   s   €€€€€r   ú<lambda>z(AIProvider.send_prompt.<locals>.<lambda>V   s"   ø€ Ð$< DÔ$<¸VÀUÈIÐ$`Ð$`ÐY_Ð$`Ð$`€ r,   c                  ó"   •—  ‰j         ‰‰fi ‰ ¤ŽS r6   )Ú_send_anthropic_prompt©r8   r/   r.   r*   s   €€€€r   r9   z(AIProvider.send_prompt.<locals>.<lambda>W   s    ø€ Ð'B tÔ'BÀ6È5Ð'[Ð'[ÐTZÐ'[Ð'[€ r,   c                  ó"   •—  ‰j         ‰‰fi ‰ ¤ŽS r6   )Ú_send_google_promptr<   s   €€€€r   r9   z(AIProvider.send_prompt.<locals>.<lambda>X   s   ø€ Ð$< DÔ$<¸VÀUÐ$UÐ$UÈfÐ$UÐ$U€ r,   c                  ó"   •—  ‰j         ‰‰fi ‰ ¤ŽS r6   )Ú_send_mistral_promptr<   s   €€€€r   r9   z(AIProvider.send_prompt.<locals>.<lambda>Y   s    ø€ Ð%> TÔ%>¸vÀuÐ%WÐ%WÐPVÐ%WÐ%W€ r,   c                  ó"   •—  ‰j         ‰‰fi ‰ ¤ŽS r6   )Ú_send_groq_promptr<   s   €€€€r   r9   z(AIProvider.send_prompt.<locals>.<lambda>Z   s   ø€ Ð"8 $Ô"8¸ÀÐ"QÐ"QÈ&Ð"QÐ"Q€ r,   ©ÚopenaiÚ	anthropicÚgoogler$   ÚgroqNu    NepodporovanÃ½ AI poskytovatel: iè  é   Ú
latency_ms)r2   )r   r   Ú
ValueErrorÚgetÚget_current_modelÚtimeÚ	monotonicr   r   ÚintÚ
isinstanceÚtupleÚlenÚdictr   )r*   r.   r/   r0   r1   r2   r8   ÚsenderÚ
used_modelÚstartedÚresultÚerrorÚusages   ````  `      r   r   zAIProvider.send_promptB   s  øøøøø€ õ" 1¸$Ô:OÐPÑPÔPð 	VÝÐTÑUÔUÐUà`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ø[Ð[Ð[Ð[Ð[Ð[Ð[ØUÐUÐUÐUÐUÐUÐUØWÐWÐWÐWÐWÐWÐWØQÐQÐQÐQÐQÐQÐQð	Sð S÷ TWÒSVÐW[ÔWlÑSmÔSmð	 	ð
 ˆ>ÝÐWÀÔ@UÐWÐWÑXÔXÐXàÐ6˜d×4Ò4Ñ6Ô6ˆ
Ý”.Ñ"Ô"ˆð	Ø�V‘X”XˆFˆFøÝð 	ð 	ð 	Ý˜TÔ2°JÀ
ÈEÐS]Ý ¥$¤.Ñ"2Ô"2°WÑ"<ÀÑ!DÑEÔEñGô Gð Gàøøøøð	øøøõ (¨µÑ6Ô6Ðr½3¸v¹;¼;Èº?¸?ÍzÐZ`ÐabÔZcÕeiÑOjÔOj¸?��q”	�	ÐprˆÝ!¥4¤>Ñ#3Ô#3°gÑ#=ÀÑ"EÑFÔFˆˆlÑÝ�tÔ,¨j¸%ÀÐXbÐcÑcÔcÐcØˆs   Â,
B7 Â7
DÃ>C?Ã?Dc                 ó    — t          |||fi |¤ŽS )u    OdeÅ¡le prompt pÅ™es OpenAI API.)Úopenai_send_prompt)r*   r.   r/   r0   r8   s        r   r7   zAIProvider._send_openai_promptk   s   € å! &¨%°ÐEÐE¸fÐEÐEÐEr,   c                 ó"   — ddl m}  |||fi |¤ŽS )u*   OdeÅ¡le prompt pÅ™es Anthropic Claude API.r   r   )Úwcs.ai.AnthropicClientr   )r*   r.   r/   r8   Úanthropic_send_prompts        r   r;   z!AIProvider._send_anthropic_prompto   s/   € àOÐOÐOÐOÐOÐOØ$Ð$ V¨UÐ=Ð=°fÐ=Ð=Ð=r,   c                 ó"   — ddl m}  |||fi |¤ŽS )u#   OdeÅ¡le prompt pÅ™es Google AI API.r   r   )Úwcs.ai.GoogleClientr   )r*   r.   r/   r8   Úgoogle_send_prompts        r   r>   zAIProvider._send_google_promptt   s/   € àIÐIÐIÐIÐIÐIØ!Ð! &¨%Ð:Ð:°6Ð:Ð:Ð:r,   c                 ó"   — ddl m}  |||fi |¤ŽS )u$   OdeÅ¡le prompt pÅ™es Mistral AI API.r   r   )Úwcs.ai.MistralClientr   )r*   r.   r/   r8   Úmistral_send_prompts        r   r@   zAIProvider._send_mistral_prompty   s/   € àKÐKÐKÐKÐKÐKØ"Ð" 6¨5Ð;Ð;°FÐ;Ð;Ð;r,   c                 ó"   — ddl m}  |||fi |¤ŽS )u   OdeÅ¡le prompt pÅ™es Groq API.r   r   )Úwcs.ai.GroqClientr   )r*   r.   r/   r8   Úgroq_send_prompts        r   rB   zAIProvider._send_groq_prompt~   s/   € àEÐEÐEÐEÐEÐEØÐ ¨Ð8Ð8°Ð8Ð8Ð8r,   c                 ó   — | j         S )u(   VracÃ­ aktuÃ¡lnÄ› vybranÃ½ poskytovatel.)r   ©r*   s    r   Úget_current_providerzAIProvider.get_current_providerƒ   s   € àÔ$Ð$r,   c                 ó
   — g d¢S )u)   VracÃ­ seznam dostupnÃ½ch poskytovatelÅ¯.rC   © ri   s    r   Úget_available_providersz"AIProvider.get_available_providers‡   s   € àCÐCÐCÐCr,   c                 ó  — | j         dk    rddlm}  |¦   «         S | j         dk    rddlm}  |¦   «         S | j         dk    rddlm}  |¦   «         S | j         dk    rddlm}  |¦   «         S | j         dk    rddlm}  |¦   «         S dS )	u5   VracÃ­ aktuÃ¡lnÄ› vybranÃ½ model podle poskytovatele.rD   r   )rL   rE   rF   r$   rG   u	   neznÃ¡mÃ½)r   Úwcs.ai.OpenAIClientrL   r]   r`   rc   rf   )r*   rL   s     r   rL   zAIProvider.get_current_model‹   sò   € àÔ  HÒ,Ð,Ø=Ð=Ð=Ð=Ð=Ð=Ø$Ð$Ñ&Ô&Ð&ØÔ" kÒ1Ð1Ø@Ð@Ð@Ð@Ð@Ð@Ø$Ð$Ñ&Ô&Ð&ØÔ" hÒ.Ð.Ø=Ð=Ð=Ð=Ð=Ð=Ø$Ð$Ñ&Ô&Ð&ØÔ" iÒ/Ð/Ø>Ð>Ð>Ð>Ð>Ð>Ø$Ð$Ñ&Ô&Ð&ØÔ" fÒ,Ð,Ø;Ð;Ð;Ð;Ð;Ð;Ø$Ð$Ñ&Ô&Ð&à�;r,   c                 óŠ   — ddddddœ}|                      | j        | j        ¦  «        }|                      ¦   «         }d|› d|› �S )	uQ   VracÃ­ formÃ¡tovanÃ½ Å™etÄ›zec s informacÃ­ o aktuÃ¡lnÃ­m modelu a poskytovateli.ÚOpenAIÚ	Anthropicz	Google AIz
Mistral AIÚGroqrC   zAI: z - )rK   r   rL   )r*   Úprovider_namesÚprovider_displayr/   s       r   Úget_model_info_stringz AIProvider.get_model_info_stringŸ   se   € ð Ø$Ø!Ø#Øð
ð 
ˆð *×-Ò-¨dÔ.CÀTÔEZÑ[Ô[ÐØ×&Ò&Ñ(Ô(ˆà2Ð&Ð2Ð2¨5Ð2Ð2Ð2r,   r6   )NFr-   N)NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   ÚstrÚboolrQ   r   r7   r;   r>   r@   rB   rj   Úlistrm   rL   rv   rl   r,   r   r!   r!   7   sé  € € € € € Ø2Ð2ð.ð .ð .ð .ð fmØ&*ð'ð ' #ð '¨cð 'ÀTð 'Ð_bð 'Ø #ð'Ø9>ð'ð 'ð 'ð 'ðRFð F¨#ð F°cð FÈTð FÐhmð Fð Fð Fð Fð>ð >¨Sð >¸ð >ÐRWð >ð >ð >ð >ð
;ð ;¨#ð ;°cð ;Èuð ;ð ;ð ;ð ;ð
<ð <¨3ð <°sð <ÐPUð <ð <ð <ð <ð
9ð 9¨ð 9°Cð 9ÈUð 9ð 9ð 9ð 9ð
% cð %ð %ð %ð %ðD¨ð Dð Dð Dð Dð 3ð ð ð ð ð(3 sð 3ð 3ð 3ð 3ð 3ð 3r,   r!   Fr.   r/   r0   r   r3   c                 ón   — |r t          |¬¦  «        } |j        | ||fi |¤ŽS t          j        | ||fi |¤ŽS )uÖ  
    Wrapper funkce pro posÃ­lÃ¡nÃ­ promptÅ¯.
    Automaticky pouÅ¾Ã­vÃ¡ aktuÃ¡lnÄ› vybranÃ½ AI poskytovatel.
    Automaticky kontroluje API klÃ­Ä� pÅ™ed odeslÃ¡nÃ­m.
    
    Args:
        prompt (str): Text promptu
        model (str, optional): SpecifickÃ½ model
        use_tools (bool): PouÅ¾Ã­t tools jako web search (pouze pro OpenAI)
        provider (str, optional): SpecifickÃ½ poskytovatel
        
    Returns:
        tuple: (response_text, usage_data)
    r
   )r!   r   r#   )r.   r/   r0   r   r8   Útemp_providers         r   r   r   ±   sY   € ð  ð KÝ"¨HÐ5Ñ5Ô5ˆØ(ˆ}Ô(¨°¸	ÐLÐLÀVÐLÐLÐLåÔ& v¨u°iÐJÐJÀ6ÐJÐJÐJr,   r6   )NFN)rz   rM   r%   r   Úwcs.air   ro   r   r[   Úwcs.ai.UsageTrackerr   r   Úsetr   r   r!   r#   r{   r|   rQ   rl   r,   r   ú<module>rƒ      s  ððð ð
 €€€à Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø AÐ AÐ AÐ AÐ AÐ AØ @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ð �#‘%”%€ð!ð !ð !ð !ðHu3ð u3ð u3ð u3ð u3ñ u3ô u3ð u3ðp ˆj‰lŒl€ðKð K˜ð K Cð K¸4ð KÐSVð KÐlqð Kð Kð Kð Kð Kð Kr,   