Ë
    tPêj'´  ã                   ó¦	  — U d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZmZ ddlmZmZ ddlmZmZ ddlm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(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z> erddl?m@ZA  e«       ZBe	eCd<    G d„ deD«      ZE G d„ de«      ZF G d„ de«      ZG G d„ deGd ¬!«      ZH G d"„ d#e«      ZI G d$„ d%eId ¬!«      ZJ G d&„ d'e«      ZK	 d‚d(eLeM   dz  d)e=d*eNd+e
d,   d-d.d/eLeM   dz  d0eHfd1„ZOd)e=d2eMd*eNd0eNfd3„ZPd4eNd0efd5„ZQ G d6„ d7e«      ZReBj§                  d8d9g ee&«      g¬:«      e- ee&«      fd;ed<eRd=e$fd>„«       «       ZTeBj§                  d?d@g ee&«      ge;¬A«      e- ee&«      fd;ed<e:d=e$d0e;fdB„«       «       ZUeBj­                  dCd@g ee&«      ge5¬A«      e- ee&«      fd;ed=e$d0e5fdD„«       «       ZWeBj­                  dEd@g ee&«      ge4¬A«      e- ee&«      fd;edFeMd=e$d0e4fdG„«       «       ZXeBj§                  dHd@g ee&«      ge9¬A«      e- ee&«      fd;edIe6d=e$d0e9fdJ„«       «       ZYdKZZe	eCdL<   d0eLfdM„Z[eBj­                  dNd@g ee&«      g¬:«      e- ee&«      fd;ed=e$d0eLfdO„«       «       Z\ G dP„ dQe«      Z]d<e]d0e^eNeNeMf   fdR„Z_eBj§                  dSd@g ee&«      g¬:«      e- ee&«      fd<e]d;ed=e$d0eNfdT„«       «       Z`dUeMdVeLeM   dWeMd0eMfdX„ZadYeMdZeMd[eLeM   d0ee^eMdz  ebf      fd\„Zcd<e]d]eNd^eNdWeMdZeMd0eeM   fd_„ZdeBj§                  d`d@g ee&«      g¬:«       ee&«      fd<e]d;ed=e$fda„«       ZedbeMd0eMdz  fdc„ZfefddeLdZeMd0eNfde„ZgdfeMddeLd0eNeMeLeM   f   fdg„ZhefdYeMdZeMd0eLfdh„ZiddeLeM   dieNeMeLeM   f   d0eNeMeLeM   f   fdj„Zj	 d‚dkeLddeLdWeMdieNdz  d0eLf
dl„ZkddeLeM   dmeNeMeLeM   f   d0eLeN   fdn„ZlddeLeM   dmeNeMeLeM   f   d0eLeN   fdo„ZmddeLeM   dmeNeMeLeM   f   dWeMd0eLeN   fdp„Zn G dq„ dre«      ZoeBj§                  dsd@g ee&«      g¬:«      e- ee&«      fd<eod;ed=e$d0eNfdt„«       «       Zp G du„ dve«      Zq G dw„ dxe«      Zr G dy„ dze«      ZseBj§                  d{d@g ee&«      g¬:«      e- ee&«      fd<erd;ed=e$d0esfd|„«       «       Ztd}eLeN   d~eMd0eLeq   fd„Zud€eLeq   d0eMfd�„Zvy)ƒa  
POLICY MANAGEMENT

All /policy management endpoints

/policy/validate - Validate a policy configuration
/policy/list - List all loaded policies
/policy/info - Get information about a specific policy
/policy/templates - Get policy templates (GitHub with local fallback)
é    N)ÚAsyncIterator)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚcast)Ú	APIRouterÚDependsÚHTTPExceptionÚRequest)ÚResponseÚStreamingResponse)Ú	BaseModelÚField)Ú	TypedDict)Úverbose_proxy_logger)ÚCOMPETITOR_LLM_TEMPERATUREÚ"DEFAULT_COMPETITOR_DISCOVERY_MODELÚMAX_COMPETITOR_NAMES)ÚCustomGuardrail)ÚOpenAIChatCompletionsHandler)ÚUserAPIKeyAuth)Úuser_api_key_auth)Ú!RESPONSE_REJECTION_GUARDRAIL_CODEÚCustomCodeGuardrail)ÚGuardrailRegistry)Úmanagement_endpoint_wrapper©Úget_policy_registry©ÚPolicyResolver)	ÚPolicyGuardrailsResponseÚPolicyInfoResponseÚPolicyListResponseÚPolicyMatchContextÚPolicyScopeResponseÚPolicySummaryItemÚPolicyTestResponseÚPolicyValidateRequestÚPolicyValidationResponse)ÚGenericGuardrailAPIInputsÚModelResponse©ÚLoggingÚrouterc                   ó0   ‡ — e Zd ZdZdededdfˆ fd„Zˆ xZS )ÚGuardrailApplyErrorzÓ
    Raised when a guardrail's apply_guardrail fails during apply_policies.

    Consumers (e.g. Compliance UI) can use guardrail_name and message to show
    which guardrail triggered and the error reason.
    Úguardrail_nameÚmessageÚreturnNc                 óL   •— || _         || _        t        ‰| �  d|› d|› �«       y )NzGuardrail 'z
' failed: )r2   r3   ÚsuperÚ__init__)Úselfr2   r3   Ú	__class__s      €ú‚/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/policy_endpoints/endpoints.pyr7   zGuardrailApplyError.__init__F   s-   ø€ Ø,ˆÔØˆŒÜ‰Ñ˜; ~Ð&6°jÀÀ	ÐJÕKó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr7   Ú__classcell__)r9   s   @r:   r1   r1   >   s,   ø„ ñðL sð L°Sð L¸T÷ Lñ Lr;   r1   c                   ó&   — e Zd ZU dZeed<   eed<   y)ÚGuardrailErrorEntryz?One guardrail failure for ApplyPoliciesResult.guardrail_errors.r2   r3   N)r<   r=   r>   r?   r@   Ú__annotations__© r;   r:   rC   rC   L   s   … ÙIàÓØ„Lr;   rC   c                   ó,   — e Zd ZU dZeed<   ee   ed<   y)Ú_ApplyPoliciesResultBasezBBase result of apply_policies: inputs plus any guardrail failures.ÚinputsÚguardrail_errorsN©r<   r=   r>   r?   r+   rD   ÚlistrC   rE   r;   r:   rG   rG   S   s   … ÙLà%Ó%ØÐ.Ñ/Ô/r;   rG   c                   ó   — e Zd ZU dZeed<   y)ÚApplyPoliciesResultzDResult of apply_policies. agent_response set when agent_id provided.Úagent_responseN©r<   r=   r>   r?   r   rD   rE   r;   r:   rM   rM   Z   s   … ÙNàÔr;   rM   F)Útotalc                   ó,   — e Zd ZU dZeed<   ee   ed<   y)Ú_ApplyPoliciesPerItemResultBasez1Base result for one input when using inputs_list.rH   rI   NrJ   rE   r;   r:   rR   rR   `   s   … Ù;à%Ó%ØÐ.Ñ/Ô/r;   rR   c                   ó   — e Zd ZU dZeed<   y)ÚApplyPoliciesPerItemResultzWResult for one input when using inputs_list. agent_response set when agent_id provided.rN   NrO   rE   r;   r:   rT   rT   g   s   … ÙaàÔr;   rT   c                   ó"   — e Zd ZU dZee   ed<   y)ÚApplyPoliciesListResultz4Result when using inputs_list: one result per input.ÚresultsN)r<   r=   r>   r?   rK   rT   rD   rE   r;   r:   rV   rV   m   s   … Ù>àÐ,Ñ-Ô-r;   rV   Úpolicy_namesrH   Úrequest_dataÚ
input_type©ÚrequestÚresponseÚproxy_logging_objÚLiteLLMLoggingObjÚguardrail_namesr4   c              ƒ   óz  K  — g }t        «       }|r|j                  |«       | rzt        «       }|j                  «       st	        j
                  d«       nJ|j                  «       }	| D ]5  }
t        j                  |
|	d¬«      }|j                  |j                  «       Œ7 |s||dœS t        «       }t        t        t        |«      «      }t        |«      D ]Š  }|j                  |¬«      }|€t	        j
                  d|«       Œ.t!        |t"        «      sŒ?dt%        |«      j&                  vrt	        j
                  d|«       Œm	 |j)                  ||||¬	«      ƒ d{  –—† }ŒŒ ||dœS 7 Œ# t*        $ rH}t-        |«      }t	        j
                  d
