Ë
    uPêjìz  ã                   ó6  — U d Z ddlmZ ddl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 dd
lmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"  e«       Z#ee$d<   de%dedefd„Z&de'dedefd„Z(e#jS                  ddg ee«      ge¬«      d:de%dz  fd„«       Z*e#jW                  ddg ee«      ge¬«       ee«      fdede
fd„«       Z,e#jS                  ddg ee«      ge!¬«      de%fd„«       Z-e#jW                  ddg ee«      ge¬«       ee«      fde%de de
fd„«       Z.e#j_                  d dg ee«      ge¬«       ee«      fd!e%de"de
fd"„«       Z0e#jS                  d#dg ee«      ge¬«      d$e%d%e%fd&„«       Z1e#je                  d'dg ee«      g¬(«      de%fd)„«       Z3e#jS                  d*dg ee«      ge¬«      d!e%fd+„«       Z4e#j_                  d*dg ee«      ge¬«       ee«      fd!e%dede
fd,„«       Z5e#je                  d*dg ee«      g¬(«      d!e%fd-„«       Z6e#jS                  d.dg ee«      g¬(«      d!e%fd/„«       Z7e#jW                  d0dg ee«      g¬(«       ee«      fdede
fd1„«       Z8e#jS                  d2dg ee«      ge¬«      d3„ «       Z9e#jW                  d4dg ee«      ge¬«       ee«      fdede
fd5„«       Z:e#jS                  d6dg ee«      ge¬«      d7e%fd8„«       Z;e#je                  d6dg ee«      g¬(«      d7e%fd9„«       Z<y);zh
CRUD ENDPOINTS FOR POLICIES

Provides REST API endpoints for managing policies and policy attachments.
é    )ÚFinal)Ú	APIRouterÚDependsÚHTTPException)Úverbose_proxy_logger)ÚUserAPIKeyAuth)Úuser_api_key_auth)Úget_attachment_registry)ÚPipelineExecutor)Úget_policy_registry)ÚGuardrailPipelineÚPipelineTestRequestÚPolicyÚPolicyAttachmentÚPolicyAttachmentCreateRequestÚPolicyAttachmentDBResponseÚPolicyAttachmentListResponseÚPolicyCreateRequestÚPolicyDBResponseÚPolicyListDBResponseÚPolicyUpdateRequestÚPolicyVersionCompareResponseÚPolicyVersionCreateRequestÚPolicyVersionListResponseÚ PolicyVersionStatusUpdateRequestÚrouterÚpolicy_nameÚpolicyÚreturnc                 óZ  — t        | | dd|j                  |j                  |j                  j	                  «       |j                  j                  «       |j                  r|j                  j                  «       nd |j                  r |j                  j                  «       d¬«      S d d¬«      S )Né   Ú
productionÚconfig)Ú	policy_idr   Úversion_numberÚversion_statusÚinheritÚdescriptionÚguardrails_addÚguardrails_removeÚ	conditionÚpipelineÚdefinition_location)	r   r'   r(   Ú
guardrailsÚget_addÚ
get_remover+   Ú
model_dumpr,   )r   r   s     úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/policy_engine/policy_endpoints.pyÚ_config_policy_to_db_responser3   &   s˜   € ÜØØØØ#Ø—‘Ø×&Ñ&Ø×(Ñ(×0Ñ0Ó2Ø ×+Ñ+×6Ñ6Ó8Ø39×3CÒ3C�&×"Ñ"×-Ñ-Ô/ÈØ17·²�—‘×+Ñ+Ó-Ø$ôð ð GKØ$ôð ó    ÚindexÚ
attachmentc           
      óÆ   — t        d| › �|j                  |j                  |j                  xs g |j                  xs g |j
                  xs g |j                  xs g d¬«      S )Nzconfig-r#   )Úattachment_idr   ÚscopeÚteamsÚkeysÚmodelsÚtagsr-   )r   r   r9   r:   r;   r<   r=   )r5   r6   s     r2   Ú!_config_attachment_to_db_responser>   6   sb   € Ü%Ø ˜wÐ'Ø×%Ñ%Ø×ÑØ×ÑÒ$ "Ø�_‰_Ò" Ø× Ñ Ò& BØ�_‰_Ò" Ø$ô	ð 	r4   z/policies/listÚPolicies)r=   ÚdependenciesÚresponse_modelNr&   c              ƒ   ó  K  — ddl m} 	 t        «       }|�|j                  || ¬«      ƒ d{  –—† ng }|D �ch c]  }|j                  dk(  sŒ|j
                  ’Œ  }}| dv }|r?|j                  «       j                  «       D ��cg c]  \  }}||vrt        ||«      ‘Œ c}}ng }	||	z   }
