
    )j                       d Z ddlmZ ddlZddlZddlZddZdd	Zdd
ZddZ	ddddZ
ddZddZddZd ZddZd ZddZddZddZddZddZddZddZddZdS )uw  Per-provider model-selection wizard flows for ``hermes setup`` / ``hermes model``.

Extracted from ``hermes_cli/main.py`` as part of the god-file decomposition
campaign (``~/.hermes/plans/god-file-decomposition.md``, Phase 2 — splitting
main.py handler/flow bodies out of the module). These 18 ``_model_flow_*``
functions are the interactive provider-setup branches dispatched by
``select_provider_and_model`` (which stays in main.py).

Behavior-neutral: each function is lifted verbatim. ``select_provider_and_model``
in main.py re-imports them (``from hermes_cli.model_setup_flows import *``-style
explicit import) so existing call sites — and test monkeypatches that target
``hermes_cli.main._model_flow_*`` — keep resolving against main.py's namespace.

main.py-internal helpers the flows call (``_prompt_api_key``, ``_save_custom_provider``,
the reasoning-effort/stepfun/qwen helpers, ``_run_anthropic_oauth_flow``, …) are
imported lazily inside the flows (``from hermes_cli.main import ...`` resolves at
call time, when main.py is fully loaded) so this module never imports
``hermes_cli.main`` at import time -> no import cycle.
    )annotationsNtitlestrreturnc           	        g d}	 ddl m}  || |d          }|dk    rt                       d|         S n# t          $ r Y nw xY wt          |            t	          |d          D ]'\  }}|dk    rdnd}t          d| d| d	|            (t                       	 t          d
                                          }n# t          t          f$ r d}Y nw xY w|dk    rdS |dk    rdS dS )zPrompt for reuse / reauthenticate / cancel with the standard radio UI.

    Returns one of ``"use"``, ``"reauth"``, ``"cancel"``. Falls back to a
    numbered prompt when curses is unavailable (piped stdin, non-TTY).
    )zUse existing credentialsz Reauthenticate (new OAuth login)Cancelr   )_curses_prompt_choice)usereauthcancel   u   →   .   Choice [1/2/3]: 12r   3r   r
   )	hermes_cli.setupr	   print	Exception	enumerateinputstripKeyboardInterruptEOFError)r   choicesr	   idxilabelmarkerchoices           A/home/ubuntu/.hermes/hermes-agent/hermes_cli/model_setup_flows.py_prompt_auth_credentials_choicer$      s]     G
::::::##E7A66!88GGG.s33      
%LLLgq)) * *5q&&c(6((A(((())))	GGG+,,2244x(    }}x}}x5s!   .6 
AA!B> >CC c                   ddl m} ddlm} ddlm}m}m}m} ddl	m
}  |dddd	
          }	 |d          pd}
|
st          d           t                        ||	|
d          \  }}|rdS ddlm}m}  |d          } |dd          } ||||d||p|
          }|r ||           ddl	m}m}  |            }|                    d          }t%          |t&                    s|rd|ini }||d<   d|d<   ||d<   d|d<    ||            |             t          d| d           dS t          d           dS )z5OpenRouter provider: ensure API key, then pick model.r   _prompt_api_key)OPENROUTER_BASE_URL)ProviderConfig_prompt_model_selection_save_model_choicedeactivate_provider)get_env_value
openrouter
OpenRouterapi_key)OPENROUTER_API_KEY)idname	auth_typeapi_key_env_varsr2   r%   z&Get one at: https://openrouter.ai/keysprovider_idN)	model_idsget_pricing_for_providerTforce_refresh)current_modelpricingconfirm_providerconfirm_base_urlconfirm_api_keyload_configsave_configmodeldefaultproviderbase_urlchat_completionsapi_modeDefault model set to: z (via OpenRouter)
No change.)hermes_cli.mainr(   hermes_constantsr)   hermes_cli.authr*   r+   r,   r-   hermes_cli.configr.   r   hermes_cli.modelsr9   r:   rC   rD   get
isinstancedict)configr=   r(   r)   r*   r+   r,   r-   r.   pconfigexisting_key	_resolvedabortr9   r:   openrouter_modelsr>   selectedrC   rD   cfgrE   s                         r#   _model_flow_openrouterr]   B   sZ   //////444444            0///// n0	  G !=!566<"L 6777&w,WWWIu EEEEEEEE!	555 '&|4HHHG&&#%,!1\  H  8$$$ 	?>>>>>>>kmm  %&& 	!*/7Y&&RE CL(j/j.jCBxBBBCCCCCl    c                z   ddl m}m}m}m}m}m}m}	m}
m	} ddl
m}m}m}m} ddlm}  |d          }|r|                    d          sQt%          d           t%                       	 t'          j        t+          |dd	          t+          |d
d	          t+          |dd	          t+          |dd	          t-          t+          |dd                    t+          |dd	          pdt+          |dd	          t-          t+          |dd                              } |
||d                    	  |            pi } ||           n# t.          $ r Y nw xY wnE# t0          $ r t%          d           Y d	S t.          $ r}t%          d|            Y d	}~d	S d	}~ww xY wd	S ddlm}m}m}m}m}m}  |            }|st%          d           d	S 	  |            }n# t.          $ r}tA          ||          o|j!        }tA          ||          r |	|          ntE          |          }|rt%          d|            t%          d           	 t'          j        d	d	d	d	ddd	d          } |
||d                    n)# t.          $ r}t%          d|            Y d	}~nd	}~ww xY wY d	}~d	S t%          d|            Y d	}~d	S d	}~ww xY w |d          }  |d          }!|!s"	  |d          }"|"r|"}n# t.          $ r Y nw xY wd}#	  |d          }$|$r|$                    d d          }#n# t.          $ r Y nw xY wg }%d}&|!rY	 dd!l#m$}'m%}(  |(d          }) |'|)d"#          pd}&n# t.          $ r d}&Y nw xY w ||| |#          \  }}  ||| d$          \  }}%n ||| |#          \  }} |s|%st%          d%           d	S |!rG|sEt%          d&           |%r2dd'l m&}* |#p|*'                    d(          }+t%          |&pd)|+ d*           d	S t%          d+tQ          |           d,            |||| |%|#|&d|                    d-d          |                    d.d          /	  	        },|,rK ||,           |                    d-d          }- |d|-           |                     d0          }.tA          |.tR                    rtS          |.          }/nBtA          |.tD                    r+|.*                                rd1|.*                                i}/ni }/d|/d2<   |,|/d1<   |-r-|-*                                r|-'                    d(          |/d-<   n|/+                    d-d	           |/| d0<    |d3          r |d3d            |d4d            ||            t%          d5|, d6            ||            d	S t%          d7           d	S )8z8Nous Portal provider: ensure logged in, then pick model.r   )	get_provider_auth_stater+   r,   _update_config_for_provider resolve_nous_runtime_credentials	AuthErrorformat_auth_error_login_nousPROVIDER_REGISTRY)r.   rC   rD   save_env_value)prompt_enable_tool_gatewaynousaccess_tokenz.Not logged into Nous Portal. Starting login...
portal_urlNinference_url	client_idscope
no_browserFtimeout      .@	ca_bundleinsecure)rk   rl   rm   rn   ro   rp   rr   rs   Login cancelled or failed.Login failed: )get_curated_nous_model_idsr:   check_nous_free_tierpartition_nous_models_by_tier&union_with_portal_free_recommendations&union_with_portal_paid_recommendationsz,No curated models available for Nous Portal.zSession expired: z&Re-authenticating with Nous Portal...
zRe-login failed: zCould not verify credentials: T)force_freshr;   r%   portal_base_url)&format_nous_portal_entitlement_messageget_nous_portal_account_infozpaid Nous models)
capability)	free_tierz4No models available for Nous Portal after filtering.z#No free models currently available.)DEFAULT_NOUS_PORTAL_URL/zUpgrade at z to access paid models.zShowing =    curated models — use "Enter custom model name" for others.rH   r1   )r=   r>   unavailable_modelsrk   unavailable_messager?   r@   rA   rE   rF   rG   OPENAI_BASE_URLOPENAI_API_KEYrK   z (via Nous Portal)rL   ),rO   r`   r+   r,   ra   rb   rc   rd   re   rf   rP   r.   rC   rD   rg   hermes_cli.nous_subscriptionrh   rR   r   argparse	Namespacegetattrboolr   
SystemExitrQ   rv   r:   rw   rx   ry   rz   rS   relogin_requiredr   hermes_cli.nous_accountr}   r~   r   rstriplenrT   r   pop)0rU   r=   argsr`   r+   r,   ra   rb   rc   rd   re   rf   r.   rC   rD   rg   rh   state	mock_args
_refreshedexcrv   r:   rw   rx   ry   rz   r9   credsreloginmsg	login_excr>   r   refreshed_creds_nous_portal_url_nous_stater   r   r}   r~   _account_infor   _urlr[   rl   current_model_cfg	model_cfgs0                                                   r#   _model_flow_nousr      s"	   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
            HGGGGG##F++E 		.11 >???	 *"4t<<%dOTBB!$T::dGT22lE B BCCi66>$!$T::gdJ>>??	 	 	I K	#4V#<===([]]0b
**:6666    	 	 	.///FF 	 	 	(3(()))FFFFF	 	
                +*,,I <===0022   S),,E1E(23	(B(BP$$$C 	+c++,,,;<<<7$.#"&"$ ""	 	 		 I'8'@AAAA 7 7 75)55666666667FFFFF4s44555-2 '&v..G %$666I 
		>>"  O  (' 	 	 	 D	 --f55 	F*/@"EE    %' 
	%       
 98TJJJM66!1        	% 	% 	%"$	%CCw 0
 
	7 )F(Ew$)
 )
 )
%	%% DCw 0
 
	7  / DEEE  3444 	V??????$?(?GGLLD%T)Tt)T)T)TUUU	`3y>>```   '&#-#/:r22		)R00
 
 
H  8$$$		*b11##FM:::"JJw//'.. 	.//II)3// 	4E4K4K4M4M 	"$5$;$;$=$=>III &	*'	) 	,]0022 	,$1$8$8$=$=Ij!!MM*d+++#w=*++ 	1N,b111N+R000FCxCCCDDD""6*****ls   *CE -E E 
EE EE F2	F;FF
G 
K  A$J;.I43J;4
J>JJ;JJ;#J;;K K. .
K;:K;#L% %
L21L2<#M   M/.M/c                ,   ddl m}m}m}m}m}m}m} ddlm	}	  |            }
|

                    d          rt          d           t                       t          d          }|dk    rt          d           t                       	 t          j                    } |||d	         d
           nE# t          $ r t          d           Y dS t           $ r}t          d|            Y d}~dS d}~ww xY w |            }
|

                    d          st          d           dS n|dk    rdS nt          d           t                       	 t          j                    } |||d	                    nE# t          $ r t          d           Y dS t           $ r}t          d|            Y d}~dS d}~ww xY wd}	  |            }|
                    d          r|
                    d          }n# t           $ r Y nw xY w|s7	 ddl m}  |            }|
                    d          }n# t           $ r Y nw xY w |	|          } |||d	||pd          }|r, ||            |d	|           t          d| d           dS t          d           dS )z9OpenAI Codex provider: ensure logged in, then pick model.r   )get_codex_auth_statusr+   r,   ra   _login_openai_codexrf   DEFAULT_CODEX_BASE_URL)get_codex_model_ids	logged_inu     OpenAI Codex credentials: ✓zOpenAI Codex credentials:r   z&Starting a fresh OpenAI Codex login...zopenai-codexTforce_new_loginrt   Nru   zLogin failed.r   z/Not logged into OpenAI Codex. Starting login...r1   )!resolve_codex_runtime_credentials)rj   r%   r=   r?   r@   rA   rK   z (via OpenAI Codex)rL   )rO   r   r+   r,   ra   r   rf   r   hermes_cli.codex_modelsr   rR   r   r$   r   r   r   r   r   )rU   r=   r   r+   r,   ra   r   rf   r   r   statusr"   r   r   _codex_token_codex_statusr   _codex_credscodex_modelsr[   s                       r#   _model_flow_openai_codexr   a  s                     <;;;;;""$$Fzz+ &/00001LMMX:;;;GGG$.00	##%n5$(    
    2333   ,s,,--- +*,,F::k** o&&& xF   	?@@@	 *,,I	+<^+LMMMM 	 	 	.///FF 	 	 	(3(()))FFFFF	 L--//[)) 	8(,,Y77L    	IIIIII<<>>L'++I66LL 	 	 	D	 '&LAAAL&&#'/$*  H  8$$$##N4JKKKDxDDDEEEEEls`   'B0 0C2	C2C--C2%E3 3F5	F5F00F5;4G0 0
