+
    „WÝjïê  ã                  ó~  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
HtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHt ^ RIHtHt ^ RIH t  ^ RI!H"t" R R	 lt#R
R/R R llt$R R lt%RIR lt&RIR lt'RIR lt(R R lt)R R lt*RJR lt+R R lt,RKR lt-RIR lt.RIRR/R llt/RIR lt0RKR lt1R  R! lt2R" R# lt3R$ R% lt4RIR& lt5RIR' lt6RIR( lt7RIR) lt8RIR* lt9R+ R, lt:RLt;R- R. lt<R/ t=R0 t>R1 t?R2]=R3]>R4]?/t@R5 R6 ltARIR7 ltBR8 R9 ltCRIR: ltDR; R< ltER= R> ltFR? R@ ltGRA]FRB]GRC]G/tHRD RE ltIRF RG ltJRIRH ltKR# )Ma¦  Per-provider model-selection wizard flows for ``hermes setup`` / ``hermes model``.

main / config / auth / models helpers are imported lazily inside bodies: avoids the main.py import
cycle and lets tests patch ``hermes_cli.config.load_config`` etc. at call time. The shared skeleton
lives in :mod:`hermes_cli.model_setup_flows_common`; the custom / Azure / Bedrock flows live in their
own ``model_setup_flows_*`` modules.
)ÚannotationsN)Ú clear_model_endpoint_credentials)Ú_HTTPÚ_activate_provider_modelÚ_askÚ_commit_model_configÚ_curses_choiceÚ_ensure_dict_sectionÚ_ensure_flow_api_keyÚ_finish_modelÚ_load_config_model_sectionÚ_models_dev_mergedÚ_oauth_gateÚ_persist_modelÚ_pick_model_or_promptÚ_print_numberedÚ_prompt_auth_credentials_choiceÚ_note_setup_failureÚ
_run_loginÚ_sayÚ_show_curated)Ú_model_flow_customÚ_model_flow_named_custom)Ú_model_flow_azure_foundry)Ú_model_flow_bedrockc               ó    € V ^8„  d   QhRRRR/# )é   Úbase_url_envÚstrÚreturn© )Úformats   "ÚPC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\model_setup_flows.pyÚ__annotate__r#      s   € ÷ Fñ F ð F¨ñ Fó    c                óp   € ^ RI Hp V '       g   R# V! V 4      ;'       g    \        P                  ! V R4      # )zMBase-URL override from ``.env`` then the process environment ('' when unset).©Úget_env_valueÚ )Úhermes_cli.configr'   ÚosÚgetenv)r   r'   s   & r"   Ú_env_base_urlr,      s)   € å/ßÙÙ˜Ó&×EÐE¬"¯)ª)°LÀ"Ó*EÐEr$   Úpersist_envTc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úeffective_baser   r   r-   Úboolr   r    )r!   s   "r"   r#   r#   #   s*   € ÷ ñ ¨cð Àð ÐVZð Ðfiñ r$   c               óÊ   € ^ RI Hp \        RV  R2RRR7      pV'       dC   V'       d;   VP                  \        4      '       g   \        R4       V # V'       d	   V! W4       V# V # )zPOptional ``Base URL [...]`` prompt; a valid override is saved to *base_url_env*.©Úsave_env_valuez
Base URL [ú]: r(   )Ú
cancel_msgÚ	on_cancelõM     Invalid URL â€” must start with http:// or https://. Keeping current value.)r)   r3   r   Ú
startswithr   Úprint)r/   r   r-   r3   Úoverrides   &&$  r"   Ú_prompt_base_url_overrider;   #   s\   € å0Ü�j Ð 0°Ð4ÀÈrÔR€Hß—LØ×"Ñ"¤5×)Ò)ÜÐaÔbð
 Ð÷ Ù˜|Ô6ØˆOØÐr$   c               ó    € V ^8„  d   QhRRRR/# )r   Úsourcer   r   ÚNoner    )r!   s   "r"   r#   r#   1   s   € ÷ Cñ C¨Cð C°Dñ Cr$   c                óN   € V '       d   \        R \        V 4       RV 24       R# R# )ú  Found ú model(s) from N)r9   Úlen)Ú
model_listr=   s   &&r"   Ú_report_live_modelsrD   1   s$   € ßÜ�œ˜Z›Ð)¨¸¸ÐAÖBñ r$   c           	     ó  € ^ RI Hp ^ RIHpHp V! RRRRR7      p\        RVRR7      w  rgpV'       d   R# ^ R	IHp	 ^ R
IH	p
 V	! RR7      pV
! RRR7      pT! Y±TRY';'       g    TR7      p\        VRRV R2VRR7       R# )z5OpenRouter provider: ensure API key, then pick model.)ÚOPENROUTER_BASE_URL)ÚProviderConfigÚ_prompt_model_selectionÚ
openrouterÚ
OpenRouterÚapi_key)ÚidÚnameÚ	auth_typeÚapi_key_env_vars)Úmissing_hintN)Ú	model_ids©Úget_pricing_for_providerT©Úforce_refresh©Úcurrent_modelÚpricingÚconfirm_providerÚconfirm_base_urlÚconfirm_api_keyúDefault model set to: z (via OpenRouter)Úchat_completions©Úbase_urlÚapi_mode)ÚOPENROUTER_API_KEY)z&Get one at: https://openrouter.ai/keysr(   )Úhermes_constantsrF   Úhermes_cli.authrG   rH   r
   Úhermes_cli.modelsrQ   Úhermes_cli.models_pricingrS   r   )ÚconfigrW   rF   rG   rH   ÚpconfigÚexisting_keyÚ	_resolvedÚabortrQ   rS   Úopenrouter_modelsrX   Úselecteds   &&            r"   Ú_model_flow_openrouterrm   6   s–   € å4ßGñ  °<È9Ðg~Ô€GÜ%9Ø�gÐ,Zô&\Ñ"€L˜UçÙå+ÝBÙ!°Ô5Ðá& |À4ÔH€GÙ&ØÀÐZfØ,×>WÐ>WÈ<ôY€Hô �(˜LÐ,BÀ8À*ÐL]Ð*^Ø.Ð9K÷Mr$   c           	     óB  € ^ RI Hp ^ RIHp ^ RIHpHp ^ RIHp VR,          pV! R4      ;'       g    RpV'       g   \        RR	R4       V! WxRR