t        |
t        |
«      ¬«      S 7 Œ‘c c}w c c}}w # t        $ r1}t        j                  d|«       t        d	t        |«      ¬
«      ‚d}~ww xY w­w)aL  
    List all policies from the database and config.yaml. Optionally filter by version_status.

    Config-defined policies are returned with definition_location "config" and are treated
    as production versions. On a name conflict with a production DB policy, only the DB policy
    is returned, mirroring runtime resolution where only production DB versions override config.
    A draft or published DB version does not hide the config policy, since the config version
    is still the one being enforced.

    Query params:
    - version_status: Optional. One of "draft", "published", "production".
      If omitted, all versions are returned.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/policies/list" \
        -H "Authorization: Bearer <your_api_key>"
    curl -X GET "http://localhost:4000/policies/list?version_status=production" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "policies": [
            {
                "policy_id": "123e4567-e89b-12d3-a456-426614174000",
                "policy_name": "global-baseline",
                "version_number": 1,
                "version_status": "production",
                "inherit": null,
                "description": "Base guardrails for all requests",
                "guardrails_add": ["pii_masking"],
                "guardrails_remove": [],
                "condition": null,
                "created_at": "2024-01-01T00:00:00Z",
                "updated_at": "2024-01-01T00:00:00Z"
            }
        ],
        "total_count": 1
    }
    ```
    r   ©Úprisma_clientN©r&   r"   )Nr"   )ÚpoliciesÚtotal_countzError listing policies: %séô  ©Ústatus_codeÚdetail)Úlitellm.proxy.proxy_serverrD   r   Úget_all_policies_from_dbr&   r   Úlist_config_policiesÚitemsr3   r   ÚlenÚ	Exceptionr   Ú	exceptionr   Ústr)r&   rD   ÚregistryÚdb_policiesÚ	db_policyÚdb_policy_namesÚinclude_configr   r   Úconfig_policiesrF   Úes               r2   Úlist_policiesr[   H   s.  è ø€ õd 9ð<Ü-Ó/ˆð Ð(ð ×3Ñ3°MÐR`Ð3Óa×aÐaàð 	ð 4?ö"