G=<G=%H) )
H65H6)r   c          
        ddl m}m}m}m}m}m}m}	m}
 ddl	m
}  |            }|                    d          rt          d           t                       t          d          }|dk    rt          d           t                       	 t          j        t!          t#          |d	d
                    t!          t#          |dd
                    t#          |dd                    } |||
d         d           n"# t$          $ r t          d           Y dS t&          $ r}t          d|            Y d}~dS d}~ww xY w|dk    rdS nt          d           t                       	 t          j        t!          t#          |d	d
                    t!          t#          |dd
                    t#          |dd                    } |||
d                    nE# t$          $ r t          d           Y dS t&          $ r}t          d|            Y d}~dS d}~ww xY w|	}	  |            }|                    d          pd                                                    d          p|}n# t&          $ r Y nw xY wt-          |                    d          p|                    d          pg           } |||p|r|d         nd          }|r, ||            |d|           t          d| d           dS t          d           dS )zRxAI Grok OAuth (SuperGrok / Premium+) provider: ensure logged in, then pick model.r   )get_xai_oauth_auth_statusr+   r,   ra   %resolve_xai_oauth_runtime_credentials_login_xai_oauthDEFAULT_XAI_OAUTH_BASE_URLrf   _PROVIDER_MODELSr   u8     xAI Grok OAuth (SuperGrok / Premium+) credentials: ✓z2xAI Grok OAuth (SuperGrok / Premium+) credentials:r   z#Starting a fresh xAI OAuth login...manual_pasteFro   rp   N)r   ro   rp   z	xai-oauthTr   rt   ru   r   zHNot logged into xAI Grok OAuth (SuperGrok / Premium+). Starting login...rH   r%   r   xaizgrok-4.3)r=   rK   u.    (via xAI Grok OAuth — SuperGrok / Premium+)rL   )rO   r   r+   r,   ra   r   r   r   rf   rQ   r   rR   r   r$   r   r   r   r   r   r   r   r   list)_configr=   r   r   r+   r,   ra   r   r   r   rf   r   r   r"   r   r   rH   r   modelsr[   s                       r#   _model_flow_xai_oauthr     s(   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 322222&&((Fzz+ 0HIII0@
 
 X7888GGG
 %.!%gdNE&J&J!K!K#GD,$F$FGG#D)T::  	
 ! %k2$(    
    2333   ,s,,--- xF   	XYYY	 *!'$"F"FGGlE B BCCi66  I
 Y(9+(FGGGG 	 	 	.///FF 	 	 	(3(()))FFFFF	 *H5577IIj))/R6688??DDP    "&&{33X7G7K7KE7R7RXVXYYF&&v]=s\bOrvVWyyhrtttH 8$$$##K:::_x___`````lsQ   A2C? ?E	E$D<<E+A0G H8	HHH$AI- -
I:9I:c                   ddl m} ddlm}m}m}m}m}m} ddl	m
}	  |            }
|
                    d          st          d           t          d           |
                    d          }|rt          d	|            |
                    d
          r%t          d|
                    d
                      dS d}	  |d          } |	|d         |d                   }n# t          $ r Y nw xY w|st          |          }|p|r|d         nd} |||d|          }|r, ||            |d|           t          d| d           dS t          d           dS )zAQwen OAuth provider: reuse local Qwen CLI login, then pick model.r   )_DEFAULT_QWEN_PORTAL_MODELS)get_qwen_auth_status resolve_qwen_runtime_credentialsr+   r,   ra   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_expiringr1   rH   zqwen3-coder-plusz
qwen-oauthr=   r?   r@   rK   z (via Qwen OAuth)rL   )rM   r   rO   r   r   r+   r,   ra   r   rQ   r   rR   r   r   r   )r   r=   r   r   r   r+   r,   ra   r   r   r   r   r   r   rF   r[   s                   r#   _model_flow_qwen_oauthr     s5   ;;;;;;                322222!!##F::k"" /000)***JJ{++	 	=;	;;<<<::g 	31FJJw//11222 F00TJJJ!!%	"2E*4EFF    3122LV Kq		9KG&&%.	  H  8$$$##L2GHHHBxBBBCCCCCls   $C' '
C43C4c           
     B   ddl m}m}m}m}m}m}m}	m}
m	}  |d          }|r|
                    d          st          d           t                       	 t          j        t          |dd          pdt          t          |d	d
                    t          |dd          pd          } |