||«       |j/                  t1        ||¬«      «       Y d}~Œàd}~ww xY w­w)a  
    Apply guardrails to inputs from policy names and/or a direct list of guardrail names.

    Runs all guardrails in order; if one fails, the error is recorded and execution
    continues so that all inputs can complete testing and all guardrail failures are
    collected. No exception is raised; failures are returned in guardrail_errors.

    Guardrails can be specified in two ways (both can be used together; names are merged):
    - policy_names: resolve guardrails from the policy registry (with inheritance).
    - guardrail_names: use this list of guardrail names directly (no policy registry needed).

    Returns:
        ApplyPoliciesResult with "inputs" (final GenericGuardrailAPIInputs) and
        "guardrail_errors" (list of {"guardrail_name", "message"} for each failure).
    zRapply_policies: policy engine not initialized, skipping policy-resolved guardrailsN)Úpolicy_nameÚpoliciesÚcontext©rH   rI   )r2   z2apply_policies: guardrail '%s' not found, skippingÚapply_guardrailz?apply_policies: guardrail '%s' has no apply_guardrail, skipping)rH   rY   rZ   Úlogging_objz)apply_policies: guardrail '%s' failed: %s©r2   r3   )ÚsetÚupdater   Úis_initializedr   ÚdebugÚget_all_policiesr!   Úresolve_policy_guardrailsÚ