Ø&/À)×BZÑBZÐ^jÓBjˆI×!Ó!ð"
ˆð "
ð !/Ð2FÐ Fˆñ ð ,4×+HÑ+HÓ+J×+PÑ+PÓ+R÷á'�K Ø oÑ5ô .¨k¸6ÕBôð ð 	ð &¨Ñ7ˆÜ#¨XÄ3ÀxÃ=ÔQÐQð% búò"
ùó
øô ò <Ü×&Ñ&Ð'CÀQÔGÜ¨´C¸³FÔ;Ð;ûð<üs[   ‚DŠ"C ¬B>­
C ·C ÁC Á)C ÂCÂ C Â=DÂ>C Ã C Ã	DÃ,D Ä DÄDz	/policiesÚrequestÚuser_api_key_dictc              ƒ   ó„  K  — ddl m} |€t        dd¬«      ‚	 |j                  }t	        «       j                  | ||¬«      ƒ d{  –—† }|S 7 Œ# t        $ rg}t        j                  d|«       d	t        |«      j                  «       v rt        d
d| j                  › d�¬«      ‚t        dt        |«      ¬«      ‚d}~ww xY w­w)a“  
    Create a new policy.

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/policies" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "policy_name": "global-baseline",
            "description": "Base guardrails for all requests",
            "guardrails_add": ["pii_masking", "prompt_injection"],
            "guardrails_remove": []
        }'
    ```

    Example Response:
    ```json
    {
        "policy_id": "123e4567-e89b-12d3-a456-426614174000",
        "policy_name": "global-baseline",
        "inherit": null,
        "description": "Base guardrails for all requests",
        "guardrails_add": ["pii_masking", "prompt_injection"],
        "guardrails_remove": [],
        "condition": null,
        "created_at": "2024-01-01T00:00:00Z",
        "updated_at": "2024-01-01T00:00:00Z"
    }
    ```
    r   rC   NrH   úDatabase not connectedrI   )Úpolicy_requestrD   Ú
created_byzError creating policy: %szunique constrainté�  zPolicy with name 'z' already exists)rL   rD   r   Úuser_idr   Úadd_policy_to_dbrQ   r   rR   rS   Úlowerr   )r\   r]   rD   ra   ÚresultrZ   s         r2   Úcreate_policyrg   —   sÎ   è ø€ õR 9àÐÜ¨Ð4LÔMÐMð<Ø-×5Ñ5ˆ
Ü1Ó3×DÑDØ"Ø'Ø!ð Eó 
÷ 
ˆð
 ˆð
ùô ò <Ü×&Ñ&Ð'BÀAÔFØ¤# a£&§,¡,£.Ñ0ÜØØ+¨G×,?Ñ,?Ð+@Ð@PÐQôð ô ¨´C¸³FÔ;Ð;ûð<üs;   ‚C ™+A ÁAÁA Á
C ÁA Á	B=ÁA"B8Â8B=Â=C z%/policies/name/{policy_name}/versionsc              ƒ   óú   K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† S 7 Œ# t
        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)	zV
    List all versions of a policy by name, ordered by version_number descending.
    r   rC   NrH   r_   rI   ©r   rD   z!Error listing policy versions: %s)	rL   rD   r   r   Úget_versions_by_policy_namerQ   r   rR   rS   ©r   rD   rZ   s      r2   Úlist_policy_versionsrl   Ü   sƒ   è ø€ õ 9àÐÜ¨Ð4LÔMÐMð<Ü(Ó*×FÑFØ#Ø'ð Gó 
÷ 
ð 	
ð 
ùô ò <Ü×&Ñ&Ð'JÈAÔNÜ¨´C¸³FÔ;Ð;ûð<üó1   ‚A;™> ·<¸> »A;¼> ¾	A8Á,A3Á3A8Á8A;c              ƒ   óÂ  K  — ddl m} |€t        dd¬«      ‚	 |j                  }t	        «       j                  | ||j                  |¬«      ƒ d{  –—† S 7 Œ# t        $ r}}t        j                  d|«       d	t        |«      j                  «       v sd
t        |«      j                  «       v rt        dt        |«      ¬«      ‚t        dt        |«      ¬«      ‚d}~ww xY w­w)zš
    Create a new draft version of a policy. Copies all fields from the source.
    Source is current production if source_policy_id is not provided.
    r   rC   NrH   r_   rI   )r   rD   Úsource_policy_idra   z!Error creating policy version: %sú	not foundzno productioné”  )rL   rD   r   rc   r   Úcreate_new_versionro   rQ   r   rR   rS   re   )r   r\   r]   rD   ra   rZ   s         r2   Úcreate_policy_versionrs   õ   sÍ   è ø€ õ 9àÐÜ¨Ð4LÔMÐMð<Ø-×5Ñ5ˆ
Ü(Ó*×=Ñ=Ø#Ø'Ø$×5Ñ5Ø!ð	 >ó 
÷ 
ð 	
ð 
ùô ò <Ü×&Ñ&Ð'JÈAÔNØœ#˜a›&Ÿ,™,›.Ñ(¨O¼sÀ1»v¿|¹|»~Ñ,MÜ¨C¼¸A»Ô?Ð?Ü¨´C¸³FÔ;Ð;ûð	<üs;   ‚C™6A ÁAÁA ÁCÁA Á	CÁA8CÃCÃCz/policies/{policy_id}/statusr$   c              ƒ   ól  K  — ddl m} |€t        dd¬«      ‚	 |j                  }t	        «       j                  | |j                  ||¬«      ƒ d{  –—† S 7 Œ# t        $ r ‚ t        $ rÉ}t        j                  d|«       d	t        |«      j                  «       v s6d
t        |«      j                  «       v sdt        |«      j                  «       v rt        dt        |«      ¬«      ‚dt        |«      j                  «       v rt        dt        |«      ¬«      ‚t        dt        |«      ¬«      ‚d}~ww xY w­w)zà
    Update a policy version's status. Valid transitions:
    - draft -> published
    - published -> production (demotes current production to published)
    - production -> published (demotes, policy becomes inactive)
    r   rC   NrH   r_   rI   )r$   Ú
new_statusrD   Ú
updated_byz!Error updating version status: %szinvalid statusz
only draftzcannot promoterb   rp   rq   )rL   rD   r   rc   r   Úupdate_version_statusr&   rQ   r   rR   rS   re   )r$   r\   r]   rD   rv   rZ   s         r2   Úupdate_policy_version_statusrx     s  è ø€ õ" 9àÐÜ¨Ð4LÔMÐMð<Ø-×5Ñ5ˆ
Ü(Ó*×@Ñ@ØØ×-Ñ-Ø'Ø!ð	 Aó 
÷ 
ð 	
ð 
ùô ò ØÜò <Ü×&Ñ&Ð'JÈAÔNØœs 1›vŸ|™|›~Ñ-°ÄÀQÃÇÁÃÑ1OÐScÔgjÐklÓgm×gsÑgsÓguÑSuÜ¨C¼¸A»Ô?Ð?Øœ#˜a›&Ÿ,™,›.Ñ(Ü¨C¼¸A»Ô?Ð?Ü¨´C¸³FÔ;Ð;ûð<üs;   ‚D4™6A ÁAÁA ÁD4ÁA ÁD1Á(CD,Ä,D1Ä1D4z/policies/compareÚ	version_aÚ	version_bc              ƒ   ó^  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | ||¬«      ƒ d{  –—† S 7 Œ# t
        $ rb}t        j                  d|«       d	t        |«      j                  «       v rt        d
t        |«      ¬«      ‚t        dt        |«      ¬«      ‚d}~ww xY w­w)z_
    Compare two policy versions. Query params: version_a, version_b (policy version IDs).
    r   rC   NrH   r_   rI   )Úpolicy_id_aÚpolicy_id_brD   zError comparing versions: %srp   rq   )
rL   rD   r   r   Úcompare_versionsrQ   r   rR   rS   re   )ry   rz   rD   rZ   s       r2   Úcompare_policy_versionsr   A  s¨   è ø€ õ 9àÐÜ¨Ð4LÔMÐMð
<Ü(Ó*×;Ñ;Ø!Ø!Ø'ð <ó 
÷ 
ð 	
ð 
ùô
 ò <Ü×&Ñ&Ð'EÀqÔIØœ#˜a›&Ÿ,™,›.Ñ(Ü¨C¼¸A»Ô?Ð?Ü¨´C¸³FÔ;Ð;ûð	<üs2   ‚B-™? ¸=¹? ¼B-½? ¿	B*ÁAB%Â%B*Â*B-z)/policies/name/{policy_name}/all-versions)r=   r@   c              ƒ   óú   K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† S 7 Œ# t
        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)	zP
    Delete all versions of a policy. Also removes from in-memory registry.
    r   rC   NrH   r_   rI   ri   zError deleting all versions: %s)	rL   rD   r   r   Údelete_all_versionsrQ   r   rR   rS   rk   s      r2   Údelete_all_policy_versionsr‚   `  s‚   è ø€ õ 9àÐÜ¨Ð4LÔMÐMð<Ü(Ó*×>Ñ>Ø#Ø'ð ?ó 
÷ 
ð 	
ð 
ùô ò <Ü×&Ñ&Ð'HÈ!ÔLÜ¨´C¸³FÔ;Ð;ûð<ürm   z/policies/{policy_id}c              ƒ   ó6  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚|S 7 Œ# t        $ r ‚ t
        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)zÑ
    Get a policy by ID.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/policies/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>"
    ```
    r   rC   NrH   r_   rI   ©r$   rD   rq   úPolicy with ID ú
 not foundzError getting policy: %s)	rL   rD   r   r   Úget_policy_by_id_from_dbrQ   r   rR   rS   )r$   rD   rf   rZ   s       r2   Ú
get_policyrˆ   }  s®   è ø€ õ  9àÐÜ¨Ð4LÔMÐMð<Ü1Ó3×LÑLØØ'ð Mó 
÷ 
ˆð ˆ>Ü¨C¸/È)ÈÐT^Ð8_Ô`Ð`Øˆð
ùô ò ØÜò <Ü×&Ñ&Ð'AÀ1ÔEÜ¨´C¸³FÔ;Ð;ûð<üó8   ‚B™A ·A¸A ÁBÁA ÁBÁ%,BÂBÂBc              ƒ   óÖ  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚t        |dd«      dk7  rt        dd¬«      ‚|j                  }t        «       j                  | |||¬«      ƒ d{  –—† }|S 7 Œg7 Œ# t        $ r ‚ t        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)a”  
    Update an existing policy.

    Example Request:
    ```bash
    curl -X PUT "http://localhost:4000/policies/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "description": "Updated description",
            "guardrails_add": ["pii_masking", "toxicity_filter"]
        }'
    ```
    r   rC   NrH   r_   rI   r„   rq   r…   r†   r&   r"   Údraftrb   zcOnly draft versions can be updated. Publish or create a new version to change published/production.)r$   r`   rD   rv   zError updating policy: %s)rL   rD   r   r   r‡   Úgetattrrc   Úupdate_policy_in_dbrQ   r   rR   rS   )r$   r\   r]   rD   Úexistingrv   rf   rZ   s           r2   Úupdate_policyr�   ¡  s  è ø€ õ2 9àÐÜ¨Ð4LÔMÐMð<ä 3Ó 5× NÑ NØØ'ð !Oó !