||d                    nE# t           $ r t          d           Y dS t"          $ r}t          d|            Y d}~dS d}~ww xY w	  |            }n+# |$ r#}t           |	|                     Y d}~dS d}~ww xY wddlm} |
                    dg           } |||d|d                   }|sdS  ||            |d|d                    t          d|            dS )z:MiniMax OAuth provider: ensure logged in, then pick model.r   )	r`   r+   r,   ra   )resolve_minimax_oauth_runtime_credentialsrc   rd   _login_minimax_oauthrf   zminimax-oauthrj   z0Not logged into MiniMax. Starting OAuth login...regionNglobalro   Frp   rq   )r   ro   rp   rt   ru   r   rH   )r?   r@   u   ✓ Using MiniMax model: )rO   r`   r+   r,   ra   r   rc   rd   r   rf   rR   r   r   r   r   r   r   r   rQ   r   )rU   r=   r   r`   r+   r,   ra   r   rc   rd   r   rf   r   r   r   r   r   r9   r[   s                      r#   _model_flow_minimax_oauthr   @  s   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 $#O44E 		.11 @AAA	 *tXt44@lE B BCCi66>$  I
 ! ,=o,NOOOO 	 	 	.///FF 	 	 	(3(()))FFFFF	99;;   $$%%% 322222 $$_b99I&&(z*	  H  x   z1BCCC	
3
3
344444s7   A'B? ?D	D$C<<D
D D8D33D8c                x   ddl m}m}m}m}m}m} ddlm} t                       t          d           t          d           t          d           t          d           t                       	 t          d                                                                          }	n'# t          t          f$ r t          d	           Y d
S w xY w|	dvrt          d	           d
S  |            }
|
                    d          sK	 ddlm}m}  |            } |d|           n*# t&          $ r}t          d|            Y d
}~d
S d
}~ww xY w	  |d          }|                    dd          }|rt          d|            nt          d           n*# t&          $ r}t          d|            Y d
}~d
S d
}~ww xY wt)          |                    d          pg           }|p|r|d         nd} |||d|          }|r, ||            |d|           t          d| d           d
S t          d           d
S )u  Google Gemini OAuth (PKCE) via Cloud Code Assist — supports free AND paid tiers.

    Flow:
      1. Show upfront warning about Google's ToS stance (per opencode-gemini-auth).
      2. If creds missing, run PKCE browser OAuth via agent.google_oauth.
      3. Resolve project context (env -> config -> auto-discover -> free tier).
      4. Prompt user to pick a model.
      5. Save to ~/.hermes/config.yaml.
    r   )!DEFAULT_GEMINI_CLOUDCODE_BASE_URLget_gemini_oauth_auth_status(resolve_gemini_oauth_runtime_credentialsr+   r,   ra   r   uH   ⚠  Google considers using the Gemini CLI OAuth client with third-partyz@   software a policy violation. Some users have reported accountzC   restrictions. You can use your own API key via 'gemini' providerz"   for the lowest-risk experience.z"Continue with OAuth login? [y/N]: 
Cancelled.N>   yyesr   )resolve_project_id_from_envstart_oauth_flowT)force_relogin
project_idzOAuth login failed: Fr;   r   r%   z  Using GCP project: uT     No GCP project configured — free tier will be auto-provisioned on first request.z&Failed to resolve Gemini credentials: zgoogle-gemini-clizgemini-3-flash-previewr   rK   z( (via Google Gemini OAuth / Code Assist)rL   )rO   r   r   r   r+   r,   ra   rQ   r   r   r   r   lowerr   r   rR   agent.google_oauthr   r   r   r   )r   r=   r   r   r   r+   r,   ra   r   proceedr   r   r   env_projectr   r   r   r   rF   r[   s                       r#   _model_flow_google_gemini_clir   u  s_                   322222	GGG	
TUUU	
LMMM	
OPPP	
.///	GGG<==CCEEKKMM'(   l l""l))++F::k"" 	XXXXXXXX5577K4KHHHHH 	 	 	...///FFFFF	
88uMMMYY|R00
 	6*667777f      <s<<=== "&&':;;ArBBFRV Qq		9QG&&,:	  H  	8$$$##!B	
 	
 	
 	WXWWW	
 	
 	
 	
 	
 	lsC   03B$ $ CC D   
E*EEAF 
F9F44F9c           
       % ddl m}m}m} ddlm}m} ddlm}m	}m
} ddlm}	  |d          pd}
 |d          pd}t          d	           |
rt          d
|
            |rt          d|dd          d           t                       	 t          d|
pd d                                          } |	d|r|dd         dz   nd d                                          }n'# t           t"          f$ r t          d           Y dS w xY w|s|
st          d           dS |p|
}|                    d          st          d| d           dS |p|}|                    d                                          %t+          %fddD                       }|r%                    d          st                       t          d           t          d           t          d|                    d           d           	 t          d                                                                           }n# t           t"          f$ r d!}Y nw xY w|d"v r.|                    d          dz   }|r|}t          d#|            t                       dd$lm}  |||          }|                    d%          r;|                    d&          r&t          d'|d&          d(           |d&         }|r|}n|                    d)          Lt          d*|                    d+           d,t5          |                    d)          pg            d-           n}t          d.|                    d+           d/           |                    d0          rB|d0         }|                    d          rt          d1|            nt          d2|            |                     d3          }d}t7          |t8                    r6t;          |                    d4          pd                                          } |||5          }|rt          d6|            nt          d7           d}|                    d)          pg }	 t5          |          d8k    r{t          d9|d                     t          d:                                                                          }|d"v r
|d         }nt          d;                                          }nt5          |          d8k    rt          d<           t=          |d8          D ]\  }}t          d=| d>|            t          d?t5          |           d@                                          }|                                rCd8tA          |          cxk    rt5          |          k    rn n|tA          |          d8z
           }n&|r|}n!t          d;                                          }t          dA                                          } ||          }t          dB| d                                          p|} n'# t           t"          f$ r t          d           Y dS w xY wd}!|rz	 tA          |!                    dCd          !                    dDdE          !                    dFdE                    }!|!dk    rd}!n%# tD          $ r t          dG| dH           d}!Y nw xY w|r ||            |            }"|"                    d3          }#t7          |#t8                    s|#rdI|#ini }#|#|"d3<   dJ|#dK<   ||#dL<   |r||#dM<   |r||#d4<   n|##                    d4d            ||"            |             t9          |#          | d3<   t          dN| dO| dP           n|s|r
 |             |                     d3          }$t7          |$t8                    s|$rdI|$ini }$dJ|$dK<   ||$dL<   |r||$dM<   |r||$d4<   n|$#                    d4d           |$| d3<   t          dQ            ||||pd|!| |R           dS )SzCustom endpoint: collect URL, API key, and model name.

    Automatically saves the endpoint to ``custom_providers`` in config.yaml
    so it appears in the provider menu on subsequent runs.
    r   )_auto_provider_name!_prompt_custom_api_mode_selection_save_custom_providerr,   r-   )r.   rC   rD   masked_secret_promptr   r%   r   z0Custom OpenAI-compatible endpoint configuration:z  Current URL: z  Current key: N   ...zAPI base URL [ze.g. https://api.example.com/v1]: 	API key [optional
Cancelled.zNo URL provided. Cancelled.zhttp://zhttps://Invalid URL: & (must start with http:// or https://)r   c              3      K   | ]}|v V  	d S N ).0h
_url_lowers     r#   	<genexpr>z%_model_flow_custom.<locals>.<genexpr>  s;         	
Z     r^   )	localhostz	127.0.0.1z0.0.0.0z:11434z:8080z:5000z/v1z+  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>   r%   r   r   z  Updated URL: )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.r   z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_urlz8  If this server expects /v1 in the path, try base URL: z-  If /v1 should not be in the base URL, try: rE   rJ   )current_api_modez  API mode: z  API mode: auto-detectr   z  Detected model: z  Use this model? [Y/n]: z&Model name (e.g. gpt-4, llama-3-70b): z  Available models:z    r   z  Select model [1-z] or type name: z8Context length in tokens [leave blank for auto-detect]: zDisplay name [,k000KzInvalid context length: u    — will auto-detect.rF   customrG   rH   r1   rK    (via )zFEndpoint saved. Use `/model` in chat or `hermes model` to set a model.)context_lengthr4   rJ   )$rM   r   r   r   rO   r,   r-   rP   r.   rC   rD   hermes_cli.secret_promptr   r   r   r   r   r   
startswithr   r   anyendswithrQ   r   rR   r   rS   rT   r   r   isdigitintreplace
ValueErrorr   )&rU   r   r   r   r,   r-   r.   rC   rD   r   current_urlcurrent_keyrH   r1   effective_urleffective_key_looks_local_add_v1r   probe	suggestedr   r  rJ   
model_namedetected_modelsconfirmr   mpickcontext_length_strdefault_namedisplay_namer  r\   rE   _caller_modelr   s&                                        @r#   _model_flow_customr%    s
    nmmmmmmmmmGGGGGGGGIIIIIIIIII======- 1228bK- 0117RK	
<=== /---... 64BQB444555	GGG	R[M,MRRR
 

%'' 	 '&S;NBQB%//JSSS
 

%'' 	 x(   n  K +,,, +M##$;<< SmSSSTTT*{M
 %%c**0022J    R    L  J//66 <===QRRR6,,S11666777	0117799??AAGG!8, 	 	 	GGG	&&&)0055=M )(3M33444222222]M::Eyy!! Seii0C&D&D SS>Q8R S S S	
 	
 	
 12 	%$H	8			(CUYY|%<%< C CEIIh''-2..C C C	
 	
 	
 	

 	*599\;R;R * * *	
 	
 	
 99)** 	S23I!!%(( SZyZZ    QiQQRRR 

7++#T** P044Z@@FBGGMMOO00)  H  )'X''(((('((( Jii))/RO1$$;q'9;;<<<788>>@@FFHHG***,Q/

"#KLLRRTT

!!A%%'(((!/155 ' '1oQoo!oo&&&&KS%9%9KKK egg  ||~~ "!s4yy"H"H"H"HC4H4H"H"H"H"H"H,SYY];

 "!
GHHNNPPJ"F
 

%'' 	
 +*=99?l???@@FFHHXLx(   n N "
	" "**333e$$e$$ N
 ""!% 	" 	" 	"W-?WWWXXX!NNN	"  ,X:&&& kmm  %&& 	!*/7Y&&RE CL$j)j 	-,E) 	( (E*IIj$'''C u++wIzIIIIIJJJJ 	"w 	"!!! 

7++-.. 	P:GOY66RM$,j!$1j! 	5'4M)$ 	0(0M*%%j$///'wVWWW b%     sK   AC% % D	D	?3H3 3I	I	9GY  Y;:Y;A[ [98[9c                @   ddl m}m} ddlm}m}m}m} ddlm	} | 
                    di           }	t          |	t                    r|	
                    d          dk    rt          |	
                    dd	          pd	          }
t          |	
                    d
d	          pd	          }t          |	
                    d          pd                                                                          pd}|	
                    d          pi }t          |t                    r|ni }nd	}
d	}d}i } |d          pd	}t!                       t!          d           t!          d           t!                       t!          d           t!          d           t!          d           t!          d           t!                       |
rt!          d|
            |r|dk    rdnd}t!          d|            |dk    rt!          d           n|rt!          d|dd          d           t!                       	 |
pd }t#          d!| d"                                          }n'# t$          t&          f$ r t!          d#           Y dS w xY w|p|
                    d$          }|st!          d%           dS |                    d&          st!          d'| d(           dS t!                       t!          d)           t!          d*           t!          d+           t!          d,           t!          d-           	 |dk    rd.nd/}t#          d0| d1                                          p|}n'# t$          t&          f$ r t!          d#           Y dS w xY w|d.k    }|rdnd}d	}i }d}d	}|rZ	 dd2lm}m}m}m}m}  nJ# t8          $ r=}!t!                       t!          d3|!            t!          d4           d5}d}Y d}!~!nd}!~!ww xY w|r	t!                        |             st!          d6           t!          d7           t          |
                    d8          pd	                                          }"|"p|}i }|"r|"|d8<   t!                       t!          d9            ||:          }# ||#d;<          }$|$
                    d=          rG|$
                    d>          pg }%|%rd?                    |%          nd@}&t!          dA|& dB| dC           n|$
                    dD          pdE}'|$
                    dF          pdG}(t!          dH|'            t!          dI|(            	 t#          dJ                                                                          })n'# t$          t&          f$ r t!          d#           Y dS w xY w|)r|)dKvrt!          dL           dS 	  ||#M          }n# t<          $ r}!t!          dN|!            d}Y d}!~!nd}!~!ww xY wt!                       ddOlm }* 	  |*dP|r|dd         dQz   ndR d"                                          }+n'# t$          t&          f$ r t!          d#           Y dS w xY w|+p|}|st!          dS           dS t!                       t!          dT           |!                    |||U          },tE          |,j#                  }-|,j$        pd	}.|.r^|.dk    rdnd}/t!          dV|/            |,j%        rt!          dW|,j%         dC           |-r t!          dXtM          |-           dY           nt!          dZ|,j%                    t!                       t!          d[           t!          d\           t!          d]           t!          d^           t!          d_           	 |d`k    rd.nd/}0t#          da|0 d1                                          p|0}1n'# t$          t&          f$ r t!          d#           Y dS w xY w|1d.k    rd`nd}.t!                       d	}2|-rSt!          db           tO          |-ddc         dde          D ]\  }3}4t!          df|3dgdh|4            tM          |-          dck    r#t!          ditM          |-          dcz
   dj           t!                       	 t#          dk|p|-d          d"                                          }5n'# t$          t&          f$ r t!          d#           Y dS w xY w|5s|p|-d         }2n|5(                                rQddtS          |5          cxk    r!tU          tM          |-          dc          k    rn n|-tS          |5          ddz
           }2nW|5}2nT	 t#          dl|pdm d"                                          }6n'# t$          t&          f$ r t!          d#           Y dS w xY w|6p|}2|2st!          dn           dS |+                    |2|||U          }7|s |d|            |            }8|8
                    d          }9t          |9t                    s|9rdo|9ini }9|9|8d<   d|9d<   ||9d<   |.|9d