guardrailsr   r   r+   ÚdictÚsortedÚ"get_initialized_guardrail_callbackÚ
isinstancer   ÚtypeÚ__dict__rf   Ú	Exceptionr@   ÚappendrC   )rX   rH   rY   rZ   r^   r`   rI   Úguardrail_name_setÚregistryrc   rb   ÚresolvedÚguardrail_registryÚcurrent_inputsr2   ÚcallbackÚeÚerror_reasons                     r:   Úapply_policiesr€   s   sÛ  è ø€ ð. :<Ðä*-«%ÐáØ×!Ñ! /Ô2áÜ-Ó/ˆØ×&Ñ&Ô(Ü ×&Ñ&Ødõð '×7Ñ7Ó9ˆHØ+ò ?�Ü)×CÑCØ +Ø%Ø ô�ð
 #×)Ñ)¨(×*=Ñ*=Õ>ð?ñ Ø Ð6FÑGÐGä 1Ó 3ÐÜÔ3´T¸&³\ÓB€Nä Ð!3Ó4ò $ˆØ%×HÑHÐXfÐHÓgˆØÐÜ ×&Ñ&ØDØôð Ü˜(¤OÔ4ØØ¤D¨£N×$;Ñ$;Ñ;Ü ×&Ñ&ØQØôð ð	Ø#+×#;Ñ#;Ø%Ø)Ø%Ø-ð	 $<ó $÷ ‰Nð%$ðN %Ð:JÑKÐKð+ùô ò 	Ü˜q›6ˆLÜ ×&Ñ&Ø;ØØôð
 ×#Ñ#Ü#Ø#1Ø(ô÷ñ ûð	üsB   ‚D>F;ÅE'ÅE%ÅE'ÅF;Å%E'Å'	F8Å0>F3Æ.F;Æ3F8Æ8F;Úagent_idc                 ó$  — | j                  d«      }| j                  d«      }|rt        |«      }n6|r.t        |«      dk(  r
d|d   dœg}nddj                  |«      dœg}ndddœg}||d	d
œ}|r!|j	                  di «      j                  |«       |S )zHBuild a chat completion request body from guardrail inputs and agent_id.Ústructured_messagesÚtextsé   Úuserr   ©ÚroleÚcontentú
ÚHelloF)ÚmodelÚmessagesÚstreamÚmetadata)ÚgetrK   ÚlenÚjoinÚ
setdefaultrj   )rH   r�   rY   Ú
structuredr„   r�   Úbodys          r:   Ú_chat_body_from_inputsr–   Ñ   s�   € ð Ÿ
™
Ð#8Ó9€JØ—:‘:˜gÓ&€EÙÜ˜
Ó#‰Ù	Üˆu‹:˜Š?Ø!'°E¸!±HÑ=Ð>‰Hà!'°D·I±I¸eÓ4DÑEÐF‰Hà#°Ñ8Ð9ˆØ"*¸ÈEÑR€DÙØ�‰˜
 BÓ'×.Ñ.¨|Ô<Ø€Kr;   r•   c                 óª   ‡‡— t        j                  | «      j                  «       ŠdgŠdt        fˆˆfd„}dddddgdd	d
dddddœdœ}t	        ||¬«      S )zOCreate a Starlette Request that will return the given dict as parsed JSON body.Fr4   c               “   ó4   •K  — ‰d   rddiS d‰d<   d‰ ddœS ­w)Nr   rt   zhttp.disconnectTzhttp.requestF)rt   r•   Ú	more_bodyrE   )Ú
body_bytesÚreceiveds   €€r:   Úreceivez(_request_with_json_body.<locals>.receiveê   s0   øè ø€ Ø�AŠ;ØÐ-Ð.Ð.Øˆ�‰Ø&°
ÈÑOÐOùs   ƒÚhttpÚPOSTz/v1/chat/completionsr;   )s   content-types   application/json)Ú	localhosti@  )z	127.0.0.1r   Ú Nz3.0z2.0)ÚversionÚspec_version)rt   ÚmethodÚpathÚquery_stringÚheadersÚschemeÚserverÚclientÚ	root_pathÚappÚasgi)rœ   )ÚjsonÚdumpsÚencoderp   r   )r•   rœ   Úscoperš   r›   s      @@r:   Ú_request_with_json_bodyr±   å   sp   ù€ äŸ
™
 4Ó(×/Ñ/Ó1€JØ#( '€HðPœ4ö Pð ØØ&ØØ:Ð;ØØ%Ø"ØØØ!°5Ñ9ñ€Eô �5 'Ô*Ð*r;   c                   óð   — e Zd ZU dZ edd¬«      Zee   dz  ed<    edd¬«      Z	ee   dz  ed<    eg d¬«      Z
ee   ed	<    eed
¬«      Zeed<    edd¬«      Zed   ed<    edd¬«      Zedz  ed<   y)Ú TestPoliciesAndGuardrailsRequestz:Request body for POST /utils/test_policies_and_guardrails.Nz'Policy names to resolve guardrails from©ÚdefaultÚdescriptionrX   z!Guardrail names to apply directlyr`   zaList of GenericGuardrailAPIInputs; each item processed separately (for batch compliance testing).Úinputs_listz&Request context (model, user_id, etc.))Údefault_factoryr¶   rY   r\   z&Whether inputs are request or responser[   rZ   zkWhen set, call chat completion with this model/agent for each input and include the response in the result.r�   )r<   r=   r>   r?   r   rX   rK   r@   rD   r`   r·   r+   rp   rY   rZ   r   r�   rE   r;   r:   r³   r³      s©   … ÙDá%*°4ÐEnÔ%o€L�$�s‘)˜dÑ"ÓoÙ(-°dÐHkÔ(l€O�T˜#‘Y Ñ%ÓlÙ38ØØwô4€K�Ð/Ñ0ó ñ ¨tÐAiÔj€L�$ÓjÙ16ØÐ'Oô2€J�Ð-Ñ.ó ñ !Øð Bô€Hˆc�D‰jô r;   r³   z#/utils/test_policies_and_guardrailsÚutils)ÚtagsÚdependenciesr\   ÚdataÚuser_api_key_dictc           	   ƒ   óÞ  ‡‡‡K  — ddl m} ddlmŠm} ddlm} dt        dt        fd„Šdt        d	t        d
t        dt        fˆˆˆfd„}	 t        ||«      }g }‰j                  D ]Þ  }	t        ‰j                  |	‰j                  ‰j                   |‰j"                  ¬«      ƒ d{  –—† }
|
d   |
d   dœ}‰j$                  �s ||
d   ‰j$                  |«      ƒ d{  –—† |d<   t'        t(        d¬«      }	 t+        j,                  |d   «      }t/        «       }|j1                  ||||¬«      ƒ d{  –—†  |j=                  |«       Œà tA        |¬«      S 7 Œ­7 Œy7 Œ'# t2        $ rp}t5        |d   «      |d<   t7        |dd«      }t9        |t:        «      r
d|v r|d   }nt        |�|n|«      }|d   j=                  t?        d|¬«      «       Y d}~Œ™d}~ww xY w# t2        $ r} ||«      ‚d}~ww xY w­w)a  
    Apply policies and/or guardrails to inputs (for compliance UI testing).

    Use inputs_list for batch testing: each input is processed as a separate call so
    per-input block/allow and errors are returned.

    Use inputs for a single call (legacy).
    r   r-   )Úchat_completionr^   ©Úhandle_exception_on_proxyr]   r4   c                 óf   — t        | d«      r| j                  d¬«      S t        | t        «      r| S | S )NÚ
model_dumpT)Úexclude_unset)ÚhasattrrÃ   rs   rp   )r]   s    r:   Ú_serialize_chat_responsez>test_policies_and_guardrails.<locals>._serialize_chat_response*  s4   € Ü�8˜\Ô*Ø×&Ñ&°TÐ&Ó:Ð:Ü�h¤Ô%ØˆOØˆr;   rH   r�   r½   c              “   ó    •K  — t        | |‰	j                  «      }t        |«      }t        «       } ‰||||¬«      ƒ d {  –—† } ‰|«      S 7 Œ­w)N)r\   Úfastapi_responserŒ   r½   )r–   rY   r±   r   )
rH   r�   r½   r•   ÚreqÚrespÚresultrÆ   r¿   r¼   s
          €€€r:   Ú_get_agent_responsez9test_policies_and_guardrails.<locals>._get_agent_response1  s[   øè ø€ ô
 -¨V°X¸t×?PÑ?PÓQˆÜ,¨TÓ2ˆÜ“jˆÙ-ØØ!ØØ/ô	
÷ 
ˆñ (¨Ó/Ð/ð
ús   ƒ<A¿AÁ A)rX   rH   rY   rZ   r^   r`   NrI   re   rN   Úresponse_rejection)Úcustom_coder2   )r]   Úguardrail_to_applyÚlitellm_logging_objr½   ÚdetailÚerrorrh   )rW   )"Ú*litellm.litellm_core_utils.litellm_loggingr.   Úlitellm.proxy.proxy_serverr¿   r^   Úlitellm.proxy.utilsrÁ   r   r+   r@   r   r   r·   r€   rX   rY   rZ   r`   r�   r   r   r,   Úmodel_validater   Úprocess_output_responserv   rK   Úgetattrrs   rp   rw   rC   rV   Ú
ValueError)r\   r¼   r½   r_   r^   rÁ   rÌ   rg   rW   ÚinpÚitem_resultÚitemÚresponse_rejection_guardrailÚmodel_responseÚhandlerÚguardrail_errrÑ   Úerr_msgr~   rÆ   r¿   s    `                 @@r:   Útest_policies_and_guardrailsrâ     s2  úè ø€ õ& XßMÝ=ð¬3ð ´3ó ð0Ü)ð0äð0ô *ð0ô 
÷	0ð 6+Ü!Ð"3Ð5FÓGˆà;=ˆØ×#Ñ#ò .	!ˆCÜ .Ø!×.Ñ.ØØ!×.Ñ.ØŸ?™?Ø"-Ø $× 4Ñ 4ô!÷ ˆKð & hÑ/Ø$/Ð0BÑ$Cñ0ˆDð �}‰}Ð(Ù/BØ Ñ)Ø—M‘MØ%ó0÷ *�Ð%Ñ&ô 0CÜ AØ#7ô0Ð,ðÜ%2×%AÑ%AÀ$ÐGWÑBXÓ%Y�NÜ:Ó<�GØ!×9Ñ9Ø!/Ø+GØ,7Ø*;ð	 :ó ÷ ð ð& �N‰N˜4Õ ð].	!ô^ '¨wÔ7Ð7ð]øð*øðùô !ò Ü/3°DÐ9KÑ4LÓ/M�DÐ+Ñ,Ü$ ]°H¸dÓC�FÜ! &¬$Ô/°G¸vÑ4EØ"(¨¡/™ä"%°Ð0B¡fÈÓ"V˜ØÐ+Ñ,×3Ñ3Ü+Ø+?Ø$+ô÷ñ ûðûô  ò +Ù'¨Ó*Ð*ûð+üsŒ   …AG-ÁAG Â$EÂ%5G ÃEÃG Ã4:EÄ.EÄ/EÄ3G ÅG-ÅG ÅG ÅEÅ	GÅ!A&GÇG ÇGÇG Ç	G*ÇG%Ç%G*Ç*G-z/policy/validatezpolicy management)rº   r»   Úresponse_modelc              ƒ   óÜ   K  — ddl m} ddlm} t	        j
                  dt        |j                  «      «        ||¬«      }|j                  |j                  |du¬«      ƒ d{  –—† }|S 7 Œ­w)aÖ  
    Validate a policy configuration before applying it.

    Checks:
    - All referenced guardrails exist in the guardrail registry
    - All non-wildcard team aliases exist in the database
    - All non-wildcard key aliases exist in the database
    - Inheritance chains are valid (no cycles, parents exist)
    - Scope patterns are syntactically valid

    Returns:
    - valid: True if the policy configuration is valid (no blocking errors)
    - errors: List of blocking validation errors
    - warnings: List of non-blocking validation warnings

    Example request:
    ```json
    {
        "policies": {
            "global-baseline": {
                "guardrails": {
                    "add": ["pii_blocker", "phi_blocker"]
                },
                "scope": {
                    "teams": ["*"],
                    "keys": ["*"],
                    "models": ["*"]
                }
            },
            "healthcare-compliance": {
                "inherit": "global-baseline",
                "guardrails": {
                    "add": ["hipaa_audit"]
                },
                "scope": {
                    "teams": ["healthcare-team"]
                }
            }
        }
    }
    ```
    r   )ÚPolicyValidator)Úprisma_clientz0Validating policy configuration with %s policiesN)Úvalidate_db)	Ú,litellm.proxy.policy_engine.policy_validatorrå   rÔ   ræ   r   rl   r‘   rc   Úvalidate_policy_config)r\   r¼   r½   rå   ræ   Ú	validatorrË   s          r:   Úvalidate_policyrë   z  sm   è ø€ õl MÝ8ä×ÑÐQÔSVÐW[×WdÑWdÓSeÔfá&°]ÔC€Ià#×:Ñ:Ø�‰Ø!¨Ð-ð ;ó ÷ €Fð
 €Mðús   ‚A!A,Á#A*Á$A,z/policy/listc              ƒ   ó¬  K  — ddl m}  |«       }t        |j                  di «      j	                  «       D ��ci c]w  \  }}|t        |j                  d«      t        di |j                  di «      ¤Žt        di |j                  di «      ¤Ž|j                  dg «      |j                  dg «      ¬	«      “Œy c}}|j                  d
d«      ¬«      S c c}}w ­w)a  
    List all loaded policies with their resolved guardrails.

    Returns information about each policy including:
    - Inheritance configuration
    - Scope (teams, keys, models)
    - Guardrails to add/remove
    - Resolved guardrails (after inheritance)
    - Inheritance chain
    r   )Úget_policies_summaryrc   Úinheritr°   ro   Úresolved_guardrailsÚinheritance_chain)rî   r°   ro   rï   rð   Útotal_count)rc   rñ   rE   )Ú)litellm.proxy.policy_engine.init_policiesrí   r$   r�   Úitemsr'   r&   r"   )r\   r½   rí   ÚsummaryÚnamer¼   s         r:   Úlist_policiesrö   ¿  sË   è ø€ õ* Oá)Ó+€GÜð &Ÿk™k¨*°bÓ9×?Ñ?ÓA÷	
ñ ��dð Ô#ØŸ™ Ó+Ü)ÑB¨D¯H©H°W¸bÓ,AÑBÜ3ÑQ°d·h±h¸|ÈRÓ6PÑQØ$(§H¡HÐ-BÀBÓ$GØ"&§(¡(Ð+>ÀÓ"Côñ ó	
ð —K‘K ¨qÓ1ôð ùó	
ùs   ‚6C¸A<C
Â4 Cz/policy/info/{policy_name}rb   c           
   ƒ   óâ  K  — ddl m} ddlm}  |«       }|j	                  «       st        dd¬«      ‚|j                  |«      }|€t        dd|› d�¬«      ‚ |j                  ||j                  «       ¬	«      }t        ||j                  t        g g g ¬
«      t        |j                  j                  «       |j                  j                  «       ¬«      |j                  |j                   ¬«      S ­w)zª
    Get detailed information about a specific policy.

    Returns:
    - Policy configuration
    - Resolved guardrails (after inheritance)
    - Inheritance chain
    r   r   r    é”  ú2Policy engine not initialized. No policies loaded.©Ústatus_coderÑ   zPolicy 'ú' not found)rb   rc   )ÚteamsÚkeysÚmodels)ÚaddÚremove)rb   rî   r°   ro   rï   rð   )Ú+litellm.proxy.policy_engine.policy_registryr   Ú+litellm.proxy.policy_engine.policy_resolverr!   rk   r   Ú
get_policyrn   rm   r#   rî   r&   r"   ro   Úget_addÚ
get_removerð   )r\   rb   r½   r   r!   ry   Úpolicyrz   s           r:   Úget_policy_infor  æ  só   è ø€ õ( PÝJá)Ó+€Hà×"Ñ"Ô$ÜØØGô
ð 	
ð
 ×'Ñ'¨Ó4€FØ€~ÜØØ˜k˜]¨+Ð6ô
ð 	
ð
 8ˆ~×7Ñ7ÀKÐZb×ZsÑZsÓZuÔv€HäØØ—‘Ü!ØØØô
ô
 ,Ø×!Ñ!×)Ñ)Ó+Ø×$Ñ$×/Ñ/Ó1ô
ð %×/Ñ/Ø"×4Ñ4ôð ùs   ‚C-C/z/policy/testrd   c              ƒ   ó  K  — ddl m} ddlm} ddlm}  |«       }|j                  «       st        |g g d¬«      S |j                  «       }|j                  |¬«      } |j                  ||¬«      }	t        |||	¬	«      S ­w)
a°  
    Test which policies would match a given request context.

    This is useful for debugging and understanding policy behavior.

    Request body:
    ```json
    {
        "team_alias": "healthcare-team",
        "key_alias": "my-api-key",
        "model": "gpt-4"
    }
    ```

    Returns:
    - matching_policies: List of policy names that match
    - resolved_guardrails: Final list of guardrails that would be applied
    r   )ÚPolicyMatcherr   r    rù   )rd   Úmatching_policiesrï   r3   )rd   )rd   rc   )rd   r  rï   )Ú*litellm.proxy.policy_engine.policy_matcherr
  r  r   r  r!   rk   r(   rm   Úget_matching_policiesÚresolve_guardrails_for_context)
r\   rd   r½   r
  r   r!   ry   rc   Úmatching_policy_namesrï   s
             r:   Útest_policy_matchingr    s•   è ø€ õ< IÝOÝJá)Ó+€Hà×"Ñ"Ô$Ü!ØØ Ø "ØHô	
ð 	
ð ×/Ñ/Ó1€Hð $1×#FÑ#FÈwÐ#FÓ#WÐð "O ×!NÑ!NÐW^ÐiqÔ!rÐäØØ/Ø/ôð ùs   ‚A=A?zLhttps://raw.githubusercontent.com/BerriAI/litellm/main/policy_templates.jsonÚPOLICY_TEMPLATES_GITHUB_URLc                  óx  — t         j                  j                  t         j                  j                  t        «      dddd«      } t         j                  j                  | «      }t         j                  j                  |«      sg S t        |d«      5 }t        j                  |«      cddd«       S # 1 sw Y   yxY w)zTLoad policy templates from local backup file (litellm/policy_templates_backup.json).z..zpolicy_templates_backup.jsonÚrN)
Úosr¤   r’   ÚdirnameÚ__file__ÚabspathÚexistsÚopenr­   Úload)Úbackup_pathr¤   Úfs      r:   Ú(_load_policy_templates_from_local_backupr  ]  s„   € äŸ™Ÿ™Ü
�‰�‰œÓ!ØØØØ&ó€Kô —'‘'—/‘/ +Ó.€DÜ�7‰7�>‰>˜$ÔØˆ	Ü	ˆd�C‹ð ˜AÜ�y‰y˜‹|÷÷ ò ús   ÂB0Â0B9z/policy/templatesc              ƒ   óÌ  K  — t        j                  dd«      j                  «       j                  «       dv }|r
t	        «       S 	 ddlm} ddlm}  ||j                  ddi¬	«      }|j                  t        «      ƒ d
{  –—† }|j                  dk(  r|j                  «       S 	 t	        «       S 7 Œ.# t        $ r)}t        j                   d|«       Y d
}~t	        «       S d
}~ww xY w­w)zõ
    Get policy templates for the UI (pre-configured guardrail combinations).

    Fetches from GitHub with automatic fallback to local backup on failure.
    Set LITELLM_LOCAL_POLICY_TEMPLATES=true to skip GitHub and use local backup only.
    ÚLITELLM_LOCAL_POLICY_TEMPLATESr    )ÚtrueÚ1Úyesr   )Úget_async_httpx_client)ÚhttpxSpecialProviderÚtimeoutg      $@)Úllm_providerÚparamsNéÈ   zDFailed to fetch policy templates from GitHub, using local backup: %s)r  ÚgetenvÚstripÚlowerr  Ú&litellm.llms.custom_httpx.http_handlerr#  Úlitellm.types.llms.custom_httpr$  ÚUIr�   r  rû   r­   rv   r   rl   )r\   r½   Ú	use_localr#  r$  Úasync_clientr]   r~   s           r:   Úget_policy_templatesr1  m  sâ   è ø€ ô  —y‘yÐ!AÀ2ÓF×LÑLÓN×TÑTÓVð [ð €Iñ
 Ü7Ó9Ð9ðnÝQÝGá4Ø-×0Ñ0Ø˜tÐ$ô
ˆð !-× 0Ñ 0Ô1LÓ M×MˆØ×Ñ 3Ò&Ø—=‘=“?Ð"ð 'ô
 4Ó5Ð5ð Nùô ò nÜ×"Ñ"Ð#iÐkl×mÐmä3Ó5Ð5ûðnüsH   ‚AC$Á:B/ Á>B-Á?"B/ Â!C$Â#
C$Â-B/ Â/	C!Â8CÃC$ÃC!Ã!C$c                   ó†   — e Zd ZU eed<   eed<   dZedz  ed<    eded¬«      Z	e
e   dz  ed<    edd¬	«      Zedz  ed
<   y)ÚEnrichTemplateRequestÚtemplate_idÚ
parametersNrŒ   z!Optional list of competitor names)rµ   Ú
max_lengthr¶   ÚcompetitorszWRefinement instruction for modifying the competitor list (e.g. 'add 10 more from Asia')r´   Úinstruction)r<   r=   r>   r@   rD   rp   rŒ   r   r   r7  rK   r8  rE   r;   r:   r3  r3  –  s\   … ØÓØÓØ€Eˆ3�‰:ÓÙ$)ØØ'Ø7ô%€K��c‘˜TÑ!ó ñ
 $ØØmô€K��t‘ô r;   r3  c                 ó¨  ‡ — t        «       }t        ˆ fd„|D «       d«      }|€t        dd‰ j                  › d�¬«      ‚|j	                  d«      }|€t        dd	¬«      ‚‰ j
                  r0t        ‰ j
                  «      t        kD  rt        dd
t        › �¬«      ‚‰ j                  j	                  |d   d«      }|st        dd|d   › d�¬«      ‚|||fS )z‰
    Validate enrichment request and return (template, llm_enrichment, brand_name).

    Raises HTTPException on validation failure.
    c              3   ó`   •K  — | ]%  }|j                  d «      ‰j                  k(  sŒ"|–— Œ' y­w)ÚidN)r�   r4  )Ú.0Útr¼   s     €r:   ú	<genexpr>z/_validate_enrichment_request.<locals>.<genexpr>¬  s&   øè ø€ ÒT !°A·E±E¸$³KÀ4×CSÑCSÓ4SœAÑTùs   ƒ#.§.Nrø   z
Template 'rü   rú   Úllm_enrichmenti�  z(Template does not support LLM enrichmentz$competitors list exceeds maximum of Ú	parameterr    zParameter 'z' is required)	r  Únextr   r4  r�   r7  r‘   r   r5  )r¼   Ú	templatesÚtemplater?  Ú
brand_names   `    r:   Ú_validate_enrichment_requestrE  ¥  só   ø€ ô @ÓA€IÜÓT yÔTÐVZÓ[€HØÐÜ¨°jÀ×AQÑAQÐ@RÐR]Ð4^Ô_Ð_à$ŸL™LÐ)9Ó:€NØÐÜ¨Ð4^Ô_Ð_ð ×ÒœC × 0Ñ 0Ó1Ô4HÒHÜØØ9Ô:NÐ9OÐPô
ð 	
ð
 Ÿ™×+Ñ+¨N¸;Ñ,GÈÓL€JÙÜØØ  °Ñ!<Ð =¸]ÐKô
ð 	
ð
 �^ ZÐ/Ð/r;   z/policy/templates/enrichc              ƒ   ób  K  — t        | «      \  }}}| j                  xs t        }| j                  r| j                  }n3|d   j	                  d|d   z   dz   |«      }t        ||¬«      ƒ d{  –—† }t        ||¬«      ƒ d{  –—† }	t        |j                  dg «      |||	«      }
|
||	dœS 7 Œ=7 Œ*­w)	zõ
    Enrich a policy template with LLM-discovered data (e.g. competitor names).

    Calls an onboarded LLM to discover competitors for the given brand name,
    then returns enriched guardrailDefinitions with the discovered data populated.
    Úpromptú{{r@  ú}}©rŒ   NÚguardrailDefinitions)rK  r7  Úcompetitor_variations)	rE  rŒ   r   r7  ÚreplaceÚ_discover_competitors_via_llmÚ_generate_competitor_variationsÚ'_build_competitor_guardrail_definitionsr�   )r¼   r\   r½   rC  r?  rD  rŒ   r7  rG  Úvariations_mapÚenriched_definitionss              r:   Úenrich_policy_templaterS  Å  sÆ   è ø€ ô" ,HÈÓ+MÑ(€Hˆn˜jØ—:‘:ÒCÔ!C€Eà×ÒØ×&Ñ&‰à& xÑ0×8Ñ8¸ÀÈ{Ñ@[Ñ9[Ð^bÑ9bÐdnÓoˆÜ9¸&ÈÔN×Nˆä"AÀ+ÐUZÔ"[×[€Nä"IØ�‰Ð+¨RÓ0ØØØó	#Ðð !5Ø"Ø!/ñð ð Oøà[ús$   ‚A+B/Á-B+Á.B/ÂB-Â)B/Â-B/r8  Úexisting_competitorsrD  c                 ó<   — dj                  |«      }d|› d|› d| › d�S )zJBuild a prompt for refining the competitor list based on user instruction.z, zI have a brand called 'z%' and the following competitor list:
z

User instruction: z¡

Return ONLY the NEW names to add (not the existing ones), one per line, no numbering, no explanations. If the instruction asks to remove names, return nothing.)r’   )r8  rT  rD  Úexisting_lists       r:   Ú_build_refinement_promptrW  ï  s;   € ð  Ÿ9™9Ð%9Ó:€Mà
! * Ð-SØˆ/ð Ø(˜Mð *ð	ðr;   rG  rŒ   Úexistingc                óœ  K  — ddl m} |€t        d«      ‚|D �ch c]  }|j                  «       ’Œ }}|j	                  |d| dœgt
        d¬«      ƒ d{  –—† }d	}t        |«      }|2 3 d{  –—† }	|	j                  d   j                  j                  xs d	}
||
z  }d
|v sŒ:|j                  d
d«      \  }}t        |«      }|rF|j                  «       |vr4|t        k  r+|j                  |j                  «       «       |dz  }|df­–— d
|v rŒmŒ¨c c}w 7 ŒÀ7 Œª6 t        |«      }|r%|j                  «       |vr|t        k  r|df­–— yyyy­w)zˆ
    Stream competitor names from LLM. Yields (name, is_error) tuples.

    Deduplicates against existing names (case-insensitive).
    r   ©Ú
llm_routerNúLLM router not initializedr†   r‡   T)rŒ   r�   ÚtemperaturerŽ   r    rŠ   r…   F)rÔ   r[  rÙ   r+  Úacompletionr   r‘   ÚchoicesÚdeltar‰   ÚsplitÚ_clean_competitor_liner   r   )rG  rŒ   rX  r[  ÚnÚexisting_lowerr]   ÚbufferÚcountÚchunkr`  Úlinerõ   s                r:   Ú_stream_llm_competitor_namesri     sd  è ø€ õ 6àÐÜÐ5Ó6Ð6à08Ö9¨1˜QŸW™W�YÐ9€NÐ9Ø&×2Ñ2ØØ!¨fÑ5Ð6Ü.Øð	 3ó ÷ €Hð €FÜ�‹M€EØ÷ 	"ð 	"ˆeØ—‘˜aÑ ×&Ñ&×.Ñ.Ò4°"ˆØ�%‰ˆØ�fŠnØ!Ÿ<™<¨¨aÓ0‰LˆD�&Ü)¨$Ó/ˆDÙ˜Ÿ
™
›¨NÑ:¸uÔG[Ò?[Ø×"Ñ" 4§:¡:£<Ô0Ø˜‘
�Ø˜E�kÓ!ð �f‹nùò :ðøð	"ø�xô " &Ó)€DÙ�—
‘
“ NÑ2°uÔ?SÒ7SØ�EˆkÔð 8TÐ2€tùsL   ‚EšD±"EÁDÁEÁ'DÁ+DÁ,DÁ/1EÂ!A,EÄEÄDÄ4ErC  r?  c                ó¸  K  — t        | j                  xs g «      }| j                  r�|r‹|D ]!  }dt        j                  d|dœ«      › d�­–— Œ# t        | j                  ||«      }	 t        |||«      2 3 d{  –—† \  }}	|sŒ|j                  |«       dt        j                  d|dœ«      › d�­–— Œ@| j                  r3| j                  s'|D ]!  }dt        j                  d|dœ«      › d�­–— Œ# nl|d	   j                  d
|d   z   dz   |«      }	 t        ||g «      2 3 d{  –—† \  }}	|sŒ|j                  |«       dt        j                  d|dœ«      › d�­–— Œ@dt        j                  ddt        |«      › d�dœ«      › d�­–— t        ||¬«      ƒ d{  –—† }t        d„ |j!                  «       D «       «      }dt        j                  dd|› d�dœ«      › d�­–— t#        |j%                  dg «      |||«      }dt        j                  d|||dœ«      › d�­–— y7 �Œ«6 ŒÉ# t        $ rH}
t        j                  d|
«       dt        j                  dt        |
«      dœ«      › d�­–— Y d}
~
yd}
~
ww xY w7 �ŒY6 �Œ## t        $ rH}
t        j                  d|
«       dt        j                  dt        |
«      dœ«      › d�­–— Y d}
~
yd}
~
ww xY w7 �Œ;­w)zFStream competitor names as SSE events, then emit a final 'done' event.zdata: Ú
competitor)rt   rõ   z