7      w  ršV
'       d   R# ^ RI
Hp ^ RIHp V! RR7      pV! RRR7      pV! WÑVR7      p\        VRRV R2VRRR7       R# )zIVercel AI Gateway provider: ensure API key, then pick model with pricing.)ÚAI_GATEWAY_BASE_URL)Ú_prompt_api_key)ÚPROVIDER_REGISTRYrH   r&   z
ai-gatewayÚAI_GATEWAY_API_KEYr(   z^Create API key here: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai-gateway&title=AI+Gatewayz/Add a payment method to get $5 in free credits.)Úprovider_idN)Úai_gateway_model_idsrR   TrT   )rW   rX   r\   z (via Vercel AI Gateway)r]   F)r_   r`   Úclear_creds)rb   ro   Úhermes_cli.main_provider_setuprp   rc   rq   rH   r)   r'   r   rd   rt   re   rS   r   )rf   rW   ro   rp   rq   rH   r'   rg   rh   ri   rj   rt   rS   Úmodels_listrX   rl   s   &&              r"   Ú_model_flow_ai_gatewayrx   N   s    € å4Ý>ßJÝ/Ø Õ-€GÙ Ð!5Ó6×<Ð<¸"€LßÜÐmØ>Àô	Dá& wÈ,ÔWÑ€IßÙå6ÝBÙ&°TÔ:€KÙ& |À4ÔH€GÙ& {ÐY`Ôa€Hä�(˜LÐ,BÀ8À*ÐLdÐ*eØ.Ð9KÐY^÷`r$   c                óv  € ^ RI Hp ^ RIHp T! \	        V \
        4      '       d   V P                  R4      M/ 4      pVP                  R4      ;'       g    / pV'       g   \        R4       R# \        VP                  4       4      pVP                  R4      ;'       g
    V^ ,          p. pV F£  p	WY,          P                  R4      ;'       g    / p
V
'       d&   V
P                  R	4       R
V
P                  R4       2MRp\        WY,          P                  R4      ;'       g    . 4      pW—8X  d   RMRpVP                  V	 RV RV RV 24       K¥  	  Wv9   d   VP                  V4      M^ pRp\        WøV4      pVfo   \        WøV4       \        R\        V4       R2RRR7      pVf   R#  V'       g   TM5\!        ^ \#        \        V4      ^,
          \%        V4      ^,
          4      4      pV^ 8  d   \        R4       R# VV,          p\)        4       w  ppVVR&   RVR	&   \+        VRR7       VP-                  RR4       \/        V4       V! V4       VV,          p\1        RRV R2RV 2R4       \3        VP                  R4      ;'       g    . ^R7       F8  w  pp\        R V R!VP                  R	4       R
VP                  R4       24       K:  	  VP                  R4      ;'       g    / p
\        R"V
P                  R	4       R
V
P                  R4       R#24       R#   \&         d    \        R4        R# i ; i)$u»   Mixture of Agents virtual provider: pick a preset (list always shown, even with one entry),
persist it, print the breakdown. No credential step â€” presets reference configured providers.)Ú_save_model_choice)Únormalize_moa_configÚmoaÚpresetszCNo MoA presets configured. Run `hermes moa configure <name>` first.NÚdefault_presetÚ
aggregatorÚproviderÚ:Úmodelr(   Úreference_modelsu     â†� defaultz  (acting: z, z refs)z"Select a Mixture of Agents preset:z  Choice [1-r4   Tú
No change.©Úrawr5   Údefault)Úclear_api_moder_   r\   z (via Mixture of Agents)z
  Preset: z/  Reference models (advise once per user turn):)Ústartz    z. z  Aggregator:  uG     (acting model â€” runs every step and carries almost all of the cost))rc   rz   Úhermes_cli.moa_configr{   Ú
isinstanceÚdictÚgetr9   ÚlistÚkeysrB   ÚappendÚindexr   r   r   ÚmaxÚminÚintÚ
ValueErrorr   r   Úpopr   r   Ú	enumerate)rf   rW   rz   r{   r|   r}   ÚnamesÚdefault_nameÚrowsÚnÚaggÚ	agg_labelÚ	ref_countÚsuffixÚdefault_idxÚtitleÚidxr†   Úselected_nameÚcfgr‚   ÚpresetÚiÚslots   &&                      r"   Ú_model_flow_moar¨   g   sö  € õ 3Ý:Ù
´J¸vÄt×4LÒ4L˜vŸz™z¨%Ô0ÐRTÓ
U€CØ�g‰g�iÓ ×&Ð& B€GßÜÐSÔTÙä�—‘“Ó €EØ—7‘7Ð+Ó,×8Ð8°°aµ€Là€DÛˆØ�j�n‰n˜\Ó*×0Ð0¨bˆßCF�s—w‘w˜zÓ*Ð+¨1¨S¯W©W°WÓ-=Ð,>Ñ?ÈBˆ	Ü˜�
Ÿ™Ð'9Ó:×@Ð@¸bÓAˆ	Ø$%Ô$5‘¸2ˆØ�‰�q�c˜ Y K¨r°)°¸FÀ6À(ÐKÖLñ ð 0<Ô/D�%—+‘+˜lÔ+È!€Kà0€EÜ
˜ kÓ
2€CØ
‚{Ü˜ [Ô1Ü�\¤# d£) ¨CÐ0°dÀ|ÔTˆØŠ;Ùð	ß%(‘+¬c°!´S¼¸T»ÀQ½ÌÈCËÐSTÍÓ5UÓ.VˆCð ˆQ„wÜˆlÔÙà˜#•J€MÜ+Ó-�J€CˆØ$€Eˆ)ÑØ€Eˆ*Ñô % U¸4Õ@Ø	‡I�Iˆj˜$ÔÜ˜ÔÙ�}Ô%à�]Õ#€FÜØ
Ø
   Ð/GÐHØ
�]�OÐ$Ø9ô	ô ˜VŸZ™ZÐ(:Ó;×AÐA¸rÈ×K‰ˆˆ4Ü��Q�C�r˜$Ÿ(™( :Ó.Ð/¨q°·±¸'Ó1BÐ0CÐDÖEñ Là
�*‰*�\Ó
"×
(Ð
( b€CÜ	Ø
˜#Ÿ'™' *Ó-Ð.¨a°·±¸Ó0@Ð/Að  BIð  	Jöøô9 ô 	Ü�,ÔÚð	ús   Æ+L Æ38L ÌL8Ì7L8c               ó   € V ^8„  d   QhRR/# )r   r   zargparse.Namespacer    )r!   s   "r"   r#   r#   ¨   s   € ÷ eñ eÐ0ñ er$   c                ó&  € \         P                  ! \        V R R4      \        V RR4      \        V RR4      \        V RR4      \        \        V RR4      4      \        V RR4      ;'       g    R\        V R	R4      \        \        V R
R4      4      R7      # )Ú
portal_urlNÚinference_urlÚ	client_idÚscopeÚ
no_browserFÚtimeoutç      .@Ú	ca_bundleÚinsecure)r«   r¬   r­   r®   r¯   r°   r²   r³   )ÚargparseÚ	NamespaceÚgetattrr0   )Úargss   &r"   Ú_nous_login_argsr¸   ¨   s�   € Ü×ÒÜ˜4 ¨tÓ4ÄGÈDÐRaÐcgÓDhÜ˜$ ¨TÓ2¼'À$ÈÐQUÓ:VÜœ  l°EÓ:Ó;ÄWÈTÐS\Ð^bÓEc×EkÐEkÐgkÜ˜$ ¨TÓ2¼TÄ'È$ÐPZÐ\aÓBbÓ=cô	eð er$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Ú	free_tierr0   r«   r   rQ   rŽ   rX   rŒ   r    )r!   s   "r"   r#   r#   °   s/   € ÷ .Yñ .Y 4ð .Y°Sð .YÀTð .YÐTXñ .Yr$   c                ób  € ^ RI HpHp ^ RIHpHpHpHp	 . p
RpV! 4       pV '       d3    ^ RIH	pH
p V! RR7      pV! VRR7      ;'       g    RpV! W#V4      w  r#MV	! W#V4      w  r#V! W#4      pTpV! W,RR	7      pVV8g  pV '       d   V! W#RR
7      w  r*V'       g!   V
'       g   \        R4       \        R4       R# V '       dX   V'       gP   \        R4       V
'       d;   ^ RIHp T;'       g    TP!                  R4      p\        T;'       g    RV R24       R# W#W«V3#   \         d    Rp Lßi ; i)z¼Free/paid-tier catalog for the Nous picker: ``(model_ids, pricing, unavailable_models,
unavailable_message, policy_narrowed)`` or None (message already printed) when nothing is selectable.)Únous_policy_allowed_idsÚrestrict_to_nous_policy)Úpartition_nous_models_by_tierÚunion_with_nous_on_sale_modelsÚ&union_with_portal_free_recommendationsÚ&union_with_portal_paid_recommendationsr(   )Ú&format_nous_portal_entitlement_messageÚget_nous_portal_account_infoT©Úforce_freshzpaid Nous models)Ú
capability)Úrescue_empty)rº   z4No models available for Nous Portal after filtering.Ú	no_modelsNz#No free models currently available.)ÚDEFAULT_NOUS_PORTAL_URLÚ/zUpgrade at z to access paid models.)re   r¼   r½   rd   r¾   r¿   rÀ   rÁ   Úhermes_cli.nous_accountrÂ   rÃ   Ú	Exceptionr9   r   rc   rÉ   Úrstrip)rº   r«   rQ   rX   r¼   r½   r¾   r¿   rÀ   rÁ   Úunavailable_modelsÚunavailable_messageÚ_policy_allowedrÂ   rÃ   Ú_account_infoÚ_before_policyÚ_policy_narrowedrÉ   Ú_urls   &&&&                r"   Ú_nous_model_catalogrÕ   °   s>  € ÷ [÷ó ð %'ÐØÐÙ-Ó/€Oßð	%ßtÙ8ÀTÔJˆMÙ"HÈÐcuÔ"v×"|Ð"|Ðz|Ðñ DÀIÐXbÓcÑˆ	�7áCÀIÐXbÓcÑˆ	Ù2°9ÓFˆ	Ø€NÙ'¨	ÐQUÔV€IØ  NÑ2ÐßÙ(EÀiÐdhÔ(iÑ%ˆ	ç×/ÜÐDÔEÜ˜KÔ(ÙßŸÜÐ3Ô4ßÝ?Ø×9Ð9Ð"9×AÑAÀ#ÓFˆDÜÐ%×TÐT¨;°t°fÐ<SÐ)TÔUÙØÐ1ÐHXÐXÐXøô/ ô 	%Ø"$Òð	%ús   ©!D ÁD ÄD.Ä-D.c                óê  € ^ RI HpHpHpHpHp  V! 4       #   \         dÑ   p\        Ya4      ;'       d    TP                  p\        Ya4      '       d	   T! T4      M
\        T4      pT'       db   \        RT 2R4        T! \        R4      TR,          4       M&  \         d   p	\        RT	 24        Rp	?	MRp	?	ii ; i\        R4        Rp?R# \        RT 24       \        R4        Rp?R# Rp?ii ; i)	zuResolve Nous runtime credentials; on failure print the diagnosis (re-login when the
session expired) and return None.)Ú	AuthErrorrq   Ú_login_nousÚformat_auth_errorÚ resolve_nous_runtime_credentialszSession expired: z&Re-authenticating with Nous Portal...
NÚnouszRe-login failed: ÚauthzCould not verify credentials: )rc   r×   rq   rØ   rÙ   rÚ   rÌ   r‹   Úrelogin_requiredr   r   r¸   r9   r   )
Úcreds_or_noner×   rq   rØ   rÙ   rÚ   ÚexcÚreloginÚmsgÚ	login_excs
   &         r"   Ú_nous_verified_credentialsrã   á   sÙ   € ÷hõ hðÙ/Ó1Ð1øÜô Ü˜SÓ,×EÐE°×1EÑ1EˆÜ(2°3×(BÒ(BÑ Ô$ÌÈCËˆßÜÐ$ S EÐ*Ð,UÔVð7ÙÔ,¨TÓ2Ð4EÀfÕ4MÕNøÜô 7ÜÐ)¨)¨Ð5×6Ñ6ûð7úä Ô'ÝÜÐ.¨s¨eÐ4Ô5Ü˜FÔ#ÝûðúsK   � —C2¢A
C-Á-C-Á=BÂC-ÂB:Â"B5Â0C-Â5B:Â:C-ÃC-Ã-C2c               ó$   € V ^8„  d   QhRRRRRR/# )r   rl   r   ÚcredsrŒ   r   r    )r!   s   "r"   r#   r#   ù   s!   € ÷ ñ  cð °$ð ¸4ñ r$   c                ót  € ^ RI HpHp ^ RIHpHpHpHp V! V 4       VP                  RR4      pV! RV4       V! 4       p	V	P                  R4      p
\        V
\        4      '       d   \        V
4      pMA\        V
\        4      '       d*   V
P                  4       '       d   RV
P                  4       /pM/ pRVR&   WR&   V'       d,   VP                  4       '       d   VP                  R	4      VR&   MVP                  RR
4       \        V4       W¹R&   V! R4      '       d   V! RR4       V! RR4       V! V	4       V	# )zäNous persist step: model choice + provider state, then rewrite ``model`` on a fresh
config (the caller's may carry stale custom-provider fields) and clear a conflicting
OPENAI_BASE_URL / OPENAI_API_KEY. Returns the saved config.)rz   Ú_update_config_for_provider)r'   Úload_configÚsave_configr3   r_   r(   rÛ   r‚   r‡   r€   rÊ   NÚOPENAI_BASE_URLÚOPENAI_API_KEY)rc   rz   rç   r)   r'   rè   ré   r3   r�   r‹   rŒ   r   ÚstriprÍ   r–   r   )rl   rå   rz   rç   r'   rè   ré   r3   r¬   rf   Úcurrent_model_cfgÚ	model_cfgs   &&          r"   Ú_nous_persist_selectionrï   ù   s  € ÷ PßYÓYÙ�xÔ Ø—I‘I˜j¨"Ó-€MÙ ¨Ô6Ù‹]€FØŸ
™
 7Ó+ÐÜÐ#¤T×*Ò*ÜÐ*Ó+‰	Ü	Ð%¤s×	+Ò	+Ð0A×0GÑ0G×0IÒ0IØÐ 1× 7Ñ 7Ó 9Ð:‰	àˆ	Ø"€IˆjÑØ#ˆiÑß˜×,Ñ,×.Ò.Ø -× 4Ñ 4°SÓ 9ˆ	�*Òà�‰�j $Ô'Ü$ YÔ/Øˆ7�OÙÐ&×'Ò'ÙÐ(¨"Ô-ÙÐ'¨Ô,Ù�ÔØ€Mr$   c                ó
  aaa € ^ RI HpHpHoHp ^ RIHo ^ RIHo  V! R4      p^ RI	H
p V'       d/   VP                  R4      '       d   VP                  V4      '       d4   \        RR4       VVV 3R	 lp\        V\        V4      VR,          4       R
# ^ RIHp	Hp
 ^ RIHp V
! 4       pV'       g   \+        R4       R
# \-        4       pVf   R
# V! R4      pV	! RR7      pV'       g   ^ RI Hp  V! RR7      ;'       g    TpRp\2        P4                  ! \0        4      ;_uu_ 4        V! R4      ;'       g    / P                  RR4      pR
R
R
4       \7        VVWÎ4      pVf   R
# Tw  rÎppp^ RIHp V! VR7      pV'       d   \+        V4       ^ RIHpH p V! RR7      pVe   V! VVPB                  4      p\+        R\E        V4       R24       V! WÁVVVVRVP                  RR4      VP                  RR4      VR7
      pV'       g   \+        R4       R
# \G        VV4      p \+        RV R24       Ve&   ^ RIH$p V! VR4      ;p'       d   \+        R V 24       S ! V 4       R
#   \0         d     ELmi ; i  + '       g   i     EL3; i)!z8Nous Portal provider: ensure logged in, then pick model.)Úget_provider_auth_staterH   rØ   rq   )rè   )Úprompt_enable_tool_gatewayrÛ   )Ú	anon_authÚaccess_tokenz.Not logged into Nous Portal. Starting login...r(   c                óÄ   <€ S! W4       \         P                  ! \        4      ;_uu_ 4        S! S! 4       ;'       g    / 4       R R R 4       R #   + '       g   i     R # ; i©N)Ú
contextlibÚsuppressrÌ   )Ú
login_argsrg   rØ   rè   rò   s   &&€€€r"   Ú_login_then_offer_gatewayÚ3_model_flow_nous.<locals>._login_then_offer_gateway$  s=   ø€ Ù˜
Ô,ä×$Ò$¤Y×/Õ/Ù*©;«=×+>Ð+>¸BÔ?÷ 0×/×/Ò/ús   ¬AÁA	N)Úcheck_nous_free_tierÚget_curated_nous_model_idsrR   z,No curated models available for Nous Portal.TrÄ   )rÚ   rT   Úportal_base_url)Únous_policy_notice)Úremoved)Úfeatured_firstÚnous_picker_usage)ÚwarmzShowing u=    curated models â€” use "Enter custom model name" for others.r_   rK   )	rW   rX   rÎ   r«   rÏ   rY   rZ   r[   Úusager„   r\   z (via Nous Portal))Úlarge_model_noticeu   âš  )%rc   rñ   rH   rØ   rq   r)   rè   Úhermes_cli.nous_subscriptionrò   Ú
hermes_cliró   r�   Úguest_without_free_tierr   r   r¸   rd   rü   rý   re   rS   r9   rã   rÚ   rÌ   r÷   rø   rÕ   rË   rÿ   Úhermes_cli.model_picker_usager  r  Úfeatured_model_idsrB   rï   r  )!rf   rW   r·   rñ   rH   rq   Ústateró   rú   rü   rý   rS   rQ   rå   rX   rº   rÚ   Ú_nous_portal_urlÚcatalogrÎ   rÏ   rÓ   rÿ   Ú_policy_noticer  r  Ú_usagerl   r  Ú_noticerØ   rè   rò   s!   &&&                           @@@r"   Ú_model_flow_nousr    sL  ú€ çpÓpÝ-ÝGÙ# FÓ+€EÝ$ç˜Ÿ	™	 .×1Ò1°Y×5VÑ5VÐW\×5]Ò5]ÜÐ=¸rÔB÷	@ô 	Ð,Ô.>¸tÓ.DÐFWÐX^ÕF_Ô`Ù÷ SÝBÙ*Ó,€IßÜÐ<Ô=Ùô 'Ó(€EØ‚}Ùá& vÓ.€Gá$°Ô6€IßÝDð	Ù4À4ÔH×QÐQÈEˆEð ÐÜ	×	Ò	œY×	'Õ	'Ù3°FÓ;×AÐA¸r×FÑFÐGXÐZ\Ó]Ð÷ 
(ô " )Ð-=¸yÓR€GØ‚ÙØT[ÑQ€IÐ*Ð,?ÐAQå:Ù'Ð0@ÔA€NßÜˆnÔßOÙ DÔ)€FàÒÙ" 9¨f×.GÑ.GÓHˆ	Ü	ˆH”S˜“^Ð$Ð$aÐ
bÔcá&Ø¸ÐTfØ#Ð9LÐ_eØŸ™ :¨rÓ2ÀEÇIÁIÈiÐY[ÓD\Øô	€H÷
 ÜˆlÔÙÜ$ X¨uÓ5€FÜ	Ð" 8 *Ð,>Ð
?Ô@ØÒÝDÙ(¨°6Ó:Ð:ˆ7Ö:Ü�D˜˜	Ð"Ô#á˜vÖ&øôQ ô 	âð	ú÷ 
(×	'Ð	'ús$   Ã-I Ã=I Ä$#I1ÉI.É-I.É1J	c           	     ó6  a€ ^ RI HoHpHpHpHp ^ RIHp \        \        S! 4       P                  R4      4      RV\        P                  ! 4       VR,          V3R lR7      '       g   R# R;rx\        P                  ! \        4      ;_uu_ 4        S! 4       p	V	P                  R4      '       d"   V	P                  R	4      V	P                  R
4      r‡RRR4       V'       gZ   \        P                  ! \        4      ;_uu_ 4        ^ RI Hp
 V
! 4       pVP                  R	4      VP                  R
4      r‡RRR4       V! WxR7      pT! YÁRT;'       g    TT;'       g    RR7      p\#        VRVRV R24       R#   + '       g   i     L®; i  + '       g   i     L`; i)z9OpenAI Codex provider: ensure logged in, then pick model.)Úget_codex_auth_statusrH   Ú_login_openai_codexrq   ÚDEFAULT_CODEX_BASE_URL)Úget_codex_model_idsÚ	logged_inzOpenAI Codexzopenai-codexc                 ó0   <€ S ! 4       P                  R 4      # )r  )r�   )r  s   €r"   Ú<lambda>Ú*_model_flow_openai_codex.<locals>.<lambda>v  s   ø€ Ñ;PÓ;R×;VÑ;VÐWbÔ;cr$   )ÚrecheckNrK   r_   )Ú!resolve_codex_runtime_credentials)rô   r_   r(   ©rW   rY   rZ   r[   r\   z (via OpenAI Codex))rc   r  rH   r  rq   r  Úhermes_cli.codex_modelsr  r   r0   r�   r´   rµ   r÷   rø   rÌ   r  r   )rf   rW   rH   r  rq   r  r  Ú_codex_tokenÚ_codex_baseÚ_codex_statusr  Ú_credsÚcodex_modelsrl   r  s   &&            @r"   Ú_model_flow_openai_codexr$  n  sT  ø€ ÷õ õ <ÜÜÑ"Ó$×(Ñ(¨Ó5Ó6¸ÐH[Ô]e×]oÒ]oÓ]qØ˜.Õ)Ô3c÷eó eñ 	ð "&Ð%€LÜ	×	Ò	œY×	'Õ	'Ù-Ó/ˆØ×Ñ˜[×)Ò)Ø(5×(9Ñ(9¸)Ó(DÀm×FWÑFWÐXbÓFc˜+÷ 
(÷ Ü× Ò ¤×+Õ+ÝIÙ6Ó8ˆFØ(.¯
©
°9Ó(=¸v¿z¹zÈ*Ó?U˜+÷ ,ñ
 '°LÔW€LÙ&ØÀNØ$×>Ð>Ð(>ÐP\×PbÐPbÐ`bôd€Hô ˜X ~Ð7MØ5°h°ZÐ?RÐSöU÷ 
(×	'ú÷
 ,×+ús   ÂA E5Ä/FÅ5F	ÆF	r·   c          	     ó¦  € ^ RI HpHpHpHpHpHp ^ RIHp	 \        P                  ! \        \        VRR4      4      \        VRR4      R7      p
\        \        V! 4       P                  R4      4      R	VW¨R
,          RR7      '       g   R# Tp\        P                   ! \"        4      ;_uu_ 4        V! 4       pVP                  R4      ;'       g    RP%                  4       P'                  R4      ;'       g    TpRRR4       V	! R
4      pT! YÑ;'       g    V'       d
   V^ ,          MRR7      p\)        VR
VRV R24       R#   + '       g   i     LP; i)zRxAI Grok OAuth (SuperGrok / Premium+) provider: ensure logged in, then pick model.)Úget_xai_oauth_auth_statusrH   Ú%resolve_xai_oauth_runtime_credentialsÚ_login_xai_oauthÚDEFAULT_XAI_OAUTH_BASE_URLrq   )Úprovider_model_idsr¯   Fr°   N)r¯   r°   r  z%xAI Grok OAuth (SuperGrok / Premium+)z	xai-oauthz	xAI OAuth)Ú
fresh_namer_   r(   rÊ   zgrok-4.6)rW   r\   u.    (via xAI Grok OAuth â€” SuperGrok / Premium+))rc   r&  rH   r'  r(  r)  rq   rd   r*  r´   rµ   r0   r¶   r   r�   r÷   rø   rÌ   rì   rÍ   r   )Ú_configrW   r·   r&  rH   r'  r(  r)  rq   r*  rù   r_   rå   Úmodelsrl   s   &&$            r"   Ú_model_flow_xai_oauthr.  �  s"  € ÷7÷ 7õ 5Ü×#Ò#¬t´G¸DÀ,ÐPUÓ4VÓ/WÔahÐimÐoxÐz~Óaô  A€JÜÜÑ&Ó(×,Ñ,¨[Ó9Ó:Ð<cÐeuØ kÕ2¸{÷Ló Lñ 	ð
 *€HÜ	×	Ò	œY×	'Õ	'Ù5Ó7ˆØ—I‘I˜jÓ)×/Ð/¨R×6Ñ6Ó8×?Ñ?ÀÓD×PÐPÈˆ÷ 
(ñ   Ó,€FÙ& v×=sÐ=s×\bÈvÐVWÎyÐhrÔt€HÜ˜X {°HØ5°h°ZÐ?mÐnöp÷ 
(×	'ús   Â.AE Ã5E Å E	c                ó   € ^ RI Hp ^ RIHpHpHpHp ^ RIHp V! 4       pVP                  R4      '       gk   \        RR.VP                  R4      '       d   RVP                  R4       2.M. OVP                  R	4      '       d   R
VP                  R	4       2.M. O5!   R# Rp	\        P                  ! \        4      ;_uu_ 4        V! RR7      p
V! V
R,          V
R,          4      p	RRR4       V	'       g   \        V4      p	T;'       g    V	'       d
   V	^ ,          MRpV! W›RVR7      p\        VRVRV R24       R#   + '       g   i     L_; i)zAQwen OAuth provider: reuse local Qwen CLI login, then pick model.)Ú_DEFAULT_QWEN_PORTAL_MODELS)Úget_qwen_auth_statusÚ resolve_qwen_runtime_credentialsrH   ÚDEFAULT_QWEN_BASE_URL©Úfetch_api_modelsr  zNot logged into Qwen CLI OAuth.zRun: qwen auth qwen-oauthÚ	auth_filezExpected credentials file: ÚerrorzError: NT)Úrefresh_if_expiringrK   r_   zqwen3-coder-plusz
qwen-oauth©rW   rY   rZ   r\   z (via Qwen OAuth))rv   r0  rc   r1  r2  rH   r3  rd   r5  r�   r   r÷   rø   rÌ   rŽ   r   )r,  rW   r0  r1  r2  rH   r3  r5  Ústatusr-  rå   r‡   rl   s   &&           r"   Ú_model_flow_qwen_oauthr;  ª  sB  € åJ÷pó på2Ù!Ó#€FØ�:‰:�k×"Ò"ÜÐ.Ð0Kð 	RØLRÏJÉJÐWb×LcÒLcÐ-¨f¯j©j¸Ó.EÐ-FÐGÑHÐikð	Rà4:·J±J¸w×4GÒ4G�'˜&Ÿ*™* WÓ-Ð.Ð/Ñ0ÈRô	Rñ 	ð €FÜ	×	Ò	œY×	'Õ	'Ù0ÀTÔJˆÙ! %¨	Õ"2°E¸*Õ4EÓFˆ÷ 
(÷ ÜÐ1Ó2ˆà×LÐL¯V  q¦	Ð9K€GÙ& vÐWcð  wLô  M€HÜ˜X |Ð5JÐNdÐemÐdnÐnð  MAö  B÷ 
(×	'ús   Ã!D=Ä=E	c           
     ón  € ^ RI HpHpHpHpHpHpHp	 V! R4      p
V
'       d   V
P                  R4      '       g   \        RR4       \        P                  ! \        VRR4      ;'       g    R\        \        VR	R
4      4      \        VRR4      ;'       g    RR7      p\        W‹V	R,          4      '       g   R#  V! 4       p^ RIHp TP                  R. 4      pT! YñRTR,          R7      p\'        TRTR,          RT 2RR7       R#   T d(   p\        T! T4      4       \!        R4        Rp?R# Rp?ii ; i)z:MiniMax OAuth provider: ensure logged in, then pick model.)rñ   rH   Ú)resolve_minimax_oauth_runtime_credentialsr×   rÙ   Ú_login_minimax_oauthrq   zminimax-oauthrô   z0Not logged into MiniMax. Starting OAuth login...r(   ÚregionNÚglobalr¯   Fr°   r±   )r?  r¯   r°   rÜ   ©Ú_PROVIDER_MODELSr_   )rY   rZ   u   âœ“ Using MiniMax model: )Ú	no_change)rc   rñ   rH   r=  r×   rÙ   r>  rq   r�   r   r´   rµ   r¶   r0   r   r9   r   rd   rB  r   )rf   rW   r·   rñ   rH   r=  r×   rÙ   r>  rq   r  Ú	mock_argsrå   rß   rB  rQ   rl   s   &&&              r"   Ú_model_flow_minimax_oauthrE  Ä  s7  € ÷D÷ Dñ Dñ $ OÓ4€Eß˜Ÿ	™	 .×1Ò1ÜÐ?ÀÔDÜ×&Ò&Ü˜4 ¨4Ó0×<Ð<°HÌÌgÐVZÐ\hÐjoÓNpÓIqÜ˜D )¨TÓ2×:Ð:°dô<ˆ	ô Ð.Ð;LÈ_Õ;]×^Ò^ÙðÙ9Ó;ˆõ 3Ø ×$Ñ$ _°bÓ9€IÙ& yÐRaÐtyð  {Eõ  uFô  G€HÜ˜X ¸¸jÕ8IÐMiÐjrÐisÐKtð  AE÷  Føð ô ÜÑ Ó$Ô%Ü˜FÔ#Ýûðús   Â9D ÄD4ÄD/Ä/D4c               ó   € V ^8„  d   QhRR/# )r   r   rŽ   r    )r!   s   "r"   r#   r#   à  s   € ÷ ñ  Tñ r$   c                óà   € ^ RI Hp V '       d5   V  Uu. uF  q"'       g   K  VNK  	  pp\        R\        V4       R24       V# VP	                  R. 4      pV'       d   \        RR4       V# u upi )z@Live GitHub Copilot ids, or the curated fallback with a warning.rA  r@   z model(s) from GitHub CopilotÚcopilotuL     âš  Could not auto-detect models from GitHub Copilot â€” showing defaults.z?    Use "Enter custom model name" if you do not see your model.)rd   rB  r9   rB   r�   r   )Úlive_idsrB  Úmodel_idrC   s   &   r"   Ú_copilot_model_listrK  à  sm   € å2ßÙ/7ÓD©x 8»8—h�h©xˆ
ÐDÜ�œ˜Z›Ð)Ð)FÐGÔHØÐØ!×%Ñ% i°Ó4€JßÜÐ[ØNô	PàÐùò Es
   “	A+¡A+c               ó   € V ^8„  d   QhRR/# )r   rK   r   r    )r!   s   "r"   r#   r#   î  s   € ÷ 
$ñ 
$˜cñ 
$r$   c                óÒ   a aa€ ^ RI HpHo V! S 4      oS'       d;   S Uu. uF-  q"P                  R4      '       g   K  VP                  RR4      NK/  	  upM. pV VV3R lpSW43# u upi )z‹``(catalog, catalog_ids, normalize)`` for a GitHub token; *normalize* canonicalizes a
model id against the catalog (identity when unknown).)Úfetch_github_model_catalogÚnormalize_copilot_model_idrL   r(   c                ó.   <€ S! V SSR 7      ;'       g    T # )©r  rK   r    )ÚmidrK   r  rO  s   &€€€r"   Ú
_normalizeÚ$_copilot_catalog.<locals>._normalizeõ  s   ø€ Ù)¨#°wÈÔP×WÐWÐTWÐWr$   )rd   rN  rO  r�   )rK   rN  ÚitemÚidsrS  r  rO  s   f    @@r"   Ú_copilot_catalogrW  î  s[   ú€ ÷ YÙ(¨Ó1€GßHO©'Ó
D©' $·X±X¸d·^Ôˆ4�8‰8�D˜"Ö©'Ò
DÐUW€C÷Xð �CÐ#Ð#ùò Es
    A$½A$c               ó   € V ^8„  d   QhRR/# ©r   r   r0   r    )r!   s   "r"   r#   r#   û  s   € ÷ ,ñ ,˜tñ ,r$   c                 óÒ  € ^ RI Hp  \        RRRRRRRRR	R
RRR4       \        RRRR7      pVf   R# VR8X  d;    ^ RIHp V! 4       pV'       g   \        R4       R# V ! RV4       \        RR4       R# VR8X  dž   \        RRRR7      pVf   R# V'       g   \        R4       R# \        P                  ! \        4      ;_uu_ 4        ^ RIHp V! V4      w  rxV'       g   \        RV 24        RRR4       R#  RRR4       V ! RV4       \        RR4       R# \        R4       R#   \         d%   p\        RT 24       \        R4        Rp?R# Rp?ii ; i  + '       g   i     Lf; i) zLNo Copilot token yet: offer device-code login or manual entry. False = stop.r2   z.No GitHub token configured for GitHub Copilot.r(   z  Supported token types:uL       â†’ OAuth token (gho_*)          via `copilot login` or device code flowuI       â†’ Fine-grained PAT (github_pat_*)  with Copilot Requests permissionu=       â†’ GitHub App token (ghu_*)     via environment variableuA       âœ— Classic PAT (ghp_*)          NOT supported by Copilot APIz
  Options:z1    1. Login with GitHub (OAuth device code flow)z    2. Enter a token manuallyú    3. Cancelz  Choice [1-3]: Tr…   NFÚ1)Úcopilot_device_code_loginz  Login cancelled or failed.ÚCOPILOT_GITHUB_TOKENz  Copilot token saved.z  Login failed: rÜ   Ú2z   Token (COPILOT_GITHUB_TOKEN): ©Úsecretr5   ú  Cancelled.)Úvalidate_copilot_tokenõ     âœ— z  Token saved.)r)   r3   r   r   Úhermes_cli.copilot_authr]  r9   rÌ   r   r÷   rø   ÚImportErrorrc  )	r3   Úchoicer]  Útokenrß   Únew_keyrc  Úvalidrá   s	            r"   Ú_copilot_obtain_tokenrk  û  s\  € å0ÜÐ	9¸2Ð?YØ	WØ	TØ	HØ	LÈbÐR^Ø	<Ð>]Ð_nÐprôtô Ð$¨$¸2Ô>€FØ‚~ÙØ�„}ð	ÝIÙ-Ó/ˆEßÜÐ4Ô5ÙÙÐ1°5Ô9ÜÐ)¨2Ô.ñ
 Ø�„}ÜÐ9À$ÐSUÔVˆØŠ?ÙßÜ�.Ô!Ùä× Ò ¤×-Õ-ÝFÙ/°Ó8‰JˆEßÜ˜˜s˜e�nÔ%Ø÷ .Ñ-ð ÷ .ñ 	Ð-¨wÔ7ÜÐ˜rÔ"ÙÜ	ˆ.ÔÙøô/ ô 	ÜÐ$ S EÐ*Ô+Ü Ô'Ýûð	ú÷ .×-ús/   ºD$ ÁD$ ÁD$ Ã(EÄ$EÄ/EÅEÅE&	c                ó¶  € ^ RI HpHp ^ RIHpHp RpW&,          pV! V4      pVP                  RR4      p	VP                  RR4      p