<   |2|9do<   ||9d<   |r3i }:d:D ]};|
                    |;          }<|<r|<|:|;<   |:r|:|9d<   nd|9v r|9d= nd|9v r|9d= |7r|7|9dp<    ||8            |             t          |9          | d<    |dq          r |dqd	            |dr          r |drd	           |.dk    rdnd}/|rdsndt}=t!                       t!          du           t!          dv|            t!          dw|/            t!          dx|=            t!          dy|2            |7rt!          dz|7d{d|           nt!          d}           t!                       dS )~uk  Azure Foundry provider: configure endpoint, auth mode, API mode, and model.

    Azure Foundry supports both OpenAI-style (``/v1/chat/completions``) and
    Anthropic-style (``/v1/messages``) endpoints, and two authentication
    modes:

    * **API key** (default) — uses ``AZURE_FOUNDRY_API_KEY`` from .env.
    * **Microsoft Entra ID** — keyless, RBAC-based auth via the
      ``azure-identity`` SDK (Managed Identity / Workload Identity / az
      login / VS Code / azd / service principal env vars). Works on both
      OpenAI-style and Anthropic-style endpoints — Microsoft RBAC is
      per-resource and the same ``Azure AI User`` role grants
      both. For OpenAI-style the OpenAI SDK's native callable
      ``api_key=`` contract is used; for Anthropic-style an
      ``httpx.Client`` with a request event hook (built by
      :func:`agent.azure_identity_adapter.build_bearer_http_client`)
      mints a fresh JWT per request because the Anthropic SDK does not
      accept a callable ``auth_token`` natively.

    The wizard auto-detects the transport and available models when
    possible:

    * URLs ending in ``/anthropic`` → Anthropic Messages API.
    * Successful ``GET <base>/models`` probe → OpenAI-style + populates
      a picker with the returned deployment / model IDs.
    * Anthropic Messages probe fallback when ``/models`` fails.
    * Manual entry when every probe fails (private endpoints, etc.).

    Context lengths for the chosen model are resolved via the standard
    :func:`agent.model_metadata.get_model_context_length` chain
    (models.dev, provider metadata, hardcoded family fallbacks).
    r   r   r.   rg   rC   rD   )azure_detectrE   rG   zazure-foundryrH   r%   rJ   	auth_moder1   entraAZURE_FOUNDRY_API_KEYzAzure Foundry Configurationz2==================================================z9Azure Foundry can host models with either OpenAI-style orz6Anthropic-style API endpoints.  Hermes will probe yourz6endpoint to auto-detect the transport and the deployedzmodels when possible.z  Current endpoint:  rI   zOpenAI-stylezAnthropic-stylez  Current API mode:  entra_idz1  Current auth mode: Microsoft Entra ID (keyless)z  Current auth mode: API key (Nr   z...)zhe.g. https://<resource>.openai.azure.com/openai/v1 or https://<resource>.services.ai.azure.com/anthropiczAPI endpoint URL [r   r   r   z$No endpoint URL provided. Cancelled.r   r   r   zAuthentication:z=  1. API key                  (AZURE_FOUNDRY_API_KEY in .env)zO  2. Microsoft Entra ID       (managed identity / workload identity / az login)zY     Recommended by Microsoft. Works for both OpenAI-style and Anthropic-style endpoints.z?     Requires the 'Azure AI User' role on the Foundry resource.r   r   zAuthentication mode [1/2] (z): )EntraIdentityConfigSCOPE_AI_AZURE_DEFAULTbuild_token_providerdescribe_active_credentialhas_azure_identity_installedu-   ⚠ Could not import azure-identity adapter: z  Falling back to API key auth.Fu6   ◐ The 'azure-identity' package is not installed yet.z  Hermes will install it now (the preflight below triggers the lazy-install). To skip lazy installs, run:  pip install azure-identityrn   u>   ◐ Probing Microsoft Entra ID credential chain (up to 10s)...)rn   g      $@)rU   timeout_secondsokenv_sourcesz, zdefault chainu   ✓ Entra ID token acquired (z, scope=r
  r   zcredential chain exhaustedhintzqRun `az login`, attach a managed identity to this VM, or set AZURE_TENANT_ID/AZURE_CLIENT_ID/AZURE_CLIENT_SECRET.u   ⚠ z  Hint: z4Save Entra config anyway and validate later? [Y/n]: )r   r   r   )rU   u0   ⚠ Could not build token provider for probing: r   r   r   requiredzNo API key provided. Cancelled.u;   ◐ Probing endpoint to auto-detect transport and models...)r1   token_provideru   ✓ Detected API transport: z    (u
   ✓ Found z# deployed model(s) on this endpointu   ⚠ Auto-detection incomplete: z7Select the API format your Azure Foundry endpoint uses:z.  1. OpenAI-style  (POST /v1/chat/completions)z:     For: GPT models, Llama, Mistral, and most open modelsz)  2. Anthropic-style  (POST /v1/messages)z9     For: Claude models deployed via Anthropic API formatanthropic_messageszAPI format [1/2] (z"Available models on this endpoint:   r   )startr   z>2r   z
  ... and z' more (type name manually if not shown)z+Pick by number, or type a deployment name [zModel / deployment name [ze.g. gpt-5.4, claude-sonnet-4-6z"No model name provided. Cancelled.rF   r  r   r   zMicrosoft Entra ID (keyless)zAPI keyu   ✓ Azure Foundry configured:z    Endpoint:       z    API mode:       z    Auth:           z    Model:          z    Context length: r  z tokenszA    Context length: not auto-detected (will fall back at runtime)),rO   r,   r-   rP   r.   rg   rC   rD   
hermes_clir(  rR   rS   rT   r   r   r   r   r   r   r   r   r  agent.azure_identity_adapterr-  r.  r/  r0  r1  ImportErrorjoinr   r  r   detectr   r   rJ   reasonr   r   r  r  minlookup_context_length)>rU   r=   r,   r-   r.   rg   rC   rD   r(  r   current_base_urlr  current_auth_mode
_cur_entracurrent_entracurrent_api_key_lbl_placeholderrH   r  _auth_defaultauth_choice	use_entraauth_mode_labelr  entra_overridesr7  entra_scoper-  r.  r/  r0  r1  r   _persisted_scope_overrider   infor4  tagerrr5  ansr   r1   	detectiondiscovered_modelsrJ   
mode_labeldefault_choicemode_choiceeffective_modelr   midr   r  ctx_lenr\   rE   clean_entrakeyval
auth_labels>                                                                 r#   _model_flow_azure_foundryra    s   B HGGGGGGG            (''''' 

7B''I)T"" 
y}}Z'@'@O'S'Sy}}Z<<BCCy}}Z<<BCC	k : : GiHHNNPPVVXXe\e]]7++1r
&0T&B&BJ

