
    AHj                      <    d Z ddlmZ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.
    )DictList)ComplianceCheckRequestComplianceCheckResultc                       e Zd ZdZdefdZdede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     W/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/proxy/compliance_checks.py__init__zComplianceChecker.__init__   s    	44:    modereturnc                     g }| j                   D ]C  }|j                  d      }||dk(  r|j                  |       -||k(  s3|j                  |       E |S )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pre_call)r   getappend)r   r   resultgg_modes        r   _get_guardrails_by_modez)ComplianceChecker._get_guardrails_by_mode   s]      	!AUU+,F~$*"4a 4a 	! 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_intervention0   s3     	AUU-r2F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)r   successNr"   ).0r   s     r   	<genexpr>z;ComplianceChecker._all_guardrails_passed.<locals>.<genexpr><   s     Na155+,	9Ns    )all)r   r   s     r   _all_guardrails_passedz(ComplianceChecker._all_guardrails_passed8   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_applied@   sV    T__-1$+! " t'((=>	
 		
 -	
 		
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 appliedr-   r   r2   r   r   pre_call_guardrailshas_pre_calls      r   _check_art_5_content_screenedz/ComplianceChecker._check_art_5_content_screenedN   sa    ":::F./!3$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: , r-   
boolr	   r<   r=   r>   r2   r   r   r   joinr   has_user	has_modelhas_timestampr3   audit_completemissings          r   _check_art_12_audit_completez.ComplianceChecker._check_art_12_audit_complete]       		))*)	TYY001T__-1!TiTMTnNN9%NN7#NN;'NN./$.! " 4	
 		
 !7!3 45	
 		
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 appliedr-   r6   r7   s      r   _check_art_32_data_protectionz/ComplianceChecker._check_art_32_data_protection|   sa    ":::F./!3$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)r-   )r   r$   r+   r   )r   r8   has_intervention
all_passeddata_protectedr1   s         r   (_check_art_5_1c_sensitive_data_protectedz:ComplianceChecker._check_art_5_1c_sensitive_data_protected   sn    ":::F;;<OP001DE
)7ZEF1FGF$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   r<   r=   r>   r?   r@   zArt. 30rA   rB   rC   r-   rD   rG   s          r   _check_art_30_audit_completez.ComplianceChecker._check_art_30_audit_complete   rN   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
        )r4   r:   rM   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
        )rP   rU   rW   rY   s    r   
check_gdprzComplianceChecker.check_gdpr   s2     ..099;--/
 	
r   N)__name__
__module____qualname____doc__r   r   strr   r   r   rE   r$   r+   r   r4   r:   rM   rP   rU   rW   rZ   r\    r   r   r   r      s    ;3 ;C DJ "d4j T Od O O
1F 

/D 

.C 
>
/D 

:O 
*
.C 
>
&;!< 
 
D!67 
r   r   N)r`   typingr   r   (litellm.types.proxy.compliance_endpointsr   r   r   rb   r   r   <module>re      s     M
 M
r   