
    i                       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# ddl$m%Z%m&Z& dd	l'm(Z( dd
l)m*Z*m+Z+ dAdZ,dBdZ-dCdZ.dDdZ/dEdZ0dFdZ1dGdHdZ2dId Z3h d!Z4dJd$Z5dddd%dKd-Z6dGdLd/Z7	 dGdMd2Z8dNd3Z9ddd4dOd7Z:ddd4dPd8Z;dddd9dQd:Z<ddd4dRd;Z=ddddd<dSd=Z>dTd@Z?dS )UzGShared 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PROVIDER_REGISTRY_agent_key_is_usableformat_auth_errorresolve_provider resolve_nous_runtime_credentials!resolve_codex_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/ubuntu/.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_hostnamer6   '   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.
    r.   FcustomTopenrouter.ai)r%   r&   r   r6   r   )r7   r8   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).
    r.   /zapi.x.aicodex_responseszapi.openai.comz
/anthropicanthropic_messageszapi.kimi.comz/codingN)r%   r&   r4   r   endswith)r?   
normalizedhostnames      r(   _detect_api_mode_for_urlrH   >   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 n# t          $ r Y nw xY wdS )zFQuery a local server for its model name when only one model is loaded.r.   r   NrB   z/v1z/models   )timeoutdata   id)requestsr4   rE   getokjsonlen	Exception)r?   rO   urlrespmodelsmodel_ids         r(   _auto_detect_local_modelrY   Y   s     rooc""||E"" 	5LC||C)OQ|777 	$YY[[__VR00F6{{a!!9==r22 $#O   2s   B.B6 6
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defaultr.   r?   r2   r3   )r   rP   
isinstancedictr%   rY   r    )config	model_cfgcfgr]   r?   is_localis_fallbackdetecteds           r(   _get_model_configrf   n   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).
    r.   Tr:   custom:)r%   r&   
startswith)rg   rh   normalized_providernormalized_configureds       r(   $_provider_supports_explicit_api_modern      s     $>r002288::06B==??EEGG  th&&$0_4I4T4TU^4_4__ $777r*   ra   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)
Nrg   r.   api_modecopilotr]   chat_completionsr   )copilot_model_api_mode)ro   )	r    rP   r%   r&   _parse_api_modern   hermes_cli.modelsrt   rT   )ra   ro   rh   configured_mode
model_namert   s         r(   _copilot_runtime_api_modery      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>   rC   bedrock_conversers   rD   rawr   c                    t          | t                    r1|                                                                 }|t          v r|S dS )z@Validate an api_mode value from config. Returns None if invalid.N)r^   r    r%   r&   _VALID_API_MODES)r{   rF   s     r(   ru   ru      sD    #s YY[[&&((
)))4r*   )ra   pooltarget_modelentryr	   requested_providerOptional[Dict[str, Any]]r~   Optional[CredentialPool]r   c           	        |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
          }ns| dk    rd}	|p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          |dd          ||dS ) Nr]   r.   runtime_base_urlr?   rB   runtime_api_keyaccess_tokenrs   openai-codexrC   
qwen-oauthgoogle-gemini-clizcloudcode-pa://google	anthropicrD   rg   https://api.anthropic.com
openrouterxainousrr   azure-foundryrq   r   azure_foundry_model_api_mode/v1/?$zopencode-zenzopencode-goopencode_model_api_modesourcer~   )rg   rq   r?   ro   r   credential_poolr   )rf   rP   getattrr4   r   r   r    r%   r&   r   ry   r   inference_base_urlru   rv   r   rT   resubr   rn   rH   )rg   r   r   ra   r~   r   effective_modelr?   ro   rq   r8   r7   rw   r   inferredrh   pconfigpool_url_is_defaultr   re   s                       r(    _resolve_runtime_from_pool_entryr      s    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	\	!	!%44	(	(	(%66	[	 	 '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 %6220  s   J% %J43J4	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.rg   HERMES_INFERENCE_PROVIDERr.   auto)r%   r&   rf   rP   r^   r    osgetenv)r   ra   r8   env_providers       r(   resolve_requested_providerr   +  s     )Y__&& )  &&(((!##I==,,L,$$ ,););)=)= ,!!##))+++ 98"==CCEEKKMML 6r*   provider_labelapi_mode_overridec                L   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.Nr   r   r.   rs   zpool:)rg   rq   r?   ro   r   r   )r
   r   has_credentialsselectr   rH   rT   )r?   r   r   pool_keyr~   r   pool_api_keys          r(   _try_resolve_from_custom_poolr   >  s     ,H55H t""##%% 	4=4u&7>>d'%Q_acBdBd 	4&)e-Eh-O-OeSe #(h((#
 
 	
    tts"   #B B $B 8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 )Nr.   r:   r   rj   	providerskey_envro   apirU   r?   namedefault_model)r   r?   ro   r\   rq   	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   r?   ro   r\   )r)   rk   auth_modr   r%   r&   r   r   rP   r^   r_   itemsr    r   r   ru   loggerwarningr   )r   requested_norm	canonicalr`   r   ep_namer   	name_normr   resolved_api_keyr?   resultrq   display_namedisplay_normr   r   menu_keyr   provider_key_normprovider_menu_keyrx   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           
        | pd                                                                 }|dk    r|r|                                                     d          }|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                    }|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 )Nr.   r:   rB   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>  s0      CC1.?.B.BCQCCCCCCr*   no-key-requiredrs   zdirect-aliasrg   rq   r?   ro   r   r   r?   rq   r\   ro   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:r   rg   rq   r?   ro   r   )r%   r&   r4   r   r   nextrH   r   rP   r   r    )r   r   r   r   r?   api_key_candidatesro   custom_providerpool_resultrx   r   s              r(   _resolve_named_custom_runtimer     sD    ).B5577==??N!!&7!$**,,33C88#**,,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ddK  %((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    r7|r5t          ||t          |                    d                              }|r|S |d