%#m$;<<BO	GGG	
'(((	(OOO	GGG	
EFFF	
BCCC	
BCCC	
!"""	GGG :8&688999 .  #555 N" 	
 	,d,,---J&&BCCCC	 JHrr/BHHHIII	GGG FF 	
 2222
 

%'' 	 x(   n 1!199#>>M 4555##$;<< SmSSSTTT 
GGG	
	
IJJJ	
[\\\	
efff	
KLLL0J>>CBBBBCCIIKK  	 x(   n s"I$-<jj9O MONK (	(                	( 	( 	(GGGG#GGHHH3444I'OOOOOO	(  F++-- 	JKKK3   %((9(9'(B(B(Hb$I$I$O$O$Q$Q!/I3I$ 	A'@OG$NOOO%%
 
 
 *)$OOO88D>> 	((=117RK,7L$))K(((_CM#MM{MMMNNNN((7##C'CC88F## K  ,,,#T##$$$RSSYY[[aacc%x0   n%%%  s,..l###
	"11AAANN 	" 	" 	"JSJJKKK!NNNNNN	" 	AAAAAA	**_?ZOBQB/%77PZ___ egg G "8, 	 	 	.!!!FF	  2? 	3444F 
GGG	
GHHH##% $  I $(	(8#9#9&,"H V&*<<<NNBS 	 	9Z99::: 	/-)*---... 	XS!233XXX   	B	0@BBCCCGHHH>???JKKK9:::IJJJ	$48L$L$LSSRUN>>>>>??EEGG "! K "8, 	 	 	.!!!FF	 ,7#+=+=''CU 
GGGO 62333 1#2# 6a@@@ 	& 	&FAs$q$$$s$$%%%% !!B&&aS!233b8aaa   		hm>cO`abOchhh egg D "8, 	 	 	.!!!FF	  	#+C/@/COO\\^^ 	#SYY Q Q Q Q#c:K6L6Lb2Q2Q Q Q Q Q Q/D		A>OO"OO	cM,^=^ccc egg J "8, 	 	 	.!!!FF	 %5 2333 00%	 1  G  ?.>>>
+--CGGGEeT"" &+3E""G'E*%E* E*&E)(E+   	' 	'C!%%c**C '#&C  	(E'NNgeg *")K5kkF7O }&'' .("---}%&& -',,,#+/A#A#AGXJ*3B&&  
GGG	
)***	
0
0
0111	
-
-
-...	
-
-
-...	
2
2
2333 S7W77778888QRRR	GGGGGs   1)I  I?>I?01M" " NN N/ /
O693O11O63V  V21V2W 
X$W==X0Y  Y/.Y/,1_  ``+-c  c=<c=6'f  ggc           	       ' ddl m}m}m} ddlm}m} ddlm}m	} ddl
m}	 |d         }
|d         }|                    dd	          }|                    d
d	          }|                    dd	          }|                    dd	          '|                    d          pd	                                }|s"|r t          j                            |d	          } |||          }|                    dd          }t!          |t"                    r|                                dv}g }|                    di           }t!          |t&                    rd |D             }n!t!          |t(                    rd |D             }t+          d|
            t+          d|            'rt+          d'            t+                       |s$|r"t+          dt-          |                      |}n*t+          d           ddi}|r||d<    |	||fi |}|s|r|}|rd}'r'|v r|                    '          }t+          dt-          |           d           	 ddlm} 'fd|D             dgz   } |d |
 d!||d"d#          }t+                       |dk     s|t-          |          k    rt+          d$           d%S ||         }n# t4          t6          t8          t:          j        f$ r) t?          |d&          D ]&\  }}|'k    rd'nd	}t+          d(| d)| |            't+          d(t-          |          d&z    d*           t+                       	 tA          d+t-          |          d&z    d,                                          }|st+          d$           Y d%S tC          |          d&z
  }|dk     s|t-          |          k    rt+          d$           Y d%S ||         }n.# tD          tF          tH          f$ r t+          d-           Y Y d%S w xY wY nw xY w'r_t+          d.           	 tA          d/' d,                                          p'}n# tF          tH          f$ r t+          d-           Y d%S w xY wt+          d0           	 tA          d1                                          }n'# tF          tH          f$ r t+          d-           Y d%S w xY w|st+          d2           d%S  ||            |            }|                    d          } t!          | t&                    s| rd3| ini } | |d<   |r2|| d4<   | %                    dd%           | %                    d
d%           nd5| d4<    |||          | d<   |r|| d
<   |                    dd	          }!|!r|!| d<   n| %                    dd%            ||            |             |rs |            }|                    d6          }"t!          |"t&                    r=|"                    |          }#t!          |#t&                    r||#d7<   t#          |                    d8d	          pd	                                          }$t#          |                    d
d	          pd	                                          }%tM          |$p|%          }&|&r>|r<t#          |#                    d
d	          pd	                                          s||#d
<   |r<t#          |#                    dd	          pd	                                          s||#d<   |"|d6<    ||           n |||||9           t+          d:|            t+          d;|
 d<| d=           d%S )>a  Handle a named custom provider from config.yaml custom_providers list.

    Always probes the endpoint's /models API to let the user pick a model.
    If a model was previously saved, it is pre-selected in the menu.
    Falls back to the saved model if probing fails.
    r   )%_custom_provider_api_key_config_value&_custom_provider_base_url_config_valuer   r   rB   r   r4   rH   rJ   r%   r1   key_envrE   provider_keydiscover_modelsT>   0nofalser   c                n    g | ]2}t          |                                          #t          |          3S r   )r   r   r   r  s     r#   
<listcomp>z,_model_flow_named_custom.<locals>.<listcomp>4  s1    JJJ3q66<<>>JSVVJJJr^   c                ~    g | ]:}t          |t                    |                                +t          |          ;S r   )rS   r   r   rl  s     r#   rm  z,_model_flow_named_custom.<locals>.<listcomp>6  sM     
 
 
*Q*<*<
AB
FF
 
 
r^   z  Provider: z  URL:      z  Current:  z2Using configured models (discover_models: false): zFetching available models...rp   g       @zFound z model(s):
)curses_radiolistc                *    g | ]}|k    r| d n|S )
 (current)r   )r   r  saved_models     r#   rm  z,_model_flow_named_custom.<locals>.<listcomp>X  s>       @AA$4$41    !  r^   r   zSelect model from :)r[   cancel_returns
searchabler   Nr   rq  r   r   z. Cancelz
Choice [1-r   r   z%Could not fetch models from endpoint.zModel name [z@Could not fetch models from endpoint. Enter model name manually.Model name: zNo model specified. Cancelled.rF   rG   r  	providersdefault_modelapi_key_ref)rJ   u   
✅ Model set to: z   Provider: r  r
  )'rM   rc  rd  r   rO   r,   r-   rP   rC   rD   rQ   r   rR   r   osenvironrS   r   r   rT   r   r   r   indexhermes_cli.curses_uiro  r=  NotImplementedErrorOSError
subprocessSubprocessErrorr   r   r  r  r   r   r   r   )(rU   provider_inforc  rd  r   r,   r-   rC   rD   r   r4   rH   rJ   r1   re  rf  config_api_keydiscoverconfigured_models
cfg_modelsr   fetch_kwargsdefault_idxro  
menu_itemsr   r  r   r  suffixr_  r\   rE   custom_api_modeproviders_cfgprovider_entryoriginal_api_key_reforiginal_api_keyhad_inline_api_keyrr  s(                                          @r#   _model_flow_named_customr    s	    E  E  E  E  E  E  E  E  E  EGGGGGGGG::::::::222222 DZ(H  R00H	2..G	2..G##GR00K!%%n55;BBDDL  .w .*.."--::='RRN   !2D99H(C   @>>##+??#%""8R00J*d## 
JJZJJJ	J	%	% 

 
&
 
 
 



   	
#
#
#$$$ ,*[**+++	GGG ') '[3GXCYCY[[\\\",---!3' 	0'/L$!!'8DD|DD  	'+ 	'&F ; 	4;&00 ,,{33K0s6{{000111$	======   EK  
J #",T,,,$!  C GGGQww#V,,l###JJ0':;UV 	 	 	!&!,, - -1)*k)9)9r+1+++6++,,,,0s6{{Q000111GGG=Vq===>>DDFF ,'''FF#hhl77cS[[00,'''FF#C[

 18<   n%%% 
	& 
 5666	>k>>>??EEGGV;JJ!8, 	 	 	.!!!FF	 	PQQQ	~..4466JJ!8, 	 	 	.!!!FF	  	2333F z"""
+--CGGGEeT"" &+3E""G 
.(j		*d###		)T""""$jBB8
 
j  	.-E)#''
B77O $+j		*d###K   Wkmm,,mT** 	!*..|<<N.$// !2</ (+!%%mR88>B( (%'' % $'}'8'8B'G'G'M2#N#N#T#T#V#V %)*>*RBR%S%S"&?&?   2 29b A A GRHHNNPP?
 1?N9- 83~'9'9)R'H'H'NB#O#O#U#U#W#W 807N9-#0K C    	h
XVVVV	
-
-
-...	
-$
-
-(
-
-
-.....so   A"K :K BPAO:OOP&P
P	P

PP%'Q  Q10Q1!R& & S
	S
c                ^   ddl m}m}m} ddlm}m}m}m}m	}	 ddl
m}
m}m} ddlm}m}m}m}m}m} d}||         } |	|          }|                    dd          }|                    d	d          }|st-          d
           t-                       t-          d           t-          d           t-          d           t-          d           t-          d           t-                       t-          d           t-          d           t-          d           t-          d           t-                       	 t/          d                                          }n&# t2          t4          f$ r t-                       Y dS w xY w|dk    rz	 ddlm}  |            }|r* |
d|           t-          d           t-                       nt-          d           dS n# t:          $ r}t-          d|            Y d}~dS d}~ww xY w|dk    rddlm} 	  |d                                          }n&# t2          t4          f$ r t-                       Y dS w xY w|st-          d           dS 	 dd lm }  ||          \  }} |st-          d!|             dS n# tB          $ r Y nw xY w |
d|           t-          d"           t-                       nt-          d           dS  |	|          }|                    dd          }|                    d	d          }ni|d#v r2dd$l"m#}!  |!|          }"t-          d%|dd&          d'| |" d(           n%|d)k    rt-          d*           nt-          d+           t-                       |j$        }# ||          }$|$rd, |$D             n |||#          }% |||$|-          p|}&|%r-d. |%D             }'t-          d/tK          |'           d0           n6|                    |g           }'|'rt-          d1           t-          d2           |'r ||'|&||#|3          }(n<	 t/          d4                                          }(n# t2          t4          f$ r d}(Y nw xY w|(r/ ||(|$|-          p|(}( |            }) ||)          }* ||(|$|-          }+d},|+r t-          d5|( d6            ||+|*7          }, ||(            |            }-|-                    d8          }.tM          |.tN                    s|.rd9|.ini }.|.|-d8<   ||.d:<   |#|.d;<    ||(|$|-          |.d<<   |, ||-|,            ||-            |             t-          d=|( d>|j(         d(           |+r-|,d?k    rt-          d@           dS |,rt-          dA|,            dS dS dS t-          dB           dS )CzAGitHub Copilot flow using env vars, gh CLI, or OAuth device code.r   )_current_reasoning_effort"_prompt_reasoning_effort_selection_set_reasoning_effort)rf   r+   r,   r-   $resolve_api_key_provider_credentials)rg   rC   rD   )r   r   fetch_github_model_cataloggithub_model_reasoning_effortscopilot_model_api_modenormalize_copilot_model_idcopilotr1   r%   sourcez.No GitHub token configured for GitHub Copilot.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]: Nr   )copilot_device_code_loginCOPILOT_GITHUB_TOKENz  Copilot token saved.z  Login cancelled or failed.z  Login failed: r   r   z   Token (COPILOT_GITHUB_TOKEN):   Cancelled.)validate_copilot_tokenu     ✗ z  Token saved.>   GH_TOKENGITHUB_TOKENformat_secret_source_suffixz  GitHub token: r   u	   ... ✓ (r
  zgh auth tokenu*     GitHub token: ✓ (from `gh auth token`)u     GitHub token: ✓c                d    g | ]-}|                     d           |                     d d          .S r3   r%   rR   r   items     r#   rm  z'_model_flow_copilot.<locals>.<listcomp><  s5    BBB488D>>B$		BBBr^   catalogr1   c                    g | ]}||S r   r   )r   model_ids     r#   rm  z'_model_flow_copilot.<locals>.<listcomp>I  s    GGG8hGhGGGr^     Found  model(s) from GitHub CopilotL     ⚠ Could not auto-detect models from GitHub Copilot — showing defaults.?    Use "Enter custom model name" if you do not see your model.r   rw  r   z supports reasoning controls.)current_effortrE   rF   rG   rH   rJ   rK   r	  nonez"Reasoning disabled for this model.zReasoning effort set to: rL   ))rM   r  r  r  rO   rf   r+   r,   r-   r  rP   rg   rC   rD   rQ   r   r   r  r  r  r  rR   r   r   r   r   r   hermes_cli.copilot_authr  r   r  r   r  r=  hermes_cli.env_loaderr  inference_base_urlr   rS   rT   r4   )/rU   r=   r  r  r  rf   r+   r,   r-   r  rg   rC   rD   r   r   r  r  r  r  r8   rV   r   r1   r  r"   r  tokenr   r   new_keyr  validr   r  	bw_suffixeffective_baser  live_modelsnormalized_current_model
