+
    „WÝjZÅ  ã                  ó<	  a € 0 t $ R 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t^ RIt^ RIHt ^ RIHtHtHtHt ^ RIHtHt ^ RIHt ^ RIHt ^ RI H!t"H#t# ^ R	I$H%t%H&t& ^ R
I'H(t(H)t)H*t*H+t+H,t,H-t-H.t.H/t/H0t0H1t1H2t2 ^ RI3H4t4 ^ RI5H6t6H7t7H8t8 ^ RI9H:t:H;t; ^ RI<H=t= ]P|                  ! ]?4      t@]! 4       tA/ tBR]CR&   ]Pˆ                  ! 4       tE/ tFR]CR&   ]Pˆ                  ! 4       tGRÆtHRtI]J! 0 RÇm4      tKRtLRtMRtN ! R R]4      tO ! R R]4      tP ! R R]4      tQ ! R R]4      tR ! R R]4      tS ! R  R!]4      tT ! R" R#]4      tU ! R$ R%]4      tV ! R& R']4      tWR( R) ltXR* R+ ltY]P´                  RÈR, R- ll4       t[R.RR/R/R0 R1 llt\RÉR2 R3 llt]R4 R5 lt^R6 R7 lt_R8 R9 lt`R: R; ltaR< R= ltbR> R? ltcR@RRARRBRRCRD/RE RF lltdRG RH lteRIR/RJ RK lltfRL RM ltgRN RO lthRP RQ ltiRÉRR RS lltjRT RU ltkRV tlRW RX ltmRY RZ ltnR[ R\ ltoR] R^ ltpRÊR_ R` lltqRa Rb ltrRc Rd ltsRe Rf lttRg Rh ltuRÉRi Rj lltvRk Rl ltwRm Rn ltxRo Rp ltyRq Rr ltzRs Rt lt{Ru Rv lt|]APû                  Rw4      Rx 4       t~Ry Rz lt]APû                  R{4      R| 4       t€R}R~RR€/t�R�t‚R‚ Rƒ ltƒR„ R… lt„]APû                  R†4      R‡ 4       t…Rˆ R‰ lt†RŠ R‹ lt‡]AEP                  RŒ4      RÉR� RŽ ll4       t‰R� R� ltŠ]AEP                  R‘4      R’ R“ l4       t‹]AEP                  R”4      R• R– l4       tŒ]AEP                  R—4      R˜ R™ l4       t�]AEP                  Rš4      R› Rœ l4       t�R� Rž lt�RŸ R  lt‘]AEP                  R¡4      RÉR¢ R£ ll4       t’R¤ R¥ lt“R¦ R§ lt”R¨ R© lt•Rª]”R«]•/t–]AEP                  R¬4      R­ R® l4       t—]AEP                  R¯4      R° R± l4       t˜]AEP                  R²4      RÉR³ R´ ll4       t™]APû                  Rµ4      R¶ 4       tš]APû                  R·4      R¸ R¹ l4       t›]APû                  Rº4      RËR» R¼ ll4       tœ]APû                  R½4      R¾ R¿ l4       t�]AEP                  RÀ4      RÁ RÂ l4       tž]AEP                  RÃ4      RÄ RÅ l4       tŸR# )Ìu€  Local-models dashboard routes â€” the desktop's window into the managed llama.cpp runtime.

Every payload carries plain-language, pre-formatted facts the UI shows verbatim
(what will this model do ON THIS MACHINE, how big is the download, what is the
runtime doing), never raw internals. Long jobs follow the repo's job pattern:
start-POST -> {job_id} -> GET poll with byte progress.
)ÚannotationsN)ÚPath)ÚAnyÚCallableÚDictÚOptional)Ú	APIRouterÚHTTPException)Ú	BaseModel)Úrun_in_threadpool)ÚconfigÚweb_deps)Ú_CONFIG_MUTATION_LOCKÚ_config_profile_scope)ÚbinariesÚ	bootstrapÚcatalogÚcontext_policyÚ	estimatorÚgrowthÚhardwareÚ	hf_browseÚload_progressÚpresetsÚ
supervisor)Úspawn_context_thread)ÚDownloadÚDownloadPausedÚSource)Ú_state_endpointÚchild_query)Úsplit_partszdict[str, dict[str, Any]]Ú_JOBSÚ_RUNNINGz-\d{5}-of-\d{5}g       @g      à?uC   The local server could not start â€” check the runtime is installedc                  ó&   € ] tR t^At$ RtR]R&   RtR# )ÚRuntimeInstallBodyNúOptional[str]Úbackend© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r'   Ú__annotations__Ú__static_attributes__r(   ó    ÚWC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\web_routers\local_models.pyr%   r%   A   s   ‡ Ø!€Gˆ]×!r/   r%   c                  ó"   € ] tR t^Et$ R]R&   RtR# )ÚModelDownloadBodyÚstrÚmodel_idr(   N©r)   r*   r+   r,   r-   r.   r(   r/   r0   r2   r2   E   ó   ‡ Ø‡Mr/   r2   c                  ó"   € ] tR t^It$ R]R&   RtR# )Ú	JobIdBodyr3   Újob_idr(   Nr5   r(   r/   r0   r8   r8   I   ó   ‡ Ø‡Kr/   r8   c                  ó&   € ] tR t^Mt$ RtR]R&   RtR# )ÚQuickstartBodyNú
str | Noner4   r(   )r)   r*   r+   r,   r4   r-   r.   r(   r/   r0   r<   r<   M   s   ‡ Ø€Hˆj×r/   r<   c                  ó"   € ] tR t^Qt$ R]R&   RtR# )ÚServerActionBodyr3   Úactionr(   Nr5   r(   r/   r0   r?   r?   Q   r:   r/   r?   c                  ó"   € ] tR t^Ut$ R]R&   RtR# )ÚModelEjectBodyr3   r4   r(   Nr5   r(   r/   r0   rB   rB   U   r6   r/   rB   c                  ó"   € ] tR t^Yt$ R]R&   RtR# )ÚModelActivateBodyr3   r4   r(   Nr5   r(   r/   r0   rD   rD   Y   r6   r/   rD   c                  ó,   € ] tR t^]t$ R]R&   R]R&   RtR# )ÚBrowsedDownloadBodyr3   Úrepoz	list[str]Úpathsr(   Nr5   r(   r/   r0   rF   rF   ]   s   ‡ Ø
ƒIØ×r/   rF   c                  ó"   € ] tR t^bt$ R]R&   RtR# )ÚSideloadBodyr3   Úpathr(   Nr5   r(   r/   r0   rJ   rJ   b   s   ‡ Ø
‡Ir/   rJ   c               ó    € V ^8„  d   QhRRRR/# )é   ÚnÚfloatÚreturnr3   r(   )Úformats   "r0   Ú__annotate__rR   f   s   € ÷ %ñ %�ð %˜3ñ %r/   c                ó   € V R,          R R2# )é   z.1fz GBi   @r(   )rN   s   &r0   Ú	_human_gbrU   f   s   € Ø�7�m˜CÐ  Ð$Ð$r/   c               ó    € V ^8„  d   QhRRRR/# )rM   ÚtokensÚintrP   r3   r(   )rQ   s   "r0   rR   rR   j   s   € ÷  ñ  �Sð  ˜Sñ  r/   c                ó   € V R ,           R2# )i   ÚKr(   )rW   s   &r0   Ú_k_labelr[   j   s   € Ø˜�nÐ˜QÐÐr/   c               ó    € V ^8„  d   QhRRRR/# )rM   ÚstatusrX   Úprefixr3   r(   )rQ   s   "r0   rR   rR   o   s   € ÷ Rñ R˜ð R Sñ Rr/   c              #  ó`   "  €  Rx € R#   \          d   p\        Y T 2R7      ThRp?ii ; i5i)zAMap any exception to ``HTTPException(status, f"{prefix}{exc}")``.N©Ústatus_codeÚdetail)Ú	Exceptionr	   )r]   r^   Úexcs   && r0   Ú_http_errorre   n   s5   é € ðRÝøÜô RÜ¨¸À#ÀÐ7GÔHÈcÐQûðRüs   ‚.„
 ˆ.Š+•&¦+«.ÚwarnÚdebugc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rM   ÚfnzCallable[[], Any]Údefaultr   rf   r=   rg   rP   r(   )rQ   s   "r0   rR   rR   w   s2   € ÷ 
ñ 
Ð ð 
¨3ð 
¸ð 
ÐS]ð 
Ðilñ 
r/   c               ó¾   €  V ! 4       #   \          dI   pT'       d   \        P                  Y$4       T'       d   \        P                  TRR7       Tu Rp?# Rp?ii ; i)u·   ``fn()`` or ``default`` on any exception â€” for garnish that must never 500. ``warn`` logs a
warning with the exception (%s), ``debug`` a debug line with traceback; silent otherwise.T)Úexc_infoN)rc   ÚloggerÚwarningrg   )ri   rj   rf   rg   rd   s   &&$$ r0   Ú_quietro   w   sE   € ðÙ‹tˆøÜô ßÜ�N‰N˜4Ô%ßÜ�L‰L˜¨ˆLÔ.Ø�ûðús   ‚	 ‰A”$A¹AÁAÁAc               ó(   € V ^8„  d   QhRRRRRRRR/# )rM   Úkindr3   Útargetr4   r=   rP   údict[str, Any]r(   )rQ   s   "r0   rR   rR   …   s(   € ÷ 
ñ 
ˆsð 
˜Cð 
¨:ð 
Àñ 
r/   c                ó  € R \         P                  ! 4       P                  R,          RV RVRVRRRRR	R
RRR^ R\        P                  ! 4       RR/p\        ;_uu_ 4        V\
        VR ,          &   RRR4       V#   + '       g   i     T# ; i)r9   :Né   Nrq   rr   r4   r]   ÚrunningÚphaseÚstartingrb   Ú Útotal_bytesNÚ
done_bytesÚ
started_atÚerror)ÚuuidÚuuid4ÚhexÚtimeÚ
_JOBS_LOCKr"   )rq   rr   r4   Újobs   &&& r0   Ú_jobr„   …   s   € à”$—*’*“,×"Ñ" 3Õ'¨°°xÀØ�HØ�)Ø�Ø�"�m T¨<¸¸LÌ$Ï)Ê)Ë+ÐW^Ð`dð€C÷ 
ŽØ"Œˆc�(�mÑ÷ 
à€J÷ 
Žà€Jús   ÁA9Á9B
	c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rM   Úsamplesz$collections.deque[tuple[float, int]]ÚdonerX   Útotalz
int | NonerP   ztuple[float | None, int | None]r(   )rQ   s   "r0   rR   rR   ’   s+   € ÷ ñ Ð?ð Àsð Ø#ðØ(Gñr/   c                óþ   € V ^ ,          w  r4V R,          ^ ,          V,
          pV\         8  g   W8:  d   R# W,
          V,          pV'       d/   V\        ^ \        \        ^ W!,
          4      V,          4      4      3# VR3# )a_  Transfer rate and remaining seconds from a trailing sample window.

The rate is the slope across the window, not the last two ticks, so a
burst reads as throughput rather than a spike. Anything that cannot be
turned into an honest number (one sample, a window too short to divide
by, a transfer that hasn't moved) reports unknown rather than a guess.
Néÿÿÿÿ©NN)Ú_RATE_MIN_ELAPSEDÚmaxÚround)r†   r‡   rˆ   Úfirst_atÚ
first_doneÚelapsedÚrates   &&&    r0   Ú_rate_and_etar“   ’   su   € ð # 1�:Ñ€HØ�b�k˜!�n˜xÕ'€GØÔ"Ô" dÔ&8ØÐØÕ Õ(€DßØ”S˜œE¤# a¨­Ó"6¸Õ"=Ó>Ó?Ð?Ð?Ø�ˆ:Ðr/   c               ó$   € V ^8„  d   QhRRRRRR/# )rM   rƒ   rs   r‡   rX   rP   ÚNoner(   )rQ   s   "r0   rR   rR   ¥   s!   € ÷ !ñ !�nð !¨Cð !°Dñ !r/   c                ó  € \         P                  V R,          4      pVf   R# \        P                  ! 4       pVP	                  R\
        P                  ! 4       4      pVP                  W134       \        V4      ^8”  d2   W4^ ,          ^ ,          ,
          \        8”  d   VP                  4        KA  \        WAV P                  R4      4      w  rVVf'   V P                  RR4       V P                  RR4       R# WPR&   W`R&   R# )zÍRefresh the job's smoothed rate + ETA from the sample it just reported.

Samples live on the running entry, not the job, so the wire payload stays
the derived facts and the history dies with the transfer.
r9   Nr†   rz   Úbytes_per_secÚeta_seconds)r#   Úgetr�   Ú	monotonicÚ
setdefaultÚcollectionsÚdequeÚappendÚlenÚ_RATE_WINDOWÚpopleftr“   Úpop)rƒ   r‡   rv   Únowr†   r’   Úetas   &&     r0   Ú_record_rater¥   ¥   sÃ   € ô �l‰l˜3˜x�=Ó)€GØ‚ÙÜ
�.Š.Ó
€CØ× Ñ  ¬K×,=Ò,=Ó,?Ó@€GØ‡N�N�C�;ÔÜ
ˆg‹,˜Ô
˜s¨Q¥Z°¥]Õ2´\ÔAØ�‰ÖÜ˜g¨S¯W©W°]Ó-CÓD�I€DØ‚|Ø�‰� Ô&Ø�‰�˜tÖ$à#ˆOÑØ ˆMÓr/   c               ó    € V ^8„  d   QhRRRR/# )rM   rƒ   rs   rP   r(   )rQ   s   "r0   rR   rR   ¼   s   € ÷ ñ �>ð  nñ r/   c                ó¶  € \        V 4      p\        P                  V R ,          / 4      pVP                  R4      p\        VRJ;'       d%    VP	                  4       ;'       d    VR,          R8H  4      VR&   \        VRJ;'       d;    VR,          R8H  ;'       d'    VR,          \
        9   ;'       d    VR,          '       * 4      VR&   VR,          R8H  ;'       d    R	V9   VR
