
    PL
j                       d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	  ej
        e          ZddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( dd	l)m*Z* dd
l+m,Z,m-Z- dDdZ.dEdZ/dFdZ0dGdZ1dHdZ2dIdZ3dJdKdZ4dLd Z5h d!Z6dMd$Z7dNd'Z8dddd(dOd/Z9dJdPd1Z:	 	 dQdRd5Z;dSd6Z<ddd7dTd:Z=ddd7dUd;Z>dddd<dVd=Z?ddd7dWd>Z@ddddd?dXd@ZAdYdCZBdS )ZzGShared runtime provider resolution for CLI, gateway, cron, and helpers.    )annotationsN)AnyDictOptional)auth)CredentialPoolPooledCredentialget_custom_provider_pool_key	load_pool)	AuthErrorDEFAULT_CODEX_BASE_URLDEFAULT_QWEN_BASE_URLDEFAULT_XAI_OAUTH_BASE_URLPROVIDER_REGISTRY_agent_key_is_usableformat_auth_errorresolve_provider resolve_nous_runtime_credentials!resolve_codex_runtime_credentials%resolve_xai_oauth_runtime_credentials resolve_qwen_runtime_credentials(resolve_gemini_oauth_runtime_credentials$resolve_api_key_provider_credentials-resolve_external_process_provider_credentialshas_usable_secret)get_compatible_custom_providersload_config)OPENROUTER_BASE_URL)base_url_host_matchesbase_url_hostnamevaluestrreturnc                v    |                                                                                      dd          S )N -)striplowerreplace)r!   s    ?/home/kuhnn/.hermes/hermes-agent/hermes_cli/runtime_provider.py_normalize_custom_provider_namer+   %   s,    ;;==  ((c222    hostboolc                \    | pd                                                     d          }|dv S )N .>   ::10.0.0.0	localhost	127.0.0.1)r(   rstrip)r-   hs     r*   _loopback_hostnamer8   )   s1    	##C((A<<<r,   cfg_base_urlcfg_providerc                    |pd                                                                 }| pd                                 }|sdS |dk    rdS t          |d          rdS t          t	          |                    S )ae  Decide whether ``model.base_url`` may back bare ``custom`` runtime resolution.

    GitHub #14676: the model picker can select Custom while ``model.provider`` still reflects a
    previous provider. Reject non-loopback URLs unless the YAML provider is already ``custom``,
    so a stale OpenRouter/Z.ai base_url cannot hijack local ``custom`` sessions.
    r0   FcustomTopenrouter.ai)r'   r(   r   r8   r    )r9   r:   cfg_provider_normbus       r*   ,_config_base_url_trustworthy_for_bare_customr@   .   s     &+2244::<<

"	#	#	%	%B uH$$tR11 u/33444r,   base_urlOptional[str]c                    | pd                                                                                     d          }t          |           }|dk    rdS |dk    rdS |                    d          rdS |dk    rd	|v rdS d
S )u  Auto-detect api_mode from the resolved base URL.

    - Direct api.openai.com endpoints need the Responses API for GPT-5.x
      tool calls with reasoning (chat/completions returns 400).
    - Third-party Anthropic-compatible gateways (MiniMax, Zhipu GLM,
      LiteLLM proxies, etc.) conventionally expose the native Anthropic
      protocol under a ``/anthropic`` suffix — treat those as
      ``anthropic_messages`` transport instead of the default
      ``chat_completions``.
    - Kimi Code's ``api.kimi.com/coding`` endpoint also speaks the
      Anthropic Messages protocol (the /coding route accepts Claude
      Code's native request shape).
    r0   /zapi.x.aicodex_responseszapi.openai.comz
/anthropicanthropic_messageszapi.kimi.comz/codingN)r'   r(   r6   r    endswith)rA   
normalizedhostnames      r*   _detect_api_mode_for_urlrJ   @   s     .b''))//1188==J **H:  ###  <(( $##>!!i:&=&=##4r,   c                   | sdS 	 ddl }|                     d          }|                    d          s|dz  }|                    |dz   d          }|j        r[|                                                    d	g           }t          |          d
k    r |d                             dd          }|r|S n3# t          $ r&}t          	                    d| |           Y d}~nd}~ww xY wdS )zFQuery a local server for its model name when only one model is loaded.r0   r   NrD   z/v1z/models   )timeoutdata   idz$Auto-detect model from %s failed: %s)
requestsr6   rG   getokjsonlen	Exceptionloggerdebug)rA   rQ   urlrespmodelsmodel_idexcs          r*   _auto_detect_local_modelr^   [   s    rLooc""||E"" 	5LC||C)OQ|777 	$YY[[__VR00F6{{a!!9==r22 $#O L L L 	;XsKKKKKKKKL 2s   B.B6 6
C& C!!C&Dict[str, Any]c                 r   t                      } |                     d          }t          |t                    rt          |          }|                    d          s |                    d          r|d         |d<   |                    d          pd                                }|                    d          pd                                }d|v pd|v }| }|r|r|rt          |          }|r||d<   |S t          |t                    r*|                                rd|                                iS i S )Nmodeldefaultr0   rA   r4   r5   )r   rR   
isinstancedictr'   r^   r"   )config	model_cfgcfgrb   rA   is_localis_fallbackdetecteds           r*   _get_model_configrk   r   sB   ]]F

