Ë
    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 ddlm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZ ddlmZ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e«      Z G d„ de«      Z G d„ de«      Z ei «      Ze	ee ef      ed<    G d„ de«      Z! G d„ d«      Z" e"«       Z#e	ed<    ee$edf   «      Z%e	ee$edf         ed<   de&de$edf   fd „Z' G d!„ d"«      Z( e(«       Z)e	ed#<   d$e!d%ed&e*d'e+d(e ddfd)„Z,d*ee e&f   de+fd+„Z-d*ee e&f   de fd,„Z.e#fd-e
d.   d/ee ef   dz  d0ee ef   dz  d1e dz  d2e dz  d3ed4e"ddfd5„Z/y)6a  Custom validation of team metadata on team create/update.

Operators point `general_settings.custom_team_metadata_validate` at an async
Python function (loaded via `get_instance_fn`, like `custom_key_generate`).
The function receives a `TeamMetadataValidationPayload` and returns a
`TeamMetadataValidationResult`. The proxy awaits it before committing a team
write and fails closed: a rejected value surfaces the function's own message
(HTTP 400), while any raised exception or timeout blocks the write with a
generic message (HTTP 503).
é    N)Ú	AwaitableÚMapping)ÚMappingProxyType)ÚFinalÚLiteralÚProtocol)ÚHTTPExceptionÚstatus)Ú	BaseModelÚ	JsonValueÚTypeAdapter)ÚCommonProxyErrorsÚUserAPIKeyAuth)ÚTeamMetadataFieldSchemag      @Ú0DEFAULT_TEAM_METADATA_VALIDATION_TIMEOUT_SECONDSzgTeam metadata validation is currently unavailable, so the team was not saved. Contact your proxy admin.Ú4DEFAULT_TEAM_METADATA_VALIDATION_UNAVAILABLE_MESSAGEz Team metadata failed validation.Ú1DEFAULT_TEAM_METADATA_VALIDATION_REJECTED_MESSAGEc                   óJ   — e Zd ZU dZedz  ed<   dZedz  ed<   dZedz  ed<   y)ÚTeamMetadataRequesterNÚuser_idÚ
user_emailÚ	user_role)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__r   r   © ó    ú~/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_helpers/team_metadata_validation.pyr   r   !   s,   … Ø€GˆS�4‰ZÓØ!€J��d‘
Ó!Ø €Iˆs�T‰zÔ r   r   c                   ó‚   — e Zd ZU ed   ed<   eeef   ed<   dZeeef   dz  ed<   dZ	edz  ed<   dZ
edz  ed<   eed<   y)	ÚTeamMetadataValidationPayload©ÚcreateÚupdateÚ	operationÚmetadataNÚexisting_metadataÚteam_idÚ
team_aliasÚ	requester)r   r   r   r   r   r   r   r   r(   r)   r*   r   r   r   r    r"   r"   '   sX   … ØÐ)Ñ*Ó*Ø�c˜9�nÑ%Ó%Ø8<Ð�w˜s I˜~Ñ.°Ñ5Ó<Ø€GˆS�4‰ZÓØ!€J��d‘
Ó!Ø$Ô$r   r"   c                   ó,   — e Zd ZU eed<   dZedz  ed<   y)ÚTeamMetadataValidationResultÚvalidNÚerror_message)r   r   r   Úboolr   r/   r   r   r   r    r-   r-   0   s   … ØƒKØ $€M�3˜‘:Ô$r   r-   Ú_EMPTY_METADATAc                   ó"   — e Zd Zdedee   fd„Zy)ÚTeamMetadataValidatorÚpayloadÚreturnc                 ó   — y ©Nr   )Úselfr4   s     r    Ú__call__zTeamMetadataValidator.__call__9   s   � r   N)r   r   r   r"   r   r-   r9   r   r   r    r3   r3   8   s   „ ØqÐ =ÐqÀYÐOkÑElÔqr   r3   c                   ó<   — e Zd Zdd„Zdedz  ddfd„Zdedz  fd„Zy)ÚTeamMetadataValidatorRegistryr5   Nc                 ó   — d | _         y r7   ©Ú
_validator©r8   s    r    Ú__init__z&TeamMetadataValidatorRegistry.__init__=   s	   € Ø8<ˆ�r   Ú	validatorc                 ó   — || _         y r7   r=   )r8   rA   s     r    Úsetz!TeamMetadataValidatorRegistry.set@   s	   € Ø#ˆ�r   c                 ó   — | j                   S r7   r=   r?   s    r    Úgetz!TeamMetadataValidatorRegistry.getC   s   € Ø�‰Ðr   ©r5   N)r   r   r   r@   r3   rC   rE   r   r   r    r;   r;   <   s2   „ ó=ð$Ð2°TÑ9ð $¸dó $ðÐ*¨TÑ1ô r   r;   Ú TEAM_METADATA_VALIDATOR_REGISTRY.Ú_TEAM_METADATA_SCHEMA_ADAPTERÚ
raw_schemar5   c                 óÔ   ‡— | €yt         j                  | «      }t        d„ |D «       «      Št        t	        ˆfd„‰D «       «      «      }|rt        ddj                  |«      › �«      ‚|S )zhParse ``general_settings.team_metadata_schema``; raises on a malformed schema so config load fails fast.r   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr7   )Úkey)Ú.0Úfields     r    ú	<genexpr>z-parse_team_metadata_schema.<locals>.<genexpr>S   s   è ø€ Ò6 e˜Ÿ	�	Ñ6ùs   ‚c              3   óL   •K  — | ]  }‰j                  |«      d kD  sŒ|–— Œ y­w)é   N)Úcount)rM   rL   Úkeyss     €r    rO   z-parse_team_metadata_schema.<locals>.<genexpr>T   s!   øè ø€ Ò,X°SÀDÇJÁJÈsÃOÐVWÓDW¬SÑ,Xùs   ƒ$�$z.team_metadata_schema contains duplicate keys: z, )rH   Úvalidate_pythonÚtupleÚsortedÚ	frozensetÚ
ValueErrorÚjoin)rI   ÚfieldsÚduplicate_keysrS   s      @r    Úparse_team_metadata_schemar\   N   sg   ø€ àÐØÜ1×AÑAÀ*ÓM€FÜÑ6¨vÔ6Ó6€DÜ"¤9Ó,X¸DÔ,XÓ#XÓY€NÙÜÐIÈ$Ï)É)ÐTbÓJcÐIdÐeÓfÐfØ€Mr   c                   óD   — e Zd Zdd„Zdeedf   ddfd„Zdeedf   fd„Zy)	ÚTeamMetadataSchemaRegistryr5   Nc                 ó   — d| _         y )Nr   ©Ú_fieldsr?   s    r    r@   z#TeamMetadataSchemaRegistry.__init__[   s	   € Ø<>ˆ�r   rZ   .c                 ó   — || _         y r7   r`   )r8   rZ   s     r    rC   zTeamMetadataSchemaRegistry.set^   s	   € Øˆ�r   c                 ó   — | j                   S r7   r`   r?   s    r    rE   zTeamMetadataSchemaRegistry.geta   s   € Ø�|‰|Ðr   rF   )r   r   r   r@   rU   r   rC   rE   r   r   r    r^   r^   Z   s<   „ ó?ð˜%Ð 7¸Ð <Ñ=ð À$ó ð�UÐ2°CÐ7Ñ8ô r   r^   ÚTEAM_METADATA_SCHEMA_REGISTRYrA   r4   Úpremium_userÚtimeout_secondsÚunavailable_messagec              ƒ   ól  K  — |dur8t        t        j                  ddt        j                  j
                  › �i¬«      ‚t        j                  | «      s=t        j                  t        | dd «      «      st        t        j                  ddi¬«      ‚	 t        j                   | |«      |¬«      ƒ d {  –—† }t        j                  |«      }|j                   s/t        t        j                  d|j"                  xs t$        i¬«      ‚y 7 ŒU# t        $ r t        t        j                  d|i¬«      ‚w xY w­w)NTÚerrorz8custom_team_metadata_validate is an Enterprise feature. )Ústatus_codeÚdetailr9   z7custom_team_metadata_validate must be an async function)Útimeout)r	   r
   ÚHTTP_400_BAD_REQUESTr   Únot_premium_userÚvalueÚinspectÚiscoroutinefunctionÚgetattrÚHTTP_500_INTERNAL_SERVER_ERRORÚasyncioÚwait_forr-   Úmodel_validateÚ	ExceptionÚHTTP_503_SERVICE_UNAVAILABLEr.   r/   r   )rA   r4   re   rf   rg   Ú
