Ë
    tPêj‹'  ã                   ó8   — d Z ddlmZ ddlmZmZ  G d„ d«      Zy)zÀ
Compliance checker for EU AI Act and GDPR regulations.

Provides guardrail-agnostic compliance validation based on guardrail modes
and execution results rather than specific guardrail names.
é    )ÚFinal)ÚComplianceCheckRequestÚComplianceCheckResultc                   óè   — e Zd ZdZdefd„Zdedee   fd„Z	e
dededefd„«       Zd	ee   defd
„Zd	ee   defd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdefd„Zdee   fd„Zdee   fd„Zy)ÚComplianceCheckera%  
    Validates compliance with EU AI Act and GDPR regulations.

    Uses guardrail-agnostic checks based on:
    - Whether any guardrails ran
    - Guardrail execution mode (pre-call, post-call, etc.)
    - Whether guardrails intervened/blocked content
    - Completeness of audit records
    Údatac                 ó<   — || _         |j                  xs g | _        y ©N)r   Úguardrail_informationÚ
guardrails)Úselfr   s     úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/compliance_checks.pyÚ__init__zComplianceChecker.__init__   s   € ØˆŒ	Ø×4Ñ4Ò:¸ˆ�ó    ÚmodeÚreturnc                 ó„   — | j                   D �cg c]&  }| j                  |j                  d«      |«      sŒ%|‘Œ( c}S c c}w )z±
        Get all guardrails that ran in a specific mode.

        If a guardrail doesn't have a mode specified, it's treated as pre-call
        (the most common case).
        Úguardrail_mode)r   Ú_mode_matchesÚget)r   r   Úgs      r   Ú_get_guardrails_by_modez)ComplianceChecker._get_guardrails_by_mode   s6   € ð  Ÿ?™?Ö`�a¨d×.@Ñ.@ÀÇÁÐGWÓAXÐZ^Õ._’Ò`Ð`ùÒ`s   �&=¶=Úg_modec                 óÀ  ‡‡— | €‰dk(  S t        | t        «      r| ‰k(  S t        | t        t        f«      r!t	        | «      xr t        ˆfd„| D «       «      S t        | t        «      ry| j                  d«      }|€y| j                  d«      }t        |t        «      rt        |j                  «       «      ng }dt        dt        fˆfd„Št        ˆfd	„|g|¢D «       «      S y)
