Ë
    uPêjE  ã            
       óò  — U d dl Z d dlmZmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlmZ erd dlmZ d dlmZ dZ e	e!d<   dZ"e	e!d<    edd¬«      Z#e	e!d<   dZ$e	e!d<    edd¬«      Z%e	e!d<    edd¬«      Z&e	e!d<   dee'   de'fd„Z(de'de'de'fd „Z)d!e'de'de*e'e'f   fd"„Z+d!e'de'de'de,e'e'f   fd#„Z-d$e.de'dz  fd%„Z/d$ede,e'e.f   fd&„Z0d6d'„Z1	 d7d$e.d(e'de'fd)„Z2	 d8d$e.d*ede'dz  ddfd+„Z3d$e.d*ede'de.fd,„Z4de'de'de'dz  fd-„Z5de'de'de'dz  fd.„Z6d!e'd*ede'de*e'e'f   fd/„Z7d$e.dee.   dz  fd0„Z8d9d$ed1e9e.   d2e:de.fd3„Z;d*edee'   fd4„Z<d$e.d*ede'de.fd5„Z=y):é    N)ÚMappingÚSequence)ÚSet)ÚTYPE_CHECKINGÚAnyÚFinal)ÚHTTPException)Úverbose_proxy_logger)ÚInMemoryCache)ÚUserAPIKeyAuth)Ú get_primary_resource_owner_scopeÚget_resource_owner_scopesÚis_proxy_adminÚuser_can_access_resource_owner)ÚManagedObjectRepository)ÚResponsesAPIRequestUtils)Úmodels)ÚPrismaClientÚ	containerÚCONTAINER_OBJECT_PURPOSEÚ__litellm_container_no_owner__Ú_NEGATIVE_OWNER_SENTINELi'  é<   )Úmax_size_in_memoryÚdefault_ttlÚ_CONTAINER_OWNER_CACHEÚ"__litellm_container_no_stored_id__Ú_NEGATIVE_STORED_ID_SENTINELÚ_CONTAINER_STORED_ID_CACHEi   Ú_ALLOWED_CONTAINER_IDS_CACHEÚowner_scopesÚreturnc                 ó>   — t        j                  t        | «      «      S )uë   JSON-encode the sorted scope list â€” using a separator like ``|``
    would collide for any tenant whose user_id / team_id / org_id /
    api_key happens to contain the separator. JSON quoting escapes
    every separator that matters.)ÚjsonÚdumpsÚsorted)r!   s    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/container_endpoints/ownership.pyÚ _allowed_container_ids_cache_keyr(   2   s   € ô
 �:‰:”f˜\Ó*Ó+Ð+ó    Úoriginal_container_idÚcustom_llm_providerc                 ó   — t         › d|› d| › �S )Nú:)r   )r*   r+   s     r'   Ú_container_model_object_idr.   :   s   € Ü&Ð' qÐ)<Ð(=¸QÐ?TÐ>UÐVÐVr)   Úcontainer_idc                 óŒ   — t        j                  | «      }|j                  d| «      }|j                  d«      }|r|dk(  r|}||fS )NÚresponse_idr+   Úopenai)r   Ú_decode_container_idÚget)r/   r+   Údecodedr*   Údecoded_providers        r'   Ú!decode_container_id_for_ownershipr7   >   sP   € Ü-×BÑBÀ<ÓP€GØ#*§;¡;¨}¸lÓ#KÐØ%Ÿk™kÐ*?Ó@ÐÙÐ/°8Ò;Ø.ÐØ Ð"5Ð5Ð5r)   c              ƒ   ód  K  — ||dœ}t        j                  | «      }|j                  d«      }t        |t        «      r|sUt        ||«      ƒ d {  –—† }|r?|| k7  r:t        j                  |«      }|j                  d«      }t        |t        «      r|r|}t        |t        «      r|r||d<   |S 7 Œ^­w)N)r/   r+   Úmodel_id)r   r3   r4   Ú