Nz$LLM competitor refinement failed: %srÒ   )rt   r3   rG  rH  r@  rI  z#LLM competitor streaming failed: %sÚstatusz#Generating alternate spellings for z competitors...rJ  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)r‘   )r<  Úvs     r:   r>  z,_stream_competitor_events.<locals>.<genexpr>U  s   è ø€ Ò!J¨Q¤# a§&Ñ!Jùs   ‚z$Building guardrail definitions with z variations...rK  Údone)rt   r7  rL  rK  )rK   r7  r8  r­   r®   rW  ri  rw   rv   r   rÒ   r@   rM  r‘   rO  ÚsumÚvaluesrP  r�   )r¼   rC  r?  rD  rŒ   r7  ÚcompÚrefinement_promptrõ   Ú_r~   rG  rQ  Útotal_variationsrR  s                  r:   Ú_stream_competitor_eventsrw  (  sN  è ø€ ô %)¨×)9Ñ)9Ò)?¸RÓ$@€Kà×Ò™Kàò 	RˆDØœ4Ÿ:™:¨|ÀTÑ&JÓKÐLÈDÐQÔQð	Rô $<¸D×<LÑ<LÈkÐ[eÓ#fÐð	Ü!=Ð>OÐQVÐXcÓ!d÷ Zð Z‘g�d˜AÚØ×&Ñ& tÔ,Ø"¤4§:¡:°|ÈTÑ.RÓ#SÐ"TÐTXÐYÔYð
 
