Ë
    tPêj.Y ã                   óê  — U d Z ddlZddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZ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 ddlmZ ddlmZ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,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR erddlmSZS ddlTmUZU ddlVmWZW ddlXmYZY  e«       Z8eeZd<    e6«       Z[eeZd<   de	e\e]f   de	e\e]f   fd „Z^dŸd#„Z_d!d"d$e	e\e]f   dd%fd&„Z`d!d"d'e	e\e]f   ddfd(„Zad!d"d'e	e\e]f   dd)fd*„Zbd+eced   deKfd,„Zee8jÍ                  d-d.g ee/«      geK¬/«      d0„ «       Zge8jÍ                  d1d.geK¬2«       ee/«      fd3e-fd4„«       Zh G d5„ d6e"«      Zie8jÕ                  d7d.g¬8«       ee/«      fd9eid3e-fd:„«       Zk G d;„ d<e"«      Zle8jÛ                  d=d.g¬8«       ee/«      fd>e\d9eld3e-fd?„«       Zne8jß                  d=d.g¬8«       ee/«      fd>e\d3e-fd@„«       ZpdAZqeeZdB<    G dC„ dDe"«      Zr G dE„ dFe"«      Zs G dG„ dHe"«      Zt G dI„ dJe"«      Zu G dK„ dLe"«      Zve8jÕ                  dMd.ges¬2«       ee/«      fd9erd3e-fdN„«       ZwdOe]dede\ef   dz  fdP„Zxd3e-dece\   fdQ„ZydRd%deufdS„Zze8jÍ                  dTd.gev¬2«      ddd ee/«      fdUe\dz  dVe\dz  dWe\dz  d3e-fdX„«       Z{e8jÍ                  dYd.geu¬2«       ee/«      fd>e\d3e-fdZ„«       Z|e8jÕ                  d[d.g¬8«       ee/«      fd>e\d3e-fd\„«       Z}e8jÕ                  d]d.g¬8«       ee/«      fd>e\d3e-fd^„«       Z~e8jÿ                  d=d.g¬8«       ee/«      fd>e\d9eMd3e-fd_„«       Z€e8jÍ                  d=d.g ee/«      g¬`«      e8jÍ                  dad.g ee/«      g¬`«      d>e\fdb„«       «       Z�e8jÍ                  dcd.g ee/«      g¬`«      dd„ «       Z‚e8jÍ                  ded.g ee/«      g¬`«      dfe\fdg„«       Zƒe8jÍ                  dhd.g ee/«      g¬`«      di„ «       Z„e8jÕ                  djd.g ee/«      g¬`«      d9ede\e\f   fdk„«       Z…dle]de]fdm„Z†dle]de]fdn„Z‡dle]deˆe]dof   fdp„Z‰dqe]de\fdr„ZŠdle]de
e]   fds„Z‹dqe]de
e]   dz  fdt„ZŒdqe]de\fdu„Z�dqe]de
e]   dz  fdv„ZŽdwe\dqe]de�fdx„Z�dqe]de]fdy„Z‘dzd{dqe]d|e\d}e�dede\e]f   f
d~„Z’	 d de“e"   d€e”dede\e]f   fd�„Z•d‚e“e"   dede\e]f   fdƒ„Z–e8jÍ                  d„d.g ee/«      g¬`«      d…„ «       Z— G d†„ d‡e"«      Z˜ G dˆ„ d‰e"«      Z™e8jÕ                  dŠd.ge™¬2«       ee/«      fd9e˜d3e-fd‹„«       ZšdŒe(d�e\dedŽ   fd�„Z› G d�„ d‘e«      Zœ G d’„ d“e«      Z�d”eœd9eBddfd•„Zžd–e�d”eœdz  d$edd3e-d—eCd˜edeCfd™„ZŸe8jÕ                  dšeC¬›«      e8jÕ                  dœeC¬›«       ee/«      fd�e d9eBd3e-fdž„«       «       Z e8�jC                  e9«       y)¡z
CRUD ENDPOINTS FOR GUARDRAILS
é    N)Ú	AwaitableÚCallableÚMappingÚSequence)ÚdatetimeÚtimezone)Ú	UnionType)
ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚProtocolÚTypeVarÚUnionÚcastÚget_argsÚ
get_origin)Úurlparse)Ú	APIRouterÚDependsÚHTTPExceptionÚRequest)Ú	BaseModel)Úverbose_proxy_logger)ÚDEFAULT_MAX_RECURSE_DEPTH)ÚCustomGuardrail)Ú
safe_dumps)ÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)Ú	safe_join)Úbuild_sandbox_globalsÚcompile_sandboxed)ÚGuardrailRegistry)Úrouter)Ú_user_has_admin_view)ÚTableActions)ÚGuardrailsRepository)ÚPII_ENTITY_CATEGORIES_MAPÚApplyGuardrailRequestÚApplyGuardrailResponseÚBaseLitellmParamsÚBedrockGuardrailConfigModelÚ	GuardrailÚGuardrailEventHooksÚGuardrailInfoResponseÚGuardrailUIAddGuardrailSettingsÚLakeraV2GuardrailConfigModelÚListGuardrailsResponseÚLitellmParamsÚPatchGuardrailRequestÚ	PiiActionÚPiiEntityTypeÚ(PresidioPresidioConfigModelUserInterfaceÚSupportedGuardrailIntegrationsÚ"ToolPermissionGuardrailConfigModel)ÚCodeType)ÚLiteLLM_GuardrailsTable)Ú	FieldInfo)ÚPrismaClientr%   ÚGUARDRAIL_REGISTRYÚmappingÚreturnc                 ó   — | S ©N© )r@   s    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_endpoints.pyÚ_as_str_object_mappingrF   E   s   € Ø€Nó    Úprisma_clientr>   c                 ó,   — t        | «      j                  S rC   )r(   Útable©rH   s    rE   Ú_guardrails_tablerL   I   s   € Ü Ó.×4Ñ4Ð4rG   Údatar<   c              ƒ   óX   K  — t        | «      j                  |¬«      ƒ d {  –—† }|S 7 Œ­w)N©rM   )rL   Úcreate)rH   rM   Úrows      rE   Ú_create_guardrail_rowrR   M   s,   è ø€ Ü(¨Ó7×>Ñ>ÀDÐ>ÓI×I€CØ€Jð Jús   ‚*¡(¢*Úwherec              ƒ   óV   K  — t        | «      j                  |¬«      ƒ d {  –—†  y 7 Œ­w)N©rS   )rL   Údelete)rH   rS   s     rE   Ú_delete_guardrail_rowrW   R   s"   è ø€ Ü
˜MÓ
*×
1Ñ
1¸Ð
1Ó
>×>Ò>ús   ‚)¡'¢)z!Sequence[LiteLLM_GuardrailsTable]c              ƒ   ó^   K  — t        | «      j                  |ddi¬«      ƒ d {  –—† }|S 7 Œ­w)NÚ
created_atÚdesc)rS   Úorder)rL   Ú	find_many)rH   rS   Úrowss      rE   Ú_find_team_guardrail_rowsr^   V   s?   è ø€ ô *¨-Ó8×BÑBØØ˜VÐ$ð Có ÷ €Dð €Kð	ús   ‚"-¤+¥-Úguardrails_configc                 ó  — ddl m} g }| D ]m  }|j                  d«      xs i } ||dd¬«      }|j                  t	        |j                  d«      |j                  d«      ||j                  d«      ¬	«      «       Œo t        |¬
«      S )z=
    Helper function to get the guardrails list response
    r   ©Ú_get_masked_valuesÚlitellm_paramsé   ©Úunmasked_lengthÚnumber_of_asterisksÚguardrail_idÚguardrail_nameÚguardrail_info©rh   ri   rc   rj   ©Ú
guardrails)Ú*litellm.litellm_core_utils.litellm_loggingrb   ÚgetÚappendr0   r3   )r_   rb   Úguardrail_configsÚ	guardrailrc   Úmasked_paramss         rE   Ú_get_guardrails_list_responsert   `   s“   € õ Nà<>ÐØ&ò 
ˆ	Ø"Ÿ™Ð'7Ó8Ò>¸BˆÙ*ØØØ !ô
ˆð
 	× Ñ Ü!Ø&Ÿ]™]¨>Ó:Ø(Ÿ}™}Ð-=Ó>Ø,Ø(Ÿ}™}Ð-=Ó>ô	õ	
ð
ô "Ð->Ô?Ð?rG   z/guardrails/listÚ
Guardrails)ÚtagsÚdependenciesÚresponse_modelc               ƒ   ó°   K  — ddl m}  | j                  }t        t        t
           dz  |j                  d«      «      }|€t        g «      S t        |«      S ­w)ur  
    List the guardrails that are available on the proxy server

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

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

    Example Response:
    ```json
    {
        "guardrails": [
            {
            "guardrail_name": "bedrock-pre-guard",
            "guardrail_info": {
                "params": [
                {
                    "name": "toxicity_score",
                    "type": "float",
                    "description": "Score between 0-1 indicating content toxicity level"
                },
                {
                    "name": "pii_detection",
                    "type": "boolean"
                }
                ]
            }
            }
        ]
    }
    ```
    r   )Úproxy_configNrm   )Úlitellm.proxy.proxy_serverrz   Úconfigr   ÚlistÚdictro   rt   )rz   r|   Ú_guardrails_configs      rE   Úlist_guardrailsr€   {   sS   è ø€ õR 8à ×'Ñ'€Fä $¤T¬$¡Z°$Ñ%6¸¿
¹
À<Ó8PÓ QÐàÐ!Ü,¨RÓ0Ð0ä(Ð);Ó<Ð<ùs   ‚AAz/v2/guardrails/list)rv   rx   Úuser_api_key_dictc              ƒ   óB  K  — ddl m} ddlm} ddlm} t        | «      }	 |�t        j                  |¬«      ƒ d{  –—† ng }t        «       }|slt        | «      ƒ d{  –—† }g }|D ]P  }	|	j                  d«      }
|
�|
|v r|j                  |	«       Œ,|	j                  d«      }|sŒ@|j                  |«       ŒR |}g }|j                  «       }|D ]á  }|j                  d«      }t        |t         «      r|j#                  d	¬
«      n|xs i } ||dd¬«      }|rt%        di |¤Žnd}|j                  t'        |j                  d«      |j                  d«      ||j                  d«      |j                  d«      |j                  d«      d¬«      «       |j                  |j                  d«      «       Œã |j)                  «       }|D �]  }|j                  d«      }||v rŒ|�|j+                  |«      dk(  rŒ1|s|j                  d«      }
|
�|
vrŒK|j                  d«      }t        |t         «      r|j#                  d	¬
«      n|xs i } ||dd¬«      }|rt%        di |¤Žnd}|j                  t'        |j                  d«      |j                  d«      |t-        |j                  d«      xs i «      d¬«      «       |j                  |«       �Œ
 t/        |¬«      S 7 �Œ 7 �Œ‚# t0        $ r1}t3        j4                  d|«       t7        dt9        |«      ¬«      ‚d}~ww xY w­w)uÎ  
    List the guardrails that are available in the database using GuardrailRegistry

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

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

    Example Response:
    ```json
    {
        "guardrails": [
            {
                "guardrail_id": "123e4567-e89b-12d3-a456-426614174000",
                "guardrail_name": "my-bedrock-guard",
                "litellm_params": {
                    "guardrail": "bedrock",
                    "mode": "pre_call",
                    "guardrailIdentifier": "ff6ujrregl1q",
                    "guardrailVersion": "DRAFT",
                    "default_on": true
                },
                "guardrail_info": {
                    "description": "Bedrock content moderation guardrail"
                }
            }
        ]
    }
    ```
    r   ra   ©ÚIN_MEMORY_GUARDRAIL_HANDLERrK   NÚteam_idrh   rc   T©Úexclude_nonerd   re   ri   rj   rY   Ú
updated_atÚdb©rh   ri   rc   rj   rY   rˆ   Úguardrail_definition_locationr|   )rh   ri   rc   rj   r‹   rl   z$Error getting guardrails from db: %séô  ©Ústatus_codeÚdetailrD   )rn   rb   Ú+litellm.proxy.guardrails.guardrail_registryr„   r{   rH   r&   r?   Úget_all_guardrails_from_dbÚsetÚ_get_user_team_idsro   rp   ÚaddÚcopyÚ
isinstancer4   Ú
model_dumpr,   r0   Úlist_in_memory_guardrailsÚ
get_sourcer~   r3   Ú	Exceptionr   Ú	exceptionr   Ústr)r�   rb   r„   rH   Úis_adminrm   Úexcluded_guardrail_idsÚcaller_team_idsÚallowedÚgÚ	g_team_idÚgidrq   Úseen_guardrail_idsrr   rc   Úlitellm_params_dictÚmasked_litellm_params_dictÚmasked_litellm_paramsÚin_memory_guardrailsÚin_memory_litellm_params_rawÚin_memory_litellm_params_dictÚmasked_in_memory_litellm_paramsÚ%masked_in_memory_litellm_params_typedÚes                            rE   Úlist_guardrails_v2r®   °   ss  è ø€ õP NÝWÝ8ä*Ð+<Ó=€Hð]<ð Ð(ô %×?Ñ?ÈmÐ?Ó\×\Ð\àð 	ô .1«UÐÙÜ+=Ð>OÓ+P×%PˆOØ.0ˆGØò 8�ØŸE™E )Ó,�	ØÐ$¨	°_Ñ(DØ—N‘N 1Õ%àŸ%™% Ó/�CÚØ.×2Ñ2°3Õ7ð8ð !ˆJà@BÐØ)?×)DÑ)DÓ)FÐØ#ò 	BˆIØ:C¿-¹-ÐHXÓ:YˆNô ˜n¬mÔ<ð ×)Ñ)°tÐ)Ô<à#ò#ð ð	  ñ
 *<Ø#Ø !Ø$%ô*Ð&ñ D^Ô!Ñ?Ð$>Ò?Ðcgð "ð ×$Ñ$Ü%Ø!*§¡¨~Ó!>Ø#,§=¡=Ð1AÓ#BØ#8Ø#,§=¡=Ð1AÓ#BØ(Ÿ}™}¨\Ó:Ø(Ÿ}™}¨\Ó:Ø26ôô
