+
    jHàjþV  ã                  óf  € R t ^ RIHt ^ RIHt ^ RIHt ^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHtHt ]P8                  ! ]4      tR	tR
t Rt!Rt"Rt#R R lt$R R lt%R R lt&R R lt'R R lt(]! ^R7      R R l4       t) ! R R4      t*R# )uï  Supervision of one llama-server in router mode.

The router process is ours (restart with backoff on crash); router children are its problem â€” child
failures surface via GET /models exit_code, never auto-retried here. Learned on real hardware:
health-200 is NOT readiness â€” every readiness claim requires a touch generation (temp-0, expected
token, generous budget, reasoning_content scanned); always dial 127.0.0.1 â€” resolving localhost adds
~2s per request on Windows via IPv6 fallback.
)Úannotations)Úsuppress)Ú	lru_cacheN)ÚPath©Úruntimes_root)Úchild_query)Úserver_child_envÚspawn_serverz3Reply with exactly one word: the capital of France.ÚparisiH  c               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "ÚH/home/ubuntu/.hermes/hermes-agent/hermes_cli/local_runtime/supervisor.pyÚ__annotate__r   -   s   € ÷ +ñ +�Dñ +ó    c                 ó$   € \        4       R,          # )zEndpoint state for other Hermes processes (provider resolution routes llamacpp-alias
requests at the managed server from this).zserver.jsonr   r   r   r   Ú
state_pathr   -   s   € ô ‹?˜]Õ*Ð*r   c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r   r   3   s   € ÷ ñ �$ñ r   c                ó|   € \        \        4      ;_uu_ 4        V ! 4        RRR4       R#   + '       g   i     R# ; i)zABest-effort call; a child that vanished mid-walk is not an error.N)r   Ú	Exception)Úfns   &r   Ú_quietr   3   s!   € ä	”)×	Õ	Ù
Œ÷ 
×	×	Ò	ús   ˜*ª;	c               ó   € V ^8„  d   QhRR/# ©r   r   Úintr   )r   s   "r   r   r   9   s   € ÷ "ñ "�Cñ "r   c                 óÊ   € \         P                   ! 4       ;_uu_ 4       p V P                  R4       V P                  4       ^,          uuRRR4       #   + '       g   i     R# ; i)ú	127.0.0.1N)r!   é    )ÚsocketÚbindÚgetsockname©Úss    r   Ú
_free_portr(   9   s6   € Ü	�Š�Œ˜AØ	�‰ÐÔ Ø�}‰}‹˜qÕ!÷ 
��‹ús   ž(AÁA"	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ?   s   € ÷ ñ �cñ r   c                 ó   €  \         P                   ! 4       ;_uu_ 4       p V P                  R\        34       \        uuRRR4       #   + '       g   i     R# ; i  \         d(    \        P                  R\        4       \        4       u # i ; i)z�The stable default port, or an ephemeral one only when something else already listens
there (a leftover managed server would have been cleaned up by stop()).r!   Nur   port %d busy; managed llama-server falling back to an ephemeral port â€” resumed sessions follow the live endpoint)r#   r$   Ú_DEFAULT_PORTÚOSErrorÚloggerÚwarningr(   r&   s    r   Ú_stable_portr/   ?   sd   € ðÜ�]Š]�_Œ_ Ø�F‰F�K¤Ð/Ô0Ü ÷ �_�_‹_ûô ô Ü�‰ðAÜBOô	Qô ‹|Òð	ús-   ‚A ŸA¼
A ÁA	ÁA ÁA Á/BÂBc               ó   € V ^8„  d   QhRR/# ©r   r   Ústrr   )r   s   "r   r   r   M   s   € ÷ ñ ˜ñ r   c                 óô  € \        4       R,          p \        \        4      ;_uu_ 4        V P                  RR7      P	                  4       p\        V4      ^8¼  d   VuuRRR4       #  RRR4       \        P                  ! ^4      p V P                  P                  RRR7       V P                  VRR7       V#   + '       g   i     LY; i  \         d"   p\        P                  RT4        Rp?T# Rp?ii ; i)	u  One key for the life of the install, persisted beside the runtimes.

Endpoint identity must survive restarts as a UNIT â€” sessions persist base_url + api_key, so a
per-boot key strands every resumed session on HTTP 401 exactly as a per-boot port would on
connection errors.
z.api_keyz	utf-8-sig)ÚencodingNT©ÚparentsÚexist_okúutf-8zJcould not persist api key (%s); sessions will need a re-pick after restart)r   r   r,   Ú	read_textÚstripÚlenÚsecretsÚtoken_urlsafeÚparentÚmkdirÚ
write_textr-   r.   )Úkey_pathÚexistingÚkeyÚexcs       r   Ú_stable_api_keyrE   M   sÖ   € ô ‹ Õ+€HÜ	”'×	Õ	Ø×%Ñ%¨{Ð%Ó;×AÑAÓCˆÜˆx‹=˜BÔØ÷ 
Ò	à÷ 
ô ×
Ò
 Ó
#€Cð7Ø�‰×Ñ d°TÐÔ:Ø×Ñ˜C¨'ÐÔ2ð €J÷ 
×	ûô ô 7Ü�‰ð 1Ø25÷	7ð 	7à€Jûð7ús#   ©2B8Â0C Â8C	ÃC7ÃC2Ã2C7)Úmaxsizec               ó    € V ^8„  d   QhRRRR/# )r   Ú
executabler   r   ztuple[str, ...]r   )r   s   "r   r   r   d   s   € ÷ ;ñ ; ð ;¨ñ ;r   c                óÜ   € \         P                  ! \        V 4      R.RRRRR^\        V P                  4      R7      pVP                  VP
                  ,           pRV9   d   R# RV9   d   R	# R