model_listr[   initial_cfgr  reasoning_effortsselected_effortr\   rE   s/                                                  r#   _model_flow_copilotr    s   tttttttttt              KJJJJJJJJJ                K,G00==Eii	2&&GYYx$$F M>???()))Z	
 	
 	
 	YZZZMNNNQRRRlABBB-...o	-..4466FF!8, 	 	 	GGGFF	 S==MMMMMM1133 "N#95AAA2333GGGG8999F     .../// s]]EEEEEE../QRRXXZZ%x0     n%%%JJJJJJ33G<<
s .3..)))F    N17;;;"###GGGG.!!!F44[AA))Ir**8R((111IIIIII33F;;IOWRaR[OO6O9OOOPPPP&&>????'(((/N((11G 	7BBBBBBg~66  	#"	
 	
 	
 	
    	UGG{GGG
GZGGGHHHH%))+r::
 	U^   STTT **2(+#
 
 
	^,,2244HH!8, 	 	 	HHH	  1&&   
  	 "kmm22;??::
 
 

  	>x>>>???@@!.  O 	8$$$kmm  %&& 	!*/7Y&&RE CL'j*j22
 
 
j
 &!!#777CFxFFw|FFFGGG 	E&((:;;;;;  EC/CCDDDDD		E 	EE E 	lsa   8!E E=<E=AG 
G= G88G=H+ +II%(J 
JJ1!Q Q)(Q)c                   ddl m}m}m}m}m}m}m} ddlm	}	m
}
m} ddlm}m} ~ d}||         } ||          }|                    d          p|                    d          pd}|                    d	          p|j        }t#          d
           t#          d           t#          d           t#          d|            t#          d|            t#                       	  ||          }n9# t$          $ r,}t#          d|            t#          d           Y d}~dS d}~ww xY w|                    d	          p|}d}	  |d          }|                    dd          }n# t$          $ r Y nw xY w |
|          } ||||          p|}|r-d |D             }t#          dt'          |           d           n6|	                    dg           }|rt#          d           t#          d           |r ||||||          }n<	 t)          d                                          }n# t,          t.          f$ r d}Y nw xY w|st#          d           dS  ||||          p|} ||            |            }|                    d          }t1          |t2                    s|rd|ini }||d<   ||d<   ||d	<   d |d!<    ||            |             t#          d"| d#|j         d$           dS )%z4GitHub Copilot ACP flow using the local Copilot CLI.r   )rf   r+   r,   r-   $get_external_process_provider_statusr  -resolve_external_process_provider_credentials)r   r  r  rB   zcopilot-acpresolved_commandcommandr  rH   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.z  Command: z  Backend marker: u     ⚠ z[  Set HERMES_COPILOT_ACP_COMMAND or COPILOT_CLI_PATH if Copilot CLI is installed elsewhere.Nr%   r1   r  c                d    g | ]-}|                     d           |                     d d          .S r  r  r  s     r#   rm  z+_model_flow_copilot_acp.<locals>.<listcomp>  s5    OOOTOdhhtR((OOOr^   r  r  r  r  r   rw  rL   rE   rF   rG   rI   rJ   rK   r	  r
  )rO   rf   r+   r,   r-   r  r  r  rQ   r   r  r  rP   rC   rD   rR   r  r   r   r   r   r   r   r   rS   rT   r4   )rU   r=   rf   r+   r,   r-   r  r  r  r   r  r  rC   rD   r8   rV   r   r  r  r   r   catalog_api_keycatalog_credsr  r  r  r[   r\   rE   s                                r#   _model_flow_copilot_acpr    s                             
 ;:::::::K,G11+>>F

%&&L&**Y*?*?L9  ZZ
++Iw/IN	
KLLL	
NOOO	
TUUU	
*(
*
*+++	
/~
/
/000	GGG==kJJ   nsnni	
 	
 	
 	 YYz**<nNO<<YGG'++Ir::    )(99G""#	
 	
 	
 	
    	UOOWOOO
GZGGGHHHH%)))R88
 	U^   STTT **2(++
 
 
	^,,2244HH!8, 	 	 	HHH	  l 	#"#	
 	
 	
 	
   x   
+--CGGGEeT"" &+3E""G#E*&E**E*K	
B8
B
B7<
B
B
BCCCCCs<   #C/ /
D%9!D  D%!E$ $
E10E1!H* *I ?I c                >   ddl m} ddlm}m}m}m}m} ddlm	}m
}	m}
m} ddlm} d}||         }|j        r|j        d         nd}|j        pd}d}|j        D ]&} ||          pt#          j        |d          }|r n' ||||          \  }}|rd	S |                    d
          }|r|}t)          d|            n|j        }t)          d|            |r ||          r |	|d           t)                       |rg d}n|                    dg           }|r ||||||          }n<	 t/          d                                          }n# t2          t4          f$ r d	}Y nw xY w|r ||            |
            }|                    d          }t7          |t8                    s|rd|ini }||d<   ||d<   ||d<   |                    dd	            ||            |             |rdnd}t)          d| d| d           d	S t)          d           d	S )u  Kimi / Moonshot model selection with automatic endpoint routing.

    - sk-kimi-* keys   → api.kimi.com/coding/v1  (Kimi Coding Plan)
    - Other keys        → api.moonshot.ai/v1      (legacy Moonshot)

    No manual base URL prompt — endpoint is determined by key prefix.
    r   r'   )rf   KIMI_CODE_BASE_URLr+   r,   r-   r'  r   zkimi-codingr%   r7   Nzsk-kimi-u$     Detected Kimi Coding Plan key → u     Using Moonshot endpoint → )z	kimi-k2.6z	kimi-k2.5zkimi-for-codingzkimi-k2-thinkingzkimi-k2-thinking-turbomoonshotr   zEnter model name: rE   rF   rG   rH   rJ   zKimi CodingMoonshotrK   r	  r
  rL   )rM   r(   rO   rf   r  r+   r,   r-   rP   r.   rg   rC   rD   rQ   r   r6   base_url_env_varr{  getenvr  r   r  rR   r   r   r   r   rS   rT   r   )rU   r=   r(   rf   r  r+   r,   r-   r.   rg   rC   rD   r   r8   rV   re  base_url_envrW   evrY   is_coding_planr  r  r[   r\   rE   endpoint_labels                              r#   _model_flow_kimir    s    0/////                         322222K,G-4-EMg&q))2G+1rL L&  $}R((=BIb",=,= 	E	 */;  L%   ",,Z88N A+E^EEFFFF 3?~??@@@ )l33 )|R(((	GGG  :
 
 


 &))*b99
 **'(+(
 
 
	12288::HH!8, 	 	 	HHH	  8$$$ kmm  %&& 	!*/7Y&&RE CL'j*j		*d###C*8HjHxHH~HHHIIIIIls   2!E E*)E*c                   ddl m}m}m}m} ddlm}m}m}m	}	 ddl
m}
m}m}m} ddlm}m} d}||         }|j        r|j        d         nd}|j        pd}d}|j        D ]&} |
|          pt)          j        |d          }|r n' ||||          \  }}|rd	S d}|r  |
|          pt)          j        |d          }|s`|                     d
          }t/          |t0                    r6t3          |                    d          pd                                          } ||p|j                  }dd |d           dfdd |d           dfg}g }|D ]>\  }}||k    r|                    d|| df           '|                    ||f           ?|                    d            |d |D                       }|||         d         dk    rt=          d           d	S ||         d         } ||          } |r |||             |||           }!|!r+|!}"t=          dt?          |"           d|j          d           n0|                    |g           }"|"rt=          d|j          d           |"r ||"||| |          }#n<	 tC          d                                          }#n# tD          tF          f$ r d	}#Y nw xY w|#r ||#            |            }$|$                    d
          }%t/          |%t0                    s|%rd|%ini }%|%|$d
<   ||%d<   | |%d<   |%$                    dd	            ||$            |	             t1          |%          | d
<   t=          d |# d!|j          d           d	S t=          d           d	S )"z6StepFun Step Plan flow with region-specific endpoints.r   )_infer_stepfun_regionr(   _prompt_provider_choice_stepfun_base_url_for_regionrf   r+   r,   r-   r'  )r   r   stepfunr%   r7   NrE   rH   internationalzInternational (r
  chinazChina (u     ← currently active)r   r   c                    g | ]\  }}|S r   r   )r   _r    s      r#   rm  z'_model_flow_stepfun.<locals>.<listcomp>  s    )P)P)PHAu%)P)P)Pr^   r   rL   r   model(s) from  APIz$  Could not auto-detect models from u,    API — showing Step Plan fallback catalog.r   rw  rF   rG   rJ   rK   r	  )%rM   r  r(   r  r  rO   rf   r+   r,   r-   rP   r.   rg   rC   rD   rQ   r   r   r6   r  r{  r  rR   rS   rT   r   r   r  insertappendr   r   r4   r   r   r   r   )&rU   r=   r  r(   r  r  rf   r+   r,   r-   r.   rg   rC   rD   r   r   r8   rV   re  r  rW   r  rY   current_baser   current_regionregion_choicesordered_regions
region_keyr    
region_idxselected_regionr  r  r  r[   r\   rE   s&                                         r#   _model_flow_stepfunr  o  s`   }}}}}}}}}}}}                       EDDDDDDDK,G-4-EMg&q))2G+1rLL&  $}R((=BIb",=,= 	E	 */;  L%  L R$}\22Qbib6Q6Q HJJw''	i&& 	Hy}}Z88>B??EEGGL**<+U7;UVVN N::?KKNNN	
 
D88AADDDEN O+ 8 8
E''""1ze3S3S3S&TUUUU""J#67777/000(()P)P)P)P)PQQJ_Z8;xGGl%j1!4O11/BBN 5|^444""<@@K 	 
KZKKKKKLLLL%))+r::
 	6w| 6 6 6  
  **'(+(
 
 
	^,,2244HH!8, 	 	 	HHH	  8$$$kmm  %&& 	!*/7Y&&RE CL'j*j		*d###Cu++wFxFFw|FFFGGGGGls   !J- -KKc                8   ddl m}m}m} ddlm}m}m}m}	 ddl	m
}
 d| d} |d          pd}|r/dd	lm}  |d          }t          d