ð ×"Ñ" 9§=¡=°Ó#@ÕAð5	Bð: 'B×&[Ñ&[Ó&]ÐØ-ó #	(ˆIØ—-‘- Ó/ˆCØÐ(Ñ(Øð ˆÐ#>×#IÑ#IÈ#Ó#NÐRVÒ#VØÙØ%ŸM™M¨)Ó4�	ØÐ(¨Y¸oÑ-MØØ+4¯=©=Ð9IÓ+JÐ(ô Ð:¼MÔJð -×7Ñ7ÀTÐ7ÔJà1ò-ð ð	 *ñ
 /AØ-Ø !Ø$%ô/Ð+ñ IhÔ!ÑDÐ$CÒDÐmqð 2ð ×$Ñ$Ü%Ø!*§¡¨~Ó!>Ø#,§=¡=Ð1AÓ#BØ#HÜ#'¨	¯©Ð6FÓ(GÒ(MÈ2Ó#NØ2:ôôð ×"Ñ" 3Ö'ðG#	(ôJ &Ð1BÔCÐCðq ]ùð &Qúôd ò <Ü×&Ñ&Ð'MÈqÔQÜ¨´C¸³FÔ;Ð;ûð<üsR   ‚L¡K" ¼K½ K" ÁKÁAK" Â&H5K" ËLËK" ËK" Ë"	LË+,LÌLÌLc                   ó   — e Zd ZU eed<   y)ÚCreateGuardrailRequestrr   N©Ú__name__Ú
__module__Ú__qualname__r.   Ú__annotations__rD   rG   rE   r°   r°   >  ó   … ØÔrG   r°   z/guardrails)rv   Úrequestc              ƒ   óX  K  — ddl m} ddlm} |j                  t
        j                  k7  rt        dd¬«      ‚|€t        dd	¬«      ‚	 t        j                  | j                  |¬
«      ƒ d{  –—† }|j                  dd«      }|j                  dd«      }	 |j                  t        t        |«      d¬«       t        j                   d||«       |S 7 Œc# t"        t$        f$ r^}|�G	 t'        |d|i¬«      ƒ d{  –—†7   n-# t(        $ r!}t        j*                  d||«       Y d}~nd}~ww xY wt        dd|› �¬«      ‚d}~wt(        $ r#}t        j*                  d|||«       Y d}~|S d}~ww xY w# t(        $ r1}	t        j,                  d|	«       t        dt/        |	«      ¬«      ‚d}	~	ww xY w­w)u¥  
    Create a new guardrail

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/guardrails" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "guardrail": {
                "guardrail_name": "my-bedrock-guard",
                "litellm_params": {
                    "guardrail": "bedrock",
                    "mode": "pre_call",
                    "guardrailIdentifier": "ff6ujrregl1q",
                    "guardrailVersion": "DRAFT",
                    "default_on": true
                },
                "guardrail_info": {
                    "description": "Bedrock content moderation guardrail"
                }
            }
        }'
    ```

    Example Response:
    ```json
    {
        "guardrail_id": "123e4567-e89b-12d3-a456-426614174000",
        "guardrail_name": "my-bedrock-guard",
        "litellm_params": {
            "guardrail": "bedrock",
            "mode": "pre_call",
            "guardrailIdentifier": "ff6ujrregl1q",
            "guardrailVersion": "DRAFT",
            "default_on": true
        },
        "guardrail_info": {
            "description": "Bedrock content moderation guardrail"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T12:34:56.789Z"
    }
    ```
    r   rƒ   rK   é“  ú*Admin access required to manage guardrailsr�   NrŒ   úPrisma client not initialized)rr   rH   ri   ÚUnknownrh   r‰   ©rr   Úsourcez@Immediate sync: Successfully initialized guardrail '%s' (ID: %s)rU   z&Rollback failed for guardrail '%s': %sé�  zGuardrail configuration error: zJImmediate sync: Failed to initialize guardrail '%s' (ID: %s) in memory: %sz Error adding guardrail to db: %s)r�   r„   r{   rH   Ú	user_roler   ÚPROXY_ADMINr   r?   Úadd_guardrail_to_dbrr   ro   Úinitialize_guardrailr   r.   r   ÚinfoÚ
ValueErrorÚ	TypeErrorrW   rš   Úwarningr›   rœ   )
r·   r�   r„   rH   Úresultri   rh   Ú
init_errorÚrollback_errr­   s
             rE   Úcreate_guardrailrË   B  s¸  è ø€ õn XÝ8à×"Ñ"Ô&6×&BÑ&BÒBÜØØ?ô
ð 	
ð
 ÐÜ¨Ð4SÔTÐTð!<Ü)×=Ñ=È×HYÑHYÐivÐ=Ów×wˆà &§
¡
Ð+;¸YÓ GˆØ$Ÿj™j¨¸ÓCˆð	Ø'×<Ñ<ÄtÌIÐW]ÓG^ÐgkÐ<ÔlÜ ×%Ñ%ØRÐTbÐdpôð, ˆð; xùô œIÐ&ò 
	àÐ(ðwÜ/°ÀnÐVbÐEcÔd×dÒdøÜ ò wÜ(×0Ñ0Ð1YÐ[gÐiu×vÑvûðwúäØØ8¸¸ÐEôð ûô ò 	Ü ×(Ñ(Ø\ØØØ÷	ð ð ˆûð	ûô ò <Ü×&Ñ&Ð'IÈ1ÔMÜ¨´C¸³FÔ;Ð;ûð<üs®   ‚AF*Á	$E- Á-CÁ.(E- Â8C ÃE- ÃF*ÃE- ÃE*Ã"D;Ã%C>Ã7C:Ã8C>Ã=D;Ã>	D(ÄD#ÄD;Ä#D(Ä(D;Ä;E*ÅE%ÅE- Å$F*Å%E*Å*E- Å-	F'Å6,F"Æ"F'Æ'F*c                   ó   — e Zd ZU eed<   y)ÚUpdateGuardrailRequestrr   Nr±   rD   rG   rE   rÍ   rÍ   ©  r¶   rG   rÍ   z/guardrails/{guardrail_id}rh   c              ƒ   óÊ  K  — ddl m} ddlm} |j                  t
        j                  k7  rt        dd¬«      ‚|€t        dd	¬«      ‚	 t        j                  | |¬
«      ƒ d{  –—† }|€t        dd| › d�¬«      ‚t        t        j                  | |j                  |¬«      ƒ d{  –—† «      }|j                  dd«      }	 |j                  | t        t         |«      ¬«       t#        j$                  d|| «       |S 7 Œ—7 ŒW# t&        $ r#}t#        j(                  d|| |«       Y d}~|S d}~ww xY w# t        $ r}	|	‚d}	~	wt&        $ r}	t        dt+        |	«      ¬«      ‚d}	~	ww xY w­w)uå  
    Update an existing guardrail

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

    Example Request:
    ```bash
    curl -X PUT "http://localhost:4000/guardrails/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "guardrail": {
                "guardrail_name": "updated-bedrock-guard",
                "litellm_params": {
                    "guardrail": "bedrock",
                    "mode": "pre_call",
                    "guardrailIdentifier": "ff6ujrregl1q",
                    "guardrailVersion": "1.0",
                    "default_on": true
                },
                "guardrail_info": {
                    "description": "Updated Bedrock content moderation guardrail"
                }
            }
        }'
    ```

    Example Response:
    ```json
    {
        "guardrail_id": "123e4567-e89b-12d3-a456-426614174000",
        "guardrail_name": "updated-bedrock-guard",
        "litellm_params": {
            "guardrail": "bedrock",
            "mode": "pre_call",
            "guardrailIdentifier": "ff6ujrregl1q",
            "guardrailVersion": "1.0",
            "default_on": true
        },
        "guardrail_info": {
            "description": "Updated Bedrock content moderation guardrail"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T13:45:12.345Z"
    }
    ```
    r   rƒ   rK   r¹   rº   r�   NrŒ   r»   ©rh   rH   é”  úGuardrail with ID ú
 not found©rh   rr   rH   ri   r¼   )rh   rr   ú<Immediate sync: Successfully updated guardrail '%s' (ID: %s)ú<Immediate sync: Failed to update '%s' (ID: %s) in memory: %s)r�   r„   r{   rH   rÀ   r   rÁ   r   r?   Úget_guardrail_by_id_from_dbrF   Úupdate_guardrail_in_dbrr   ro   Úupdate_in_memory_guardrailr   r.   r   rÄ   rš   rÇ   rœ   )
rh   r·   r�   r„   rH   Úexisting_guardrailrÈ   ri   Úupdate_errorr­   s
             rE   Úupdate_guardrailrÛ   ­  s�  è ø€ õp XÝ8à×"Ñ"Ô&6×&BÑ&BÒBÜØØ?ô
ð 	
ð
 ÐÜ¨Ð4SÔTÐTð&<ä*<×*XÑ*XØ%°]ð +Yó +
÷ %
Ðð Ð%Ü¨CÐ:LÈ\ÈNÐZdÐ8eÔfÐfä.Ü$×;Ñ;Ø)Ø!×+Ñ+Ø+ð <ó ÷ ó
ˆð !'§
¡
Ð+;¸YÓ Gˆð	Ø'×BÑBØ)´T¼)ÀVÓ5Lð Cô ô !×%Ñ%ØNÐP^Ð`lôð ˆðA%
øðùô  ò 	Ü ×(Ñ(ØNØØØ÷	ð ð ˆûð	ûô ò ØˆûÜò <Ü¨´C¸³FÔ;Ð;ûð<üs‹   ‚AE#Á	D. Á#C;Á$AD. Â%C=Â&D. Ã8C? Ã9D. Ã:E#Ã;D. Ã=D. Ã?	D+ÄD&Ä D. Ä%E#Ä&D+Ä+D. Ä.	E Ä7D9Ä9E ÅEÅE Å E#c              ƒ   ó„  K  — ddl m} ddlm} |j                  t
        j                  k7  rt        dd¬«      ‚|€t        dd	¬«      ‚	 t        j                  | |¬
«      ƒ d{  –—† }|€t        dd| › d�¬«      ‚t        j                  | |¬
«      ƒ d{  –—† }|j                  dd«      }	 |j                  | ¬«       t        j                  d|| «       |S 7 Œt7 ŒD# t        $ r#}t        j                   d|| |«       Y d}~|S d}~ww xY w# t        $ r}|‚d}~wt        $ r}t        dt#        |«      ¬«      ‚d}~ww xY w­w)u»  
    Delete a guardrail

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

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

    Example Response:
    ```json
    {
        "message": "Guardrail 123e4567-e89b-12d3-a456-426614174000 deleted successfully"
    }
    ```
    r   rƒ   rK   r¹   rº   r�   NrŒ   r»   rÏ   rÐ   rÑ   rÒ   ri   r¼   ©rh   zHImmediate sync: Successfully removed guardrail '%s' (ID: %s) from memoryzHImmediate sync: Failed to remove guardrail '%s' (ID: %s) from memory: %s)r�   r„   r{   rH   rÀ   r   rÁ   r   r?   rÖ   Údelete_guardrail_from_dbro   Údelete_in_memory_guardrailr   rÄ   rš   rÇ   rœ   )	rh   r�   r„   rH   rÙ   rÈ   ri   Údelete_errorr­   s	            rE   Údelete_guardrailrá     st  è ø€ õ4 XÝ8à×"Ñ"Ô&6×&BÑ&BÒBÜØØ?ô
ð 	
ð
 ÐÜ¨Ð4SÔTÐTð"<ä*<×*XÑ*XØ%°]ð +Yó +
÷ %
Ðð Ð%Ü¨CÐ:LÈ\ÈNÐZdÐ8eÔfÐfä0×IÑIØ%°]ð Jó 
÷ 
ˆð !'§
¡
Ð+;¸YÓ Gˆð	Ø'×BÑBØ)ð Cô ô !×%Ñ%ØZÐ\jÐlxôð ˆð9%
øð
ùô ò 	Ü ×(Ñ(ØZØØØ÷	ð ð ˆûð	ûô ò ØˆûÜò <Ü¨´C¸³FÔ;Ð;ûð<üsŠ   ‚AE Á	D Á#CÁ$1D ÂCÂD Â-)C ÃD ÃE ÃD ÃD Ã	DÃ%DÃ=D ÄE ÄDÄD Ä	D=ÄDÄD=Ä"D8Ä8D=Ä=E Úgeneric_guardrail_apiÚGENERIC_GUARDRAIL_APIc                   óx   — e Zd ZU dZe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eee
f   fd„Zy)	ÚRegisterGuardrailRequestzQRequest body for POST /guardrails/register. Follows Generic Guardrail API config.ri   rc   Nrj   r…   rA   c                 ó,   — t        | j                  «      S rC   )r~   rc   ©Úselfs    rE   Úget_litellm_params_dictz0RegisterGuardrailRequest.get_litellm_params_dictr  s   € Ü�D×'Ñ'Ó(Ð(rG   )r²   r³   r´   Ú__doc__rœ   rµ   r~   Úobjectrj   r…   r   ré   rD   rG   rE   rå   rå   j  sT   … Ù[àÓØ˜˜f˜Ñ%Ó%Ø/3€N�D˜˜f˜Ñ%¨Ñ,Ó3Ø€GˆS�4‰ZÓð)¨¨c°3¨h©ô )rG   rå   c                   ó@   — e Zd ZU eed<   eed<   eed<   dZedz  ed<   y)ÚRegisterGuardrailResponserh   ri   ÚstatusNÚsubmitted_at)r²   r³   r´   rœ   rµ   rï   r   rD   rG   rE   rí   rí   v  s!   … ØÓØÓØƒKØ$(€L�(˜T‘/Ô(rG   rí   c                   ó6   — e Zd ZU eed<   eed<   eed<   eed<   y)ÚGuardrailSubmissionSummaryÚtotalÚpending_reviewÚactiveÚrejectedN)r²   r³   r´   Úintrµ   rD   rG   rE   rñ   rñ   }  s   … ØƒJØÓØƒKØ„MrG   rñ   c                   ó  — e Zd ZU eed<   eed<   eed<   dZedz  ed<   dZeed<   dZe	ee
f   dz  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<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   y)ÚGuardrailSubmissionItemrh   ri   rî   Nr…   FÚteam_guardrailrc   rj   Úsubmitted_by_user_idÚsubmitted_by_emailrï   Úreviewed_atrY   rˆ   )r²   r³   r´   rœ   rµ   r…   rù   Úboolrc   r~   rë   rj   rú   rû   rï   r   rü   rY   rˆ   rD   rG   rE   rø   rø   „  s¸   … ØÓØÓØƒKØ€GˆS�4‰ZÓàð �Dó ð 04€N�D˜˜f˜Ñ%¨Ñ,Ó3Ø/3€N�D˜˜f˜Ñ%¨Ñ,Ó3Ø'+Ð˜# ™*Ó+Ø%)Ð˜˜d™
Ó)Ø$(€L�(˜T‘/Ó(Ø#'€K�˜D‘Ó'Ø"&€J�˜4‘Ó&Ø"&€J�˜4‘Ô&rG   rø   c                   ó(   — e Zd ZU ee   ed<   eed<   y)Ú ListGuardrailSubmissionsResponseÚsubmissionsÚsummaryN)r²   r³   r´   r}   rø   rµ   rñ   rD   rG   rE   rÿ   rÿ   –  s   … ØÐ-Ñ.Ó.Ø'Ô'rG   rÿ   z/guardrails/registerc              ƒ   ó  K  — ddl m} |€t        dd¬«      ‚| j                  xs |j                  }|st        dd¬«      ‚|j                  t
        j                  k(  }|s6||j                  k7  r't        |«      ƒ d{  –—† }||vrt        d	d
|›�¬«      ‚| j                  «       }|j                  d«      t        k7  rt        ddt        ›d�¬«      ‚|j                  d«      }|st        dd¬«      ‚t        |«      }|j                  dvrt        dd¬«      ‚|j                  st        dd¬«      ‚|j                  d«      }	|	€t        dd¬«      ‚	 t        |«      j                  d| j                   i¬«      ƒ d{  –—† }
|
�t        dd| j                   ›d�¬«      ‚	 t+        j,                  t.        j0                  «      }t3        |«      }t5        | j6                  xs i «      }|j8                  |d<   |j:                  |d<   d|d<   t3        |«      }	 t=        || j                   ||d||||dœ¬ «      ƒ d{  –—† }t?        |j@                  |j                   |jB                  |jD                  ¬!«      S 7 �Œø7 Œú# t        $ r ‚ t"        $ r1}t%        j&                  d|«       t        dt)        |«      ¬«      ‚d}~ww xY w7 Œ†# t"        $ r1}t%        j&                  d"|«       t        dt)        |«      ¬«      ‚d}~ww xY w­w)#a%  
    Register a guardrail for onboarding (team submission).

    Accepts a guardrail config in the
    [Generic Guardrail API](https://docs.litellm.ai/docs/adding_provider/generic_guardrail_api) format.
    The submission is stored with status `pending_review` until an admin approves it.
    r   rK   NrŒ   r»   r�   r¿   zQteam_id is required. Provide it in the request body or use a team-scoped API key.r¹   úYou are not a member of team rr   z.Only guardrails with litellm_params.guardrail=z are accepted for registrationÚapi_basez=litellm_params.api_base is required for generic_guardrail_api)ÚhttpÚhttpsz5litellm_params.api_base must use http or https schemez5litellm_params.api_base must contain a valid hostnameÚmodez:litellm_params.mode is required (e.g. pre_call, post_call)ri   rU   zGuardrail with name z already existsz,Error checking guardrail name uniqueness: %srú   rû   Trù   ró   )ri   rc   rj   rî   r…   rï   rY   rˆ   rO   )rh   ri   rî   rï   zError registering guardrail: %s)#r{   rH   r   r…   rÀ   r   rÁ   r“   ré   ro   rã   r   ÚschemeÚhostnamerL   Úfind_uniqueri   rš   r   r›   rœ   r   Únowr   Úutcr   r~   rj   Úuser_idÚ
