Ë
    tPêj_d  ã            
       ó„  — U d dl mZmZ d dlmZmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZ d dlmZ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  d dl!m"Z"m#Z#m$Z$  edg¬«      Z%ee&d<    G d„ de«      Z' G d„ de«      Z( G d„ de«      Z) G d„ de«      Z* G d„ de«      Z+ G d„ de«      Z, G d„ de«      Z-dedd fd!„Z.dedd fd"„Z/d#e'de#fd$„Z0d#e'defd%„Z1d#e'dd fd&„Z2d'e-d(e3e4   d)e4dd fd*„Z5d'e-d(e3e4   d)e4dd fd+„Z6d'e-d,e3e4   d)e4dd fd-„Z7d'e-d,e3e4   d)e4dd fd.„Z8d(e3e4   d)e4dd fd/„Z9d(e3e4   d)e4dd fd0„Z:d,e3e4   d)e4dd fd1„Z;d,e3e4   d)e4dd fd2„Z<e%j{                  d3e#e
j|                  ¬4«       ee«      fd5e"dede#fd6„«       Z?e%j�                  d3e3e#   ¬7«       ee«      fdede3e#   fd8„«       ZAe%j�                  d9e#¬7«       ee«      fd)e4dede#fd:„«       ZBe%j‡                  d9e#¬7«       ee«      fd)e4d5e$dede#fd;„«       ZDe%j‹                  d9e
jŒ                  ¬<«       ee«      fd)e4dedd fd=„«       ZGe%j‘                  d>e?d?ge#e
j|                  ¬@«       e%j‘                  d>eAdAge3e#   ¬B«       e%j‘                  dCeBdAge#¬B«       e%j‘                  dCeDdDge#¬B«       e%j‘                  dCeGdEge
jŒ                  ¬F«       y )Gé    )ÚMappingÚSequence)ÚFinalÚProtocol)Ú	APIRouterÚDependsÚHTTPExceptionÚstatus)Úverbose_proxy_logger)ÚCommonProxyErrorsÚLiteLLM_AccessGroupTableÚLitellmUserRolesÚUserAPIKeyAuth)Ú_cache_access_objectÚ_cache_key_objectÚ_cache_team_objectÚ_get_team_object_from_cache)Úuser_api_key_auth)ÚPrismaDBExceptionHandler)Úinvalidate_access_group_cache)Úget_prisma_client_or_throw)ÚAccessGroupRepository)ÚAccessGroupCreateRequestÚAccessGroupResponseÚAccessGroupUpdateRequestzaccess group management)ÚtagsÚrouterc                   ó|   — e Zd Zedefd„«       Zedee   dz  fd„«       Zedee   dz  fd„«       Zde	ee
f   fd„Zy)Ú_AccessGroupRecordÚreturnc                  ó   — y ©N© ©Úselfs    ú~/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/access_group_endpoints.pyÚaccess_group_idz"_AccessGroupRecord.access_group_id$   s   € Ø&)ó    Nc                  ó   — y r"   r#   r$   s    r&   Úassigned_team_idsz$_AccessGroupRecord.assigned_team_ids'   s   € Ø9<r(   c                  ó   — y r"   r#   r$   s    r&   Úassigned_key_idsz#_AccessGroupRecord.assigned_key_ids*   ó   € Ø8;r(   c                  ó   — y r"   r#   r$   s    r&   Údictz_AccessGroupRecord.dict-   s   � r(   )Ú__name__Ú
__module__Ú__qualname__ÚpropertyÚstrr'   r   r*   r,   r   Úobjectr/   r#   r(   r&   r   r   #   s^   „ ØØ) Ò)ó Ø)àØ< 8¨C¡=°4Ñ#7Ò<ó Ø<àØ; (¨3¡-°$Ñ"6Ò;ó Ø;à/�g˜c 6˜kÑ*Ô/r(   r   c                   óD   — e Zd Zedefd„«       Zedee   dz  fd„«       Zy)Ú_TeamRecordr    c                  ó   — y r"   r#   r$   s    r&   Úteam_idz_TeamRecord.team_id1   s   € Ø!r(   Nc                  ó   — y r"   r#   r$   s    r&   Úaccess_group_idsz_TeamRecord.access_group_ids4   r-   r(   )r0   r1   r2   r3   r4   r9   r   r;   r#   r(   r&   r7   r7   0   s1   „ ØØ!˜Ò!ó Ø!àØ; (¨3¡-°$Ñ"6Ò;ó Ù;r(   r7   c                   óD   — e Zd Zedefd„«       Zedee   dz  fd„«       Zy)Ú
_KeyRecordr    c                  ó   — y r"   r#   r$   s    r&   Útokenz_KeyRecord.token9   s   € Ør(   Nc                  ó   — y r"   r#   r$   s    r&   r;   z_KeyRecord.access_group_ids<   r-   r(   )r0   r1   r2   r3   r4   r?   r   r;   r#   r(   r&   r=   r=   8   s1   „ ØØ�sÒó ØàØ; (¨3¡-°$Ñ"6Ò;ó Ù;r(   r=   c                   ó¨   — e Zd Zdeeef   dedz  fd„Zdeeef   dee   fd„Z	deeef   defd„Z
deeef   deeef   defd	„Zdeeef   defd
„Zy)Ú_AccessGroupTableÚwherer    Nc              ƒ   ó   K  — y ­wr"   r#   ©r%   rC   s     r&   Úfind_uniquez_AccessGroupTable.find_uniqueA   ó   è ø� ùó   ‚Úorderc              ƒ   ó   K  — y ­wr"   r#   )r%   rI   s     r&   Ú	find_manyz_AccessGroupTable.find_manyC   rG   rH   Údatac              ƒ   ó   K  — y ­wr"   r#   )r%   rL   s     r&   Úcreatez_AccessGroupTable.createE   rG   rH   c              ƒ   ó   K  — y ­wr"   r#   ©r%   rC   rL   s      r&   Úupdatez_AccessGroupTable.updateG   rG   rH   c              ƒ   ó   K  — y ­wr"   r#   rE   s     r&   Údeletez_AccessGroupTable.deleteI   rG   rH   )r0   r1   r2   r   r4   r5   r   rF   r   rK   rN   rQ   rS   r#   r(   r&   rB   rB   @   s�   „ Ø^ w¨s°F¨{Ñ';Ð^Ð@RÐUYÑ@YÓ^à_ W¨S°&¨[Ñ%9Ð_¸hÐGYÑ>ZÓ_àQ ¨¨f¨Ñ!5ÐQÐ:LÓQàn '¨#¨v¨+Ñ"6Ðn¸gÀcÈ6ÀkÑ>RÐnÐWiÓnàF '¨#¨v¨+Ñ"6ÐF¸6ÔFr(   rB   c                   ót   — e Zd Zdeeef   dedz  fd„Zdeeef   dee   fd„Z	deeef   deeef   defd„Z
y)Ú
_TeamTablerC   r    Nc              ƒ   ó   K  — y ­wr"   r#   rE   s     r&   rF   z_TeamTable.find_uniqueM   rG   rH   c              ƒ   ó   K  — y ­wr"   r#   rE   s     r&   rK   z_TeamTable.find_manyO   rG   rH   rL   c              ƒ   ó   K  — y ­wr"   r#   rP   s      r&   rQ   z_TeamTable.updateQ   rG   rH   )r0   r1   r2   r   r4   r5   r7   rF   r   rK   rQ   r#   r(   r&   rU   rU   L   s]   „ ØW w¨s°F¨{Ñ';ÐWÀÈdÑ@RÓWàX W¨S°&¨[Ñ%9ÐX¸hÀ{Ñ>SÓXàb '¨#¨v¨+Ñ"6Ðb¸gÀcÈ6ÀkÑ>RÐbÐW]Ôbr(   rU   c                   ót   — e Zd Zdeeef   dedz  fd„Zdeeef   dee   fd„Z	deeef   deeef   defd„Z
y)Ú	_KeyTablerC   r    Nc              ƒ   ó   K  — y ­wr"   r#   rE   s     r&   rF   z_KeyTable.find_uniqueU   rG   rH   c              ƒ   ó   K  — y ­wr"   r#   rE   s     r&   rK   z_KeyTable.find_manyW   rG   rH   rL   c              ƒ   ó   K  — y ­wr"   r#   rP   s      r&   rQ   z_KeyTable.updateY   rG   rH   )r0   r1   r2   r   r4   r5   r=   rF   r   rK   rQ   r#   r(   r&   rZ   rZ   T   s]   „ ØV w¨s°F¨{Ñ';ÐVÀ
ÈTÑ@QÓVàW W¨S°&¨[Ñ%9ÐW¸hÀzÑ>RÓWàb '¨#¨v¨+Ñ"6Ðb¸gÀcÈ6ÀkÑ>RÐbÐW]Ôbr(   rZ   c                   óN   — e Zd Zedefd„«       Zedefd„«       Zedefd„«       Z	y)Ú_AccessGroupTxr    c                  ó   — y r"   r#   r$   s    r&   Úlitellm_accessgrouptablez'_AccessGroupTx.litellm_accessgrouptable]   s   € Ø=@r(   c                  ó   — y r"   r#   r$   s    r&   Úlitellm_teamtablez _AccessGroupTx.litellm_teamtable`   s   € Ø/2r(   c                  ó   — y r"   r#   r$   s    r&   Úlitellm_verificationtokenz(_AccessGroupTx.litellm_verificationtokenc   s   € Ø69r(   N)
r0   r1   r2   r3   rB   ra   rU   rc   rZ   re   r#   r(   r&   r_   r_   \   s<   „ ØØ@Ð*;Ò@ó Ø@àØ2 :Ò2ó Ø2àØ9¨9Ò9ó Ù9r(   r_   Úuser_api_key_dictr    Nc                 ó¨   — | j                   t        j                  k7  r5t        t        j
                  dt        j                  j                  i¬«      ‚y )NÚerror©Ústatus_codeÚdetail)	Ú	user_roler   ÚPROXY_ADMINr	   r
   ÚHTTP_403_FORBIDDENr   Únot_allowed_accessÚvalue)rf   s    r&   Ú_require_proxy_adminrq   g   sH   € Ø×"Ñ"Ô&6×&BÑ&BÒBÜÜ×1Ñ1ØÔ.×AÑA×GÑGÐHô