V	'       g.   \        4       '       g   R# V! V4      pVP                  RR4      p	MEV
R9   d*   ^ RIH	p \        R	V	R
,           RV
 V! V
4       R2R4       M\        V
R8X  d   RMRR4       VP                  p\        V	4      w  rÞpV'       g	   V! Wœ4      p\        \        V4      RV! V4      WlV	R7      pV'       g   \        R4       R# V! V4      p\!        VWlV! VWÙR7      R7       \        RV RVP"                   R24       R# )zíGitHub Copilot flow using env vars, gh CLI, or OAuth device code. The reasoning-effort step
is the shared post-pick one in ``select_provider_and_model`` (Copilot's per-model level set
comes from ``github_model_reasoning_efforts`` there).)rq   Ú$resolve_api_key_provider_credentials)r5  Úcopilot_model_api_moderH  rK   r(   r=   N©Úformat_secret_source_suffixz  GitHub token: :Né   Nu	   ... âœ“ (Ú)zgh auth tokenu*     GitHub token: âœ“ (from `gh auth token`)u     GitHub token: âœ“úModel name: r  r„   rQ  r^   r\   ú (via >   ÚGH_TOKENÚGITHUB_TOKEN)rc   rq   rm  rd   r5  rn  r�   rk  Úhermes_cli.env_loaderrp  r   Úinference_base_urlrW  r   rK  r9   r   rM   )rf   rW   rq   rm  r5  rn  rs   rg   rå   rK   r=   rp  r/   r  Úlive_modelsrS  rl   s   &&               r"   Ú_model_flow_copilotrz  *  sP  € ÷ XßJØ€KØÕ,€GÙ0°Ó=€EØ�i‰i˜	 2Ó&€GØ�Y‰Y�x Ó$€FßÜ$×&Ò&ÙÙ4°[ÓAˆØ—)‘)˜I rÓ*‰àÐ1Ô1ÝIÜÐ# G¨B¥K =°	¸&¸ÑB]Ð^dÓBeÐAfÐfgÐhÐjlÕmäÀÈ?ÔAZÑ=Ð`uÐwyÔzà×/Ñ/€NÜ'7¸Ó'@Ñ$€G˜*ßÙ& wÓ?ˆä$Ü˜KÓ(¨.É
ÐS`ÓHaØ$ÐW^ô`€H÷ ÜˆlÔÙÙ˜(Ó#€HÜ�8˜[Ù2°8ÀWÔ^õ`ä	Ð" 8 *¨F°7·<±<°.ÀÐ
BÖCr$   c           	     ó&  € ^ RI HpHpHpHp ? RpW&,          pV! V4      pVP                  R4      ;'       g    VP                  R4      ;'       g    Rp	VP                  R4      ;'       g    VP                  p
\        RRR	R
V	 2RV
 2R4        V! V4      pTP                  R4      ;'       g    T
p
Rp\        P                  ! \        4      ;_uu_ 4        T! R4      P                  RR4      pRRR4       \        T4      w  rïp\        \        T4      RT! T4      YjTR7      pT'       d	   T! T4      p\        TTRT RTP                   R2T
RR7       R#   \         d   p\        RT 2R4        Rp?R# Rp?ii ; i  + '       g   i     L˜; i)z4GitHub Copilot ACP flow using the local Copilot CLI.)rq   Ú$get_external_process_provider_statusrm  Ú-resolve_external_process_provider_credentialszcopilot-acpÚresolved_commandÚcommandrH  r_   z?  GitHub Copilot ACP delegates Hermes turns to `copilot --acp`.zB  Hermes currently starts its own ACP subprocess for each request.zH  Hermes uses your selected model as a hint for the Copilot ACP session.ú  Command: ú  Backend marker: r(   õ     âš  z[  Set HERMES_COPILOT_ACP_COMMAND or COPILOT_CLI_PATH if Copilot CLI is installed elsewhere.NrK   rs  r  r\   rt  rr  r]   r^   )rc   rq   r|  rm  r}  r�   rx  r   rÌ   r÷   rø   rW  r   rK  r   rM   )rf   rW   rq   r|  rm  r}  rs   rg   r:  r~  r/   rå   rß   Úcatalog_api_keyÚ_catalogÚcatalog_idsrS  rl   s   &&                r"   Ú_model_flow_copilot_acpr†  R  s’  € ÷7ó 7ð 	Ø€KØÕ,€GÙ1°+Ó>€FØ—z‘zÐ"4Ó5×[Ð[¸¿¹ÀIÓ9N×[Ð[ÐR[ÐØ—Z‘Z 
Ó+×IÐI¨w×/IÑ/I€NäÐ	JØ	MØ	SØÐ'Ð(Ð	)Ð-?ÀÐ?OÐ+PÐRTôVðÙ=¸kÓJˆð —Y‘Y˜zÓ*×<Ð<¨n€Nà€OÜ	×	Ò	œY×	'Õ	'Ù>¸yÓI×MÑMÈiÐY[Ó\ˆ÷ 
(ä(8¸Ó(IÑ%€H˜:Ü$Ü˜KÓ(¨.É
ÐS`ÓHaØ$ÐWfôh€H÷ Ù˜hÓ'ˆÜ�(˜KÐ+AÀ(ÀÈ6ÐRY×R^ÑR^ÐQ_Ð_`Ð)aØ)Ð4F÷Høô ô Üˆv�c�Uˆ^ÐzÔ{Ýûðú÷ 
(×	'ús$   ÂE ÃF ÅE=Å#E8Å8E=Æ F	c           	     ó  € ^ RI HpHp ^ RIHpHp ^ RIHp RpW',          pVP                  ;'       g    Rp	\        Wx4      w  r«pV'       d   R# VP                  R4      pV'       d   Tp\        RV 24       MVP                  p\        R	V 24       V	'       d   V! V	4      '       d
   V! V	R4       \        4        TP                  V'       d   RMR
. 4      p\        VRWWëR7      p\        TTRT RV'       d   RMR R2VRR7       R# )u¬   Kimi / Moonshot model selection; the endpoint is chosen by key prefix (no URL prompt):
``sk-kimi-*`` â†’ api.kimi.com/coding/v1 (Kimi Coding Plan), other keys â†’ Moonshot.)rq   ÚKIMI_CODE_BASE_URL)r'   r3   rA  zkimi-codingr(   Nzsk-kimi-u$     Detected Kimi Coding Plan key â†’ u     Using Moonshot endpoint â†’ ÚmoonshotzEnter model name: r  r\   rt  zKimi CodingÚMoonshotrr  T©r_   Údrop_api_mode)rc   rq   rˆ  r)   r'   r3   rd   rB  Úbase_url_env_varr
   r8   r9   rx  r�   r   r   )rf   rW   rq   rˆ  r'   r3   rB  rs   rg   r   Ú_rh   rj   Úis_coding_planr/   rC   rl   s   &&               r"   Ú_model_flow_kimir�  w  s  € ÷ Fß?Ý2Ø€KØÕ,€GØ×+Ñ+×1Ð1¨r€Lä1°+ÓGÑ€A�UßÙà!×,Ñ,¨ZÓ8€NßØ+ˆÜÐ4°^Ð4DÐEÕFà ×3Ñ3ˆÜÐ.¨~Ð.>Ð?Ô@ç™ l×3Ò3Ù�| RÔ(Ü	„Gà!×%Ñ%·~¡mÈ:ÐWYÓZ€JÜ$ØÐ(¸Ø'ôG€Hô �(˜KÐ+AÀ(ÀÈ6×cqÑR_ð  xBð  RCð  CDð  *EØ)¸÷?r$   c           
     ó8  € ^ RI HpHpHp ^ RIHp ^ RIHp ^ RIH	pH
pHp	 Rp
WZ,          pVP                  ;'       g    Rp\        W«4      w  rÞpV'       d   R# \        V4      pV'       gZ   V P                  R4      p\!        V\"        4      '       d3   \%        VP                  R	4      ;'       g    R4      P'                  4       pT! T;'       g    VP(                  4      pR UUu. uF  w  ppVV R
V! V4       R23NK  	  pppV UUu. uF  w  ppVV8X  g   K  VV R23NK  	  uppV UUu. uF  w  ppVV8w  g   K  VV3NK  	  upp,           R.,           pT! V UUu. uF  w  ppVNK
  	  upp4      pVe   VV,          ^ ,          R8X  d   \+        R4       R# V! VV,          ^ ,          4      pV'       d
   V! VV4       V	! V
4      ;'       g
    V! VV4      pV'       d'   \+        R\-        V4       RVP.                   R24       M3VP                  V
. 4      pV'       d   \+        RVP.                   R24       \1        VRWVVR7      p\3        VV
RV RVP.                   R2VRR7      pVe   \#        V4      V R&   R# R# u uppi u uppi u uppi u uppi )z6StepFun Step Plan flow with region-specific endpoints.)Ú_infer_stepfun_regionÚ_prompt_provider_choiceÚ_stepfun_base_url_for_region©rq   r2   )rB  r5  r*  Ústepfunr(   Nr‚   r_   ú (rr  u     â†� currently activeÚcancelr„   r@   rA   ú APIz$  Could not auto-detect models from u,    API â€” showing Step Plan fallback catalog.rs  r  r\   rt  Tr‹  ))ÚinternationalÚInternational)ÚchinaÚChina)r˜  ÚCancel)rv   r’  r“  r”  rc   rq   r)   r3   rd   rB  r5  r*  r�  r
   r,   r�   r‹   rŒ   r   rì   rx  r9   rB   rM   r   r   )rf   rW   r’  r“  r”  rq   r3   rB  r5  r*  rs   rg   r   rŽ  rh   rj   Úcurrent_baserî   Úcurrent_regionÚkeyrM   ÚregionsÚkÚlabelÚordered_regionsÚ
region_idxr/   rC   rl   r‚   s   &&                            r"   Ú_model_flow_stepfunr§  š  sž  € ç{Ñ{Ý1Ý0ßXÑXØ€KØÕ,€GØ×+Ñ+×1Ð1¨r€Lä1°+ÓGÑ€A�UßÙä  Ó.€LßØ—J‘J˜wÓ'ˆ	Ü�i¤×&Ò&Ü˜yŸ}™}¨ZÓ8×>Ð>¸BÓ?×EÑEÓGˆLÙ*¨<×+UÐ+U¸7×;UÑ;UÓV€Nñ HôIÙGñ KTÈ#Èt�˜�v˜RÑ <¸SÓ AÐBÀ!ÐDÓEÙGð ñ Iñ OVÔmÉgÁ(À!ÀUÐYZÐ^lÑYlÔ=˜˜u˜gÐ%;Ð<Ó=ÉgÒmÙ5<ÔT±W©¨¨EÀÀ^Ñ@Sœ*˜1˜e›*±WÒTõUØXlÐWmõn€Oñ )ÁÔ)PÁ±H°A°u«%ÁÒ)PÓQ€JØÒ˜_¨ZÕ8¸Õ;¸xÔGÜˆlÔÙÙ1°/À*Õ2MÈaÕ2PÓQ€NßÙ�| ^Ô4ñ $ KÓ0×bÐbÑ4DÀ\ÐSaÓ4b€JßÜ�œ˜Z›Ð)¨¸¿¹¸ÀdÐKÕLà%×)Ñ)¨+°rÓ:ˆ
ßÜÐ8¸¿¹¸ÐFrÐsÔtä$Ø�N°-Ø'¸ôG€Hô ˜( KÐ3IÈ(ÈÐSYÐZa×ZfÑZfÐYgÐghÐ1iØ#1ÀôG€EàÒô ˜u›+ˆˆw‹ñ	 ùó;Iùó nùÛTùã)Ps$   Ã&JÄ
J
ÄJ
Ä.JÄ?JÅ J
c           
     óŠ  aa€ ^ RI Hp ^ RIHpHp ^ RIHp V! R4      ;'       g    V! R4      ;'       g    RP                  4       pV'       d   \        RV R24       M\        R	R
RR4       \        4        V! 4       P                  R4      p\        V\        4      '       g   / p\        VP                  R4      ;'       g    R4      P                  4       p\        RT;'       g    R R2RR7      p	V	f   R# T	;'       g    To\        VP                  R4      ;'       g    R4      P                  4       ;'       g    Rp
\        RV
 R2RR7      pVf   R# T;'       g    T
oVP                  R. 4      ;'       g    RR.pSR8X  d   RMS R2pRV RS R2pV! WÁRVR7      pVV3R lp\        VRR V R!S R"2R#R$R$VR%7       R# )&a
  Google Vertex AI (Gemini via the OpenAI-compatible endpoint). Auth is OAuth2 (service-account
JSON or ADC): the credential *path* lives in .env (VERTEX_CREDENTIALS_PATH /
GOOGLE_APPLICATION_CREDENTIALS); project ID and region are non-secret, saved under ``vertex:``.)rH   )rè   r'   rA  ÚVERTEX_CREDENTIALS_PATHÚGOOGLE_APPLICATION_CREDENTIALSr(   z,  Vertex credentials: service account JSON (u   ) âœ“z;  Vertex credentials: Application Default Credentials (ADC)z5    Vertex uses OAuth2, not a static API key. Either:u9         â€¢ run 'gcloud auth application-default login', oruQ         â€¢ set VERTEX_CREDENTIALS_PATH in ~/.hermes/.env to a service account JSONÚvertexÚ
project_idz  GCP project ID [zfrom credentialsr4   ©r5   Nr?  r@  z  Vertex region [zgoogle/gemini-3-pro-previewzgoogle/gemini-3-flash-previewzaiplatform.googleapis.comz-aiplatform.googleapis.comzhttps://z&/v1beta1/projects/<project>/locations/z/endpoints/openapir9  c                ó4   <€ \        V R 4      pSVR&   SVR&   R# )r«  r¬  r?  N)r	   )r¤   Ú_modelÚvcfgr¬  r?  s   && €€r"   Ú_finishÚ#_model_flow_vertex.<locals>._finishþ  s"   ø€ Ü# C¨Ó2ˆØ'ˆˆ\ÑØˆˆX‹r$   z  Default model set to: z (via Google Vertex AI, rr  ú  No change.T)rC  Údrop_base_urlrŒ  Úfinish)rc   rH   r)   rè   r'   rd   rB  rì   r9   r   r�   r‹   rŒ   r   r   r   )rf   rW   rH   rè   r'   rB  Úsa_pathÚ
vertex_cfgÚcurrent_projectÚproject_inputr   Úregion_inputrC   ÚhostÚbase_url_previewrl   r±  r¬  r?  s   &&               @@r"   Ú_model_flow_vertexr½  Ó  sé  ù€ õ 8ß<Ý2ñ Ð6Ó7×pÐp¹=ÐIiÓ;j×pÐpÐnp×wÑwÓy€GßÜÐ<¸W¸IÀUÐKÕLäÐJØDØHØ`ô	bô 
„Gá“×"Ñ" 8Ó,€JÜ�j¤$×'Ò'Øˆ
ô ˜*Ÿ.™.¨Ó6×<Ð<¸"Ó=×CÑCÓE€OÜÐ-¨o×.SÐ.SÐASÐ-TÐTWÐXÐegÔh€MØÒÙØ×1Ð1 /€Jô ˜Ÿ™¨Ó1×=Ð=°XÓ>×DÑDÓF×RÐRÈ(€NÜÐ+¨NÐ+;¸3Ð?ÈBÔO€LØÒÙØ×+Ð+˜^€Fð "×%Ñ% h°Ó3×wÐwÐ8UÐWvÐ7w€JØ*0°HÔ*<Ñ&ÀVÀHÐLfÐBg€DØ! $ Ð'MÈfÈXÐUgÐhÐÙ& zÐaið  }Mô  N€Hö ô �(˜HÐ(@ÀÀ
ÐJbÐciÐbjÐjkÐ&lð  yGØ $°DÀ÷Jr$   c               ó    € V ^8„  d   QhRRRR/# )r   rŸ  r   r   r    )r!   s   "r"   r#   r#   	  s   € ÷  ñ   sð  ¨sñ  r$   c           	     óŠ  a€ ^ RI Hp ^ RIHp V UUUu. uF	  w  r4r5WT3NK  	  ppppT ;'       g    RP	                  4       P                  R4      o\        V3R l\        V4       4       S'       d   \        V4      M^ 4      pV UUu. uF  w  rTV RV R2NK  	  uppR.,           pV! W‡R	R
7      p	V	f   V # V	\        V4      8w  d   Wi,          ^,          P                  R4      # \        RV  R2RR7      p
V
'       g   V # V
P                  \        4      '       g   \        R4       V # V
P                  R4      # u upppi u uppi )zÎPicker for the official Z.AI endpoints (``ZAI_ENDPOINTS`` in ``hermes_cli.auth``, kept in
sync with the probe list) plus a custom-proxy option. Returns the selected base URL;
*current_base* on cancel/error.)r“  )ÚZAI_ENDPOINTSr(   rÊ   c              3  ób   <"  € T F$  w  pw  r#SVP                  R 4      8X  g   K   Vx € K&  	  R# 5i)rÊ   N)rÍ   )Ú.0r¢   rŽ  ÚurlÚnormalized_currents   &   €r"   Ú	<genexpr>Ú'_select_zai_endpoint.<locals>.<genexpr>  s0   øé € ÐmÑ1C¡ ¡X aÐGYÐ]`×]gÑ]gÐhkÓ]lÑGlŸšÓ1Cùs   ƒ/¥
/r—  rr  zCustom proxy URLzSelect Z.AI / GLM endpoint:)r‡   r¡   zCustom base URL [r4   r­  r7   )rv   r“  rc   rÀ  rì   rÍ   Únextr—   rB   r   r8   r   r9   )rŸ  r“  rÀ  rŽ  rÃ  r¤  Úoptionsr    Úchoicesrl   r:   rÄ  s   &          @r"   Ú_select_zai_endpointrÊ  	  s1  ø€ õ GÝ-Ù4AÕB±MÑ 0 ¨�‹|±M€GÒBØ&×,Ð,¨"×3Ñ3Ó5×<Ñ<¸SÓAÐô Ôm´¸7Ô1CÓmß'9”s˜7”|¸qóB€Ká4;Ô<±G¡j e�%�˜˜3˜%˜qÓ!±GÒ<Ð@RÐ?SÕS€GÙ& wÐKhÔi€HØÒØÐØ”3�w“<ÔØÕ  Õ#×*Ñ*¨3Ó/Ð/ÜÐ'¨ ~°SÐ9ÀbÔI€HßØÐØ×Ñœu×%Ò%ÜÐ]Ô^ØÐØ�?‰?˜3ÓÐùô% Cùó =s   ”D8ÂD?c               ó$   € V ^8„  d   QhRRRRRR/# )r   rh   r   r   r   r0   r    )r!   s   "r"   r#   r#   /  s!   € ÷ ñ  #ð ¸cð Àdñ r$   c                óî   €  ^ RI Hp \        R4       T! T \	        T4      ;'       g    TP
                  4      pTR8X  d   \        \          R# \        TR8X  d   RMRR	4       R#   \         d     R# i ; i)
