Ë
    tPêjÿ#  ã                   ó˜  — U d Z ddlZddlZddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ erddlmZmZmZmZ ddlmZ dd	lmZ d
Zeed<   dZeed<   dZeed<    G d„ d«      Zdedefd„Zdedefd„Zdedefd„Zdedefd„Z  ee¬«      Z!eed<    ee¬«      Z"eed<    ee ¬«      Z#eed<   deddfd „Z$deddfd!„Z%dedd"fd#„Z&dedd"fd$„Z'y)%aƒ  Read-through recovery for in-memory registries in multi-replica deployments.

A management write (POST /model/new, /guardrails, /v1/agents) lands on one
replica and reaches Postgres, but sibling replicas only refresh their in-memory
registries on the periodic config reload, so a request using the new object
immediately can land on a sibling that has never heard of it and fail 400/404.
On a registry miss, callers here fetch the missing row from the DB and load it
into the local registry before giving up. A short negative-result TTL per key
plus a global resync budget per window bound the DB load from lookups of
genuinely unknown names.
é    N)Ú	AwaitableÚCallable)ÚTYPE_CHECKINGÚFinal)Úverbose_proxy_logger)ÚInMemoryCache)ÚLiteLLM_AgentsTableIncludeÚ#LiteLLM_AgentsTableWhereUniqueInputÚ!LiteLLM_GuardrailsTableWhereInputÚ!LiteLLM_ProxyModelTableWhereInput)ÚCustomGuardrail©ÚAgentResponseg       @ÚREAD_THROUGH_MISS_TTL_SECONDSg      @Ú"READ_THROUGH_RESYNC_WINDOW_SECONDSé   Ú#READ_THROUGH_MAX_RESYNCS_PER_WINDOWc                   ób   — e Zd ZdZeeefdeege	e
   f   dedededdf
d„Zde
fd	„Zd
ede
fd„Zy)ÚRegistryReadThrough)Ú_lockÚ_max_resyncs_per_windowÚ_miss_ttl_secondsÚ_recent_missesÚ_resyncÚ_resync_window_secondsÚ_window_resyncsÚ_window_started_atÚresyncÚmiss_ttl_secondsÚmax_resyncs_per_windowÚresync_window_secondsÚreturnNc                 ó¾   — || _         || _        || _        || _        t	        j
                  «       | _        t        d¬«      | _        t        d«      | _
        d| _        y )Niè  )Úmax_size_in_memoryz-infr   )r   r   r   r   ÚasyncioÚLockr   r   r   Úfloatr   r   )Úselfr   r   r    r!   s        úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/common_utils/registry_read_through.pyÚ__init__zRegistryReadThrough.__init__1   sQ   € ð ˆŒØ!1ˆÔØ'=ˆÔ$Ø&;ˆÔ#Ü—\‘\“^ˆŒ
