Ë
    uPêj¿$  ã                   óì   — d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ  G d„ de«      Z G d	„ d
e«      Z G d„ de«      Z G d„ de«      Z G d„ d«      Z G d„ d«      Zy)zì
Config repository for database operations on LiteLLM_Config.

This repository handles config reconciliation between database values and
YAML configmap values. DB values override configmap values except for
None values and empty lists.
é    N)ÚMappingÚSequence)ÚAnyÚFinalÚLiteralÚProtocolÚcast)Úverbose_proxy_logger)Údecrypt_value_helperc                   ó8   — e Zd Zedefd„«       Zedefd„«       Zy)Ú
_ConfigRowÚreturnc                  ó   — y ©N© ©Úselfs    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/repositories/config_repository.pyÚ
param_namez_ConfigRow.param_name   s   € Ø!$ó    c                  ó   — y r   r   r   s    r   Úparam_valuez_ConfigRow.param_value   s   € Ø%(r   N)Ú__name__Ú
__module__Ú__qualname__ÚpropertyÚstrr   Úobjectr   r   r   r   r   r      s(   „ ØØ$˜CÒ$ó Ø$àØ(˜VÒ(ó Ù(r   r   c                   ó�   — e Zd Zdeeef   dedz  fd„Zdee   fd„Zdeeef   deeeeef   f   defd„Z	deeef   dedz  fd„Z
y)	Ú_ConfigTableÚwherer   Nc             ƒ   ó   K  — y ­wr   r   ©r   r!   s     r   Úfind_uniquez_ConfigTable.find_unique   ó   è ø� ùó   ‚c              ƒ   ó   K  — y ­wr   r   r   s    r   Ú	find_manyz_ConfigTable.find_many   r%   r&   Údatac             ƒ   ó   K  — y ­wr   r   )r   r!   r)   s      r   Úupsertz_ConfigTable.upsert!   r%   r&   c             ƒ   ó   K  — y ­wr   r   r#   s     r   Údeletez_ConfigTable.delete#   r%   r&   )r   r   r   r   r   r   r$   r   r(   r+   r-   r   r   r   r    r       sw   „ ØV¨'°#°s°(Ñ*;ÐVÀ
ÈTÑ@QÓVà: ¨*Ñ!5Ó:àq W¨S°#¨XÑ%6Ðq¸gÀcÈ7ÐSVÐX[ÐS[ÑK\ÐF\Ñ>]ÐqÐblÓqàQ W¨S°#¨XÑ%6ÐQ¸:ÈÑ;LÔQr   r    c                   ó"   — e Zd Zedefd„«       Zy)Ú	_ConfigDbr   c                  ó   — y r   r   r   s    r   Úlitellm_configz_ConfigDb.litellm_config'   s   € Ø.1r   N)r   r   r   r   r    r1   r   r   r   r/   r/   &   s   „ ØØ1 Ò1ó Ù1r   r/   c                   ó"   — e Zd Zedefd„«       Zy)Ú_PrismaHandler   c                  ó   — y r   r   r   s    r   Údbz_PrismaHandle.db,   s   € Ø"r   N)r   r   r   r   r/   r5   r   r   r   r3   r3   +   s   „ ØØ"�IÒ"ó Ù"r   r3   c                   ó    — e Zd ZdZdedefd„Zy)ÚConfigParamz,Simple wrapper for config parameter from DB.r   r   c                 ó    — || _         || _        y r   ©r   r   )r   r   r   s      r   Ú__init__zConfigParam.__init__3   s   € Ø$ˆŒØ&ˆÕr   N)r   r   r   Ú__doc__r   r   r:   r   r   r   r7   r7   0   s   „ Ù6ð' 3ð '°Sô 'r   r7   c            	       ól  — e Zd ZdZg d¢Zdefd„Zedefd„«       Z	ede
fd„«       Zede
fd„«       Zd	eded
z  fd„Zd	ededefd„Zd	edefd„Zdeeef   fd„Zdededd
fd„Z	 ddeeef   dedeeef   fd„Zdeeef   deeef   fd„Zded	ed   dedefd„Z	 d deded
z  defd„Zdee   dd
fd„Zy
)!ÚConfigRepositoryzFRepository for config database operations with reconciliation support.©Úgeneral_settingsÚrouter_settingsÚlitellm_settingsÚenvironment_variablesÚprisma_clientc                 ó   — || _         y r   )Ú_prisma_client)r   rC   s     r   r:   zConfigRepository.__init__B   s
   € Ø+ˆÕr   r   c                 óH   — | j                   €t        d«      ‚| j                   S )NzFNo DB Connected. See - https://docs.litellm.ai/docs/proxy/virtual_keys)rE   ÚRuntimeErrorr   s    r   rC   zConfigRepository.prisma_clientE   s&   € à×ÑÐ&ÜÐgÓhÐhØ×"Ñ"Ð"r   c                 óB   — | j                   j                  j                  S r   )rC   r5   r1   r   s    r   Ú_config_tablezConfigRepository._config_tableK   s   € à×!Ñ!×$Ñ$×3Ñ3Ð3r   c                 ó   — | j                   S r   )rI   r   s    r   ÚtablezConfigRepository.tableO   s   € à×!Ñ!Ð!r   r   Nc              ƒ   óÜ   K  — | j                   j                  d|i¬«      ƒ d{  –—† }|€y|j                  }t        |t        «      rt        j                  |«      }t        ||¬«      S 7 ŒE­w)z)Get a config parameter from the database.r   ©r!   Nr9   )rI   r$   r   Ú