zÚGemini free-tier gate: free-tier daily quotas (<= 250 RPD for Flash) are exhausted in a
handful of agent turns, so refuse a free-tier key. The probe is best-effort; network or
auth errors fall through without blocking.)Úprobe_gemini_tierTz  Checking Gemini API tier...ÚfreeFÚpaidu     Tier check: paid âœ“z3  Tier check: could not verify (proceeding anyway).r(   )Úagent.gemini_native_adapterrÍ  rÌ   r9   r,   rx  r   Ú_GEMINI_FREE_TIER_NOTICE)rh   rg   r   rÍ  Útiers   &&&  r"   Ú_gemini_tier_okrÓ  /  su   € ðÝAô 
Ð
)Ô*Ù˜\¬=¸Ó+F×+dÐ+dÈ'×JdÑJdÓe€DØˆv„~ÜÔ&Ñ'Ùô 	 T¨V¤^Ñ	!Ð9nÐprÔsÙøô ô Úðús   ‚A% Á%A4Á3A4c                ó”   € ^ RI Hp ^ RIHp  V! W#R7      p\        VR4       V#   T d   p\	        RT 2R4       . p Rp?L+Rp?ii ; i)z*LM Studio: live /api/v1/models probe only.)r×   )Úfetch_lmstudio_models©rK   r_   z"  LM Studio rejected the request: zC  Set LM_API_KEY (or update it) to match the server's bearer token.Nz	LM Studio)rc   r×   Úhermes_cli.models_localrÕ  r   rD   )rg   ÚcuratedrK   r_   r×   rÕ  rC   rß   s   &&&&    r"   Ú_lmstudio_modelsrÙ  B  sS   € å)Ý=ðÙ*°7ÔNˆ
ô ˜
 KÔ0ØÐøð	 ô ÜÐ1°#°Ð7Ð9~ÔØ�
