+
    jHàjþV  ã                   óF  a € R: t=0 t R t^ RIt^ RIt^ RI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 ^ RIHt ^ RIHt ^ RIHtHtHt ^ R	IHtHtH t  ]PB                  ! R
4      t"]	! 4       t#]! RR4      t$]! RR4      t%]! RR4      t&]! RR4      t']! RR4      t(RRRRR^ R^ R^ R/ /t)] ^ k R;t*R R lt+R R lt,Rt-R R lt.]#P_                  R 4      R<R! R" ll4       t0]#P_                  R#4      R=R$ R% ll4       t1R& R' lt2]#P_                  R(4      R>R) R* ll4       t3]#P_                  R+4      R<R, R- ll4       t4]#P_                  R.4      R<R/ R0 ll4       t5R?t6R1 R2 lt7R3 R4 lt8]#Ps                  R.4      R<R5 R6 ll4       t:]#Pw                  R74      R<R8 R9 ll4       t<R# )@a  Model assignment dashboard routes: model info/options/recommended default, auxiliary + MoA slots, /api/model/set.

Extracted from ``hermes_cli.web_server``; helpers/state that tests monkeypatch on
``web_server`` stay there and are resolved late at call time (cycle-safe).
N)ÚOptional)Ú	APIRouterÚHTTPException)Ú	LateStateÚlate)Ú_AUX_TASK_SLOTSÚ_UNSETÚ_apply_model_assignment_syncÚ_dashboard_code_skew_guardÚ_plugin_aux_tasksÚ_prepare_main_assignment)Úis_local_endpoint)Úrun_in_threadpool)ÚModelAssignmentÚMoaConfigPayloadÚMoaModelSlot)Ú_CONFIG_MUTATION_LOCKÚconfig_write_scopeÚhttp_failurezhermes_cli.web_serverÚ_config_profile_scopezhermes_cli.web_server_profilesÚ_profile_scopeÚload_configzhermes_cli.configÚsave_configÚ$require_readable_config_before_writeÚmodelÚ ÚproviderÚauto_context_lengthÚconfig_context_lengthÚeffective_context_lengthÚcapabilitiesc                óF   € V ^8„  d   QhR\         \        \        3,          /# ©é   Úreturn)ÚtupleÚstr)Úformats   "ÚB/home/ubuntu/.hermes/hermes-agent/hermes_cli/web_routers/models.pyÚ__annotate__r)   +   s   € ÷ 5ñ 5¤U¬3´¨8¥_ñ 5ó    c                óÈ   € \        V \        4      '       d5   V P                  RV P                  RR4      4      V P                  RR4      3# V '       d   \        V 4      R3# RR3# )zO(model, provider) from config's ``model`` section, which may be a plain string.ÚdefaultÚnamer   r   )Ú
isinstanceÚdictÚgetr&   )Ú	model_cfgs   &r(   Ú_main_model_fieldsr2   +   sX   € ä�)œT×"Ò"Ø�}‰}˜Y¨	¯©°f¸bÓ(AÓBÀIÇMÁMÐR\Ð^`ÓDaÐaÐaß'ŒC�	‹N°"Ð4Ð4¨R°"Ð4Ð4r*   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r#   Úprofiler$   )r   r&   r/   )r'   s   "r(   r)   r)   2   s   € ÷ ñ ¤¬#¥ð ´4ñ r*   c                 óz   € \        V 4      ;_uu_ 4        \        4       uuR R R 4       #   + '       g   i     R # ; i©N)r   r   )r4   s   &r(   Ú_load_config_scopedr7   2   s!   € Ü	˜×	 Õ	 Ü‹}÷ 
!×	 ×	 Ó	 ús   ”
)©:	g      @c                óH   € V ^8„  d   QhR\         R\         R\         R\        /# )r#   r   Úbase_urlr   r$   )r&   Úint)r'   s   "r(   r)   r)   ?   s(   € ÷ "ñ "¬ð "¼ð "Äsð "Ìsñ "r*   c                ó°  € ^ RI Hp \        P                  P	                  ^RR7      p VP                  W0WRR7      P                  \        R7       VP                  RR7       #   \        P                  P                   d<    \        P                  R	Y;'       g    R
\        4        TP                  RR7       ^ # i ; i  TP                  RR7       i ; i)a  ``get_model_context_length`` with the route's blocking budget.

On timeout the abandoned probe keeps running in its worker thread (bounded
by its own per-request timeouts) while the response degrades to
``auto_context_length = 0`` ("auto-detected: unknown").
)Úget_model_context_lengthzmodel-info-probe)Úmax_workersÚthread_name_prefixN)r   r9   r   r   )ÚtimeoutF)Úwaitu[   GET /api/model/info: context-length probe for %r at %s exceeded %.1fs â€” returning unknownz	<default>)Úagent.model_metadatar<   Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitÚresultÚ_MODEL_INFO_PROBE_BUDGET_SÚshutdownÚTimeoutErrorÚ_logÚwarning)r   r9   r   r<   Úpools   &&&  r(   Ú_bounded_context_length_proberM   ?   sÅ   € õ >ä×Ñ×0Ñ0¸QÐSeÐ0Óf€Dð"Ø�{‰{Ø$¸HØ"&ð ó 
÷ ‰&Ô3ˆ&Ó
4ð	5ð 	�‰˜5ˆÕ!øô ×Ñ×*Ñ*ô Ü�‰ØiØ×*Ð*˜{Ô,Fô	
ð ð 	�‰˜5ˆÖ!ðûð 	�‰˜5ˆÕ!ús)   ©'A$ Á$7B>ÂB>Â(C Â=B>Â>C ÃCz/api/model/infoc                ó:   € V ^8„  d   QhR\         \        ,          /# ©r#   r4   ©r   r&   )r'   s   "r(   r)   r)   [   s   € ÷ ,'ñ ,'œH¤S�Mñ ,'r*   c                óò  €  \        V 4      P                  RR4      p\        V4      w  r#\        V\        4      '       d   VP                  RR4      MRp\        V\        4      '       d   VP                  R4      MRpV'       g   \	        \
        VR7      #  \        W$V4      p\        V\        4      '       d
   V^ 8”  d   TM^ p/ p ^ RI	H
p	 V	! W2R7      p
V
e   \         Uu/ uF  q»\        W«4      bK  	  ppRTR	TR
TRTRT;'       g    TRT/#   \         d    ^ p L|i ; iu upi   \         d     L=i ; i  \         d    h \         d(    \        P                  R4       \	        \
        4      u # i ; i)zÂResolved metadata for the configured model: auto-detected vs configured
context length (so the UI can show "Auto-detected: 200K" beside the
override) plus models.dev capabilities when available.r   r   r9   Úcontext_lengthN©r   )Úget_model_capabilities)r   r   r   r   r   r   r    zGET /api/model/info failed)r7   r0   r2   r.   r/   Ú_EMPTY_MODEL_INFOrM   Ú	Exceptionr:   Úagent.models_devrT   Ú_CAPABILITY_FIELDSÚgetattrr   rJ   Ú	exception)r4   r1   Ú
model_namer   r9   Ú
config_ctxÚauto_ctxÚconfig_ctx_intÚcapsrT   Úmcr-   s   &           r(   Úget_model_infora   Z   sw  € ð
('Ü'¨Ó0×4Ñ4°W¸bÓAˆ	Ü1°)Ó<Ñˆ
Ü4>¸yÌ$×4OÒ4O�9—=‘= ¨RÔ0ÐUWˆÜ8BÀ9Ìd×8SÒ8S�Y—]‘]Ð#3Ô4ÐY]ˆ
çÜÔ)°HÔ=Ð=ð	ô 5°ZÈ8ÓTˆHô (2°*¼c×'BÒ'BÀzÐTUÄ~™Ð[\ˆàˆð	Ý?Ù'°ÔLˆBØŠ~Ý<NÓOÑ<N°Dœg bÓ/Ò/Ñ<N�ÐOð
 �Z ¨XÐ7LÈhØ# ^Ø&¨×(BÐ(B¸(Ø˜Dð	
ð 	
øô ô 	ØŠHð	üò PøÜô 	Ùð	ûô ô ð 	Üô 'Ü�‰Ð3Ô4ÜÔ%Ó&Ò&ð'ús~   ‚BD9 ÂD9 ÂD Â##D9 ÃD( Ã"D#Ã6D( Ã8D9 Ä
D9 ÄD ÄD9 ÄD Ä D9 Ä#D( Ä(D6Ä3D9 Ä5D6Ä6D9 Ä9E6Å%E6Å5E6z/api/model/optionsc                ó^   € V ^8„  d   QhR\         \        ,          R\        R\        R\        /# )r#   r4   ÚrefreshÚinclude_unconfiguredÚexplicit_only)r   r&   Úbool)r'   s   "r(   r)   r)   ‹   s4   € ÷ >ñ >Ü”c�]ð>äð>ô ð>ô ñ	>r*   c           	   ƒ  óF  a aaaaa"  € \        RRRR7      ;_uu_ 4        \        4       pV'       d'   \        P                  RV4       \	        RRV 2R7      h^ R	IHoHo R
 VVVVV V3R llp\        V4      G Rj  x€L
 uuRRR4       #  L  + '       g   i     R# ; i5i)u“  Authenticated providers + curated model lists â€” REST twin of the ``model.options``
JSON-RPC on tui_gateway, same response shape so ``ModelPickerDialog`` shares the types.
``profile`` scopes the picker context so the Models page reads the SAME profile
/api/model/set writes. ``refresh`` busts the per-provider model-id disk cache
(picker's explicit "Refresh Models"); normal opens stay on the 1h cache.zGET /api/model/options failedéô  zFailed to list model options©Údetailz"GET /api/model/options refused: %sé÷  úRestart required: ©Ústatus_coderj   )Úbuild_model_options_payloadÚload_picker_contextc                ó$   € V ^8„  d   QhR\         /# r"   ©r/   )r'   s   "r(   r)   Ú'get_model_options.<locals>.__annotate__ž   s   € ÷ 	\ñ 	\¤tñ 	\r*   c            
      óÀ   <€ \        S4      ;_uu_ 4        S ! S! 4       \        S4      \        S4      \        S4      R 7      uuRRR4       #   + '       g   i     R# ; i))re   rd   rc   N)r   rf   )ro   re   rd   rp   r4   rc   s   €€€€€€r(   Ú_build_payload_scopedÚ0get_model_options.<locals>._build_payload_scopedž   sE   ø€ ô
 ' w×/Õ/Ù2Ù'Ó)¼¸mÓ9LÜ)-Ð.BÓ)CÌTÐRYË]ô\÷ 0×/×/Ó/ús   •,AÁA	N)	r   r
   rJ   rK   r   Úhermes_cli.inventoryro   rp   r   )r4   rc   rd   re   Úskew_msgru   ro   rp   s   ffff  @@r(   Úget_model_optionsry   Š   s   ýé € ô 
Ð5°sÐCa×	bÖ	bÜ-Ó/ˆßÜ�L‰LÐ=¸xÔHÜ¨CÐ:LÈXÈJÐ8WÔXÐXçY÷	\õ 	\ô 'Ð'<Ó=×=÷% 
cÒ	bñ$ >÷% 
c×	bÐ	büs/   ˆB!ŸABÁ<BÁ=BÂ B!ÂBÂB	Â	B!c                ó$   € V ^8„  d   QhR\         /# r"   rr   )r'   s   "r(   r)   r)   «   s   € ÷ ,ñ ,¤4ñ ,r*   c                  ó   € ^ RI Hp  V ! 4       # )é    ©Úrecommended_nous_default_model)Úhermes_cli.modelsr~   r}   s    r(   Ú_nous_recommended_defaultr€   «   s   € Ý@Ù)Ó+Ð+r*   z/api/model/recommended-defaultc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r#   r   r4   )r&   r   )r'   s   "r(   r)   r)   ±   s"   € ÷ 'Bñ 'B¬Cð 'B¼xÌ½}ñ 'Br*   c           	     ó‚  € T ;'       g    RP                  4       P                  4       pVR8X  d*    \        V4      ;_uu_ 4        \        4       uuRRR4       #  ^ RIH	pH
p ^ R	IHp \        V4      ;_uu_ 4        V! V! 4       4      pRRR4       XP                  R
. 4       Fu  p\        VP                  RR4      4      P                  4       V8X  g   K3  VP                  R4      ;'       g    .  Uu. uF  p\        V4      NK  	  p	pRVRV! W’R7      RR/u # 	  RVRRRR/#   + '       g   i     LÛ; i  \         d    h \
         d!    \        P                  R4       RRRRRR/u # i ; i  + '       g   i     Lï; iu upi   \         d    h \
         d!    \        P                  R4       RTRRRR/u # i ; i)uH  Recommended default model for a freshly-authenticated provider, mirroring
``hermes model``'s curation so GUI onboarding lands on a sensible default.
Nous honors the user's free/paid tier. Any other provider gets the preferred
silent default when its curated list carries it, else the first curated model â€”
aggregator lists lead with the priciest Anthropic flagship, which must never be
the model a user lands on without explicitly picking it.
Response: {"provider", "model", "free_tier": bool | None} â€” free_tier only for
Nous; ``model`` may be empty (caller degrades gracefully).r   ÚnousNz0GET /api/model/recommended-default (nous) failedr   r   Ú	free_tier)Úbuild_models_payloadrp   )Úpick_silent_default_modelÚ	providersÚslugÚmodelsrS   z)GET /api/model/recommended-default failed)ÚstripÚlowerr   r€   r   rV   rJ   rZ   rw   r…   rp   r   r†   r0   r&   )
r   r4   rˆ   r…   rp   r†   ÚpayloadÚrowÚmr‰   s
   &&        r(   Úget_recommended_default_modelr�   °   s—  € ð �NˆN˜×!Ñ!Ó#×)Ñ)Ó+€Dàˆv„~ð	Hä& w×/Õ/Ü0Ó2÷ 0Ò/ðBßRÝ?ô # 7×+Õ+Ù*Ñ+>Ó+@ÓAˆG÷ ,à—;‘;˜{¨BÖ/ˆCÜ�3—7‘7˜6 2Ó&Ó'×-Ñ-Ó/°4Ö7Ø+.¯7©7°8Ó+<×+BÐ+BÀÐ+BÓDÑ+B Qœ#˜až&Ñ+B�ÐDØ" D¨'Ñ3LÈVÔ3cÐepÐrvÐwÒwñ 0ð ˜D '¨2¨{¸DÐAÐA÷) 0×/ûäô 	ØÜô 	HÜ�N‰NÐMÔNØ ¨°°[À$ÐGÒGð	Hú÷ ,×+üò Eøô ô ØÜô BÜ�‰ÐBÔCØ˜D '¨2¨{¸DÐAÒAðBús„   ±D7 Á
D$Á
D7 Á!F Á;E0Â	AF ÃF Ã.F Ã3FÄF Ä	F Ä$D4	Ä/D7 Ä4D7 Ä7E-ÅE-Å,E-Å0F 	Å;F ÆF>ÆF>Æ=F>z/api/model/auxiliaryc                ó:   € V ^8„  d   QhR\         \        ,          /# rO   rP   )r'   s   "r(   r)   r)   Ü   s   € ÷ 1fñ 1f¤(¬3¥-ñ 1fr*   c                ó  a	a
a€ ^ RI Hp \        RRRR7      ;_uu_ 4        \        V 4      ;_uu_ 4        \	        4       p\        4       pV Uu/ uF2  qDP                  R4      '       g   K  VR,          V! VR,          4      bK4  	  upoRRR4       XP                  R	/ 4      o
\        S
\        4      '       g   / o
R
 V
3R llo	\         Uu. uF  pS	! V4      NK  	  ppVP                  V	V3R lX 4       4       \        VP                  R/ 4      4      w  rxRTRR\        T;'       g    R4      R\        T;'       g    R4      //uuRRR4       # u upi   + '       g   i     LÖ; iu upi   + '       g   i     R# ; i)u¼  Current auxiliary task assignments: ``{"tasks": [{task, provider, model,
base_url}, ...], "main": {provider, model}}``. ``profile`` scopes the read â€”
without it the Models page would show the dashboard profile's pins while
/api/model/set wrote the selected profile's.

Built-in slots come first; plugin-registered tasks follow, each carrying the
``label``/``hint``/``plugin`` the plugin declared (built-ins are labelled client-side) and
``inherit_from`` (base slot key or null). An inheriting row also carries ``effective``: the
route it resolves to right now, which is the base's while the row itself is unpinned.
``provider``/``model``/``base_url`` stay the slot's own stored values on every row.)Ú_get_auxiliary_task_configzGET /api/model/auxiliary failedrh   zFailed to read auxiliary configri   Úinherit_fromÚkeyNÚ	auxiliaryc                ó0   € V ^8„  d   QhR\         R\        /# ©r#   Úslotr$   )r&   r/   )r'   s   "r(   r)   Ú*get_auxiliary_models.<locals>.__annotate__õ   s   € ÷ 		ñ 		”sð 		œtñ 		r*   c                 óÒ  <€ \        SP                  V 4      \        4      '       d   SP                  V / 4      M/ p\        VP                  R R4      ;'       g    R4      pRT R\        VP                  RR4      ;'       g    R4      R\        VP                  RR4      ;'       g    R4      R TR\        VP                  R4      ;'       g    R4      ;'       g    RR\	        V4      /# )	r9   r   Útaskr   Úautor   Úreasoning_effortNÚlocal_endpoint)r.   r0   r/   r&   r   )r˜   Úslot_cfgr9   Úaux_cfgs   &  €r(   Ú_rowÚ"get_auxiliary_models.<locals>._rowõ   sÅ   ø€ Ü0:¸7¿;¹;ÀtÓ;LÌd×0SÒ0S�w—{‘{ 4¨Ô,ÐY[ˆHÜ˜8Ÿ<™<¨
°BÓ7×=Ð=¸2Ó>ˆHà˜˜j¬#¨h¯l©l¸:ÀvÓ.N×.XÐ.XÐRXÓ*YØœ˜XŸ\™\¨'°2Ó6×<Ð<¸"Ó=¸zÈ8Ø"¤C¨¯©Ð5GÓ(H×(NÐ(NÈBÓ$O×$WÐ$WÐSWà Ô"3°HÓ"=ðð r*   c              3   ó  <"  € T Fû  p/ S! VR ,          4      CR\        VP                  R4      ;'       g
    VR ,          4      R\        VP                  R4      ;'       g    R4      R\        VP                  R4      ;'       g    R4      RVP                  R4      ;'       g    R/CVR ,          S9   dF   R	R
 Uu/ uF6  pT\        SVR ,          ,          P                  V4      ;'       g    R4      bK8  	  up/M/ Cx € Ký  	  R# u upi 5i)r”   ÚlabelÚdisplay_nameÚhintÚdescriptionr   Úpluginr“   NÚ	effective)r   r   r9   )r&   r0   )Ú.0ÚentryÚfieldr¡   r©   s   &  €€r(   Ú	<genexpr>Ú'get_auxiliary_models.<locals>.<genexpr>  s  øé € ð 	%ñ $ˆeð	
Ù�5˜•<Ó ð	
à”S˜Ÿ™ >Ó2×BÐB°e¸EµlÓCØ”C˜Ÿ	™	 -Ó0×6Ð6°BÓ7Ø”c˜%Ÿ)™) HÓ-×3Ð3°Ó4Ø˜EŸI™I nÓ5×=Ð=¸ñ	
ð ˜•, )Ô+ð Ù+LóNÙ+L %ð $¤S¨°5¸µ<Õ)@×)DÑ)DÀUÓ)K×)QÐ)QÈrÓ%RÒRÙ+LñNñ Oà13õ	
ó $ùòNùs.   ƒ2D¶*DÁ!#DÂDÂ$DÂ;0D
Ã,D
Ã7Dr   ÚtasksÚmainr   r   )Úagent.auxiliary_clientr’   r   r   r   r   r0   r.   r/   r   Úextendr2   r&   )r4   r’   ÚcfgÚplugin_tasksr«   r˜   r¯   r   r   r¡   r    r©   s   &        @@@r(   Úget_auxiliary_modelsrµ   Û   sO  ú€ õ Bä	Ð7¸ÐEf×	gÖ	gÜ˜G×$Õ$Ü“-ˆCô -Ó.ˆLá&2óQÙ&2˜U·i±iÀ×6Oô P˜˜u�Ñ'AÀ%ÈÅ,Ó'OÒOÙ&2ñQˆI÷ %ð —'‘'˜+ rÓ*ˆÜ˜'¤4×(Ò(ØˆG÷		ð 		õ )8Ó8© ‘�d–©ˆÐ8Ø�‰õ 	%ñ $ó	%ô 		%ô -¨S¯W©W°W¸bÓ-AÓB‰ˆØ˜ ¨´S¸¿¸ÀRÓ5HÈ'ÔSVÐW\×WbÐWbÐ`bÓScÐ(dÐe÷I 
hÒ	gùòQ÷ %×$üò, 9÷/ 
h×	gÐ	gúsN    E.´E	ÁEÁ*EÂE	ÂAE.ÃE)ÃA!E.Ä>E.ÅE	ÅE&Å!E.Å.E?	z/api/model/moac                ó:   € V ^8„  d   QhR\         \        ,          /# rO   rP   )r'   s   "r(   r)   r)     s   € ÷ Yñ YœH¤S�Mñ Yr*   c           
     ób  € \        RRRR7      ;_uu_ 4        ^ RIHp \        V 4      ;_uu_ 4        \	        4       pT! \        V\        4      '       d   VP                  R4      M/ 4      uuRRR4       uuRRR4       #   + '       g   i     M; i RRR4       R#   + '       g   i     R# ; i)z=Return the configured Mixture-of-Agents provider/model slots.zGET /api/model/moa failedrh   zFailed to read MoA configri   )Únormalize_moa_configÚmoaN)r   Úhermes_cli.moa_configr¸   r   r   r.   r/   r0   )r4   r¸   r³   s   &  r(   Úget_moa_modelsr»     sv   € ô 
Ð1°3Ð?Z×	[Ö	[Ý>ä˜G×$Õ$Ü“-ˆCÙ'¼*ÀSÌ$×:OÒ:O¨¯©°¬ÐUWÓX÷ %Ñ$÷ 
\Ò	[÷ %×$úÐ$÷ 
\×	[×	[Ò	[ús"   —B±9A?	Á*
BÁ?BÂ
BÂB.	c                ó0   € V ^8„  d   QhR\         R\        /# r—   )r   r/   )r'   s   "r(   r)   r)   !  s   € ÷ Cñ C”\ð C¤dñ Cr*   c                 ó~   € V P                  4       P                  4        UUu/ uF  w  rVf   K  WbK  	  upp# u uppi r6   )r/   Úitems)r˜   ÚkÚvs   &  r(   Ú
_slot_dictrÁ   !  s3   € à!ŸY™Y›[×.Ñ.Ô0ÔBÑ0‘T�Q°AŒDˆAŠDÑ0ÒBÐBùÓBs   ¢9¯9c                ó$   € V ^8„  d   QhR\         /# r"   rr   )r'   s   "r(   r)   r)   &  s   € ÷ ñ œDñ r*   c           	     óÌ   € RV P                    Uu. uF  p\        V4      NK  	  upR\        V P                  4      /\         Uu/ uF  q"\	        W4      bK  	  upC# u upi u upi )zLRaw preset dict from a MoaPresetPayload or the flat MoaConfigPayload fields.Úreference_modelsÚ
aggregator)rÄ   rÁ   rÅ   Ú_MOA_PRESET_FIELDSrY   )Úpresetr˜   r-   s   &  r(   Ú_preset_dictrÈ   &  si   € ð 	¸&×:QÒ:QÓRÑ:Q°$œZ¨Ö-Ñ:QÑRØ”j ×!2Ñ!2Ó3ðõ 4FÓ
FÑ3E¨4”˜Ó&Ò&Ñ3EÑ
Fðð ùÚRùâ
Fs   �AÁA!c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r#   Úbodyr4   )r   r   r&   )r'   s   "r(   r)   r)   0  s#   € ÷ E.ñ E.Ô)ð E.´H¼SµMñ E.r*   c                ój  € \        RRRR7      ;_uu_ 4        ^ RIHp ^ RIHpHp \        V P                  ;'       g    T4      ;_uu_ 4        VP                  ;_uu_ 4        V P                  '       * pV'       gT   RV P                  RV P                  R	V P                  P                  4        UUu/ uF  w  rgV\        V4      bK  	  upp/pM\        V 4      pV! V4      p	V	'       d$   \        R
RRP                  V	4      ,           R7      h\!        4       p
V
P#                  R4      p\%        V\&        4      '       d   RV9   d   VR,          VR&   V! V4      pV'       dø   \%        V\&        4      '       dâ   VP#                  R	4      pVP#                  R4      p\%        V\&        4      '       dª   \%        V\(        4      '       da   Wí9   d[   VP#                  R4      p\%        V\(        4      '       d4   WüR	,          9   d'   VR	,          P+                  V4      VR	,          V&   WìR&   VP#                  R4      p\%        V\(        4      '       d   VV9   d   VVR&   VP-                  V
RV/4      pV'       g;   VR,          R	,          pVR	,           Uu/ uF  qfVV,          bK  	  upVR,          R	&   \/        V4       RR/VCuuRRR4       uuRRR4       uuRRR4       # u uppi u upi   + '       g   i     M; iRRR4       M  + '       g   i     M; iRRR4       R#   + '       g   i     R# ; i)z3Persist the Mixture-of-Agents provider/model slots.zPUT /api/model/moa failedrh   zFailed to save MoA configri   )Úconfig)r¸   Úvalidate_moa_payloadÚdefault_presetÚactive_presetÚpresetsi¦  zInvalid MoA config: z; rm   r¹   Úprivacy_filterÚokTN)r   Ú
hermes_clirÍ   rº   r¸   rÎ   r   r4   Ú_CONFIG_LOCKrÑ   rÏ   rÐ   r¾   rÈ   r   Újoinr   r0   r.   r/   r&   ÚpopÚ_merge_partial_saver   )rË   r4   Ú
config_modr¸   rÎ   Úlegacy_flat_updater-   rÇ   ÚrawÚproblemsÚraw_cfgÚexisting_moaÚ
normalizedÚexisting_presetsÚexisting_defaultÚsynthesized_defaultÚexisting_activeÚupdatedÚmerged_presetss   &&                 r(   Úset_moa_modelsræ   /  s½  € ô 
Ð1°3Ð?Z×	[Ö	[Ý3ßTô   §¡× 7Ð 7°×8Õ8¸*×:Q×:QÓ:QØ%)§\¡\Ô!1Ðß%à$ d×&9Ñ&9Ø# T×%7Ñ%7ØÈtÏ|É|×OaÑOaÔOcÔdÑOc¹|¸t ¤l°6Ó&:Ò :ÑOcÒdð‘ô # 4Ó(�ñ ,¨CÓ0ˆHßÜ#°Ð<RÐUY×U^ÑU^Ð_gÓUhÕ<hÔiÐiô ;Ó<ˆGØ"Ÿ;™; uÓ-ˆLÜ˜,¬×-Ò-Ð2BÀlÔ2Rð )5Ð5EÕ(F�Ð$Ñ%Ù-¨cÓ2ˆJß!¤j°¼t×&DÒ&DØ#/×#3Ñ#3°IÓ#>Ð Ø#/×#3Ñ#3Ð4DÓ#EÐ ÜÐ.´×5Ò5Ü!Ð"2´C×8Ò8Ð=MÔ=að /9¯n©nÐ=MÓ.NÐ+ä&Ð':¼C×@Ò@Ø 3À)Õ7LÔ LàFPÐQZÕF[×F_ÑF_Ø 3óG˜J yÕ1Ð2BÑCð <LÐ'7Ñ8Ø&2×&6Ñ&6°Ó&G�OÜ! /´3×7Ò7¸OÐO_Ô<_Ø6E˜
 ?Ñ3Ø ×4Ñ4°W¸uÀjÐ>QÓRˆGß%ð ")¨¥°	Õ!:�à;EÀiÖ;Pó-Ù;P°4˜.¨Õ.Ò.Ñ;Pñ-�˜•˜yÑ)ô ˜Ô Ø˜$Ð- *Ð-÷{ ;RÑ:Q×8Ñ8÷ 
\Ò	[ùó  eùòf-÷s ;R×:Qú×8×8×8Ð8ú÷ 
\×	[×	[Ò	[úst   —6L!ÁL	Á"AK(Â2KÃ	 K(Ã*A6K(Å!DK(É4K(ÊK#Ê!K(Ê>
L	Ë
L!ËK(Ë(K8Ë3L	Ë;	L!ÌLÌL!Ì!L2	z/api/model/setc                óF   € V ^8„  d   QhR\         R\        \        ,          /# rÊ   )r   r   r&   )r'   s   "r(   r)   r)   y  s   € ÷ 2:ñ 2:¤_ð 2:¼xÌ½}ñ 2:r*   c              ƒ  óª  a aaaaa	a
aa"  € S P                   ;'       g    RP                  4       P                  4       S P                  ;'       g    RP                  4       P                  4       uooS P                  ;'       g    RP                  4       S P
                  ;'       g    RP                  4       uo	oS P                  ;'       g    RP                  4       S P                  ;'       g    RP                  4       uooSR9  d   \        RRR7      h\        RRRR7      ;_uu_ 4        \        4       pV'       d'   \        P                  R	V4       \        R
RV 2R7      hS'       db   S P                  '       gP    ^ RIHp \         P"                  ! VSS	SR7      G Rj  x€L
 pVe#   RRRSRS	RSRRRVP&                  /uuRRR4       # RS P(                  9   d   S P*                  M\,        o
VVV VVV	V
VV3	R lp\         P"                  ! V4      G Rj  x€L
 uuRRR4       #  Lƒ  \$         d    Rp L�i ; i L#  + '       g   i     R# ; i5i)uÈ   Assign a model to the main slot or an auxiliary task slot. Writes
``~/.hermes/config.yaml`` â€” applies to **new** sessions only; a running chat
PTY hot-swaps via the ``/model`` slash command instead.r   i�  z#scope must be 'main' or 'auxiliary'rm   zPOST /api/model/set failedrh   zFailed to save model assignmentri   zPOST /api/model/set refused: %srk   rl   )Úcombined_selection_warning)r   r9   NrÓ   FÚscoper   r   Úconfirm_requiredTÚconfirm_messager�   c                  ód  <	€ \        SP                  ;'       g    S4      ;_uu_ 4        SR 8X  d   \        \        4       SSSS4      MRp \        ;_uu_ 4        \        SSSS	SSSV R7      uuRRR4       uuRRR4       #   + '       g   i     M; i RRR4       R#   + '       g   i     R# ; i)r°   N)r�   Úprepared)r   r4   r   r   r   r	   )
rî   Úapi_keyr9   rË   r   r4   r   r�   rê   r›   s
    €€€€€€€€€r(   Ú_apply_assignmentÚ/set_model_assignment.<locals>._apply_assignmentž  s�   ø€ ô
   §¡× 7Ð 7°×8Õ8à$¨œô 5´[³]ÀHÈeÐU]Ð_fÔgØ48ð ç*Ö*Ü7Ø˜x¨°°hÀØ)9ÀHôN÷ +Ñ*÷ 9Ò8÷ +×*úÐ*÷ 9×8×8Ò8ús#   ©/BÁB 	Á+
BÂ BÂBÂB/	>   r°   r•   )rê   rŠ   r‹   r›   r   r   r9   rï   r   r   r
   rJ   rK   Úconfirm_expensive_modelÚ!hermes_cli.model_selection_guardsré   ÚasyncioÚ	to_threadrV   ÚmessageÚmodel_fields_setr�   r   )rË   r4   rx   ré   rK   rð   rï   r9   r   r   r�   rê   r›   s   ff    @@@@@@@r(   Úset_model_assignmentrø   x  sô  ÿøé € ð
 —:‘:×#Ð# ×*Ñ*Ó,×2Ñ2Ó4°t·y±y·°ÀB×6MÑ6MÓ6O×6UÑ6UÓ6W€K€Eˆ4Ø—}‘}×*Ð*¨×1Ñ1Ó3°d·j±j×6FÐ6FÀB×5MÑ5MÓ5O€O€HˆeØŸ™×,Ð,¨"×3Ñ3Ó5¸¿¹×8JÐ8JÈ×7QÑ7QÓ7SÐ€HˆgàÐ)Ô)Ü¨Ð4YÔZÐZä	Ð2°CÐ@a×	bÖ	bô .Ó/ˆßÜ�L‰LÐ:¸HÔEÜ¨CÐ:LÈXÈJÐ8WÔXÐX÷
 ˜×5×5Ð5ðÝXô !(× 1Ò 1Ð2LÈeÐ^fÐqyÔ z×z�ð Ò"Ø˜e W¨e°ZÀÈ7ÐTYØ*¨DÐ2CÀWÇ_Á_ðV÷+ 
cÒ	bð0 5GÈ$×J_ÑJ_Ô4_˜4×0Ò0ÔekÐ÷	Nõ 	Nô ×&Ò&Ð'8Ó9×9÷O 
cÒ	bñ" {øÜô Ø’ðúñ* :÷O 
c×	bÐ	büs’   ‹AIÁ3IÂ"IÂ'%IÃ"IÃ0=IÄ-A H?Å.H?Æ#H*Æ$H(Æ%H*Æ)H?ÇIÇA
H?ÈH=ÈH?ÈIÈ(H*È*H:È7H?È9H:È:H?È?I	É
	Ic                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r#   rU   )Ú__conditional_annotations__r/   )r'   s   "r(   r)   r)      s$   € ÷ ñ ÷Dò ”4ñ òEr*   )Úsupports_toolsÚsupports_visionÚsupports_reasoningÚcontext_windowÚmax_output_tokensÚmodel_familyr6   )NFFF)r   N)Úreference_temperatureÚaggregator_temperatureÚreference_timeoutÚdegraded_reference_policyÚfanoutÚenabled)>rú   Ú__doc__rô   Úconcurrent.futuresrB   ÚloggingÚtypingr   Úfastapir   r   Úhermes_cli.web_depsr   r   Úhermes_cli.web_server_configr   r   r	   r
   r   r   rA   r   Ústarlette.concurrencyr   Úhermes_cli.web_modelsr   r   r   Úhermes_cli.web_routers._commonr   r   r   Ú	getLoggerrJ   Úrouterr   r   r   r   r   rU   rX   r2   r7   rG   rM   r0   ra   ry   r€   r�   rµ   r»   rÆ   rÁ   rÈ   Úputræ   Úpostrø   r)   )rú   s   @r(   Ú<module>r     sß  øðöó Û Û Ý ç ,ç /÷÷ õ 3Ý 3ß QÑ Qß bÑ bà×ÒÐ0Ó1€Ù	‹€ñ Ð4Ð6VÓWÐ ÙÐ&Ð(HÓI€Ù�=Ð"5Ó6€Ù�=Ð"5Ó6€Ù'+Ð,RÐTgÓ'hÐ $ð ˆR�˜RÐ!6¸Ð;RÐTUØ  >°2ðÐ ó ð;Ð õ5õð !Ð õ"ð6 ‡�ÐÓö,'ó ð,'ð^ ‡�Ð Ó!ö>ó "ð>õ@,ð
 ‡�Ð,Ó-ö'Bó .ð'BðT ‡�Ð"Ó#ö1fó $ð1fðh ‡�ÐÓöYó ðYðÐ õCõ
ð ‡�ÐÓöE.ó ðE.ðP ‡�ÐÓö2:ó ò2:r*   