÷ 
ˆð ÐÜ¨C¸/È)ÈÐT^Ð8_Ô`Ð`Ü�8Ð-¨|Ó<ÀÒGÜØØ|ôð ð
 .×5Ñ5ˆ
Ü1Ó3×GÑGØØ"Ø'Ø!ð	 Hó 
÷ 
ˆð ˆð'
øð
ùô ò ØÜò <Ü×&Ñ&Ð'BÀAÔFÜ¨´C¸³FÔ;Ð;ûð<üsK   ‚C)™B# ·B¸A B# ÂB!ÂB# ÂC)ÂB# Â!B# Â#C&Â5,C!Ã!C&Ã&C)c              ƒ   ó€  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚t        «       j                  | |¬«      ƒ d{  –—† }|S 7 Œ<7 Œ# t        $ r ‚ t        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)a^  
    Delete a policy.

    Example Request:
    ```bash
    curl -X DELETE "http://localhost:4000/policies/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "message": "Policy 123e4567-e89b-12d3-a456-426614174000 deleted successfully"
    }
    ```
    r   rC   NrH   r_   rI   r„   rq   r…   r†   zError deleting policy: %s)
rL   rD   r   r   r‡   Údelete_policy_from_dbrQ   r   rR   rS   )r$   rD   rŽ   rf   rZ   s        r2   Údelete_policyr’   Ü  sÛ   è ø€ õ, 9àÐÜ¨Ð4LÔMÐMð<ä 3Ó 5× NÑ NØØ'ð !Oó !
÷ 
ˆð ÐÜ¨C¸/È)ÈÐT^Ð8_Ô`Ð`ä1Ó3×IÑIØØ'ð Jó 
÷ 
ˆð
 ˆð