user_emailrR   rí   rh   rî   rï   )r·   r�   rH   r…   r�   Úuser_team_idsÚparamsr  Úparsedr  Úexistingr­   r  Úlitellm_params_strrj   Úguardrail_info_strÚcreateds                    rE   Úregister_guardrailr  ›  s6  è ø€ õ  9àÐÜ¨Ð4SÔTÐTð —_‘_ÒAÐ(9×(AÑ(A€GÙÜØØfô
ð 	
ð (×1Ñ1Ô5E×5QÑ5QÑQ€HÙ˜Ð#4×#<Ñ#<Ò<Ü%7Ð8IÓ%J×JˆØ˜-Ñ'ÜØØ6°w°kÐBôð ð
 ×3Ñ3Ó5€FØ‡z�z�+ÓÔ"7Ò7ÜØØCÔDYÐC\Ð\zÐ{ô
ð 	
ð —j‘j Ó,€HÙÜØØRô
ð 	
ô ˜XÓ&€FØ‡}�}Ð-Ñ-ÜØØJô
ð 	
ð �?Š?ÜØØJô
ð 	
ð —*‘*˜VÓ$€DØ€|ÜØØOô
ð 	
ð
<Ü*¨=Ó9×EÑEÐM]Ð_f×_uÑ_uÐLvÐEÓw×wˆØÐÜØØ-¨g×.DÑ.DÐ-GÀÐWôð ð  ô —‘œhŸl™lÓ+€CÜ *¨6Ó 2ÐÜ  ×!7Ñ!7Ò!=¸2Ó>€NØ->×-FÑ-F€NÐ)Ñ*Ø+<×+GÑ+G€NÐ'Ñ(Ø'+€NÐ#Ñ$Ü *¨>Ó :Ðð<Ü4Øà")×"8Ñ"8Ø"4Ø"4Ø*Ø"Ø #Ø!Ø!ñ	ô 
÷ 
ˆô )Ø ×-Ñ-Ø"×1Ñ1Ø—>‘>Ø ×-Ñ-ô	
ð 	
ðQ  KùðL xùô ò ØÜò <Ü×&Ñ&Ð'UÐWXÔYÜ¨´C¸³FÔ;Ð;ûð<úð
ùô& ò <Ü×&Ñ&Ð'HÈ!ÔLÜ¨´C¸³FÔ;Ð;ûð<üs€   ‚A;K?Á=I5Á>CK?Å*I: Å=I8Å>!I: ÆA6K?È#K È9K È::K É4K?É8I: É:J=Ê,J8Ê8J=Ê=K?Ë K Ë	K<Ë,K7Ë7K<Ë<K?Úvaluec                 ó˜   — | €y t        | t        «      r| S t        | t        «      r	 t        j                  | «      S y # t
        $ r Y y w xY wrC   )r–   r~   rœ   ÚjsonÚloadsrš   )r  s    rE   Ú_parse_json_fieldr    sP   € Ø€}ØÜ�%œÔØˆÜ�%œÔð	Ü—:‘:˜eÓ$Ð$ð øô ò 	Ùð	ús   §= ½	A	ÁA	c              ƒ   ó  K  — ddl m} ddlm}m}m} | j                  r|€g S  || j                  ||d| j                  |¬«      ƒ d{  –—† }|�|j                  sg S |j                  D �cg c]  }|sŒ|‘Œ	 c}S 7 Œ1c c}w ­w)zGReturn the list of team_ids the caller belongs to (empty list if none).r   )Úget_user_object)rH   Úproxy_logging_objÚuser_api_key_cacheNF)r  rH   r  Úuser_id_upsertÚparent_otel_spanr  )	Úlitellm.proxy.auth.auth_checksr  r{   rH   r  r  r  r!  Úteams)r�   r  rH   r  r  Úuser_objÚts          rE   r“   r“     s‰   è ø€ å>÷ñ ð ×$Ò$¨Ð(=Øˆ	Ù+Ø!×)Ñ)Ø#Ø-ØØ*×;Ñ;Ø+ô÷ €Hð Ð˜xŸ~š~Øˆ	Ø—~‘~Ö+�!ªŠAÒ+Ð+ðúò ,ùs*   ‚ABÁA:Á	"BÁ+A<Á3A<Á7BÁ<BrQ   c                 ó¼  — ddl m} t        | j                  «      xs i }| j                  d u}t        | j
                  «      xs i } ||dd¬«      }t        | j                  | j                  | j                  xs d| j                  ||||j                  d«      |j                  d«      t        | dd «      t        | d	d «      | j                  | j                  ¬
«      S )Nr   ra   rd   re   rô   rú   rû   rï   rü   )rh   ri   rî   r…   rù   rc   rj   rú   rû   rï   rü   rY   rˆ   )rn   rb   r  rj   r…   rc   rø   rh   ri   rî   ro   ÚgetattrrY   rˆ   )rQ   rb   rj   rù   Ú
raw_paramsrs   s         rE   Ú_row_to_submission_itemr)  3  sË   € ÝMä-¨c×.@Ñ.@ÓAÒGÀR€NØŸK™K¨tÐ3€NÜ)¨#×*<Ñ*<Ó=ÒCÀ€JÙ-¨jÈ!ÐabÔc€MÜ"Ø×%Ñ%Ø×)Ñ)Ø�z‰zÒ%˜XØ—‘Ø%Ø$Ø%Ø+×/Ñ/Ð0FÓGØ)×-Ñ-Ð.BÓCÜ˜S .°$Ó7Ü˜C °Ó5Ø—>‘>Ø—>‘>ôð rG   z/guardrails/submissionsrî   r…   Úsearchc           
   ƒ   óÔ  K  — ddl m} |€t        dd¬«      ‚t        |«      }d}|s)t	        |«      ƒ d{  –—† }|�||vrt        dd|›�¬«      ‚	 d	d
dii}|�#|st        g t        dddd¬«      ¬«      S d|i|d	<   t        ||«      ƒ d{  –—† }t        |«      }	t        d„ |D «       «      }
t        d„ |D «       «      }t        d„ |D «       «      }|}| r|D �cg c]  }|j                  | k(  sŒ|‘Œ }}|r|D �cg c]  }|j                  |k(  sŒ|‘Œ }}|rÈ|j                  «       }|D �cg c]­  }||j                  xs dj                  «       v s‰t        |j                  t         «      r9|t#        |j                  xs i j%                  dd«      «      j                  «       v s6t        |j                  t"        «      r||j                  j                  «       v r|‘Œ¯ }}|D �cg c]  }t'        |«      ‘Œ }}t        |t        |	|
||¬«      ¬«      S 7 �ŒÜ7 �Œ‰c c}w c c}w c c}w c c}w # t(        $ r1}t+        j,                  d|«       t        dt#        |«      ¬«      ‚d}~ww xY w­w)aÖ  
    List team guardrail submissions. Returns only guardrails with a team_id.

    Admins see all submissions. Non-admin users see submissions for teams they are
    a member of.

    Status values: pending_review (team-registered, awaiting approval), active (approved), rejected.

    Optional filters:
    - status: pending_review | active | rejected
    - team_id: filter by specific team (non-admins must be a member of that team)
    - search: name/description
    r   rK   NrŒ   r»   r�   r¹   r  r…   Únot)rò   ró   rô   rõ   )r   r  Úinc              3   óH   K  — | ]  }|j                   xs d dk(  sŒd–— Œ y­w)rô   ró   é   N©rî   ©Ú.0Úrs     rE   ú	<genexpr>z-list_guardrail_submissions.<locals>.<genexpr>…  s!   è ø€ Ò#k¨!ÀÇÁÒAUÈXÐZjÓ@j¤AÑ#kùó   ‚"›"c              3   óH   K  — | ]  }|j                   xs d d k(  sŒd–— Œ y­w)rô   r/  Nr0  r1  s     rE   r4  z-list_guardrail_submissions.<locals>.<genexpr>†  s!   è ø€ Ò!a¨¸q¿x¹xÒ?SÈ8ÐX`Ó>`¤!Ñ!aùr5  c              3   óH   K  — | ]  }|j                   xs d dk(  sŒd–— Œ y­w)rô   rõ   r/  Nr0  r1  s     rE   r4  z-list_guardrail_submissions.<locals>.<genexpr>‡  s!   è ø€ Ò_ A¸1¿8¹8Ò;OÀxÐT^Ó:^œaÑ_ùr5  Ú Údescriptionz'Error listing guardrail submissions: %s)r{   rH   r   r&   r“   rÿ   rñ   r^   ÚlenÚsumrî   r…   Úlowerri   r–   rj   r~   rœ   ro   r)  rš   r   r›   )rî   r…   r*  r�   rH   r�   Úvisible_team_idsÚwhere_clauseÚall_team_rowsrò   ró   Úactive_countrõ   r]   r3  Úsearch_lowerÚitemsr­   s                     rE   Úlist_guardrail_submissionsrC  K  s“  è ø€ õ0 9àÐÜ¨Ð4SÔTÐTô
 +Ð+<Ó=€HØ)-ÐÙÜ!3Ð4EÓ!F×FÐØÐ 7Ð2BÑ#BÜØØ6°w°kÐBôð ð