isinstanceÚstrÚ_get_stored_container_id)	r/   r*   r+   Úparamsr5   r9   Ú	stored_idÚstored_decodedÚstored_model_ids	            r'   Úget_container_forwarding_paramsrA   G   s±   è ø€ ð .Ø2ñ€Fô .×BÑBÀ<ÓP€GØ�{‰{˜:Ó&€HÜ�x¤Ô%©(ô ":Ð:OÐQdÓ!e×eˆ	Ù˜ lÒ2Ü$<×$QÑ$QÐR[Ó$\ˆNØ%3×%7Ñ%7¸
Ó%CˆOÜ˜/¬3Ô/±OØ*�Ü�(œCÔ ¡XØ%ˆˆzÑØ€Mð fús   ‚AB0ÁB.ÁAB0Úresponsec                 óŽ   — | €y t        | t        «      r| j                  d«      }nt        | dd «      }t        |t        «      r|S d S )NÚid©r:   Údictr4   Úgetattrr;   )rB   Úvalues     r'   Ú_get_response_idrI   a   sE   € ØÐØÜ�(œDÔ!Ø—‘˜TÓ"‰ä˜ $¨Ó-ˆÜ˜u¤cÔ*ˆ5Ð4°Ð4r)   c                 óÂ   — t        | t        «      rt        | «      S t        | d«      r| j                  «       S t        | d«      r| j                  «       S dt	        | «      iS )NÚ
model_dumprF   rD   )r:   rF   ÚhasattrrK   rI   )rB   s    r'   Ú_dump_responserM   k   sV   € Ü�(œDÔ!Ü�H‹~ÐÜˆx˜Ô&Ø×"Ñ"Ó$Ð$Üˆx˜Ô Ø�}‰}‹ÐØÔ" 8Ó,Ð-Ð-r)   c               ƒ   ó   K  — ddl m}  | S ­w)Nr   ©Úprisma_client)Úlitellm.proxy.proxy_serverrP   rO   s    r'   Ú_get_prisma_clientrR   u   s   è ø€ Ý8àÐùs   ‚	Údefaultc                 óÂ   — i }t        | t        «      r| j                  d«      xs i }nt        | dd «      xs i }|j                  d«      }t        |t        «      r|r|S |S )NÚ_hidden_paramsr+   rE   )rB   rS   Úhidden_paramsÚproviders       r'   Ú,_custom_llm_provider_from_responses_responserX   {   sb   € ð +-€MÜ�(œDÔ!Ø Ÿ™Ð%5Ó6Ò<¸"‰ä Ð*:¸DÓAÒGÀRˆà#×'Ñ'Ð(=Ó>€HÜ�(œCÔ ¡XØˆØ€Nr)   Úuser_api_key_dictc              ƒ   óú   K  — t        j                  | «      }|sy|xs t        | «      }|D ]  }	 t        |ddœ||¬«      ƒ d{  –—†  Œ y7 Œ# t        $ r!}t        j                  d||«       Y d}~ŒGd}~ww xY w­w)zITrack containers created implicitly by code interpreter in /v1/responses.Nr   )rD   Úobject)rB   rY   r+   zRFailed to record container ownership from responses output for container_id=%s: %s)r   Ú-collect_container_ids_from_responses_responserX   Úrecord_container_ownerÚ	Exceptionr
   Ú	exception)rB   rY   r+   Úcontainer_idsÚresolved_providerr/   Úes          r'   Ú/record_container_owners_from_responses_responserc   ‹   s™   è ø€ ô 4×aÑaÐbjÓk€MÙØà2ÒlÔ6bÐckÓ6lÐà%ò ˆð	Ü(Ø ,¸ÑDØ"3Ø$5ô÷ ñ ñðùô
 ò 		ô
 !×*Ñ*ØdØØ÷ñ ûð		üs@   ‚-A;°AÁAÁAÁ	A;ÁAÁ	A8ÁA3Á.A;Á3A8Á8A;c           	   ƒ   ó¨  K  — t        | «      }|€t        j                  d«       | S t        |«      }|€t	        dd¬«      ‚t        ||«      \  }}t        ||«      }t        | «      }||d<   ||d<   t        j                  |«      }	t        «       ƒ d {  –—† }