ð 	
ð Cr(   c                 óŠ   — ddl m}  || «      s5t        t        j                  dt
        j                  j                  i¬«      ‚y)zCAdmin Viewer parity: PROXY_ADMIN or PROXY_ADMIN_VIEW_ONLY may read.r   )Ú_user_has_admin_viewrh   ri   N)Ú/litellm.proxy.management_endpoints.common_utilsrs   r	   r
   rn   r   ro   rp   )rf   rs   s     r&   Ú_require_admin_viewru   o   s>   € åTáÐ 1Ô2ÜÜ×1Ñ1ØÔ.×AÑA×GÑGÐHô
ð 	
ð 3r(   Úrecordc                 óH   — t        j                  | j                  «       «      S r"   )r   Úmodel_validater/   ©rv   s    r&   Ú_record_to_responserz   z   s   € Ü×-Ñ-¨f¯k©k«mÓ<Ð<r(   c                 óH   — t        j                  | j                  «       «      S )zRConvert a Prisma record to a LiteLLM_AccessGroupTable pydantic object for caching.)r   rx   r/   ry   s    r&   Ú_record_to_access_group_tabler|   ~   s   € ä#×2Ñ2°6·;±;³=ÓAÐAr(   c              ƒ   óx   K  — ddl m}m} t        | «      }t	        | j
                  |||¬«      ƒ d{  –—†  y7 Œ­w)zõ
    Cache an access group Prisma record in the user_api_key_cache.

    Uses a lazy import of user_api_key_cache and proxy_logging_obj from proxy_server
    to avoid circular imports, following the same pattern as key_management_endpoints.
    r   ©Úproxy_logging_objÚuser_api_key_cache)r'   Úaccess_group_tabler€   r   N)Úlitellm.proxy.proxy_serverr   r€   r|   r   r'   )rv   r   r€   r�   s       r&   Ú_cache_access_group_recordrƒ   ƒ   s;   è ø€ ÷ Qä =¸fÓ EÐÜ