3<Ø2;¸eÀT¸]Ð1KˆØÐ'Ù#ä7Ø "Ü6¸QÈqÐYZÐefÔgôð ð (,Ð-=Ð&>ˆL˜Ñ#ô &?¸}ÈlÓ%[×[ˆô ˜=Ó)ˆÜ #Ñ#k¨}Ô#kÓ kˆÜ!Ñ!a¨]Ô!aÓaˆÜÑ_¨Ô_Ó_ˆð ˆÙØ#Ö:˜! q§x¡x°6Ó'9’AÐ:ˆDÐ:ÙØ#Ö<˜! q§y¡y°GÓ';’AÐ<ˆDÐ<ÙØ"(§,¡,£.ˆLð ö	àØ A×$4Ñ$4Ò$:¸×#AÑ#AÓ#CÑCä˜q×/Ñ/´Ô6Ø$¬¨Q×-=Ñ-=Ò-CÀ×,HÑ,HÈÐXZÓ,[Ó(\×(bÑ(bÓ(dÑdä˜q×/Ñ/´Ô5¸,È!×JZÑJZ×J`ÑJ`ÓJbÑ:bò ð	ˆDð 	ð =AÖA°qÔ/°Õ2ÐAˆÐAÜ/ØÜ.ØØ-Ø#Ø!ô	ô
ð 	
ð_ Gùð&  \ûò ;ùâ<ùò	ùò Bøô ò <Ü×&Ñ&Ð'PÐRSÔTÜ¨´C¸³FÔ;Ð;ûð<üs•   ‚3I(µH¶I(Á#H+ Á4I(Á5H+ ÂHÂAH+ ÃHÃ.HÃ2H+ Ã:HÄHÄH+ Ä+B2H!ÇH+ Ç#H&Ç5H+ ÈI(ÈH+ ÈH+ È+	I%È4,I É I%É%I(z&/guardrails/submissions/{guardrail_id}c              ƒ   óÖ  K  — ddl m} |€t        dd¬«      ‚t        |«      }	 t	        |«      j                  d| i¬«      ƒ d{  –—† }|€t        d	d
¬«      ‚|s:t        |«      ƒ d{  –—† }|j                  �|j                  |vrt        dd¬«      ‚t        |«      S 7 ŒZ7 Œ8# t        $ r ‚ t        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)ziGet a single guardrail submission by id. Non-admins may only access submissions for teams they belong to.r   rK   NrŒ   r»   r�   rh   rU   rÐ   úGuardrail submission not foundr¹   z:You are not a member of the team that owns this submissionz&Error getting guardrail submission: %s)r{   rH   r   r&   rL   r
  r“   r…   r)  rš   r   r›   rœ   )rh   r�   rH   r�   rQ   r=  r­   s          rE   Úget_guardrail_submissionrF  «  s÷   è ø€ õ 9àÐÜ¨Ð4SÔTÐTä*Ð+<Ó=€Hð<Ü,¨]Ó;×GÑGÈ~Ð_kÐNlÐGÓm×mˆØˆ;Ü¨CÐ8XÔYÐYÙÜ,>Ð?PÓ,Q×&QÐØ�{‰{Ð" c§k¡kÐ9IÑ&IÜ#Ø #ØWôð ô ' sÓ+Ð+ð nøð 'Rùô ò ØÜò <Ü×&Ñ&Ð'OÐQRÔSÜ¨´C¸³FÔ;Ð;ûð<üsL   ‚!C)¤ B# ÁBÁ#B# Á(B!Á)5B# ÂC)ÂB# Â!B# Â#C&Â5,C!Ã!C&Ã&C)z./guardrails/submissions/{guardrail_id}/approvec              ƒ   óJ  K  — ddl m} ddlm} |j                  t
        j                  k7  rt        dd¬«      ‚|€t        dd	¬«      ‚	 t        |«      j                  d
| i¬«      ƒ d{  –—† }|€t        dd¬«      ‚|j                  dk7  rt        dd|j                  › d�¬«      ‚t        j                  t        j                  «      }t        |«      j                  d
| id||dœ¬«      ƒ d{  –—†  t!        |j"                  «      }t!        |j$                  «      }|st        dd¬«      ‚|j&                  |j(                  ||xs i |j*                  dœ}	 |j-                  t/        t0        |«      d¬«       t3        j4                  d|j(                  | «       | dddœS 7 �Œ77 Œ³# t6        $ r,}	t3        j8                  d| |	«       | ddd|	› d�dœcY d}	~	S d}	~	ww xY w# t        $ r ‚ t6        $ r1}
t3        j:                  d |
«       t        dt=        |
«      ¬«      ‚d}
~
ww xY w­w)!zcApprove a pending guardrail submission: set status to active and initialize in memory (admin only).r   rƒ   rK   r¹   úAdmin access requiredr�   NrŒ   r»   rh   rU   rÐ   rE  ró   r¿   ú(Guardrail is not pending review (status=ú)rô   ©rî   rü   rˆ   ©rS   rM   z.Guardrail litellm_params is missing or invalid)rh   ri   rc   rj   r…   r‰   r½   z8Approved guardrail %s (ID: %s) and initialized in memoryz8Failed to initialize approved guardrail %s in memory: %szGuardrail approvedz@Guardrail was marked active but failed to initialize in memory: z.. It will be picked up on the next sync cycle.)rh   rî   ÚmessagerÇ   ©rh   rî   rM  z(Error approving guardrail submission: %s)r�   r„   r{   rH   rÀ   r   rÁ   r   rL   r
  rî   r   r  r   r  Úupdater  rc   rj   rh   ri   r…   rÃ   r   r.   r   rÄ   rš   rÇ   r›   rœ   )rh   r�   r„   rH   rQ   r  rc   rj   Úguardrail_dictÚinit_errr­   s              rE   Úapprove_guardrail_submissionrR  Ï  sI  è ø€ õ XÝ8à×"Ñ"Ô&6×&BÑ&BÒBÜ¨Ð4KÔLÐLàÐÜ¨Ð4SÔTÐTð<<Ü,¨]Ó;×GÑGÈ~Ð_kÐNlÐGÓm×mˆØˆ;Ü¨CÐ8XÔYÐYØ�:‰:Ð)Ò)ÜØØAÀ#Ç*Á*ÀÈQÐOôð ô
 —\‘\¤(§,¡,Ó/ˆÜ Ó.×5Ñ5Ø! <Ð0Ø$°SÈÑLð 6ó 
÷ 	
ð 	
ô
 !2°#×2DÑ2DÓ EˆÜ 1°#×2DÑ2DÓ EˆÙÜØØGôð ð
  ×,Ñ,Ø!×0Ñ0Ø,Ø,Ò2°Ø—{‘{ñ!
ˆð	Ø'×<Ñ<ÄtÌIÐWeÓGfÐosÐ<ÔtÜ ×%Ñ%ØJØ×"Ñ"Øôð( )ØØ+ñ
ð 	
ðe nùð	
ùô4 ò 	Ü ×(Ñ(ØJØØôð !-Ø"Ø/Ø]Ð^fÐ]gð h?ð ?ñ	õ ûð	ûô& ò ØÜò <Ü×&Ñ&Ð'QÐSTÔUÜ¨´C¸³FÔ;Ð;ûð<üs‡   ‚AH#Á	 G Á)F Á*BG Ã/F#Ã0A'G ÅAF% ÆG ÆH#Æ G Æ#G Æ%	GÆ.!GÇGÇG ÇH#ÇGÇG ÇH Ç/,HÈH È H#z-/guardrails/submissions/{guardrail_id}/rejectc              ƒ   ó€  K  — ddl m} |j                  t        j                  k7  rt        dd¬«      ‚|€t        dd¬«      ‚	 t        |«      j                  d	| i¬
«      ƒ d{  –—† }|€t        dd¬«      ‚|j                  dk7  rt        dd|j                  › d�¬«      ‚t        j                  t        j                  «      }t        |«      j                  d	| id||dœ¬«      ƒ d{  –—†  | dddœS 7 Œ�7 Œ# t
        $ r ‚ t        $ r1}t        j                   d|«       t        dt#        |«      ¬«      ‚d}~ww xY w­w)z+Reject a guardrail submission (admin only).r   rK   r¹   rH  r�   NrŒ   r»   rh   rU   rÐ   rE  ró   r¿   rI  rJ  rõ   rK  rL  zGuardrail rejectedrN  z(Error rejecting guardrail submission: %s)r{   rH   rÀ   r   rÁ   r   rL   r
  rî   r   r  r   r  rO  rš   r   r›   rœ   )rh   r�   rH   rQ   r  r­   s         rE   Úreject_guardrail_submissionrT     sP  è ø€ õ 9à×"Ñ"Ô&6×&BÑ&BÒBÜ¨Ð4KÔLÐLàÐÜ¨Ð4SÔTÐTð<Ü,¨]Ó;×GÑGÈ~Ð_kÐNlÐGÓm×mˆØˆ;Ü¨CÐ8XÔYÐYØ�:‰:Ð)Ò)ÜØØAÀ#Ç*Á*ÀÈQÐOôð ô
 —\‘\¤(§,¡,Ó/ˆÜ Ó.×5Ñ5Ø! <Ð0Ø&°sÈ#ÑNð 6ó 
÷ 	
ð 	
ð
 )Ø Ø+ñ
ð 	
ð nøð	
ùô ò ØÜò <Ü×&Ñ&Ð'QÐSTÔUÜ¨´C¸³FÔ;Ð;ûð<üsO   ‚A D>Á C8 Á#C4Á$BC8 Ã)C6Ã*	C8 Ã3D>Ã4C8 Ã6C8 Ã8D;Ä
,D6Ä6D;Ä;D>c              ƒ   ó¬  K  — ddl m} ddlm} |j                  t
        j                  k7  rt        dd¬«      ‚|€t        dd	¬«      ‚	 t        j                  | |¬
«      ƒ d{  –—† }|€t        dd| › d�¬«      ‚|j                  �|j                  n|j                  d«      }t        t        |j                  di «      «      «      }t        di |¤Ž}|j                  �U|j                  j!                  d¬«      }	|j!                  d¬«      }
|
j#                  |	«       t        |
«      }t        di |¤Ž}|j$                  �|j$                  n|j                  di «      }t'        | |xs d||¬«      }t        t        j)                  | ||¬«      ƒ d{  –—† «      }|j                  dd«      }	 |j+                  |¬«       t-        j.                  d|| «       |S 7 �Œu7 ŒI# t0        t2        f$ rp}t        j)                  | t'        | |j                  d«      xs dt        di |¤Ž|j                  di «      ¬«      |¬«      ƒ d{  –—†7   t        dd|› �¬«      |‚d}~wt4        $ r#}t-        j6                  d|| |«       Y d}~|S d}~ww xY w# t        $ r}|‚d}~wt4        $ r1}t-        j8                  d|«       t        dt;        |«      ¬«      ‚d}~ww xY w­w)u¼  
    Partially update an existing guardrail

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

    This endpoint allows updating specific fields of a guardrail without sending the entire object.
    Only the following fields can be updated:
    - guardrail_name: The name of the guardrail
    - default_on: Whether the guardrail is enabled by default
    - guardrail_info: Additional information about the guardrail

    Example Request:
    ```bash
    curl -X PATCH "http://localhost:4000/guardrails/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "guardrail_name": "updated-name",
            "default_on": true,
            "guardrail_info": {
                "description": "Updated description"
            }
        }'
    ```

    Example Response:
    ```json
    {
        "guardrail_id": "123e4567-e89b-12d3-a456-426614174000",
        "guardrail_name": "updated-name",
        "litellm_params": {
            "guardrail": "bedrock",
            "mode": "pre_call",
            "guardrailIdentifier": "ff6ujrregl1q",
            "guardrailVersion": "DRAFT",
            "default_on": true
        },
        "guardrail_info": {
            "description": "Updated description"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T14:22:33.456Z"
    }
    ```
    r   rƒ   rK   r¹   rº   r�   NrŒ   r»   rÏ   rÐ   rÑ   rÒ   ri   rc   T)Úexclude_unsetrj   r8  rk   rÓ   r¼   )rr   rÔ   i¦  z2Invalid guardrail configuration, update rejected: rÕ   zError updating guardrail: %srD   )r�   r„   r{   rH   rÀ   r   rÁ   r   r?   rÖ   ri   ro   rF   r~   r4   rc   r—   rO  rj   r.   r×   Úsync_guardrail_from_dbr   rÄ   rÅ   rÆ   rš   rÇ   r›   rœ   )rh   r·   r�   r„   rH   rÙ   ri   Úexisting_litellm_paramsrc   Úrequested_litellm_paramsr¥   Úmerged_litellm_paramsrj   rr   rÈ   rÚ   r­   s                    rE   Úpatch_guardrailr[  L  s9  è ø€ õl XÝ8à×"Ñ"Ô&6×&BÑ&BÒBÜØØ?ô
ð 	
ð
 ÐÜ¨Ð4SÔTÐTð\<ä*<×*XÑ*XØ%°]ð +Yó +
÷ %
Ðð Ð%Ü¨CÐ:LÈ\ÈNÐZdÐ8eÔfÐfð '.×&<Ñ&<Ð&HˆG×"Ò"ÐN`×NdÑNdÐeuÓNvð 	ô
 *@ÄÐEW×E[ÑE[Ð\lÐnpÓEqÓ@rÓ)sÐÜ&ÑAÐ)@ÑAˆØ×!Ñ!Ð-Ø.5×.DÑ.D×.OÑ.OÐ^bÐ.OÓ.cÐ$Ø)7×)BÑ)BÐQUÐ)BÓ)VÐØ×&Ñ&Ð'?Ô@Ü+AÐBUÓ+VÐ!Ü*ÑCÐ-BÑCˆNð
 ×%Ñ%Ð1ð ×"Ò"à#×'Ñ'Ð(8¸"Ó=ð 	ô %Ø%Ø)Ò/¨RØ)Ø)ô	