7##I)T"" 9oowwy!! 	*cggg&6&6 	* \C	N779%%+2244GGJ''-24466(*EkX.E!k 	* 	* 	*/99H *!)I
)S!! .ioo&7&7 .9??,,--Ir,   providerconfigured_providerc                    | pd                                                                 }|pd                                                                 }|sdS |dk    r|dk    p|                    d          S ||k    S )aT  Check whether a persisted api_mode should be honored for a given provider.

    Prevents stale api_mode from a previous provider leaking into a
    different one after a model/provider switch.  Only applies the
    persisted mode when the config's provider matches the runtime
    provider (or when no configured provider is recorded).
    r0   Tr<   custom:)r'   r(   
startswith)rl   rm   normalized_providernormalized_configureds       r*   $_provider_supports_explicit_api_moders      s     $>r002288::06B==??EEGG  th&&$0_4I4T4TU^4_4__ $777r,   rf   api_keyc                   t          |                     d          pd                                                                          }t	          |                     d                    }|rt          d|          r|S t          |                     d          pd                                          }|sdS 	 ddlm}  |||	          S # t          $ r Y dS w xY w)
Nrl   r0   api_modecopilotrb   chat_completionsr   )copilot_model_api_mode)rt   )	r"   rR   r'   r(   _parse_api_moders   hermes_cli.modelsry   rV   )rf   rt   rm   configured_mode
model_namery   s         r*   _copilot_runtime_api_moder~      s    immJ77=2>>DDFFLLNN%immJ&?&?@@O ?	K^__ Y]]9--344::<<J "!!"<<<<<<%%j'BBBB " " "!!!"s   :C 
CC>   rE   bedrock_converserx   codex_app_serverrF   rawr   c                    t          | t                    r1|                                                                 }|t          v r|S dS )z@Validate an api_mode value from config. Returns None if invalid.N)rc   r"   r'   r(   _VALID_API_MODES)r   rH   s     r*   rz   rz      sD    #s YY[[&&((
)))4r,   rv   Optional[Dict[str, Any]]c                    |s|S | dvr|S t          |                    d          pd                                                                          }|dk    rdS |S )u  Optional opt-in: rewrite api_mode → "codex_app_server" for OpenAI/Codex
    providers when the user has explicitly enabled that runtime via
    `model.openai_runtime: codex_app_server` in config.yaml.

    Default behavior is preserved: when the key is unset, "auto", or empty,
    this function is a no-op. Only providers in {"openai", "openai-codex"}
    are eligible — other providers (anthropic, openrouter, etc.) cannot be
    rerouted through codex.

    Returns the (possibly-rewritten) api_mode.>   openaiopenai-codexopenai_runtimer0   r   )r"   rR   r'   r(   )rl   rv   rf   runtimes       r*   %_maybe_apply_codex_app_server_runtimer      sp       111)-- 0117R88>>@@FFHHG$$$!!Or,   )rf   pooltarget_modelentryr	   requested_providerr   Optional[CredentialPool]r   c           	     N	   |pt                      }|p|                    d          pd}t          |dd           pt          |dd           pd                    d          }t          |dd           pt          |dd          }d}	| d	k    rd
}	|pt          }n| dk    rd
}	|pt
          }n| dk    rd}	|pt          }n| dk    rd}	|pd}n| dk    r%d}	t          j        |           }
|p
|
r|
j        nd}ne| dk    rd}	t          |                    d          pd          
                                                                }d}|dk    rIt          |                    d          pd          
                                                    d          }|p|pd}n| dk    r|pt          }n| dk    rd
}	n| dk    rd}	n| dk    r5t          |t          |dd                    }	|pt          d         j        }n\| dk    rt          |                    d          pd          
                                                                }|dk    rst          |                    d          pd          
                                                    d          }|r|}t          |                    d                    }|r|}	|r/|	dk    r)	 ddlm}  ||          }n# t"          $ r d }Y nw xY w|r|}	|	dk    rt%          j        dd|          }nEt          |                    d          pd          
                                                                }t          j        |           }
|
o0|                    d          |
j                            d          k    }|| k    rO|rMt          |                    d          pd          
                                                    d          }|r|}t          |                    d                    }| dv rddlm}  || |          }	n(|rt+          | |          r|}	nt-          |          }|r|}	|	dk    r| dv rt%          j        dd|          }t/          | |	|          }	| |	||t          |d d!          ||d"S )#Nrb   r0   runtime_base_urlrA   rD   runtime_api_keyaccess_tokenrx   r   rE   	xai-oauth