Ø×.Ñ.Ø-Ø-Ø+ô	÷ ò ús   ‚0:²8³:ÚtxÚteam_idsr'   c           	   ƒ   ó"  K  — |D ]‚  }| j                   j                  d|i¬«      ƒ d{  –—† }|€Œ,||j                  xs g vsŒ?| j                   j                  d|idt	        |j                  xs g «      |gz   i¬«      ƒ d{  –—†  Œ„ y7 Œa7 Œ	­w)zAAdd access_group_id to each team's access_group_ids (idempotent).r9   ©rC   Nr;   ©rC   rL   )rc   rF   r;   rQ   Úlist)r„   r…   r'   r9   Úteams        r&   Ú_sync_add_access_group_to_teamsr‹   š   s£   è ø€ àò ˆØ×)Ñ)×5Ñ5¸YÈÐ<PÐ5ÓQ×QˆØÑ ¸×8MÑ8MÒ8SÐQSÒ TØ×&Ñ&×-Ñ-Ø  'Ð*Ø(¬$¨t×/DÑ/DÒ/JÈÓ*KÈÐN_Ñ*_Ð`ð .ó ÷ ñ ñØQøðúó,   ‚'B©BªB±BÁ?BÂBÂBÂBc           
   ƒ   ó:  K  — |D ]‰  }| j                   j                  d|i¬«      ƒ d{  –—† }|€Œ,||j                  xs g v sŒ?| j                   j                  d|id|j                  xs dD �cg c]
  }||k7  sŒ	|‘Œ c}i¬«      ƒ d{  –—†  Œ‹ y7 Œhc c}w 7 Œ­w)zFRemove access_group_id from each team's access_group_ids (idempotent).r9   r‡   Nr;   r#   rˆ   )rc   rF   r;   rQ   )r„   r…   r'   r9   rŠ   Úags         r&   Ú$_sync_remove_access_group_from_teamsr�   ¥   s¯   è ø€ àò ˆØ×)Ñ)×5Ñ5¸YÈÐ<PÐ5ÓQ×QˆØÑ °D×4IÑ4IÒ4OÈRÒ PØ×&Ñ&×-Ñ-Ø  'Ð*Ø(¸×9NÑ9NÒ9TÐRTÖ*o°"ÐY[Ð_nÓYnª2Ò*oÐpð .ó ÷ ñ ñØQúò +pðúó>   ‚'B©BªB±BÁ+BÁ/
BÁ:BÁ>BÂ
BÂBÂBÚ
key_tokensc           	   ƒ   ó"  K  — |D ]‚  }| j                   j                  d|i¬«      ƒ d{  –—† }|€Œ,||j                  xs g vsŒ?| j                   j                  d|idt	        |j                  xs g «      |gz   i¬«      ƒ d{  –—†  Œ„ y7 Œa7 Œ	­w)z@Add access_group_id to each key's access_group_ids (idempotent).r?   r‡   Nr;   rˆ   )re   rF   r;   rQ   r‰   )r„   r‘   r'   r?   Úkeys        r&   Ú_sync_add_access_group_to_keysr”   °   s¡   è ø€ àò ˆØ×0Ñ0×<Ñ<ÀGÈUÐCSÐ<ÓT×TˆØ‰?˜°s×7KÑ7KÒ7QÈrÒRØ×.Ñ.×5Ñ5Ø Ð&Ø(¬$¨s×/CÑ/CÒ/IÀrÓ*JÈoÐM^Ñ*^Ð_ð 6ó ÷ ñ ñØTøðúrŒ   c           
   ƒ   ó:  K  — |D ]‰  }| j                   j                  d|i¬«      ƒ d{  –—† }|€Œ,||j                  xs g v sŒ?| j                   j                  d|id|j                  xs dD �cg c]
  }||k7  sŒ	|‘Œ c}i¬«      ƒ d{  –—†  Œ‹ y7 Œhc c}w 7 Œ­w)zERemove access_group_id from each key's access_group_ids (idempotent).r?   r‡   Nr;   r#   rˆ   )re   rF   r;   rQ   )r„   r‘   r'   r?   r“   rŽ   s         r&   Ú#_sync_remove_access_group_from_keysr–   »   s®   è ø€ àò ˆØ×0Ñ0×<Ñ<ÀGÈUÐCSÐ<ÓT×TˆØ‰?˜°3×3GÑ3GÒ3MÈ2ÒNØ×.Ñ.×5Ñ5Ø Ð&Ø(¸×9MÑ9MÒ9SÐQSÖ*n°"ÐXZÐ^mÓXmª2Ò*nÐoð 6ó ÷ ñ ñØTúò +oðúr�   c              ƒ   ó  K  — | D ]x  }t        d|› �|d¬«      ƒ d{  –—† }|€Œ|j                  €	|g|_        n.||j                  vrt        |j                  «      |gz   |_        nŒbt        ||||¬«      ƒ d{  –—†  Œz y7 Œd7 Œ	­w)z5Patch cached team objects to include access_group_id.úteam_id:N©r“   r€   Úparent_otel_span©r9   Ú
team_tabler€   r   )r   r;   r‰   r   )r…   r'   r€   r   r9   Úcached_teams         r&   Ú#_patch_team_caches_add_access_grouprž   Ë   s®   è ø€ ð ò 
ˆÜ7Ø˜7˜)Ð$Ø1Ø!ô
÷ 
ˆð
 ÐØØ×'Ñ'Ð/Ø,;Ð+<ˆKÕ(Ø K×$@Ñ$@Ñ@Ü+/°×0LÑ0LÓ+MÐQ`ÐPaÑ+aˆKÕ(àÜ ØØ"Ø1Ø/ô	
÷ 	
ñ 	
ñ
ð
øð	
ús"   ‚BœB�ABÁ9BÁ:BÂBc              ƒ   óö   K  — | D ]g  }t        d|› �|d¬«      ƒ d{  –—† }|€Œ|j                  sŒ,|j                  D �cg c]
  }||k7  sŒ	|‘Œ c}|_        t        ||||¬«      ƒ d{  –—†  Œi y7 ŒSc c}w 7 Œ­w)z4Patch cached team objects to remove access_group_id.r˜   Nr™   r›   )r   r;   r   )r…   r'   r€   r   r9   r�   rŽ   s          r&   Ú&_patch_team_caches_remove_access_groupr    è   s–   è ø€ ð ò ˆÜ7Ø˜7˜)Ð$Ø1Ø!ô