&   VR,          '       d5   \        ^d\        VR,          VR,          ,          ^d,          4      4      VR&   VR,          R8w  d%   VP                  RR4       VP                  RR4       V# )r9   ÚpauseNr]   rv   Úpause_requestedrw   Ú	can_pauseÚpausedÚresumeÚ
can_resumerz   r{   Úpercentr—   r˜   )	Údictr#   r™   ÚboolÚis_setÚ_DOWNLOAD_PHASESÚminrŽ   r¢   )rƒ   Úoutrv   r¨   s   &   r0   Ú	_job_viewrµ   ¼   sE  € Ü
ˆs‹)€CÜ�l‰l˜3˜x�=¨"Ó-€GØ�K‰K˜Ó €EÜ! %¨tÐ"3×"eÐ"e¸¿¹»×"eÐ"eÈ3ÈxÍ=Ð\eÑKeÓf€CÐÑÜ˜E¨Ð-÷ `ð `°#°hµ-À9Ñ2L÷ `ð `Ø # G¥Ô0@Ñ @÷`ð `ØILÐM^ÕI_ÔE_óa€CˆÑà˜H�¨Ñ1×IÐI°hÀ'Ñ6I€CˆÑØ
ˆ=×ÔÜ˜S¤%¨¨LÕ(9¸CÀÕ<NÕ(NÐQTÕ(TÓ"UÓVˆˆI‰ð ˆ8…}˜	Ô!Ø�‰� Ô&Ø�‰�˜tÔ$Ø€Jr/   c               ó    € V ^8„  d   QhRRRR/# ©rM   rƒ   rs   rP   r•   r(   )rQ   s   "r0   rR   rR   Î   s   € ÷ 0ñ 0˜.ð 0¨Tñ 0r/   c                ó¬   € \         P                  V R ,          / 4      P                  R4      pVe$   VP                  4       '       d   \        R4      hR# R# )r9   r¨   Nzdownload paused)r#   r™   r±   r   )rƒ   r¨   s   & r0   Ú_check_job_pauser¹   Î   sE   € Ü�L‰L˜˜X�¨Ó+×/Ñ/°Ó8€EØÒ˜UŸ\™\Ÿ^š^ÜÐ.Ó/Ð/ñ ,Ñr/   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rM   rƒ   rs   rw   r3   rb   rP   r•   r(   )rQ   s   "r0   rR   rR   Ô   s(   € ÷ ñ ˆ~ð  cð °3ð ¸4ñ r/   c                óÌ   € \         ;_uu_ 4        V P                  R 4      \        9   d   V\        9  d   \        V 4       WR &   W R&   RRR4       R#   + '       g   i     R# ; i)rw   rb   N)r‚   r™   r²   r¹   )rƒ   rw   rb   s   &&&r0   Ú_stepr¼   Ô   sC   € ß	ŽØ�7‰7�7ÓÔ/Ô/°EÔAQÔ4QÜ˜SÔ!ØˆG‰ØˆH‰÷	 
��Šús   �9AÁA#	c               ó$   € V ^8„  d   QhRRRRRR/# )rM   rƒ   rs   rb   r3   rP   r•   r(   )rQ   s   "r0   rR   rR   Ü   s!   € ÷ ñ �ð ¨ð °ñ r/   c                ó    € \        V R V4       R# )r‡   N©r¼   )rƒ   rb   s   &&r0   Ú_finishrÀ   Ü   s   € ä	ˆ#ˆv�vÖr/   Úfail_msgÚon_exitÚdownload_labelÚ	resumableFc               ó8   € V ^8„  d   QhRRRRRRRRR	R
RRRRRR/# )rM   rƒ   rs   Únamer3   ÚbodyzCallable[[], None]rÁ   r=   rÂ   zCallable[[], None] | NonerÃ   rÄ   r°   rP   r•   r(   )rQ   s   "r0   rR   rR   á   sJ   € ÷ <ñ <�Nð <¨#ð <Ð5Gð <ÐV`ð <Ø1ð<ØJTð<àð<à+/ñ<r/   c               óð   a aaaaaaa	a
€ \         P                  ! 4       o	\         P                  ! 4       o
VVVV	V V3R loRR/R VV	V VVV
3R lllpV'       d   RVRS
/\        S R,          &   V! R	R
7       R# )zJOne worker per job. Pauses retain ownership; terminal outcomes release it.c                 ó„  <€ R p  S! 4        Se   \        SS R24       \        R4        T R8w  d   Se   S! 4        \        ;_uu_ 4        T R8w  d   \        P                  SR,          R4       T SR&   SP                  4        RRR4       R#   \         d    Rp  Lt\         d9   pS'       d   \        P                  ST4       Rp \        T4      SR&    Rp?L±Rp?ii ; i  + '       g   i     R# ; i  \        ;_uu_ 4        T R8w  d   \        P                  SR,          R4       T SR&   SP                  4        RRR4       i   + '       g   i     i ; i; i   T R8w  d   Se   S! 4        \        ;_uu_ 4        T R8w  d   \        P                  SR,          R4       T SR&   SP                  4        RRR4       i   + '       g   i     i ; i  \        ;_uu_ 4        T R8w  d   \        P                  SR,          R4       T SR&   SP                  4        RRR4       i   + '       g   i     i ; i; i; i)r‡   Nú readyú%post-download runtime refresh skippedr«   r}   r9   r]   )rÀ   Ú_refresh_runtimer   rc   rm   rn   r3   r‚   r#   r¢   Úrelease)r]   rd   rÇ   rÃ   rÁ   Úguardrƒ   rÂ   s     €€€€€€r0   Ú_runÚ_spawn_job.<locals>._runè   s›  ø€ Øˆð	$ÙŒFØÒ)Ü˜ Ð/¨vÐ6Ô7Ü Ð!HÔIð$Ø˜XÔ%¨'Ò*=Ù”Iç–ZØ Ô)Ü Ÿ™ S¨¥]°DÔ9Ø$*�C˜‘MØ—M‘M”O÷	  ‘Zøô ô 	ØŠFÜô 	$ßÜ—‘˜x¨Ô-ØˆFÜ˜s›8ˆC�ŽLûð		$ú÷  —Z�Zû—Z–ZØ Ô)Ü Ÿ™ S¨¥]°DÔ9Ø$*�C˜‘MØ—M‘M”O÷	  —Z—Z�Zþð	$Ø˜XÔ%¨'Ò*=Ù”Iç–ZØ Ô)Ü Ÿ™ S¨¥]°DÔ9Ø$*�C˜‘MØ—M‘M”O÷	  —Z—Z�Zû—Z–ZØ Ô)Ü Ÿ™ S¨¥]°DÔ9Ø$*�C˜‘MØ—M‘M”O÷	  —Z—Z�Zÿøs²   …%B «C7 Á:C#ÂC ÂE ÂC Â'C Â(.CÃE ÃC Ã E Ã#C4	Ã7EÄ:E		Å 	EÅ	EÅEÅH?Å!GÅ3H?Æ:G	Æ;	H?ÇGÇH?ÇH<Ç&:H)È 	H<È)H9È4H<È<H?ÚinitialFc               ó    € V ^8„  d   QhRRRR/# )rM   rÑ   r°   rP   r(   )rQ   s   "r0   rR   Ú _spawn_job.<locals>.__annotate__  s   € ÷ ñ ˜$ð ¨4ñ r/   c                ó\  <€ SP                  R R7      '       g   R # \        ;_uu_ 4        V '       g*   SR,          R8w  d   SP                  4         RRR4       R # SP                  4        \        P                  SR,          4      pVe   VP                  RR4       RSR&   RSR&   RRR4        \        SSR	7      P                  4        R
#   + '       g   i     L.; i  \         d@    \        P                  SR,          R4       Se   S! 4        RSR&   SP                  4        h i ; i)F©Úblockingr]   r«   Nr9   r†   rv   r}   )rÆ   T)
Úacquirer‚   rÍ   Úclearr#   r™   r¢   r   Ústartrc   )rÑ   rv   rÏ   rÎ   rƒ   rÆ   rÂ   r¨   s   $ €€€€€€r0   rÙ   Ú_spawn_job.<locals>.start  sî   ø€ Ø�}‰} eˆ}×,Ò,ÙßŽZß˜s 8�}°Ô8Ø—‘”Ø÷ ‰Zð �K‰KŒMô —l‘l 3 x¥=Ó1ˆGØÒ"Ø—‘˜I tÔ,Ø%ˆC�‰MØˆC�‰L÷ ð	Ü  ¨DÔ1×7Ñ7Ô9ñ ÷+ �Zûô ô 	Ü�L‰L˜˜X�¨Ô-ØÒ"Ù”	Ø#ˆC�‰MØ�M‰MŒOØð	ús   ª(CÁACÂ1C! ÃC	Ã!A
D+r¬   r¨   r9   T)rÑ   N)Ú	threadingÚLockÚEventr#   )rƒ   rÆ   rÇ   rÁ   rÂ   rÃ   rÄ   rÙ   rÏ   rÎ   r¨   s   fffddd$ @@@r0   Ú
_spawn_jobrÞ   á   s]   ÿø€ ô �NŠNÓ€EÜ�OŠOÓ€E÷$ò $ð2 ÷ ÷ ÷4 Ø#+¨U°G¸UÐ"CŒ��X•ÑÙ	�$×r/   c               ó    € V ^8„  d   QhRRRR/# )rM   Úskip_msgr3   rP   r•   r(   )rQ   s   "r0   rR   rR   !  s   € ÷ Bñ B˜sð B tñ Br/   c                ó>   € \        \        P                  RV R7       R# )u…   Bounce a running router so it rescans the models dir (it only scans at spawn).
Never raises â€” the file operation already succeeded.N©rg   )ro   r   Úrefresh_local_runtime)rà   s   &r0   rÌ   rÌ   !  s   € ô Œ9×*Ñ*¨D¸×Ar/   Úpayloadc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rM   Úendpointrs   rK   r3   ÚtimeoutrO   rä   zdict | NonerP   r   r(   )rQ   s   "r0   rR   rR   '  s8   € ÷ 
Eñ 
E˜nð 
E°Cð 
EÀUð 
EÐU`ð 
EÐloñ 
Er/   c               ó
  € RRV P                  RR4       2/pRpVe*   RVR&   \        P                  ! V4      P                  4       p\        P
                  P                  V R,          P                  R	^4      ^ ,          V,           YTVe   R
MRR7      p\        P
                  P                  WbR7      ;_uu_ 4       pVe   RM#\        P                  ! VP                  4       4      uuRRR4       #   + '       g   i     R# ; i)zrCall the local router (base_url minus ``/v1``) with its bearer key; GET (no payload) -> parsed JSON, POST -> None.ÚAuthorizationzBearer Úapi_keyry   Nzapplication/jsonzContent-TypeÚbase_urlz/v1ÚPOST)ÚdataÚheadersÚmethod©rç   )r™   ÚjsonÚdumpsÚencodeÚurllibÚrequestÚRequestÚrsplitÚurlopenÚloadsÚread)ræ   rK   rç   rä   rî   rí   ÚreqÚrs   &&$$    r0   Ú_router_requestrý   '  sÒ   € à '¨(¯,©,°yÀ"Ó*EÐ)FÐ GÐH€GØ€DØÒØ"4ˆ�ÑÜ�zŠz˜'Ó"×)Ñ)Ó+ˆÜ
�.‰.×
 Ñ
  ¨*Õ!5×!<Ñ!<¸UÀAÓ!FÀqÕ!IÈDÕ!PÐW[Ø29Ò2E©È4ð !ó Q€Cä	�‰×	Ñ	 Ð	×	5Ô	5¸ØÒ*‰t´·
²
¸1¿6¹6»8Ó0D÷ 
6×	5×	5Ó	5ús   Â<*C1Ã1D	c               ó   € V ^8„  d   QhRR/# ©rM   rP   r¯   r(   )rQ   s   "r0   rR   rR   4  s   € ÷ 7ñ 7�dñ 7r/   c                 ó6   € \        \        P                  / 4      # )zORead-only config for status/garnish paths that must render degraded, never 500.)ro   Ú
config_modÚload_config_readonlyr(   r/   r0   Ú_load_configr  4  s   € ä”*×1Ñ1°2Ó6Ð6r/   c               ó   € V ^8„  d   QhRR/# rÿ   r(   )rQ   s   "r0   rR   rR   9  s   € ÷ =ñ =˜$ñ =r/   c                 ó\   € \        4       ;'       g    / P                  R 4      ;'       g    / # )Úlocal_runtime)r  r™   r(   r/   r0   Ú_runtime_sectionr  9  s%   € Ü‹N× Ð ˜b×%Ñ% oÓ6×<Ð<¸"Ð<r/   c               ó    € V ^8„  d   QhRRRR/# )rM   Úenabledr°   rP   r¯   r(   )rQ   s   "r0   rR   rR   =  s   € ÷ ñ  $ð ¨4ñ r/   c                óÚ   € \         ;_uu_ 4        \        P                  ! 4       pWP                  R/ 4      R&   \        P                  ! V4       RRR4       V#   + '       g   i     X# ; i)z@Persist ``local_runtime.enabled`` and return the config written.r  r	  N)r   r  Úload_configr›   Úsave_config)r	  r   s   & r0   Ú_set_runtime_enabledr  =  sW   € ÷ 
Ö	Ü×'Ò'Ó)ˆØ<C×Ñ˜/¨2Ó.¨yÑ9Ü×Ò˜vÔ&÷ 
ð €M÷	 
Ö	ð €Mús   �A AÁA*	c               ó    € V ^8„  d   QhRRRR/# )rM   Ú	requestedr=   rP   ztuple[str, str]r(   )rQ   s   "r0   rR   rR   H  s   € ÷ 5ñ 5˜zð 5°_ñ 5r/   c                ó  € \        4       pT ;'       g    VP                  RR4      p\        R4      ;_uu_ 4        \        P                  ! V4      p\        P
                  ! V4      V3uuRRR4       #   + '       g   i     R# ; i)zKResolve only reviewed PM artifacts; hardware work stays off the event loop.r'   Úautoé�  N)r  r™   re   r   Úresolve_backendÚ
pinned_tag)r  Úsectionr'   s   &  r0   Ú_runtime_targetr  H  s_   € äÓ €GØ×9Ð9˜7Ÿ;™; y°&Ó9€GÜ	�S×	Õ	Ü×*Ò*¨7Ó3ˆÜ×"Ò" 7Ó+¨WÐ4÷ 
×	×	Ó	ús   º.A3Á3B	c               ó    € V ^8„  d   QhRRRR/# )rM   Ú
min_enginer3   rP   r°   r(   )rQ   s   "r0   rR   rR   Q  s   € ÷ Jñ J ð J¨ñ Jr/   c                ó"  € V '       g   R # \        4       P                  RR4      p\        P                  ! V4      pVe   VP                  M\        4       ^ ,          p\        VP                  R4      4      \        V P                  R4      4      8  # )Fr'   r  Úb)r  r™   r   Úinstalled_engineÚtagr  rX   Úremoveprefix)r  r  Úenginer  s   &   r0   Ú_engine_too_oldr  Q  sp   € ßÙÜ Ó"×&Ñ& y°&Ó9€IÜ×&Ò& yÓ1€FØÒ*ˆ&�*Š*´Ó0AÀ!Õ0D€CÜˆs×Ñ Ó$Ó%¬¨J×,CÑ,CÀCÓ,HÓ(IÑIÐIr/   c                 ó’   € \         ;QJ d"    . R \        P                   4       F  NK  	  5# ! R \        P                   4       4      # )zfCatalog entries this engine can activate today (engine-gated ones can't be the recommendation either).c              3  ó`   "  € T F$  p\        VP                  4      '       d   K   Vx € K&  	  R # 5i©N)r  r  )Ú.0Úes   & r0   Ú	<genexpr>Ú$_eligible_entries.<locals>.<genexpr>\  s   é € ÐQ™O�q´?À1Ç<Á<×3P—’›Oùs   ‚.¤
.)Útupler   ÚCATALOGr(   r/   r0   Ú_eligible_entriesr)  Z  s,   € çŒ5ÑQœGŸOšOÓQ�5ÐQˆ5ÑQœGŸOšOÓQÓQÐQr/   c               ó   € V ^8„  d   QhRR/# ©rM   r4   r3   r(   )rQ   s   "r0   rR   rR   _  s   € ÷ ñ ˜Cñ r/   c                óv   € \         P                  ! 4       P                  V 4      pVf   \        RRV  2R7      hV# )Né”  zunknown model r`   )r   Úcatalog_by_idr™   r	   )r4   Úentrys   & r0   Ú_entry_or_404r0  _  s9   € Ü×!Ò!Ó#×'Ñ'¨Ó1€EØ‚}Ü¨°nÀXÀJÐ4OÔPÐPØ€Lr/   c               ó    € V ^8„  d   QhRRRR/# )rM   r   r¯   Úfail_detailr3   r(   )rQ   s   "r0   rR   rR   f  s   € ÷ ñ  ð °3ñ r/   c                ól   € \         P                  ! V RR7      pVf   \        4       f   \        V4      hV# )ziForce-start the local server; raise ``fail_detail`` when neither we nor another process ended up serving.T)Úforce)r   Úensure_local_runtimer   ÚRuntimeError)r   r2  Úsups   && r0   Ú_start_local_serverr8  f  s1   € ä
×
(Ò
(¨°tÔ
<€CØ
‚{”Ó(Ò0Ü˜;Ó'Ð'Ø€Jr/   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rM   rƒ   rs   r   r¯   r4   r3   r2  rà   rP   r•   r(   )rQ   s   "r0   rR   rR   n  sA   € ÷ Qñ Q˜ð Q°ð QÀð QÐUXð QÐdgð QÐlpñ Qr/   c               óà   a aaaaa€ \        S RR4       \        W4      oR V V3R lloSe   \        VV3R lRVR7       R# \        4       oSe   R V3R	 llo\        VV3R
 lRVR7       R# R# )uÏ   Start the local server if needed and self-heal a stale router: the model list is spawn-only, so a
server started before ``model_id`` finished downloading can't serve it â€” bounce it when it doesn't know it.ústarting-serverúStarting the local serverc               ó    € V ^8„  d   QhRRRR/# )rM   Úknownrs   rP   r•   r(   )rQ   s   "r0   rR   Ú$_ensure_server.<locals>.__annotate__t  s   € ÷ .ñ . ð .°Dñ .r/   c                óN   <€ SV 9  d   R SR&   \         P                  ! 4        R# R# )zRefreshing the local serverrb   N)r   rã   )r>  rƒ   r4   s   &€€r0   Úrescan_if_unknownÚ)_ensure_server.<locals>.rescan_if_unknownt  s%   ø€ Ø˜5Ô Ø9ˆC�‰MÜ×+Ò+Ö-ñ !r/   Nc                 ó0   <€ S ! SP                  4       4      # r"  )Úmodels)rA  r7  s   €€r0   Ú<lambda>Ú _ensure_server.<locals>.<lambda>z  s   ø€ Ñ(¨¯©«Ô6r/   râ   c               ó   € V ^8„  d   QhRR/# ©rM   rP   rs   r(   )rQ   s   "r0   rR   r?  ‚  s   € ÷ 	2ñ 	2˜~ñ 	2r/   c                 ó    <€ \        SR ^
R7      ;'       g    / P                  R. 4      p V  Uu/ uF  qP                  R4      VbK  	  up# u upi )ú/modelsrð   rí   Úid)rý   r™   )rí   Úmræ   s     €r0   Ú_known_modelsÚ%_ensure_server.<locals>._known_models‚  sJ   ø€ Ü# H¨iÀÔD×JÐJÈ×OÑOÐPVÐXZÓ[ˆDÙ,0Ó1©D q—E‘E˜$“K ’N©DÑ1Ð1ùÒ1s   ®Ac                 ó   <€ S! S ! 4       4      # r"  r(   )rM  rA  s   €€r0   rE  rF  †  s   ø€ Ñ(©«Ô9r/   )r¼   r8  ro   r   )	rƒ   r   r4   r2  rà   rM  ræ   rA  r7  s	   f&f$$@@@@r0   Ú_ensure_serverrP  n  sl   ý€ ô 
ˆ#Ð Ð"=Ô>Ü
˜fÓ
2€C÷.ñ .ð
 ‚ÜÕ6¸ÀHÕMÙô Ó €HØÒ÷	2ð 	2ô 	Õ9¸4Àx×Pñ r/   c               ó$   € V ^8„  d   QhRRRRRR/# )rM   rƒ   rs   r4   r3   rP   r•   r(   )rQ   s   "r0   rR   rR   ‰  s&   € ÷ |ñ |˜ð |°3ð |¸4ñ |r/   c                ód   € \        V RR4       \        P                  ! RR4      ! RRVRRR4       R# )	zJMake ``model_id`` the main model via the same machinery as /api/model/set.úsetting-defaultúMaking it your defaultÚ_apply_model_assignment_synczhermes_cli.web_server_configÚmainÚllamacppry   N)r¼   r   Úlate)rƒ   r4   s   &&r0   Ú_assign_defaultrY  ‰  s5   € ä	ˆ#Ð Ð":Ô;Ü‡M‚MÐ0Ð2PÔQÐRXÐZdÐfnÐprÐtvÐxzÖ{r/   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rM   rG   r3   rK   ÚrevisionrP   r(   )rQ   s   "r0   rR   rR   �  s.   € ÷ Fñ F�#ð F˜Sð F¨Cð F¸Sñ Fr/   c                ó   € R V  RV RV 2# )zhttps://huggingface.co/z	/resolve/Ú/r(   )rG   rK   r[  s   &&&r0   Ú_hf_urlr^  �  s   € Ø$ T F¨)°H°:¸Q¸t¸fÐEÐEr/   c               ó    € V ^8„  d   QhRRRR/# )rM   Úggufr   rP   r3   r(   )rQ   s   "r0   rR   rR   ”  s   € ÷ 7ñ 7˜ð 7 ñ 7r/   c                ó\   € \         P                  ! \        R,           RV P                  4      # )z@Variant model id for a staged file (strips split-part suffixes).Ú$ry   )ÚreÚsubÚ_SPLIT_PART_REÚstem)r`  s   &r0   Ú_model_id_forrg  ”  s   € ä�6Š6”. 3Õ&¨¨D¯I©IÓ6Ð6r/   c               ó    € V ^8„  d   QhRRRR/# )rM   r4   r3   rP   z
list[Path]r(   )rQ   s   "r0   rR   rR   ™  s   € ÷ ñ  Sð ¨Zñ r/   c                óH  € \         P                  ! 4       P                  R4       Uu. uF  p\        V4      V 8X  g   K  VNK  	  pp\        P
                  ! V 4      pVe9   V^ ,          P                  V^ ,          P                  V^ ,          P                  3MRpY$ Uu. uFk  pVf   K	  \         P                  ! 4       VP                  ,          P                  4       '       g   KE  \         P                  ! 4       VP                  ,          NKm  	  up,          pV# u upi u upi )zvEvery local file of a staged model: all split parts plus catalog-declared assets (mmproj/draft/MTP head) when present.z*.ggufr(   )r   Ú
models_dirÚglobrg  r   Úfind_entry_for_modelÚmmprojÚdraftÚmtp_headÚ
assets_dirÚ
local_nameÚexists)r4   ÚpÚfilesÚhitÚassetsÚas   &     r0   Ú_variant_files_on_diskrx  ™  sé   € ä!×,Ò,Ó.×3Ñ3°HÔ=Ó^Ñ=�1ÄÈqÓAQÐU]ÑA]�QˆQÑ=€EÐ^Ü
×
&Ò
& xÓ
0€CØ?Bºˆc�!�f�m‰m˜S �VŸ\™\¨3¨q­6¯?©?Ñ;ÐTV€FØ	¸Vó U¹V¸Øô 4Ü$-×$8Ò$8Ó$:¸Q¿\¹\Õ$I×#QÑ#Q×#Sô 4Œi×"Ò"Ó$ q§|¡|×3Ð3¹Vñ Uõ U€Eà€Lùò _ùòUs   §D¾DÂDÂ)7DÃ%*Dc               ó   € V ^8„  d   QhRR/# )rM   rP   Úlistr(   )rQ   s   "r0   rR   rR   £  s   € ÷ ñ  dñ r/   c           	     ó^  € VP                    Uu. uF_  p\        V P                  VP                  VP                  4      \
        P                  ! 4       VP                  ,          VP                  3NKa  	  ppTV P                  V P                  V P                  3 Uu. uFx  q"f   K  \        VP                  ;'       g    V P                  VP                  VP                  4      \
        P                  ! 4       VP                  ,          VP                  3NKz  	  up,          pV# u upi u upi )zeEverything a variant needs: split parts + mmproj/draft/MTP head assets, as (url, dest, bytes) tuples.)rt  r^  rG   rK   r[  r   rj  rq  Ú
size_bytesrm  rn  ro  rp  )r/  Úvariantrw  Úplans   &&  r0   Ú_download_planr  £  sï   € ð —]’]ó$Ù"�ô �U—Z‘Z §¡¨¯©Ó4´i×6JÒ6JÓ6LÈqÏ|É|Õ6[Ð]^×]iÑ]iÓjÙ"ð 	ð $àØ—|‘| U§[¡[°%·.±.ÑAóTÙA�ô vŒg�a—f‘f×*Ð* §
¡
¨A¯F©F°A·J±JÓ?Ä×AUÒAUÓAWÐZ[×ZfÑZfÕAfÐhi×htÑhtÓuÙAñTõ T€Dà€Kùò	$ùòTs   �A%D%ÂD*Â&D*Â>AD*c               ó    € V ^8„  d   QhRRRR/# )rM   Ú
engine_tagr3   rP   rz  r(   )rQ   s   "r0   rR   rR   ¬  s   € ÷ ñ  ð ¨ñ r/   c                óJ  a€ \        \        P                  ! 4       4      o\        V P	                  R4      4      p. p\
        P                   EFR  pVP                  pVe   VP                  R8w  d   K'  \        ;QJ d)    V3R lVP                   4       F  '       g   K   RM	  RM! V3R lVP                   4       4      '       g   K}  VP                  '       d,   V\        VP                  P	                  R4      4      8  d   Kº  \        P                  ! 4       VP                  ,          pVP                  4       '       d   Kø  TP                  \!        VP"                  ;'       g    VP"                  VP$                  VP&                  4      WTP(                  34       EKU  	  V# )z¬Download-plan rows for the DFlash drafts of downloaded models that ``engine_tag`` can load
but that aren't on disk: models downloaded before their draft joined the catalog.r  zdraft-dflashc              3  ó@   <"  € T F  qP                   S9   x € K  	  R # 5ir"  ©r4   )r#  ÚvÚstageds   & €r0   r%  Ú"_missing_drafts.<locals>.<genexpr>¶  s   øé € Ð@±¨A—:‘: Ö'³ùs   ƒTF)Úsetr   Ústaged_model_idsrX   r  r   r(  rn  Údraft_spec_typeÚanyÚvariantsÚdraft_min_enginerp  rq  Úis_filerž   r^  rG   rK   r[  r|  )r�  Úbuildr~  r/  ÚassetÚdestr†  s   &     @r0   Ú_missing_draftsr’  ¬  s  ø€ ô ”×+Ò+Ó-Ó.€FÜ�
×'Ñ'¨Ó,Ó-€EØ€DÜ—•ˆØ—‘ˆØŠ=˜E×1Ñ1°^ÔCÙß‹sÔ@°·²Ó@�s�sŠsÔ@°·²Ó@×@Ò@ÙØ×!×!Ð! e¬c°%×2HÑ2H×2UÑ2UÐVYÓ2ZÓ.[Ô&[ÙÜ×#Ò#Ó%¨×(8Ñ(8Õ8ˆØ�|‰|�~Œ~Ø�K‰Kœ §¡×!9Ð!9¨u¯z©z¸5¿:¹:ÀuÇ~Á~ÓVÐX\×^nÑ^nÐo×pñ !ð €Kr/   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rM   rƒ   rs   r~  rz  Úlabelr3   rP   r•   r(   )rQ   s   "r0   rR   rR   À  s)   € ÷ *ñ *˜Nð *°$ð *¸sð *ÐSWñ *r/   c                ó   € VeC   VP                   '       d1   \        P                  ! 4       VP                   P                  ,          MRpV Uu. uF  qU^,          V8w  g   K  VNK  	  pp\	        V RRV 24       \        W4       V Uu. uF  qU^,          V8X  g   K  VNK  	  ppV'       dF   \        ;_uu_ 4        V P                  ^ R/ R7       RRR4       \	        V RR4       \        W4       R# R# u upi u upi   + '       g   i     L6; i)z·The downloader counts completed files and every part of this plan. A catalog entry's draft
downloads last and only speeds generation up, so a draft that fails costs the model nothing.NÚdownloadingzDownloading ©r{   rz   Úrangesz5Downloading the draft model that speeds up generation)	rn  r   rp  rq  r¼   Ú_download_jobr‚   ÚupdateÚ_download_optional)rƒ   r~  r”  r/  rn  ÚrowÚrequiredÚoptionals   &&&&    r0   Ú_run_download_planrŸ  À  s×   € ð @EÒ?PÐUZ×U`×U`ÐU`ŒI× Ò Ó" U§[¡[×%;Ñ%;Ö;Ðfj€EÙ#Ó7™t˜¨1¥v°¡—�™t€HÐ7Ü	ˆ#ˆ} ¨U¨GÐ4Ô5Ü�#Ô Ù#Ó7™t˜¨1¥v°¡—�™t€HÐ7ßßŽZØ�J‰J !°¸bˆJÔA÷ äˆc�=Ð"YÔZÜ˜3Ö)ñ	 ùò	 8ùò 8ç�Zús$   ÁC3Á!C3ÂC8ÂC8Â:C=Ã=D	c               ó   € V ^8„  d   QhRR/# ©rM   rƒ   rs   r(   )rQ   s   "r0   rR   rR   Ï  s   € ÷ ñ  ñ r/   c                ó   a € R  V 3R llpV# )c               ó(   € V ^8„  d   QhRRRRRRRR/# )rM   r‡   rX   rˆ   r˜  r¯   rP   r•   r(   )rQ   s   "r0   rR   Ú-_download_progress_hook.<locals>.__annotate__Ð  s(   € ÷ $ñ $�3ð $˜sð $¨Dð $°Tñ $r/   c                ó°   <€ \         ;_uu_ 4        SP                  Y;'       g    R VR7       \        SV 4       R R R 4       R #   + '       g   i     R # ; i)Nr—  )r‚   rš  r¥   )r‡   rˆ   r˜  rƒ   s   &&&€r0   ÚtickÚ%_download_progress_hook.<locals>.tickÐ  s4   ø€ ßŽZØ�J‰J $·M°M¸TÈ&ˆJÔQÜ˜˜dÔ#÷ �Z�ZŠZús   �*AÁA	r(   )rƒ   r¦  s   f r0   Ú_download_progress_hookr¨  Ï  s   ø€ ÷$ð $ð €Kr/   c               ó    € V ^8„  d   QhRRRR/# r·   r(   )rQ   s   "r0   rR   rR   ×  s   € ÷ 2ñ 2�~ð 2°ñ 2r/   c                óü   € \         P                  V R,          / 4      p\        V UUUu. uF  w  r4p\        W44      NK  	  upppVP                  R4      R7      pVP	                  \        V 4      R7       R# u upppi )zBModel bytes use the same resumable transfer as pinned PM archives.r9   r¨   )Úpause_event)ÚprogressN)r#   r™   r   r   Úrunr¨  )rƒ   r~  rv   Úurlr‘  Ú_Údls   &&     r0   r™  r™  ×  s]   € ä�l‰l˜3˜x�=¨"Ó-€GÜ	¹Õ>¹©¨°A”6˜#Ö$¹Ó>ÈGÏKÉKÐX_ÓL`Ô	a€BØ‡F�FÔ+¨CÓ0€FÖ1ùô ?s   ©A7c               ó    € V ^8„  d   QhRRRR/# )rM   rƒ   rs   rP   r°   r(   )rQ   s   "r0   rR   rR   Þ  s   € ÷ 
ñ 
˜Nð 
°Tñ 
r/   c                óž   €  \        W4       R#   \         d    h \        \        3 d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z¸Download files that only speed generation up, such as a DFlash draft. A failure leaves the
model running without them, so it is logged instead of failing the job; a pause still pauses.z3optional download failed; continuing without it: %sNFT)r™  r   r6  ÚOSErrorrm   rn   )rƒ   r~  rd   s   && r0   r›  r›  Þ  sH   € ðÜ�cÔ ñ øô ô ØÜœ'Ð"ô Ü�‰ÐLÈcÔRÝûðús   ‚ �AªA«AÁAc               ó    € V ^8„  d   QhRRRR/# )rM   rv   rs   rP   z%tuple[dict[str, str], dict[str, Any]]r(   )rQ   s   "r0   rR   rR   ë  s   € ÷ ñ ˜Nð Ð/Tñ r/   c           	     óÞ  a a
€ \        S R^R7      pVP                  R. 4       Uu/ uFU  pVP                  R/ 4      P                  R4      R9   g   K+  VR,          VP                  R/ 4      P                  RR4      bKW  	  pp/ p\        P                  ! 4       pVP	                  4        Fº  w  o
p/ pVP                  S
4      pVe<   VP                  VP                  \        VP                  4      VP                  R	7       VR9   ;'       d    \        V
V 3R
 lR4      p	V	'       d/   VP                  \        V	4      \        \        V	4      4      R7       V'       g   K¶  WtS
&   K¼  	  W43# u upi )u2  Resident models right now, plus how each is placed (granted window from the child, spill facts from
the preset decision) â€” the difference between 'fast' and 'why is my CPU busy', so it must be inspectable.
'loading' is its own state (a 20-GB load in flight is the most important thing the pane can show).rJ  rð   rí   r]   ÚvaluerK  ÚunknownN)ÚwindowÚwindow_labelÚspilledc                 óv   <€ \        SR \        S 4       2^R7      P                  R/ 4      P                  R4      # )z/props?rð   Údefault_generation_settingsÚn_ctx)rý   r    r™   )r4   rv   s   €€r0   rE  Ú _loaded_models.<locals>.<lambda>ú  s7   ø€ ”O G¨w´{À8Ó7LÐ6MÐ-NÐXYÔZß‰SÐ.°Ó3·C±C¸³LðAr/   )Úgranted_windowÚgranted_window_label)ÚloadedÚreadyÚloading)rÁ  rÂ  )rý   r™   r   Úread_preset_decisionsÚitemsrš  r¸  r[   rº  ro   rX   )rv   rí   rL  rÁ  Ú	placementÚ	decisionsÚstateÚfactsr~  r½  r4   s   f         @r0   Ú_loaded_modelsrÊ  ë  sS  ù€ ô ˜7 I°qÔ9€DØLPÏHÉHÐU[Ð]_ÔL`ó UÑL`ÀqØ—‘�x Ó$×(Ñ(¨Ó1Ð5SÑSô Cˆa��g�q—u‘u˜X rÓ*×.Ñ.¨w¸	ÓBÒBÑL`€Fð Uà "€IÜ×-Ò-Ó/€IØ!Ÿ<™<ž>‰ˆ�%Ø "ˆØ�}‰}˜XÓ&ˆØÒØ�L‰L §¡¼(À4Ç;Á;Ó:OÐY]×YeÑYeˆLÔfØÐ,Ñ,÷ Hð H´õAØBFó2Hˆ÷ Ø�L‰L¬¨E«
ÌÔRUÐV[ÓR\ÓI]ˆLÔ^ß‰5Ø"'�hÓñ *ð ÐÐùò!Us   ¥(E*Á.E*c               ó    € V ^8„  d   QhRRRR/# )rM   r`  r   rP   rs   r(   )rQ   s   "r0   rR   rR     s   € ÷ Oñ O�dð O˜~ñ Or/   c                ó†   € \        V 4      p\        R  \        V 4      ;'       g    V . 4       4      pRVRVR\        V4      /# )c              3  óT   "  € T F  qP                  4       P                  x € K   	  R # 5ir"  )ÚstatÚst_size©r#  rs  s   & r0   r%  Ú_staged_row.<locals>.<genexpr>  s   é € ÐEÑ)D A�v‰v‹x×ÖÓ)Dùs   ‚&(rK  r|  Ú
size_label)rg  Úsumr!   rU   )r`  r4   Úsizes   &  r0   Ú_staged_rowrÕ    sE   € Ü˜TÓ"€HäÑE¬°TÓ):×)DÐ)D¸t¸fÐ)DÓEÓE€DØ�(˜L¨$°¼iÈ»oÐNÐNr/   c               ó   € V ^8„  d   QhRR/# ©rM   rP   r=   r(   )rQ   s   "r0   rR   rR   
  s   € ÷ 	ñ 	 :ñ 	r/   c                 ó&   € R R lp \        V R4      # )zThe active main model when it is one of ours (config authority: the model.provider + model.default
that /api/model/set writes).c               ó   € V ^8„  d   QhRR/# r×  r(   )rQ   s   "r0   rR   Ú/_active_llamacpp_model_id.<locals>.__annotate__  s   € ÷ ñ �*ñ r/   c                 óŠ  € \        4       ;'       g    / P                  R 4      ;'       g    / p \        V P                  RR4      4      P                  4       P	                  4       \
        9   dV   \        V P                  R4      ;'       g    V P                  R4      ;'       g    R4      P                  4       ;'       g    R# R# )ÚmodelÚproviderry   rj   rÆ   N)r  r™   r3   ÚstripÚlowerÚ_LLAMACPP_PROVIDERS)Úmodel_sections    r0   rú   Ú'_active_llamacpp_model_id.<locals>.read  s˜   € Ü%›×-Ð-¨2×2Ñ2°7Ó;×AÐA¸rˆÜˆ}× Ñ  ¨RÓ0Ó1×7Ñ7Ó9×?Ñ?ÓAÔEXÔXÜ�}×(Ñ(¨Ó3×VÐV°}×7HÑ7HÈÓ7P×VÐVÐTVÓW×]Ñ]Ó_×gÐgÐcgÐgÙr/   N)ro   )rú   s    r0   Ú_active_llamacpp_model_idrã  
  s   € õô �$˜ÓÐr/   z/api/local-models/statusc                 ó  a€ \        4       p \        P                  ! V P                  RR4      4      pVe   VP                  MRpV'       d   \        P
                  ! V4      M\        4       ^ ,          pVe   VP                  MTp^ RIpV'       d'   VP                  \        P                  V,          4      MRp\        \        P                  . RR7       \        P                  ! 4       p\        4       oSf   / / 3M\        V3R l/ / 3RR7      w  r‰R\!        V P                  R4      4      R	TR
TR\!        V P                  R4      ;'       d    VRJ;'       d    VRJ 4      RVRJRTRSRJRS;'       g    / P                  R4      R\#        4       RTR\        \$        P&                  / 4      RT	RVP)                  4       '       d/   \        P*                  ! 4        U
u. uF  p
\-        V
4      NK  	  up
M. R\/        V4      /# u up
i )z·Cheap, immediate: config state + installed runtime + staged models + supervisor state (GPU facts live
in /hardware). Sync def on purpose: blocking urlopen/scans run in the threadpool.r'   r  Nz legacy model adoption failed: %r)rf   c                 ó   <€ \        S 4      # r"  )rÊ  )rv   s   €r0   rE  Ú%local_models_status.<locals>.<lambda>)  s
   ø€ ”˜wÔ'r/   zloaded-models read failed: %rr	  r  Úconfigured_tagÚupdate_availableÚruntime_installedÚruntime_backendÚserver_runningÚserver_base_urlrë   Úactive_model_idÚloaded_modelsrÃ  rÆ  rD  rj  )r  r   r  r™   r'   r  r  r  ÚpmÚinstalled_packageÚBACKEND_PACKAGESro   r   Úadopt_legacy_modelsrj  r   r°   rã  r   Úget_loading_progressrr  Ústaged_modelsrÕ  r3   )r  r  rê  rç  r  rï  ÚcurrentÚmdirrÁ  rÆ  r`  rv   s              @r0   Úlocal_models_statusr÷    sÅ  ø€ ô Ó €GÜ×&Ò& w§{¡{°9¸fÓ'EÓF€FØ(.Ò(:�f—n’nÀ€Oß=L”X×(Ò(¨Ô9ÔRaÓRcÐdeÕRf€NØÒ*ˆ&�*Š*°€CÛçRaˆb×"Ñ"¤8×#<Ñ#<¸_Õ#MÔNÐgk€Gä
Œ9×(Ñ(¨"Ð3UÕVÜ×ÒÓ!€DÜÓ€Gð %,¢O˜˜R™¼Ü'¨"¨b¨Ð8Wô:YÑ€Fð 	”4˜Ÿ™ IÓ.Ó/°¸Ð=MÈ~ØœD §¡¨YÓ!7×!bÐ!b¸FÈ$Ð<N×!bÐ!bÐSZÐ^bÐSbÓcØ˜_°DÐ8Ð:KÈ_Ø˜'¨Ð-Ð/@À7Ç=À=Èb×BUÑBUÐV`ÓBaØÔ4Ó6¸Èð 	”6œ-×<Ñ<¸bÓAØ�YØÈtÏ{É{Ï}Ê}´×1HÒ1HÔ1JÓKÑ1J¨”;˜tÖ$Ñ1JÒKÐbdØ”c˜$“iðð ùò Ls   ÇH6c               ó   € V ^8„  d   QhRR/# rÿ   r(   )rQ   s   "r0   rR   rR   :  s   € ÷ ñ ˜4ñ r/   c                 ó~   € \         P                  ! 4       p V f   / # \        V R,          V R,          V R,          R7      # )a  GPU identity + live utilization (NVIDIA only; other vendors degrade to {} and the UI hides those readouts).

Reads the shared cached query: one nvidia-smi spawn per poll window, hidden on Windows,
instead of a second bare one per request (#101895, #120262).Úgpu_nameÚgpu_util_percentÚ
used_bytes)rú  rû  Úvram_used_bytes)r   Ú_cached_nvidia_gpu_queryr¯   )Úquerys    r0   Ú_nvidia_smi_factsr   :  sB   € ô
 ×-Ò-Ó/€EØ‚}Øˆ	ÜØ�zÕ"ØÐ1Õ2Ø˜lÕ+ôð r/   z/api/local-models/hardwarec                 ó&  € \         P                  ! 4       p \         P                  ! 4       w  rRV P                  RV P                  RV P
                  RVRVR\        V P                  4      RRR	RR
R/	pVP                  \        \        / 4      4       V# )uo   The budget as plain facts, polled by the pane and statusbar. Sync def: shells out to nvidia-smi â€” threadpool.ÚumaÚvram_total_bytesÚvram_usable_bytesÚram_total_bytesÚram_available_bytesÚ
vram_labelrú  Nrû  rý  )
r   Úprobe_budgetÚ
_ram_bytesr  Útotal_device_bytesÚusable_vram_bytesrU   rš  ro   r   )ÚbudgetÚ	ram_totalÚ	ram_availr´   s       r0   Úlocal_models_hardwarer  I  s�   € ô ×"Ò"Ó$€FÜ#×.Ò.Ó0Ñ€Iàˆv�z‰zÐ-¨v×/HÑ/HÐJ]Ð_e×_wÑ_wØ˜9Ð&;¸YÈÔV_Ð`f×`yÑ`yÓVzØ�DÐ,¨dÐ4EÀtð€Cð
 ‡J�JŒvÔ'¨Ó,Ô-Ø€Jr/   zbest-large-windowu€   Recommended build ({quant}) â€” the quant class this engine is optimized for; runs fully on your GPU with a large context windowz	best-fitsud   Recommended build ({quant}) â€” the quant class this engine is optimized for; runs fully on your GPUuV   Compact build sized for this machine ({quant}) â€” larger than GPU memory, runs slowerc               ó   € V ^8„  d   QhRR/# )rM   rP   r°   r(   )rQ   s   "r0   rR   rR   a  s   € ÷ Qñ Q $ñ Qr/   c                ó´   a€ \         ;QJ d.    V3R lV P                  S4       4       F  '       d   K   R# 	  R# ! V3R lV P                  S4       4       4      # )zˆEvery file the variant needs is on disk. The draft is optional: a model downloaded before
