
    j                    @    d Z ddlmZ ddlmZ d	dZd
dZddZddZy)zFHelpers for reading the effective fallback provider chain from config.    )annotations)Anyc                b    t        | t              sy| j                         j                  d      S )N /)
isinstancestrstriprstrip)values    Y/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/hermes_cli/fallback_config.py_normalized_base_urlr      s&    eS!;;=$$    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   dictlistr	   getr
   r   append)raw
candidatesentriesentryr   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_chainr,   3   sn     \rF"$E&)eD7+FJJsO<E&u-H4HHXLL = 8 Lr   N)r   r   returnr	   )r   r   r-   list[dict[str, Any]])r   zdict[str, Any]r-   ztuple[str, str, str])r'   zdict[str, Any] | Noner-   r.   )	__doc__
__future__r   typingr   r   r   r!   r,    r   r   <module>r3      s"    L " %:r   