+
    Ki=                        R t ^ RIHt ^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
 RtRt0 RmtR R	 ltR
 R ltR R ltR R ltR R ltR R ltR R ltR# )z*Shared helpers for tool backend selection.)annotationsN)Path)AnyDictenv_var_enabledlocalautoc                   V ^8  d   QhRR/#    returnbool )formats   "7/home/ubuntu/hermes-agent/tools/tool_backend_helpers.py__annotate__r      s     ? ?D ?    c                     \        R4      # )zGReturn True when the hidden Nous-managed tools feature flag is enabled. HERMES_ENABLE_NOUS_MANAGED_TOOLSr   r   r   r   managed_nous_tools_enabledr      s    =>>r   c                    V ^8  d   QhRRRR/# r   valueobject | Noner   strr   )r   s   "r   r   r      s     1 1M 1c 1r   c                    \        T ;'       g    \        4      P                  4       P                  4       pT;'       g    \        # )z)Return a normalized browser provider key.)r   _DEFAULT_BROWSER_PROVIDERstriplower)r   providers   & r    normalize_browser_cloud_providerr!      s6    55556<<>DDFH0000r   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r      s      ] s r   c                    \        T ;'       g    \        4      P                  4       P                  4       pV\        9   d   V# \        # )z=Return the requested modal mode when valid, else the default.)r   _DEFAULT_MODAL_MODEr   r   _VALID_MODAL_MODES)r   modes   & r   coerce_modal_moder'      s;    u+++,224::<D!!r   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r   #   s     $ $ $# $r   c                    \        V 4      # )z)Return a normalized modal execution mode.)r'   )r   s   &r   normalize_modal_moder*   #   s    U##r   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r   (   s      d r   c                     \        \        P                  ! R4      ;'       d    \        P                  ! R4      ;'       g+    \        P                  ! 4       R,          P                  4       4      # )z?Return True when direct Modal credentials/config are available.MODAL_TOKEN_IDMODAL_TOKEN_SECRETz.modal.toml)r   osgetenvr   homeexistsr   r   r   has_direct_modal_credentialsr3   (   sO    	#	$	H	H3G)H 	2 	2IIK-'//1 r   c               (    V ^8  d   QhRRRRRRRR/# )r   
modal_moder   
has_directr   managed_readyr   zDict[str, Any]r   )r   s   "r   r   r   0   s2     ! !! ! 	!
 !r   c               >   \        V 4      p\        V 4      pVR8H  ;'       d    \        4       '       * pVR8X  d   \        4       '       d   V'       d   RMRpM:VR8X  d   V'       d   RMRpM&\        4       '       d   V'       d   RMV'       d   RMRpRVRVRVRVRVR	V/# )
zResolve direct vs managed Modal backend selection.

Semantics:
- ``direct`` means direct-only
- ``managed`` means managed-only
- ``auto`` prefers managed when available, then falls back to direct
managedNdirectrequested_moder&   r6   r7   managed_mode_blockedselected_backend)r'   r*   r   )r5   r6   r7   r;   normalized_moder<   r=   s   &$$    r   resolve_modal_backend_stater?   0   s     'z2N*:6O)#HH,F,H(H  )#(B(D(D9\`	H	$'18t(B(D(D9hr\dx| 	.j 4, r   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   T   s      c r   c                     \         P                  ! RR4      ;'       g    \         P                  ! RR4      P                  4       # )zCPrefer the voice-tools key, but fall back to the normal OpenAI key.VOICE_TOOLS_OPENAI_KEY OPENAI_API_KEY)r/   r0   r   r   r   r   resolve_openai_audio_api_keyrE   T   s8     			*B/ 	+ 	+99%r*egr   >   r	   r:   r9   )__doc__
__future__r   r/   pathlibr   typingr   r   utilsr   r   r$   r%   r   r!   r'   r*   r3   r?   rE   r   r   r   <module>rK      sM    0 " 	   !#  2 ?
1$
!Hr   