
    `gj                    P    d Z ddlmZ ddlZddlmZ d
dZddZddZddZ	dd	Z
y)zFHelpers for reading the effective fallback provider chain from config.    )annotationsN)Anyc                b    t        | t              sy| j                         j                  d      S )N /)
isinstancestrstriprstrip)values    M/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/fallback_config.py_normalized_base_urlr   	   s&    eS!;;=$$    c                X   t        | t              syt        | j                  d      xs d      j	                         }|r|S t        | j                  d      xs | j                  d      xs d      j	                         }|r(t        j                  |d      j	                         xs dS y)aq  API key for one fallback entry: inline ``api_key``, else ``key_env``.

    Mirrors the custom-provider convention (``key_env`` names the env var
    holding the key; ``api_key_env`` accepted as an alias). Returns None when
    neither yields a non-empty value, letting ``resolve_runtime_provider``
    fall through to the provider's standard credential resolution.
    Napi_keyr   key_envapi_key_env)r   dictr	   getr
   osgetenv)entryinliner   s      r   resolve_entry_api_keyr      s     eT"9%+,224F%))I&H%))M*BHbIOOQGyy"%++-55r   c                   t        | t              r| g}nt        | t              r| }ng S g }|D ]  }t        |t              st        |j	                  d      xs d      j                         }t        |j	                  d      xs d      j                         }|r|sqt        |      }||d<   ||d<   t        |j	                  d            }|r||d<   |j                  |        |S Nproviderr   modelbase_url)r   r   listr	   r   r
   r   append)raw
candidatesentriesr   r   r   
normalizedr   s           r   _iter_fallback_entriesr&   "   s    #tU
	C	
	$&G #%&uyy,2399;EIIg&,"-335u%[
!)
:#
7'		*(=>%-Jz"z"!#" Nr   c                8   t        | j                  d      xs d      j                         j                         t        | j                  d      xs d      j                         j                         t	        | j                  d            j                         fS r   )r	   r   r
   lowerr   )r   s    r   _entry_identityr)   ?   sv    EIIj!'R(..0668EIIg$"%++-335UYYz2399; r   c                    | xs i } g }t               }dD ]S  }t        | j                  |            D ]4  }t        |      }||v r|j	                  |       |j                  |       6 U |S )an  Return the effective fallback chain merged across old and new config keys.

    ``fallback_providers`` remains the primary source of truth and keeps its
    order. Legacy ``fallback_model`` entries are appended afterwards unless
    they target the same provider/model/base_url route as an earlier entry.
    The returned list always contains fresh dict copies.
    )fallback_providersfallback_model)setr&   r   r)   addr!   )configchainseenkeyr   identitys         r   get_fallback_chainr4   G   sx     \rF"$E&)eD7  +FJJsO< 	 E&u-H4HHXLL	   Lr   )r   r   returnr	   )r   dict[str, Any] | Noner5   z
str | None)r"   r   r5   list[dict[str, Any]])r   zdict[str, Any]r5   ztuple[str, str, str])r/   r6   r5   r7   )__doc__
__future__r   r   typingr   r   r   r&   r)   r4    r   r   <module>r<      s*    L " 	 %&:r   