qwen-oauthgoogle-gemini-clizcloudcode-pa://googleminimax-oauthrF   	anthropicrl   https://api.anthropic.com
openrouterxainousrw   azure-foundryrv   r   azure_foundry_model_api_mode/v1/?$   opencode-goopencode-zenopencode_model_api_mode)rl   rv   rf   sourcer   )rl   rv   rA   rt   r   credential_poolr   )rk   rR   getattrr6   r   r   r   r   inference_base_urlr"   r'   r(   r   r~   rz   r{   r   rV   resubr   rs   rJ   r   )rl   r   r   rf   r   r   effective_modelrA   rt   rv   pconfigr:   r9   r|   r   inferredrm   pool_url_is_defaultr   rj   s                       r*    _resolve_runtime_from_pool_entryr      sw    0.00I $Ey}}Y'?'?E2O1488bGE:W[<\<\b`bjjknooHe.55[XZ9[9[G!H>!!$55	[	 	 $99	\	!	!%44	(	(	(%66	_	$	$
 (#'11Ng M : :2	[	 	 '9==44:;;AACCIIKK;&&y}}Z88>B??EEGGNNsSSLJ8J/J	\	!	!22	U		$	V		%	Y		,YGXZ\8]8]^^N0;N	_	$	$9==44:;;AACCIIKK?**y}}Z88>B??EEGGNNsSSL ('-immJ.G.GHHO +*
  	$x+??? JJJJJJ77HH        $#+++viX66H!)--
";";"ArBBHHJJPPRR
 $'11%h(//#*>*>'B\BcBcdgBhBh*h(**/B*y}}Z88>B??EEGGNNsSSL ('))--
*C*CDD666 BAAAAA..xIIHH 	$!EhPc!d!d 	$&HH
 099H $# '''H8W,W,W6)R22 5H	  H
 %6220  s   K# #K21K2	requestedc                   | r:|                                  r&|                                                                  S t                      }|                    d          }t	          |t
                    r:|                                 r&|                                                                 S t          j        dd                                                                           }|r|S dS )z=Resolve provider request from explicit arg, config, then env.rl   HERMES_INFERENCE_PROVIDERr0   auto)r'   r(   rk   rR   rc   r"   osgetenv)r   rf   r:   env_providers       r*   resolve_requested_providerr   e  s     )Y__&& )  &&(((!##I==,,L,$$ ,););)=)= ,!!##))+++ 98"==CCEEKKMML 6r,   provider_labelapi_mode_overrideprovider_namec                P   t          | |          }|sdS 	 t          |          }|                                sdS |                                }|dS t	          |dd          pt	          |dd          }|sdS ||pt          |           pd| |d| |dS # t          $ r Y dS w xY w)	zXCheck if a credential pool exists for a custom endpoint and return a runtime dict if so.r   Nr   r   r0   rx   zpool:)rl   rv   rA   rt   r   r   )r
   r   has_credentialsselectr   rJ   rV   )rA   r   r   r   pool_keyr   r   pool_api_keys           r*   _try_resolve_from_custom_poolr   x  s     ,HMRRRH t""##%% 	4=4u&7>>d'%Q_acBdBd 	4&)e-Eh-O-OeSe #(h((#
 
 	
    tts"   #B B $B :B 
B%$B%c           	     >   t          | pd          }|r|dk    rd S |dk    rd S |                    d          sT	 t          j        |          }|pd                                                                |k    rd S n# t          $ r Y nw xY wt                      }|                    d          }t          |t                    r|                                D ]y\  }}t          |t                    st          |          }t          |                    dd          pd                                          }|r't          j        |d                                          nd}	|	s7t          |                    dd          pd                                          }	|||d| hv r|                    d          p+|                    d	          p|                    d
          pd}
|
r|                    d|          |
                                |	|                    dd          d}t          |                    d          p|                    d                    }|r||d<   |c S |                    dd          }|rt          |          }|||d| hv r|                    d          p+|                    d	          p|                    d
          pd}
|
ro||
                                |	|                    dd          d}t          |                    d          p|                    d                    }|r||d<   |c S {|                    d          }t          |t                    rt                               d           d S t%          |          }|sd S |D ]}t          |t                    s|                    d          }|                    d
          }
t          |t                    rt          |
t                    snt          |          }d| }t          |                    dd          pd                                          }|rt          |          nd}|rd| nd}|||||hvr|                                |
                                t          |                    dd          pd                                          d}t          |                    dd          pd                                          }|r||d<   |r||d<   t          |                    d                    }|r||d<   t          |                    dd          pd                                          }|r||d<   |c S d S )Nr0   r<   r   ro   	providerskey_envrt   apirY   rA   namedefault_model)r   rA   rt   ra   rv   	transportcustom_providerszcustom_providers in config.yaml is a dict, not a list. Each entry must be prefixed with '-' in YAML. Run 'hermes doctor' for details.provider_key)r   rA   rt   ra   )r+   rp   auth_modr   r'   r(   r   r   rR   rc   rd   itemsr"   r   r   rz   rW   warningr   )r   requested_norm	canonicalre   r   ep_namer   	name_normr   resolved_api_keyrA   resultrv   display_namedisplay_normr   r   menu_keyr   provider_key_normprovider_menu_keyr}   s                         r*   _get_named_custom_providerr     s   45G5M2NNN ^x77t
 t$$Y// 	 1.AAI R&&((..00NBBt C  	 	 	D	 ]]F 