×	Ò	 $×"2Ò"2àò 	RˆDØœ4Ÿ:™:¨|ÀTÑ&JÓKÐLÈDÐQÔQñ	Rð ' xÑ0×8Ñ8¸ÀÈ{Ñ@[Ñ9[Ð^bÑ9bÐdnÓoˆð	Ü!=¸fÀeÈRÓ!P÷ Zð Z‘g�d˜AÚØ×&Ñ& tÔ,Ø"¤4§:¡:°|ÈTÑ.RÓ#SÐ"TÐTXÐYÔYð ”4—:‘: xÐ>aÔbeÐfqÓbrÐasð  tCð  =Dñ  Eó  Fð  Gð  GKð  Ló  LÜ"AÀ+ÐUZÔ"[×[€Nä!Ñ!J°.×2GÑ2GÓ2IÔ!JÓJÐØ”4—:‘: xÐ>bÐcsÐbtð  uCð  =Dñ  Eó  Fð  Gð  GKð  Ló  LÜ"IØ�‰Ð+¨RÓ0ØØØó	#Ðð ”4—:‘: v¸kÐdrð  Mañ  bó  cð  dð  dhð  iô  iðKZùÑ!døô ò 	Ü ×&Ñ&Ð'MÈqÔQØœ4Ÿ:™:¨wÄ3ÀqÃ6Ñ&JÓKÐLÈDÐQÓQÜûð	úðZùÒ!Pøô ò 	Ü ×&Ñ&Ð'LÈaÔPØœ4Ÿ:™:¨wÄ3ÀqÃ6Ñ&JÓKÐLÈDÐQÓQÜûð	úð \ûsÈ   ‚A%KÁ(H) Á5H'Á9H$Á:H'Á=H) Â1H) Â5AKÄJ Ä J Ä$I=Ä%J Ä(J Ä/1J Å <KÆKÆBKÈ$H'È'H) È(KÈ)	I:È2>I5É0KÉ5I:É:KÉ=J Ê J ÊKÊ	KÊ>KË
KËKËKz/policy/templates/enrich/streamc           	   ƒ   óŒ   K  — t        | «      \  }}}| j                  xs t        }t        t	        | ||||«      ddddœ¬«      S ­w)u  
    Stream competitor names as SSE events as the LLM generates them.

    Events:
    - data: {"type": "competitor", "name": "..."}  â€” each competitor as discovered
    - data: {"type": "done", "competitors": [...], "competitor_variations": {...}, "guardrailDefinitions": [...]}
    ztext/event-streamzno-cacheÚno)zCache-ControlzX-Accel-Buffering)Ú