raw_resultÚresults          r    Úrun_team_metadata_validationr{   h   s,  è ø€ ð ˜4ÑÜÜ×3Ñ3àÐSÔTe×TvÑTv×T|ÑT|ÐS}Ð~ðô
ð 	
ô 	×#Ñ# IÔ.´'×2MÑ2MÌgÐV_ÐakÐmqÓNrÔ2säÜ×=Ñ=àÐRðô
ð 	
ð
Ü")×"2Ñ"2±9¸WÓ3EÈÔ"_×_ˆ
Ü4×CÑCÀJÓOˆð �<Š<ÜÜ×3Ñ3à˜×-Ñ-ÒbÔ1bðô
ð 	
ð ð `ùäò 
ÜÜ×;Ñ;ØÐ0Ð1ô
ð 	
ð
üs0   ‚BD4Â D
 Â2DÂ3D
 Ã<D4ÄD
 Ä
'D1Ä1D4Úgeneral_settingsc                 óœ   — | j                  d«      }t        |t        t        f«      r t        |t        «      s|dkD  rt        |«      S t
        S )NÚ team_metadata_validation_timeoutr   )rE   Ú
isinstanceÚintÚfloatr0   r   )r|   Úraw_timeouts     r    Ú_read_timeout_secondsrƒ   ’   sD   € Ø)×-Ñ-Ð.PÓQ€KÜ�+¤¤U˜|Ô,´ZÀÌTÔ5RÐWbÐefÒWfÜ�[Ó!Ð!Ü;Ð;r   c                 ót   — | j                  d«      }t        |t        «      r|j                  «       r|S t        S )NÚ&team_metadata_validation_error_message)rE   r   r   Ústripr   )r|   Úraw_messages     r    Ú_read_unavailable_messagerˆ   ™   s4   € Ø)×-Ñ-Ð.VÓW€KÜ�+œsÔ#¨×(9Ñ(9Ô(;ØÐÜ?Ð?r   r&   r#   r'   r(   r)   r*   Úuser_api_key_dictÚregistryc              ƒ   ó�  K  — ddl m}m} |j                  «       }	|	€y t	        | t        |t        «      r|nt        t        |t        «      r|nd ||t        |j                  |j                  |j                  �|j                  j                  nd ¬«      ¬«      }
t        |	|
|t        |«      t        |«      ¬«      ƒ d {  –—†  y 7 Œ­w)Nr   )r|   re   )r   r   r   )r&   r'   r(   r)   r*   r+   )rA   r4   re   rf   rg   )Úlitellm.proxy.proxy_serverr|   re   rE   r"   r   Údictr1   r   r   r   r   ro   r{   rƒ   rˆ   )r&   r'   r(   r)   r*   r‰   rŠ   r|   re   rA   r4   s              r    Ú$validate_team_metadata_if_configuredrŽ       s¹   è ø€ ÷ Jà—|‘|“~€IØÐØä2ØÜ'¨´$Ô7‘¼_Ü/9Ð:KÌTÔ/RÑ+ÐX\ØØÜ'Ø%×-Ñ-Ø(×3Ñ3Ø;L×;VÑ;VÐ;bÐ'×1Ñ1×7Ò7Ðhlô
ô€Gô 'ØØØ!Ü-Ð.>Ó?Ü5Ð6FÓGô÷ ò ús   ‚B<CÂ>CÂ?C)0Ú__doc__rt   rp   Úcollections.abcr   r   Útypesr   Útypingr   r   r   Úfastapir	   r
   Úpydanticr   r   r   Úlitellm.proxy._typesr   r   Ú7litellm.types.proxy.management_endpoints.team_endpointsr   r   r   r   r   r   r"   r-   r1   r   r3   r;   rG   rU   rH   Úobjectr\   r^   rd   r0   r�   r{   rƒ   rˆ   rŽ   r   r   r    ú<module>r˜      s1  ðò	ó Û ß .Ý "ß +Ñ +ç )ß 6Ñ 6ç Bõð ;>Ð 0°%Ó =àmð 5°eó ð <^Ð 1°5Ó ]ô!˜Iô !ô% Iô %ô% 9ô %ñ
 3CÀ2Ó2F€��w˜s I˜~Ñ.Ñ/Ó Fôr˜Hô r÷ñ ñ +HÓ*IÐ   %Ó IáYdØ	Ð
! 3Ð
&Ñ'óZÐ ˜u [°Ð7NÐPSÐ7SÑ1TÑ%UÑVó ð
	¨6ð 	°eÐ<SÐUXÐ<XÑ6Yó 	÷ñ ñ (BÓ'CÐ ˜uÓ Cð'
Ø$ð'
à*ð'
ð ð'
ð ð	'
ð
 ð'
ð 
ó'
ðT<¨G°C¸°KÑ,@ð <ÀUó <ð@°¸¸V¸Ñ0Dð @Èó @ð /Oñ!ØÐ)Ñ*ð!à�c˜9�nÑ%¨Ñ,ð!ð ˜s I˜~Ñ.°Ñ5ð!ð �4‰Zð	!ð
 �d‘
ð!ð &ð!ð ,ð!ð 
ô!r   