;''I)T"" 3&'oo// 2	& 2	&NGUeT** 7@@I%))Ir228b99??AAGAHPry"55;;===b# O#&uyyB'?'?'E2#F#F#L#L#N#N '96K	6K6K!LLL 99U++^uyy/?/?^599ZCXCX^\^ " %		&' : :$,NN$4$4#3!&?B!?!?	 F  /uyy/D/D/^		R]H^H^__H 6-5z*!MMM 99VR00L &>|LL!lLBZLBZBZ%[[[$yy//b599U3C3CbuyyQ[G\G\b`bH 
&$0(0(8(8'7%*YY%C%C	" " $3599Z3H3H3bEIIVaLbLb#c#c# :19F:.% zz"455"D)) /	
 	
 	

 t6v>> t!  %&& 	yy  99Z(($$$ 	Jx,E,E 	3D99	(Y((599^R88>B??EEGGMYa;LIII_a=NV9&7999TV)X7HJ[!\\\JJLL ((599Y339r::@@BB
 

 eii	2..4"55;;== 	( 'F9 	2%1F>""599Z#8#899 	*!)F:7B//5266<<>>
 	)(F7O4s   A= =
B
	B
explicit_api_keyexplicit_base_urlr   r   c           
     Z   | pd                                                                 }|dk    r|r|                                                     d          }t          |dd           }|rd|d<   |S |pd                                 t	          j        dd                                           t	          j        dd                                           g}t          d |D             d          pd	}dt          |          pd
||d| dS t          |           }|sd S |pd                                 p|	                    dd                              d          }|sd S t          |d|	                    d          |	                    d                    }|r|	                    d          }	|	r|	|d<   |S |pd                                 t          |	                    dd          pd                                           t	          j        t          |	                    dd          pd                                           d                                           t	          j        dd                                           t	          j        dd                                           g}t          d |D             d          }d|	                    d          pt          |          pd
||pd	d|	                    d|            d}
|	                    d          r|d         |
d<   |
S )Nr0   r<   rD   zdirect-aliasr   OPENAI_API_KEYOPENROUTER_API_KEYc              3  8   K   | ]}t          |          |V  d S Nr   ).0cs     r*   	<genexpr>z0_resolve_named_custom_runtime.<locals>.<genexpr>6  s0      CC1.?.B.BCQCCCCCCr,   no-key-requiredrx   rl   rv   rA   rt   r   r   rA   rv   r   r   ra   rt   r   c              3  8   K   | ]}t          |          |V  d S r   r   r   	candidates     r*   r   z0_resolve_named_custom_runtime.<locals>.<genexpr>^  s1      bb)EVW`EaEabIbbbbbbr,   zcustom_provider:rl   rv   rA   rt   r   )r'   r(   r6   r   r   r   nextrJ   r   rR   r"   )r   r   r   r   rA   pool_resultapi_key_candidatesrt   custom_providerr}   r   s              r*   _resolve_named_custom_runtimer     s    ).B5577==??N!!&7!$**,,33C88 4HhMM 	$2K!#**,,I&++1133I*B//5577

 CC*CCC
 
   	
 !0::P>P $"4
 
 	
 11CDDO t 
	 b'')) 	/z2..fSkk   t 0(ODWDWXbDcDc  tC  tG  tG  HN  tO  tO  P  P  PK  %((11
 	.#-K  
	R&&((O	2..4"55;;==
	#o)))R88>B??EEGGLLRRTT
	"B''--//
	&++1133 bb/AbbbdfggG #''
33 #H--//V_%8%8AS%T%TVV F 7## 3)'2wMr,   c           	        t                      }t          |                    d          t                    r|                    d          nd}t          |                    d          t                    r|                    d          nd}d}dD ]V}|                    |          }t          |t                    r*|                                r|                                } nW| pd                                                                }	|                                                                }t          j        dd                                          }
t          j        dd                                          }d}|                                r+|s)|	dk    r|r|dk    rd	}n|	d
k    rt          ||          rd	}|pd                                p"|p |r|                                ndp|
pt          
                    d          }t          |d          }|r*|t          j        d          t          j        d          g}nUt          |d          }||r|nd|rt          j        d          ndt          j        d          t          j        d          g}t          d |D             d          }|s|rdnd}|	d
k    rd
nd}|d
k    rA|r?t          ||t          |                    d                    |	d
k    r| nd           }|r|S |d
k    r|s|sd}|t          |                    d                    pt          |          pd|||dS )NrA   r0   rl   )rt   r   r   CUSTOM_BASE_URLFr   Tr<   rD   r=   r   r   z
ollama.comOLLAMA_API_KEYc              3  z   K   | ]6}t          |          t          |pd                                           V  7dS )r0   N)r   r"   r'   r   s     r*   r   z._resolve_openrouter_runtime.<locals>.<genexpr>  sI      jj)M^_hMiMijY_"			#	#	%	%jjjjjjr,   explicitz
env/configr   rv   r   r   rx   r   )rk   rc   rR   r"   r'   r(   r   r   r@   r   r6   r   r   r   rz   rJ   )r   r   r   rf   r9   r:   cfg_api_keykvr   env_openrouter_base_urlenv_custom_base_urluse_config_base_urlrA   _is_openrouter_urlr   _is_ollama_urlrt   r   effective_providerr   s                        r*   _resolve_openrouter_runtimer   p  s    "##I0:9==;T;TVY0Z0Zb9==,,,`bL0:9==;T;TVY0Z0Zb9==,,,`bLK  MM!a 	!'')) 	''))KE(.B5577==??N%%''--//L i(=rBBHHJJ)$5r::@@BB
   '$5 'V## +<6#9#9&*#x'',X,-
 -
' #' 
	 b'')) 		$7?L   R	 #	 fSkk  /xII 
I*++I&''
 /xFF/7[[R,:BRY'(((I&''I*++
 jj7Ijjj
 G
 -T0ATZZF &4x%?%?\ X%%(% 4(/)--
:S:S*T*T0>(0J0J,,PT
 
 
  	X%%g%>P%# '#IMM*$=$=>> #H--  r,   )r   r   r   c                   t          |pd                                          }t          |pd                                                              d          }t          |                    d          pd                                                                          }d}d}|dk    rmt          |                    d          pd                                                              d          }t          |                    d                    pd}t          |p|                    d          pd                                          }	|	r/|d	k    r)	 d
dlm}
  |
|	          }n# t          $ r d}Y nw xY w|r|}t          j
        dd                                                              d          }|p|p|}|st          d          |}|s'	 d
dlm}  |d          pd}n# t          $ r d}Y nw xY w|s't          j
        dd                                          }|st          d          |d	k    rt          j        dd|          }|s|rdnd}d||||| dS )a|  Resolve an Azure Foundry runtime entry.

    Reads ``model.base_url`` + ``model.api_mode`` from config.yaml (or
    explicit overrides), pulls the API key from ``.env`` / env var, and
    strips a trailing ``/v1`` for Anthropic-style endpoints because the
    Anthropic SDK appends ``/v1/messages`` internally.

    Raises :class:`AuthError` when required values are missing.
    r0   rD   rl   rx   r   rA   rv   rb   rF   r   r   NAZURE_FOUNDRY_BASE_URLzpAzure Foundry requires a base URL. Set it via 'hermes model' or the AZURE_FOUNDRY_BASE_URL environment variable.)get_env_valueAZURE_FOUNDRY_API_KEYzrAzure Foundry requires an API key. Set AZURE_FOUNDRY_API_KEY in ~/.hermes/.env or run 'hermes model' to configure.r   r   re   r   )r"   r'   r6   rR   r(   rz   r{   r   rV   r   r   r   hermes_cli.configr  r   r   )r   rf   r   r   r   explicit_base_url_cleanr:   r9   cfg_api_moder   r   r   env_base_urlrA   rt   r  r   s                    r*   _resolve_azure_foundry_runtimer	    s   " +1r2288::!"3"9r::@@BBII#NNy}}Z006B77==??EEGGLL%L&&9==44:;;AACCJJ3OO&y}}Z'@'@AAWEW ,H)--	*B*BHbIIOOQQO $<+???	FFFFFF33ODDHH 	 	 	HHH	 	$#L95r::@@BBII#NNL&F,F,H 
?
 
 	

 G 	777777#m$;<<BGG 	 	 	GGG	 A)3R88>>@@ 
A
 
 	
 +++6)R22,P0APZZF# 0  s$   E, ,E;:E;G, ,G;:G;c                	   t          |pd                                          }t          |pd                                                              d          }|s|sd S | dk    rt          |                    d          pd                                                                          }d}|dk    rIt          |                    d          pd                                                              d          }|p|pd}|}|s!ddlm}	  |	            }|st          d	          dd
||d|dS | dk    r|pt          }|}d }
|sft                      }|                    dd          }|                    d          }
|s+|                    dd                              d          p|}dd||d|
|dS | dk    rt          j        d          pi }|pRt          |                    d          pt          j                                                                      d          }|p5t          |                    d          pd                                          }|                    d          p|                    d          }|st          t          dt          t!          j        dd                              t%          t!          j        dd                              }|                    dd          }|                    d          }|s+|                    dd                              d          p|}dd||d||dS | dk    rt'          ||||           S t)          j        |           }|rj|j        dk    r^d}|j        r?t!          j        |j        d                                                              d          }|}|sF| d!v r9t/          |           }|                    dd                              d          }n	|p|j        }|}|sPt/          |           }|                    dd          }|s)|                    dd                              d          }d}| d"k    rt3          ||          }nC| d#k    rd}n:t5          |                    d$                    }|r|}nt7          |          }|r|}| ||                    d          |d|dS d S )%Nr0   rD   r   rl   rA   r   r   resolve_anthropic_tokenNo Anthropic credentials found. Set ANTHROPIC_TOKEN or ANTHROPIC_API_KEY, run 'claude setup-token', or authenticate with 'claude /login'.rF   r   r   r   rt   last_refreshrE   rl   rv   rA   rt   r   r  r   r   r   	agent_keyagent_key_expires_at
expires_at<   HERMES_NOUS_MIN_KEY_TTL_SECONDS1800HERMES_NOUS_TIMEOUT_SECONDS15min_key_ttl_secondstimeout_secondsrx   rl   rv   rA   rt   r   r  r   r   )r   rf   r   r   >   kimi-codingkimi-coding-cnrw   r   rv   )r"   r'   r6   rR   r(   agent.anthropic_adapterr  r   r   r   r   get_provider_auth_stateDEFAULT_NOUS_INFERENCE_URLr   maxintr   r   floatr	  r   	auth_typebase_url_env_varr   r   r~   rz   rJ   )rl   r   rf   r   r   r:   r9   rA   rt   r  r  credsstater  r   env_urlrv   r|   rj   s                      r*   _resolve_explicit_runtimer)  .  s    +1r2288::-344::<<CCCHH $5 t;9==44:;;AACCIIKK;&&y}}Z88>B??EEGGNNsSSL$SS8S" 	GGGGGG--//G V  
 $,  "4
 
 	
 >!!$>(>" 	M577Eii	2..G 99^44L$ M 99Z44;;C@@LH&)  ("4
 
 	
 6088>B o599122Yh6YZZ``bbiijmnn 	 #Oc%))K*@*@*FB&G&G&M&M&O&OYY566Q%))L:Q:Q
 	M4$'C	:[]c0d0d,e,e$f$f %bi0Mt&T&T U U  E ii	2..G<00J$ M 99Z44;;C@@LH*  $"4
 
 	
 ?""-1-/	
 
 
 	
  #H--G +
7$	11# 	Ri 8"==CCEELLSQQG$ 	A<<<<XFF 99Z44;;C@@"@g&@" 	A8BBEii	2..G A 99Z44;;C@@%y  0GDDHH(HH-immJ.G.GHHO (* 4H== ('H !  ,, "4
 
 	
 4r,   )r   r   r   r   c                $   t          |           }|pd                                }|dk    rd|v r|pd                                pMt          j        dd                                          p&t          j        dd                                          }dd|                    d          |d|d	S |d
k    r"t          |t                      |||          }|S t          |||          }|r||d<   |S t          |||          }	t                      }
t          |	||
||          }|r|S |	dk    }|	dk    rt          |
                    d          pd                                                                          }t          |
                    d          pd                                          }t          j        dd                                          }t          j        dd                                          }t          |p|p|          }|r|dv rd}t          |p|          }|dv o| o| }	 |rt          |	          nd}n# t          $ r d}Y nw xY w|r|                                r|                                }d}|"t%          |dd          pt%          |dd          }|	dk    r||rt'          dt)          t          j        dd                              }t%          |dd          t%          |d d          d!}t+          ||          st,                              d"           d}||rt1          |	|||
||#          S |	dk    r	 t3          t'          dt)          t          j        dd                              t5          t          j        d$d%                    &          }dd'|                    dd                              d          |                    d(d          |                    d)d*          |                    d+          |d,S # t6          $ r$ |d-k    r t,                              d.           Y nw xY w|	d/k    r	 t;                      }d/d0|                    dd                              d          |                    d(d          |                    d)d1          |                    d2          |d3S # t6          $ r$ |d-k    r t,                              d4           Y nw xY w|	d5k    r	 t=                      }d5d0|                    d          pd                    d          pt>          |                    d(d          |                    d)d1          |                    d2          |d3S # t6          $ r$ |d-k    r t,                              d6           Y nw xY w|	d7k    r	 tA                      }d7d'|                    dd                              d          |                    d(d          |                    d)d8          |                    d9          |d:S # t6          $ r$ |d-k    r t,                              d;           Y nw xY w|	d<k    rZtC          j        |	          }|rD|j"        d=k    r9d>d?l#m$}  |            }|	d|d         |d(         |                    d)d@          |d	S |	dAk    r	 tK                      }dAd'|                    dd          |                    d(d          |                    d)dB          |                    d9          |                    dCd          |                    dDd          |dE	S # t6          $ r$ |d-k    r t,                              dF           Y nw xY w|	dGk    rtM          |	          }dGd'|                    dd                              d          |                    d(d          |                    dHd          tO          |                    dI          pg           |                    d)dJ          |dKS |	dk    rt          |
                    d          pd                                                                          }d}|dk    r<|
                    d          pd                                                    d          }|pdL}d|                                v p|od|                                v }|rd}dMD ]e}t          |
                    |          pd                                          }|r+t          j        |d                                          }|r nf|s6t          |
                    d(          pd                                          }|sNt          j        dd                                          p&t          j        dd                                          }|st7          dN          n!d>dOl(m)}   |             }|st7          dP          dd||dQ|d	S |	dRk    rd>dSl*m+}!m,}"m-}#m.}$ |dTv }%|%s |!            st7          dUdVW          t_                                          dRi           }&|&                    dX          pd                                p	 |#            }' |"            pdY}(|&                    dZi           })d}*|)                    d[          rf|)                    d\          rQ|)d[         |)d\         d]}*|)                    d^          r|)d^         |*d_<   |)                    d`          r|)d`         |*d`<   t          |
                    da          pd                                          }+ |$|+          rdRddb|' dcdd|(|'d|de},ndRdfdb|' dcdd|(|'|dg},|*r|*|,dh<   |,S tC          j        |	          }|r|j"        d(k    rta          |	          }t          |
                    d          pd                                                                          }d}||	k    r<|
                    d          pd                                                    d          }|p(|                    dd                              d          }d'}-|	dik    r%tc          |