its draft joined the catalog stays downloaded.c              3  óØ   <"  € T F_  pVSP                   9   d   \        P                  ! 4       M\        P                  ! 4       VP                  ,          P                  4       x € Ka  	  R # 5ir"  )rt  r   rj  rp  rq  rŽ  )r#  Úfr}  s   & €r0   r%  Ú_installed.<locals>.<genexpr>d  sP   øé € ð QÙ3O¨að ,-°·±Ô+=”×%Ò%Ô'Ä9×CWÒCWÓCYØ—,‘,õß '¡£	ô*Û3Oùs   ƒA'A*FT)ÚallÚinstall_files)r/  r}  s   &fr0   Ú
_installedr  a  s^   ø€ ÷ ‹3ô QØ38×3FÑ3FÀwÔ3OóQ�3Œ3ð QŠ3ð Qˆ3ô QØ38×3FÑ3FÀwÔ3OóQó Qð Qr/   c               ó   € V ^8„  d   QhRR/# rH  r(   )rQ   s   "r0   rR   rR   h  s   € ÷ -ñ -ÐP^ñ -r/   c                óB  a a€ \         P                  ! S V4      p\        V V3R  lS P                   4       R4      pRS P                  RS P
                  RS P                  RS P                  R\        S P                  4      RS P                  V8H  RS P                  V8X  d   TMRR	VRJR