øð
ùô ò ØÜò <Ü×&Ñ&Ð'BÀAÔFÜ¨´C¸³FÔ;Ð;ûð<üóJ   ‚B>™A8 ·A4¸5A8 Á-A6Á.A8 Á3B>Á4A8 Á6A8 Á8B;Â
,B6Â6B;Â;B>z)/policies/{policy_id}/resolved-guardrailsc              ƒ   ó  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚t        «       j                  |j                  |¬«      ƒ d{  –—† }|j                  |j                  |dœS 7 Œ^7 Œ # t        $ r ‚ t        $ r}t        dt        |«      ¬«      ‚d}~wt        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)a   
    Get the resolved guardrails for a policy (including inherited guardrails).

    This endpoint resolves the full inheritance chain and returns the final
    set of guardrails that would be applied for this policy.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/policies/123e4567-e89b-12d3-a456-426614174000/resolved-guardrails" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "policy_id": "123e4567-e89b-12d3-a456-426614174000",
        "policy_name": "healthcare-compliance",
        "resolved_guardrails": ["pii_masking", "prompt_injection", "toxicity_filter"]
    }
    ```
    r   rC   NrH   r_   rI   r„   rq   r…   r†   ri   )r$   r   Úresolved_guardrailsrb   zError resolving guardrails: %s)rL   rD   r   r   r‡   Úresolve_guardrails_from_dbr   r$   Ú
ValueErrorrS   rQ   r   rR   )r$   rD   r   ÚresolvedrZ   s        r2   Úget_resolved_guardrailsr™     s  è ø€ õ6 9àÐÜ¨Ð4LÔMÐMð<ä1Ó3×LÑLØØ'ð Mó 
÷ 
ˆð ˆ>Ü¨C¸/È)ÈÐT^Ð8_Ô`Ð`ô !4Ó 5× PÑ PØ×*Ñ*Ø'ð !Qó !
÷ 
ˆð  ×)Ñ)Ø!×-Ñ-Ø#+ñ
ð 	
ð
øð
ùô ò ØÜò <Ü¨´C¸³FÔ;Ð;ûÜò <Ü×&Ñ&Ð'GÈÔKÜ¨´C¸³FÔ;Ð;ûð<üsV   ‚D™B ·B¸?B Á7BÁ8B ÂDÂB ÂB ÂC?Â,CÃC?Ã,C:Ã:C?Ã?Dz/policies/test-pipelinec              ƒ   ó¦  K  — 	 t        di | j                  ¤Ž}| j                  di dœ}	 t        j                  |j                  |j                  ||dd¬	«      ƒ d{  –—† }|j                  «       S # t        $ r}t        dd|› �¬«      ‚d}~ww xY w7 Œ5# t        $ r1}t        j                  d
|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)a   
    Test a guardrail pipeline with sample messages.

    Executes the pipeline steps against the provided test messages and returns
    step-by-step results showing which guardrails passed/failed, actions taken,
    and timing information.

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/policies/test-pipeline" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "pipeline": {
                "mode": "pre_call",
                "steps": [
                    {"guardrail": "pii-guard", "on_pass": "next", "on_fail": "block"}
                ]
            },
            "test_messages": [{"role": "user", "content": "My SSN is 123-45-6789"}]
        }'
    ```
    rb   zInvalid pipeline: rI   NÚtest)ÚmessagesÚmodelÚmetadataÚ