media_typer¦   )rE  rŒ   r   r   rw  )r¼   r\   r½   rC  r?  rD  rŒ   s          r:   Úenrich_policy_template_streamr{  a  sQ   è ø€ ô" ,HÈÓ+MÑ(€Hˆn˜jØ—:‘:ÒCÔ!C€EäÜ! $¨°.À*ÈeÓTØ&Ø",À4ÑHôð ùs   ‚AArh  c                 ó„   — | j                  «       j                  d«      j                  «       }|rt        |«      dkD  r|S dS )zEStrip numbering, bullets, and whitespace from a competitor name line.z.-) r…   N)r*  r‘   )rh  rõ   s     r:   rb  rb  |  s8   € à—*‘*“,×$Ñ$ VÓ,×2Ñ2Ó4€DÙœC ›I¨šMˆ4Ð3¨tÐ3r;   r7  c              ƒ   óˆ  K  — | si S | dt          }dj                  |«      }d|› d�}	 ddlm} |€t	        d«      ‚|j                  |d|d	œgt        ¬
«      ƒ d{  –—† }|j                  d   j                  j                  xs d}t        ||«      S 7 Œ7# t        $ r"}t        j                  d|«       i cY d}~S d}~ww xY w­w)zUGenerate common misspellings, abbreviations, and alternate names for each competitor.NrŠ   zõFor each company/brand name below, list 3-5 common misspellings, abbreviations, and alternate names that people might type. Include typos, missing spaces, wrong suffixes (e.g. 'Airlines' vs 'Airways' vs 'Airline'), and common shortcuts.

Names:
z¸

Return the result as one line per variation in the format:
OriginalName: variation1, variation2, variation3
Use the EXACT original name before the colon. No numbering, no extra text.r   rZ  r\  r†   r‡   ©rŒ   r�   r]  r    z.LLM competitor variation generation failed: %s)r   r’   rÔ   r[  rÙ   r^  r   r_  r3   r‰   Ú_parse_variations_responserv   r   rÒ   )	r7  rŒ   ÚcappedÚ
names_listrG  r[  r]   Úrawr~   s	            r:   rO  rO  ‚  së   è ø€ áØˆ	ð  Ð 5Ô!5Ð6€FØŸ	™	 &Ó)€Jð	ð �,ð Uð	Uð ðÝ9àÐÜÐ9Ó:Ð:Ø *× 6Ñ 6ØØ%°&Ñ9Ð:Ü2ð !7ó !
÷ 
ˆð
 ×%Ñ% aÑ(×0Ñ0×8Ñ8Ò>¸BˆÜ)¨#¨vÓ6Ð6ð
ùô ò Ü×"Ñ"Ð#SÐUVÔWØ�	ûðüsF   ‚%C¨2B ÁBÁ6B ÂCÂB Â	B?ÂB:Â4B?Â5CÂ:B?Â?Cr‚  c                 ó  — |D �ci c]  }|j                  «       |“Œ }}i }| j                  «       j                  d«      D ]¾  }d|vrŒ|j                  d«      \  }}}|j	                  |j                  «       j                  «       «      }	|	€ŒM|j                  d«      D �
cg c]S  }
|
j                  «       sŒ|
j                  «       j                  «       |	j                  «       k7  sŒD|
j                  «       ‘ŒU }}
|||	<   ŒÀ |S c c}w c c}
w )zOParse the LLM response for competitor variations into a name -> variations map.rŠ   ú:ú,)r+  r*  ra  Ú	partitionr�   )r‚  r7  rs  Úlower_to_canonicalrQ  rh  rõ   ru  Úvariations_strÚ	canonicalro  Ú
variationss               r:   r  r  ¥  s  € ð ALÖ L¸ §¡£¨tÑ!3Ð LÐÐ LØ24€Nà—	‘	“×!Ñ! $Ó'ò 
/ˆØ�d‰?ØØ"&§.¡.°Ó"5Ñˆˆa�Ø&×*Ñ*¨4¯:©:«<×+=Ñ+=Ó+?Ó@ˆ	ØÐØà-×3Ñ3°CÓ8ö
Ø¸A¿G¹G½IÈ!Ï'É'Ë)Ï/É/ÓJ[Ð_h×_nÑ_nÓ_pÓJpˆA�G‰G�Ið
ˆ
ð 
ð %/ˆ�yÒ!ð
/ð Ðùò !Mùò
s   …DÂ DÂ6/DÃ&Dc              ƒ   ó¸  K  — 	 ddl m} |€t        d«      ‚|j                  |d| dœgt        ¬«      ƒ d{  –—† }|j
                  d   j                  j                  xs d}|j                  «       j                  d	«      D �cg c]  }t        |«      x}€Œ|‘Œ }}|dt         S 7 Œnc c}w # t        $ r"}t        j                  d