# )zRSelect the loading option supported by this engine, including older pinned builds.z--helpTr8   Úreplace)Úcapture_outputÚtextr4   ÚerrorsÚcheckÚtimeoutÚcwdú--load-modez--direct-io)rQ   Údio)z-dior   )Ú
subprocessÚrunr2   r>   ÚstdoutÚstderr)rH   ÚresultÚ	help_texts   &  r   Ú_direct_io_argsrY   c   sn   € ô �^Š^œS ›_¨hÐ7ÈØ!%°À	ÐQUØ$&¬C°
×0AÑ0AÓ,BôD€Fð —‘ §¡Õ-€IØ˜	Ô!Ø%Ð%Ø%¨Ô2ˆ9Ð:¸Ð:r   c            
      óŠ  € ] tR t^otRtR9tR^RRRRRRRR/R R	 llt]R
 R l4       tR R lt	R:RR/R R lllt
R:R R lltR R ltR;R R lltR R ltR R ltR R ltR R lt]R R!/R" R# ll4       tR$ R% ltR<R& R' lltR=R( R) lltR* R+ ltR, R- ltR>R. R/ lltR?R0 R1 lltR=R2 R3 lltR>R4 R5 lltR>R6 R7 lltR8tR# )@ÚLlamaServerSupervisorzEOwn one llama-server router process for the life of a Hermes session.Ú
models_maxÚportNÚ
extra_argsÚlog_pathÚpreset_pathc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r   Úbinaryr   Ú
models_dirr\   r   r]   z
int | Noner^   zlist[str] | Noner_   zPath | Noner`   r   )r   s   "r   r   Ú"LlamaServerSupervisor.__annotate__x   sF   € ÷ .ñ .˜tð .°ð .Ø ð.Ø,6ð.à-ð.ð 'ð.ð *ñ	.r   c               	ó<  € \        V4      V n        \        V4      V n        W0n        T;'       g    \	        4       V n        \        4       V n        \        T;'       g    . 4      V n	        T;'       g%    V P                  P                  R ,          R,          V n        Wpn        RV n        RV n        RV n        ^ V n        RV n        \$        P&                  ! 4       V n        \$        P*                  ! 4       V n        RV n        RV n        RV n        / V n        RV n        R# )Úlogszllama-server.logNF)r   rb   rc   r\   r/   r]   rE   Úapi_keyÚlistr^   r>   r_   r`   ÚprocÚ_jobÚprimary_modelÚ	_restartsÚ	_stoppingÚ	threadingÚEventÚ_stop_eventÚRLockÚ_lifecycle_lockÚ_stateÚ	_watchdogÚ_log_handleÚ_idle_sinceÚ_refit_usable)Úselfrb   rc   r\   r]   r^   r_   r`   s   &&&$$$$$r   Ú__init__ÚLlamaServerSupervisor.__init__x   sá   € ô ˜6“lˆŒÜ˜zÓ*ˆŒØ$ŒØ×*Ð*œL›NˆŒ	Ü&Ó(ˆŒÜ˜z×/Ð/¨RÓ0ˆŒØ ×ZÐZ T§_¡_×%;Ñ%;¸fÕ%DÐGYÕ%YˆŒØ&ÔØ-1ˆŒ	ØˆŒ	Ø)-ˆÔØˆŒØˆŒÜ$Ÿ?š?Ó,ˆÔÜ(ŸšÓ0ˆÔØ#'ˆŒØ26ˆŒØˆÔØ-/ˆÔà)-ˆÖr   c               ó   € V ^8„  d   QhRR/# r1   r   )r   s   "r   r   rd   ™   s   € ÷ 2ñ 2˜#ñ 2r   c                	ó"   € R V P                    R2# )úhttp://127.0.0.1:z/v1©r]   ©rx   s   &r   Úbase_urlÚLlamaServerSupervisor.base_url˜   s   € à" 4§9¡9 +¨SÐ1Ð1r   c               ó    € V ^8„  d   QhRRRR/# )r   Úrouter2   r   r   )r   s   "r   r   rd   œ   s   € ÷ 6ñ 6˜#ð 6 #ñ 6r   c                	ó$   € R V P                    V 2# )r}   r~   )rx   rƒ   s   &&r   Ú_urlÚLlamaServerSupervisor._urlœ   s   € Ø" 4§9¡9 +¨e¨WÐ5Ð5r   Ú	json_typeTc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rƒ   r2   Úbodyúdict | NoneÚ	timeout_sr   r‡   Úboolr   )r   s   "r   r   rd   Ÿ   s)   € ÷ >ñ >˜3ð > kð >ÀSð >Ø ñ>r   c               	ó0  € R RV P                    2/pV'       d   RVR&   \        P                  P                  V P	                  V4      TVe%   \
        P                  ! V4      P                  4       MRR7      p\        P                  P                  WcR7      # )ÚAuthorizationzBearer zapplication/jsonzContent-TypeN)ÚheadersÚdata©rO   )	rg   ÚurllibÚrequestÚRequestr…   ÚjsonÚdumpsÚencodeÚurlopen)rx   rƒ   r‰   r‹   r‡   r�   Úreqs   &&&&$  r   Ú_openÚLlamaServerSupervisor._openŸ   s€   € à" g¨d¯l©l¨^Ð$<Ð=ˆßØ&8ˆG�NÑ#Ü�n‰n×$Ñ$ T§Y¡Y¨uÓ%5¸wØGKÒGW¬$¯*ª*°TÓ*:×*AÑ*AÔ*CÐ]að %ó cˆä�~‰~×%Ñ% cÐ%Ó=Ð=r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rƒ   r2   r‰   rŠ   r‹   r   r   Údictr   )r   s   "r   r   rd   ¨   s)   € ÷ 2ñ 2˜cð 2¨ð 2Èð 2ÐUYñ 2r   c                	óÔ   € V P                  WV4      ;_uu_ 4       pVP                  4       pV'       d   \        P                  ! V4      M/ uuR R R 4       #   + '       g   i     R # ; i©N)rš   Úreadr•   Úloads)rx   rƒ   r‰   r‹   ÚrÚraws   &&&&  r   Ú_requestÚLlamaServerSupervisor._request¨   s>   € Ø�Z‰Z˜ Y×/Ô/°1Ø—&‘&“(ˆCß&)”4—:’:˜c”?¨r÷ 0×/×/Ó/ús   ›0AÁA'	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rd   ¯   s   € ÷ &ñ &˜ñ &r   c                	ód  € V P                   p\        V4      R RR\        V P                  4      RV P                  R\        V P                  4      RRRRR	.\        V4      OpV P                  '       d@   V P                  P                  4       '       d    VR
\        V P                  4      .,          pMVR\        V P                  4      .,          pW P                  ,          pV P                  P                  P                  RRR7       V P                  e    \        V P                  P                  4       \!        V P                  RRRR7      V n        V P                  P#                  RV R24       V P                  P%                  4        \'        W P                  \(        P*                  \        VP                  4      \-        \.        P0                  4      R7      w  V n        V n        \6        P9                  RV P2                  P:                  V P                  4       V P=                  4        R# )z--hostr!   z--portz	--api-keyz--models-maxz--models-autoloadz	--metricsz--slotsz--no-uiz--jinjaz--models-presetz--models-dirTr5   NÚar8   rJ   )r4   rM   z

# spawn: Ú
)rU   rV   rP   Úenvz*llama-server router spawned pid=%s port=%s)rb   r2   r]   rg   r\   rY   r`   Úexistsrc   r^   r_   r>   r?   ru   r   ÚcloseÚopenÚwriteÚflushr
   rS   ÚSTDOUTr	   ÚosÚenvironri   rj   r-   ÚinfoÚpidÚ_write_state)rx   ÚexeÚcmds   &  r   Ú_spawnÚLlamaServerSupervisor._spawn¯   s³  € Ø�k‰kˆä�‹HØ�kØ”c˜$Ÿ)™)“nØ˜Ÿ™ØœC §¡Ó0ð  ØØØØð