ûðús   Ž	% ¥A¬AÁAc                ó>   € ^ RI Hp V! W#RR7      p\        VR4       V# )zŒOllama Cloud: forced live refresh so newly released models appear the moment the user
enters their key, not when the disk cache TTL expires.)Úfetch_ollama_cloud_modelsT)rK   r_   rU   zOllama Cloud)rd   rÛ  rD   )rg   rØ  rK   r_   rÛ  rC   s   &&&&  r"   Ú_ollama_cloud_modelsrÜ  O  s$   € õ <Ù*°7Ð]aÔb€JÜ˜
 NÔ3ØÐr$   c                óÀ   € ^ RI Hp V! W#4      pV'       d   \        WPP                   R24       V# \	        RV4      pV'       d   \        VR4       V# \        V4       V# )z2Novita: live first, then models.dev, then curated.r4  r™  Únovitaúmodels.dev registry)rd   r5  rD   rM   r   r   )rg   rØ  rK   r_   r5  ry  rC   s   &&&&   r"   Ú_novita_modelsrà  X  sX   € å2Ù" 7Ó5€KßÜ˜K¯L©L¨>¸Ð)>Ô?ØÐÜ# H¨gÓ6€JßÜ˜JÐ(=Ô>ØÐÜ�'ÔØ€Nr$   Úlmstudiozollama-cloudrÞ  c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   rs   r   rh   Úkey_envr/   r   rŽ   r    )r!   s   "r"   r#   r#   n  s2   € ÷ )ñ )¨cð )È#ð )ÐX[ð )Ðmpð )Ðuyñ )r$   c                ó”  € ^ RI Hp ^ RIHpHpHp VP                  V . 4      p	T;'       g    V'       d	   V! V4      MRp