V'       d   VP                  MRRV'       d   VP                  MRRS P                  RS P                  RJR\        S P                  4      RS P                  ;'       g    R/pVfj   \        S P                  R R7      pS P!                  V4      p	VP#                  RRRV	R\%        V	4      RRRRVP                   R\%        V	4       R2/4       V# VP&                  p
S P)                  W¡4      P*                  pS P!                  V
4      pVP#                  RRRV
P                  RV
P                  RV
P,                  RVR\%        V4      R \/        S P                  4      R!\0        P3                  VP4                  \6        4      P9                  V
P                  R"7      /4       \;        V\<        P>                  4      '       d   VR!,          VR&   V# VP#                  VP@                  \        VP@                  4      VPB                  R#7       VP@                  S P                  8¼  d   R$VR,           R%2pMR&VR',           R(VR,           R)2pYÛPB                  '       d   R*MR+,           VR&   V# ),c              3  ót   <"  € T F-  qP                   S9   g   K  \        SV4      '       g   K)  Vx € K/  	  R # 5ir"  )r4   r  )r#  r…  r/  Ú
staged_idss   & €€r0   r%  Ú_catalog_row.<locals>.<genexpr>k  s)   øé € Ð^™.�Q¯J©J¸*Ñ,DŒqÌÐTYÐ[\×I]�qŠq›.ùs   ƒ8š8®
8NrK  Údisplay_nameÚdescriptionÚnative_contextÚnative_context_labelÚrecommendedÚrecommended_reasonÚ
downloadedÚdownloaded_model_idÚdownloaded_quantÚmtpÚvisionÚneeds_enginer  c                ó   € V P                   # r"  )r|  )r…  s   &r0   rE  Ú_catalog_row.<locals>.<lambda>y  s   € °Q·\²\r/   ©ÚkeyÚfitsFr|  rÒ  Úfit_summaryz'Needs more memory than this machine hasÚ
fit_detailzeven the most compact build (z, z) exceeds GPU + system memoryTr4   ÚquantÚquant_validatedÚvariant_countÚquant_reason)r0  )Ústart_windowÚstart_window_labelrº  zruns at its full z contextz
starts at r5  z and grows toward z as you use itu.    (larger than your GPU memory â€” runs slower)ry   )"r   Úselect_variantÚnextrŒ  rK  r  r  Ún_ctx_trainr[   r4   r0  Úmtp_capablerm  r  r  r³   Údownload_bytesrš  rU   r}  Úlaunch_planÚdecisionÚ	validatedrŸ   Ú_QUANT_REASONSr™   Ú
reason_keyÚ_QUANT_REASON_COMPACTrQ   Ú
isinstancer   ÚPhysicsRefusalr¸  rº  )r/  r  r!  r"  r  Úchoicer°  rœ  ÚsmallestÚsmallest_totalr}  r<  Údownload_totalÚshapes   f&&&f         r0   Ú_catalog_rowrH  h  sØ  ù€ Ü×#Ò# E¨6Ó2€Fä	Õ^˜%Ÿ.š.Ó^Ð`dÓ	e€Bàˆe�h‰h˜¨×(:Ñ(:¸MÈ5×K\ÑK\Ø˜%×+Ñ+Ð-CÄXÈe×N_ÑN_ÓE`Ø�u—x‘x ;Ñ.Ø°E·H±HÀÔ4KÑ0ÐQUØ�b �nÐ&;ÏB¸R¿[º[ÐTXØ¯˜BŸHšH°°e¸U×=NÑ=NÐPXÐZ_×ZfÑZfÐnrÐZrð 	œ¨×(8Ñ(8Ó9Ø�e×&Ñ&×.Ð.¨$ð€Cð ‚~Ü�u—~‘~Ñ+AÔBˆØ×-Ñ-¨hÓ7ˆØ�
‰
Ø�E˜<¨¸ÄyÐQ_ÓG`ØÐDØÐ:¸8¿>¹>Ð:JÈ"ÌYÐWeÓMfÐLgð h9ð 9ð
ô 	ð ˆ
à�n‰n€GØ× Ñ  Ó1×:Ñ:€HØ×)Ñ)¨'Ó2€NØ‡J�JØ��j '×"2Ñ"2°G¸W¿]¹]Ø˜7×,Ñ,¨l¸NØ”i Ó/°Ä#ÀeÇnÁnÓBUØœ×*Ñ*¨6×+<Ñ+<Ô>SÓT×[Ñ[Ðbi×boÑboÐ[Ópð	ô ô �(œI×4Ñ4×5Ò5Ø  Õ0ˆˆMÑØˆ
Ø‡J�J˜HŸO™OÄÈÏÉÓ@YÐck×csÑcs€JÔtØ‡�˜%×+Ñ+Ô+Ø# CÐ(>Õ$?Ð#@ÀÐI‰à˜SÐ!5Õ6Ð7Ð7IÈ#ÐNdÕJeÐIfÐftÐuˆØ×Vf×VfÐVfÑ"RÐlnÕo€CˆÑØ€Jr/   z/api/local-models/catalogc                 ó¨  € \         P                  ! 4        \        P                  ! RR7      p \         P                  ! V \        4       \        4       P                  RR4      R7      ;'       g    Rw  rVe   VP                  MRp\        \        P                  ! 4       4      pR\         P                   Uu. uF  p\        WPW2V4      NK  	  up/# u upi )	aV  Every entry answers up front: how big is the download, will it fit, what context/speed shape will I
get. The row advertises the BEST build for this machine (highest quality fully on GPU at the 64K floor;
else the smallest that works, spilled and priced). No entry is hidden; unaffordable models show WHY.
Sync def: blocking I/O -> threadpool.T©Úplanningr'   r  ©r'   NrD  r‹   )r   Úrefresh_catalog_soonr   r  Úrecommended_entryr)  r  r™   rK  rˆ  r   r‰  r(  rH  )r  r!  r"  Úrecommended_idr  r$  s         r0   Úlocal_models_catalogrP  ˜  s¹   € ô × Ò Ô"ä×"Ò"¨DÔ1€Fô '.×&?Ò&?ØÔ!Ó#Ô-=Ó-?×-CÑ-CÀIÈvÓ-Vô'X÷ 'hð 'hØ[gñ $€Kà'2Ò'>�[—^’^ÀD€Nô ”Y×/Ò/Ó1Ó2€JØÔho×hwÒhwÓxÑhwÐcd”| A¨~ÐS]Ö^ÑhwÑxÐyÐyùÒxs   Â5Cc               ó   € V ^8„  d   QhRR/# r¡  r(   )rQ   s   "r0   rR   rR   ¯  s   € ÷ ñ  ñ r/   c                ó.   a a€ RRRRRR/oR V V3R llpV# )	zCPM owns byte accounting; stages describe work without resetting it.ÚdownloadÚunpackÚverifyc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rM   Ústager3   r‡   rX   rˆ   r”  rP   r•   r(   )rQ   s   "r0   rR   Ú,_runtime_progress_hook.<locals>.__annotate__·  s6   € ÷ Eñ E�Cð E˜sð E¨3ð E°sð E¸tñ Er/   c                ó`   <€ SV ,          w  rE\        SYEV'       d   R V R2MR,           4       R# )ú (Ú)ry   Nr¿   )rW  r‡   rˆ   r”  rw   rb   rƒ   Úphasess   &&&&  €€r0   ÚhookÚ$_runtime_progress_hook.<locals>.hook·  s)   ø€ Ø˜u�‰ˆÜˆc�5·U b¨¨¨q¡MÀÕCÖDr/   )údownloading-runtimezDownloading the local engine)zunpacking-runtimezUnpacking the local engine)zverifying-runtimezVerifying the local enginer(   )rƒ   r]  r\  s   f @r0   Ú_runtime_progress_hookr`  ¯  s1   ù€ ð 	ÐKØÐEØÐEð€F÷Eñ Eð €Kr/   c               ó    € V ^8„  d   QhRRRR/# )rM   rƒ   rs   r'   r3   r(   )rQ   s   "r0   rR   rR   ½  s   € ÷ ñ ˜^ð °cñ r/   c                ó¦   € \        V R R4       \        P                  ! V\        V 4      \	        V 4      \
        V R,          ,          R,          R7      # )úinstalling-runtimez!Preparing the pinned local enginer9   r¨   )r¬  Údownload_progressr«  )r¼   r   Úensure_enginer`  r¨  r#   )rƒ   r'   s   &&r0   Ú_install_engine_jobrf  ½  sG   € Ü	ˆ#Ð#Ð%HÔIÜ×!Ò!ØÔ0°Ó5Ü1°#Ó6Ü˜S �]Õ+¨GÕ4ôð r/   z!/api/local-models/runtime/installc               ó    € V ^8„  d   QhRRRR/# )rM   rÇ   r%   Úprofiler&   r(   )rQ   s   "r0   rR   rR   Ç  s   € ÷ Eñ EÐ'9ð EÀMñ Er/   c                ó¼   aaaaa€ \        V P                  4      w  oo\        R RS RS R24      oRR/oVVVVV3R lp\        SRVRR	R