ˆ	ô /Ü$×;Ñ;Ø)Ø#Ø+ð <ó ÷ ó
ˆð  Ÿ™Ð$4°iÓ@ˆð%	Ø'×>Ñ>Ø#ð ?ô ô !×%Ñ%ØNÐP^Ð`lôðF ˆðk%
ùðJùô  œIÐ&ò 	 ô %×;Ñ;Ø)Ü#Ø!-Ø#5×#9Ñ#9Ð:JÓ#KÒ#QÈrÜ#0Ñ#KÐ3JÑ#KØ#5×#9Ñ#9Ø(Øó$ô	ð ,ð <ó ÷ ñ ô  ØØKÈLÈ>ÐZôð  ð ûô ò 	Ü ×(Ñ(ØNØØØ÷	ð ð ˆûð	ûô ò ØˆûÜò <Ü×&Ñ&Ð'EÀqÔIÜ¨´C¸³FÔ;Ð;ûð<üs¤   ‚AKÁ	J	 Á#GÁ$D-J	 ÆGÆJ	 Æ-)G ÇJ	 ÇKÇJ	 ÇJ	 ÇJÇ,AIÉ IÉIÉJÉ#JÉ;J	 Ê KÊJÊJ	 Ê		KÊJÊKÊ ,KËKËK)rv   rw   z/guardrails/{guardrail_id}/infoc           
   ƒ   ó  K  — ddl m} ddlm} ddlm} ddlm} 	 |j                  }|�t        j                  | |¬«      ƒ d{  –—† nd}|€6|j                  | ¬«      }|�"|j                  | «      d	k(  r|}|j                  }|€t        d
d| › d�¬«      ‚|j                  d«      }t!        |t"        «      r|j%                  d¬«      n|xs i }	 ||	dd¬«      }
|
rt'        di |
¤Žnd}t)        |j                  d«      |j                  d«      |t+        |j                  d«      xs i «      |j                  d«      |j                  d«      |¬«      S 7 �Œ# t        $ r}|‚d}~wt,        $ r}t        dt/        |«      ¬«      ‚d}~ww xY w­w)u«  
    Get detailed information about a specific guardrail by ID

    ðŸ‘‰ [Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/quick_start)

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

    Example Response:
    ```json
    {
        "guardrail_id": "123e4567-e89b-12d3-a456-426614174000",
        "guardrail_name": "my-bedrock-guard",
        "litellm_params": {
            "guardrail": "bedrock",
            "mode": "pre_call",
            "guardrailIdentifier": "ff6ujrregl1q",
            "guardrailVersion": "DRAFT",
            "default_on": true
        },
        "guardrail_info": {
            "description": "Bedrock content moderation guardrail"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T12:34:56.789Z"
    }
    ```
    r   ra   rƒ   rK   )ÚGUARDRAIL_DEFINITION_LOCATIONNrÏ   rÝ   r|   rÐ   rÑ   rÒ   r�   rc   Tr†   rd   re   rh   ri   rj   rY   rˆ   rŠ   rŒ   rD   )rn   rb   r�   r„   r{   rH   Úlitellm.types.guardrailsr]  ÚDBr?   rÖ   Úget_guardrail_by_idr™   ÚCONFIGr   ro   r–   r4   r—   r,   r0   r~   rš   rœ   )rh   rb   r„   rH   r]  r‹   rÈ   Ú	in_memoryrc   Úresult_litellm_params_dictr¦   r§   r­   s                rE   Úget_guardrail_inford  í  sº  è ø€ õV NÝWÝ8ÝFð,<ØGd×GgÑGgÐ%ð Ð(ô %×@Ñ@ÈlÐjwÐ@Óx×xÐxàð 	ð
 ˆ>Ø:×NÑNÐ\hÐNÓiˆIð Ð$Ð)D×)OÑ)OÐP\Ó)]ÐaiÒ)iØ"�Ø0M×0TÑ0TÐ-àˆ>Ü¨CÐ:LÈ\ÈNÐZdÐ8eÔfÐfà=C¿Z¹ZÐHXÓ=Yˆô ˜.¬-Ô8ð ×%Ñ%°4Ð%Ô8àò-ð ð	 	#ñ
 -?Ø&ØØ !ô-
Ð"ñ
 TnÔ 1Ñ OÐ4NÒ OÐswÐä$ØŸ™ NÓ3Ø!Ÿ:™:Ð&6Ó7Ø0Ü §
¡
Ð+;Ó <Ò BÀÓCØ—z‘z ,Ó/Ø—z‘z ,Ó/Ø*Gô
ð 	
ð; yúôL ò ØˆûÜò <Ü¨´C¸³FÔ;Ð;ûð<üsG   ‚Fœ(E ÁEÁDE ÅFÅE Å	FÅE!Å!FÅ-FÆFÆFz%/guardrails/ui/add_guardrail_settingsc               ƒ   óÊ  K  — ddl m} m}m} ddlm} t        j                  «       D ���cg c],  \  }}|j                  |D �cg c]  }|j                  ‘Œ c}dœ‘Œ. }}}}|j                  «       D ��	�
ci c]2  \  }}	|	j                  «       x}�||D �
cg c]  }
|
j                  ‘Œ c}
“Œ4 }}	}}
t        t        D �cg c]  }|j                  ‘Œ c}t        D �cg c]  }|j                  ‘Œ c}t        D �cg c]  }|j                  ‘Œ c}|| |«       t        | j                  «       «      ddg |«       dœ¬«      S c c}w c c}}}w c c}
w c c}
}	}w c c}w c c}w c c}w ­w)	zó
    Get the UI settings for the guardrails

    Returns:
    - Supported entities for guardrails
    - Supported modes for guardrails
    - PII entity categories for UI organization
    - Content filter settings (patterns and categories)
    r   )ÚPATTERN_CATEGORIESÚ get_available_content_categoriesÚget_pattern_metadata©Úguardrail_class_registry)ÚcategoryÚentitiesÚBLOCKÚMASK)Úprebuilt_patternsÚpattern_categoriesÚsupported_actionsÚcontent_categories)Úsupported_entitiesrq  Úsupported_modesÚsupported_modes_by_providerÚpii_entity_categoriesÚcontent_filter_settings)ÚHlitellm.proxy.guardrails.guardrail_hooks.litellm_content_filter.patternsrf  rg  rh  r�   rj  r)   rB  r  Úget_supported_event_hooksr1   r7   r6   r/   r}   Úkeys)rf  rg  rh  rj  rk  rl  ÚentityÚcategory_mapsÚproviderÚguardrail_classÚhookÚhooksru  Úactionr  s                  rE   Úget_guardrail_ui_settingsr‚  L  sU  è ø€ ÷ñ õ
 Uô #<×"AÑ"AÓ"C÷ð ñ
 ˆH�hð !Ÿ™Ø4<Ö=¨&˜Ÿ›Ò=ó	
ð€Mò ð *B×)GÑ)GÓ)I÷*ð *á%ˆH�oØ$×>Ñ>Ó@Ð@ˆEÐMð 	¨%Ö0 $�4—:“:Ò0Ñ0ð*Ðò *ô +Ü7DÖE¨V˜FŸL›LÒEÜ6?Ö@¨F˜6Ÿ<›<Ò@Ü0CÖD¨˜Ÿ›ÒDØ$?Ø+á!5Ó!7Ü"&Ð'9×'>Ñ'>Ó'@Ó"AØ")¨6Ð!2Ù"BÓ"Dñ	!
ôð ùò >ùôùò 1ùô*ùò FùÚ@ùÚDùsp   ‚)E#«EÁD<ÁEÁE#Á4EÂEÂ&EÂ+E#Â<EÃ
E#ÃE
Ã,
E#Ã6EÄ	3E#Ä<EÅE#ÅEÅE#z,/guardrails/ui/category_yaml/{category_name}Úcategory_namec              ƒ   ón  K  — t         j                  j                  t         j                  j                  t        «      ddd«      }	 t        || › d�«      }t        || › d�«      }d	}d	}t         j                  j                  |«      r|}d
}n5t         j                  j                  |«      r|}d}nt        dd| › d�¬«      ‚	 t        |d«      5 }|j                  «       }d	d	d	«       | |dœS # t        $ r t        dd¬«      ‚w xY w# 1 sw Y   Œ)xY w# t        $ r}t        dd|› �¬«      ‚d	}~ww xY w­w)a  
    Get the YAML or JSON content for a specific content filter category.

    Args:
        category_name: The name of the category (e.g., "bias_gender", "harmful_self_harm")

    Returns:
        The raw YAML or JSON content of the category file with file type indicator
    Úguardrail_hooksÚlitellm_content_filterÚ
categoriesz.yamlz.jsonr¿   zInvalid category namer�   NÚyamlr  rÐ   zCategory file not found: z (tried .yaml and .json)r3  )rƒ  Úyaml_contentÚ	file_typerŒ   zError reading category file: )ÚosÚpathÚjoinÚdirnameÚ__file__r!   rÅ   r   ÚexistsÚopenÚreadrš   )	rƒ  Úcategories_dirÚ	yaml_pathÚ	json_pathÚcategory_file_pathrŠ  ÚfÚcontentr­   s	            rE   Úget_category_yamlr™    sQ  è ø€ ô  ŸG™GŸL™LÜ
�‰�‰œÓ!ØØ Øó	€NðMÜ$ ^¸°ÀeÐ5LÓMˆ	Ü$ ^¸°ÀeÐ5LÓMˆ	ð ÐØ€Iä	‡w�w‡~�~�iÔ Ø&ÐØ‰	Ü	�‰�‰˜	Ô	"Ø&ÐØ‰	äØØ.¨}¨oÐ=UÐVô
ð 	
ð
YäÐ$ cÓ*ð 	&¨aØŸV™V›XˆG÷	&ð +Ø#Ø"ñ
ð 	
øô/ ò MÜ¨Ð4KÔLÐLðMú÷(	&ð 	&ûô ò YÜ¨Ð6SÐTUÐSVÐ4WÔXÐXûðYüs[   ‚AD5ÁC. Á%AD5ÃD ÃDÃ D Ã-D5Ã.DÄD5ÄDÄD Ä	D2ÄD-Ä-D2Ä2D5z/guardrails/ui/major_airlinesc               ƒ   óª  K  — t         j                  j                  t         j                  j                  t        «      dddd«      } t         j                  j                  | «      st        dd¬«      ‚	 t        | dd	¬
«      5 }ddl} |j                  |«      }ddd«       diS # 1 sw Y   ŒxY w# t        $ r}t        dd|› �¬«      |‚d}~ww xY w­w)z•
    Get the major airlines list from IATA (competitor intent, airline type).
    Returns airline id, match variants (pipe-separated), and tags.
    r…  r†  Úcompetitor_intentzmajor_airlines.jsonrÐ   zmajor_airlines.json not foundr�   r3  zutf-8)Úencodingr   NÚairlinesrŒ   z#Error reading major_airlines.json: )r‹  rŒ  r�  rŽ  r�  r�  r   r‘  r  Úloadrš   )Úairlines_pathr—  r  r�  r­   s        rE   Úget_major_airlinesr   º  sÏ   è ø€ ô Ÿ7™7Ÿ<™<Ü
�‰�‰œÓ!ØØ ØØó€Mô �7‰7�>‰>˜-Ô(ÜØØ2ô
ð 	
ðfÜ�- ¨wÔ7ð 	+¸1Ûà'˜dŸi™i¨›lˆH÷	+ð ˜HÐ%Ð%÷		+ð 	+ûô
 ò fÜ¨Ð6YÐZ[ÐY\Ð4]Ô^ÐdeÐeûðfüsB   ‚A1CÁ4B1 ÂB%ÂB1 Â$CÂ%B.Â*B1 Â1	CÂ:CÃCÃCz'/guardrails/validate_blocked_words_filec              ƒ   ór  K  — ddl }	 | j                  dd«      }|sdddœS |j                  |«      }t        |t        «      rd|vrdd	dœS |d   }t        |t
        «      sdd
dœS g }t        |«      D ]×  \  }}t        |t        «      s|j                  d|› d�«       Œ,d|vr|j                  d|› d�«       n(t        |d   t        «      s|j                  d|› d�«       d|vr|j                  d|› d�«       n"|d   dvr|j                  d|› d|d   › d�«       d|v sŒ¯t        |d   t        «      rŒÃ|j                  d|› d�«       ŒÙ |rd|dœS ddt        |«      › d�dœS # |j                  $ r}dd|› �dœcY d}~S d}~wt        $ r'}t        j                  d«       dd|› �dœcY d}~S d}~ww xY w­w)aŸ  
    Validate a blocked_words YAML file content.

    Args:
        request: Dictionary with 'file_content' key containing the YAML string

    Returns:
        Dictionary with 'valid' boolean and either 'message'/'errors' depending on result

    Example Request:
    ```json
    {
        "file_content": "blocked_words:\n  - keyword: \"test\"\n    action: \"BLOCK\""
    }
    ```

    Example Success Response:
    ```json
    {
        "valid": true,
        "message": "Valid YAML file with 2 blocked words"
    }
    ```

    Example Error Response:
    ```json
    {
        "valid": false,
        "errors": ["Entry 0: missing 'action' field"]
    }
    ```
    r   NÚfile_contentr8  FzNo file content provided)ÚvalidÚerrorÚblocked_wordszAInvalid format: file must contain 'blocked_words' key with a listz'blocked_words' must be a listzEntry z: must be an objectÚkeywordz: missing 'keyword' fieldz: 'keyword' must be a stringr�  z: missing 'action' field)rm  rn  z): action must be 'BLOCK' or 'MASK', got 'ú'r9  z : 'description' must be a string)r£  ÚerrorsTzValid YAML file with z blocked word(s))r£  rM  zInvalid YAML syntax: z#Error validating blocked words filezValidation error: )rˆ  ro   Ú	safe_loadr–   r~   r}   Ú	enumeraterp   rœ   r:  Ú	YAMLErrorrš   r   r›   )	r·   rˆ  r¢  rM   Úblocked_words_listr¨  ÚidxÚ	word_datar­   s	            rE   Úvalidate_blocked_words_filer¯  Ú  s  è ø€ óL ð0CØ%Ÿk™k¨.¸"Ó=ˆÙØ"Ð-GÑHÐHà—n‘n \Ó2ˆä˜$¤Ô%¨ÀÑ)DàØ\ñð ð
 %)¨Ñ$9ÐÜÐ,¬dÔ3Ø"Ð-MÑNÐNð ˆÜ'Ð(:Ó;ò 	N‰NˆC�Ü˜i¬Ô.Ø—‘  s eÐ+>Ð?Ô@Øà 	Ñ)Ø—‘  s eÐ+DÐEÕFÜ 	¨)Ñ 4´cÔ:Ø—‘  s eÐ+GÐHÔIà˜yÑ(Ø—‘  s eÐ+CÐDÕEØ˜8Ñ$Ð,=Ñ=Ø—‘  s eÐ+TÐU^Ð_gÑUhÐTiÐijÐkÔlà 	Ò)´*¸YÀ}Ñ=UÔWZÕ2[Ø—‘  s eÐ+KÐLÕMð!	Nñ$ Ø"¨fÑ5Ð5ð Ø.¬sÐ3EÓ/FÐ.GÐGWÐXñ