÷ 
ˆð
 Ñ" {×'CÓ'CØ9D×9UÑ9UÖ+o°2ÐY[Ð_nÓYnªBÒ+oˆKÔ(Ü$ØØ&Ø#5Ø"3ô	÷ ñ ñð
úò ,pðús<   ‚A9œA0�A9¤A9±A9¿
A2Á
A2ÁA9Á(A7Á)A9Á2A9c              ƒ   ó  K  — | D ]~  }|j                  |t        ¬«      ƒ d{  –—† }|€Œ%|j                  €	|g|_        n.||j                  vrt        |j                  «      |gz   |_        nŒht	        ||||¬«      ƒ d{  –—†  Œ€ y7 Œd7 Œ	­w)z4Patch cached key objects to include access_group_id.©r“   Ú
model_typeN©Úhashed_tokenÚuser_api_key_objr€   r   )Úasync_get_cacher   r;   r‰   r   )r‘   r'   r€   r   r?   Ú
cached_keys         r&   Ú"_patch_key_caches_add_access_groupr©   ÿ   s®   è ø€ ð ò 
ˆØ-×=Ñ=ØÜ%ð >ó 
÷ 
ˆ
ð ÐØØ×&Ñ&Ð.Ø+:Ð*;ˆJÕ'Ø J×$?Ñ$?Ñ?Ü*.¨z×/JÑ/JÓ*KÈÐN_Ñ*_ˆJÕ'àÜØØ'Ø1Ø/ô	
÷ 	
ñ 	
ñ
ð
øð	
ús"   ‚ B¢B£ABÁ?B	Â BÂ	Bc              ƒ   ó  K  — | D ]m  }|j                  |t        ¬«      ƒ d{  –—† }|€Œ%|j                  sŒ2|j                  D �cg c]
  }||k7  sŒ	|‘Œ c}|_        t        ||||¬«      ƒ d{  –—†  Œo y7 ŒSc c}w 7 Œ­w)z3Patch cached key objects to remove access_group_id.r¢   Nr¤   )r§   r   r;   r   )r‘   r'   r€   r   r?   r¨   rŽ   s          r&   Ú%_patch_key_caches_remove_access_groupr«     s—   è ø€ ð ò ˆØ-×=Ñ=ØÜ%ð >ó 
÷ 
ˆ
ð Ñ! j×&AÓ&AØ8B×8SÑ8SÖ*m°"ÐWYÐ]lÓWlª2Ò*mˆJÔ'Ü#Ø"Ø!+Ø#5Ø"3ô	÷ ñ ñð
úò
 +nðús=   ‚ A?¢A6£A?ªA?·A?Á
A8ÁA8ÁA?Á.A=Á/A?Á8A?z/v1/access_group)Úresponse_modelrj   rL   c              ƒ   óž  K  — t        |«       t        t        j                  j                  «      }	 |j
                  j                  «       4 ƒd {  –—† }|j                  j                  d| j                  i¬«      ƒ d {  –—† }|�)t        t        j                  d| j                  › d�¬«      ‚|j                  j                  | j                  | j                  | j                  xs g | j                   xs g | j"                  xs g | j$                  xs g | j&                  xs g |j(                  |j(                  dœ	¬«      ƒ d {  –—† }t+        || j$                  xs g |j,                  «      ƒ d {  –—†  t/        || j&                  xs g |j,                  «      ƒ d {  –—†  d d d «      ƒd {  –—†  d