ô ˜SÓ!ð
ˆð" ××Ð × 0Ñ 0× 7Ñ 7× 9Ò 9ØÐ%¤s¨4×+;Ñ+;Ó'<Ð=Õ=‰Cà�N¤C¨¯©Ó$8Ð9Õ9ˆCØ�‰ÕˆØ�‰×Ñ×"Ñ"¨4¸$Ð"Ô?Ø×ÑÒ'ä�4×#Ñ#×)Ñ)Ô*Ü §¡¨s¸WÈYÔWˆÔØ×Ñ×Ñ ¨S¨E°Ð4Ô5Ø×Ñ×ÑÔ ä+¨C×8HÑ8HÔQ[×QbÑQbÜ14°S·Z±Z³ÔFVÔWY×WaÑWaÓFbô dÑˆŒ	�4”9ä�‰Ð@À$Ç)Á)Ç-Á-ÐQU×QZÑQZÔ[ð 	×ÑÖr   c               ó    € V ^8„  d   QhRRRR/# ©r   r‹   r   r   r   r   )r   s   "r   r   rd   ×   s   € ÷ ñ ˜sð ¨Tñ r   c                	ón  € V P                   ;_uu_ 4        R V n        V P                  P                  4        V P	                  4        RRR4       V P                  V4       \        P                  ! V P                  RRR7      V n	        V P                  P                  4        R#   + '       g   i     Le; i)FNTzllamacpp-supervisor)ÚtargetÚdaemonÚname)rr   rm   rp   Úclearr¸   Ú_wait_healthrn   ÚThreadÚ_watchrt   Ústart)rx   r‹   s   &&r   rÄ   ÚLlamaServerSupervisor.start×   sy   € Ø×!×!Ó!Ø"ˆDŒNØ×Ñ×"Ñ"Ô$Ø�K‰KŒM÷ "ð 	×Ñ˜)Ô$Ü"×)Ò)°·±ÀTÐPeÔfˆŒØ�‰×ÑÖ÷ "×!ús   •2B$Â$B4	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rd   à   s   € ÷ 9ñ 9˜dñ 9r   c                	ó*  € ^ RI p^ RIp^ RIHp ^ RIHp VP                  V P                  P                  4      pRV P                  RV P                  RVP                  RVP                  4       RV! VP                  4      R	VP                  4       R
VP                  ! 4       RVP                  4       P                  4       RV! VP                  ! 4       4      /	V n        \        4       p^ RIHp V! VP$                  4       V! W`P                  RR7       R# )r"   N)Úget_process_start_time)Úatomic_json_writer€   rg   r´   Úcreate_timeÚ
start_timerH   Ú	owner_pidÚowner_create_timeÚowner_start_time)Úmkdir_under_hermes_homei€  )Úmode)r±   ÚpsutilÚgateway.statusrÈ   ÚutilsrÉ   ÚProcessri   r´   r€   rg   rÊ   r¶   Úgetpidrs   r   Úhermes_constantsrÏ   r>   )rx   r±   rÑ   rÈ   rÉ   ri   ÚpathrÏ   s   &       r   rµ   Ú"LlamaServerSupervisor._write_stateà   sÅ   € ÛÛÝ9Ý+à�~‰~˜dŸi™iŸm™mÓ,ˆà! 4§=¡=°)¸T¿\¹\Ø˜dŸh™h¨°t×7GÑ7GÓ7IØ#Ñ%;¸D¿H¹HÓ%EØ# T§X¡X£Z°¸b¿iºi»kØ*¨F¯N©NÓ,<×,HÑ,HÓ,JØ)Ñ+AÀ"Ç)Â)Ã+Ó+NðPˆŒô ‹|ˆÝ<Ù §¡Ô,Ù˜$§¡°%×8r   c               ó    € V ^8„  d   QhRRRR/# r»   r   )r   s   "r   r   rd   ó   s   € ÷ bñ b cð b¨dñ br   c           	     	ó€  € \         P                  ! 4       V,           p\         P                  ! 4       V8  EdG   V P                  P                  4       '       d   \	        R 4      hV P
                  '       dM   V P
                  P                  4       e1   \	        RV P
                  P                   RV P                   R24      h\        \        P                  P                  \        \        4      ;_uu_ 4        \        P                  P!                  V P#                  R4      ^R7      ;_uu_ 4       pVP$                  ^È8X  d    RRR4       RRR4       R#  RRR4       RRR4       \         P&                  ! ^4       EKa  \        RV RV P                   R24      h  + '       g   i     LM; i  + '       g   i     LX; i)	zllama-server startup cancelledNzllama-server exited rc=z during startup (log: Ú)z/healthr‘   zllama-server not healthy after zs (log: )ÚtimeÚ	monotonicrp   Úis_setÚRuntimeErrorri   ÚpollÚ
returncoder_   r   r’   ÚerrorÚURLErrorr,   ÚTimeoutErrorr“   r˜   r…   ÚstatusÚsleep)rx   r‹   Údeadliner¢   s   &&  r   rÁ   Ú"LlamaServerSupervisor._wait_healthó   s@  € Ü—>’>Ó# iÕ/ˆÜ�nŠnÓ Õ)Ø×Ñ×&Ñ&×(Ò(Ü"Ð#CÓDÐDØ�y�yˆy˜TŸY™YŸ^™^Ó-Ò9Ü"Ð%<¸T¿Y¹Y×=QÑ=QÐ<Rð S,Ø,0¯M©M¨?¸!ð$=ó >ð >äœ&Ÿ,™,×/Ñ/´¼,×GÕGÜ—^‘^×+Ñ+¨D¯I©I°iÓ,@È!Ð+×LÔLÐPQØ—x‘x 3”Ø÷ M÷ HÑGà&÷ M÷ Hô �JŠJ�q�MÜÐ<¸Y¸KÀxÐPT×P]ÑP]ÈÐ^_Ð`ÓaÐa÷	 M×Lú÷ H×Gús*   Ã69F-Ä/F	ÅF-ÅF-ÆF*Æ%F-Æ-F=	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rd     s   € ÷ Eñ E˜ñ Er   c                óÆ  € V P                   '       Eg‹   V P                  pVf   R# VP                  4       pVf   \        P                  ! ^4       KQ  V P                   '       d   R# \
        \        V P                  \        \
        4      ^,
          4      ,          p\        P                  RW P                  ^,           V4       V P                  P                  V4      '       d   R# V ;P                  ^,          un         V P                  ;_uu_ 4        V P                   '       d    RRR4       R# V P                  4        V P                  4        RRR4       V P!                  ^x4       V P"                  '       d   V P%                  V P"                  4       EKš  EK�  R#   + '       g   i     LV; i  \&         d#   p\        P)                  RT4        Rp?EKÚ  Rp?ii ; i)z=Restart the router (not its children) on crash, with backoff.Nz-llama-server exited rc=%s; restart #%s in %sszllama-server restart failed: %s)rm   ri   rà   rÜ   ræ   Ú_RESTART_BACKOFF_SÚminrl   r;   r-   r.   rp   Úwaitrr   Ú_reap_orphaned_childrenr¸   rÁ   rk   Úensure_model_readyr   râ   )rx   ri   ÚrcÚbackoffrD   s   &    r   rÃ   ÚLlamaServerSupervisor._watch  sW  € à—.—.‘.Ø—9‘9ˆDØŠ|ÙØ—‘“ˆBØŠzÜ—