ð 	
øð �>‰>ò FØÐ+@ÀÀÐ)DÑEÕEûÜò CÜ×&Ñ&Ð'LÔMØÐ+=¸a¸SÐ)AÑBÕBûðCüs‡   ‚F7ˆE%  F7¡)E% Á
F7ÁE% Á$F7Á%B;E% Ä!E% Ä5E% ÅF7ÅE% Å$F7Å%F4Å4FÅ;F4Å<F7ÆF4ÆF/Æ)F4Æ*F7Æ/F4Æ4F7Ú
annotationc                 ó    — t        | dd «      }|S )NÚ
__origin__©r'  ©r°  Úorigins     rE   Ú_dunder_originr¶  5  s   € Ü# J°¸dÓC€FØ€MrG   c                 ó    — t        | dd «      }|S )Nr²   r³  )r°  Únames     rE   Ú_dunder_namer¹  :  s   € Ü! *¨j¸$Ó?€DØ€KrG   .c                 ó    — t        | dd«      }|S )NÚ__args__rD   r³  )r°  Úargss     rE   Ú_dunder_argsr½  ?  s   € Ü&-¨j¸*ÀbÓ&I€DØ€KrG   Úfield_annotationc                 ó  — t        | «      t        u st        | «      t        u r/t        | «      }|D �cg c]  }|t	        d«      usŒ|‘Œ }}|r|d   } t        | d«      rt        | «      t        u ryt        | d«      rt        | «      t        u ryt        | d«      r2t        | d«      r&t        | «      }t        |d«      rt        |«      dk(  ry	| t        u ry
| t        u s| t        u ry| t        u ry| t        u ry| t        u ryy
c c}w )zG
    Convert a Python type annotation to a UI-friendly type string
    Nr   r²  Úarrayr~   r»  r²   r   ÚselectÚstringÚnumberÚbooleanrë   )r   r   r	   r   ÚtypeÚhasattrr¶  r}   r~   r¹  rœ   rö   Úfloatrý   )r¾  r¼  ÚargÚnon_none_argsrµ  s        rE   Ú_get_field_type_from_annotationrÊ  D  s  € ô
 Ð"Ó#¤uÑ,´
Ð;KÓ0LÔPYÑ0Yä*2Ð3CÓ*DˆØ/3ÖM¨°sÄ$ÀtÃ*Ò7L¢ÐMˆÐMÙØ,¨QÑ/Ðô Ð Ô.´>ÐBRÓ3SÔW[Ñ3[Øô Ð Ô.´>ÐBRÓ3SÔW[Ñ3[Øô Ð Ô.´7Ð;KÈZÔ3Xä&Ð'7Ó8ˆÜ�6˜:Ô&¬<¸Ó+?À9Ò+LØð œ3ÑØØ	œSÑ	 Ð$4¼Ñ$=ØØ	œTÑ	!ØØ	œTÑ	!ØØ	œTÑ	!Øð ùòA  Ns   ²DÁDc                 ó¨   — t        | d«      rEt        | d«      r9t        | «      }t        |d«      r"t        |«      dk(  rt        t	        | «      «      S g S )z?
    Extract literal values from a Literal type annotation
    r²  r»  r²   r   )rÆ  r¶  r¹  r}   r½  r´  s     rE   Ú_extract_literal_valuesrÌ  o  sL   € ô ˆz˜<Ô(¬W°ZÀÔ-LÜ& zÓ2ˆÜ�6˜:Ô&¬<¸Ó+?À9Ò+LÜœ ZÓ0Ó1Ð1Ø€IrG   c                 ó¨   — t        | d«      rFt        | «      t        u r5t        | d«      r)t        | «      }t	        |«      dk\  r|d   }t        |«      S y)z>
    Extract key options from Dict[Literal[...], T] types
    r²  r»  é   r   N)rÆ  r¶  r~   r½  r:  rÌ  )r¾  r¼  Úkey_types      rE   Ú_get_dict_key_optionsrÐ  z  sU   € ô
 	Ð  ,Ô/ÜÐ+Ó,´Ñ4ÜÐ$ jÔ1ä"Ð#3Ó4ˆÜˆt‹9˜Š>Ø" 1™gˆHÜ*¨8Ó4Ð4ØrG   c                 ó¨   — t        | d«      rFt        | «      t        u r5t        | d«      r)t        | «      }t	        |«      dk\  r|d   }t        |«      S y)z2
    Get the value type from Dict[K, V] types
    r²  r»  rÎ  r/  rÂ  )rÆ  r¶  r~   r½  r:  rÊ  )r¾  r¼  Ú
value_types      rE   Ú_get_dict_value_typerÓ  Š  sU   € ô
 	Ð  ,Ô/ÜÐ+Ó,´Ñ4ÜÐ$ jÔ1ä"Ð#3Ó4ˆÜˆt‹9˜Š>Ø $ Q¡ˆJÜ2°:Ó>Ð>ØrG   c                 ó¨   — t        | d«      rFt        | «      t        u r5t        | d«      r)t        | «      }t	        |«      dk\  r|d   }t        |«      S y)z?
    Extract element options from List[Literal[...]] types
    r²  r»  r/  r   N)rÆ  r¶  r}   r½  r:  rÌ  )r¾  r¼  Úelement_types      rE   Ú_get_list_element_optionsrÖ  š  sU   € ô
 	Ð  ,Ô/ÜÐ+Ó,´Ñ4ÜÐ$ jÔ1ä"Ð#3Ó4ˆÜˆt‹9˜Š>Ø"& q¡'ˆLÜ*¨<Ó8Ð8ØrG   Ú
field_namec                 ó@  — | dk7  ry|€yt        |t        «      st        |d«      rt        |«      t        u ryt        |d«      rt	        |«      dv ryt        |d«      r<t        |«      D �cg c]  }|t        d«      usŒ|‘Œ }}|rt        |d	   t        «      ryyc c}w )
zOCheck if optional_params field should be skipped (not meaningfully overridden).Úoptional_paramsFNTr²  r²   )ÚTr   r»  r   )r–   r   rÆ  r¶  r¹  r½  rÅ  )r×  r¾  rÈ  rÉ  s       rE   Ú_should_skip_optional_paramsrÛ  ª  s·   € àÐ&Ò&ØàÐØô Ð"¤GÔ,ÜÐ  ,Ô/´NÐCSÓ4TÔX_Ñ4_àô Ð Ô,´Ð>NÓ1Oð Tñ 2ð ô Ð Ô,Ü/;Ð<LÓ/MÖg¨ÐQTÔ\`ÐaeÓ\fÒQf¢ÐgˆÐgÙœZ¨°aÑ(8¼'ÔBØàùò	  hs   Á+BÁ>Bc                 ó²   — t        | «      t        u st        | «      t        u r/t        | «      }|D �cg c]  }|t	        d«      usŒ|‘Œ }}|r|d   S | S c c}w )z-Unwrap Optional types to get the actual type.Nr   )r   r   r	   r   rÅ  )r¾  r¼  rÈ  rÉ  s       rE   Ú_unwrap_optional_typerÝ  È  sa   € äÐ"Ó#¤uÑ,´
Ð;KÓ0LÔPYÑ0Yä*2Ð3CÓ*DˆØ/3ÖM¨°sÄ$ÀtÃ*Ò7L¢ÐMˆÐMÙØ  Ñ#Ð#ØÐùò  Ns   ²AÁAÚfieldr=   r9  Úrequiredc                 óº  — t        |«      }t        | di «      }|rd|v r|d   }t        |d|«      }n|r	d|v r|d   }|||dœ}|dk(  r#t        |«      }|r||d<   t        |«      }	|	|d<   n|d	k(  rt	        |«      }
|
r
|
|d
<   d|d<   |rd
|v r	|d
   |d
<   n|dk(  rt        |«      }|r||d
<   t        | dd«      }|�	|dur||d<   |rdD ]  }||v sŒ||   ||<   Œ |S )z-Build field dictionary for non-nested fields.Újson_schema_extraÚui_typer  rÅ  )r9  rß  rÅ  r~   Údict_key_optionsÚdict_value_typerÀ  ÚoptionsÚmultiselectrÁ  ÚdefaultN.Údefault_value)ÚminÚmaxÚsteprè  )rÊ  r'  rÐ  rÓ  rÖ  rÌ  )rÞ  r¾  r9  rß  Ú
field_typeÚfield_json_schema_extrarâ  Ú
field_dictrã  rä  Úlist_element_optionsÚliteral_optionsÚfield_defaultÚkeys                 rE   Ú_build_field_dictró  Ó  sj  € ô 1Ð1AÓB€Jô <CÀ5ÐJ]Ð_aÓ;bÐÙ 9Ð0GÑ#GØ0°Ñ;ˆÜ˜W g¨wÓ7‰
Ù	  VÐ/FÑ%FØ,¨VÑ4ˆ
ð #ØØñ€Jð �VÒä"7Ð8HÓ"IÐÙØ-=ˆJÐ)Ñ*ô "6Ð6FÓ!GˆØ(7ˆ
Ð$Ò%à	�wÒ	ä&?Ð@PÓ&QÐÙØ$8ˆJ�yÑ!Ø!.ˆJ�vÑñ  9Ð0GÑ#GØ 7¸	Ñ Bˆ
�9ÒØ	�xÒ	ä!8Ð9IÓ!JˆÙØ$3ˆJ�yÑ!ô $+¨5°)¸TÓ#B€MØÐ  ]¸#Ñ%=Ø&3ˆ
�?Ñ#ñ Ø:ò 	?ˆCØÐ-Ò-Ø"9¸#Ñ">�
˜3’ð	?ð ÐrG   ÚmodelÚdepthc                 ó  — |t         kD  rt        ddt         › d�¬«      ‚i }| j                  j                  «       D ]Â  \  }}|j                  }t        ||¬«      rŒ |€Œ#t        |¬«      }|j                  xs |}|j                  «       }t        j                  |«      xr t        |t        «      xr |t        u}|r/t        t        t        t           |«      |dz   «      }	||d|	d	œ||<   Œ±t!        ||||¬
«      ||<   ŒÄ |S )Nr¿   zMax depth of z` exceeded while processing model fields. Please check the model structure for excessive nesting.r�   )r×  r¾  )r¾  r/  Únested)r9  rß  rÅ  Úfields)rÞ  r¾  r9  rß  )r   r   Úmodel_fieldsrB  r°  rÛ  rÝ  r9  Úis_requiredÚinspectÚisclassÚ
issubclassr   Ú_extract_fields_recursiver   rÅ  ró  )
rô  rõ  rø  r×  rÞ  r¾  r9  rß  Úis_basemodel_subclassÚnested_fieldss
             rE   rþ  rþ    sB  € ð
 Ô(Ò(ÜØØ"Ô#<Ð"=ð  >^ð  _ô
ð 	
ð
 €Fà"×/Ñ/×5Ñ5Ó7ò 'Ñˆ
�EØ ×+Ñ+Ðô (°:ÐP`ÕaØð Ð#Øä0ÐBRÔSÐð ×'Ñ'Ò5¨:ˆØ×$Ñ$Ó&ˆô �O‰OÐ,Ó-ò 2ÜÐ+¬YÓ7ò2à ¬	Ð1ð 	ñ !ä5´d¼4Ä	¹?ÐL\Ó6]Ð_dÐghÑ_hÓiˆMà*Ø$Ø Ø'ñ	"ˆF�:Òô "3ØØ!1Ø'Ø!ô	"ˆF�:ÒðE'ðR €MrG   Úmodel_classc                 ó   — t        | d¬«      S )zO
    Get the fields from a Pydantic model as a nested dictionary structure
    r   )rõ  )rþ  )r  s    rE   Ú_get_fields_from_modelr  N  s   € ô
 % [¸Ô:Ð:rG   z'/guardrails/ui/provider_specific_paramsc               ƒ   ó4  K  — t        t        «      } t        t        «      }t        t        «      }t        t        «      }t	        j
                  «       |d<   t        j                  j                  | t        j                  j                  |t        j                  j                  |t        j                  j                  |i}ddlm} |j                  «       D ]=  \  }}|j                  «       }|sŒt        |«      }	|j                  «       }