dlm}m} t=        «      ƒ d {  –—†  t?        | j$                  xs g |j,                  ||«      ƒ d {  –—†  tA        | j&                  xs g |j,                  ||«      ƒ d {  –—†  tC        |«      S 7 �Œè7 �Œ»7 Œö7 ŒË7 Œ 7 Œ’# 1 ƒd {  –—†7  sw Y   Œ¢xY w# t        $ r ‚ t0        $ rW}dt3        |«      j5                  «       v sd	t3        |«      v r)t        t        j                  d| j                  › d�¬«      ‚‚ d }~ww xY w7 Œú7 ŒÎ7 Œ¢­w)NÚaccess_group_namer‡   úAccess group 'ú' already existsri   )	r®   ÚdescriptionÚaccess_model_namesÚaccess_mcp_server_idsÚaccess_agent_idsr*   r,   Ú
created_byÚ
updated_by)rL   úunique constraintÚP2002r   r~   )"rq   r   r   Údb_not_connected_errorrp   Údbr„   ra   rF   r®   r	   r
   ÚHTTP_409_CONFLICTrN   r±   r²   r³   r´   r*   r,   Úuser_idr‹   r'   r”   Ú	Exceptionr4   Úlowerr‚   r   r€   rƒ   rž   r©   rz   )	rL   rf   Úprisma_clientr„   Úexistingrv   Úer   r€   s	            r&   Úcreate_access_grouprÂ   6  sË  è ø€ ô Ð*Ô+Ü5Ô6G×6^Ñ6^×6dÑ6dÓe€Mð&à ×#Ñ#×&Ñ&Ó(÷ 	jð 	j¨BØ$&×$?Ñ$?×$KÑ$KØ*¨D×,BÑ,BÐCð %Ló %÷ ˆHð Ð#Ü#Ü &× 8Ñ 8Ø+¨D×,BÑ,BÐ+CÐCSÐTôð ð
 #%×"=Ñ"=×"DÑ"Dà)-×)?Ñ)?Ø#'×#3Ñ#3Ø*.×*AÑ*AÒ*GÀRØ-1×-GÑ-GÒ-MÈ2Ø(,×(=Ñ(=Ò(CÀØ)-×)?Ñ)?Ò)EÀ2Ø(,×(=Ñ(=Ò(CÀØ"3×";Ñ";Ø"3×";Ñ";ñ
ð #Eó #÷ ˆFô 2°"°d×6LÑ6LÒ6RÐPRÐTZ×TjÑTjÓk×kÐkÜ0°°T×5JÑ5JÒ5PÈbÐRX×RhÑRhÓi×iÐi÷5	j÷ 	j÷L Qä
$ VÓ
,×,Ð,Ü
-Ø×ÑÒ$ "Ø×ÑØØó	÷ ð ô -Ø×ÑÒ# Ø×ÑØØó	÷ ð ô ˜vÓ&Ð&ðm	jùðùðøð løØiøð5	jø÷ 	j÷ 	jñ 	jûô6 ò ØÜò à¤# a£&§,¡,£.Ñ0°G¼sÀ1»vÑ4EÜÜ"×4Ñ4Ø'¨×(>Ñ(>Ð'?Ð?OÐPôð ð 	ûðúð -øðøðúsê   ‚/K²I ÁH8ÁI Á,IÂ H;ÂCIÅH>Å,IÅ4I Å5,IÆ!IÆ"IÆ&I Æ1IÆ2I Æ6KÇKÇ-KÇ:K	Ç;-KÈ(KÈ)KÈ8I È;IÈ>IÉ IÉIÉI ÉIÉIÉIÉI ÉKÉ-AJ?Ê?KËKË	KËK)r¬   c              ƒ   ó  K  — t        | «       t        t        j                  j                  «      }t        |«      j                  }|j                  ddi¬«      ƒ d {  –—† }|D �cg c]  }t        |«      ‘Œ c}S 7 Œc c}w ­w)NÚ
created_atÚdesc)rI   )	ru   r   r   r¹   rp   r   ÚtablerK   rz   )rf   r¿   rÆ   ÚrecordsÚrs        r&   Úlist_access_groupsrÉ   }  sp   è ø€ ô Ð)Ô*Ü5Ô6G×6^Ñ6^×6dÑ6dÓe€Mä(¨Ó7×=Ñ=€EØ Ÿ?™?°,ÀÐ1G˜?ÓH×H€GØ,3Ö4 qÔ Õ"Ò4Ð4ð IúÚ4ùs$   ‚ABÁA;ÁBÁ&A=Á8BÁ=Bz"/v1/access_group/{access_group_id}c              ƒ   ó$  K  — t        |«       t        t        j                  j                  «      }t        |«      j                  }|j                  d| i¬«      ƒ d {  –—† }|€t        t        j                  d| › d�¬«      ‚t        |«      S 7 Œ0­w)Nr'   r‡   r¯   ú' not foundri   )ru   r   r   r¹   rp   r   rÆ   rF   r	   r
   ÚHTTP_404_NOT_FOUNDrz   )r'   rf   r¿   rÆ   rv   s        r&   Úget_access_grouprÍ   Œ  s�   è ø€ ô Ð)Ô*Ü5Ô6G×6^Ñ6^×6dÑ6dÓe€Mä(¨Ó7×=Ñ=€EØ×+Ñ+Ð3DÀoÐ2VÐ+ÓW×W€FØ€~ÜÜ×1Ñ1Ø# OÐ#4°KÐ@ô