|dd          d|            nt          d|            t                       ddlm} 	  |d
                                          }n&# t"          t$          f$ r t                       Y dS w xY w|st          d           dS  |	d|           |}t          d           t                       |
                    dg           }t          dt)          |           d           |r |||d||          }n<	 t+          d                                          }n# t"          t$          f$ r d}Y nw xY w|r ||            |            }|                    d          }t-          |t.                    s|rd|ini }||d<   d|d<   ||d<   |                    dd           |                    di           }t-          |t.                    si }||d<   ||d<    |	d|            |	d|            ||            |             t          d | d!| d"           t          d|            dS t          d#           dS )$u   Bedrock API Key mode — uses the OpenAI-compatible bedrock-mantle endpoint.

    For developers who don't have an AWS account but received a Bedrock API Key
    from their AWS admin. Works like any OpenAI-compatible endpoint.
    r   r+   r,   r-   )rC   rD   r.   rg   r   zhttps://bedrock-mantle.z.api.aws/v1AWS_BEARER_TOKEN_BEDROCKr%   r  z  Bedrock API Key: N      ... ✓z  Endpoint: r   r       ✓ API key saved.bedrock
  Showing z curated modelsr  r     Model ID: rE   rF   rG   rH   rJ   r   r   r     Default model set to: z (via Bedrock API Key, r
    No change.)rO   r+   r,   r-   rP   rC   rD   r.   rg   rQ   r   r  r  r   r  r   r   r   r   rR   r   r   rS   rT   r   )rU   r   r=   r+   r,   r-   rC   rD   r.   rg   r   mantle_base_urlrW   r  source_suffixr   r1   r  r[   r\   rE   bedrock_cfgs                         r#   _model_flow_bedrock_api_keyr    s            
            322222CCCCO !=!;<<BL &EEEEEE334NOOML"$5MMmMMNNNN._..///AAAAAA	**+@AAGGIIGG!8, 	 	 	GGGFF	  	.!!!F17;;;$%%%	GGG "%%i44J	
7s:
7
7
7888 **'%,(
 
 
	^,,2244HH!8, 	 	 	HHH	  8$$$ kmm  %&& 	!*/7Y&&RE CL$j+j		*d### ggi,,+t,, 	K &H$I 	'666(/:::CSSS&SSSTTT._../////ns$   B& &C	C	!E6 6FFc                2
    ddl m}m}m} ddlm}m} ddlm} 	 ddl	m
}m}	m}
m} n=# t          $ r0 t          d           t          d           t                       Y dS w xY w |            s,t          d	           t          d
           t                        |	            }|rt          d| d           nt          d           t                        |
            }	 t!          d| d                                          }n&# t$          t&          f$ r t                       Y dS w xY w|p|}t          d           t                       t          d           t          d           t          d           t          d           t          d           t                       	 t!          d                                          }n&# t$          t&          f$ r t                       Y dS w xY w|dk    rt)          | ||           dS t          d| d            ||          }|rid}d}g }|D ]W}|d          t+           fd|D                       r&t+           fd|D                       rB|                    |           Xt/                      }|D ]^}|d                               d          r?d  d!d         v r                     d d"          d"         n }|                    |           _g }|D ]9}|d                               d          s |v r$|                    |           :g d#fd$}|                    |%           d& |D             }t          d't9          |           d(t9          |           d)           nJ|                    d*g           }|r!t          d+t9          |           d,           nt          d-           dS |r |||d*d.| d/0          }n<	 t!          d1                                          }n# t$          t&          f$ r d}Y nw xY w|r ||            |            }|                    d2          }t=          |t>                    s|rd3|ini }||d2<   d*|d4<   d.| d/|d5<   |                     d6d           |                    d*i           }t=          |t>                    si }||d7<   ||d*<    ||            |             t          d8| d9| d:           dS t          d;           dS )<u$  AWS Bedrock provider: verify credentials, pick region, discover models.

    Uses the native Converse API via boto3 — not the OpenAI-compatible endpoint.
    Auth is handled by the AWS SDK default credential chain (env vars, profile,
    instance role), so no API key prompt is needed.
    r   r  rB   r   )has_aws_credentialsresolve_aws_auth_env_varresolve_bedrock_regiondiscover_bedrock_modelsu.     ✗ boto3 is not installed. Install it with:z    pip install boto3Nu<     ⚠ No AWS credentials detected via environment variables.zE  Bedrock will use boto3's default credential chain (IMDS, SSO, etc.)z  AWS credentials: u    ✓z<  AWS credentials: boto3 default chain (instance role / SSO)z  AWS Region [r     Choose authentication method:z)    1. IAM credential chain (recommended)zB       Works with EC2 instance roles, SSO, env vars, aws configurez    2. Bedrock API Keyu<          Enter your Bedrock API Key directly — also supportsz5       team scenarios where an admin distributes keysz  Choice [1]: r   z  Discovering models in r   )z
stability.zcohere.embedztwelvelabs.zus.stability.zus.cohere.embedzus.twelvelabs.zglobal.cohere.embedzglobal.twelvelabs.)	safeguardvoxtralzpalmyra-visionr3   c              3  B   K   | ]}                     |          V  d S r   )r  )r   pr[  s     r#   r   z&_model_flow_bedrock.<locals>.<genexpr>  s/      @@3>>!$$@@@@@@r^   c              3  D   K   | ]}|                                 v V  d S r   r   )r   sr[  s     r#   r   z&_model_flow_bedrock.<locals>.<genexpr>  s0      AA1		#AAAAAAr^   )zus.global..   r   )	zus.anthropic.claude-sonnet-4-6zus.anthropic.claude-opus-4-6zus.anthropic.claude-haiku-4-5zus.amazon.nova-prozus.amazon.nova-litezus.amazon.nova-microzdeepseek.v3zus.meta.llama4-maverickzus.meta.llama4-scoutc                    | d         }t                    D ]!\  }}|                    |          rd||fc S "|                    d          rdd|fS dd|fS )Nr3   r   r  r      )r   r  )r  r[  r   rec_RECOMMENDEDs       r#   	_sort_keyz&_model_flow_bedrock.<locals>._sort_key  s~    D'C#L11 ' '3>>#&& 'q#;&&&'~~i(( #1c{"q#;r^   )r^  c                    g | ]
}|d          S )r3   r   rl  s     r#   rm  z'_model_flow_bedrock.<locals>.<listcomp>  s    ///!ag///r^   r  z text model(s) (filtered from z total)r  z  Using z, curated models (live discovery unavailable)zJ  No models found. Check IAM permissions for bedrock:ListFoundationModels.zhttps://bedrock-runtime.z.amazonaws.comr   r  rE   rF   rG   rH   rJ   r   r  z (via AWS Bedrock, r
  r  )!rO   r+   r,   r-   rP   rC   rD   rQ   r   agent.bedrock_adapterr  r   r  r  r=  r   r   r   r   r   r  r  r  setr  splitaddsortr   rR   rS   rT   r   )!rU   r=   r+   r,   r-   rC   rD   r   r  r   r  r  auth_varr  region_inputr   rK  r  _EXCLUDE_PREFIXES_EXCLUDE_SUBSTRINGSfilteredr  profile_base_idsbasededupedr  r  r[   r\   rE   r  r  r[  s!                                  @@r#   _model_flow_bedrockr!  ?  s            
 ;:::::::222222	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
    >???%&&&	    LMMMUVVV''))H N2H2223333LMMM	GGG ,+--NAnAAABBHHJJx(    +^F 

+,,,	GGG	
5666	
NOOO	
"###	
HIII	
ABBB	GGG,--3355x(    c#FFMBBB 

0V
0
0
0111))&11K I	
 I 	 	AD'C@@@@.?@@@@@ AAAA-@AAAAA OOA 55 	+ 	+AD'C~~011 +/2c!""g~~syya((++3 $$T*** 	 	AD'C>>"455 #AQ:Q:QNN1

 

 

	 	 	 	 	 	###//w///
_s:__c+FVFV___	
 	
 	
 	
 &)))R88
 	X3z??XXX    \   F  **'&NNNN	
 
 
	^,,2244HH!8, 	 	 	HHH	  8$$$kmm  %&& 	!*/7Y&&RE CL%jMvMMMj		*d###ggi,,+t,, 	K &H$ICOOOfOOOPPPPPnsE   ) 6A#"A#$%D
 