isinstancer   ÚjsonÚloadsr7   )r   r   Úrecordr   s       r   Ú	get_paramzConfigRepository.get_paramS   sf   è ø€ à"×0Ñ0×<Ñ<ÀLÐR\ÐC]Ð<Ó^×^ˆØˆ>ØØ×(Ñ(ˆÜ�k¤3Ô'ÜŸ*™* [Ó1ˆKÜ j¸kÔJÐJð _ús   ‚"A,¤A*¥AA,r   c              ƒ   óÔ   K  — t        |t        «      st        j                  |«      n|}| j                  j                  d|i||dœd|idœ¬«      ƒ d{  –—†  t        ||¬«      S 7 Œ­w)z'Set a config parameter in the database.r   r9   r   )ÚcreateÚupdate)r!   r)   N)rN   r   rO   ÚdumpsrI   r+   r7   )r   r   r   Ú
value_jsons       r   Ú	set_paramzConfigRepository.set_param]   su   è ø€ ä;EÀkÔSVÔ;WœDŸJ™J {Ô3Ð]hˆ
Ø× Ñ ×'Ñ'Ø Ð,à)3ÀJÑOØ(¨*Ð5ñð (ó 
÷ 	
ð 	
ô  j¸kÔJÐJð	
ús   ‚AA(ÁA&ÁA(c              ƒ   ó|   K  — 	 | j                   j                  d|i¬«      ƒ d{  –—†  y7 Œ# t        $ r Y yw xY w­w)z,Delete a config parameter from the database.r   rM   NTF)rI   r-   Ú	Exception)r   r   s     r   Údelete_paramzConfigRepository.delete_parami   sG   è ø€ ð	Ø×$Ñ$×+Ñ+°<ÀÐ2LÐ+ÓM×MÐMØð Nùäò 	Ùð	üs(   ‚<„!- ¥+¦- ª<«- ­	9¶<¸9¹<c              ƒ   óè   K  — | j                   j                  «       ƒ d{  –—† }i }|D ]B  }|j                  }t        |t        «      rt        j                  |«      }|||j                  <   ŒD |S 7 ŒO­w)z,Get all config parameters from the database.N)rI   r(   r   rN   r   rO   rP   r   )r   ÚrecordsÚresultrQ   r   s        r   Úget_all_paramszConfigRepository.get_all_paramsq   sp   è ø€ à#×1Ñ1×;Ñ;Ó=×=ˆØ+-ˆØò 	4ˆFØ ×,Ñ,ˆKÜ˜+¤sÔ+Ü"Ÿj™j¨Ó5�Ø(3ˆF�6×$Ñ$Ò%ð		4ð
 ˆð >ús   ‚A2 A0¡AA2ÚdstÚsrcc                 óJ  — ||fg}|rœ|j                  «       \  }}|j                  «       D ]r  \  }}|€Œ	t        |t        «      rt	        |«      dk(  rŒ(t        |t
        «      r6t        |j                  |«      t
        «      r|j                  ||   |f«       Œn|||<   Œt |rŒ›yy)zÍDeep-merge src into dst, skipping None values and empty lists from src.

        On conflicts, src (DB) wins, but empty lists are treated as "no value"
        and don't overwrite the destination.
        Nr   )ÚpopÚitemsrN   ÚlistÚlenÚdictÚgetÚappend)r   r`   ra   ÚstackÚdÚsÚkÚvs           r   Ú_deep_merge_dictsz"ConfigRepository._deep_merge_dicts|   s–   € ð ˜c˜
�|ˆÙØ—9‘9“;‰DˆAˆqØŸ™›	ò ‘��1Ø�9ØÜ˜a¤Ô&¬3¨q«6°Qª;ØÜ˜a¤Ô&¬:°a·e±e¸A³hÄÔ+EØ—L‘L ! A¡$¨ Õ+à�A�a’Dðô r   Úenv_varsÚreturn_original_valuec                 ó¦   — i }|j                  «       D ];  \  }}t        |t        «      rt        ||d|¬«      }|€Œ(|||<   Œ.t        |«      ||<   Œ= |S )z,Decrypt environment variables from database.Údebug)ÚvalueÚkeyÚexception_typerq   )rd   rN   r   r   )r   rp   rq   Ú	decryptedru   rt   Údecrypted_values          r   Ú_decrypt_env_variablesz'ConfigRepository._decrypt_env_variables�   si   € ð ,.ˆ	Ø"Ÿ.™.Ó*ò 	,‰JˆC�Ü˜%¤Ô%Ü"6ØØØ#*Ø*?ô	#�ð #Ñ.Ø%4�I˜c’Nä!$ U£�	˜#’ð	,ð Ðr   c                 ón   — i }|j                  «       D ]  \  }}|||<   |j                  «       }|||<   Œ! |S )zLNormalize env variable keys to include both original and uppercase versions.)rd   Úupper)r   rp   Ú
normalizedru   rt   Ú	upper_keys         r   Ú_normalize_env_variable_keysz-ConfigRepository._normalize_env_variable_keys¢   sG   € à,.ˆ
Ø"Ÿ.™.Ó*ò 	*‰JˆC�Ø#ˆJ�s‰OØŸ	™	›ˆIØ$)ˆJ�yÒ!ð	*ð Ðr   Úcurrent_configÚdb_param_valuec                 óˆ  — |dk(  rr| j                  |d¬«      }| j                  |«      }|j                  «       D ]  \  }}|t        j                  |<   Œ |j                  di «      j                  |«       |S ||vr|||<   |S t        ||   t        «      r't        |t        «      r| j                  ||   |«       |S |||<   |S )zAUpdate config fields with DB values, handling the merge strategy.rB   T)rq   )
ry   r~   rd   ÚosÚenvironÚ
setdefaultrU   rN   rg   ro   )r   r   r   r€   Údecrypted_env_varsÚmerged_env_varsÚenv_keyrt   s           r   Ú_update_config_fieldsz&ConfigRepository._update_config_fields«   sã   € ð Ð0Ò0Ø(,×(CÑ(CÀNÐjnÐ(CÓ(oÐØ%)×%FÑ%FÐGYÓ%ZˆOØ"1×"7Ñ"7Ó"9ò ,‘�˜Ø&+”—
‘
˜7Ò#ð,ð ×%Ñ%Ð&=¸rÓB×IÑIÈ/ÔZØ!Ð!à˜^Ñ+Ø)7ˆN˜:Ñ&Ø!Ð!ä�n ZÑ0´$Ô7¼JÀ~ÔW[Ô<\Ø×"Ñ" >°*Ñ#=¸~ÔNð Ðð *8ˆN˜:Ñ&àÐr   Úyaml_configÚstore_model_in_dbc              ƒ   óÈ  K  — |durt        j                  d«       |S | j                  D �cg c]  }| j                  |«      ‘Œ }}t	        j
                  |Ž ƒ d{  –—† }t        j                  |«      }|D ]_  }|€Œ|j                  }|j                  }	t        j                  d||	«       |€Œ8|	€Œ;| j                  |t        t        d   |«      |	¬«      }Œa |S c c}w 7 Œ„­w)aú  Reconcile config from YAML with database overrides.

        This is the main config reconciliation method that loads config params
        from the database and merges them with the YAML config. DB values
        override YAML values except for None values and empty lists.

        Args:
            yaml_config: The configuration loaded from YAML file
            store_model_in_db: Whether to load config from DB

        Returns:
            The merged configuration with DB overrides applied
        TzB'store_model_in_db' is not True, skipping db config reconciliationNzparam_name=%s, param_value=%sr>   )r   r   r€   )r
   ÚinfoÚCONFIG_PARAMSrR   ÚasyncioÚgatherÚcopyÚdeepcopyr   r   rs   rˆ   r	   r   )
r   r‰   rŠ   rm   ÚtasksÚ	responsesÚconfigÚresponser   r   s
             r   Úreconcile_configz!ConfigRepository.reconcile_configË   sú   è ø€ ð$  DÑ(Ü ×%Ñ%Ð&jÔkØÐà37×3EÑ3EÖF¨a˜Ÿ™ qÕ)ÐFˆÐFÜ!(§¡°Ð!7×7ˆ	ä—‘˜{Ó+ˆØ!ò 	ˆHØÐØà!×,Ñ,ˆJØ"×.Ñ.ˆKÜ ×&Ñ&Ð'FÈ
ÐT_Ô`àÑ%¨+Ñ*AØ×3Ñ3Ø#)Ü#Üð5ñð #ó ð $/ð 4ó ‘ð	ð. ˆùò7 GØ7ús)   ‚*C"¬CÁC"ÁC ÁAC"Â/C"Â2/C"Úparam_namesc              ƒ   óˆ   K  — t        j                  |D �cg c]  }| j                  |«      ‘Œ c}Ž ƒ d{  –—†  yc c}w 7 Œ
­w)z¨Prefetch config params to warm the cache.

        This can be called before reconcile_config to ensure all needed
        params are loaded in a single batch.
        N)rŽ   r�   rR   )r   r—   rm   s      r   Úprefetch_paramsz ConfigRepository.prefetch_paramsþ   s4   è ø€ ô �n‰n¸+ÖF°Q˜tŸ~™~¨aÕ0ÒFÐG×GÑGùÒFÐGús   ‚A–;®AµA ¶A)Tr   )r   r   r   r;   r�   r   r:   r   r3   rC   r    rI   rK   r   r7   rR   rX   Úboolr[   rg   r   r_   ro   r   ry   r~   r   rˆ   r–   re   r™   r   r   r   r=   r=   8   s¸  „ ÙPò€Mð, có ,ð ð#˜}ò #ó ð#ð
 ð4˜|ò 4ó ð4ð ð"�|ò "ó ð"ðK¨#ð K°+ÀÑ2Dó Kð
K¨#ð 
K¸Cð 
KÀKó 
Kð¨Sð °Tó ð	 d¨3°¨;Ñ&7ó 	ð Tð °ð ¸ó ð( MQñØ  V Ñ,ðØEIðà	ˆc�3ˆh‰óð&°T¸#¸s¸(±^ð ÈÈSÐRUÈXÉó ðàðð ð%ñ
ðð ðð 
óðF *.ñ1àð1ð   $™;ð1ð 
ó	1ðfH°°c±ð H¸tô Hr   r=   )r;   rŽ   r�   rO   r‚   Úcollections.abcr   r   Útypingr   r   r   r   r	   Úlitellm._loggingr
   Ú0litellm.proxy.common_utils.encrypt_decrypt_utilsr   r   r    r/   r3   r7   r=   r   r   r   ú<module>rŸ      sq   ðñó Û Û Û 	ß -ß 6Õ 6å 1Ý Qô)�ô )ôR�8ô Rô2�ô 2ô
#�Hô #÷
'ñ '÷LHò LHr   