|                    d(d                    }-n|	djk    rd0}-nt          |
                    d          pd                                                                          }.te          |
                    dk                    }/|	dlv r+d>dml3m4}0 |p|
                    dad          }1 |0|	|1          }-n(|/rtk          |	|.          r|/}-ntm          |          }2|2r|2}-|-dk    r|	dlv rto          j8        dnd|          }|	|-||                    d(d          |                    d)dQ          |d	S ts          |||          },||,d<   |,S )oa)  Resolve runtime provider credentials for agent execution.

    target_model: Optional override for model_cfg.get("default") when
    computing provider-specific api_mode (e.g. OpenCode Zen/Go where different
    models route through different API surfaces). Callers performing an
    explicit mid-session model switch should pass the new model here so
    api_mode is derived from the model they are switching TO, not the stale
    persisted default. Other callers can leave it None to preserve existing
    behavior (api_mode derived from config).
    r0   r   z	azure.comAZURE_ANTHROPIC_KEYANTHROPIC_API_KEYrF   rD   zazure-explicitr   r   )r   rf   r   r   r   )r   r   r   r   r   )rl   r   rf   r   r   r   rl   rA   OPENAI_BASE_URLr   >   r   r<   T>   r   r   Nr   r   r   r  r  r  r  r  )r  r  zPNous pool entry agent_key expired/missing, falling through to runtime resolution)rl   r   r   rf   r   r   r  r  r  rx   rt   r   portalr  r  r   zUAuto-detected Nous provider but credentials failed; falling through to next provider.r   rE   zhermes-auth-storer  r  zVAuto-detected Codex provider but credentials failed; falling through to next provider.r   zZAuto-detected xAI OAuth provider but credentials failed; falling through to next provider.r   zqwen-cliexpires_at_ms)rl   rv   rA   rt   r   r/  r   z@Qwen OAuth credentials failed; falling through to next provider.r   oauth_minimaxr   ))resolve_minimax_oauth_runtime_credentialsoauthr   zgoogle-oauthemail