að  
        Return True only when a guardrail with logged ``guardrail_mode`` of
        ``g_mode`` is guaranteed to have run in ``mode`` for the audited request.

        ``guardrail_mode`` in a spend log can take several shapes because
        ``LitellmParams.mode`` is typed ``Union[str, List[str], Mode]``, and
        when the event type cannot be inferred at write time the raw config is
        logged verbatim. The spend log records the configured mode(s), not the
        concrete hook that fired for a given request; a match reports a mode
        satisfied only when every configured branch runs in that mode, so True
        never claims a hook the guardrail may not have actually executed.

        Fails safe: if the guarantee cannot be established (missing default,
        divergent per-tag override, or a list that runs in more than one mode),
        the guardrail counts for no mode. The precise fix is to log the
        resolved event mode and match on it; this is the safe interim.
        Úpre_callc              3   ó(   •K  — | ]	  }|‰k(  –— Œ y ­wr
   © ©Ú.0Úmr   s     €r   ú	<genexpr>z2ComplianceChecker._mode_matches.<locals>.<genexpr>@   s   øè ø€ Ò'B°a¨¨T­	Ñ'Bùó   ƒÚdefaultFÚtagsÚbranchr   c                 óž   •— t        | t        «      r| ‰k(  S t        | t        t        f«      r!t	        | «      xr t        ˆfd„| D «       «      S y)Nc              3   ó(   •K  — | ]	  }|‰k(  –— Œ y ­wr
   r   r   s     €r   r!   zPComplianceChecker._mode_matches.<locals>._branch_runs_in_mode.<locals>.<genexpr>L   s   øè ø€ Ò/J¸a°°Tµ	Ñ/Jùr"   F)Ú
isinstanceÚstrÚlistÚtupleÚboolÚall)r%   r   s    €r   Ú_branch_runs_in_modez=ComplianceChecker._mode_matches.<locals>._branch_runs_in_modeH   sB   ø€ Ü˜f¤cÔ*Ø! T™>Ð)Ü˜f¤t¬U mÔ4Ü ›<ÒJ¬CÓ/JÀ6Ô/JÓ,JÐJØr   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr
   r   )r   r%   r.   s     €r   r!   z2ComplianceChecker._mode_matches.<locals>.<genexpr>O   s   øè ø€ Ò[¸Ñ+¨F×3Ñ[ùs   ƒ)
r(   r)   r*   r+   r,   r-   Údictr   ÚvaluesÚobject)r   r   r#   r$   Útag_branchesr.   s    `   @r   r   zComplianceChecker._mode_matches(   sÌ   ù€ ð& ˆ>Ø˜:Ñ%Ð%Ü�fœcÔ"Ø˜T‘>Ð!Ü�fœt¤U˜mÔ,Ü˜“<ÒB¤CÓ'B¸6Ô'BÓ$BÐBÜ�fœdÔ#Ø#ŸZ™Z¨	Ó2ˆGØˆØØ Ÿ*™* VÓ,ˆDÜ9CÀDÌ$Ô9O¤$ t§{¡{£}Ô"5ÐUWˆLð¬Vð ¼õ ô Ó[À7ÐBZÈ\ÐBZÔ[Ó[Ð[Ør   r   c                 óB   — |D ]  }|j                  dd«      }|dv sŒ y y)z;Check if any guardrail intervened (blocked/masked content).Úguardrail_statusÚ )Úguardrail_intervenedÚfailedÚblockedTF©r   )r   r   r   Ústatuss       r   Ú_has_guardrail_interventionz-ComplianceChecker._has_guardrail_interventionR   s3   € àò 	ˆAØ—U‘UÐ-¨rÓ2ˆFØÐFÒFÙð	ð r   c                 ó,   — |syt        d„ |D «       «      S )z4Check if all guardrails passed (no issues detected).Fc              3   óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)r5   ÚsuccessNr:   )r   r   s     r   r!   z;ComplianceChecker._all_guardrails_passed.<locals>.<genexpr>^   s   è ø€ ÒN¸a�1—5‘5Ð+Ó,°	Õ9ÑNùs   ‚ )r-   )r   r   s     r   Ú_all_guardrails_passedz(ComplianceChecker._all_guardrails_passedZ   s   € áØÜÑNÀ:ÔNÓNÐNr   c                 óŽ   — t        | j                  «      dkD  }t        dd||rt        | j                  «      › d�¬«      S d¬«      S )z-Art. 9: Check if any guardrails were applied.r   zGuardrails appliedzArt. 9z guardrail(s) appliedzNo guardrails applied©Ú
check_nameÚarticleÚpassedÚdetail)Úlenr   r   )r   Úhas_guardrailss     r   Ú_check_art_9_guardrails_appliedz1ComplianceChecker._check_art_9_guardrails_appliedb   sS   € ä # D§O¡OÓ 4°qÑ 8ˆÜ$Ø+ØØ!ÙFT”s˜4Ÿ?™?Ó+Ð,Ð,AÐBô	
ð 	
ð [rô	
ð 	
r   c                 óˆ   — | j                  d«      }t        |«      dkD  }t        dd||rt        |«      › d�¬«      S d¬«      S )z<Art. 5: Check if content was screened before LLM (pre-call).r   r   zContent screened before LLMzArt. 5z' pre-call guardrail(s) screened contentzNo pre-call screening appliedrB   ©r   rG   r   ©r   Úpre_call_guardrailsÚhas_pre_calls      r   Ú_check_art_5_content_screenedz/ComplianceChecker._check_art_5_content_screenedl   sa   € à%)×%AÑ%AÀ*Ó%MÐÜ!Ð"5Ó6¸Ñ:ˆÜ$Ø4ØØñ  ô Ð*Ó+Ð,Ð,SÐTô	
ð 		
ð 5ô	
ð 		
r   c           	      óø  — t        | j                  j                  «      }t        | j                  j                  «      }t        | j                  j                  «      }t        | j                  «      dkD  }|xr
 |xr |xr |}g }|s|j                  d«       |s|j                  d«       |s|j                  d«       |s|j                  d«       t        dd||rd¬«      S d	d