ð 	
ô ˜vÓ&Ð&ð Xús   ‚ABÁBÁ1Bc           	   ƒ   ód  K  — t        |«       t        t        j                  j                  «      }|j                  d¬«      }d|j                  i}|j                  «       D ]  \  }}|dv r|€g }|||<   Œ g }g }	g }
g }	 |j                  j                  «       4 ƒd {  –—† }|j                  j                  d| i¬«      ƒ d {  –—† }|€t        t        j                  d| › d�¬	«      ‚t        |j                   xs g «      }t        |j"                  xs g «      }d
|v rt        |d
   xs g «      n|}d|v rt        |d   xs g «      n|}t%        ||z
  «      }t%        ||z
  «      }	t%        ||z
  «      }
t%        ||z
  «      }|j                  j'                  d| i|¬«      ƒ d {  –—† }t)        ||| «      ƒ d {  –—†  t+        ||	| «      ƒ d {  –—†  t-        ||
| «      ƒ d {  –—†  t/        ||| «      ƒ d {  –—†  d d d «      ƒd {  –—†  ddlm}m} tA        «      ƒ d {  –—†  tC        || ||«      ƒ d {  –—†  tE        |	| ||«      ƒ d {  –—†  tG        |
| ||«      ƒ d {  –—†  tI        || ||«      ƒ d {  –—†  tK        |«      S 7 �Œï7 �ŒÌ7 Œì7 ŒÙ7 ŒÆ7 Œ³7 Œ 7 Œ’# 1 ƒd {  –—†7  sw Y   Œ¢xY w# t        $ r ‚ t0        $ r]}dt3        |«      j5                  «       v sdt3        |«      v r/t        t        j6                  d|j9                  dd«      › d�¬	«      ‚‚ d }~ww xY w7 �Œ7 Œí7 ŒÙ7 ŒÅ7 Œ±­w)NT)Úexclude_unsetr¶   )r*   r,   r²   r³   r´   r'   r‡   r¯   rË   ri   r*   r,   rˆ   r·   r¸   r®   Ú r°   r   r~   )&rq   r   r   r¹   rp   Ú
model_dumpr¼   Úitemsrº   r„   ra   rF   r	   r
   rÌ   Úsetr*   r,   r‰   rQ   r‹   r�   r”   r–   r½   r4   r¾   r»   Úgetr‚   r   r€   rƒ   rž   r    r©   r«   rz   )r'   rL   rf   r¿   Úupdate_fieldsÚupdate_dataÚfieldrp   Úteams_to_addÚteams_to_removeÚkeys_to_addÚkeys_to_remover„   rÀ   Úold_team_idsÚold_key_idsÚnew_team_idsÚnew_key_idsrv   rÁ   r   r€   s                         r&   Úupdate_access_grouprà   ¡  s•  è ø€ ô Ð*Ô+Ü5Ô6G×6^Ñ6^×6dÑ6dÓe€MàŸ?™?¸˜?Ó>€MØ ,Ð.?×.GÑ.GÐH€KØ%×+Ñ+Ó-ò #‰ˆˆuàðñð �àˆEØ"ˆ�EÒð#ð" !€LØ!#€OØ€KØ "€Nð,à ×#Ñ#×&Ñ&Ó(÷  	[ð  	[¨Bð %'×$?Ñ$?×$KÑ$KÐSdÐfuÐRvÐ$KÓ$w×wˆHØÐÜ#Ü &× 9Ñ 9Ø+¨OÐ+<¸KÐHôð ô
 -0°×0JÑ0JÒ0PÈbÓ,QˆLÜ+.¨x×/HÑ/HÒ/NÈBÓ+OˆKàATÐXeÑAe”�MÐ"5Ñ6Ò<¸"Ô=Ðkwð ð ASÐVcÑ@c”�MÐ"4Ñ5Ò;¸Ô<Ðitð ô   ¨|Ñ ;Ó<ˆLÜ" <°,Ñ#>Ó?ˆOÜ˜{¨[Ñ8Ó9ˆKÜ! +°Ñ";Ó<ˆNà"$×"=Ñ"=×"DÑ"DØ(¨/Ð:Ø ð #Eó #÷ ˆFô
 2°"°lÀOÓT×TÐTÜ6°r¸?ÈOÓ\×\Ð\Ü0°°[À/ÓR×RÐRÜ5°b¸.È/ÓZ×ZÐZ÷A 	[÷  	[÷X Qä
$ VÓ
,×,Ð,Ü
-¨l¸OÐM_ÐarÓ
s×sÐsÜ
0Ø˜Ð*<Ð>Oó÷ ð ô -¨[¸/ÐK]Ð_pÓ
q×qÐqÜ
/°ÀÐQcÐevÓ
w×wÐwä˜vÓ&Ð&ðm 	[ùð xùð*øð
 UøØ\øØRøØZøðA 	[ø÷  	[÷  	[ñ  	[ûôB ò ØÜò à¤# a£&§,¡,£.Ñ0°G¼sÀ1»vÑ4EÜÜ"×4Ñ4Ø'¨¯©Ð8KÈRÓ(PÐ'QÐQaÐbôð ð 	ûðúð -ùØsøðøð røØwús4  ‚A<L0Á?J3 ÂJÂJ3 Â!"JÃJÃC!JÆ%JÆ&JÆ:JÆ;JÇJÇJÇ$JÇ%JÇ9JÇ:JÇ>J3 È	JÈ
J3 ÈL0È$L%È%L0È:L(È;L0ÉL*ÉL0É&L,É'L0É<L.É=L0ÊJ3 ÊJÊJÊJÊJÊJÊJÊJ3 ÊJ0Ê$J'Ê%J0Ê,J3 Ê3L"ËALÌL"Ì"L0Ì(L0Ì*L0Ì,L0Ì.L0)rj   c              ƒ   ó,	  K  — t        |«       t        t        j                  j                  «      }	 g }g }|j
                  j                  «       4 ƒd {  –—† }|j                  j                  d| i¬«      ƒ d {  –—† }|€t        t        j                  d| › d�¬«      ‚|j                  j                  dd| gii¬«      ƒ d {  –—† }|D �ch c]  }|j                  ’Œ c}t        |j                   xs g «      z  }	t#        |	«      }|j$                  j                  dd| gii¬«      ƒ d {  –—† }
|
D �ch c]  }|j&                  ’Œ c}t        |j(                  xs g «      z  }t#        |«      }|D ]W  }|j                  j+                  d|j                  id|j,                  xs d	D �cg c]
  }|| k7  sŒ	|‘Œ c}i¬
«      ƒ d {  –—†  ŒY t        |j                   xs g «      |D �ch c]  }|j                  ’Œ c}z
  }t/        |t#        |«      | «      ƒ d {  –—†  |