completionztest-pipeline)ÚstepsÚmodeÚdatar]   Ú	call_typer   zError testing pipeline: %srH   © )r   r,   rQ   r   Útest_messagesr   Úexecute_stepsr    r¡   r1   r   rR   rS   )r\   r]   Úvalidated_pipelinerZ   r¢   rf   s         r2   Útest_pipeliner¨   O  sã   è ø€ ð@NÜ$5Ñ$I¸×8HÑ8HÑ$IÐð
 ×)Ñ)ØØñ€Dð<Ü.×<Ñ<Ø$×*Ñ*Ø#×(Ñ(ØØ/Ø"Ø'ô
÷ 
ˆð × Ñ Ó"Ð"øô% ò NÜ¨Ð6HÈÈÐ4LÔMÐMûðNúð
ùô ò <Ü×&Ñ&Ð'CÀQÔGÜ¨´C¸³FÔ;Ð;ûð<üs\   ‚C„A1 ™Cª2B ÁBÁB Á0CÁ1	BÁ:B
Â
BÂCÂB Â	CÂ,C	Ã	CÃCz/policies/attachments/listc               ƒ   ó�  K  — ddl m}  	 t        «       }| �|j                  | «      ƒ d{  –—† ng }t	        |j                  «       «      D ��cg c]  \  }}t        ||«      ‘Œ }}}||z   }t        |t        |«      ¬«      S 7 ŒVc c}}w # t        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)aX  
    List all policy attachments from the database and config.yaml.

    Config-defined attachments are returned with definition_location "config" and a
    synthetic attachment_id ("config-<index>").

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/policies/attachments/list" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "attachments": [
            {
                "attachment_id": "123e4567-e89b-12d3-a456-426614174000",
                "policy_name": "global-baseline",
                "scope": "*",
                "teams": [],
                "keys": [],
                "models": [],
                "created_at": "2024-01-01T00:00:00Z",
                "updated_at": "2024-01-01T00:00:00Z"
            }
        ],
        "total_count": 1
    }
    ```
    r   rC   N)ÚattachmentsrG   z$Error listing policy attachments: %srH   rI   )rL   rD   r
   Úget_all_attachments_from_dbÚ	enumerateÚget_config_attachmentsr>   r   rP   rQ   r   rR   r   rS   )rD   rT   Údb_attachmentsr5   r6   Úconfig_attachmentsrª   rZ   s           r2   Úlist_policy_attachmentsr°   Ž  sÏ   è ø€ õL 9ð<Ü1Ó3ˆØVcÐVo˜x×CÑCÀMÓR×RÐRÐuwˆô &/¨x×/NÑ/NÓ/PÓ%Q÷%
á!��zô .¨e°ZÕ@ð%
Ðñ %
ð ,Ð.@Ñ@ˆÜ+¸ÔQTÐU`ÓQaÔbÐbð Súó%
øô ò <Ü×&Ñ&Ð'MÈqÔQÜ¨´C¸³FÔ;Ð;ûð<üsJ   ‚CŠ B	 ªB«"B	 ÁBÁ#B	 Â CÂB	 ÂB	 Â		CÂ,B>Â>CÃCz/policies/attachmentsc              ƒ   óú  K  — ddl m} ddlm}m} |€t        dd¬«      ‚	 t        «       j                  |d¬	«      ƒ d{  –—† }|D �ch c]  }|j                  ’Œ }}| j                  |vrt        d
d| j                  › d�¬«      ‚ |||¬«      j                  | j                  | j                  | j                  | j                  ¬«      ƒ d{  –—† }|r#t        ddj                  d„ |D «       «      ¬«      ‚|j                  }	t        «       j!                  | ||	¬«      ƒ d{  –—† }
|
S 7 Œêc c}w 7 Œb7 Œ# t
        $ r ‚ t"        $ r1}t%        j&                  d|«       t        dt)        |«      ¬«      ‚d}~ww xY w­w)a  
    Create a new policy attachment.

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/policies/attachments" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "policy_name": "global-baseline",
            "scope": "*"
        }'
    ```

    Example with team-specific attachment:
    ```bash
    curl -X POST "http://localhost:4000/policies/attachments" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "policy_name": "healthcare-compliance",
            "teams": ["healthcare-team", "medical-research"]
        }'
    ```

    Example Response:
    ```json
    {
        "attachment_id": "123e4567-e89b-12d3-a456-426614174000",
        "policy_name": "global-baseline",
        "scope": "*",
        "teams": [],
        "keys": [],
        "models": [],
        "created_at": "2024-01-01T00:00:00Z",
        "updated_at": "2024-01-01T00:00:00Z"
    }
    ```
    r   )ÚPolicyValidator)Ú
llm_routerrD   NrH   r_   rI   r"   rE   rq   zPolicy 'z%' not found. Create the policy first.)rD   r³   )r   r:   r;   r<   rb   z | c              3   ó4   K  — | ]  }|j                   –— Œ y ­w©N)Úmessage)Ú.0rZ   s     r2   ú	<genexpr>z+create_policy_attachment.<locals>.<genexpr>  s   è ø€ ÒBcÐQRÀ1Ç9Å9ÑBcùs   ‚)Úattachment_requestrD   ra   z$Error creating policy attachment: %s)Ú,litellm.proxy.policy_engine.policy_validatorr²   rL   r³   rD   r   r   rM   r   Úfind_invalid_scope_entriesr:   r;   r<   Újoinrc   r
   Úadd_attachment_to_dbrQ   r   rR   rS   )r\   r]   r²   r³   rD   rF   ÚpÚpolicy_namesÚscope_errorsra   rf   rZ   s               r2   Úcreate_policy_attachmentrÁ   Ä  s  è ø€ õb MßDàÐÜ¨Ð4LÔMÐMð"<ä,Ó.×GÑGÈÐfrÐGÓs×sˆØ6>Ö?°˜qŸ}›}Ð?ˆÐ?Ø×Ñ lÑ2ÜØØ! '×"5Ñ"5Ð!6Ð6[Ð\ôð ñ %4Ø'°Jô%
ç
$Ñ
$Ø×+Ñ+Ø—-‘-Ø—‘Ø—>‘>ð	 %ó 
÷
ˆñ Ü¨C¸¿
¹
ÑBcÐVbÔBcÓ8cÔdÐdà-×5Ñ5ˆ
Ü5Ó7×LÑLØ&Ø'Ø!ð Mó 
÷ 
ˆð
 ˆð7 túÚ?ð
øð
ùô ò ØÜò <Ü×&Ñ&Ð'MÈqÔQÜ¨´C¸³FÔ;Ð;ûð<üsk   ‚E;¡D5 ¿D*Á D5 ÁD,ÁA3D5 ÃD1ÃAD5 Ä#D3Ä$D5 Ä)E;Ä*D5 Ä,D5 Ä3D5 Ä5E8Å,E3Å3E8Å8E;z%/policies/attachments/{attachment_id}r8   c              ƒ   ó6  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚|S 7 Œ# t        $ r ‚ t
        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)zè
    Get a policy attachment by ID.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/policies/attachments/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>"
    ```
    r   rC   NrH   r_   rI   ©r8   rD   rq   úAttachment with ID r†   z#Error getting policy attachment: %s)	rL   rD   r   r
   Úget_attachment_by_id_from_dbrQ   r   rR   rS   )r8   rD   rf   rZ   s       r2   Úget_policy_attachmentrÆ      sµ   è ø€ õ  9àÐÜ¨Ð4LÔMÐMð<Ü5Ó7×TÑTØ'Ø'ð Uó 