|«       g cY d}~S d}~ww xY w­w)z3Call an onboarded LLM to discover competitor names.r   rZ  Nr\  r†   r‡   r~  r    rŠ   z#LLM competitor discovery failed: %s)rÔ   r[  rÙ   r^  r   r_  r3   r‰   r*  ra  rb  r   rv   r   rÒ   )	rG  rŒ   r[  r]   r‚  rh  rõ   r7  r~   s	            r:   rN  rN  º  sâ   è ø€ ðÝ9àÐÜÐ9Ó:Ð:Ø *× 6Ñ 6ØØ%°&Ñ9Ð:Ü2ð !7ó !
÷ 
ˆð
 ×%Ñ% aÑ(×0Ñ0×8Ñ8Ò>¸BˆØ(+¯	©	«×(9Ñ(9¸$Ó(?Öv ÔLbÐcgÓLhÐDhÀDÑCu’tÐvˆÐvØÐ0Ô0Ð1Ð1ð
úò wøäò Ü×"Ñ"Ð#HÈ!ÔLØ�	ûðüs]   ‚C„2B, ¶B%·AB, ÂB'ÂB'Â
B, Â$CÂ%B, Â'B, Â,	CÂ5CÃCÃCÃCÃCrQ  c           	      óV   — | D �ci c]  }||g|j                  |g «      z   “Œ c}S c c}w )z;Build canonical + variation name lists for each competitor.©r�   )r7  rQ  rs  s      r:   Ú_build_all_names_per_competitorrŽ  Î  s3   € ð EPÖP¸DˆD�4�&˜>×-Ñ-¨d°BÓ7Ñ7Ñ7ÒPÐPùÒPs   …&Údefinitionsc                 ó  — |xs i }t        j                  | «      }t        ||«      }t        ||«      }t	        ||«      }t        |||«      }|||||||||||dœ}	|D ]$  }
|
j                  dd«      }||	v sŒ|	|   |
d   d<   Œ& |S )zSBuild enriched guardrailDefinitions with competitor names and variations populated.)zcompetitor-output-blockerzcompetitor-input-blockerzcompetitor-name-blockerzcompetitor-name-input-blockerzcompetitor-name-output-blockerz competitor-recommendation-filterz&competitor-recommendation-input-filterz'competitor-recommendation-output-filterzcompetitor-comparison-filterz"competitor-comparison-input-filterz#competitor-comparison-output-filterr2   r    Úlitellm_paramsÚblocked_words)ÚcopyÚdeepcopyrŽ  Ú_build_name_blocked_wordsÚ#_build_recommendation_blocked_wordsÚ_build_comparison_blocked_wordsr�   )r�  r7  rD  rQ  ÚenrichedÚ	all_namesÚoutput_blockedÚrecommendation_blockedÚcomparison_blockedÚblocked_words_mapÚdefnr2   s               r:   rP  rP  Õ  sÆ   € ð $Ò) r€NÜ—m‘m KÓ0€HÜ6°{ÀNÓS€Iä5°kÀ9ÓM€NÜ$GÈÐU^Ó$_ÐÜ ?ÀÈYÐXbÓ cÐð &4Ø$2Ø#1Ø)7Ø*8Ø,BØ2HØ3IØ(:Ø.@Ø/Añ Ðð ò XˆØŸ™Ð"2°BÓ7ˆØÐ.Ò.Ø6GÈÑ6WˆDÐ!Ñ" ?Ò3ðXð
 €Or;   r™  c                 óz   — g }| D ]3  }||   D ])  }||k(  rd|› �nd|› d|› �}|j                  |d|dœ«       Œ+ Œ5 |S )z?Build blocked word entries for direct competitor name mentions.zCompetitor: zCompetitor variation (z): ÚBLOCK©ÚkeywordÚactionr¶   ©rw   )r7  r™  rË   rs  rõ   Údescs         r:   r•  r•  ú  sn   € à€FØò UˆØ˜d‘Oò 	UˆDØ,0°DªL�\ $ Ñ(Ð@VÐW[ÐV\Ð\_Ð`dÐ_eÐ>fˆDØ�M‰M d°gÈdÑSÕTñ	UðUð €Mr;   c           
      óv   — g }| D ]1  }||   D ]'  }dD ]   }|j                  |› d|› �dd|› d�dœ«       Œ" Œ) Œ3 |S )z:Build blocked word entries for competitor recommendations.)ÚtryÚusez	switch toÚconsiderú r   zRecommendation to competitor (ú)r¡  r¤  )r7  r™  rË   rs  rõ   Úprefixs         r:   r–  r–    sm   € à€FØò 	ˆØ˜d‘Oò 	ˆDØAò �Ø—‘à&, X¨Q¨t¨fÐ#5Ø")Ø)GÈÀvÈQÐ'Oñõññ	ð	ð €Mr;   c           	      óÄ   — g }| D ](  }||   D ]  }|j                  |› d�dd|› d�dœ«       Œ  Œ* |j                  d|› �dddœ«       |j                  |› d�dddœ«       |S )	zBBuild blocked word entries for unfavorable competitor comparisons.z
 is betterr   zUnfavorable comparison (r«  r¡  zbetter than zUnfavorable comparisonz	 is worser¤  )r7  r™  rD  rË   rs  rõ   s         r:   r—  r—    s¢   € ð €FØò ˆØ˜d‘Oò 	ˆDØ�M‰Mà"&  zÐ2Ø%Ø%=¸d¸VÀ1Ð#Eñõñ	ðð ‡M�Mà% j \Ð2ØØ3ñ	
ôð ‡M�Mà$˜ YÐ/ØØ3ñ	
ôð €Mr;   c                   ó`   — e Zd ZU  ee¬«      Zee   ed<    ed¬«      Zeed<   dZ	edz  ed<   y)ÚSuggestTemplatesRequest)r¸   Úattack_examplesr    )rµ   r¶   NrŒ   )
r<   r=   r>   r   rK   r°  r@   rD   r¶   rŒ   rE   r;   r:   r¯  r¯  6  s2   … Ù!&°tÔ!<€O�T˜#‘YÓ<Ù RÔ(€K�Ó(Ø€Eˆ3�‰:Ôr;   r¯  z/policy/templates/suggestc              ƒ   ó²   K  — ddl m} t        «       } |«       }|j                  || j                  | j
                  | j                  ¬«      ƒ d{  –—† S 7 Œ­w)z®
    Use AI to suggest policy templates based on attack examples and descriptions.

    Calls an LLM with tool calling to match user requirements to available templates.
    r   )ÚAiPolicySuggester)rB  r°  r¶   rŒ   N)ÚGlitellm.proxy.management_endpoints.policy_endpoints.ai_policy_suggesterr²  r  Úsuggestr°  r¶   rŒ   )r¼   r\   r½   r²  rB  Ú	suggesters         r:   Úsuggest_policy_templatesr¶  <  s\   è ø€ õ ô @ÓA€IÙ(Ó*€IØ×"Ñ"ØØ×,Ñ,Ø×$Ñ$Ø�j‰jð	 #ó ÷ ð ð ús   ‚AAÁAÁAc                   ó6   — e Zd ZU eed<   eed<   eed<   eed<   y)ÚGuardrailTestResultEntryr2   r£  Úoutput_textÚdetailsN)r<   r=   r>   r@   rD   rE   r;   r:   r¸  r¸  Z  s   … ØÓØƒKØÓØ„Lr;   r¸  c                   óL   — e Zd ZU  ed¬«      Zee   ed<    ed¬«      Ze	ed<   y)ÚTestPolicyTemplateRequestz1All guardrailDefinitions from the policy template)r¶   Úguardrail_definitionsz)Test input text to run guardrails againstÚtextN)
r<   r=   r>   r   r½  rK   rp   rD   r¾  r@   rE   r;   r:   r¼  r¼  a  s'   … Ù(-Ð:mÔ(nÐ˜4 ™:ÓnÙÐ"MÔN€Dˆ#ÔNr;   r¼  c                   ó(   — e Zd ZU eed<   ee   ed<   y)ÚTestPolicyTemplateResponseÚoverall_actionrW   N)r<   r=   r>   r@   rD   rK   r¸  rE   r;   r:   rÀ  rÀ  f  s   … ØÓØÐ*Ñ+Ô+r;   rÀ  z/policy/templates/testc              ƒ   óÐ   K  — ddl m} 	 t        | j                  | j                  ¬«      ƒ d{  –—† }t        |«      }t        ||¬«      S 7 Œ# t        $ r} ||«      ‚d}~ww xY w­w)a8  
    Test a policy template's guardrails against a text input without creating them.

    Instantiates temporary guardrails from the template definitions, runs them
    against the provided text, and returns per-guardrail results so users can
    verify the template solves their problem before creating it.
    r   rÀ   )r½  r¾  N)rÁ  rW   )rÕ   rÁ   Ú_test_guardrail_definitionsr½  r¾  Ú_compute_overall_actionrÀ  rv   )r¼   r\   r½   rÁ   rW   Úoverallr~   s          r:   Útest_policy_templaterÆ  k  so   è ø€ õ$ >ð+Ü:Ø"&×"<Ñ"<Ø—‘ô 