’
˜1”ÙØ�~�~ˆ~ÙÜ(¬¨T¯^©^¼SÔASÓ=TÐWXÕ=XÓ)YÕZˆGÜ�N‰NÐJÈB×P^ÑP^ÐabÕPbÐdkÔlØ×Ñ×$Ñ$ W×-Ò-ÙØ�NŠN˜aÕ�Nð
EØ×)×)Ó)Ø—~—~�~Ø÷ *Ñ)ð ×0Ñ0Ô2Ø—K‘K”M÷	 *ð
 ×!Ñ! #Ô&Ø×%×%Ð%Ø×+Ñ+¨D×,>Ñ,>×?ò &ñ- !÷  *×)ûô ô EÜ—‘Ð>À×DÓDûðEúsB   Ä F3 ÄF Ä(F3 Ä2 F Å*F3 Å=F3 Æ F0	Æ+F3 Æ3G Æ>GÇG c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rd     s   € ÷ (ñ (�dñ (r   c                	ól  € V P                   ;_uu_ 4        R V n        V P                  P                  4         V P                  '       d8   V P                  P                  4       f   V P                  V P                  4       V P                  e"   V P                  P                  4        RV n        T P                  '       d"   T P                  P                  4        RT n	        RRR4       R#   T P                  e#   T P                  P                  4        RT n        i i ; i  + '       g   i     R# ; i)TN)