project_id)	rl   rv   rA   rt   r   r/  r3  r4  r   zIGoogle Gemini OAuth credentials failed; falling through to next provider.zcopilot-acpcommandargsprocess)rl   rv   rA   rt   r5  r6  r   r   r   )r   api_key_envzNo Azure Anthropic API key found. Set AZURE_ANTHROPIC_KEY or ANTHROPIC_API_KEY, or point key_env/api_key_env in your config.yaml model section at a custom env var.r  r  envbedrock)has_aws_credentialsresolve_aws_auth_env_varresolve_bedrock_regionis_anthropic_bedrock_model>   aws-bedrockamazon-bedrockawsamazonr:  zNo AWS credentials found for Bedrock. Configure one of:
  - AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY
  - AWS_PROFILE (for SSO / named profiles)
  - IAM instance role (EC2, ECS, Lambda)
Or run 'aws configure' to set up credentials.no_aws_credentials)coderegionzaws-sdk-default-chain	guardrailguardrail_identifierguardrail_version)guardrailIdentifierguardrailVersionstream_processing_modestreamProcessingModetracerb   zhttps://bedrock-runtime.z.amazonaws.comzaws-sdk)rl   rv   rA   rt   r   rE  bedrock_anthropicr   r   )rl   rv   rA   rt   r   rE  r   guardrail_configrw   r   rv   r   r   r   ):r   r'   r   r   r6   r	  rk   r   r   r)  r"   rR   r(   r.   r   rV   r   r   r   r!  r"  r   rW   rX   r   r   r#  r   infor   r   r   r   r   r$  hermes_cli.authr1  r   r   listr  r  agent.bedrock_adapterr;  r<  r=  r>  r   r   r~   rz   r{   r   rs   rJ   r   r   r   )3r   r   r   r   r   	_eff_base
_azure_keyazure_runtimecustom_runtimerl   rf   explicit_runtimeshould_use_poolr:   r9   env_openai_base_urlr   has_custom_endpointhas_runtime_overrider   r   r   min_ttl
nous_stater&  r   r1  rA   _is_azure_endpointtokenhint_keyenv_varr  r;  r<  r=  r>  is_explicit_bedrock_cfgrE  auth_source_grrO  _current_modelr   rv   rm   r|   r   
_effectiverj   s3                                                      r*   resolve_runtime_providerri    s    " 4I>> #(b//11I[(([I-E-E#**,, :y.3399;;:y,b117799 	 $,!((--!&"4
 
 	
 _,,61'))-/%
 
 
 2-)+  N
  /A+,)+  H
 "##I0-)+     ,.O<9==44:;;AACCIIKK9==44:;;AACC i(92>>DDFF"$),A2"F"F"L"L"N"N" '"'&
 

  	'L,>>>"&#$4$I8IJJ"88 )'')(( 	&5?y"""4    $$&& 0$77 65."55  v%"3"3"c"),Mv"V"VWWXXG$UK>>(/7Mt(T(T J (