7       RSR,          RSRS/# )zruntime-installú
llama.cpp rZ  r[  ÚrestartFc                 ó  <€ \        S
4      ;_uu_ 4        \        P                  ! S4      p \        SS4      p\	        VP
                  4      pV'       d`   S	R ,          RupS	R &   \        SRR4       \        SV4      '       g2   \        \	        VP
                  4      4      \        V4      8X  d   VS	R &   \        P                  ! 4       p\        P                  ! 4       pW8g  ;'       g&    VRJ;'       d    VP
                  VP
                  8g  pVeI   V'       g   S	R ,          '       d2   \        SRV'       d   RMR4       \        P                  ! 4        RS	R &   RRR4       \        SR	S R
S R24       R#   + '       g   i     L%; i)rk  Tr–  z1Downloading draft models that speed up generationNÚ
restartingz0Switching the running server to the pinned buildzRestarting the local serverFrj  z ready (r[  )r   r   r  rf  r’  r  r¼   r›  rŸ   r   Úget_supervisorÚserving_enginerã   rÀ   )Úpreviousr  ÚdraftsÚbeforerv   ÚservingÚstaler'   rƒ   Úowedrh  r  s          €€€€€r0   r­  Ú)local_models_runtime_install.<locals>.runÌ  s>  ø€ Ü" 7×+Õ+Ü×0Ò0°Ó9ˆHÜ(¨¨gÓ6ˆFÜ$ V§Z¡ZÓ0ˆFßØ*.¨y­/¸4Ð'�˜˜Y™Ü�c˜=Ð*]Ô^Ü)¨#¨v×6Ò6¼3¼ÈvÏzÉzÓ?ZÓ;[Ô_bÐciÓ_jÔ;jØ&,�D˜‘OÜ×.Ò.Ó0ˆGÜ×.Ò.Ó0ˆGØÑ&×]Ð]¨7¸$Ð+>×+\Ð+\À7Ç;Á;ÐRX×R\ÑR\ÑC\ˆEØÒ"¯°°i·´Ü�c˜<ßñ *\Ø$AôCä×/Ò/Ô1Ø"'��Y‘÷! ,ô" 	��z #  h¨w¨i°qÐ9Ö:÷# ,×+ús$   •CE8Ã)E8Ã5%E8ÄE8Ä*1E8Å8F	zlr-runtime-installzruntime install failed: %sT©rÁ   rÄ   r9   r'   r  )r  r'   r„   rÞ   )rÇ   rh  r­  r'   rƒ   ru  r  s   &f @@@@r0   Úlocal_models_runtime_installrx  Æ  sq   ü€ ä" 4§<¡<Ó0�L€CˆÜ
Ð  J¨s¨e°2°g°Y¸aÐ"@Ó
A€CØ�uÐ€D÷;ñ ;ô( ˆsÐ(¨#Ð8TÐ`dÕeØ�c˜(•m Y°¸ÀÐDÐDr/   c               ó   € V ^8„  d   QhRR/# r+  r(   )rQ   s   "r0   rR   rR   å  s   € ÷ !ñ !˜sñ !r/   c                óØ  € \         P                  ! 4       P                  V 4      pVf*   \         P                  ! V 4      ;'       g    \	        V 4      # \        VP                  4      '       d(   \        RVP                   RVP                   R2R7      h\         P                  ! V\        P                  ! RR7      4      pVf   \        RRVP                   R2R7      hWP                  3# )	uÈ   (entry, variant) for a family id (this machine's selected variant â€” the same planning budget as the
catalog, so the user downloads exactly the build the row advertised) or an exact variant model_id.é™  z needs llama.cpp u%    or newer â€” update the engine firstr`   TrJ  zno variant of z fits this machine)r   r.  r™   rl  r0  r  r  r	   r  r6  r   r  rK  r}  )r4   r/  rC  s   &  r0   Ú_download_targetr|  å  sÌ   € ô ×!Ò!Ó#×'Ñ'¨Ó1€EØ‚}Ü×+Ò+¨HÓ5×PÐP¼ÀxÓ9PÐPÜ�u×'Ñ'×(Ò(Ü¨Ø×!Ñ!Ð"Ð"3°E×4DÑ4DÐ3EÐEjÐkônð 	nä×#Ò# E¬8×+@Ò+@È$Ô+OÓP€FØ‚~Ü¨°nÀUÇXÁXÀJÐN`Ð4aÔbÐbØ—.‘.Ð Ð r/   z/api/local-models/downloadc               ó   € V ^8„  d   QhRR/# )rM   rÇ   r2   r(   )rQ   s   "r0   rR   rR   õ  s   € ÷ Cñ CÐ 1ñ Cr/   c                óº  aaa€ \        V P                  4      w  op\        SV4      oS'       dM   \        ;QJ d    R S 4       F  '       d   K   RM	  RM! R S 4       4      '       d   RRRRRVP                  /# \	        RSP
                   R	VP                   R
2SP                  R7      oVVV3R lp\        SRVRRR7       RSR,          RVP                  /# )zdAccepts either a family id (downloads this machine's selected variant) or an exact variant model_id.c              3  óF   "  € T F  w  rqP                  4       x € K  	  R # 5ir"  ©rŽ  ©r#  r¯  r‘  s   &  r0   r%  Ú(local_models_download.<locals>.<genexpr>ù  s   é € Ð:±T¡z q°—L‘L—N�N³Tùs   ‚!FTr9   NÚalready_downloadedr4   úmodel-downloadrZ  r[  r„  c                 ó€   <€ \        SSS P                  S 4       \        SS P                   R 24       \        R4       R# )rÊ   rË   N)rŸ  r  rÀ   rÌ   )r/  rƒ   r~  s   €€€r0   rÏ   Ú#local_models_download.<locals>._runü  s8   ø€ Ü˜3  e×&8Ñ&8¸%Ô@Ü�˜×*Ñ*Ð+¨6Ð2Ô3ÜÐ@ÖAr/   zlr-model-downloadzmodel download failed: %srw  )	r|  r4   r  r  r„   r  r0  rK  rÞ   )rÇ   r}  rÏ   r/  rƒ   r~  s   &  @@@r0   Úlocal_models_downloadr‡  ô  sÂ   ú€ ô & d§m¡mÓ4�N€Eˆ7Ü˜% Ó)€Dß—“Ñ:±TÓ:——’Ñ:±TÓ:×:Ò:Ø˜$Ð 4°d¸JÈ×HXÑHXÐYÐYÜ
Ð E×$6Ñ$6Ð#7°r¸'¿-¹-¸ÈÐ!JÐUZ×U]ÑU]Ô
^€C÷Bô
 ˆsÐ'¨Ð8SÐ_cÕdØ�c˜(•m Z°×1AÑ1AÐBÐBr/   z /api/local-models/download/pausec               ó   € V ^8„  d   QhRR/# ©rM   rÇ   r8   r(   )rQ   s   "r0   rR   rR     s   € ÷ 	(ñ 	(¨Iñ 	(r/   c              ƒ  ór  "  € \         P                  V P                  4      pVf   \        RRR7      h\        ;_uu_ 4        \        V4      R,          '       g   RRRR	/uuRRR4       # \        V P                  ,          R
,          P                  4        RRR4       RRRR/#   + '       g   i     L; i5i)zAPause the download phase of a model, component or quickstart job.Nr-  úunknown download jobr`   rª   ÚokTr«   Fr¨   )r"   r™   r9   r	   r‚   rµ   r#   rˆ  )rÇ   rƒ   s   & r0   Úlocal_models_download_pauser�    sŒ   é € ô �)‰)�D—K‘KÓ
 €CØ
‚{Ü¨Ð4JÔKÐKß	ŽÜ˜‹~˜k×*Ô*Ø˜$ ¨%Ð0÷ 
Šô 	�—‘Õ˜gÕ&×*Ñ*Ô,÷ 
ð �$˜ $Ð'Ð'÷	 
�üs)   ‚?B7ÁB$ÁB7Á*,B$ÂB7Â$B4	Â/B7z!/api/local-models/download/resumec               ó   € V ^8„  d   QhRR/# r‰  r(   )rQ   s   "r0   rR   rR     s   € ÷ >ñ >¨Yñ >r/   c              ƒ  óè   "  € V P                   \        9  d   \        RRR7      h\        P	                  V P                   / 4      P	                  R4      pRRR\        T;'       d    V! 4       4      /# 5i)zBRestart the same job; PM reuses verified files and durable ranges.r-  r‹  r`   r¬   rŒ  TÚresumed)r9   r"   r	   r#   r™   r°   )rÇ   r¬   s   & r0   Úlocal_models_download_resumer‘    s^   é € ð ‡{�{œ%ÔÜ¨Ð4JÔKÐKÜ�\‰\˜$Ÿ+™+ rÓ*×.Ñ.¨xÓ8€FØ�$˜	¤4¨×(;Ð(;±6³8Ó#<Ð=Ð=ùs   ‚A"A2Á%A2z#/api/local-models/models/{model_id}c               ó   € V ^8„  d   QhRR/# r+  r(   )rQ   s   "r0   rR   rR     s   € ÷ ñ ¨ñ r/   c              ƒ  óî   a "  € \        S 4      pV'       g   \        RRR7      hV F  pVP                  RR7       K  	  \        V 3R lRRR	7       \	        \
        RR
R7      P                  4        RR/# 5i)z²Remove every split part plus private assets, then bounce the router off the request thread (deleting
the active file mid-serve is exactly the stale state the refresh exists for).r-  zmodel not foundr`   T)Ú
missing_okc                 ó0   <€ \         P                  ! S 4      # r"  )r   Úclear_window_overrider„  s   €r0   rE  Ú%local_models_delete.<locals>.<lambda>%  s   ø€ ”6×/Ò/°Ô9r/   Nzwindow-override clear skippedrâ   zlr-post-delete)ÚargsrÆ   rŒ  )z#post-delete runtime refresh skipped)rx  r	   Úunlinkro   r   rÌ   rÙ   )r4   rt  rK   s   f  r0   Úlocal_models_deleterš    sm   øé € ô # 8Ó,€EßÜ¨Ð4EÔFÐFÛˆØ�‰˜tˆÖ$ñ ô Ô9¸4ÐGfÕgÜÔ)Ð0XØ.ô0ß05±´Ø�$ˆ<Ðùs   ƒA2A5c               ó   € V ^8„  d   QhRR/# )rM   rÇ   r<   r(   )rQ   s   "r0   rR   rR   .  s   € ÷ cñ c˜^ñ cr/   c                óv  € V P                   '       d   \        V P                   4      .pM°\        P                  ! V\	        4       \        4       P                  RR4      R7      pVf   \        RRR7      hV^ ,          .\        P                   Uu. uF<  qDP                  V^ ,          P                  8w  g   K&  VP                  '       g   K:  VNK>  	  up,           pV FI  p\        P                  ! WQ4      pVf   K  \        VP                  4      '       d   K<  WVP                  3u # 	  \        RRR7      hu upi )zœResolve an explicit model, or start with the machine's automatic recommendation.

With no recommendation, require an explicit choice before starting setup.
r'   r  rL  r{  ui   No automatic recommendation for this machine â€” open Local Models to browse or choose a model explicitlyr`   uV   no catalog model fits this machine â€” open Local Models to browse for a smaller build)r4   r0  r   rN  r)  r  r™   r	   r(  rK  Ú	recommendr6  r  r  r}  )rÇ   r  Ú
candidatesÚpickedr$  Ú	candidaterC  s   &&     r0   Ú_quickstart_targetr¡  .  s  € ð
 ‡}‡}€}Ü# D§M¡MÓ2Ð3‰