÷ 
ˆð ˆ>ÜØØ,¨]¨O¸:ÐFôð ð ˆð
ùô ò ØÜò <Ü×&Ñ&Ð'LÈaÔPÜ¨´C¸³FÔ;Ð;ûð<ür‰   c              ƒ   ó€  K  — ddl m} |€t        dd¬«      ‚	 t        «       j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚t        «       j                  | |¬«      ƒ d{  –—† }|S 7 Œ<7 Œ# t        $ r ‚ t        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)ay  
    Delete a policy attachment.

    Example Request:
    ```bash
    curl -X DELETE "http://localhost:4000/policies/attachments/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "message": "Attachment 123e4567-e89b-12d3-a456-426614174000 deleted successfully"
    }
    ```
    r   rC   NrH   r_   rI   rÃ   rq   rÄ   r†   z$Error deleting policy attachment: %s)
rL   rD   r   r
   rÅ   Údelete_attachment_from_dbrQ   r   rR   rS   )r8   rD   rŽ   rf   rZ   s        r2   Údelete_policy_attachmentrÉ   G  sâ   è ø€ õ, 9àÐÜ¨Ð4LÔMÐMð<ä 7Ó 9× VÑ VØ'Ø'ð !Wó !
÷ 
ˆð ÐÜØØ,¨]¨O¸:ÐFôð ô
 6Ó7×QÑQØ'Ø'ð Ró 