|
€t        j                  d«       | S t        |
«      j                  }|j                  d|i¬	«      ƒ d {  –—† }|�gt        |d
d «      t        k7  rt	        dd¬«      ‚t!        t        |dd «      |«      st	        dd¬«      ‚|j#                  d|i||	|dœ¬«      ƒ d {  –—†  n%|j%                  |||	t        ||dœ¬«      ƒ d {  –—†  t&        j)                  ||«       t*        j)                  ||«       t-        |«      }|rt.        j1                  t3        |«      «       | S 7 �Œ67 Œî7 Œˆ7 Œd­w)NzISkipping container ownership tracking because provider response has no idé“  zCUnable to record container ownership: caller has no identity scope.©Ústatus_codeÚdetailr+   Úprovider_container_idzCSkipping container ownership tracking because prisma_client is NoneÚmodel_object_id©ÚwhereÚfile_purposeiô  zUnable to track containerÚ
created_byÚ	Forbidden)Úunified_object_idÚfile_objectÚ
updated_by)rl   Údata)rp   rj   rq   rm   rn   rr   )rs   )rI   r
   Úwarningr   r	   r7   r.   rM   r$   r%   rR   r   ÚtableÚfind_uniquerG   r   r   ÚupdateÚcreater   Ú	set_cacher   r   r    Údelete_cacher(   )rB   rY   r+   r/   Úownerr*   ra   rj   rq   Úfile_object_jsonrP   ru   ÚexistingÚcaller_scopess                 r'   r]   r]   ª   s  è ø€ ô
 +¨8Ó4€LØÐÜ×$Ñ$Ð%pÔqØˆÜ3Ð4EÓF€EØ€}ô ØØXô
ð 	
ô
 0QÐQ]Ð_rÓ/sÑ,ÐÐ,Ü7Ð8MÐO`Óa€OÜ'¨Ó1€KØ):€KÐ%Ñ&Ø+@€KÐ'Ñ(ä#'§:¡:¨kÓ#:Ðä!3Ó!5×5€MØÐÜ×$Ñ$Ð%jÔkØˆä*¨=Ó9×?Ñ?€EØ!×-Ñ-Ð5FÈÐ4XÐ-ÓY×Y€HØÐÜ�8˜^¨TÓ2Ô6NÒNÜ¨CÐ8SÔTÐTÜ-¬g°hÀÈdÓ.SÐUfÔgÜ¨C¸ÔDÐDØ�l‰lØ$ oÐ6à%1Ø/Ø#ñð ó 
÷ 	
ñ 	
ð �l‰là%1Ø#2Ø/Ü 8Ø#Ø#ñð ó 	
÷ 		
ð 		
ô ×$Ñ$ _°eÔ<Ü×(Ñ(¨¸,ÔGô
 5Ð5FÓG€MÙÜ$×1Ñ1Ô2RÐS`Ó2aÔbØ€OðS 6ùð Zøð	
øð		
úsK   ‚BGÂG	ÂA	GÃGÃA'GÅGÅ%GÅ+GÅ,AGÇGÇGÇGc              ƒ   óò  K  — t        | |«      }t        j                  |«      }|t        k(  ry |�|S t	        «       ƒ d {  –—† }|€y t        |«      j                  }|j                  |t        dœ¬«      ƒ d {  –—† }|�t        |dd «      nd }t        j                  ||�|nt        «       |�t        |dd «      nd }t        j                  |t        |t        «      r
|r|«       |S t        «       |S 7 Œ³7 Œ|­w)N©rj   rm   rk   rn   rp   )r.   r   Ú	get_cacher   rR   r   ru   Ú
find_firstr   rG   ry   r   r:   r;   r   )	r*   r+   rj   ÚcachedrP   ru   Úrowr{   r>   s	            r'   Ú_get_container_ownerr…   õ   s  è ø€ Ü7Ð8MÐObÓc€Oä*×4Ñ4°_ÓE€FØÔ)Ò)ØØÐØˆä!3Ó!5×5€MØÐØä*¨=Ó9×?Ñ?€EØHM×HXÑHXà.Ü4ñ
ð IYó I÷ C€Cð DGÀ?œw s¨L¸$Ô?ÐX\€EÜ×$Ñ$ _¸uÐ?P±eÔVnÔoØNQÈo¤7¨3Ð0CÀTÔ#JÐcg€IÜ×(Ñ(ØÜ  ¬CÔ0±Yˆôð €Lô Eaôð €Lð% 6øð
Cús#   ‚=C7¿C3Á 8C7Á8C5Á9A;C7Ã5C7c              ƒ   óÐ  K  — t        | |«      }t        j                  |«      }|t        k(  ryt	        |t
        «      r|r|S t        «       ƒ d{  –—† }|€yt        |«      j                  }|j                  |t        dœ¬«      ƒ d{  –—† }|�t        |dd«      nd}t        j                  |t	        |t
        «      r|r|nt        «       t	        |t
        «      r|r|S dS 7 Œ’7 Œ[­w)aT  Return the ``unified_object_id`` stored at create time, if any.

    Used by :func:`get_container_forwarding_params` to recover the
    deployment ``model_id`` for native upstream container IDs: the stored
    value is the encoded form produced by ``encode_container_id_in_response``
    when the router selected a specific deployment.
    Nr€   rk   rp   )r.   r   r�   r   r:   r;   rR   r   ru   r‚   r   rG   ry   )r*   r+   rj   rƒ   rP   ru   r„   r>   s           r'   r<   r<     sð   è ø€ ô 8Ð8MÐObÓc€Oä.×8Ñ8¸ÓI€FØÔ-Ò-ØÜ�&œ#Ô¡6Øˆä!3Ó!5×5€MØÐØä*¨=Ó9×?Ñ?€EØHM×HXÑHXà.Ü4ñ