ä×*Ò*ØÔ%Ó'Ô1AÓ1C×1GÑ1GÈ	ÐSYÓ1Zô\ˆàŠ>ÜØð Côð ð ˜Q•i�[¬w¯ªÓ#g©¨!Ç$Á$È&ÐQRÍ)Ï,É,ÑBV¤AÐ[\×[fÕ[f§A A©Ñ#gÕgˆ
Ûˆ	Ü×'Ò'¨	Ó:ˆØÔ¤o°i×6JÑ6J×&KÔ&KØŸn™nÐ,Ò,ñ  ô  CØ`ôcð cùò $hs   Â#D6Â7D6ÃD6c               ó    € V ^8„  d   QhRRRR/# )rM   rƒ   rs   rÇ   r<   r(   )rQ   s   "r0   rR   rR   F  s   € ÷ Yñ Y˜nð Y°Nñ Yr/   c                ó¸  € \        V\        P                  ! RR7      4      w  r4VP                  VP                  8w  d?   \        ;_uu_ 4        V P                  VP                  VP                  R7       RRR4       \        W44      pY4\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   V3# . 3#   + '       g   i     L\; i)z´Re-pick once the engine is installed, before any bytes are committed: a Vulkan/HIP GPU's
type and size come from that engine's own device probe, so the preflight price was a guess.TrJ  )rr   r4   Nc              3  óP   "  € T F  w  rqP                  4       '       * x € K  	  R # 5ir"  r€  r�  s   &  r0   r%  Ú'_repriced_quickstart.<locals>.<genexpr>N  s   é € Ð%PÉ4¹Z¸QÀa¯,©,«.×&8Ñ&8Ë4ùó   ‚$&F)
r¡  r   r  r4   r‚   rš  r  rK  r  r‹  )rƒ   rÇ   r}  r/  rŸ  r~  s   &&&   r0   Ú_repriced_quickstartr§  F  s™   € ô ' t¬X×-BÒ-BÈDÔ-QÓR�M€EØ‡�˜'×*Ñ*Ô*ßŽZØ�J‰J˜e×0Ñ0¸5¿8¹8ˆJÔD÷ ä˜%Ó(€DØ§#£#Ñ%PÉ4Ó%P§#§#¢#Ñ%PÉ4Ó%P×"PÒ"P˜$ÐXÐXÐVXÐXÐX÷ �Zús   Á(C	Ã	C	z/api/local-models/quickstartc               ó    € V ^8„  d   QhRRRR/# )rM   rÇ   r<   rh  r&   r(   )rQ   s   "r0   rR   rR   R  s   € ÷ 'nñ 'n .ð 'n¸=ñ 'nr/   c                óœ  a aaaaa	a
a€ \        S \        P                  ! RR7      4      w  oo\        4       w  po\        P
                  ! S4      RJ o
\        SS4      o\        ;QJ d    R S 4       F  '       g   K   RM	  RM! R S 4       4      pV'       g   . o\        R S 4       4      p\        P                  RR7      '       g   \        RR	R
7      h\        RSP                  SP                  R7      o	VV VVV	V
VV3R lp\        S	RVR\        P                   RR7       RS	R,          RSP                  RSP                  RS
RVRV/# )a~  One job: install the runtime (if missing), download this machine's build of the recommended model (if
missing), make it the default. Each leg uses the same code as the individual setup routes.
Preflight rejects (no automatic recommendation or no servable choice) fail the POST
synchronously so the button can explain itself; everything slow runs in the job with phase/byte progress.TrJ  Nc              3  óP   "  € T F  w  rqP                  4       '       * x € K  	  R # 5ir"  r€  r�  s   &  r0   r%  Ú*local_models_quickstart.<locals>.<genexpr>[  s   é € ÐK¹]©z¨q¸ŸL™L›N×*Ñ*»]ùr¦  Fc              3  ó2   "  € T F  q^,          x € K  	  R# 5i)rM   Nr(   rÐ  s   & r0   r%  r«  ^  s   é € Ð5¡} !˜1Ÿš£}ùs   ‚rÕ   r{  zSetup is already runningr`   Ú
quickstartr„  c            
     óv  <€ S'       d6   \         P                  ! S 4      f   \        SS 4       \        SSS4      w  oooS'       dR   SR,          R8w  d,   \        ;_uu_ 4        SP                  ^ R / R7       R R R 4       \        SSSP                  S4       \        SRR4       \        S4      ;_uu_ 4        \        S\        R4      SP                  RRR	7       \        SSP                  4       R R R 4       \        SSP                   R