k    r|s|sd}|t          |                    d                    pt          |          pd|||dS )Nr?   r.   rg   )ro   r   r   CUSTOM_BASE_URLFr   Tr:   rB   r;   r   r   z
ollama.comOLLAMA_API_KEYc              3  z   K   | ]6}t          |          t          |pd                                           V  7dS )r.   N)r   r    r%   r   s     r(   r   z._resolve_openrouter_runtime.<locals>.<genexpr>u  sI      jj)M^_hMiMijY_"			#	#	%	%jjjjjjr*   explicitz
env/configr   rq   r   rs   r   )rf   r^   rP   r    r%   r&   r   r   r>   r   r4   r   r   r   ru   rH   )r   r   r   ra   r7   r8   cfg_api_keykvr   env_openrouter_base_urlenv_custom_base_urluse_config_base_urlr?   _is_openrouter_urlr   _is_ollama_urlro   r   effective_providerr   s                        r(   _resolve_openrouter_runtimer   .  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%%(%3(/)--
:S:S*T*T
 
  	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.
    r.   rB   rg   rs   r   r?   rq   r]   rD   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   r`   r   )r    r%   r4   rP   r&   ru   rv   r   rT   r   r   r   hermes_cli.configr   r   r   )r   ra   r   r   r   explicit_base_url_cleanr8   r7   cfg_api_moder   r   r   env_base_urlr?   ro   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 )%Nr.   rB   r   rg   r?   r   r   resolve_anthropic_tokenNo Anthropic credentials found. Set ANTHROPIC_TOKEN or ANTHROPIC_API_KEY, run 'claude setup-token', or authenticate with 'claude /login'.rD   r   r   r   ro   last_refreshrC   rg   rq   r?   ro   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_secondsrs   rg   rq   r?   ro   r   r  r   r   )r   ra   r   r   )zkimi-codingzkimi-coding-cnrr   r   rq   )r    r%   r4   rP   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   ry   ru   rH   )rg   r   ra   r   r   r8   r7   r?   ro   r   r   credsstater  r   env_urlrq   rw   re   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=                      }d5d'|                    dd                              d          |                    d(d          |                    d)d6          |                    d7          |d8S # t6          $ r$ |d-k    r t,                              d9           Y nw xY w|	d:k    rZt?          j        |	          }|rD|j         d;k    r9d<d=l!m"}  |            }|	d|d         |d(         |                    d)d>          |d	S |	d?k    r	 tG                      }d?d'|                    dd          |                    d(d          |                    d)d@          |                    d7          |                    dAd          |                    dBd          |dC	S # t6          $ r$ |d-k    r t,                              dD           Y nw xY w|	dEk    rtI          |	          }dEd'|                    dd                              d          |                    d(d          |                    dFd          tK          |                    dG          pg           |                    d)dH          |dIS |	dk    rt          |
                    d          pd                                                                          }d}|dk    r<|
                    d          pd                                                    d          }|pdJ}d|                                v p|od|                                v }|rd}dKD ]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          dL          n!d<dMl&m'}   |             }|st7          dN          dd||dO|d	S |	dPk    rd<dQl(m)}!m*}"m+}#m,}$ |dRv }%|%s |!            st7          dSdTU          t[                                          dPi           }&|&                    dV          pd                                p	 |#            }' |"            pdW}(|&                    dXi           })d}*|)                    dY          rf|)                    dZ          rQ|)dY         |)dZ         d[}*|)                    d\          r|)d\         |*d]<   |)                    d^          r|)d^         |*d^<   t          |
                    d_          pd                                          }+ |$|+          rdPdd`|' dadb|(|'d|dc},ndPddd`|' dadb|(|'|de},|*r|*|,df<   |,S t?          j        |	          }|r|j         d(k    rt]          |	          }t          |
                    d          pd                                                                          }d}||	k    r<|
                    d          pd                                                    d          }|p(|                    dd                              d          }d'}-|	dgk    r%t_          |
|                    d(d                    }-n|	dhk    rd0}-nt          |
                    d          pd                                                                          }.ta          |
                    di                    }/|	djv r+d<dkl1m2}0 |p|
                    d_d          }1 |0|	|1          }-n(|/rtg          |	|.          r|/}-nti          |          }2|2r|2}-|-dk    r|	djv rtk          j6        dld|          }|	|-||                    d(d          |                    d)dO          |d	S to          |||          },||,d<   |,S )ma)  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).
    r.   r   z	azure.comAZURE_ANTHROPIC_KEYANTHROPIC_API_KEYrD   rB   zazure-explicitr   r   )r   ra   r   r   r   )r   r   r   r   r   )rg   r   ra   r   r   r   rg   r?   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)rg   r   r   ra   r~   r   r  r  r  rs   ro   r   portalr  r  r   zUAuto-detected Nous provider but credentials failed; falling through to next provider.r   rC   zhermes-auth-storer   r   zVAuto-detected Codex provider but credentials failed; falling through to next provider.r   zqwen-cliexpires_at_ms)rg   rq   r?   ro   r   r  r   z@Qwen OAuth credentials failed; falling through to next provider.zminimax-oauthoauth_minimaxr   ))resolve_minimax_oauth_runtime_credentialsoauthr   zgoogle-oauthemail
project_id)	rg   rq   r?   ro   r   r  r!  r"  r   zIGoogle Gemini OAuth credentials failed; falling through to next provider.zcopilot-acpcommandargsprocess)rg   rq   r?   ro   r#  r$  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)r(  awszaws-bedrockzamazon-bedrockamazonzNo 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tracer]   zhttps://bedrock-runtime.z.amazonaws.comzaws-sdk)rg   rq   r?   ro   r   r1  bedrock_anthropicr   rz   )rg   rq   r?   ro   r   r1  r   guardrail_configrr   r   rq   r   r   r   )8r   r%   r   r   r4   r   rf   r   r   r  r    rP   r&   r,   r   rT   r   r   r   r  r  r   r   debugr   r   r  r   infor   r   r   r  hermes_cli.authr  r   r   listr  r   agent.bedrock_adapterr)  r*  r+  r,  r   r   ry   ru   rv   r   rn   rH   r   r   r   )3r   r   r   r   r   	_eff_base
_azure_keyazure_runtimecustom_runtimerg   ra   explicit_runtimeshould_use_poolr8   r7   env_openai_base_urlr   has_custom_endpointhas_runtime_overrider~   r   r   min_ttl
nous_stater  r   r  r?   _is_azure_endpointtokenhint_keyenv_varr   r)  r*  r+  r,  is_explicit_bedrock_cfgr1  auth_source_grr;  _current_modelruntimerq   rh   rw   r   
_effectivere   s3                                                      r(   resolve_runtime_providerrW  |  sA   " 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 < = = = = =	= <	=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 !Ns^   ;I IIC
P% %+QQA9S +TTA9V	 	+V76V7!BZ2 2+[ [ errorrT   c                h    t          | t                    rt          |           S t          |           S r   )r^   r   r   r    )rX  s    r(   format_runtime_provider_errorrZ  9  s.    %## ( '''u::r*   )r   r    r!   r    )r+   r    r!   r,   )r7   r    r8   r    r!   r,   )r?   r    r!   r@   )r?   r    r!   r    )r!   rZ   r   )rg   r@   rh   r@   r!   r,   )ra   rZ   ro   r    r!   r    )r{   r   r!   r@   )rg   r    r   r	   r   r    ra   r   r~   r   r   r@   r!   rZ   )r   r@   r!   r    )r?   r    r   r    r   r@   r!   r   )r   r    r!   r   )r   r    r   r@   r   r@   r!   r   )r   r    r   r@   r   r@   r!   rZ   )r   r    ra   rZ   r   r@   r   r@   r   r@   r!   rZ   )rg   r    r   r    ra   rZ   r   r@   r   r@   r!   r   )
r   r@   r   r@   r   r@   r   r@   r!   rZ   )rX  rT   r!   r    )@__doc__
__future__r   loggingr   r   typingr   r   r   	getLogger__name__r   
hermes_clir   r   agent.credential_poolr   r	   r
   r   r>  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   hermes_constantsr   utilsr   r   r)   r6   r>   rH   rY   rf   rn   ry   r}   ru   r   r   r   r   r   r   r   r  rW  rZ   r*   r(   <module>rf     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"" " " "$ edd     +/%)"&u u u u u up    , (,    >B B B BP '+'+	I I I I I I^ '+'+	f f f f f fZ '+'+"&O O O O O On '+'+P P P P P Pj  $&*'+"&z z z z z zz     r*   