D ]W  }|j$                  j+                  d|j&                  id|j,                  xs d	D �cg c]
  }|| k7  sŒ	|‘Œ c}i¬
«      ƒ d {  –—†  ŒY t        |j(                  xs g «      |
D �ch c]  }|j&                  ’Œ c}z
  }t1        |t#        |«      | «      ƒ d {  –—†  |j                  j3                  d| i¬«      ƒ d {  –—†  d d d «      ƒd {  –—†  ddlm}m} t;        | «      ƒ d {  –—†  t=        || ||«      ƒ d {  –—†  t?        || ||«      ƒ d {  –—†  y 7 �Œö7 �ŒÓ7 �ŒŒc c}w 7 �Œ,c c}w c c}w 7 �Œ c c}w 7 �ŒTc c}w 7 �Œc c}w 7 Œµ7 Œ‘7 Œƒ# 1 ƒd {  –—†7  sw Y   Œ“xY w7 Œ7 Œk7 ŒW# t        $ r ‚ t@        $ rá}tC        jD                  d| |«       tG        jH                  |«      r3t        t        jJ                  t        j                  j                  ¬«      ‚dtM        |«      v s6dtM        |«      jO                  «       v r:dtM        |«      jO                  «       v rt        t        j                  d| › d�¬«      ‚t        t        jP                  d¬«      ‚d }~ww xY w­w)Nr'   r‡   r¯   rË   ri   r;   ÚhasSomer9   r#   rˆ   r?   r   r~   z7delete_access_group failed: access_group_id=%s error=%sÚP2025rv   z	not foundz0Failed to delete access group. Please try again.))rq   r   r   r¹   rp   rº   r„   ra   rF   r	   r
   rÌ   rc   rK   r9   rÓ   r*   r‰   re   r?   r,   rQ   r;   r�   r–   rS   r‚   r   r€   r   r    r«   r½   r   Ú	exceptionr   Ú is_database_infrastructure_errorÚHTTP_503_SERVICE_UNAVAILABLEr4   r¾   ÚHTTP_500_INTERNAL_SERVER_ERROR)r'   rf   r¿   Úaffected_team_idsÚaffected_key_tokensr„   rÀ   Úteams_with_grouprŠ   Úall_affected_team_idsÚkeys_with_groupr“   Úall_affected_key_tokensrŽ   ÚtÚout_of_sync_team_idsÚkÚout_of_sync_key_tokensr   r€   rÁ   s                        r&   Údelete_access_grouprò      sÏ  è ø€ ô Ð*Ô+Ü5Ô6G×6^Ñ6^×6dÑ6dÓe€MðV
