o
    ưi                      @   s6   d Z ddlmZmZ ddlmZmZ G dd dZdS )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                   @   s   e Zd ZdZdefddZdedee fddZ	d	ee de
fd
dZd	ee de
fddZdefddZdefddZdefddZdefddZdefddZdefddZdee fddZdee fddZdS )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                 C   s   || _ |jpg | _d S )N)r   Zguardrail_information
guardrails)selfr    r
   V/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/compliance_checks.py__init__   s   zComplianceChecker.__init__modereturnc                 C   sL   g }| j D ]}|d}|du r|dkr|| q||kr#|| q|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).
        Zguardrail_modeNpre_call)r   getappend)r	   r   resultgZg_moder
   r
   r   _get_guardrails_by_mode   s   


z)ComplianceChecker._get_guardrails_by_moder   c                 C   s(   |D ]}| dd}|dv r dS qdS )z;Check if any guardrail intervened (blocked/masked content).guardrail_status )Zguardrail_intervenedfailedZblockedTFr   )r	   r   r   statusr
   r
   r   _has_guardrail_intervention0   s   z-ComplianceChecker._has_guardrail_interventionc                 C   s   |sdS t dd |D S )z4Check if all guardrails passed (no issues detected).Fc                 s   s    | ]
}| d dkV  qdS )r   successNr   ).0r   r
   r
   r   	<genexpr><   s    z;ComplianceChecker._all_guardrails_passed.<locals>.<genexpr>)all)r	   r   r
   r
   r   _all_guardrails_passed8   s   z(ComplianceChecker._all_guardrails_passedc                 C   s6   t | jdk}tdd||rt | j ddS ddS )z-Art. 9: Check if any guardrails were applied.r   zGuardrails appliedzArt. 9z guardrail(s) appliedzNo guardrails appliedZ
check_nameZarticleZpasseddetail)lenr   r   )r	   has_guardrailsr
   r
   r   _check_art_9_guardrails_applied@   s   z1ComplianceChecker._check_art_9_guardrails_appliedc                 C   <   |  d}t|dk}tdd||rt| ddS d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   r"   r   r	   pre_call_guardrailsZhas_pre_callr
   r
   r   _check_art_5_content_screenedN      
z/ComplianceChecker._check_art_5_content_screenedc                 C      t | jj}t | jj}t | jj}t| jdk}|o |o |o |}g }|s*|d |s1|d |s8|d |s?|d tdd||rIddS d	d
	| d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.   r"   r   r   r   joinr	   Zhas_userZ	has_modelZhas_timestampr#   Zaudit_completemissingr
   r
   r   _check_art_12_audit_complete]   .   



z.ComplianceChecker._check_art_12_audit_completec                 C   r%   )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    r&   r'   r
   r
   r   _check_art_32_data_protection|   r*   z/ComplianceChecker._check_art_32_data_protectionc                 C   sN   |  d}| |}| |}|p|}|rd}n|rd}nd}td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	   r(   Zhas_interventionZ
all_passedZdata_protectedr!   r
   r
   r   (_check_art_5_1c_sensitive_data_protected   s   


z:ComplianceChecker._check_art_5_1c_sensitive_data_protectedc                 C   r+   )z+Art. 30: Check if audit record is complete.r   r,   r-   r.   r/   r0   zArt. 30r1   r2   r3   r    r4   r7   r
   r
   r   _check_art_30_audit_complete   r:   z.ComplianceChecker._check_art_30_audit_completec                 C      |   |  |  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
        )r$   r)   r9   r	   r
   r
   r   check_eu_ai_act      z!ComplianceChecker.check_eu_ai_actc                 C   r>   )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
        )r;   r<   r=   r?   r
   r
   r   
check_gdpr   rA   zComplianceChecker.check_gdprN)__name__
__module____qualname____doc__r   r   strr   r   r   r5   r   r   r   r$   r)   r9   r;   r<   r=   r@   rB   r
   r
   r
   r   r      s    
r   N)rF   typingr   r   Z(litellm.types.proxy.compliance_endpointsr   r   r   r
   r
   r
   r   <module>   s    