|
|	d<   |	||<   Œ? |S ­w)a…  
    Get provider-specific parameters for different guardrail types.

    Returns a dictionary mapping guardrail providers to their specific parameters,
    including parameter names, descriptions, and whether they are required.

    Example Response:
    ```json
    {
        "bedrock": {
            "guardrailIdentifier": {
                "description": "The ID of your guardrail on Bedrock",
                "required": true,
                "type": null
            },
            "guardrailVersion": {
                "description": "The version of your Bedrock guardrail (e.g., DRAFT or version number)",
                "required": true,
                "type": null
            }
        },
        "azure_content_safety_text_moderation": {
            "api_key": {
                "description": "API key for the Azure Content Safety Text Moderation guardrail",
                "required": false,
                "type": null
            },
            "optional_params": {
                "description": "Optional parameters for the Azure Content Safety Text Moderation guardrail",
                "required": true,
                "type": "nested",
                "fields": {
                    "severity_threshold": {
                        "description": "Severity threshold for the Azure Content Safety Text Moderation guardrail across all categories",
                        "required": false,
                        "type": null
                    },
                    "categories": {
                        "description": "Categories to scan for the Azure Content Safety Text Moderation guardrail",
                        "required": false,
                        "type": "multiselect",
                        "options": ["Hate", "SelfHarm", "Sexual", "Violence"],
                        "default_value": None
                    }
                }
            }
        }
    }
    ```
    Úui_friendly_namer   ri  )r  r-   r8   r2   r:   r  r9   ÚBEDROCKr  ÚPRESIDIOÚ	LAKERA_V2ÚTOOL_PERMISSIONr�   rj  rB  Úget_config_model)Úbedrock_fieldsÚpresidio_fieldsÚlakera_v2_fieldsÚtool_permission_fieldsÚprovider_paramsrj  ri   r~  Úguardrail_config_modelrø  r  s              rE   Úget_provider_specific_paramsr  V  s  è ø€ ôr 3Ô3NÓO€NÜ3Ô4\Ó]€OÜ4Ô5QÓRÐÜ$:Ô;]Ó$^Ðä1S×1dÑ1dÓ1fÐÐ-Ñ.ô 	'×.Ñ.×4Ñ4°nÜ&×/Ñ/×5Ñ5°Ü&×0Ñ0×6Ñ6Ð8HÜ&×6Ñ6×<Ñ<Ð>Tð	€Oõ Uà+C×+IÑ+IÓ+Kò 5Ñ'ˆ˜Ø!0×!AÑ!AÓ!CÐâ!Ü+Ð,BÓCˆFØ5×FÑFÓHÐØ)9ˆFÐ%Ñ&Ø.4ˆO˜NÒ+ð5ð Ðùs   ‚C,DÃ/)Dc                   ób   — e Zd ZU dZeed<   	 eeef   ed<   	 dZeed<   	 dZ	eeef   dz  ed<   y)ÚTestCustomCodeGuardrailRequestz1Request model for testing custom code guardrails.Úcustom_codeÚ
test_inputr·   Ú
input_typeNÚrequest_data)
r²   r³   r´   rê   rœ   rµ   r~   rë   r  r  rD   rG   rE   r  r  ­  sH   … Ù;àÓØGà�S˜&�[Ñ!Ó!Ømà€J�ÓØ?à-1€L�$�s˜F�{Ñ# dÑ*Ó1ØOrG   r  c                   óh   — e Zd ZU dZe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<   y)ÚTestCustomCodeGuardrailResponsez2Response model for testing custom code guardrails.ÚsuccessNrÈ   r¤  Ú
error_type)r²   r³   r´   rê   rý   rµ   rÈ   r~   rœ   rë   r¤  r  rD   rG   rE   r  r  ½  sJ   … Ù<àƒMØ=à'+€FˆD��f�Ñ Ñ$Ó+ØYà€Eˆ3�‰:ÓØ,à!€J��d‘
Ó!Ø6rG   r  z/guardrails/test_custom_codec              ƒ   óJ  ‡ ‡‡‡K  — |j                   t        j                  k7  rt        dd¬«      ‚d}	 t	        «       }	 t        ‰ j                  «      }t        ||«       d|vrt        ddd¬«      S |d   Št        ‰«      st        ddd¬«      S ‰ j                  Šd‰vrg ‰d<   ‰ j                  xs i }|j                  dd«      |j                  d«      |j                  d«      |j                  d«      |j                  di «      dœŠdt        fˆˆ ˆˆfd„}	 t         j"                  j%                  d¬«      5 }|j'                  |«      }		 |	j)                  |¬«      }
	 d	d	d	«       t-        
t.        «      s't        dd d!t1        |
«      j2                  › d"�d#œ¬$«      S t        d|
¬$«      S # t        $ r}t        dd|› �d¬«      cY d	}~S d	}~wt        $ r}t        dd
|› �d¬«      cY d	}~S d	}~ww xY w# t         j"                  j*                  $ r t        dd|› d�d¬«      cY cd	d	d	«       S w xY w# 1 sw Y   ŒÔxY w# t        $ r}t        dd|› �d¬«      cY d	}~S d	}~ww xY w# t        $ r1}t5        j6                  d%|«       t        dd&|› �d¬«      cY d	}~S d	}~ww xY w­w)'uÊ  
    Test custom code guardrail logic without creating a guardrail.

    This endpoint allows admins to experiment with custom code guardrails by:
    1. Compiling the provided code in a sandbox
    2. Executing the apply_guardrail function with test input
    3. Returning the result (allow/block/modify)

    ðŸ‘‰ [Custom Code Guardrail docs](https://docs.litellm.ai/docs/proxy/guardrails/custom_code_guardrail)

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/guardrails/test_custom_code" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "custom_code": "def apply_guardrail(inputs, request_data, input_type):\n    for text in inputs[\"texts\"]:\n        if regex_match(text, r\"\\d{3}-\\d{2}-\\d{4}\"):\n            return block(\"SSN detected\")\n    return allow()",
            "test_input": {
                "texts": ["My SSN is 123-45-6789"]
            },
            "input_type": "request"
        }'
    ```

    Example Success Response (blocked):
    ```json
    {
        "success": true,
        "result": {
            "action": "block",
            "reason": "SSN detected"
        },
        "error": null,
        "error_type": null
    }
    ```

    Example Success Response (allowed):
    ```json
    {
        "success": true,
        "result": {
            "action": "allow"
        },
        "error": null,
        "error_type": null
    }
    ```

    Example Success Response (modified):
    ```json
    {
        "success": true,
        "result": {
            "action": "modify",
            "texts": ["My SSN is [REDACTED]"]
        },
        "error": null,
        "error_type": null
    }
    ```

    Example Error Response (compilation error):
    ```json
    {
        "success": false,
        "result": null,
        "error": "Syntax error in custom code: invalid syntax (<guardrail>, line 1)",
        "error_type": "compilation"
    }
    ```
    r¹   z4Admin access required to test custom code guardrailsr�   é   FzSyntax error in custom code: Úcompilation)r  r¤  r  NzFailed to compile custom code: Úapply_guardrailz|Custom code must define an 'apply_guardrail' function. Expected signature: apply_guardrail(inputs, request_data, input_type)z-'apply_guardrail' must be a callable functionÚtextsrô  z
test-modelr  r…   Úend_user_idÚmetadata)rô  r  r…   r!  r"  rA   c                  ó,   •—  ‰ ‰‰‰j                   «      S rC   )r  )Úapply_fnr·   Úsafe_request_dataÚtest_inputss   €€€€rE   Úexecute_guardrailz5test_custom_code_guardrail.<locals>.execute_guardrail\  s   ø€ Ù˜KÐ):¸G×<NÑ<NÓOÐOrG   r/  )Úmax_workers)Útimeoutz)Execution timeout: code took longer than z secondsÚ	executionzExecution error: TÚallowzExpected dict result, got z. Treating as allow.)r�  rÇ   )r  rÈ   z'Error testing custom code guardrail: %szUnexpected error: )rÀ   r   rÁ   r   r"   r#   r  ÚexecÚSyntaxErrorr  rš   Úcallabler  r  ro   rë   Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitrÈ   ÚTimeoutErrorr–   r~   rÅ  r²   r   r›   )r·   r�   ÚEXECUTION_TIMEOUT_SECONDSÚexec_globalsÚcompiledr­   Úmock_request_datar'  ÚexecutorÚfuturerÈ   r$  r%  r&  s   `          @@@rE   Útest_custom_code_guardrailr:  Í  s  ûè ø€ ðd ×"Ñ"Ô&6×&BÑ&BÒBÜØØIô
ð 	
ð
 ()Ðð_
Ü3Ó5ˆð	Ü(9¸'×:MÑ:MÓ(NˆHÜ�˜<Ô(ð  LÑ0Ü2ØðXà(ô	ð ð #/Ð/@Ñ"AˆÜ˜Ô!Ü2ØØEØ(ôð ð %×/Ñ/ˆØ˜+Ñ%Ø#%ˆK˜Ñ ð $+×#7Ñ#7Ò#=¸2Ðà&×*Ñ*¨7°LÓAØ(×,Ñ,¨YÓ7Ø(×,Ñ,¨YÓ7Ø,×0Ñ0°Ó?Ø)×-Ñ-¨j¸"Ó=ñ$
Ðð	P¤6÷ 	Pð 	Pð	Ü×#Ñ#×6Ñ6À1Ð6ÓEð 	ÈØ (§¡Ð0AÓ B�ðØ$*§M¡MÐ:S MÓ$T‘F÷	ô$ ˜&¤$Ô'Ü2Øà%Ø!;¼DÀ»L×<QÑ<QÐ;RÐRfÐgñôð ô /ØØô
ð 	
øô] ò 	Ü2ØØ5°a°SÐ9Ø(ôõ ûô
 ò 	Ü2ØØ7¸°sÐ;Ø(ôõ ûð	ûôb "×)Ñ)×6Ñ6ò Ü:Ø %Ø IÐJcÐIdÐdlÐmØ#.ôñ ÷	ñ 	ðú÷		ð 	ûô ò 	Ü2ØØ)¨!¨Ð-Ø&ôõ ûð	ûô, ò 
Ü×&Ñ&Ð'PÐRSÔTÜ.ØØ& q cÐ*Ø"ô
õ 	
ûð
üs$  †-J#´
I& ¿!F, Á I& Á1J#Á2I& ÂJ#ÂB	I& Ä H? Ä:H3ÅG5Å H? Å(6I& ÆJ#ÆI& Æ+J#Æ,	G2Æ5GÇG2ÇI& Ç
J#ÇG2ÇG-Ç'G2Ç(I& Ç,J#Ç-G2Ç2I& Ç5/H0È$H3È%	H? È.J#È/H0È0H3È3H<È8H? È?	I#ÉIÉI#ÉI& ÉJ#ÉI#É#I& É&	J É/&JÊJ ÊJ#ÊJ Ê J#Úactive_guardrailr  )r·   Úresponsec                 ój   — |dk(  r&t        | dd«      }|t        j                  k(  s|dk(  ry|dk(  rdS dS )zWReturn the effective input_type, auto-upgrading to 'response' for post_call guardrails.r·   Ú
event_hookNÚ	post_callr<  )r'  r/   r?  )r;  r  r  s      rE   Ú_resolve_guardrail_input_typer@  ‰  sD   € à�YÒÜÐ.°¸dÓCˆØÔ&×0Ñ0Ò0°D¸KÒ4GØØ# zÒ1ˆ:Ð@°yÐ@rG   c                   ób   — e Zd ZU eed<   eeef   ed<   edd„«       Zedd„«       Z	edd„«       Z
y)	Ú_GuardrailLoggingObjÚ	call_typeÚmodel_call_detailsc                  ó   — y rC   rD   rç   s    rE   Úupdate_messagesz$_GuardrailLoggingObj.update_messages–  ó   € Ø:=rG   c                  ó   — y rC   rD   rç   s    rE   Úasync_success_handlerz*_GuardrailLoggingObj.async_success_handler™  s   € ØKNrG   c                  ó   — y rC   rD   rç   s    rE   Úsuccess_handlerz$_GuardrailLoggingObj.success_handlerœ  rG  rG   N)rA   zCallable[..., object]©rA   z Callable[..., Awaitable[object]])r²   r³   r´   rœ   rµ   r~   rë   ÚpropertyrF  rI  rK  rD   rG   rE   rB  rB  ’  s@   … ØƒNØ˜S &˜[Ñ)Ó)àÚ=ó Ø=àÚNó ØNàÚ=ó Ù=rG   rB  c                   ó   — e Zd Zedd„«       Zy)Ú_GuardrailProxyLoggingc                  ó   — y rC   rD   rç   s    rE   Úpost_call_success_hookz-_GuardrailProxyLogging.post_call_success_hook¡  s   € ØLOrG   NrL  )r²   r³   r´   rM  rQ  rD   rG   rE   rO  rO     s   „ ØÚOó ÙOrG   rO  Úlitellm_logging_objc                 ó¨   — d| _         d| j                  d<   | j                  |j                  r|j                  «       yd|j                  dœg«       y)zQConfigure the logging object so Langfuse/OTEL extract input and output correctly.Úpass_through_endpointrC  Úuser)Úroler˜  N)rC  rD  rF  ÚmessagesÚtext)rR  r·   s     rE   Ú _patch_logging_obj_for_guardrailrY  ¥  sO   € à$;ÐÔ!Ø:QÐ×*Ñ*¨;Ñ7Ø×'Ñ'Ø#×,Ò,ˆ×ÑõØ<BÈwÏ|É|Ñ3\Ð2]õrG   r  r<  Ú
start_timec              ƒ   óL  K  — ddl m} 	 | j                  |||¬«      ƒ d{  –—† }t        |t        «      r|}d|j                  d¬«      i}|�ct        j                  t        j                  «      }		 |j                  |||	d	¬
«      ƒ d{  –—†  	 |j                  |j                  |||	d	«       |S |S 7 Œ‘# t
        $ r t        j                  d«       Y Œ�w xY w7 ŒN# t
        $ r t        j                  d«       Y Œlw xY w# t
        $ r t        j                  d«       Y |S w xY w­w)a   Fire proxy and LiteLLM success hooks after a successful guardrail run.

    Each hook is wrapped defensively so a callback failure never prevents the
    caller from receiving the guardrail response.  Returns the (possibly
    hook-modified) response.
    r   ©r8  )rM   r�   r<  Nz.apply_guardrail: post_call_success_hook failedr<  Tr†   F)rÈ   rZ  Úend_timeÚ	cache_hitz-apply_guardrail: async_success_handler failedz.apply_guardrail: success_handler submit failed)Ú/litellm.litellm_core_utils.thread_pool_executorr8  rQ  r–   r+   rš   r   r›   r—   r   r  r   r  rI  r2  rK  )