Ü+¸tÔDˆÔÜ"'¨£-ˆÔØ ˆÕó    c                 óÞ   — t        j                  «       }|| j                  z
  | j                  k\  r|| _        d| _        | j                  | j
                  k\  ry| xj                  dz  c_        y)Nr   Fé   T)ÚtimeÚ	monotonicr   r   r   r   )r(   Únows     r)   Ú_consume_resync_budgetz*RegistryReadThrough._consume_resync_budgetA   sb   € Ü—^‘^Ó%ˆØ�×(Ñ(Ñ(¨D×,GÑ,GÒGØ&)ˆDÔ#Ø#$ˆDÔ Ø×Ñ 4×#?Ñ#?Ò?ØØ×Ò Ñ!ÕØr+   Úkeyc              ƒ   óÊ  K  — | j                   j                  |«      �y| j                  4 ƒd {  –—†  | j                   j                  |«      �	 d d d «      ƒd {  –—†  y| j                  «       s>t	        j
                  d|| j                  | j                  «       	 d d d «      ƒd {  –—†  y	 | j                  |«      ƒ d {  –—† }|s(| j                   j                  |d| j                  ¬«       |cd d d «      ƒd {  –—†  S 7 ŒÖ7 Œ¬7 Œ`7 ŒG# t        $ r2}t	        j
                  d||«       Y d }~d d d «      ƒd {  –—†7   yd }~ww xY w7 ŒK# 1 ƒd {  –—†7  sw Y   y xY w­w)NFzKregistry read-through for %r skipped: resync budget of %s per %ss exhaustedz'registry read-through for %r failed: %sT)Úttl)r   Ú	get_cacher   r1   r   Úwarningr   r   r   Ú	ExceptionÚ	set_cacher   )r(   r2   ÚfoundÚes       r)   ÚattemptzRegistryReadThrough.attemptK   sN  è ø€ Ø×Ñ×(Ñ(¨Ó-Ð9ØØ—:‘:÷ 	ñ 	Ø×"Ñ"×,Ñ,¨SÓ1Ð=Ø÷	÷ 	ð 	ð ×.Ñ.Ô0Ü$×,Ñ,ØaØØ×0Ñ0Ø×/Ñ/ô	ð ÷	÷ 	ð 	ðØ%)§\¡\°#Ó%6×6�ñ Ø×#Ñ#×-Ñ-¨c°4¸T×=SÑ=SÐ-ÔTØ÷%	÷ 	ò 	øð 	øð 	øð  7ùÜò Ü$×,Ñ,Ð-VÐX[Ð]^Ô_Û÷	÷ 	ñ 	ûðúð	ø÷ 	÷ 	ñ 	üsÈ   ‚-E#¯D°E#³EÁE#ÁDÁE#Á!=EÂE#Â)D
Â*E#Â0DÃDÃDÃ	+EÃ4E#Ä EÄE#ÄE#Ä
E#ÄDÄ	E	ÄEÄ.EÄ2E#Ä=E Ä>E#ÅE	Å	EÅE#ÅE ÅEÅE ÅE#)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   Ústrr   Úboolr'   Úintr*   r1   r;   © r+   r)   r   r   %   sy   „ ð	€Ið #@Ø&IØ'Iñ!à˜#˜ 	¨$¡Ð/Ñ0ð!ð  ð!ð !$ð	!ð
  %ð!ð 
ó!ð ¨ó ð ð ¨ô r+   r   Úobject_typer"   c                 óh   — ddl m} |j                  �|j                  dury|j	                  | ¬«      S )Nr   ©Úproxy_serverTF)rD   )Úlitellm.proxyrG   Úprisma_clientÚstore_model_in_dbÚshould_load_db_object)rD   rG   s     r)   Ú_db_backed_registries_enabledrL   c   s6   € Ý*à×!Ñ!Ð)¨\×-KÑ-KÐSWÑ-WØØ×-Ñ-¸+Ð-ÓFÐFr+   Ú
model_namec              ƒ   ó‚  K  — ddl m} ddlm} t	        d«      sy|j
                  }|€J ‚ ||«      j                  }d| i}d| i}|j                  |¬«      ƒ d {  –—† xs |j                  |¬«      ƒ d {  –—† }|sy|j                  }|€=|j                  j                  ||j                  ¬	«      ƒ d {  –—†  |j                  d uS |j                  4 ƒd {  –—†  |j                  j                  |¬
«       |j                  «       |_        d d d «      ƒd {  –—†  y7 ŒÅ7 Œ«7 Œm7 ŒL7 Œ# 1 ƒd {  –—†7  sw Y   yxY w­w)Nr   rF   )ÚModelRepositoryÚmodelsFrM   Úmodel_id©Úwhere)rI   Úproxy_logging_obj)Ú	db_modelsT)rH   rG   Ú%litellm.repositories.model_repositoryrO   rL   rI   ÚtableÚ	find_manyÚ
llm_routerÚproxy_configÚadd_deploymentrT   ÚMODEL_RECONCILE_LOCKÚ_add_deploymentÚget_model_listÚllm_model_list)	rM   rG   rO   rI   rW   Úname_filterÚ	id_filterÚrowsÚrouters	            r)   Ú_resync_model_deploymentsrd   k   sJ  è ø€ Ý*ÝEä(¨Ô2ØØ'×5Ñ5€MØÐ$Ð$Ð$Ù" =Ó1×7Ñ7€EØ=IÈ:Ð<V€KØ;EÀzÐ:R€IØŸ™¨k˜Ó:×:ÒdÀEÇOÁOÐZcÀOÓDd×>d€DÙØØ ×+Ñ+€FØ€~Ø×'Ñ'×6Ñ6Ø'¸<×;YÑ;Yð 7ó 
÷ 	
ð 	
ð ×&Ñ&¨dÐ2Ð2Ø×0Ñ0÷ >ñ >Ø×!Ñ!×1Ñ1¸DÐ1ÔAØ&,×&;Ñ&;Ó&=ˆÔ#÷>÷ >ð ð ;øÐ>døð
	
øð>øð >ø÷ >÷ >ð >ð üs~   ‚AD?ÁD ÁD?Á6D"Á7?D?Â6D$Â7"D?ÃD&ÃD?Ã2D*ÄD?ÄD(ÄD?Ä"D?Ä$D?Ä&D?Ä(D?Ä*D<Ä0D3Ä1D<Ä8D?Úguardrail_namec           
   ƒ   ó¢  K  — ddl m} ddlm}m} ddlm} ddlm} t        d«      sy|j                  }|€J ‚| dd	œ} ||«      j                  j                  |¬
«      ƒ d {  –—† }|€y|4 ƒd {  –—†  |j                   |di t        |«      ¤Ž¬«       d d d «      ƒd {  –—†  t        | «      d uS 7 ŒP7 ŒD7 Œ# 1 ƒd {  –—†7  sw Y   Œ%xY w­w)Nr   rF   )ÚGUARDRAIL_RECONCILE_LOCKÚIN_MEMORY_GUARDRAIL_HANDLER)ÚGuardrailsRepository)Ú	GuardrailÚ
guardrailsFÚactive)re   ÚstatusrR   )Ú	guardrailrC   )rH   rG   Ú+litellm.proxy.guardrails.guardrail_registryrg   rh   Ú'litellm.repositories.table_repositoriesri   Úlitellm.types.guardrailsrj   rL   rI   rW   Ú
find_firstÚsync_guardrail_from_dbÚdictÚ_initialized_guardrail)	re   rG   rg   rh   ri   rj   rI   Úactive_row_filterÚrows	            r)   Ú_resync_guardrailsrx   …   sæ   è ø€ Ý*÷õ MÝ2ä(¨Ô6ØØ'×5Ñ5€MØÐ$Ð$Ð$à(ØñCÐñ ,¨MÓ:×@Ñ@×KÑKÐRcÐKÓd×d€CØ
€{ØØ'÷ ]ñ ]Ø#×:Ñ:ÁYÑE[ÔQUÐVYÓQZÑE[Ð:Ô\÷]÷ ]ä! .Ó1¸Ð=Ð=ð eøð]øð ]ø÷ ]÷ ]ñ ]üsZ   ‚A!CÁ#B4Á$CÁ1B6Á2CÁ5"B:ÂCÂ"B8Â#CÂ6CÂ8CÂ:CÃ CÃCÃCÚagent_id_or_namec              ƒ   ó\  K  — ddl m} ddlm}m}m} ddlm} t        d«      syt        | «      �y|j                  }|€J ‚ ||«      }d| i}d	| i}	d
di}
|4 ƒd {  –—†  t        | «      �	 d d d «      ƒd {  –—†  y|j                  ||
¬«      ƒ d {  –—† xs |j                  |	|
¬«      ƒ d {  –—† }|€	 d d d «      ƒd {  –—†  y|j                   |j                  |j                  «       «      ¬«       	 d d d «      ƒd {  –—†  y7 Œ¯7 Œ•7 Œ{7 Œ`7 ŒO7 Œ# 1 ƒd {  –—†7  sw Y   y xY w­w)Nr   rF   )ÚAGENT_RECONCILE_LOCKÚagents_tableÚglobal_agent_registryr   ÚagentsFTÚagent_idÚ
agent_nameÚobject_permission)rS   Úinclude)Úagent_config)rH   rG   Ú,litellm.proxy.agent_endpoints.agent_registryr{   r|   r}   Úlitellm.types.agentsr   rL   Ú_agent_from_registryrI   Úfind_uniqueÚregister_agentÚmodel_validateÚ
model_dump)ry   rG   r{   r|   r}   r   rI   rW   ra   r`   Úinclude_permissionrw   s               r)   Ú_resync_agentsrŒ   ž   sh  è ø€ Ý*÷ñ õ
 3ä(¨Ô2ØÜÐ,Ó-Ð9ØØ'×5Ñ5€MØÐ$Ð$Ð$Ù Ó.€EØ=GÐIYÐ<Z€IØ?KÐM]Ð>^€KØ=PÐRVÐ<WÐØ#÷ 	ñ 	ÜÐ 0Ó1Ð=Ø÷	÷ 	ð 	ð !×,Ñ,°9ÐFXÐ,ÓY×Yò 
Ðch×ctÑctØÐ'9ð duó d
÷ ^
ˆð ˆ;Ø÷	÷ 	ð 	ð 	×,Ñ,Ð:V¸-×:VÑ:VÐWZ×WeÑWeÓWgÓ:hÐ,ÔiØ÷	÷ 	ñ 	øð 	øð Zøð ^
øð	øð 	ø÷ 	÷ 	ñ 	üs¨   ‚AD,ÁDÁD,ÁDÁ,D,Á7DÁ8D,Á=DÂDÂDÂ0DÂ1DÂ8D,ÃDÃD,Ã	1DÃ:D,ÄDÄD,ÄD,ÄDÄDÄD,ÄD,ÄD)ÄD ÄD)Ä%D,)r   Úmodel_registry_read_throughÚguardrail_registry_read_throughÚagent_registry_read_throughzAgentResponse | Nonec                 ó^   — ddl m} |j                  | ¬«      }|�|S |j                  | ¬«      S )Nr   )r}   )r   )r€   )r„   r}   Úget_agent_by_idÚget_agent_by_name)ry   r}   Úby_ids      r)   r†   r†   Â   s9   € ÝRà(×8Ñ8ÐBRÐ8ÓS€EØÐØˆØ ×2Ñ2Ð>NÐ2ÓOÐOr+   c              ƒ   ó~   K  — t        | «      }|�|S t        j                  | «      ƒ d {  –—† sy t        | «      S 7 Œ­w©N)r†   r�   r;   )ry   Úagents     r)   Úget_agent_with_read_throughr—   Ë   sF   è ø€ Ü'Ð(8Ó9€EØÐØˆÜ,×4Ñ4Ð5EÓF×FÐFØÜÐ 0Ó1Ð1ð Gúó   ‚(=ª;«=zCustomGuardrail | Nonec                 óF   — ddl m} |j                  j                  | ¬«      S )Nr   )Úguardrail_endpoints)re   )Úlitellm.proxy.guardrailsrš   ÚGUARDRAIL_REGISTRYÚ"get_initialized_guardrail_callback)re   rš   s     r)   ru   ru   Ô   s    € Ý<à×1Ñ1×TÑTÐdrÐTÓsÐsr+   c              ƒ   ó~   K  — t        | «      }|�|S t        j                  | «      ƒ d {  –—† sy t        | «      S 7 Œ­wr•   )ru   rŽ   r;   )re   rl   s     r)   Ú+get_initialized_guardrail_with_read_throughrŸ   Ú   sC   è ø€ Ü*¨>Ó:€FØÐØˆÜ0×8Ñ8¸ÓH×HÐHØÜ! .Ó1Ð1ð Iúr˜   )(Ú__doc__r%   r.   Úcollections.abcr   r   Útypingr   r   Úlitellm._loggingr   Úlitellm.caching.in_memory_cacher   Úprisma.typesr	   r
   r   r   Ú%litellm.integrations.custom_guardrailr   r…   r   r   Ú__annotations__r   r   r   r@   rA   rL   rd   rx   rŒ   r�   rŽ   r�   r†   r—   ru   rŸ   rC   r+   r)   ú<module>r¨      s9  ðò
ó Û ß /ß 'å 1Ý 9á÷ó õ FÝ2à'*Ð ˜uÓ *Ø,/Ð " EÓ /Ø-/Ð # UÓ /÷;ñ ;ð|G¨sð G°tó Gð°ð ¸ó ð4>¨Sð >°Tó >ð2¨3ð °4ó ñ> &9Ð@YÔ%ZÐ ˜UÓ ZÙ)<ÐDVÔ)WÐ  Ó WÙ%8ÀÔ%OÐ ˜UÓ OðP¨3ð PÐ3Ió Pð2¸ð 2Ð@Vó 2ðt¨3ð tÐ3Kó tð2Àcð 2ÐNfô 2r+   