\        P                  V 4      pVe
   V! WW¤4      # \        W	4      pV'       d   \        VR4       V# V	'       d   \        V	4      ^8¼  d   \        V	4       V	# ^ RIHp V! V 4      pVeB   V! WW¤4      pV'       d   \        WÁP                   R24       V# \        V	4       \        V	4      # V! W¤4      pV'       d4   \        V4      \        V	4      8¼  d   \        WñP                   R24       V# \        V	4       V	# )u¡  Model list for an API-key provider: models.dev registry (cached, agentic/tool-capable filter)
â†’ curated static list (offline insurance) â†’ provider-owned catalog (``ProviderProfile.fetch_models``
merged with ``fallback_models`` exactly like the ``/model`` picker's
``models._profile_live_catalog``; generic /models probe for unregistered providers).
Providers in ``_SPECIAL_MODEL_LISTS`` have their own resolution.r&   )rB  r5  Úprobe_profile_catalogr(   rß  )Úget_provider_profilez catalogr™  )r)   r'   rd   rB  r5  rå  r�   Ú_SPECIAL_MODEL_LISTSr   rD   rB   r   Ú	providersræ  rM   rŽ   )rs   rg   rh   rã  r/   r'   rB  r5  rå  rØ  Úapi_key_for_probeÚspecialrC   ræ  Úprofilery  s   &&&&&           r"   Ú_api_key_provider_model_listrì  n  s*  € õ 0ß[Ñ[Ø×"Ñ" ;°Ó3€GØ$×SÐSÇ7©°wÔ)?ÐPRÐä"×&Ñ& {Ó3€GØÒÙ�wÐ):ÓKÐKô $ KÓ9€JßÜ˜JÐ(=Ô>ØÐß”3�w“< 1Ô$ä�gÔØˆÝ.Ù" ;Ó/€GØÒñ +¨;ÐARÓcˆ
ßÜ 
¯|©|¨n¸HÐ,EÔFØÐÜ�gÔÜ�G‹}ÐÙ"Ð#4ÓE€Kß”s˜;Ó'¬3¨w«<Ô7Ü˜K¯L©L¨>¸Ð)>Ô?ØÐÜ�'ÔØ€Nr$   c           
     ó  € ^ RI Hp ^ RIHpHp ^ RIHpHp W1,          pVP                  '       d   VP                  ^ ,          MRp	VP                  ;'       g    Rp