rr   rm   rp   Úsetri   rà   Ú_terminate_treerj   r¬   ru   r   s   &r   ÚstopÚLlamaServerSupervisor.stop  sØ   € Ø×!×!Ó!Ø!ˆDŒNØ×Ñ× Ñ Ô"ð%Ø—9—9�9 §¡§¡Ó!1Ò!9Ø×(Ñ(¨¯©Ô3à—9‘9Ò(Ø—I‘I—O‘OÔ%Ø $�D”Ià××ÐØ× Ñ ×&Ñ&Ô(Ø#'�Ô ÷ "Ñ!øð —9‘9Ò(Ø—I‘I—O‘OÔ%Ø $�D•Ið )ú÷ "×!Ð!ús*   •"D"¸A	C-ÂA D"Ã!D"Ã-2DÄD"Ä"D3	Úverified_rootFc               ó$   € V ^8„  d   QhRRRRRR/# )r   ri   zsubprocess.Popenrù   rŒ   r   r   r   )r   s   "r   r   rd   0  s(   € ÷ Dñ DÐ.ð DÀ$ð DÐSWñ Dr   c          	     óJ  a€ . p\         P                  3p\        \        4      ;_uu_ 4        ^ RIpW4P                  3,          pV'       dE   V P                  RR7      pV P                  4       '       g   VP                  V P                  4      hMQ\        VP                  4      ;_uu_ 4        VP                  V P                  4      P                  RR7      pRRR4       RRR4        V F  o\        SP                  4       K  	  V P                  4         V P                  ^R7       V F  o\        V3R l4       K  	  R#   + '       g   i     Lt; i  + '       g   i     L; i  T d    T P                  4         LYi ; i  T F  o\        T3R l4       K  	  i ; i)a-  Terminate the router AND its model children.

Each child holds gigabytes of VRAM; terminating only the router (TerminateProcess on
Windows does no cleanup) orphans them with the weights still resident. Enumerate children
FIRST (the parent must be alive to walk them), terminate all, escalate to kill.
NT)Ú	recursiver‘   c                 óT   <€ S P                  4       ;'       d    S P                  4       # rŸ   )Ú
is_runningÚkill)Úchilds   €r   Ú<lambda>Ú7LlamaServerSupervisor._terminate_tree.<locals>.<lambda>O  s   ø€ ˜u×/Ñ/Ó1×BÐB°e·j±j³lÐBr   )rS   ÚTimeoutExpiredr   ÚImportErrorrÑ   Úchildrenrþ   ÚNoSuchProcessr´   ÚErrorrÔ   r   Ú	terminaterí   rÿ   )ri   rù   r  ÚtimeoutsrÑ   r   s   &$   @r   rö   Ú%LlamaServerSupervisor._terminate_tree/  s;  ø€ ð ˆÜ×-Ñ-Ð/ˆÜ”k×"Õ"Ûà×.Ñ.Ð0Õ0ˆHßàŸ=™=°4˜=Ó8�Ø—‘×(Ò(Ø ×.Ñ.¨t¯x©xÓ8Ð8ð )ô ˜fŸl™l×+Õ+Ø%Ÿ~™~¨d¯h©hÓ7×@Ñ@È4Ð@ÓP�H÷ ,÷ #ð
	DÛ!�Ü�u—‘Ö'ñ "à�N‰NÔðØ—	‘	 "�	Ô%ó "�ÜÔBÖCó "÷ ,×+ú÷ #×"ûð$ ô Ø—	‘	–ðûó "�ÜÔBÖCò "úsT   ¬AEÁ49EÂ-,E	ÃEÃ*.F ÄE+ ÅEÅEÅE(	Å+FÆF ÆFÆF ÆF"c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rd   Q  s   € ÷ ñ ¨ñ r   c                óZ  € V P                   e$   V P                   P                  4        RV n         R# \        P                  R8X  d   R#  ^ RIp\        V P                  4      pT P                  e   T P                  P                  MRpTP                  RR.4       Fä  p\        TP                  TP                  4      ;_uu_ 4        TP                  P                  R4      ;'       g    ^ pTP                  P                  R4      T8w  g1   TP                  T8X  g    T'       d#   TP!                  T4      '       d    RRR4       K¬  \"        P%                  RTP                  4       TP'                  4        RRR4       Kæ  	  R#   \         d     R# i ; i  + '       g   i     EK  ; i)a)  Kill model children orphaned by a router crash, before respawn.

A dead parent can't be walked, so match by identity: any process running OUR
llama-server binary whose parent is gone is an orphan of a previous router. Its VRAM must
come back before the new router loads models next to the ghosts.
NÚwin32r¶   Úppidz*reaping orphaned llama-server child pid=%s)rj   r¬   ÚsysÚplatformrÑ   r2   rb   r   ri   r´   Úprocess_iterr   r  ÚAccessDeniedr³   ÚgetÚ
pid_existsr-   r.   rÿ   )rx   rÑ   r¶   Úown_pidÚpr  s   &     r   rî   Ú-LlamaServerSupervisor._reap_orphaned_childrenQ  s8  € ð �9‰9Ò Ø�I‰I�O‰OÔØˆDŒIÙÜ�<‰<˜7Ô"Ùð	Ûä�d—k‘kÓ"ˆCð $(§9¡9Ò#8�$—)‘)—-’-¸dˆØ×$Ñ$ e¨V _Ö5ˆAÜ˜&×.Ñ.°×0CÑ0C×DÕDØ—v‘v—z‘z &Ó)×.Ð.¨Q�Ø—F‘F—J‘J˜uÓ%¨Ô,°·±¸Ô0@ß  V×%6Ñ%6°t×%<Ò%<Ø÷	 EÑDô
 —‘ÐKÈQÏUÉUÔSØ—‘”÷ EÑDó 6øô ô 	Úð	ú÷ E×DÑDús1   Á
F ÃAFÄ&FÄ=FÅ0FÆFÆFÆF*c               ó    € V ^8„  d   QhRRRR/# )r   r‹   r   r   r�   r   )r   s   "r   r   rd   p  s   € ÷ Xñ X ð X¨Tñ Xr   c                óÂ   € V P                  RVR7      P                  R. 4       Uu/ uF-  pVR,          VP                  R/ 4      P                  RR4      bK/  	  up# u upi )z*{model_id: status_value} from GET /models.z/models©r‹   r�   Úidrå   ÚvalueÚunknown)r¤   r  )rx   r‹   Úms   && r   ÚmodelsÚLlamaServerSupervisor.modelsp  si   € ð Ÿ™ y¸I˜ÓF×JÑJÈ6ÐSUÔVóXÙV�Að �$•˜Ÿ™˜x¨Ó,×0Ñ0°¸)ÓDÒDÙVñXð 	Xùò Xs   ¦3Ac               ó$   € V ^8„  d   QhRRRRRR/# )r   Úmodel_idr2   r‹   r   r   r   r   )r   s   "r   r   rd   u  s&   € ÷ Pñ P 3ð P°3ð PÀñ Pr   c                	ó2   € V P                  R RV/VR7       R# )z/models/loadÚmodelr  N©r¤   )rx   r"  r‹   s   &&&r   Ú
load_modelÚ LlamaServerSupervisor.load_modelu  s   € Ø�‰�n w°Ð&9ÀYˆÖOr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rd   x  s   € ÷ 8ñ 8 ñ 8r   c                ó,   € V P                  R^
R7       R# )zäHave the router re-read the preset file (GET /models?reload=1). It applies new launch
flags to models that aren't loaded and unloads any loaded model whose flags changed, so
callers rewrite the file only while nothing is loaded.z/models?reload=1r  Nr%  r   s   &r   Úreload_presetsÚ$LlamaServerSupervisor.reload_presetsx  s   € ð 	�‰Ð(°BˆÖ7r   c               ó    € V ^8„  d   QhRRRR/# )r   r"  r2   r   r   r   )r   s   "r   r   rd   ~  s   € ÷ ñ  Sð ¨Tñ r   c                óT  € V P                  RRV/^xR7       \        P                  ! 4       ^,           p\        P                  ! 4       V8  dJ    V P                  4       P	                  V4      . \
        ORN59  d   R#  \        P                  ! R4       Kc  R#   \         d     R# i ; i)u›   Free the child's VRAM now (POST /models/unload; bogus name -> 400). Momentary: never
touches primary_model â€” the declaration is durable, an eject is not.z/models/unloadr$  r  Ú	unloadingNg333333Ó?)r¤   rÜ   rÝ   r  r  Ú	_RESIDENTr   ræ   )rx   r"  rç   s   && r   Úunload_modelÚ"LlamaServerSupervisor.unload_model~  s”   € ð 	�‰Ð&¨°(Ð(;ÀsˆÔKÜ—>’>Ó# bÕ(ˆÜ�nŠnÓ Ô)ðØ—;‘;“=×$Ñ$ XÓ.Ð6O¼	Ð6OÀ;Ñ6OÔOÙð Pô �JŠJ�sŽOñ *øô ô Úðús   Á-B ÂB'Â&B'c               ó    € V ^8„  d   QhRRRR/# )r   Únowzfloat | Noner   z	list[str]r   )r   s   "r   r   rd   ‹  s   € ÷ !ñ !˜lð !°iñ !r   c                ó–  € Vf   \         P                  ! 4       MTp. p V P                  4       pTP	                  4        EFB  w  rET\
        9  d   T P                  P                  TR4       K/  T P                  T4      pTfB   \        P                  RT\        YP                  P                  YA4      ,
          4      4       K…  TRJ d   T P                  P                  TR4       K©  T P                  P                  YA4      pY,
          T P                  8  d   KÝ   T P                  T4       T P                  P                  TR4       TP!                  T4       \        P                  RT\        Y,
          4      4       EKE  	  T#   \         d    Tu # i ; i  \         d#   p\        P#                  RYH4        Rp?EK„  Rp?ii ; i)a6  Unload models idle past IDLE_UNLOAD_S; returns their ids. Idle = no busy slots and no
queued work, tracked per model across calls; a model seen busy resets its clock. A
failed telemetry probe is neither idle nor busy: the clock is kept, so a flaky probe
cannot pin a resident model (and its VRAM) indefinitely.Nz7idle probe for %s failed; keeping idle clock (idle %ds)Fzidle-unloaded %s (idle %ds)zidle unload of %s failed: %s)rÜ   rÝ   r  r   Úitemsr/  rv   ÚpopÚ_probe_idler-   r³   r   r  Ú
setdefaultÚIDLE_UNLOAD_Sr0  Úappendr.   )	rx   r3  ÚunloadedÚstatusesr"  rå   ÚprobeÚ
first_idlerD   s	   &&       r   Ú
sweep_idleÚ LlamaServerSupervisor.sweep_idle‹  s„  € ð
 #&¢+Œd�nŠnÔ°3ˆØ ˆð	Ø—{‘{“}ˆHð !)§¡× 0ÑˆHØœYÔ&Ø× Ñ ×$Ñ$ X¨tÔ4ÙØ×$Ñ$ XÓ.ˆEØŠ}Ü—‘ÐUÐW_Ü ×&6Ñ&6×&:Ñ&:¸8Ó&IÕ IÓJôLáØ˜‹~Ø× Ñ ×$Ñ$ X¨tÔ4ÙØ×)Ñ)×4Ñ4°XÓCˆJØÕ $×"4Ñ"4Ô4ÙðNØ×!Ñ! (Ô+Ø× Ñ ×$Ñ$ X¨tÔ4Ø—‘ Ô)Ü—‘Ð9¸8ÄSÈÕIYÓEZ×[ñ' !1ð, ˆøô1 ô 	ØŠOð	ûô, ô NÜ—‘Ð=¸x×MÓMûðNús*   ŸF ÄA$FÆFÆFÆGÆ&GÇGc               ó$   € V ^8„  d   QhRRRRRR/# ©r   r"  r2   r‹   r   r   rŒ   r   )r   s   "r   r   rd   ®  s!   € ÷ ñ  sð °sð ÀTñ r   c                óŒ  €  V P                  RRVRRRR\        /.RRR	^ /VR
