+
    „WÝjhW  ã                  óÊ   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHtHtHtHtHtHtHt R R ltR R	 ltR
 R ltR R ltR tR R ltR R ltR R ltR tR# )a8  Custom OpenAI-compatible endpoint wizards: the ad-hoc ``custom`` flow and the
``custom_providers`` / ``providers.<key>`` named-endpoint flow.

Imports of hermes_cli.main / auth / config / models stay lazy (main.py import cycle;
tests patch them at call time). Prompt strings and config write order are behavior.
)ÚannotationsN)Ú
line_input)Úcustom_provider_slug)Ú_HTTPÚ_askÚ_commit_model_configÚ_load_config_model_sectionÚ/_prune_replaced_custom_model_config_credentialsÚ
_radiolistÚ_sayc               ó   € V ^8„  d   QhRR/# )é   ÚtextÚstr© )Úformats   "ÚWC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\model_setup_flows_custom.pyÚ__annotate__r      s   € ÷ 	(ñ 	( ñ 	(ó    c                óæ   € V '       g   R#  \        V P                  RR4      P                  RR4      P                  RR4      4      pT^ 8”  d   T# R#   \         d    \        RT  R24        R# i ; i)	zT``128k`` / ``128,000`` -> int; None when blank, non-positive, or unparsable (warns).NÚ,Ú ÚkÚ000ÚKzInvalid context length: u    â€” will auto-detect.)ÚintÚreplaceÚ
ValueErrorÚprint)r   Úvalues   & r   Ú_parse_context_lengthr       sv   € çÙðÜ�D—L‘L  bÓ)×1Ñ1°#°uÓ=×EÑEÀcÈ5ÓQÓRˆð ˜A”Iˆ5Ð' 4Ð'øô ô ÜÐ(¨¨Ð.DÐEÔFÚðús   Œ;A ÁA0Á/A0c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú
model_namer   Úbase_urlÚapi_keyÚreturnÚNoner   )r   s   "r   r   r   !   s/   € ÷ Hñ H°ð HÀð HÈcð HÐVZñ Hr   c                óä   €  ^ RI HpHp ^ RIHp T! YT;'       g    RR7      pT'       d   Yc8w  d   \        RT! T4       R24       R# \        RT! T4       R	24       R#   \
         d     R# i ; i)