D-,D-+!G G0/G07!P P/.P/c                (  , ddl m} ddlm}m}m}m} ddlm}m	}	m
}
m} ddlm}m}m}m, |         }|j        r|j        d         nd}|j        pd}d}|j        D ]&} ||          pt'          j        |d          }|r n' |||          \  }}|rdS d	k    rS|rP	 dd
lm} n# t.          $ r d}Y nw xY w|3t1          d           |r ||          ndpt'          j        |pdd          p|j        } |||          }|dk    rt1                       t1          d           t1          d           t1          d           t1          d           t1                       t1          d           t1          d           t1                       t1          d           t1                       t1          d           dS |dk    rt1          d           nt1          d           t1                       d}|r  ||          pt'          j        |d          }|s	  |
                                d          pi }t7          |                    d          pd                                                                          k    r6t7          |                    d          pd                                          }n# t.          $ r Y nw xY w|p|j        }	 t=          d| d                                          }n'# t>          t@          f$ r t1                       d}Y nw xY w|r5|r3|!                    d          st1          d           n |	||           |}dk    rdd lm"} dd!lm#} |p|r ||          nd}	  |||"          }n5# |$ r-} t1          d#|             t1          d$           g }Y d} ~ nd} ~ ww xY w|r t1          d%tI          |           d&           n;d'k    rIdd(lm%}! |p|r ||          nd} |!||d)*          }|r t1          d%tI          |           d+           nd,k    rHdd-lm} |p|r ||          nd}|                    g           }" |||          }#|#r,|#}t1          d%tI          |           d.|j&         d/           n~g }$	 dd0l'm(}%  |%          }$n# t.          $ r Y nw xY w|$rd1 |$D             }&tS          |$          }|"D ]T}'|'                                |&vr<|*                    |'           |&+                    |'                                           Ut1          d%tI          |           d2           n|"}|r t1          d3tI          |           d4           n|                    g           }"g }$	 dd0l'm(}%  |%          }$n# t.          $ r Y nw xY w|$r|"rud5 |$D             }&tS          |$          }(|"D ]T}'|'                                |&vr<|(*                    |'           |&+                    |'                                           U|(}n|$}t1          d%tI          |           d2           n|"r6tI          |"          d6k    r#|"}t1          d3tI          |           d4           n|p|r ||          nd} |||          }#|#rKtI          |#          tI          |"          k    r+|#}t1          d%tI          |           d.|j&         d/           n$|"}|r t1          d3tI          |           d4           d7v rL,fd8|D             } ,|          }tS          tX          -                    d9 |D                                 }|r |||||:          })n<	 t=          d;                                          })n# t>          t@          f$ r d})Y nw xY w|)rd7v r ,|)          }) ||)            |
            }*|*                    d          }+t]          |+tX                    s|+rd<|+ini }+|+|*d<   |+d<   ||+d<   d7v r ||)          |+d=<   n|+/                    d=d            ||*            |             t1          d>|) d?|j&         d@           dS t1          dA           dS )BzCGeneric flow for API-key providers (z.ai, MiniMax, OpenCode, etc.).r   r'   r  r'  )r   r   opencode_model_api_modenormalize_opencode_model_idr%   r7   Ngemini)probe_gemini_tierz  Checking Gemini API tier...freeuW   ❌ 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.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/apikeyzY   Alternatives with workable free usage: DeepSeek, OpenRouter (free models), Groq, Nous.z*Not saving Gemini as the default provider.paidu     Tier check: paid ✓z3  Tier check: could not verify (proceeding anyway).rE   rG   rH   z
Base URL [r   r   uM     Invalid URL — must start with http:// or https://. Keeping current value.lmstudio)rc   )fetch_lmstudio_models)r1   rH   z"  LM Studio rejected the request: zC  Set LM_API_KEY (or update it) to match the server's bearer token.r  z model(s) from LM Studiozollama-cloud)fetch_ollama_cloud_modelsT)r1   rH   r<   z model(s) from Ollama Cloudnovitar   r  r  )list_agentic_modelsc                6    h | ]}|                                 S r   r	  rl  s     r#   	<setcomp>z/_model_flow_api_key_provider.<locals>.<setcomp>	       777a		777r^   z" model(s) from models.dev registryr  r   c                6    h | ]}|                                 S r   r	  rl  s     r#   r/  z/_model_flow_api_key_provider.<locals>.<setcomp>	  r0  r^   r   >   opencode-goopencode-zenc                (    g | ]} |          S r   r   )r   r[  r$  r8   s     r#   rm  z0_model_flow_api_key_provider.<locals>.<listcomp>	  s4     
 
 
>A''S99
 
 
r^   c              3     K   | ]}||V  	d S r   r   )r   r[  s     r#   r   z/_model_flow_api_key_provider.<locals>.<genexpr>	  s'      'I'IS'I'I'I'I'I'I'Ir^   r   rw  rF   rJ   rK   r	  r
  rL   )0rM   r(   rO   rf   r+   r,   r-   rP   r.   rg   rC   rD   rQ   r   r   r#  r$  r6   r  r{  r  agent.gemini_native_adapterr&  r   r   r  rR   r   r   r   r   r   r   r  rc   r*  r   r+  r4   agent.models_devr-  r   r  r  rT   fromkeysrS   r   )-rU   r8   r=   r(   rf   r+   r,   r-   r.   rg   rC   rD   r   r   r#  rV   re  r  rW   r  rY   r&  
probe_basetierr  _mr  overriderc   r*  api_key_for_prober  r   r+  curatedr  mdev_modelsr-  seenr  mergedr[   r\   rE   r$  s-    `                                          @r#   _model_flow_api_key_providerrB    s{   //////                                   ,G-4-EMg&q))2G+1rL L&  $}R((=BIb",=,= 	E	 */;  L%   h<	%EEEEEEE 	% 	% 	% $	%(12220<D|,,," .9\/R44.- 
 %$\:>>Dv~~B   ;   2   ,---:   9   <   BCCCv~~.////
 KLLLGGG L R$}\22Qbib6Q6Q 	""7++1rB266*%%+,,2244::<<KK"266*#5#5#;<<BBDD 	 	 	D	!?W%?N9n999::@@BBx(     &L &""#:;; 	&_    N<222%N j  ------;;;;;;(Ww-V]]7-C-C-CTV	..)N  JJ  	 	 	<s<<===WXXXJJJJJJ	  	HFS__FFFGGG		&	&??????(Ww-V]]7-C-C-CTV
 /.%#
 
 


  	KIS__IIIJJJ		 	 666666(Ww-V]]7-C-C-CTV"&&{B77&&'8.II 	$JOS__OOW\OOOPPPP "K@@@@@@11+>>    77;777!+..
  , ,Awwyy,,"))!,,,+++TZTTTUUUU$
 sS__sss   #&&{B77 	<<<<<<--k::KK 	 	 	D	  !	  	)77;777k**  , ,Awwyy,,a(((+++#

(
PS__PPPQQQQ 	W** JkS__kkk    !- !*19g&&&r  +*+<nMMK s;//3w<<??(
SZSSSSSTTTT$
 sS__sss  
 555
 
 
 
 
EO
 
 

 43KOO$--'I'Iz'I'I'IIIJJ
 **'(+(
 
 
	^,,2244HH!8, 	 	 	HHH	  99922;IIH8$$$ kmm  %&& 	!*/7Y&&RE CL'j*j999 7 7X N NE*IIj$'''CFxFFw|FFFGGGGGls   $B+ +B:9B:B!J< <
K	K	%K< <!L L >N N>#N99N>%R7 7
SSV. .
V;:V;!^& &^<;^<c                   ddl m} ddlm}m}m} ddlm}m}m	}m
}	 ddlm}
 ddlm}  |            }d}	 ddlm}m}m}  |            }|r ||          rd	}n# t$          $ r Y nw xY wd}|r ||          r|sd	}t'          |          r| p|}| }|r|rvdd
lm} ddlm} d}|d         j        D ]<}t1          j        |d                                          |k    r ||          }|r n=t7          d|dd          d|            n|rt7          d           t7                       t9          d          }|dk    rd	}n|dk    rdS |rt7                       t7          d           t7                       t7          d           t7          d           t7          d           t7                       	 t;          d                                          }n&# t<          t>          f$ r t7                       Y dS w xY w|dk    r ||          sdS n|dk    rt7                       t7          d           t7                       ddl m!} 	  |d                                          }n&# t<          t>          f$ r t7                       Y dS w xY w|st7          d            dS  |	||!           t7          d"           nt7          d#           dS t7                       |
"                    dg           }|r |||d$          }n<	 t;          d%                                          }n# t<          t>          f$ r d}Y nw xY w|r ||            |            }|"                    d&          }tG          |tH                    s|rd'|ini }||d&<   d|d(<   |%                    d)d            ||            |             t7          d*| d+           dS t7          d,           dS )-uR   Flow for Anthropic provider — OAuth subscription, API key, or Claude Code creds.r   )_run_anthropic_oauth_flowr  )rg   rC   rD   save_anthropic_api_keyr   )get_anthropic_keyF)read_claude_code_credentialsis_claude_code_token_valid_is_oauth_tokenTr  )rf   r%   	anthropicz  Anthropic credentials: Nr  r  u.     Claude Code credentials: ✓ (auto-detected)zAnthropic credentials:r   r   r  z0    1. Claude Pro/Max subscription (OAuth login)z(    2. Anthropic API key (pay-per-token)r  r   r   r   z>  Get an API key at: https://platform.claude.com/settings/keysr   z  API key (sk-ant-...): r  )save_fnr  r  )r=   r?   z-Model name (e.g., claude-sonnet-4-20250514): rE   rF   rG   rH   rK   z (via Anthropic)rL   )&rM   rD  rO   r+   r,   r-   rP   rg   rC   rD   rE  rQ   r   rF  agent.anthropic_adapterrG  rH  rI  r   r   r  r  rf   r6   r{  r  r   r   r$   r   r   r   r  r   rR   rS   rT   r   ) rU   r=   rD  r+   r,   r-   rg   rC   rD   rE  r   rF  rW   cc_availablerG  rH  rI  cc_credsexisting_is_stale_oauth	has_creds
needs_authr  rf   r  varr"   r   r1   r  r[   r\   rE   s                                    r#   _model_flow_anthropicrS  
  s   999999         
            322222 211111$$&&LL	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 0/11 	 228<< 	 L    $ '55 'l '"&l##C,C(CTIJ  	DIIIIII999999 M(5F  9S"%%++--==$?$?$D$DM$ UL",=UUmUU     	DBCCC01IJJXJJxF  &/000@AAA8999o	/006688FF!8, 	 	 	GGGFF	 S==,,^<<  s]]GGGRSSSGGGEEEEEE../IJJPPRR%x0     n%%%""7NCCCC()))) .!!!F	GGG "%%k266J 
**'(
 
 
	LMMSSUUHH!8, 	 	 	HHH	  8$$$ kmm  %&& 	!*/7Y&&RE CL'j		*d###CAxAAABBBBBlsG   #A 
A'&A'7!G G<;G<I) )JJ!L( (L>=L>)r   r   r   r   )r%   )r%   N)__doc__
__future__r   r   r{  r  r$   r]   r   r   r   r   r   r   r%  ra  r  r  r  r  r  r  r!  rB  rS  r   r^   r#   <module>rV     s!   ( # " " " " "  				    # # # #L@ @ @ @D[ [ [ [zV V V VpUT U U U U Un. . . .`35 35 35 35jM M M M^Y Y Yvm m m m^~/ ~/ ~/@D D D DLrD rD rD rDhe e e eNo o o ob] ] ] ]~y y y yv` ` ` `D	T T T T T Tr^   