j                  |«      › �¬«      S )z+Art. 12: Check if audit record is complete.r   Úuser_idÚmodelÚ	timestampÚguardrail_resultsúAudit record completezArt. 12ú!All required audit fields presentú	Missing: ú, rB   ©
r,   r   rQ   rR   rS   rG   r   Úappendr   Újoin©r   Úhas_userÚ	has_modelÚhas_timestamprH   Úaudit_completeÚmissings          r   Ú_check_art_12_audit_completez.ComplianceChecker._check_art_12_audit_complete{   óç   € ä˜tŸy™y×0Ñ0Ó1ˆÜ §	¡	§¡Ó0ˆ	Ü# D§I¡I×$7Ñ$7Ó8ˆÜ # D§O¡OÓ 4°qÑ 8ˆØ (Ò [¨YÒ [¸=Ò [È^ˆàˆÙØ�N‰N˜9Ô%ÙØ�N‰N˜7Ô#ÙØ�N‰N˜;Ô'ÙØ�N‰NÐ.Ô/ä$Ø.ØØ!Ù;IÐ7ô	
ð 	
ð R[Ð[_×[dÑ[dÐelÓ[mÐZnÐOoô	
ð 	
r   c                 óˆ   — | j                  d«      }t        |«      dkD  }t        dd||rt        |«      › d�¬«      S d¬«      S )z9Art. 32: Check if data protection was applied (pre-call).r   r   zData protection appliedzArt. 32z# pre-call guardrail(s) protect dataz#No pre-call data protection appliedrB   rK   rL   s      r   Ú_check_art_32_data_protectionz/ComplianceChecker._check_art_32_data_protection–   sa   € à%)×%AÑ%AÀ*Ó%MÐÜ!Ð"5Ó6¸Ñ:ˆÜ$Ø0ØØñ  ô Ð*Ó+Ð,Ð,OÐPô	
ð 		
ð ;ô	
ð 		
r   c                 óª   — | j                  d«      }| j                  |«      }| j                  |«      }|xs |}|rd}n|rd}nd}t        dd||¬«      S )z4Art. 5(1)(c): Check if sensitive data was protected.r   z.Guardrail intervened to protect sensitive datazNo sensitive data detectedz0No pre-call guardrails to protect sensitive datazSensitive data protectedzArt. 5(1)(c)rB   )r   r<   r@   r   )r   rM   Úhas_interventionÚ
all_passedÚdata_protectedrF   s         r   Ú(_check_art_5_1c_sensitive_data_protectedz:ComplianceChecker._check_art_5_1c_sensitive_data_protected¥   sn   € à%)×%AÑ%AÀ*Ó%MÐØ"&×"BÑ"BÐCVÓ"WÐØ ×7Ñ7Ð8KÓLˆ
Ø 0Ò >°JˆáØE‰FÙØ1‰FàGˆFä$Ø1Ø"Ø!Øô	
ð 	
r   c           	      óø  — t        | j                  j                  «      }t        | j                  j                  «      }t        | j                  j                  «      }t        | j                  «      dkD  }|xr
 |xr |xr |}g }|s|j                  d«       |s|j                  d«       |s|j                  d«       |s|j                  d«       t        dd||rd¬«      S d	d
j                  |«      › �¬«      S )z+Art. 30: Check if audit record is complete.r   rQ   rR   rS   rT   rU   zArt. 30rV   rW   rX   rB   rY   r\   s          r   Ú_check_art_30_audit_completez.ComplianceChecker._check_art_30_audit_completeº   rc   r   c                 ó`   — | j                  «       | j                  «       | j                  «       gS )a  
        Check EU AI Act compliance.

        Returns:
            List of compliance check results for:
            - Art. 9: Guardrails applied
            - Art. 5: Content screened before LLM (pre-call screening)
            - Art. 12: Audit record complete
        )rI   rO   rb   ©r   s    r   Úcheck_eu_ai_actz!ComplianceChecker.check_eu_ai_actÕ   s2   € ð ×0Ñ0Ó2Ø×.Ñ.Ó0Ø×-Ñ-Ó/ð
ð 	
r   c                 ó`   — | j                  «       | j                  «       | j                  «       gS )a  
        Check GDPR compliance.

        Returns:
            List of compliance check results for:
            - Art. 32: Data protection applied (pre-call screening)
            - Art. 5(1)(c): Sensitive data protected
            - Art. 30: Audit record complete
        )re   rj   rl   rn   s    r   Ú
check_gdprzComplianceChecker.check_gdprå   s2   € ð ×.Ñ.Ó0Ø×9Ñ9Ó;Ø×-Ñ-Ó/ð
ð 	
r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r)   r*   r0   r   Ústaticmethodr2   r,   r   r<   r@   r   rI   rO   rb   re   rj   rl   ro   rq   r   r   r   r   r      sû   „ ñð;Ð3ó ;ða¨Cð a°D¸±Jó að ð'˜fð '¨Cð '°Dò 'ó ð'ðR°d¸4±jð ÀTó ðO°°d±ð OÀó Oð
Ð1Fó 
ð
Ð/Dó 
ð
Ð.Có 
ð6
Ð/Dó 
ð
Ð:Oó 
ð*
Ð.Có 
ð6
 Ð&;Ñ!<ó 
ð 
˜DÐ!6Ñ7ô 
r   r   N)ru   Útypingr   Ú(litellm.types.proxy.compliance_endpointsr   r   r   r   r   r   ú<module>ry      s    ðñõ ÷÷c
ò c
r   