÷ 
ˆð ˆð
øð
ùô
 ò ØÜò <Ü×&Ñ&Ð'MÈqÔQÜ¨´C¸³FÔ;Ð;ûð<ür“   rµ   )=Ú__doc__Útypingr   Úfastapir   r   r   Úlitellm._loggingr   Úlitellm.proxy._typesr   Ú$litellm.proxy.auth.user_api_key_authr	   Ú/litellm.proxy.policy_engine.attachment_registryr
   Ú-litellm.proxy.policy_engine.pipeline_executorr   Ú+litellm.proxy.policy_engine.policy_registryr   Ú!litellm.types.proxy.policy_enginer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__annotations__rS   r3   Úintr>   Úgetr[   Úpostrg   rl   rs   Úputrx   r   Údeleter‚   rˆ   r�   r’   r™   r¨   r°   rÁ   rÆ   rÉ   r¤   r4   r2   ú<module>rÚ      s#  ðòõ ç 5Ñ 5å 1Ý /Ý BÝ SÝ JÝ K÷÷ ÷ ÷ ñ ñ$ “€ˆÓ ð¨sð ¸Fð ÐGWó ð 
¨Sð 
Ð>Nð 
ÐSmó 
ð$ ‡�ØØ
ˆÙÐ+Ó,Ð-Ø'ð	 ó ñF<¨¨d©
ò F<óðF<ðR ‡�ØØ
ˆÙÐ+Ó,Ð-Ø#ð	 ó ñ )0Ð0AÓ(Bñ7<Ø ð7<à%ò7<óð7<ð~ ‡�Ø+Ø
ˆÙÐ+Ó,Ð-Ø,ð	 ó ð<¨Cò <óð<ð& ‡�Ø+Ø
ˆÙÐ+Ó,Ð-Ø#ð	 ó ñ )0Ð0AÓ(Bñ<Øð<à'ð<ð &ò<óð<ð: ‡�Ø"Ø
ˆÙÐ+Ó,Ð-Ø#ð	 ó ñ )0Ð0AÓ(Bñ <Øð <à-ð <ð &ò <óð <ðF ‡�ØØ
ˆÙÐ+Ó,Ð-Ø/ð	 ó ð<Øð<àò<óð<ð2 ‡�Ø/Ø
ˆÙÐ+Ó,Ð-ð ó ð
<°#ò <óð
<ð0 ‡�ØØ
ˆÙÐ+Ó,Ð-Ø#ð	 ó ð< ò <óð<ð< ‡�ØØ
ˆÙÐ+Ó,Ð-Ø#ð	 ó ñ )0Ð0AÓ(Bñ2<Øð2<à ð2<ð &ò2<óð2<ðj ‡�ØØ
ˆÙÐ+Ó,Ð-ð ó ð
)< 3ò )<óð
)<ðX ‡�Ø/Ø
ˆÙÐ+Ó,Ð-ð ó ð
5<¨Sò 5<óð
5<ðz ‡�ØØ
ˆÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(Bñ2<Ø ð2<à%ò2<óð
2<ðt ‡�Ø Ø
ˆÙÐ+Ó,Ð-Ø/ð	 ó ñ-<óð-<ð` ‡�ØØ
ˆÙÐ+Ó,Ð-Ø-ð	 ó ñ )0Ð0AÓ(BñS<Ø*ðS<à%òS<óðS<ðl ‡�Ø+Ø
ˆÙÐ+Ó,Ð-Ø-ð	 ó ð<¨sò <óð<ðB ‡�Ø+Ø
ˆÙÐ+Ó,Ð-ð ó ð
+<°#ò +<óñ
+<r4   