+
    ]Qj!                        a  R t0 t ^RIHt ^RIHt ^RIHt ^RIHt ^RI	H
t
 RR R lltRR	 R
 lltRR R lltRR R lltR]R]R]R]/t] ^ k R R ltR R ltR R ltRR R lltR R ltR# )   )settings)AnthropicProvider)LLMProviderFallbackProvider)OpenAICompatibleProviderNc                >    V ^8  d   QhR\         R,          R\        /# r   modelNreturnstrr   )formats   "=C:\xampp\htdocs\meridian\meridian-ai\app\providers\factory.py__annotate__r      s      t {     c                 h    \        \        P                  T ;'       g    \        P                  R 7      # )api_keyr   )r   r   openai_api_keyopenai_modelr   s   &r   _build_openair      s)    #'',,x,, r   c                >    V ^8  d   QhR\         R,          R\        /# r
   r   )r   s   "r   r   r      s      C$J + r   c                 h    \        \        P                  T ;'       g    \        P                  R 7      # r   )r   r   anthropic_api_keyanthropic_modelr   s   &r   _build_anthropicr      s)    **//x// r   c                >    V ^8  d   QhR\         R,          R\        /# r
   r   )r   s   "r   r   r      s      t { r   c                     \        \        P                  T ;'       g    \        P                  \        P                  R R7      # )F)r   r   base_urluse_json_mode)r   r   ollama_api_keyollama_modelollama_base_urlr   s   &r   _build_ollamar&      s5    #'',,x,,))	 r   c                >    V ^8  d   QhR\         R,          R\        /# r
   r   )r   s   "r   r   r      s      t { r   c                 j    \        \        P                  T ;'       g    \        P                  R R7      # )z8https://generativelanguage.googleapis.com/v1beta/openai/)r   r   r!   )r   r   gemini_api_keygemini_modelr   s   &r   _build_geminir+      s,    #'',,x,,K r   openai	anthropicollamageminic                <    V ^8  d   QhR\         R\        R\        /# )r   name
is_primaryr   )r   bool)r   s   "r   r   r   /   s!      3 D T r   c                     V R 8X  d   \        \        P                  4      # V R8X  d   \        \        P                  4      # V R8X  d   \        \        P                  4      # V R8X  d   V# R# )r,   r-   r/   r.   F)r3   r   r   r   r)   )r1   r2   s   &&r   _has_credentialsr5   /   s`    xH++,,{H..//xH++,,x r   c                0    V ^8  d   QhR\         R\        /# )r   r1   r   r   )r   s   "r   r   r   >   s      c k r   c                    V \         9  d%   \        RV  RRP                  \         4       24      h\        V RR7      '       g   \        RV  R24      h\         V ,          ! 4       # )z{Return a single provider by name (no fallback chain).
Raises ValueError if the name is unknown or credentials are missing.
Unknown provider '   ' — expected one of: , Tr2   z
Provider 'z' has no credentials configured)	_BUILDERS
ValueErrorjoinr5   )r1   s   &r   get_single_providerr?   >   s`     9-dV3J499U^K_J`abbDT22:dV+JKLLT?r   c                :    V ^8  d   QhR\         \        ,          /# r   r   )listdict)r   s   "r   r   r   I   s      T
 r   c                    RRRR\         P                  /RRRR\         P                  /RRRR\         P                  /R	RR
R\         P                  //p . pV P                  4        Fb  w  r#\        W"\         P                  8H  R7      '       g   K*  VP                  RVRVR,          RVR,          RV\         P                  8H  /4       Kd  	  V# )z<Return metadata for all configured (credentialed) providers.r/   r1   zGemini 2.5 Flash Liter   r,   zGPT-4o Minir-   zClaude Haikur.   zOllama (local)r;   id
is_default)	r   r*   r   r   r$   itemsr5   llm_providerappend)metaresultprovider_idbuilder_metas       r   list_providersrN   I   s     	f5w@U@UVfmw@U@UVfnw@X@XYf.AVAVW	D F%)ZZ\!KHDYDY5Y[[MMkV,g.kX-B-BB	  &2 Mr   c                J    V ^8  d   QhR\         R\         R,          R\        /# )r   primarymodel_overrideNr   )r   r   )r   s   "r   r   r   ]   s&     ' ' 'S4Z 'Sc 'r   c                l   V \         9  d%   \        RV  RRP                  \         4       24      h. ROpV .V Uu. uF  q3V 8w  g   K  VNK  	  up,           p. pV FH  p\        WfV 8H  R7      '       g   K  W`8X  d   TMRpVP	                  V\         V,          ! V4      34       KJ  	  \        V4      # u upi )u7  Like get_provider() but promotes `primary` to the front of the fallback chain.

`model_override` applies to the primary provider only — if the user picked
"Gemini 2.0 Flash" we honour that exact model; fallback providers use their
own configured defaults so they work without the caller knowing their models.
r8   r9   r:   r;   Nr/   r,   r-   r.   )r<   r=   r>   r5   rI   r   )rP   rQ   fallback_orderpordered	providersr1   r   s   &&      r   get_provider_starting_withrX   ]   s     i-gY6MdiiXaNbMcdee@NinEnW11nEEG/1IDgo??&*oN4EdIdOE$:;< 
 I&& Fs   B1B1c                $    V ^8  d   QhR\         /# rA   r   )r   s   "r   r   r   s   s     ' '& 'r   c                 L   \         P                  p V \        9  d   \        RV  R24      h. ROpV .V Uu. uF  q"V 8w  g   K  VNK  	  up,           p. pV F=  p\	        WUV 8H  R7      '       g   K  VP                  V\        V,          ! 4       34       K?  	  \        V4      # u upi )uM  Build a FallbackProvider that tries LLM_PROVIDER first, then any other
provider that has credentials configured, in a fixed fallback order.

Order: primary (LLM_PROVIDER) → gemini → openai → anthropic → ollama
(primary is moved to front; duplicates skipped; Gemini leads the fallback
chain because it is free-tier friendly).
zUnknown LLM_PROVIDER 'u;   ' — expected 'openai', 'anthropic', 'gemini', or 'ollama'r;   rS   )r   rH   r<   r=   r5   rI   r   )rP   rT   rU   rV   rW   r1   s         r   get_providerr[   s   s     ##Gi$WI-hi
 	
 ANinEnW11nEEG/1IDgo??dIdO$567  I&& Fs   B!B!c                b    V ^8  d   Qh/ ^ \         9   d   \        \        \        3,          ;R&   # )r   r<   )__conditional_annotations__rC   r   object)r   s   "r   r   r      s)      L 4V M r   )N)r]   configr   anthropic_providerr   baser   fallback_providerr   openai_providerr   r   r   r&   r+   r<   r5   r?   rN   rX   r[   r   )r]   s   @r   <module>rd      sh      1  / 5 m!mm	 	 (','r   