u  Tell the user what the auto-detect resolver found for *model_name* at *base_url* (#2513).

The runtime resolver (``get_model_context_length``) probes /models, local servers and the
catalogs, then falls back to ``DEFAULT_FALLBACK_CONTEXT``; without this line a blank
context-length prompt gave no hint whether the saved endpoint runs on a detected value or
the silent default that shapes compression and cache windows. Feedback only â€” the value
is NOT written to config, which would freeze a probe result into a permanent override.
)ÚDEFAULT_FALLBACK_CONTEXTÚget_model_context_length)Ú_format_context_lengthr   )r#   r$   Nz   Context length auto-detected: z tokensu5     Context length: not detected â€” using the default z= tokens (set model.context_length in config.yaml to override))Úagent.model_metadatar(   r)   Úhermes_cli.bannerr*   Ú	Exceptionr   )r"   r#   r$   r(   r)   r*   Údetecteds   &&&    r   Ú _report_context_length_detectionr/   !   s€   € ðß[Ý<Ù+¨JÐSZ×S`ÐS`Ð^`Ôaˆ÷ �HÔ8ÜÐ0Ñ1GÈÓ1QÐ0RÐRYÐZÖ[äÐEÑF\Ð]uÓFvÐEwð xFð Gö 	Høô ô Úðús   ‚A  œA  Á A/Á.A/c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úeffective_keyr   Úeffective_urlr%   ztuple[dict, str]r   )r   s   "r   r   r   7   s"   € ÷  ñ  ¨#ð  ¸cð  ÐFVñ  r   c           
     ó`  € ^ RI Hp V! W4      pVP                  R4      '       d:   VP                  R4      '       d#   \        RVR,           R24       VR,          pW13# VP                  R4      eG   \        RVP                  R4       R	\	        VP                  R4      ;'       g    . 4       R
24       W13# \        RVP                  R4       R24       VP                  R4      pV'       d)   VP                  R4      '       d   \        RV 24       W13# V'       d   \        RV 24       W13# )z�Verify a custom endpoint via ``probe_api_models`` and report; returns
``(probe, effective_url)`` where the URL may be the working fallback base.)Úprobe_api_modelsÚused_fallbackÚresolved_base_urlz)Warning: endpoint verification worked at zL/models, not the exact URL you entered. Saving the working base URL instead.ÚmodelszVerified endpoint via Ú
probed_urlú (z model(s) visible)z,Warning: could not verify this endpoint via z. Hermes will still save it.Úsuggested_base_urlú/v1z8  If this server expects /v1 in the path, try base URL: z-  If /v1 should not be in the base URL, try: )Úhermes_cli.modelsr4   Úgetr   ÚlenÚendswith)r1   r2   r4   ÚprobeÚ	suggesteds   &&   r   Ú_probe_custom_endpointrB   7   s;  € õ 3Ù˜]Ó:€EØ‡y�y�×!Ò! e§i¡iÐ0C×&DÒ&DÜÐ9¸%Ð@SÕ:TÐ9Uð VTð Uô 	VàÐ1Õ2ˆð ÐÐð 
�‰�8Ó	Ò	(ÜÐ& u§y¡y°Ó'>Ð&?¸rÄ#ÀeÇiÁiÐPXÓFY×F_ÐF_Ð]_ÓB`ÐAaÐasÐtÔuð ÐÐô 	Ð<¸U¿Y¹YÀ|Ó=TÐ<UÐUqÐrÔsØ—I‘IÐ2Ó3ˆ	ß˜×+Ñ+¨E×2Ò2ÜÐLÈYÈKÐXÔYð ÐÐ÷ ÜÐAÀ)ÀÐMÔNØÐÐr   c               ó    € V ^8„  d   QhRRRR/# )r   Údetected_modelsÚlistr%   r   r   )r   s   "r   r   r   L   s   € ÷ &ñ &¨$ð &°3ñ &r   c                ó˜  € Rp\        V 4      ^8X  dd   \        RV ^ ,           24       \        R4      P                  4       P	                  4       R	9   d
   V ^ ,          # \        V4      P                  4       # \        V 4      ^8”  d®   \        R4       \        V ^4       F  w  r#\        RV RV 24       K  	  \        R\        V 4       R24      P                  4       pVP                  4       '       d?   ^\        V4      u;8:  d   \        V 4      8:  d   M V# V \        V4      ^,
          ,          # V# \        V4      P                  4       # )
z£Model-name step of the custom flow: confirm a single detection, number-pick from
several, or type one. Raises KeyboardInterrupt/EOFError like the prompts it wraps.z&Model name (e.g. gpt-4, llama-3-70b): z  Detected model: z  Use this model? [Y/n]: z  Available models:z    ú. z  Select model [1-z] or type name: >   r   ÚyÚyes)	r>   r   ÚinputÚstripÚlowerr   Ú	enumerateÚisdigitr   )rD   ÚmanualÚiÚmÚpicks   &    r   Ú_pick_detected_modelrS   L   s   € ð 6€FÜ
ˆ?Ó˜qÔ ÜÐ" ?°1Õ#5Ð"6Ð7Ô8ÜÐ,Ó-×3Ñ3Ó5×;Ñ;Ó=ÐAQÔQØ" 1Õ%Ð%Ü˜&Ó!×'Ñ'Ó)Ð)Ü
ˆ?Ó˜aÔÜÐ#Ô$Ü˜o¨qÖ1‰DˆAÜ�D˜˜˜2˜a˜S�/Ö"ñ 2äÐ)¬#¨oÓ*>Ð)?Ð?OÐPÓQ×WÑWÓYˆØ�<‰<�>Š>˜a¤3 t£9ÖD´°OÓ0DÖDàˆð #¤3 t£9¨q¥=Õ1Ð1ØˆÜ�fÓ×#Ñ#Ó%Ð%r   c           
     ó
  aaa a!€ ^ RI HpHpHp ^ RIHpHp ^ RIHpH	pH
p ^ RIHp	 V! R4      ;'       g    Rp
V! R4      ;'       g    Rp\        R4       V
'       d   \        R	V
 24       V'       d   \        R