÷ 
ˆô 1°Ó9ˆÜ)Ø"Øô
ð 	
ð
ùô ò +Ù'¨Ó*Ð*ûð+üs8   ‚A&Š$A ®A¯A Á
A&ÁA Á	A#ÁAÁA#Á#A&r½  r¾  c              ƒ   ó  K  — ddl m} g }| D �]/  }|j                  dd«      }|j                  di «      }|j                  dd«      }|dk7  r"|j                  t	        |d	|d
|› �¬«      «       Œa	  |||j                  d«      |j                  d«      |j                  d«      |j                  d«      |j                  dd«      ¬«      }|j                  d|gii d¬«      ƒ d{  –—† }	|	j                  d«      r|	j                  d|g«      d   n|}
|
|k7  rd}d}nd}d}|j                  t	        |||
|¬«      «       �Œ2 |S 7 Œ^# t        $ r€}t        |d«      r|j                  n
t        |«      }t        |t        «      r|j                  dt        |«      «      }|j                  t	        |ddt        |«      ¬«      «       Y d}~�Œ»d}~wt        $ r2}|j                  t	        |d|t        |«      ¬«      «       Y d}~�Œôd}~ww xY w­w)z?Instantiate and run each guardrail definition against the text.r   )ÚContentFilterGuardrailr2   Úunknownr‘  Ú	guardrailr    Úlitellm_content_filterÚunsupportedz*Preview not available for guardrail type: )r2   r£  r¹  rº  Úpatternsr’  Ú
categoriesÚpattern_redaction_formatÚ
default_onF)r2   rÍ  r’  rÎ  rÏ  rÐ  r„   r\   )rH   rY   rZ   NÚmaskedzContent was modified (masked)ÚpassedzNo issues detectedrÑ   rÒ   Úblocked)ÚNlitellm.proxy.guardrails.guardrail_hooks.litellm_content_filter.content_filterrÈ  r�   rw   r¸  rf   r   rÅ   rÑ   r@   rs   rp   rv   )r½  r¾  rÈ  rW   Úguardrail_defr2   r‘  Úguardrail_typerÊ  Úoutputr¹  r£  rº  r~   rÑ   s                  r:   rÃ  rÃ  �  s/  è ø€ õ
ð 68€Gà.ó DˆØ&×*Ñ*Ð+;¸YÓGˆØ&×*Ñ*Ð+;¸RÓ@ˆØ'×+Ñ+¨K¸Ó<ˆàÐ5Ò5Ø�N‰NÜ(Ø#1Ø(Ø $ØHÈÐHXÐYô	ôð ð4	Ù.Ø-Ø'×+Ñ+¨JÓ7Ø,×0Ñ0°ÓAØ)×-Ñ-¨lÓ;Ø)7×);Ñ);Ð<VÓ)WØ)×-Ñ-¨l¸EÓBôˆIð %×4Ñ4Ø $ Ð(ØØ$ð 5ó ÷ ˆFð
 =C¿J¹JÀwÔ<O˜&Ÿ*™* W¨t¨fÓ5°aÒ8ÐUYˆKà˜dÒ"Ø!�Ø9‘à!�Ø.�à�N‰NÜ(Ø#1Ø!Ø +Ø#ô	öðQDðL €NðYùô, ò 	Ü!(¨¨HÔ!5�Q—X’X¼3¸q»6ˆFÜ˜&¤$Ô'ØŸ™ G¬S°«[Ó9�Ø�N‰NÜ(Ø#1Ø$Ø "Ü ›Kô	÷ò ûô ò 	Ø�N‰NÜ(Ø#1Ø"Ø $Ü ›Fô	÷ò ûð	üsW   ‚A,H	Á/A4EÃ#EÃ$AEÄ=H	ÅEÅ	HÅA5GÇH	ÇHÇ'HÇ;H	ÈHÈH	rW   c                 ó„   — ddddddœ}d}| D ]0  }|j                  |d   d«      |j                  |d«      kD  sŒ,|d   }Œ2 |S )	zNReturn the worst-case action: blocked > masked > error > unsupported > passed.é   é   é   r…   r   )rÓ  rÑ  rÒ   rÌ  rÒ  rÒ  r£  r�  )rW   ÚpriorityÚworstr  s       r:   rÄ  rÄ  á  sY   € à"#¨q¸1ÈQÐZ[Ñ\€HØ€EØò  ˆØ�<‰<˜˜(™ QÓ'¨(¯,©,°u¸aÓ*@Ó@Ø�h‘K‰Eð ð €Lr;   rn  )wr?   r“  r­   r  Úcollections.abcr   Útypingr   r   r   r   r   Úfastapir	   r
   r   r   Úfastapi.responsesr   r   Úpydanticr   r   Útyping_extensionsr   Úlitellm._loggingr   Úlitellm.constantsr   r   r   Ú%litellm.integrations.custom_guardrailr   Ú6litellm.llms.openai.chat.guardrail_translation.handlerr   Úlitellm.proxy._typesr   Ú$litellm.proxy.auth.user_api_key_authr   Ú4litellm.proxy.guardrails.guardrail_hooks.custom_coder   r   Ú+litellm.proxy.guardrails.guardrail_registryr   Ú&litellm.proxy.management_helpers.utilsr   r  r   r  r!   Ú!litellm.types.proxy.policy_enginer"   r#   r$   r%   r&   r'   r(   r)   r*   Úlitellm.types.utilsr+   r,   rÓ   r.   r_   r/   rD   rv   r1   rC   rG   rM   rR   rT   rV   rK   r@   rp   r€   r–   r±   r³   Úpostrâ   rë   r�   rö   r  r  r  r  r1  r3  ÚtuplerE  rS  rW  Úboolri  rw  r{  rb  rO  r  rN  rŽ  rP  r•  r–  r—  r¯  r¶  r¸  r¼  rÀ  rÆ  rÃ  rÄ  rE   r;   r:   ú<module>rò     sý  ðò	ó Û Û 	Ý )ß ;Õ ;ç >Ó >ß 9ß %Ý 'å 1÷ñ õ
 Bõõ 0Ý B÷õ JÝ NÝ KÝ F÷
÷ 
õ 
÷ IáÝWá“€ˆÓ ôL˜)ô Lô˜)ô ô0˜yô 0ôÐ2¸%õ ô0 iô 0ôÐ!@Èõ ô.˜iô .ð )-ñ[LØ�s‘)˜dÑ"ð[Là%ð[Lð ð[Lð Ð-Ñ.ð	[Lð
 +ð[Lð ˜#‘Y Ñ%ð[Lð ó[Lð|Ð#<ð Èð Ð[_ð Ðdhó ð(+ $ð +¨7ó +ô6 yô ð& ‡�Ø)Ø
ˆÙÐ+Ó,Ð-ð ó ð
 ñ )0Ð0AÓ(Bñ^+Øð^+à
*ð^+ð &ò^+ó óð^+ðB ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø+ð	 ó ð ñ )0Ð0AÓ(Bñ;Øð;à
ð;ð &ð;ð ò	;ó óð;ð| ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ð ñ )0Ð0AÓ(BñØðà%ðð òó óðð@ ‡�Ø Ø
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ð ñ )0Ð0AÓ(Bñ/Øð/àð/ð &ð/ð ò	/ó óð/ðd ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ð ñ )0Ð0AÓ(Bñ1Øð1àð1ð &ð1ð ò	1ó óð1ðh &tÐ ˜UÓ sð°$ó ð  ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð
 ñ )0Ð0AÓ(Bñ 6Øð 6à%ð 6ð 
ò 6ó óð 6ôF˜Iô ð0Ð'<ð 0ÀÀtÈTÐSVÀÑAWó 0ð@ ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð
 ñ )0Ð0AÓ(Bñ!Ø
ð!àð!ð &ð!ð 
ò	!ó óð!ðHØðà˜s™)ðð ðð 	ó	ð"%Øð%àð%ð �3‰ið%ð �5˜˜t™ TÐ)Ñ*Ñ+ó	%ðP6iØ
ð6iàð6ið ð6ið ð	6ið
 ð6ið �3Ñó6iðr ‡�Ø%Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BñØ
ðàðð &òóð
ð,4 ð 4¨¨t©ó 4ð Kmñ  °tð  ÀCð  Ðquó  ðF Cð °dð ¸tÀCÈÈcÉÀNÑ?Só ð* Ceñ °ð ¸Cð Ðimó ð(QØ�c‘ðQØ,0°°d¸3±i°Ñ,@ðQà	ˆ#ˆt�C‰yˆ.ÑóQð #'ñ	"Øð"àð"ð ð"ð ˜4‘Kð	"ð
 
ó"ðJ¨4°©9ð ÀÀcÈ4ÐPSÉ9ÀnÑAUð ÐZ^Ð_cÑZdó ð°T¸#±Yð È4ÐPSÐUYÐZ]ÑU^ÐP^ÑK_ð ÐdhÐimÑdnó ð Ø�c‘ðØ'+¨C°°c±¨NÑ';ðØILðà	ˆ$�ZóôD˜iô ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð
 ñ )0Ð0AÓ(BñØ
!ðàðð &ðð 
ò	ó óðô0˜yô ôO 	ô Oô
, ô ,ð
 ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð
 ñ )0Ð0AÓ(Bñ+Ø
#ð+àð+ð &ð+ð  ò	+ó óð+ð8QØ ™:ðQà
ðQð 
Ð
"Ñ#óQðh TÐ*BÑ%Cð Èô r;   