24       R #   + '       g   i     L¥; i  + '       g   i     L>; i)Nrw   r–  r—  r;  r<  TuB   The local server could not start â€” open Local Models for detailszquickstart rescan check skipped©r2  rà   u    is ready â€” new chats use it)r   r  rf  r§  r‚   rš  rŸ  r  r¼   r   rP  r  r4   rY  rÀ   )r'   rÇ   Údownload_planr/  rƒ   Úneed_runtimerh  r}  s   €€€€€€€€r0   rÏ   Ú%local_models_quickstart.<locals>._runb  só   ø€ çœH×5Ò5°gÓ>ÒFÜ  WÔ-Ü,@ÀÀdÈGÓ,TÑ)ˆE�7˜Mßð �7�|˜}Ô,ß–ZØ—J‘J¨!¸Àb�JÔI÷  ä˜s M°5×3EÑ3EÀuÔMÜˆcÐ$Ð&AÔBÜ" 7×+Õ+Ü˜3Ô 4°TÓ :¸G×<LÑ<LØ'kØ$EõGô ˜C ×!1Ñ!1Ô2÷	 ,ô
 	�˜×*Ñ*Ð+Ð+IÐJÖK÷  —Zú÷ ,×+ús   Á#DÂ8:D(ÄD%	Ä(D8	zlr-quickstartzquickstart failed: %s)rÁ   rÂ   rÄ   r9   r4   r  Úneeds_runtimeÚneeds_downloadr:  )r¡  r   r  r  r   r  r  r‹  rÓ  Ú_QUICKSTART_LOCKr×   r	   r„   r  rK  rÞ   rÍ   )rÇ   rh  Ú_tagÚneed_downloadr:  rÏ   r'   r°  r/  rƒ   r±  r}  s   ff    @@@@@@r0   Úlocal_models_quickstartr¸  Q  s!  ÿ€ ô (¨¬h×.CÒ.CÈTÔ.RÓS�N€Eˆ7Ü#Ó%�M€Dˆ'Ü×,Ò,¨WÓ5¸Ð=€LÜ" 5¨'Ó2€Mß“CÑK¹]ÓK—C—C’CÑK¹]ÓKÓK€MßØˆÜÑ5¡}Ó5Ó5€NÜ×#Ñ#¨UÐ#×3Ò3Ü¨Ð4NÔOÐOÜ
ˆ|˜U×/Ñ/¸%¿(¹(Ô
C€C÷Lô Lô( ˆs�O TÐ4KÜ'×/Ñ/¸4õAà�c˜(•m Z°·±¸>È5×K]ÑK]Ø˜\Ð+;¸]ÐL\Ð^lðnð nr/   c               ó   € V ^8„  d   QhRR/# ©rM   rP   r•   r(   )rQ   s   "r0   rR   rR   }  s   € ÷ `ñ `˜dñ `r/   c                 óF   € ^ RI Hp  V ! 4       '       g   \        RRR7      hR# )zCExplicit recovery, never raw-PID termination of another live owner.©Ústop_recorded_orphanr{  zOAnother Hermes process owns this server, or its ownership could not be verifiedr`   N)Ú!hermes_cli.local_runtime.recoveryr½  r	   r¼  s    r0   Ú_terminate_state_pidr¿  }  s'   € åFá×!Ò!Ü¨Ø]ô`ð 	`ñ "r/   c               ó   € V ^8„  d   QhRR/# rº  r(   )rQ   s   "r0   rR   rR   †  s   € ÷  ñ  �dñ  r/   c                 óŠ   € \         P                  ! 4       e   \         P                  ! 4        M
\        4        \	        R4       R # )NF)r   rn  Úshutdown_local_runtimer¿  r  r(   r/   r0   Ú_stop_serverrÃ  †  s+   € Ü×ÒÓ!Ò-Ü×(Ò(Õ*äÔÜ˜Ör/   c               ó   € V ^8„  d   QhRR/# rº  r(   )rQ   s   "r0   rR   rR   Ž  s   € ÷ Jñ J�tñ Jr/   c                 ó8   € \        \        R 4      \        4       R# )TN)r8  r  Ú_SERVER_START_FAILEDr(   r/   r0   Ú_start_serverrÇ  Ž  s   € ÜÔ,¨TÓ2Ô4HÖIr/   ÚstoprÙ   z/api/local-models/serverc               ó   € V ^8„  d   QhRR/# )rM   rÇ   r?   r(   )rQ   s   "r0   rR   rR   –  s   € ÷ *ñ *Ð$4ñ *r/   c              ƒ  ól  "  € V P                   ;'       g    RP                  4       P                  4       pV\        9  d   \	        RRR7      h \
        P                  ! \        V,          4      G Rj  x€L
  RRR	T/#  L
  \         d    h \         d   p\	        R\        T4      R7      ThRp?ii ; i5i)
zÊTurn the local engine off (stop the server, free ALL GPU memory, disable auto-start) or back on. Unlike
per-model eject the off switch IS durable: the user said off, so boots stay off until they say on.ry   r  z action must be 'stop' or 'start'r`   Néö  rŒ  Tr@   )	r@   rÞ  rß  Ú_SERVER_ACTIONSr	   ÚasyncioÚ	to_threadrc   r3   )rÇ   r@   rd   s   &  r0   Úlocal_models_serverrÏ  •  s¤   é € ð �k‰k×Ð˜R×&Ñ&Ó(×.Ñ.Ó0€FØ”_Ô$Ü¨Ð4VÔWÐWðGÜ×Ò¤°Õ 7Ó8×8Ð8ð
 �$˜ &Ð)Ð)ñ 	9øÜô ØÜô GÜ¨´C¸³HÔ=À3ÐFûðGüsB   ‚AB4Á$A? Á2A=Á3A? Á7B4Á=A? Á?B1ÂB1ÂB,Â,B1Â1B4z/api/local-models/ejectc               ó   € V ^8„  d   QhRR/# )rM   rÇ   rB   r(   )rQ   s   "r0   rR   rR   §  s   € ÷ ñ ˜^ñ r/   c           	     ó®  € \         P                  ! 4       pVe<   \        R4      ;_uu_ 4        VP                  V P                  4       RRR4       RR/# \        4       pVf   \        RRR7      h\        R4      ;_uu_ 4        \        VR^xR	V P                  /R
7       RRR4       RR/#   + '       g   i     RR/# ; i  + '       g   i     RR/# ; i)uØ   Free a loaded model's GPU memory now; only demand (the next message) reloads it â€” residency v2 has no
automatic loading anywhere. Sync def: the fallback path blocks on a 120s urlopen â€” threadpool, never the loop.NrË  rŒ  Tr{  zlocal server is not runningr`   z/models/unloadrÜ  )rç   rä   )r   rn  re   Úunload_modelr4   r   r	   rý   )rÇ   r7  ræ   s   &  r0   Úlocal_models_ejectrÓ  ¦  sº   € ô ×
"Ò
"Ó
$€CØ
‚Ü˜×ÕØ×Ñ˜TŸ]™]Ô+÷ à�dˆ|ÐäÓ €HØÒÜ¨Ð4QÔRÐRÜ	�S×	Õ	Ü˜Ð"2¸CÈ'ÐSW×S`ÑS`ÐIaÕb÷ 
à�$ˆ<Ð÷ Öà�dˆ|Ðú÷
 