VR,           R24       \        4         \        RT
;'       g    R R24      P                  4       pT	! RV'       d   VR,          R,           MR R24      P                  4       pT'       g   T
'       g   \        R4       R# T;'       g    T
o!S!P%                  \&        4      '       g   \        RS! R24       R# T;'       g    TpS!P)                  R4      P+                  4       o\,        ;QJ d    T3R lR6 4       F  '       g   K   RM	  RM! T3R lR6 4       4      pT'       d‹   SP/                  R4      '       gt   \1        RRRRS!P)                  R4       R24       \3        RRRR R!7      P+                  4       R79   d'   S!P)                  R4      R,           o!\        R"S! 24       \        4        \5        TS!4      w  po!T P7                  R#4      p\9        T\:        4      '       d3   \=        TP7                  R$4      ;'       g    R4      P                  4       MRpT! S!TR%7      o\        S'       d   R&S 2MR'4        \?        TP7                  R(4      ;'       g    . 4      p\        R)4      P                  4       pT! S!4      p\        R*T R24      P                  4       ;'       g    Tp\A        T4      pTf   T'       d   \C        TS!T4       Ro T'       dx   \D        PF                  PI                  S!4      pTPJ                  ;'       g    RpTPL                  '       d   T R+TPL                   2pT! T4      o T! S T4       \        R,S  24       R- TT T!3R. llpT'       dJ   T! T4       \O        4       w  ppT! T4       \Q        T4       \;        T4      T R#&   \        R/T R0S! R124       MdT'       g	   T'       d   T! 4        T P7                  R#4      p\9        T\:        4      '       g   T'       d   R2T/M/ pT! T4       TT R#&   \        R34       T! S!TT;'       g    RTTSS R47       \S        S!TR57       R#   \         \"        3 d    \        R4        R# i ; i  \         \"        3 d    \        R4        R# i ; i)8z�Custom endpoint: collect URL, API key, and model name; also saved to ``custom_providers`` so
it appears in the provider menu on subsequent runs.)Ú_auto_provider_nameÚ!_prompt_custom_api_mode_selectionÚ_save_custom_provider)Ú_save_model_choiceÚdeactivate_provider)Úcustom_endpoint_key_envÚget_env_valueÚsave_env_value)Úmasked_secret_promptÚOPENAI_BASE_URLr   ÚOPENAI_API_KEYz0Custom OpenAI-compatible endpoint configuration:z  Current URL: z  Current key: :Né   Nz...zAPI base URL [ze.g. https://api.example.com/v1ú]: z	API key [Úoptionalú
Cancelled.NzNo URL provided. Cancelled.zInvalid URL: z& (must start with http:// or https://)Ú/c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5i©Nr   )Ú.0ÚhÚ
_url_lowers   & €r   Ú	<genexpr>Ú%_model_flow_custom.<locals>.<genexpr>„   s   øé € ÐrÑ0q¨1˜J–Ó0qùs   ƒTFr;   z+  Hint: Did you mean to add /v1 at the end?z@  Most local model servers (Ollama, vLLM, llama.cpp) require it.z  e.g. z  Add /v1? [Y/n]: Ún)ÚrawÚ
cancel_msgÚ	on_cancelz  Updated URL: ÚmodelÚapi_mode)Úcurrent_api_modez  API mode: z  API mode: auto-detectr7   z8Context length in tokens [leave blank for auto-detect]: zDisplay name [Ú_z  API key saved to .env as c               ó    € V ^8„  d   QhRRRR/# )r   rp   Údictr%   r&   r   )r   s   "r   r   Ú(_model_flow_custom.<locals>.__annotate__±   s   € ÷ (ñ (˜tð (¨ñ (r   c                óÈ   <€ R V R&   SV R&   V P                  RR4       V P                  RR4       S'       d
   RS R2V R&   S'       d   SV R	&   R# V P                  R	R4       R# )
ÚcustomÚproviderr#   Úkey_envNÚapi_key_envz${Ú}r$   rq   )Úpop)rp   rq   Úcustom_key_envr2   s   &€€€r   Ú_apply_endpointÚ+_model_flow_custom.<locals>._apply_endpoint±   se   ø€ Ø$ˆˆjÑØ)ˆˆjÑà�	‰	�)˜TÔ"Ø�	‰	�- Ô&ßØ!$ ^Ð$4°BÐ7ˆE�)ÑßØ (ˆE�*Óà�I‰I�j $Ö'r   zDefault model set to: z (via Ú)ÚdefaultzFEndpoint saved. Use `/model` in chat or `hermes model` to set a model.)Úcontext_lengthÚnamerq   rz   )Úprovider_name)Ú	localhostz	127.0.0.1z0.0.0.0z:11434z:8080z:5000>   r   rH   rI   )*Úhermes_cli.main_provider_setuprU   rV   rW   Úhermes_cli.authrX   rY   Úhermes_cli.configrZ   r[   r\   Úhermes_cli.secret_promptr]   r   r   rK   ÚKeyboardInterruptÚEOFErrorÚ
startswithr   ÚrstriprL   Úanyr?   r   r   rB   r=   Ú
isinstanceru   r   rS   r    r/   ÚurllibÚparseÚurlparseÚhostnameÚportr   r   r	   )"ÚconfigrU   rV   rW   rX   rY   rZ   r[   r\   r]   Úcurrent_urlÚcurrent_keyr#   r$   r1   Ú_looks_localr@   Úcurrent_model_cfgrr   r"   Úcontext_length_strÚdefault_nameÚdisplay_namerƒ   Ú_parsedÚ	_identityr   Úcfgrp   Ú_caller_modelri   rq   r~   r2   s"   &                             @@@@r   Ú_model_flow_customr¢   `   sr  û€ ÷ }Ñ|ßGßXÑXÝ=ÙÐ 1Ó2×8Ð8°b€KÙÐ 0Ó1×7Ð7°R€Kä	Ð
<Ô=ßÜ� ˜}Ð-Ô.ßÜ� ¨B¥Ð0°Ð4Ô5Ü	„GðÜ ¨{×/_Ð/_Ð>_Ð.`Ð`cÐdÓe×kÑkÓmˆÙ&¨Ïk°;¸rµ?ÀUÖ3JÐ_iÐ2jÐjmÐ'nÓo×uÑuÓwˆ÷
 ŸKÜÐ+Ô,ÙØ×+Ð+ €MØ×#Ñ#¤E×*Ò*Ü�˜m˜_Ð,RÐSÔTÙØ×*Ð*˜{€Mð ×%Ñ% cÓ*×0Ñ0Ó2€Jß“3ÔrÑ0qÓr—3—3’3ÔrÑ0qÓrÓr€Lß˜J×/Ñ/°×6Ò6ÜˆRÐ>ØOÐSZÐ[h×[oÑ[oÐpsÓ[tÐZuÐuxÐQyô	{äÐ$¨$¸4È3ÔO×UÑUÓWÐ[kÔkØ)×0Ñ0°Ó5¸Õ=ˆMÜ�O M ?Ð3Ô4ÜŒä1°-ÀÓOÑ€Eˆ=ð Ÿ
™
 7Ó+ÐÜOYÐZkÔmq×OrÒOr”sÐ,×0Ñ0°Ó<×BÐBÀÓC×IÑIÔKÐxzÐÙ0°ÐQaÔb€HÜ	§xˆL˜˜
Ñ
#Ð5NÔOðÜ)¨%¯)©)°HÓ*=×*CÐ*CÀÓDˆ
Ü'Ð(bÓc×iÑiÓkÐá*¨=Ó9ˆÜ! N°<°.ÀÐ"DÓE×KÑKÓM×]Ð]ÐQ]ˆô +Ð+=Ó>€NØÒ§*Ü(¨°]ÀMÔRð
 €NßÜ—,‘,×'Ñ'¨Ó6ˆØ×$Ñ$×*Ð*¨ˆ	Ø�<�<ˆ<Ø$˜+ Q w§|¡| nÐ5ˆIÙ0°Ó;ˆÙ�~ }Ô5ÜÐ+¨NÐ+;Ð<Ô=÷(ò (÷ Ù˜:Ô&Ü/Ó1‰
ˆˆUÙ˜ÔÜ˜SÔ!ô ˜u›+ˆˆw‰ÜÐ& z l°&¸¸ÀqÐIÕJç—wÙÔ!àŸ
™
 7Ó+ˆÜ˜-¬×.Ò.ß:G˜Y¨Ñ6ÈRˆMÙ˜Ô&Ø'ˆˆw‰ÜÐVÔWñ ˜-¨¸
×8HÐ8HÀbÐYgØ+°hÈõXä3°MÐQ]×^øôC œxÐ(ô ÜˆnÔÚðûôR œxÐ(ô ÜˆnÔÚðús=   ÂS  Â$"S  Ã'S  ËS# Ë$AS# Ì0S# Ó S ÓS Ó#TÔTc               ó   € V ^8„  d   QhRR/# )r   r%   z	list[str]r   )r   s   "r   r   r   Ø   s   € ÷ ñ ¨ñ r   c                ój  € \        V \        4      '       dI   RR0pV  Uu. uF7  q"V9  g   K  \        V4      P                  4       '       g   K,  \        V4      NK9  	  up# . p\        V \        4      '       d¸   V  F±  p\        V\        4      '       dM   \        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      P                  4       pM1\        V\        4      '       d   \        V4      P                  4       MRpV'       g   K   VP                  V4       K³  	  V# u upi )zUModel ids from a ``custom_providers[].models`` mapping or list (marker keys skipped).Ú__explicit_model_allowlist__Ú__discovered_model_catalog__Úidrp   r   )r�   ru   r   rK   rE   r=   Úappend)Ú
cfg_modelsÚmarkersrQ   ÚoutÚentryÚmodel_ids   &     r   Ú_configured_model_idsr®   Ø   sã   € ä�*œd×#Ò#Ø1Ð3QÐRˆÙ *ÓR¡
˜1°wÑ.>”Ä3ÀqÃ6Ç<Á<Ç>””�A–¡
ÑRÐRØ€CÜ�*œd×#Ò#ÛˆEÜ˜%¤×&Ò&Ü˜uŸy™y¨›×JÐJ°%·)±)¸GÓ2D×JÐJÈÓK×QÑQÓS‘ä1;¸EÄ3×1GÒ1Gœ3˜u›:×+Ñ+Ô-ÈR�ß‰xØ—
‘
˜8Ö$ñ  ð €Jùò Ss   ŸD0¬D0ÁD0c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úprovider_inforu   r$   r   Úconfigured_modelsrE   Úexplicit_catalogÚboolr   )r   s   "r   r   r   é   s*   € ÷ :(ñ :(°ð :(Àð :(ÐX\ð :(Ðptñ :(r   c                óD  a€ ^ RI Hp ^ RIHpHp ^ RIHpHpHp	 ^ RI	H
p
Hp V
! V P                  RR4      V R,          4      pT! Ve   TMT4      pV R,          V R	,          ríV P                  R
R4      pV P                  R4      ;'       g    RP                  4       p\        R4       RR/pV'       d   VVR
&   VP                  4       R8X  g$   VP                  4       P                  4       R8X  d   RMRpV! V P                  R4      4      ;'       g    / pV! WáR7      p\!        V4       FH  o\"        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   KE  VS KJ  	  VP%                  V4       \"        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      pV'       d=   V'       g5   \!        V4       F  oSP                  4       R8X  g   K  VS K  	  RV 2VR&   T	! TTT;'       g    RR7      pV'       d   T;'       g    RMT;'       g    RpRpV'       d<   V'       d   V'       d   TpM3V! VRVR7      pV. 8H  pVf   V! W! V4      3RV/VB pRpMV! W3RV/VB pV'       d   TMV'       d   . MT;'       g    TpV'       d^   \&        P(                  ! \*        4      ;_uu_ 4        ^ RIHpHp T! TTTT;'       g    RV! V RR4      ^,          R 7       RRR4       VV3# VV3#   + '       g   i     TT3# ; i)!z©Live catalog probe for a named custom endpoint (native ``/api/tags`` for Ollama).
Returns ``(models, native_catalog_empty)``; persists the live catalog as a side effect.)Únormalize_extra_headers)Úfetch_api_modelsÚ_get_ollama_native_headers)Úfetch_ollama_local_modelsÚ_normalize_openai_base_urlÚ should_use_ollama_native_catalog)Úbuild_command_token_providerÚmaterialize_probe_api_keyÚkey_cmdr   r„   Nr#   rq   Úprovider_keyzFetching available models...Útimeoutg       @Úollamarx   Úextra_headers)r$   c              3  óf   <"  € T F&  pSP                  4       VP                  4       8H  x € K(  	  R # 5irf   ©rL   )rg   ÚexistingÚkeys   & €r   rj   Ú0_discover_named_custom_models.<locals>.<genexpr>  s#   øé € ÐM¹}°8ˆs�y‰y‹{˜hŸn™nÓ.Ö.»}ùs   ƒ.1TFc              3  óF   "  € T F  qP                  4       R 8H  x € K  	  R# 5i)ÚauthorizationNrÃ   )rg   rÅ   s   & r   rj   rÆ     s   é € Ð"[É]Àc§9¡9£;°/Ö#AË]ùs   ‚!rÈ   zBearer ÚAuthorization)Úheaders)r¿   rÊ   rÊ   )Ú_entry_credentialsÚ!_save_discovered_models_to_configrz   r{   )rq   rÊ   Úcredential_identity)r‰   rµ   r<   r¶   r·   Úhermes_cli.models_localr¸   r¹   rº   Úagent.command_token_sourcer»   r¼   r=   rK   r   rL   Útupler�   ÚupdateÚ
contextlibÚsuppressr-   Ú!hermes_cli.model_switch_providersrË   rÌ   )r°   r$   r±   r²   rµ   r¶   r·   r¸   r¹   rº   r»   r¼   Úsourcer„   r#   rq   r¾   Úfetch_kwargsÚnative_catalog_providerrÁ   Úcandidate_headersÚcaller_has_authorizationÚ
use_nativeÚnative_headers_argÚnative_catalog_emptyÚlive_modelsr7   rË   rÌ   rÅ   s   &&&&                         @r   Ú_discover_named_custom_modelsrÞ   é   sú  ø€ õ :ßN÷ñ ÷ cÙ)¨-×*;Ñ*;¸IÀrÓ*JÈMÐZ`ÕLaÓb€FÙ'°&Ò2D©È'ÓR€GØ" 6Õ*¨M¸*Õ,Eˆ(Ø× Ñ  ¨RÓ0€HØ!×%Ñ% nÓ5×;Ð;¸×BÑBÓD€LÜ	Ð
(Ô)Ø˜sÐ#€LßØ#+ˆ�ZÑ Ø*6×*<Ñ*<Ó*>À(Ô*JÈdÏjÉjËl×N`ÑN`ÓNbÐfnÔNn™hÐt|ÐÙ+¨M×,=Ñ,=¸oÓ,NÓO×UÐUÐSU€MÙ2°8ÔMÐÜÐ&Ö'ˆß‹3ÔM¹}ÓM�3�3Š3ÔM¹}ÓM×MÔMØ! #Ò&ñ (ð ×Ñ˜]Ô+ß"›sÑ"[É]Ó"[ŸsŸsšsÑ"[É]Ó"[Ó[Ðß×/ÜÐ*Ö+ˆCØ�y‰y‹{˜oÖ-Ø% cÒ*ñ ,ð 07°w°iÐ-@Ð˜/Ñ*Ù1Ð2IÈ8Ð]n×]vÐ]vÐrvÔw€Jß6@Ð*×2Ð2¨døÀ}×G\ÐG\ÐX\ÐØ Ðßß× 1Ø+‰Ká3°HÀcÐSeÔfˆKØ#.°"Ñ#4Ð ØÒ"Ù.¨wÐ8RÐS[Ó8\ñ  JÐfxð  Jð  }Iñ  J�Ø',Ð$øá& wÑeÐBTÐeÐXdÑeˆß"2Ñ×>R¹ÐYd×YyÐYyÐhy€F÷ Ü× Ò ¤×+Õ+ßoÙ-Ø˜+°À-×BWÐBWÐSWÙ$6°}ÀiÐQ^Ó$_Ð`aÕ$bõd÷ ,ð
 Ð'Ð'Ð'ˆ6Ð'Ð'Ð'÷ ,Ö+ð
 Ð'Ð'Ð'ús   Ë/LÌL	c               ó$   € V ^8„  d   QhRRRRRR/# )r   r„   r   r7   rE   Úsaved_modelr   )r   s   "r   r   r   &  s!   € ÷ ñ  3ð °ð À3ñ r   c           	     óü  € V'       d   W!9   d   VP                  V4      M^ p\        R\        V4       R24       V Uu. uF  qDV8X  d   V R2MTNK  	  upR.,           p\        RV  R2WSRR7      pVe   \        4        M¥\	        V^4       F   w  rt\        R