Ø')ÐØ)+Ðð !×#Ñ#×&Ñ&Ó(÷ 0	að 0	a¨BØ$&×$?Ñ$?×$KÑ$KÐSdÐfuÐRvÐ$KÓ$w×wˆHØÐÜ#Ü &× 9Ñ 9Ø+¨OÐ+<¸KÐHôð ð -/×,@Ñ,@×,JÑ,JØ)¨I¸Ð7HÐ+IÐJð -Kó -÷ 'Ðð P`Ö5`Àt°d·l³lÒ5`ÔcfØ×*Ñ*Ò0¨bódñ 6Ð!ô !%Ð%:Ó ;Ðð ,.×+GÑ+G×+QÑ+QØ)¨I¸Ð7HÐ+IÐJð ,Ró ,÷ &ˆOð N]Ö7]Àc¸¿	»	Ò7]Ô`cØ×)Ñ)Ò/¨Róañ 8Ð#ô #'Ð'>Ó"?Ðð )ò �Ø×*Ñ*×1Ñ1Ø$ d§l¡lÐ3Ø,¸T×=RÑ=RÒ=XÐVXÖ.s°bÐ]_ÐcrÓ]rªrÒ.sÐtð 2ó ÷ ñ ðô +.¨h×.HÑ.HÒ.NÈBÓ*OÐfvÖRwÐabÐST×S\ÓS\ÒRwÑ*wÐ Ü6°r¼4Ð@TÓ;UÐWfÓg×gÐgð 'ò �Ø×2Ñ2×9Ñ9Ø" C§I¡IÐ.Ø,¸S×=QÑ=QÒ=WÐUWÖ.r°bÐ\^ÐbqÓ\qªrÒ.rÐsð :ó ÷ ñ ðô -0°×0IÑ0IÒ0OÈRÓ,PÐetÖSuÐ`aÐTU×T[ÓT[ÒSuÑ,uÐ"Ü5°b¼$Ð?UÓ:VÐXgÓh×hÐhà×-Ñ-×4Ñ4Ð<MÈÐ;_Ð4Ó`×`Ð`÷a0	a÷ 0	a÷d 	Uä+¨OÓ<×<Ð<Ü4Ø˜Ð0BÐDUó
÷ 	
ð 	
ô 4Ø Ð2DÐFWó
÷ 	
ñ 	
ðq0	aùØwùð'ûò 6að&ûò 8^ùò /tðûò
 SxØgûò /sðûò
 TvØhøà`øða0	aø÷ 0	a÷ 0	añ 0	aúðh 	=øð	
øð	
ùô ò ØÜò 
Ü×&Ñ&ØEØØô	
ô
 $×DÑDÀQÔGÜÜ"×?Ñ?Ü(×?Ñ?×EÑEôð ð ”c˜!“fÑ ¬S°«V¯\©\«^Ñ!;ÀÌsÐSTËvÏ|É|Ë~Ñ@]ÜÜ"×5Ñ5Ø'¨Ð'8¸ÐDôð ô Ü×=Ñ=ØEô
ð 	
ûð!
üsˆ  ‚/R²"N ÁM
ÁN Á"NÁ:MÁ;A	NÃMÃNÃMÃ ANÄ,MÄ-NÄ5MÅA"NÆ*
M Æ5M Æ9NÇM%Ç"NÇ(M(Ç;NÈM-È>NÉ
M0É#M0É'NÉ3M5É4"NÊM8Ê)NËM=Ë%NË-M?Ë.NË2N Ë=NË>N ÌNÌN Ì.NÌ/N ÍNÍN Í	RÍ
N ÍNÍNÍNÍNÍ(NÍ0NÍ8NÍ?NÎN ÎNÎ	NÎ
NÎN ÎN ÎN ÎRÎ0CRÒRÒRz/v1/unified_access_groupÚPOST)Úmethodsr¬   rj   ÚGET)rô   r¬   z*/v1/unified_access_group/{access_group_id}ÚPUTÚDELETE)rô   rj   )IÚcollections.abcr   r   Útypingr   r   Úfastapir   r   r	   r
   Úlitellm._loggingr   Úlitellm.proxy._typesr   r   r   r   Úlitellm.proxy.auth.auth_checksr   r   r   r   Ú$litellm.proxy.auth.user_api_key_authr   Ú"litellm.proxy.db.exception_handlerr   Ú7litellm.proxy.management_helpers.access_group_team_syncr   Úlitellm.proxy.utilsr   Ú'litellm.repositories.table_repositoriesr   Úlitellm.types.access_groupr   r   r   r   Ú__annotations__r   r7   r=   rB   rU   rZ   r_   rq   ru   rz   r|   rƒ   r‰   r4   r‹   r�   r”   r–   rž   r    r©   r«   ÚpostÚHTTP_201_CREATEDrÂ   rÔ   rÉ   rÍ   Úputrà   rS   ÚHTTP_204_NO_CONTENTrò   Úadd_api_router#   r(   r&   ú<module>r
     s¹  ðß -Ð -ß "ç =Ó =å 1÷ó ÷ó õ CÝ GÝ aÝ :Ý I÷ñ ñ Ø
#Ð	$ô€ˆó ô

0˜ô 
0ô<�(ô <ô<�ô <ô	G˜ô 	Gôc�ô côc�ô cô:�Xô :ð
¨Nð 
¸tó 
ð
¨>ð 
¸dó 
ð=Ð 2ð =Ð7Jó =ðBÐ*<ð BÐAYó Bð
Ð-?ð ÀDó ð.¨nð ÈÈSÉ	ð Ðdgð Ðlpó ð°>ð ÈTÐRUÉYð Ðilð Ðquó ð¨^ð ÈÈcÉð Ðehð Ðmqó ð°.ð ÈdÐSVÉið Ðjmð Ðrvó ð 
Ø�3‰ið
àð
ð
 
ó
ð:Ø�3‰iðàðð
 
óð.
Ø�S‘	ð
àð
ð
 
ó
ð8Ø�S‘	ðàðð
 
óð6 ‡�ØØ&Ø×'Ñ'ð ó ñ )0Ð0AÓ(Bñ?'Ø
"ð?'à%ð?'ð ò?'óð
?'ðD ‡�ØØÐ+Ñ,ð ó ñ
 )0Ð0AÓ(Bñ5Ø%ð5à	Ð
Ñò5ó	ð5ð ‡�Ø(Ø&ð ó ñ )0Ð0AÓ(Bñ'Øð'à%ð'ð ò'ó	ð'ð" ‡�Ø(Ø&ð ó ñ )0Ð0AÓ(BñX'ØðX'à
"ðX'ð &ðX'ð ò	X'ó	ðX'ðv ‡�Ø(Ø×*Ñ*ð ó ñ )0Ð0AÓ(Bñ]
Øð]
à%ð]
ð 
ò]
ó	ð]
ðB × Ñ ØØØˆHØ&Ø×'Ñ'ð ô ð × Ñ ØØØˆGØÐ+Ñ,ð	 ô ð × Ñ Ø0ØØˆGØ&ð	 ô ð × Ñ Ø0ØØˆGØ&ð	 ô ð × Ñ Ø0ØØˆJØ×*Ñ*ð	 õ r(   