Ö	à�$ˆ<Ðús   ­B+ÂCÂ+B>	ÃC	z/api/local-models/activatec               ó    € V ^8„  d   QhRRRR/# )rM   rÇ   rD   rh  r&   r(   )rQ   s   "r0   rR   rR   ¹  s   € ÷ %ñ %Ð&7ð %À-ñ %r/   c              ƒ  ó  a aa"  € S P                   \        P                  ! 4       9  d   \        RS P                    R2R7      h\	        RS P                   S P                   R7      oV VV3R lp\        SRVRR	7       R
SR
,          /# 5i)a  Make a downloaded model the default for new chats: a config write via the same machinery as
/api/model/set plus making sure the server is up. NO model loading (residency v2: models load on first
inference; an empty router costs nothing). Kept as a job for UI continuity.r-  z is not downloadedr`   zmodel-activater„  c            
     óX  <€ \        S4      ;_uu_ 4        \        S\        P                  ! 4       S P                  \
        R R7       \        SRR4       \        R4       \        SS P                  4       \        SS P                   R24       RRR4       R#   + '       g   i     R# ; i)zactivate rescan check skippedr¯  rS  rT  Tz is the default for new chatsN)
r   rP  r  r  r4   rÆ  r¼   r  rY  rÀ   )rÇ   rƒ   rh  s   €€€r0   rÏ   Ú#local_models_activate.<locals>._runÂ  s{   ø€ ô # 7×+Õ+Ü˜3¤
× 6Ò 6Ó 8¸$¿-¹-Ü';ÐFeõgä�#Ð(Ð*BÔCÜ  Ô&Ü˜C §¡Ô/Ü�C˜DŸM™M˜?Ð*GÐHÔI÷ ,×+×+Ò+ús   •A9BÂB)	zlr-model-activatezmodel activate failed: %s)rÁ   r9   )r4   r   r‰  r	   r„   rÞ   )rÇ   rh  rÏ   rƒ   s   ff @r0   Úlocal_models_activaterØ  ¸  st   úé € ð ‡}�}œI×6Ò6Ó8Ô8Ü¨°t·}±}°oÐEWÐ4XÔYÐYÜ
Ð §¡¸¿¹Ô
G€C÷
Jô ˆsÐ'¨Ð8SÕTØ�c˜(•mÐ$Ð$ùs   …BBz/api/local-models/jobsc            	   ƒ  ó”  "  € \         ;_uu_ 4        \        \        P                  4       R R7      p V  Uu. uF  qR,          R9   g   K  VNK  	  ppV  Uu. uF  qR,          R9   g   K  VNK  	  upR,          pR. VOVO Uu. uF  p\	        V4      NK  	  up/uuRRR4       # u upi u upi u upi   + '       g   i     R# ; i5i)	up   All recent jobs, running first â€” the pane and app-level poller rediscover in-flight work here after a remount.c                ó   € V R ,          ) # )r|   r(   )rƒ   s   &r0   rE  Ú#local_models_jobs.<locals>.<lambda>×  s   € °s¸<Õ7HÑ6Hr/   r+  r]   :Né   NÚjobsN)rv   r«   )r‡   r}   )r‚   Úsortedr"   Úvaluesrµ   )rÝ  rƒ   ÚactiveÚrecents       r0   Úlocal_models_jobsrâ  Ó  s¥   é € ÷ 
ŽÜ”e—l‘l“nÑ*HÔIˆÙ!%ÓP¡˜#¨X­Ð:OÑ)O—#�#¡ˆÐPÙ!%ÓL¡˜#¨X­Ð:KÑ)K—#�#¡ÑLÈSÕQˆØÐ3E°VÐ3E¸fÑ3EÓFÑ3E¨Cœ 3žÑ3EÑFÐG÷	 
ŠùâPùÚLùÚF÷	 
�ˆüsQ   ‚C‘%B4¶B%Á
B%ÁB4ÁB*Á*B*Á0B4ÂB/
ÂB4ÂCÂ%B4Â4C	Â?	Cz/api/local-models/jobs/{job_id}c               ó   € V ^8„  d   QhRR/# )rM   r9   r3   r(   )rQ   s   "r0   rR   rR   Þ  s   € ÷ ñ  3ñ r/   c              ƒ  óÆ   "  € \         ;_uu_ 4        \        P                  V 4      pVf   \        RRR7      h\	        V4      uuR R R 4       #   + '       g   i     R # ; i5i)Nr-  zjob not foundr`   )r‚   r"   r™   r	   rµ   )r9   rƒ   s   & r0   Úlocal_models_jobrå  Ý  s<   é € ç	ŽÜ�i‰i˜ÓˆØŠ;Ü¨C¸ÔHÐHÜ˜‹~÷	 
��‹üs   ‚A!‘1AÁA!ÁA	Á	A!z/api/local-models/searchc               ó    € V ^8„  d   QhRRRR/# )rM   Úqr3   ÚlimitrX   r(   )rQ   s   "r0   rR   rR   è  s   € ÷ jñ j ð j¨Sñ jr/   c              ƒ  ó,  "  € V P                  4       '       g   R. /# \        RR4      ;_uu_ 4        R\        \        P                  W4      G Rj  x€L
  Uu. uF  q"P
                  NK  	  up/uuRRR4       #  L(u upi   + '       g   i     R# ; i5i)ut   Full-text HF search over GGUF models â€” the firehose behind the curated catalog; fit pills come from /search/files.ÚhitsrË  z!Hugging Face search unavailable: N)rÞ  re   r   r   Úsearch_modelsÚ__dict__)rç  rè  Úhs   && r0   Úlocal_models_searchrî  ç  ss   é € ð �7‰7�9Š9Ø˜ˆ|ÐÜ	�SÐ=×	>Õ	>ØÔ3DÄY×E\ÑE\Ð^_Ó3g×-gÐ-gÓhÑ-g¨ŸœÑ-gÑhÐi÷ 
?Ò	>Ù-gùÒh÷ 
?×	>Ð	>üs@   ‚/B±B ÁA9
ÁB ÁA;
Á+B Á.BÁ9B Á;B Â B	Â	Bz/api/local-models/search/filesc               ó   € V ^8„  d   QhRR/# )rM   rG   r3   r(   )rQ   s   "r0   rR   rR   ñ  s   € ÷ Nñ N¨#ñ Nr/   c           
   ƒ  óh  "  € \        RRV  R24      ;_uu_ 4        \        \        P                  V \        P
                  ! RR7      4      G Rj  x€L
 pRRR4       RX Uu. uF-  p\        VP                  \        VP                  4      R7      NK/  	  up/#  LH  + '       g   i     LN; iu upi 5i)	zŽServable GGUFs in one HF repo with a rough pre-download fit verdict per quant (file size + conservative
fill-ins; the GGUF header refines it).rË  zCould not list z: TrJ  Nrt  )rH   )
re   r   r   Úpriced_repo_filesr   r  r¯   rì  rz  rH   )rG   ÚgroupsÚgs   &  r0   Úlocal_models_search_filesrô  ð  sƒ   é € ô 
�S˜O¨D¨6°Ð4×	5Õ	5Ü(¬×)DÑ)DÀdÌH×LaÒLaÐkoÔLpÓq×qˆ÷ 
6àÁVÓLÁVÀ”d˜1Ÿ:™:¬T°!·'±'«]×;ÁVÑLÐMÐMñ r÷ 
6×	5üâLùs:   ‚B2›4BÁBÁBÁB2Á!3B-ÂB2ÂBÂB*	Â%B2z"/api/local-models/download-browsedc               ó   € V ^8„  d   QhRR/# )rM   rÇ   rF   r(   )rQ   s   "r0   rR   rR   ú  s   € ÷ ;ñ ;Ð.Añ ;r/   c           	   ƒ  ó8  aaa"  € V P                   ;'       g    .  Uu. uF+  qP                  4       P                  R4      '       g   K)  VNK-  	  ppV'       g   \        RRR7      h\        P
                  ! R\         R2RV^ ,          P                  R^4      R,          \        P                  R	7      oS\        P                  ! 4       9   d	   R
RRRRS/# \        RS RV P                   R2SR7      oV Uu. uFj  p\        V P                  \        P                  P!                  V4      4      \        P"                  ! 4       VP                  R^4      R,          ,          ^ 3NKl  	  upoVVV3R lp\%        SRVSRR7       R
SR
,          RS/# u upi u upi 5i)a  Download an arbitrary HF GGUF into the managed models dir. Once landed it is a normal staged model (the
post-download bounce regenerates presets from its real header); with no catalog entry it serves
'unverified', capabilities answered from the live server only.ú.ggufé¦  zno .gguf files givenr`   z(?:z	)?\.gguf$ry   r]  )Úflagsr9   Nrƒ  Tr4   r„  z (from r[  r„  c                 ó"   <€ \        S SS4       R # r"  )rŸ  )rƒ   r4   r~  s   €€€r0   Ú_fetchÚ-local_models_download_browsed.<locals>._fetch	  s   ø€ Ü˜3  hÖ/r/   zlm-download-browsed)rÃ   rÄ   rŠ   )rH   rß  Úendswithr	   rc  rd  re  r÷   Ú
IGNORECASEr   r‰  r„   rG   r^  rô   ÚparseÚquoterj  rÞ   )rÇ   rs  rH   rK   rû  rƒ   r4   r~  s   &    @@@r0   Úlocal_models_download_browsedr  ù  so  úé € ð
 Ÿ™×)Ð) rÐ)ÓJÑ)�1¯g©g«i×.@Ñ.@À×.I�QˆQÑ)€EÐJßÜ¨Ð4JÔKÐKÜ�vŠv˜œ^Ð,¨IÐ6¸¸EÀ!½H¿O¹OÈCÐQRÓ<SÐTVÕ<WÔ_a×_lÑ_lÔm€HØ”9×-Ò-Ó/Ô/Ø˜$Ð 4°d¸JÈÐQÐQÜ
Ð H :¨W°T·Y±Y°K¸qÐ!AÈHÔ
U€Cñ OTóUÙNSÀdô �T—Y‘Y¤§¡× 2Ñ 2°4Ó 8Ó9Ü×!Ò!Ó# d§k¡k°#°qÓ&9¸"Õ&=Õ=¸qóBÙNSñU€D÷0ô ˆsÐ)¨6À(ÐVZÕ[Ø�c˜(•m Z°Ð:Ð:ùò KùòUùs$   …Fž&FÁ	FÁB)FÃ8A0FÅ(2Fz/api/local-models/sideloadc               ó   € V ^8„  d   QhRR/# )rM   rÇ   rJ   r(   )rQ   s   "r0   rR   rR     s   € ÷ /ñ / lñ /r/   c              ƒ  ó¬  "  € \        V P                  4      pVP                  4       '       d    VP                  P	                  4       R8w  d   \        RRR7      h\        P                  ! 4       VP                  ,          pVP                  4       '       d   RRRVP                  RR/# VP                  P                  RRR	7        \        P                  ! W4       \)        R4       RRRTP                  /#   \         dP     \        P                   ! Y4        L?  \         d(    \#        \$        P&                  Y4      G R
j  x€L 
    Lpi ; ii ; i5i)zÌRegister a GGUF already on this machine: link it into the managed models dir (copy only when linking is
impossible) and bounce the router. The original stays put; delete-from-Hermes removes only our link.r÷  rø  zPick a .gguf model filer`   rŒ  Tr4   Úalready_present)ÚparentsÚexist_okNz%post-sideload runtime refresh skipped)r   rK   rŽ  Úsuffixrß  r	   r   rj  rÆ   rr  rf  ÚparentÚmkdirÚosÚlinkr³  Úsymlinkr   ÚshutilÚcopyfilerÌ   )rÇ   Úsrcr‘  s   &  r0   Úlocal_models_sideloadr    s  é € ô ˆt�y‰y‹/€CØ�;‰;�=Š=˜CŸJ™J×,Ñ,Ó.°'Ô9Ü¨Ð4MÔNÐNÜ×ÒÓ! C§H¡HÕ,€DØ‡{�{‡}‚}Ø�d˜J¨¯	©	Ð3DÀdÐKÐKØ‡K�K×Ñ˜d¨TÐÔ2ð@Ü
�Š�Ôô Ð<Ô=Ø�$˜
 D§I¡IÐ.Ð.øô ô @ð	@Ü�JŠJ�sÖ!øÜô 	@Ü#¤F§O¡O°SÓ?×?Ô?ð	@úð@üsZ   ‚BEÂ/EÃC7 ÃEÃ7EÄDÄEÄ(EÅEÅEÅ	EÅ
EÅEÅEÅE)rW  z	llama.cppz	llama-cpp>   rx   r–  rc  r_  )ry   r"  )rV  )rÜ  ) Ú__conditional_annotations__Ú__doc__Ú
__future__r   rÍ  rœ   Ú
contextlibrñ   Úloggingr
  rc  r  rÛ   r�   Úurllib.parserô   Úurllib.requestr~   Úpathlibr   Útypingr   r   r   r   Úfastapir   r	   Úpydanticr
   Ústarlette.concurrencyr   Ú
hermes_clir   r  r   Úhermes_cli.web_routers._commonr   r   Úhermes_cli.local_runtimer   r   r   r   r   r   r   r   r   r   r   Úagent.memory_providerr   Úpm.downloaderr   r   r   Ú!hermes_cli.local_runtime.endpointr   r    Úhermes_cli.local_runtime.ggufr!   Ú	getLoggerr)   rm   Úrouterr"   r-   rÜ   r‚   r#   rµ  rà  re  Ú	frozensetr²   r    rŒ   rÆ  r%   r2   r8   r<   r?   rB   rD   rF   rJ   rU   r[   Úcontextmanagerre   ro   r„   r“   r¥   rµ   r¹   r¼   rÀ   rÞ   rÌ   rý   r  r  r  r  r  r)  r0  r8  rP  rY  r^  rg  rx  r  r’  rŸ  r¨  r™  r›  rÊ  rÕ  rã  r™   r÷  r   r  r>  r@  r  rH  rP  r`  rf  Úpostrx  r|  r‡  r�  r‘  Údeleterš  r¡  r§  r¸  r¿  rÃ  rÇ  rÌ  rÏ  rÓ  rØ  râ  rå  rî  rô  r  r  )r  s   @r0   Ú<module>r*     sú  øðôõ #ã Û Û Û Û Û 	Û 	Û Û Û Û Û Û Ý ß 0Ó 0ç ,Ý å 3ç 5ß W÷÷ ÷ ñ õ 7ß :Ñ :ç JÝ 5à	×	Ò	˜8Ó	$€á	‹€à#%€Ð Ó %Ø�^Š^Ó€
Ø&(€Ð
#Ó (ð —>’>Ó#Ð Ø<Ð Ø#€ÙÒeÓfÐ ð €ØÐ Ø\Ð ô"˜ô "ô˜	ô ô�	ô ô �Yô  ô�yô ô�Yô ô˜	ô ô˜)ô ô
�9ô õ%õ ð ×ÑöRó ðRð
Àdð 
Ð`d÷ 
÷
õõ&!õ.õ$0õõð
<Ðcgð <Ø48ð<ØW[ð<à!&÷<õ@Bð
EÐcg÷ 
Eõ7õ
=õ÷5õJòRõ
õõQõ6|÷Fõ7õ
õõ÷(*õõ2õ
õõ0Oõ	ð ‡�Ð&Ó'ñó (ðõFð ‡�Ð(Ó)ñ
ó *ð
ð ð Oàð +ð€ð qÐ õQõ-ð` ‡�Ð'Ó(ñzó )ðzõ,õð ‡‚Ð0Ó1öEó 2ðEõ<!ð ‡‚Ð)Ó*ôCó +ðCð  ‡‚Ð/Ó0ô	(ó 1ð	(ð ‡‚Ð0Ó1ô>ó 2ð>ð ‡‚Ð4Ó5ôó 6ðõ$cõ0Yð ‡‚Ð+Ó,ö'nó -ð'nõV`õ õJð ˜<¨°-Ð@€ð ‡‚Ð'Ó(ô*ó )ð*ð  ‡‚Ð&Ó'ôó (ðð" ‡‚Ð)Ó*ö%ó +ð%ð4 ‡�Ð$Ó%ñHó &ðHð ‡�Ð-Ó.ôó /ðð ‡�Ð&Ó'öjó (ðjð ‡�Ð,Ó-ôNó .ðNð ‡‚Ð1Ó2ô;ó 3ð;ð, ‡‚Ð)Ó*ô/ó +ò/r/   