T RT WB8X  d   RMR 24       K"  	  \        R
\        V4      ^,            R2R4        \        R\        V4      ^,            R24      P                  4       pV'       g   \        R4       R	# \        V4      ^,
          pV^ 8  g   V\        V4      8¼  d   \        R4       R	# W,          # u upi   \        \        \        3 d    \        R4        R	# i ; i)zVSearchable radiolist over *models* (numbered prompt without curses); None = cancelled.zFound z model(s):
z
 (current)ÚCancelzSelect model from Ú:T)Ú
searchableNz  rG   r   z. Cancelz
Choice [1-ra   z
Cancelled.rc   )Úindexr   r>   r
   rM   r   rJ   rK   r   r   r‹   rŒ   )	r„   r7   rà   Údefault_idxrQ   Ú
menu_itemsÚidxrP   Úvals	   &&&      r   Ú_pick_named_custom_modelrê   &  sf  € ç/:¸{Ô?T�&—,‘,˜{Ô+ÐZ[€KÜ	ˆF”3�v“;�-˜|Ð
,Ô-ÙGMÓNÁvÀ!¨;Ô&6�Q�C�zÑ"¸AÒ=ÁvÑNÐRZÐQ[Õ[€JÜ
Ð)¨$¨¨qÐ1°:ÐW[Ô
\€CØ
‚Ü�ä˜f aÖ(‰DˆAÜ�B�q�c˜˜A˜3¨qÔ/?™|ÀRÐHÐIÖJñ )äˆr”#�f“+ •/Ð" (Ð+¨RÔ0ð	Ü˜*¤S¨£[°1¥_Ð$5°SÐ9Ó:×@Ñ@ÓBˆCßÜ�lÔ#ÙÜ�c“(˜Q•,ˆCð ˆQ„w�#œ˜V›Ô$ÜˆlÔÙØ�;Ðùò) Oøô Ô-¬xÐ8ô 	Ü�.Ô!Úð	ús   ¾EÃA E ÄE Å!E;Å:E;c                ó.	  € ^ RI HpHpHp ^ RIHp ^ RIHpHp ^ RI	H
pHp	 VR,          p
VR,          pVP                  RR4      pVP                  R	R4      pVP                  R
R4      pVP                  RR4      pVP                  R4      ;'       g    RP                  4       pV'       g   V'       d   ^ RIHp V! VR4      pV! W4      pVP                  RR4      p\!        V\"        4      '       d   VP%                  4       R(9  pVP                  R/ 4      pV	! VV! V4      4      p\'        V4      p\)        RV
 2RV 24       V'       d   \+        RV 24       \+        4        RpV'       g0   T;'       g    V'       d   V.M. p\+        R\-        V4       24       M\/        WVV4      w  ppV'       d   \1        V
VV4      pVf   R# MnV'       d6   V'       g.   \+        R4       \3        RV R24      pVf   R# T;'       g    TpM1\+        R4       \3        R4      pVf   R# V'       g   \+        R4       R# V! V4       \5        4       w  ppVP7                  R
R4       VP7                  RR4       V'       d5   \9        V
V4      VR&   VP7                  RR4       VP7                  R	R4       MRVR&   V! W4      VR&   V'       d   VVR	&   V'       d   VVR&   MVP7                  RR4       \;        V4       V'       Edw   V! 4       pVP                  R 4      p\!        V\<        4      '       d   VP                  V4      MRp\!        V\<        4      '       Ed   VVR!&   \?        \#        VP                  R"R4      ;'       g    R4      P                  4       ;'       g4    \#        VP                  R	R4      ;'       g    R4      P                  4       4      pV'       dG   V'       d?   \#        VP                  R	R4      ;'       g    R4      P                  4       '       g   VVR	&   V'       d?   \#        VP                  R
R4      ;'       g    R4      P                  4       '       g   VVR
&   VVR &   V! V4       MV! VVVVR#7       \)        R$V 2R%V
 R&V R'24       R# ))zúNamed custom provider from ``custom_providers`` / ``providers.<key>``: probes the model
catalog (native ``/api/tags`` for endpoints conservatively identified as Ollama); a previously
saved model is pre-selected and is the fallback when probing fails.)Ú%_custom_provider_api_key_config_valueÚ&_custom_provider_base_url_config_valuerW   )rX   )Úload_configÚsave_config)Ú_entry_models_discoveredÚ_models_config_is_allowlistr„   r#   rq   r   r$   rz   rp   r¾   )Úget_secret_strÚdiscover_modelsTr7   z  Provider: z  URL:      z  Current:  Fz2Using configured models (discover_models: false): Nz%Could not fetch models from endpoint.zModel name [ra   z@Could not fetch models from endpoint. Enter model name manually.zModel name: zNo model specified. Cancelled.r{   ry   rx   Ú	providersÚdefault_modelÚapi_key_ref)rq   u   
âœ… Model set to: z   Provider: r9   r�   >   Ú0ÚnoÚfalse) r‡   rì   rí   rW   rˆ   rX   r‰   rî   rï   Úhermes_cli.model_switchrð   rñ   r=   rK   Úagent.secret_scoperò   r�   r   rL   r®   r   r   r>   rÞ   rê   r   r   r}   r   r   ru   r³   )r–   r°   rì   rí   rW   rX   rî   rï   rð   rñ   r„   r#   rq   r$   rz   rà   r¾   rò   Úconfig_api_keyÚdiscoverr©   r²   r±   rÜ   r7   r"   r    rp   Úproviders_cfgÚprovider_entryÚhad_inline_api_keys   &&                             r   Ú_model_flow_named_customr  A  s-  € ÷ Tñ  TÝ2ß:ß]Ø˜Õ €DØ˜ZÕ(€HØ× Ñ  ¨RÓ0€HØ×Ñ 	¨2Ó.€GØ×Ñ 	¨2Ó.€GØ×#Ñ# G¨RÓ0€KØ!×%Ñ% nÓ5×;Ð;¸×BÑBÓD€L÷ —wÝ5Ù  ¨"Ó-ˆá:¸=ÓR€Nð × Ñ Ð!2°DÓ9€HÜ�(œC× Ò Ø—>‘>Ó#Ð+?Ñ?ˆØ×"Ñ" 8¨RÓ0€JÙ2°:Ñ?WÐXeÓ?fÓgÐÜ-¨jÓ9Ðäˆ<˜�vÐ	 ,¨x¨jÐ 9Ô:ßÜ�˜[˜MÐ*Ô+Ü	„Gà Ðßà"×LÐL¿¨¡}ÈˆÜÐBÄ3ÀvÃ;À-ÐPÕQä'DÀ]Ð]nð  qAó  (BÑ$ˆÐ$çÜ-¨d°F¸KÓHˆ
ØÒÙð ç	×1ÜÐ5Ô6Ü˜L¨¨°SÐ9Ó:ˆ
ØÒÙØ×.Ð. ;‰
äÐPÔQÜ˜.Ó)ˆ
ØÒÙßÜÐ2Ô3Ùñ �zÔ"Ü+Ó-�J€Cˆð 
‡I�Iˆi˜ÔØ	‡I�Iˆm˜TÔ"ßÜ0°°|ÓDˆˆjÑØ�	‰	�*˜dÔ#Ø�	‰	�)˜TÕ"à$ˆˆjÑÙBÀ=Ó[ˆˆjÑßØ-ˆE�)ÑçØ$ˆˆjÒà�	‰	�*˜dÔ#Ü˜Ô÷ €|Ù‹mˆØŸ™ Ó,ˆÜ<FÀ}ÔVZ×<[Ò<[˜×*Ñ*¨<Ô8ÐaeˆÜ�n¤d×+Ó+Ø.8ˆN˜?Ñ+ô
 "&Ü�M×%Ñ% m°RÓ8×>Ð>¸BÓ?×EÑEÓG×~Ð~Ì3È}×O`ÑO`ÐajÐlnÓOo×OuÐOuÐsuÓKv×K|ÑK|ÓK~ó"Ð÷ "§n¼SÀ×ASÑASÐT]Ð_aÓAb×AhÐAhÐfhÓ=i×=oÑ=o×=qÒ=qØ,:�˜yÑ)ßœs >×#5Ñ#5°iÀÓ#D×#JÐ#JÈÓK×QÑQ×SÒSØ,3�˜yÑ)Ø,ˆC�ÑÙ˜Ôøñ 	˜h¨¸
ÈXÕVäÐ 
˜|Ð	,°¸d¸VÀ2ÀhÀZÈqÐ.QÖRr   )Ú__doc__Ú
__future__r   rÒ   ÚosÚurllib.parser‘   Úhermes_cli.cli_outputr   Úhermes_cli.providersr   Ú#hermes_cli.model_setup_flows_commonr   r   r   r   r	   r
   r   r    r/   rB   rS   r¢   r®   rÞ   rê   r  r   r   r   Ú<module>r	     sd   ðñõ #ã Û 	Û å ,Ý 5÷G÷ Gñ Gõ
	(õHõ, õ*&ò(u_õpõ":(õzô6sSr   