7      pVR,          ^ ,          R,          pVP                  R4      ;'       g    RR,           VP                  R4      ;'       g    R,           p\        VP	                  4       9   #   \
         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)u›   The readiness proof. Generous budget + reasoning_content scan â€” small token budgets
false-fail reasoning models, which spend their first tokens thinking.z/v1/chat/completionsr$  ÚmessagesÚroleÚuserÚcontentÚ
max_tokensi   Útemperaturer  ÚchoicesÚmessageÚ Ú Úreasoning_contentz"touch generation failed for %s: %sNF)r¤   ÚTOUCH_PROMPTr  ÚTOUCH_EXPECTÚlowerr   r-   r.   )rx   r"  r‹   ÚrespÚmsgÚblobrD   s   &&&    r   Útouch_generateÚ$LlamaServerSupervisor.touch_generate®  s¿   € ð		Ø—=‘=Ð!7Ø˜ :°¸ÀÌLÐ0YÐ/ZØ˜c =°!ð:5à@Ið !ó KˆDð �y•/ !Õ$ YÕ/ˆCØ—G‘G˜IÓ&×,Ð,¨"°Õ3°s·w±wÐ?RÓ7S×7YÐ7YÐWYÕZˆDÜ 4§:¡:£<Ñ/Ð/øÜô 	Ü�N‰NÐ?ÀÔOÝûð	ús$   ‚AB Á B Á7B ÂCÂ"B>Â>Cc               ó$   € V ^8„  d   QhRRRRRR/# rB  r   )r   s   "r   r   rd   ¼  s!   € ÷ -ñ -¨3ð -¸3ð -Èñ -r   c                óÂ   € V P                  4       P                  V4      pVf   \        RV R24      hV\        9  d   V P	                  WR7       V P                  V4      # )z=Load if needed, then prove readiness with a touch generation.zmodel z not present in models dirr  )r  r  ÚKeyErrorr/  r&  rU  )rx   r"  r‹   rå   s   &&& r   rï   Ú(LlamaServerSupervisor.ensure_model_ready¼  sY   € à—‘“×"Ñ" 8Ó,ˆØŠ>Ü˜V H :Ð-GÐHÓIÐIØœÔ"Ø�O‰O˜HˆOÔ:Ø×"Ñ" 8Ó,Ð,r   c               ó    € V ^8„  d   QhRRRR/# )r   r"  ú
str | Noner   rŒ   r   )r   s   "r   r   rd   Ç  s   € ÷ 2ñ 2 
ð 2°dñ 2r   c                ó(   € V P                  V4      RJ # )zÅNo processing requests and no busy slots. Router quirk: /slots and /metrics are
per-child and require ?model= (bare calls 400). With ``model_id`` checks that one child;
without, every loaded child.T)r7  )rx   r"  s   &&r   Úis_idleÚLlamaServerSupervisor.is_idleÇ  s   € ð ×Ñ Ó)¨TÐ1Ð1r   c               ó    € V ^8„  d   QhRRRR/# )r   r"  r\  r   zbool | Noner   )r   s   "r   r   rd   Í  s   € ÷ ñ  Jð ¸+ñ r   c                ó†  €  Ve   V.M>V P                  4       P                  4        UUu. uF  w  r#V\        9   g   K  VNK  	  upppV EF  p V P                  R\	        V4       24      p\        ;QJ d    R T 4       F  '       g   K   RM	  RM! R T 4       4      '       d    R# T P                  R\	        T4       2^
RR7      ;_uu_ 4       pTP                  4       P                  4       p	RRR4       X	P                  4        FE  p
T
P                  R	4      '       g   K  \        T
P!                  4       R,          4      R
8w  g   KC    R# 	  EK
  	  R# u uppi   \
        P                  P                   d   pTP                  R8X  d    Rp?EKK  h Rp?ii ; i  + '       g   i     L¶; i  \"         d     R# i ; i)uD  Tri-state idle probe for the sweeper: True = confirmed idle, False = confirmed