G<< "oppp!3!#5#)    6	=4$'C	:[]c0d0d,e,e$f$f %bi0Mt&T&T U U  E
 #.!IIj"55<<SAA 99Y33))Hh77#ii55&8    	= 	= 	=!V++ KK < = = = = =	= >!!	=577E*-!IIj"55<<SAA 99Y33))H.ABB %		. 9 9&8    	= 	= 	=!V++ KK < = = = = =	= ;	=9;;E'-"YYz228b@@EEcIc 99Y33))H.ABB %		. 9 9&8    	= 	= 	=!V++KK < = = = = =	= <	=466E(.!IIj"55<<SAA 99Y33))Hj99!&?!;!;&8    	= 	= 	=!V++KK < = = = = =	= ?""#'11 
	w(O;;QQQQQQ==??E$0!*- +))Hg66&8   &&&	=<>>E/.!IIj"55 99Y33))Hn==!&?!;!;7B//#iib99&8
 
 
  	= 	= 	=!V++KK < = = = = =	= =  =hGG%*		*b1188==yyB//yyB//6**0b11ii)44"4	
 	
 		
 ; 9==44:;;AACCIIKK;&&%MM*55;BBDDKKCPPL>#> )HNN,<,<< 
@[L,>,>,@,@@ 	  %	 E6  immH55;<<BBDD Igr2288::E   DIMM)44:;;AACC I3R88>>@@ By!4b99??AA   E   HGGGGG++--E V  
 $, "4
 
 	
 9	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ),ii 	#6#6#8#8 	@
 *    #}}((B77""8,,299;;W?U?U?W?W..00K4K{B//77)** 	9sww7J/K/K 	9'*+A'B$'(;$<    ww/00 Y;>?W;X !78www 9,/L ) Y]]955;<<BBDD%%n55 	 &0MvMMM$% %)&8	 	GG &.MvMMM$% &8 G  	;*:G&'  #H--G 3
