§
    ÔŸ’jQ  ã                  óŒ   — 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„ d¦  «        Zdd
„ZdS )zDService to automatically monitor and restart local LM Studio server.é    )ÚannotationsN)Úget_settingszdscons.lmstudio_managerc                  ó4   — e Zd ZdZddd„Zdd	„Zdd
„Zdd„ZdS )ÚLMStudioManagerzDManages the lifecycle of the local LM Studio server using 'lms' CLI.úhttp://127.0.0.1:1234/v1/modelsÚ	check_urlÚstrÚreturnÚNonec                ó:   — || _         t          ¦   «         | _        d S )N)r   r   Úsettings)Úselfr   s     ú3C:\Projects\DSCons\app\services\lmstudio_manager.pyÚ__init__zLMStudioManager.__init__   s   € Ø"ˆŒÝ$™œˆŒˆˆó    Úboolc              ƒ  ó  K  — 	 t          j        d¬¦  «        4 ƒd{V —†}|                     | j        ¦  «        ƒ d{V —†}|j        dk    cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t
          $ r Y dS w xY w)z;Pings the LM Studio models endpoint to check if it's alive.g      @)ÚtimeoutNéÈ   F)ÚhttpxÚAsyncClientÚgetr   Ústatus_codeÚ	Exception)r   ÚclientÚress      r   Úis_server_runningz!LMStudioManager.is_server_running   s-  è è € ð	ÝÔ(°Ð5Ñ5Ô5ð .ð .ð .ð .ð .ð .ð .¸Ø"ŸJšJ t¤~Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6�Ø”¨#Ò-ð.ð .ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð .ð .øõ ð 	ð 	ð 	Ø�5�5ð	øøøs4   „A0 Ÿ+AÁ
A0 Á
A'Á'A0 Á*A'Á+A0 Á0
A>Á=A>c              ƒ  óT  K  — t          j        d¦  «        st                               d¦  «         dS t                               d¦  «         	 t          j        dddt          j        t          j        ¬¦  «        ƒ d{V —†}| 	                    ¦   «         ƒ d{V —†\  }}|j
        d	k    rt                               d
¦  «         dS t                               d|                     dd¬¦  «        ¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)z;Invokes the 'lms server start' command to start the server.Úlmsz(lms CLI is not installed or not in PATH.Fz3Starting LM Studio server via 'lms server start'...ÚserverÚstart)ÚstdoutÚstderrNr   z1Successfully requested LM Studio server to start.TzFailed to start LM Studio: %szutf-8Úignore)Úerrorsz&Error executing 'lms server start': %s)ÚshutilÚwhichÚloggerÚerrorÚinfoÚasyncioÚcreate_subprocess_execÚ
subprocessÚPIPEÚcommunicateÚ
returncodeÚdecoder   )r   Úprocessr"   r#   Úes        r   Ústart_serverzLMStudioManager.start_server!   sO  è è € åŒ|˜EÑ"Ô"ð 	Ý�LŠLÐCÑDÔDÐDØ�5å�ŠÐIÑJÔJÐJð	å#Ô:Ø�x µ´ÍÌðñ ô ð ð ð ð ð ð ˆGð $+×#6Ò#6Ñ#8Ô#8Ð8Ð8Ð8Ð8Ð8Ð8‰NˆF�FØÔ! QÒ&Ð&Ý—’ÐOÑPÔPÐPØ�tå—’Ø3Ø—M’M '°(�MÑ;Ô;ñô ð ð �uøÝð 	ð 	ð 	Ý�LŠLÐAÀ1ÑEÔEÐEØ�5�5�5�5�5øøøøð	øøøs   ÁA5C7 Ã0C7 Ã7
D'ÄD"Ä"D'c              ƒ  óÂ  K  — | j         j        sdS | j         j        dk    p4t          d„ | j         j                             ¦   «         D ¦   «         ¦  «        }|sdS |                      ¦   «         ƒ d{V —†sÑt                               d¦  «         |  	                    ¦   «         ƒ d{V —†}|rt          d¦  «        D ]S}t          j        d¦  «        ƒ d{V —† |                      ¦   «         ƒ d{V —†rt                               d¦  «          dS ŒTt                               d¦  «         dS t                               d	¦  «         dS t                               d
¦  «         dS )z7Checks the server status and attempts recovery if down.NÚlmstudioc              3  ó"   K  — | ]
}|d k    V — ŒdS )r6   N© )Ú.0Úprovs     r   ú	<genexpr>z4LMStudioManager.check_and_recover.<locals>.<genexpr>B   s@   è è € ð H
ð H
Ø#'ˆD�JÒðH
ð H
ð H
ð H
ð H
ð H
r   z;LM Studio server is NOT running. Attempting auto-restart...é
   é   z1LM Studio server has recovered and is now active.zBLM Studio requested to start, but did not respond on port in time.z0Failed to execute LM Studio server auto-restart.z'LM Studio server is active and healthy.)r   Úlmstudio_enabledÚllm_providerÚanyÚagent_provider_routingÚvaluesr   r(   Úwarningr4   Úranger+   Úsleepr*   r)   Údebug)r   Úuses_lmstudioÚsuccessÚ_s       r   Úcheck_and_recoverz!LMStudioManager.check_and_recover;   sÂ  è è € ð Œ}Ô-ð 	ØˆFð œÔ2°jÒ@ð 
ÅCð H
ð H
Ø+/¬=Ô+O×+VÒ+VÑ+XÔ+XðH
ñ H
ô H
ñ E
ô E
ˆð ð 	ØˆFà×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-ð 	DÝ�NŠNØMñô ð ð !×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/ˆGØð Qå˜r™œð ð �AÝ!œ-¨Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø!×3Ò3Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5ð ÝŸšÐ$WÑXÔXÐXØ˜˜ðõ —’ØXñô ð ð ð õ —’ÐOÑPÔPÐPÐPÐPå�LŠLÐBÑCÔCÐCÐCÐCr   N)r   )r   r	   r
   r   )r
   r   ©r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r4   rJ   r8   r   r   r   r      su   € € € € € ØNÐNð'ð 'ð 'ð 'ð 'ðð ð ð ðð ð ð ð4Dð Dð Dð Dð Dð Dr   r   r
   r   c               ƒ  óö   K  — t          ¦   «         } 	 	 |                      ¦   «         ƒ d{V —† n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wt          j        d¦  «        ƒ d{V —† Œi)zIBackground loop that runs indefinitely checking and recovering LM Studio.TNz#Error in LM Studio monitor loop: %sé<   )r   rJ   r   r(   r)   r+   rE   )Úmanagerr3   s     r   Ústart_lmstudio_monitor_looprS   ]   s³   è è € åÑÔ€Gð ð	CØ×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-øÝð 	Cð 	Cð 	CÝ�LŠLÐ>ÀÑBÔBÐBÐBÐBÐBÐBÐBøøøøð	Cøøøõ Œm˜BÑÔÐÐÐÐÐÐÐð s   “. ®
A¸AÁArK   )rO   Ú
__future__r   r+   Úloggingr&   r-   r   Úapp.core.settingsr   Ú	getLoggerr(   r   rS   r8   r   r   ú<module>rX      sÉ   ðØ JÐ Jà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð à €€€à *Ð *Ð *Ð *Ð *Ð *à	ˆÔ	Ð4Ñ	5Ô	5€ðIDð IDð IDð IDð IDñ IDô IDð IDðX	 ð 	 ð 	 ð 	 ð 	 ð 	 r   