ð IYó I÷ C€Cð ORÈo¤7¨3Ð0CÀTÔ#JÐcg€IÜ×(Ñ(ØÜ  ¬CÔ0±Y‰ÔD`ôô # 9¬cÔ2±yˆ9ÐJÀdÐJð! 6øð
Cús%   ‚AC&ÁC"Á8C&ÂC$Â	AC&Ã$C&c              ƒ   ó¬   K  — t        | |«      \  }}t        |«      r||fS t        ||«      ƒ d {  –—† }t        ||«      st	        dd¬«      ‚||fS 7 Œ!­w)Nre   ro   rf   )r7   r   r…   r   r	   )r/   rY   r+   r*   ra   r{   s         r'   Ú assert_user_can_access_containerrˆ   6  sp   è ø€ ô
 0QÐQ]Ð_rÓ/sÑ,ÐÐ,äÐ'Ô(Ø$Ð&7Ð7Ð7ô
 .Ð.CÐEVÓW×W€EÜ)¨%Ð1BÔCÜ¨°KÔ@Ð@à Ð"3Ð3Ð3ð	 Xús   ‚.A°A±"Ac                 óŽ   — | €y t        | t        «      r| j                  d«      }nt        | dd «      }t        |t        «      r|S d S )Nrs   )r:   rF   r4   rG   Úlist)rB   rs   s     r'   Ú_get_container_list_datar‹   J  sE   € ØÐØÜ�(œDÔ!Ø�|‰|˜FÓ#‰ä�x ¨Ó.ˆÜ˜d¤DÔ)ˆ4Ð3¨tÐ3r)   rs   Úremoved_filtered_itemsc                 óh  — t        | t        «      rB|| d<   |r#t        |d   «      | d<   t        |d   «      | d<   nd | d<   d | d<   d| d<   |rd| d<   | S || _        |rt        |d   «      nd | _        |rt        |d   «      nd | _        |st        | d«      rd| _        |rt        | d«      rd| _        | S )Nrs   r   Úfirst_idéÿÿÿÿÚlast_idFÚhas_more)r:   rF   rI   rs   rŽ   r�   rL   r‘   )rB   rs   rŒ   s      r'   Ú_set_container_list_datar’   T  sÏ   € Ü�(œDÔ!Øˆ�ÑÙÜ#3°D¸±GÓ#<ˆH�ZÑ Ü"2°4¸±8Ó"<ˆH�YÒà#'ˆH�ZÑ Ø"&ˆH�YÑØ#(ˆH�ZÑ Ù!Ø#(ˆH�ZÑ Øˆà€H„MÙ59Ô(¨¨a©Ô1¸t€HÔÙ59Ô'¨¨R©Ô1¸t€HÔÙ”G˜H jÔ1Ø!ˆÔÙ¤'¨(°JÔ"?Ø!ˆÔØ€Or)   c              ƒ   óà  K  — t        | «      }|s
t        «       S t        |«      }t        j	                  |«      }|�t        |«      S t        «       ƒ d {  –—† }|€
t        «       S t        |«      j                  }|j                  t        d|idœ¬«      ƒ d {  –—† }|D �ch c]  }t        |dd «      €Œ|j                  ’Œ }}t        j                  |t        |«      «       |S 7 Œ�7 ŒNc c}w ­w)NÚin)rm   rn   rk   rj   )r   Úsetr(   r    r�   rR   r   ru   Ú	find_manyr   rG   rj   ry   rŠ   )	rY   r!   Ú	cache_keyrƒ   rP   ru   Úrowsr„   Úallowed_idss	            r'   Ú_get_allowed_container_idsrš   l  sõ   è ø€ ô 4Ð4EÓF€LÙÜ‹uˆä7¸ÓE€IÜ0×:Ñ:¸9ÓE€FØÐÜ�6‹{Ðä!3Ó!5×5€MØÐÜ‹uˆä*¨=Ó9×?Ñ?€EØLQÏOÉOä4Ø Ð.ñ
ð M\ó M÷ G€Dð :>Ös°#ÄÈÐN_ÐaeÓAfÑAr˜#×-Ó-Ðs€KÐsô !×*Ñ*¨9´d¸;Ó6GÔHØÐð! 6øð
Gúò tùs=   ‚AC.ÁC%ÁAC.ÂC'ÂC.Â!C)Â4C)Ã$C.Ã'C.Ã)C.c              ƒ   ó>  K  — t        |«      r| S t        | «      }|€| S t        |«      ƒ d {  –—† }g }|D ]?  }t        |«      }|€Œt	        ||«      \  }}	t        ||	«      |v sŒ/|j                  |«       ŒA t        | |t        |«      t        |«      k7  ¬«      S 7 Œm­w)N)rŒ   )	r   r‹   rš   rI   r7   r.   Úappendr’   Úlen)
rB   rY   r+   rs   Úallowed_container_idsÚfilteredÚitemr/   r*   ra   s
             r'   Úfilter_container_list_responser¡   ‹  s»   è ø€ ô
 Ð'Ô(Øˆä*¨8Ó4€DØ€|Øˆä)CÐDUÓ)V×#VÐØ$&€HØò "ˆÜ'¨Ó-ˆØÐØÜ3TÐUaÐcvÓ3wÑ0ÐÐ0Ü%Ð&;Ð=NÓOÐShÒhØ�O‰O˜DÕ!ð"ô $ H¨hÌsÐS[Ë}Ô`cÐdhÓ`iÑOiÔjÐjð $Wús   ‚+B­B®6BÁ%7B)r"   zPrismaClient | None)r2   )N)F)>r$   Úcollections.abcr   r   r   ÚAbstractSetÚtypingr   r   r   Úfastapir	   Úlitellm._loggingr
   Úlitellm.caching.in_memory_cacher   Úlitellm.proxy._typesr   Ú-litellm.proxy.common_utils.resource_ownershipr   r   r   r   Ú'litellm.repositories.table_repositoriesr   Úlitellm.responses.utilsr   Úprismar   Úprisma_modelsÚlitellm.proxy.utilsr   r   Ú__annotations__r   r   r   r   r    r;   r(   r.   Útupler7   rF   rA   r[   rI   rM   rR   rX   rc   r]   r…   r<   rˆ   r‹   rŠ   Úboolr’   rš   r¡   © r)   r'   ú<module>r³      sî  ðÜ ß -Ý .ß ,Ñ ,å !å 1Ý 9Ý /÷ó õ LÝ <áÝ.å0ð #.Ð ˜%Ó -ð #CÐ ˜%Ó BÙ -ÀÐTVÔ WÐ ˜Ó Wð 'KÐ ˜eÓ JÙ$1ÀUÐXZÔ$[Ð ˜EÓ [ñ '4ÀtÐY[Ô&\Ð ˜eÓ \ð,°8¸C±=ð ,ÀSó ,ðW°cð WÐPSð WÐX[ó Wð6°Cð 6Ècð 6ÐV[Ð\_ÐadÐ\dÑVeó 6ðØðØ.1ðØHKðà	ˆ#ˆsˆ(�^óð45˜vð 5¨#°©*ó 5ð.˜Sð . T¨#¨v¨+Ñ%6ó .óð ñØðàðð 	óð& '+ñØðà%ðð ˜t™ðð 
ó	ð>HØðHà%ðHð ðHð ó	HðV°cð ÐPSð ÐX[Ð^bÑXbó ð< K¸#ð  KÐTWð  KÐ\_ÐbfÑ\fó  KðF4Øð4à%ð4ð ð4ð ˆ3�ˆ8�_ó	4ð(4 vð 4°(¸6Ñ2BÀTÑ2Ió 4ñ sð °$°v±,ð ÐX\ð Ðioó ð0Ø%ðà�Ñóð>kØðkà%ðkð ðkð ô	kr)   