r  rR  rM   r�   r<  rZ  Úthread_pool_executorÚmodifiedÚresponse_for_loggingr]  s
             rE   Ú_emit_guardrail_success_logsrc  ®  sR  è ø€ õð	YØ 1× HÑ HØØ/Øð !Ió !
÷ 
ˆô
 �hÔ 6Ô7ØˆHð $.¨x×/BÑ/BÐPTÐ/BÓ/UÐ"VÐàÐ&Ü"Ÿ,™,¤x§|¡|Ó4ˆð	\Ø%×;Ñ;Ø+Ø%Ø!Øð	 <ó ÷ ð ð		]Ø ×'Ñ'Ø#×3Ñ3Ø$ØØØôð €Oˆ8€OðK
ùô ò YÜ×&Ñ&Ð'WÖXðYúðùô ò 	\Ü ×*Ñ*Ð+ZÖ[ð	\ûô ò 	]Ü ×*Ñ*Ð+[Õ\à€Oð	]üs‹   ‚D$ŠB5 ¡B3¢B5 ¸9D$Á2C Â
CÂC ÂC? Â/D$Â3B5 Â5CÃD$ÃCÃD$ÃC ÃC<Ã9D$Ã;C<Ã<D$Ã?D!ÄD$Ä D!Ä!D$z/guardrails/apply_guardrail)rx   ú/apply_guardrailÚfastapi_requestc           	   ƒ   óÀ  K  — ddl }ddlm} ddlm} ddlm}m}m}m	}	 ddl
m}
 |j                  |j                  g|j                  xs g ddid	œ}d}t        j                   t"        j$                  «      }dd
lm} 	  ||j                  ¬«      ƒ d{  –—† }|€t+        dd|j                  › d�¬«      ‚ ||¬«      }|j-                  | |||	||d¬«      ƒ d{  –—† \  }}|�t/        ||«       i |j                  �d|j                  ini ¥|j0                  �d|j0                  ini ¥}t3        ||j4                  «      }|j7                  d|j                  gi||¬«      ƒ d{  –—† }|j9                  dg «      }t;        |r|d   n|j                  ¬«      }tO        ||||||¬«      ƒ d{  –—† }|S 7 �Œ7 ŒÛ7 ŒS# t<        $ �r}|�±t?        |t*        «      s¡	 |jA                  ||jC                  «       ¬«      ƒ d{  –—†7   n$# t<        $ r tE        jF                  d«       Y nw xY w	 |jI                  |jJ                  ||jC                  «       «       n$# t<        $ r tE        jF                  d«       Y nw xY w	 |jM                  |||¬«      ƒ d{  –—†7  }t?        |t<        «      r|}n$# t<        $ r tE        jF                  d«       Y nw xY w |
|«      ‚d}~ww xY w7 �Œ0­w)zŸ
    Apply a guardrail to text input and return the processed result.

    This endpoint allows testing guardrails by applying them to custom text inputs.
    r   Nr\  )ÚProxyBaseLLMRequestProcessing)Úgeneral_settingsrz   r  Úversion)Úhandle_exception_on_proxyÚrouterd  )ri   ÚinputrW  r"  )Ú+get_initialized_guardrail_with_read_through)ri   rÐ   zGuardrail 'zM' not found. Please ensure the guardrail is configured in your LiteLLM proxy.r�   rO   r  )r·   rh  r�   ri  r  rz   Ú
route_typerW  r"  r   )Úinputsr  r  )Úresponse_text)r›   Útraceback_exceptionz-apply_guardrail: async_failure_handler failedz.apply_guardrail: failure_handler submit failed)r�   Úoriginal_exceptionr  z.apply_guardrail: post_call_failure_hook failed)r  rR  rM   r�   r<  rZ  )(Ú	tracebackr_  r8  Ú'litellm.proxy.common_request_processingrg  r{   rh  rz   r  ri  Úlitellm.proxy.utilsrj  ri   rX  rW  r   r  r   r  Ú0litellm.proxy.common_utils.registry_read_throughrm  r   Ú common_processing_pre_call_logicrY  r"  r@  r  r  ro   r+   rš   r–   Úasync_failure_handlerÚ
format_excr   r›   r2  Úfailure_handlerÚpost_call_failure_hookrc  )re  r·   r�   rs  r`  rg  rh  rz   r  ri  rj  rM   rR  rZ  rm  r;  Úrequest_processorr  Ú_input_typeÚguardrailed_inputsrp  r<  r­   Útransformed_exceptions                           rE   r  r  é  sR  è ø€ ó õõ V÷ó õ >ð "×0Ñ0Ø—,‘,�Ø×$Ñ$Ò*¨ØÐ0Ð1ñ	€Dð ÐÜ Ÿ™¤X§\¡\Ó2€JõðB+Ù@kØ"×1Ñ1ôA
÷ ;
Ðð Ð#ÜØØ$ W×%;Ñ%;Ð$<ð  =Jð  Kôð ñ
 $AÀdÔ#KÐð $×DÑDØ#Ø-Ø/ØØ/Ø%Ø(ð Eó 
÷ 
ñ	
ØØð Ð*Ü,Ð-@À'ÔJð%
Ø18×1AÑ1AÐ1M�
˜G×,Ñ,Ñ-ÐSUð%
à18×1AÑ1AÐ1M�
˜G×,Ñ,Ñ-ÐSUð%
ˆô ;Ð;KÈW×M_ÑM_Ó`ˆØ*:×*JÑ*JØ˜gŸl™l˜^Ð,Ø%Ø"ð +Kó +
÷ %
Ðð
  2×5Ñ5°g¸rÓBˆÜ)ÉM¸ÀaÒ8HÐ_f×_kÑ_kÔlˆô> 2Ø+Ø/ØØ+ØØô÷ €Hð €OðY;
ùð
øð$%
ùô ó +ØÐ*´:¸aÄÔ3Oð`Ø)×?Ñ?ØØ(1×(<Ñ(<Ó(>ð @ó ÷ ò øô ò `Ü$×.Ñ.Ð/^Ö_ð`úðaØ$×+Ñ+Ø'×7Ñ7ØØ×(Ñ(Ó*õøô
 ò aÜ$×.Ñ.Ð/_Ö`ðaúð		]Ø1B×1YÑ1YØ"3Ø#$Ø!ð 2Zó 2÷ ,ð ,Ð!ô
 Ð/´Ô;Ø)�ùÜò 	]Ü ×*Ñ*Ð+[Ö\ð	]úá'¨Ó*Ð*ûð7+úð<ûsò   ‚A:KÁ=F9 ÂF2ÂAF9 ÃF5ÃB	F9 Å#F7Å$3F9 ÆKÆ+KÆ,KÆ2F9 Æ5F9 Æ7F9 Æ9
KÇKÇ$HÇ:G=Ç;HÈ KÈH"ÈKÈ!H"È"KÈ&+IÉKÉI3É0KÉ2I3É3KÉ7J'ÊJÊJ'Ê&KÊ'KËKËKËKËKËK)rH   r>   rA   z%TableActions[LiteLLM_GuardrailsTable])r   )¢rê   Úconcurrent.futuresr/  rû  r  r‹  Úcollections.abcr   r   r   r   r   r   Útypesr	   Útypingr
   r   r   r   r   r   r   r   r   r   Úurllib.parser   Úfastapir   r   r   r   Úpydanticr   Úlitellm._loggingr   Úlitellm.constantsr   Ú%litellm.integrations.custom_guardrailr   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Úlitellm.proxy._typesr   r   Ú$litellm.proxy.auth.user_api_key_authr    Ú%litellm.proxy.common_utils.path_utilsr!   Ú<litellm.proxy.guardrails.guardrail_hooks.custom_code.sandboxr"   r#   r�   r$   Ú(litellm.proxy.guardrails.usage_endpointsr%   Úguardrails_usage_routerÚ/litellm.proxy.management_endpoints.common_utilsr&   Ú%litellm.repositories.prisma_protocolsr'   Ú'litellm.repositories.table_repositoriesr(   r^  r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   Úprisma.modelsr<   Úpydantic.fieldsr=   ru  r>   rµ   r?   rœ   rë   rF   rL   rR   rW   r^   r}   r~   rt   ro   r€   r®   r°   ÚpostrË   rÍ   ÚputrÛ   rV   rá   rã   rå   rí   rñ   rø   rÿ   r  r  r“   r)  rC  rF  rR  rT  Úpatchr[  rd  r‚  r™  r   r¯  r¶  r¹  Útupler½  rÊ  rÌ  rÐ  rÓ  rÖ  rý   rÛ  rÝ  ró  rÅ  rö   rþ  r  r  r  r  r:  r@  rB  rO  rY  rc  r  Úinclude_routerrD   rG   rE   ú<module>r›     s	
  ðòó Û Û Û 	ß BÓ Bß 'Ý ß k× k× kÝ !ç >Ó >Ý å 1Ý 7Ý AÝ Aß AÝ BÝ ;÷õ JÝ VÝ PÝ >Ý H÷÷ ÷ ÷ ÷ ñ* Ýå5Ý)å0ñ “€ˆÓ Ù-Ó/Ð �EÓ /ð G¨C°¨KÑ$8ð ¸WÀSÈ&À[Ñ=Qó ó5ð¨~ð ÀWÈSÐRXÈ[ÑEYð Ð^wó ð
?¨~ð ?ÀgÈcÐSYÈkÑFZð ?Ð_có ?ðØ!ðØ*1°#°v°+Ñ*>ðà(óð@Ø˜D‘zð@àó@ð6 ‡�ØØ
ˆÙÐ+Ó,Ð-Ø)ð	 ó ñ,=óð,=ð^ ‡�ØØ
ˆØ)ð ó ñ )0Ð0AÓ(BñF<Ø%òF<óð
F<ôR˜Yô ð ‡�ØØ
ˆð ó ñ )0Ð0AÓ(Bñ`<Ø#ð`<à%ò`<ó	ð`<ôF˜Yô ð ‡�Ø Ø
ˆð ó ñ )0Ð0AÓ(Bñf<Øðf<à#ðf<ð &òf<ó	ðf<ðR ‡�Ø Ø
ˆð ó ñ )0Ð0AÓ(BñD<ØðD<à%òD<ó	ðD<ðR  7Ð �uÓ 6ô	)˜yô 	)ô) 	ô )ô ô ô'˜iô 'ô$( yô (ð
 ‡�ØØ
ˆØ,ð ó ñ )0Ð0AÓ(Bñk<Ø%ðk<à%òk<óð
k<ð\
˜Vð 
¨¨S°#¨X©¸Ñ(=ó 
ð,°ð ,À4ÈÁ9ó ,ð0Ð!:ð Ð?Vó ð0 ‡�ØØ
ˆØ3ð ó ð ØØÙ(/Ð0AÓ(Bñ	X<Ø�$‰JðX<à�4‰ZðX<ð �$‰JðX<ð &ò	X<óð
X<ðv ‡�Ø,Ø
ˆØ*ð ó ñ )0Ð0AÓ(Bñ<Øð<à%ò<óð
<ð> ‡�Ø4Ø
ˆð ó ñ )0Ð0AÓ(BñJ<ØðJ<à%òJ<ó	ðJ<ðZ ‡�Ø3Ø
ˆð ó ñ )0Ð0AÓ(Bñ%<Øð%<à%ò%<ó	ð%<ðP ‡�Ø Ø
ˆð ó ñ )0Ð0AÓ(BñZ<ØðZ<à"ðZ<ð &òZ<ó	ðZ<ðz ‡�Ø Ø
ˆÙÐ+Ó,Ð-ð ó ð
 ‡�Ø%Ø
ˆÙÐ+Ó,Ð-ð ó ð
R<¨3ò R<óóðR<ðj ‡�Ø+Ø
ˆÙÐ+Ó,Ð-ð ó ñ
+óð
+ð\ ‡�Ø2Ø
ˆÙÐ+Ó,Ð-ð ó ð
3Y¨3ò 3Yóð
3Yðl ‡�Ø#Ø
ˆÙÐ+Ó,Ð-ð ó ñ
fóð
fð6 ‡�Ø-Ø
ˆÙÐ+Ó,Ð-ð ó ð
SC¨t°C¸°H©~ò SCóð
SCðl˜vð ¨&ó ð
˜Vð ¨ó ð
˜Vð ¨¨f°c¨kÑ(:ó ð
(°fð (Àó (ðV¨ð °8¸FÑ3Có ð¨Fð °xÀÑ7GÈ$Ñ7Nó ð ¨6ð °có ð °ð ¸8ÀFÑ;KÈdÑ;Ró ð ¨Sð ÀFð Ètó ð<¨Fð °vó ð?Øð?àð?ð ð?ð ð	?ð
 
ˆ#ˆvˆ+Ñó?ðH ñ6Ø�	‰?ð6àð6ð 
ˆ#ˆvˆ+Ñó6ðr;¨¨Y©ð ;¸DÀÀfÀÑ<Mó ;ð ‡�Ø-Ø
ˆÙÐ+Ó,Ð-ð ó ñ
Oóð
OôdP Yô Pô 7 iô 7ð  ‡�Ø"Ø
ˆØ2ð ó ñ )0Ð0AÓ(Bñt
Ø+ðt
à%òt
óð
t
ðnA°Oð AÐQTð AÐY`ÐavÑYwó Aô>˜8ô >ôP˜Xô Pð
Ð:Nð ÐYnð Ðswó ð8Ø-ð8à-°Ñ4ð8ð ð8ð &ð	8ð
 %ð8ð ð8ð ó8ðv ‡�Ð*Ð;Q€ÓRØ‡�ÐÐ0F€ÓGñ )0Ð0AÓ(BñrØðrà"ðrð &òró Hó Sðrðl × Ò Ð-Õ .rG   