VR9   p\        W4      w  rÍpV'       d   R# VR8X  d   V'       d   \        WØV
4      '       g   R# \        V
4      pV'       gÃ   \        P                  ! \        4      ;_uu_ 4        V! 4       P!                  R4      ;'       g    / p\#        VP!                  R4      ;'       g    R4      P%                  4       P'                  4       V8X  d3   \#        VP!                  R	4      ;'       g    R4      P%                  4       pRRR4       T;'       g    VP(                  pVR
8X  d£   ^ RIHp V P!                  R4      ;'       g    / p\/        V\0        4      '       dl   T! \#        VP!                  R4      ;'       g    R4      4      V8X  d=   \#        VP!                  R	4      ;'       g    R4      P%                  4       ;'       g    TpVR8X  d/   \3        V4      pV'       d   VV8w  d   V
'       d
   V! V
V4       TpM\5        VW¡R
8g  R7      p\7        WWÙV4      pV'       dF   V Uu. uF  pV! VV4      NK  	  ppV! W4      p\9        \0        P;                  R V 4       4      4      p/ pV'       d    ^ RIHp V! V4      ;'       g    / p\A        VRVVVVVR7      pV'       d   V'       d
   V! VV4      p\C        TTRV RVPD                   R2TV'       d   V'       d
   V! VV4      MRV'       * R7       R#   + '       g   i     ELÿ; iu upi   \         d    / p L•i ; i)zCGeneric flow for API-key providers (z.ai, MiniMax, OpenCode, etc.).r•  )r3   rè   )Úopencode_model_api_modeÚnormalize_opencode_model_idr(   NÚgeminir‚   r€   r_   Úactual)Únormalize_providerÚzai)r-   c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irö   r    )rÂ  rR  s   & r"   rÅ  Ú/_model_flow_api_key_provider.<locals>.<genexpr>É  s   é € Ð'I±z°ÃS¯ª³zùs   ‚	�
rR   rs  rV   r\   rt  rr  )r_   r`   rŒ  >   úopencode-goúopencode-zen)#rc   rq   r)   r3   rè   rd   rî  rï  rO   r�  r
   rÓ  r,   r÷   rø   rÌ   r�   r   rì   Úlowerrx  Úhermes_cli.providersrò  r‹   rŒ   rÊ  r;   rì  rŽ   Úfromkeysre   rS   r   r   rM   )rf   rs   rW   rq   r3   rè   rî  rï  rg   rã  r   Úis_opencoderŽ  rh   rj   rŸ  Ú_mr/   rò  rî   Úchosen_baserC   rR  rX   rS   rl   s   &&&                       r"   Ú_model_flow_api_key_providerrþ  š  só  € å1ß=ßVØÕ,€GØ-4×-E×-EÐ-Eˆg×&Ñ& qÖ)È2€GØ×+Ñ+×1Ð1¨r€LØÐ!@Ñ@€Kä1°+ÓGÑ€A�UßÙØ�hÔ§<¼ÈÐ_k×8lÒ8lÙô
 ! Ó.€LßÜ× Ò ¤×+Õ+Ù“×"Ñ" 7Ó+×1Ð1¨rˆBÜ�2—6‘6˜*Ó%×+Ð+¨Ó,×2Ñ2Ó4×:Ñ:Ó<ÀÔKÜ" 2§6¡6¨*Ó#5×#;Ð#;¸Ó<×BÑBÓD�÷ ,ð "×?Ð? W×%?Ñ%?€Nà�hÔÝ;Ø—J‘J˜wÓ'×-Ð-¨2ˆ	Ü�i¤×&Ò&Ñ+=¼cÀ)Ç-Á-ÐPZÓB[×BaÐBaÐ_aÓ>bÓ+cÐgrÔ+rÜ  §¡¨zÓ!:×!@Ð!@¸bÓA×GÑGÓI×[Ð[È^ˆNà�eÔô +¨>Ó:ˆß˜;¨.Ô8¿\Ù˜<¨Ô5Ø$‰ä2°>À<ÐltÑ]tÔuˆä-¨kÀLÐ[iÓj€JßÙOYÓZÉzÈÑ1°+¸sÖCÉzˆ
ÐZÙ3°KÓOˆÜœ$Ÿ-™-Ñ'I±zÓ'IÓIÓJˆ
ð €Gßð	ÝJÙ.¨{Ó;×AÐA¸rˆGô %Ø�N°-ÈÐcnØ'¸ôG€H÷ —KÙ.¨{¸HÓEˆäØ�+Ð!7¸°zÀÈÏÉÀ~ÐUVÐWÐbpßCK×P[Ñ(¨°hÔ?ÐaeØ%”o÷'÷W ,×+Ð+üò0 [øô ô 	ØŠGð	ús7   Ã=MÄAMÅMÊM3ËM8 Ë/M8 ÍM0	Í8NÎNc               ó   € V ^8„  d   QhRR/# rY  r    )r!   s   "r"   r#   r#   à  s   € ÷ ñ  ñ r$   c            	     óF  € ^ RI Hp  ^ RIHpHp \        RRRRRRR4       \        RR	RR
7      pVf   R# VR8X  d	   V ! V4      # VR8X  dM   \        RRR4       \        RR	RR7      pVf   R# V'       g   \        R4       R# V! WAR7       \        R4       R	# \        R4       R# )zSInteractive Anthropic auth (OAuth subscription or API key). False = flow must stop.)Ú_run_anthropic_oauth_flow)r3   Úsave_anthropic_api_keyr(   z  Choose authentication method:z0    1. Claude Pro/Max subscription (OAuth login)z(    2. Anthropic API key (pay-per-token)r[  z  Choice [1/2/3]: Tr…   Fr\  r_  z>  Get an API key at: https://platform.claude.com/settings/keysz  API key (sk-ant-...): r`  rb  )Úsave_fnu     âœ“ API key saved.r³  )rv   r  r)   r3   r  r   r   r9   )r  r3   r  rg  rK   s        r"   Ú_anthropic_authenticater  à  s¤   € åHßHÜˆÐ.°Ð4fØ	3°_ÀbôJäÐ&¨D¸RÔ@€FØ‚~ÙØ�„}Ù(¨Ó8Ð8Ø�„}ÜˆRÐQÐSUÔVÜÐ1¸$È2ÔNˆØŠ?ÙßÜ�.Ô!ÙÙ˜wÕ?ÜÐ$Ô%ÙÜ	ˆ.ÔÙr$   c                óì  € ^ RI Hp ^ RIHp V! 4       pRp\        P
                  ! \        4      ;_uu_ 4        ^ RIHpH	pH