7$	114X>>
 9==44:;;AACCIIKK8##%MM*55;BBDDKKCPPLH599Z#<#<#C#CC#H#H%y  0EIIiQS<T<TUUHH(HH"%immJ&?&?&E2"F"F"L"L"N"N"T"T"V"V-immJ.G.GHHO::: FEEEEE)IY]]9b-I-I
228ZHH  (%I(Tg%h%h (*
 4H== ('H+++<[0[0[viX66H   yyB//ii%00"4
 
 	
 *-)+  G
 %7G !Nsq   ;I IIC
P% %+QQA9S +TTBV +V?>V?	A9Y +Y10Y1B], ,+^^errorrV   c                h    t          | t                    rt          |           S t          |           S r   )rc   r   r   r"   )rj  s    r*   format_runtime_provider_errorrl    s.    %## ( '''u::r,   )r!   r"   r#   r"   )r-   r"   r#   r.   )r9   r"   r:   r"   r#   r.   )rA   r"   r#   rB   )rA   r"   r#   r"   )r#   r_   r   )rl   rB   rm   rB   r#   r.   )rf   r_   rt   r"   r#   r"   )r   r   r#   rB   )rl   r"   rv   r"   rf   r   r#   r"   )rl   r"   r   r	   r   r"   rf   r   r   r   r   rB   r#   r_   )r   rB   r#   r"   )NN)
rA   r"   r   r"   r   rB   r   rB   r#   r   )r   r"   r#   r   )r   r"   r   rB   r   rB   r#   r   )r   r"   r   rB   r   rB   r#   r_   )r   r"   rf   r_   r   rB   r   rB   r   rB   r#   r_   )rl   r"   r   r"   rf   r_   r   rB   r   rB   r#   r   )
r   rB   r   rB   r   rB   r   rB   r#   r_   )rj  rV   r#   r"   )C__doc__
__future__r   loggingr   r   typingr   r   r   	getLogger__name__rW   
hermes_clir   r   agent.credential_poolr   r	   r
   r   rQ  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   hermes_constantsr   utilsr   r    r+   r8   r@   rJ   r^   rk   rs   r~   r   rz   r   r   r   r   r   r   r   r	  r)  ri  rl   r,   r*   <module>rx     s   M M " " " " " "  				 				 & & & & & & & & & &		8	$	$ ' ' ' ' ' ' k k k k k k k k k k k k                                   $ K J J J J J J J 0 0 0 0 0 0 : : : : : : : :3 3 3 3= = = =
5 5 5 5$   6   .   ,8 8 8 8 8"" " " "$         > +/%)"&F F F F F FR    , (,#'	    @B B B BP '+'+	P P P P P Pl '+'+	i i i i i i` '+'+"&O O O O O On '+'+P P P P P Pj  $&*'+"&L L L L L L^     r,   