busy, None = the probe itself failed. The sweeper must never mistake a dead probe
for activity â€” that resets the idle clock and pins the model's VRAM. A model that
isn't loaded is idle: the router answers 400 for it (the reads don't autoload).Nz/slots?i�  c              3  óB   "  € T F  qP                  R 4      x € K  	  R# 5i)Úis_processingN)r  )Ú.0r'   s   & r   Ú	<genexpr>Ú4LlamaServerSupervisor._probe_idle.<locals>.<genexpr>Ü  s   é € Ð=±u°!—u‘u˜_×-Ð-³uùs   ‚TFz	/metrics?)r‹   r‡   zllamacpp:requests_processingg        éÿÿÿÿ)r  r5  r/  r¤   r   r’   râ   Ú	HTTPErrorÚcodeÚanyrš   r    ÚdecodeÚ
splitlinesÚ
startswithÚfloatÚsplitr   )rx   r"  r  rå   ÚloadedÚmidÚslotsrD   r¢   rL   Úlines   &&         r   r7  Ú!LlamaServerSupervisor._probe_idleÍ  sd  € ð
	Ø$,Ò$8�x‘jØ/3¯{©{«}×/BÑ/BÔ/DÔ\Ñ/D¡) !ÈÔR[ÑH[ŸA˜AÑ/DÒ\ð ä�ðØ ŸM™M¨G´KÀÓ4DÐ3EÐ*FÓG�E÷
 “3Ñ=±uÓ=—3—3’3Ñ=±uÓ=×=Ò=Ú Ø—Z‘Z )¬K¸Ó,<Ð+=Ð >È"ÐX]�Z×^Ô^ÐbcØŸ6™6›8Ÿ?™?Ó,�D÷ _à ŸO™OÖ-�DØŸ™Ð(F×GÔGÜ % d§j¡j£l°2Õ&6Ó 7¸3Ö >Û$ô .ñ ñ ùó! ]øô —|‘|×-Ñ-ô Ø—x‘x 3”Þ Øûðú÷ _×^ûô ô 	Úð	ús™   ‚(F1 ªE¾EÁ
F1 ÁEÁ,
F1 Á7F1 ÂF1 Â&F1 Â)(F1 ÃFÃ0/F1 Ä$"F1 ÅF1 ÅF1 ÅF1 ÅFÅ=FÆF1 ÆFÆFÆF1 ÆF.Æ)F1 Æ1G Æ?G )rv   rj   rr   ru   rw   rl   rs   rp   rm   rt   rg   rb   r^   r_   rc   r\   r]   r`   rk   ri   i„  )Né   )éx   )ru  )iX  rŸ   )i,  )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r9  ry   Úpropertyr€   r…   rš   r¤   r¸   rÄ   rµ   rÁ   rÃ   r÷   Ústaticmethodrö   rî   r  r&  r*  r0  r?  rU  rï   r^  r7  Ú__static_attributes__r   r   r   r[   r[   o   sè   † ÙOð €Mð.Ø#$ð.Ø9=ð.à04ð.ð *.ð.ð -1÷	.ð@ ô2ó ð2õ6ñ>Ø#'÷>ð >÷2õ&÷Põ9õ&bõEõ:(ð  ðDÈö Dó ðDõB÷>X÷
Põ8õ÷!÷F÷-÷2÷ó r   r[   )é   é   é   é<   )rp  Úready)+r{  Ú
__future__r   Ú
contextlibr   Ú	functoolsr   r•   Úloggingr±   r<   r#   rS   r  rn   rÜ   Úurllib.errorr’   Úurllib.requestÚpathlibr   Ú!hermes_cli.local_runtime.binariesr   Ú!hermes_cli.local_runtime.endpointr   Ú"hermes_cli.local_runtime.processesr	   r
   Ú	getLoggerrw  r-   rO  rP  rë   r/  r+   r   r   r(   r/   rE   rY   r[   r   r   r   Ú<module>r�     s¬   ðñõ #å Ý Û Û Û 	Û Û Û Û 
Û Û Û Û Ý å ;Ý 9ß Mà	×	Ò	˜8Ó	$€àD€Ø€Ø#Ð Ø€	ð €õ+õõ"õõñ, �2Ôô;ó ð;÷wó wr   