p V! 4       p	V	'       d   V! V	4      '       d   RpRRR4       \        T;'       d    X! V4      ;'       d    V'       * 4      p
\        V4      ;'       d    V
'       * ;'       g    TpV'       * pV'       dÃ   V'       d€   ^ RIHp ^ RI Hp R	pVR
,          P                   FA  p\         P"                  ! VR	4      P%                  4       V8X  g   K/  V! V4      pV'       g   KA   M	  \'        RVR,           RV 24       MV'       d   \'        R4       \'        4        \)        R4      pVR8X  d   RpM	VR8X  d   R# V'       d   \+        4       '       g   R# \'        4        \-        VP/                  R
. 4      RVR
R7      p\1        VR
RV R2RRR7       R#   + '       g   i     EL‰; i)uR   Flow for Anthropic provider â€” OAuth subscription, API key, or Claude Code creds.)Úget_anthropic_keyrA  F)Úread_claude_code_credentialsÚis_claude_code_token_validÚ_is_oauth_tokenTNro  r•  r(   Ú	anthropicz  Anthropic credentials: :Né   Nu   ... âœ“u.     Claude Code credentials: âœ“ (auto-detected)zAnthropic credentials:Úreauthr˜  z-Model name (e.g., claude-sonnet-4-20250514): )rW   rY   r\   z (via Anthropic))r´  rŒ  )rc   r  rd   rB  r÷   rø   rÌ   Úagent.anthropic_credentialsr  r  r	  r0   rw  rp  rq   rO   r*   r+   rì   r9   r   r  r   r�   r   )rf   rW   r  rB  rh   Úcc_availabler  r  r	  Úcc_credsÚexisting_is_stale_oauthÚ	has_credsÚ
needs_authrp  rq   Úsource_suffixÚvarrg  rl   s   &&                 r"   Ú_model_flow_anthropicr  ú  s®  € å1Ý2ñ %Ó&€LØ€LÜ	×	Ò	œY×	'Õ	'ßyÑyÙ/Ó1ˆßÑ2°8×<Ò<ØˆL÷	 
(ô # <×#fÐ#f±OÀLÓ4Q×#fÐ#fÐZfÔVfÓgÐÜ�lÓ#×CÐCÐ,CÔ(C×TÐTÈ€IØ”€JçßÝIÝ9ð ˆMØ(¨Õ5×FÔF�Ü—9’9˜S "Ó%×+Ñ+Ó-°Ö=Ù$?ÀÓ$D�Mß$‘}Ùñ	 Gô
 Ð-¨l¸3Õ.?Ð-@ÀÈÀÐWÕXßÜÐBÔCÜŒÜ0Ð1IÓJˆØ�XÔØ‰JØ�xÔÙ÷ Ô1×3Ò3ÙÜ	„Gä$Ø×Ñ˜[¨"Ó-Ð/^Ø#°kôC€Hô
 �(˜KÐ+AÀ(ÀÐK[Ð)\Ðlpð  AE÷  F÷Y 
(×	'Ð	'ús   ¸'G"Á G"Ç"G3	c               ó   € V ^8„  d   QhRR/# rY  r    )r!   s   "r"   r#   r#   7  s   € ÷ ñ °Tñ r$   c           	     óú  € ^ RI p^ RIp^ RIpVR,          '       dE   VP                  R4      '       d   RVR,           R2MRp\	        RV P
                   RV 2R4       R	# VP                  R
4      pV'       d!   VP                  P                  4       '       g   \	        RVR,           24       R# \	        RVR,          P                  R4      ^ ,           R2RVP                  VRR 4       R2R4        VP                  VRR7       T P                  4       R,          '       g   \        R4       \        R4       R# \	        RRT P
                   R2R4       R	#   \        \        3 d    \        R4        R# i ; i)u±   Logged in â†’ say so (with plan). Logged out â†’ run the CLI's own login on a TTY (it is
browser/device based, so it must own the terminal), else print the instruction and stop.Nr  Úplanr—  rr  r(   ú  u    credentials: âœ“TÚlogin_commandrd  ÚdetailFÚ.z  Starting `z` (press Ctrl-C to cancel)...)ÚcheckzLogin cancelled or failed.zLogin failed.rÜ   éþÿÿÿ)ÚshlexÚ
subprocessÚsysr�   r   Údisplay_nameÚstdinÚisattyÚsplitÚjoinÚrunÚKeyboardInterruptÚOSErrorr9   Úsetup_statusr   )rë  r:  r  r   r!  r  Úlogins   &&     r"   Ú_external_process_login_gater,  7  s`  € ó ÛÛàˆk×ÔØ)/¯©°F×);Ò);��F˜6•NÐ# 1Ñ%ÀˆÜˆr�'×&Ñ&Ð'Ð'8¸¸Ð?ÀÔDÙØ�J‰J�Ó'€Eß˜Ÿ	™	×(Ñ(×*Ò*Üˆv�f˜XÕ&Ð'Ð(Ô)ÙÜˆ2ˆf�XÕ×$Ñ$ SÓ)¨!Õ,Ð-¨QÐ	/°<ÀÇ
Á
È5ÐQSÐQTÈ:Ó@VÐ?WÐWtÐ1uÐwyÔzðØ�‰�u EˆÔ*ð ×ÑÓ! +×.Ô.ÜˆoÔÜ˜FÔ#ÙÜˆˆr�'×&Ñ&Ð'Ð'8Ð9¸2Ô>Ùøô œwÐ'ô ÜÐ*Ô+Úðús   Ã5E ÅE:Å9E:c               ó    € V ^8„  d   QhRRRR/# ©r   rs   r   r   ztuple[str, str] | Noner    )r!   s   "r"   r#   r#   T  s   € ÷ Dñ D¨sð DÐ@Vñ Dr$   c                óÞ  € ^ RI HpHp V! V 4      p\        RVP                  ;'       g    T  RVP                  R4      ;'       g    VP                   R2RVP                  R4      ;'       g    VP                  R4      ;'       g    R 2R	VP                  R
4      ;'       g    VP                   2R4        V! V 4      pTP                  4       pTe:   TR,          '       g   \        RTR,           24       R# \        Y4      '       g   R# \        TP                  R
4      ;'       g    TP                  ;'       g    R4      R3#   \         d   p\        RT 24        Rp?R# Rp?ii ; i)é    )r|  r}  r  z$ delegates Hermes turns to a local `r  z
` process.r€  r~  z(not found)r�  r_   r(   r‚  NÚ	availablerd  r  )rc   r|  r}  r   r"  r�   Úprocess_commandr_   rÌ   r*  r,  r   )rs   rë  r|  r}  r:  rå   rß   Úprobes   &&      r"   Ú_plugin_flow_external_processr4  T  sl  € ßsÙ1°+Ó>€FÜˆ2ˆg×"Ñ"×1Ð1 kÐ2Ð2VÐW]×WaÑWaÐbkÓWl÷  XHð  XHÐpw÷  qHñ  qHð  WIð  ISð  
TØ�v—z‘zÐ"4Ó5×_Ð_¸¿¹ÀIÓ9N×_Ð_ÐR_Ð`Ð	aØ˜fŸj™j¨Ó4×HÐH¸×8HÑ8HÐIÐ	JÈBôPðÙ=¸kÓJˆð
 × Ñ Ó"€EØÒØ�[×!Ô!Ü�6˜% �/Ð*Ð+Ô,ÙÜ+¨G×;Ò;ÙÜˆu�y‰y˜Ó$×>Ð>¨×(8Ñ(8×>Ð>¸BÓ?ÀÐCÐCøô ô Üˆv�c�Uˆ^ÔÝûðús   Â9E ÅE,ÅE'Å'E,c               ó    € V ^8„  d   QhRRRR/# r.  r    )r!   s   "r"   r#   r#   j  s   € ÷ Iñ I Cð IÐ5Kñ Ir$   c                óF  € ^ RI Hp ^ RIHp V! V 4      pVP	                  R4      '       gd   V! V R4      p\        RVP                  ;'       g    T  R2RV'       d   VP                  MVP	                  R4      ;'       g    R	V  R
2 24       R# ^ RIH	p V! V 4      P                  4       pV'       d   VP                  MR;'       g0    VP	                  R4      ;'       g    VP                  ;'       g    Rp\        V4      V'       d   VP                  MR;'       g    R3# )r0  )Úget_auth_status)Ú!plugin_missing_auth_handler_errorr  Úaddu     âš  Not signed in to r  r  ÚhintzRun `hermes auth add z` to sign in.N)Ú	load_poolr(   r_   )rc   r7  Ú hermes_cli.auth_plugin_providersr8  r�   r   r"  ÚcodeÚagent.credential_poolr;  ÚselectÚruntime_base_urlr_   r   Úruntime_api_key)	rs   rë  r7  r8  r:  Úmissingr;  Úentryr_   s	   &&       r"   Ú_plugin_flow_oauthrD  j  sô   € Ý/ÝRÙ˜[Ó)€FØ�:‰:�k×"Ò"Ù3°KÀÓGˆÜÐ& w×';Ñ';×'JÐ'J¸{Ð&KÈ1ÐMØ§'�'—,’,¨v¯z©z¸&Ó/A×/wÐ/wÐG\Ð]hÐ\iÐivÐEwÐxÐyô	{áÝ/Ù�kÓ"×)Ñ)Ó+€Eß*/�×&Ò&°R×lÐl¸F¿J¹JÀzÓ<R×lÐlÐV]×VfÑVf×lÐlÐjl€HÜˆx‹=·E˜5×0Ò0¸r×HÐHÀbÐHÐHr$   Úexternal_processÚoauth_device_codeÚoauth_externalc               ó    € V ^8„  d   QhRRRR/# )r   rs   r   r   r0   r    )r!   s   "r"   r#   r#   €  s   € ÷ Qñ Q°#ð Q¸$ñ Qr$   c                ó\   € ^ RI Hp V! V 4      pVRJ;'       d    VP                  \        9   # )z`True when *provider_id* is a registered profile whose auth_type the generic plugin flow handles.©Úplugin_profileN)r<  rK  rN   Ú_PLUGIN_FLOW_CREDENTIALS)rs   rK  rë  s   &  r"   Ú _is_profile_plugin_flow_providerrM  €  s.   € å?Ù˜[Ó)€GØ˜$Ð×PÐP 7×#4Ñ#4Ô8PÑ#PÐPr$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rK   r   r_   r   z'tuple[list[str] | None, dict[str, str]]r    )r!   s   "r"   r#   r#   ‡  s"   € ÷ ñ ¨Sð ¸Cð ÐDkñ r$   c           	     ó²  € \         P                  ! \        4      ;_uu_ 4        V P                  4       pV'       dŠ   \	        RV P
                  ;'       g    V P                   R2R4       V Uu. uF  qDR,          NK  	  upV Uu/ uF,  qDP                  R4      '       g   K  VR,          VR,          bK.  	  up3uuRRR4       #  RRR4       Rp\         P                  ! \        4      ;_uu_ 4        T P                  T;'       g    RT;'       g    RR7      pRRR4       V/ 3# u upi u upi   + '       g   i     Lr; i  + '       g   i     T/ 3# ; i)z»``(live ids, {id: note})``. ``discover_models()`` (the account's own annotated picker, e.g.
``usage credits``) wins when the profile implements it; otherwise the plain ``fetch_models()``.z  Models below come from your z	 account.r(   rL   ÚnoteNrÖ  )	r÷   rø   rÌ   Údiscover_modelsr   r"  rM   r�   Úfetch_models)rë  rK   r_   rš   ÚrÚlives   &&&   r"   Ú_plugin_flow_live_rowsrU  ‡  s  € ô 
×	Ò	œY×	'Õ	'Ø×&Ñ&Ó(ˆßÜÐ1°'×2FÑ2F×2VÐ2VÈ'Ï,É,Ð1WÐW`ÐaÐceÔfÙ%)Ó*¡T �d—G�G¡TÑ*ÉÓ,_ÉÀA×QVÑQVÐW]×Q^Ô-?¨Q¨t­W°a¸µiÒ-?ÉÑ,_Ð_÷	 
(Ò	'à÷ 
(ð
 €DÜ	×	Ò	œY×	'Õ	'Ø×#Ñ#¨G¯O¨O°tÀh×FVÐFVÐRVÐ#ÓWˆ÷ 
(à�ˆ8€Oùò	 +ùÒ,_÷	 
(×	'ú÷ 
(Ö	'à�ˆ8€OúsG   £1D0ÁD0Á.D&Á?D0ÂD+
Â"D+
Â7D0Ã2EÄEÄ&
D0Ä0E 	ÅE	c           
     óp  € ^ RI Hp ^ RIHp ? V! V4      p\        VP
                  ,          ! W4      pVf   R# Vw  rx\        WXV4      w  ršV! WV	4      ;'       g    . p\        VRW!WxV
R7      p\        YÁRT RVP                  ;'       g    T R2T;'       g    RVP                  ;'       g    RR	7       R# )
u¾   Generic ``hermes model`` flow for a registered plugin profile: credential step by auth_type,
catalog via ``merge_profile_catalog`` (live ``fetch_models()`` âŠ• ``fallback_models``), persist.rJ  )Úmerge_profile_catalogNrs  )rW   rY   rZ   r[   Únotesr\   rt  rr  r^   )r<  rK  rd   rW  rL  rN   rU  r   r   r"  r`   )rf   rs   rW   rK  rW  rë  rå   r_   rK   rT  rX  rC   rl   s   &&&          r"   Ú_model_flow_plugin_providerrY  •  sÂ   € õ @Ý7ØÙ˜[Ó)€GÜ$ W×%6Ñ%6Ö7¸ÓM€EØ‚}ÙØÑ€HÜ(¨¸8ÓD�K€DÙ& {¸TÓB×HÐHÀb€JÜ$Ø�N°-Ø!À%ôI€Hô �(Ð+AÀ(ÀÈ6ÐRY×RfÑRf×RuÐRuÐjuÐQvÐvwÐ)xØ#×+Ð+ t°g×6FÑ6F×6NÐ6NÈ$÷Pr$   )r(   rö   )r(   N)r(   uW   â�Œ This Google API key is on the free tier (<= 250 requests/day for gemini-2.5-flash).z[   Hermes typically makes 3-10 API calls per user turn (tool iterations + auxiliary tasks),zO   so the free tier is exhausted after a handful of messages and cannot sustainz   an agent session.r(   zX   To use Gemini with Hermes, enable billing on your Google Cloud project and regeneratezK   the key in a billing-enabled project: https://aistudio.google.com/apikeyr(   zY   Alternatives with workable free usage: DeepSeek, OpenRouter (free models), Groq, Nous.r(   z*Not saving Gemini as the default provider.)LÚ__doc__Ú
__future__r   r÷   r´   r*   r)   r   Ú#hermes_cli.model_setup_flows_commonr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Ú#hermes_cli.model_setup_flows_customr   r   Ú"hermes_cli.model_setup_flows_azurer   Ú$hermes_cli.model_setup_flows_bedrockr   r,   r;   rD   rm   rx   r¨   r¸   rÕ   rã   rï   r  r$  r.  r;  rE  rK  rW  rk  rz  r†  r�  r§  r½  rÊ  rÑ  rÓ  rÙ  rÜ  rà  rç  rì  rþ  r  r  r,  r4  rD  rL  rM  rU  rY  r    r$   r"   Ú<module>r`     st  ðñõ #ã Û Û 	å >÷:÷ :÷ :÷ :÷ :ñ :÷ ]Ý HÝ DõFðÐ]a÷ õCô
Mô0`ô2>õBeõ.Yôbõ0ô@R'ôjUñDp¸Tõ pô4Bô4Fõ8õ
$õ,ô^%DôP"HôJ ?ôF6&ôr3Jõl ð62Ð õò&
òòð" Ð ØÐ(ØˆnðÐ õ)ôXC'õLô44Fõzõ:Dõ,Ið  Ð5ØÐ+ØÐ(ðÐ õQõöPr$   