Ë
    tPêj€  ã                   ó.  — U d Z ddlZddlmZmZ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mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ erddlmZ ddlmZ dZ ee!d<   dZ"ee!d<    G d„ ded¬«      Z# G d„ de«      Z$ G d„ de%«      Z& G d„ de«      Z'y)zÈ
PromptGuard guardrail integration for LiteLLM.

Calls the PromptGuard Guard API to scan messages for prompt
injection, PII, topic violations, and entity blocklist matches
before and after LLM calls.
é    N)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚOptionalÚ	TypedDict)ÚReadOnly)Úverbose_proxy_logger)ÚGuardrailRaisedException)ÚCustomGuardrailÚlog_guardrail_information)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚGuardrailEventHooks)ÚAllMessageValues)ÚGenericGuardrailAPIInputs)ÚLogging)ÚGuardrailConfigModelzhttps://api.promptguard.coÚ_DEFAULT_API_BASEz/api/v1/guardÚ_GUARD_ENDPOINTc                   óh   — e Zd ZU dZee   ed<   ee   ed<   ee   ed<   ee   ed<   eee	      ed<   y)ÚPromptGuardGuardAPIResponsez<Body returned by the PromptGuard ``/api/v1/guard`` endpoint.ÚdecisionÚthreat_typeÚevent_idÚ
confidenceÚredacted_messagesN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   ÚstrÚ__annotations__ÚfloatÚlistr   © ó    ú…/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/promptguard/promptguard.pyr   r   (   s>   … ÙFà�s‰mÓØ˜#‘ÓØ�s‰mÓØ˜‘ÓØ Ð%5Ñ 6Ñ7Ô7r'   r   F)Útotalc                   ó"   — e Zd ZU dZee   ed<   y)ÚPromptGuardHTTPViewzATyped read of the untyped JSON body returned by the httpx client.Úguard_responseN)r   r   r    r!   r	   r   r#   r&   r'   r(   r+   r+   2   s   … ÙKàÐ8Ñ9Ô9r'   r+   c                   ó   — e Zd Zy)ÚPromptGuardMissingCredentialsN)r   r   r    r&   r'   r(   r.   r.   8   s   „ Ør'   r.   c                   óò   ‡ — e Zd Z	 	 	 ddedz  dedz  dedz  deddf
ˆ fd„Zeded   dz  fd	„«       Z	e
dee   fd
„«       Ze	 ddedeeef   ded   ded   def
d„«       Zedee   dee   fd„«       Zˆ xZS )ÚPromptGuardGuardrailNÚapi_keyÚapi_baseÚblock_on_errorÚkwargsÚreturnc                 ó2  •— |xs t         j                  j                  d«      | _        | j                  st	        d«      ‚|xs' t         j                  j                  d«      xs t
        j                  d«      | _        |€8t         j                  j                  dd«      }|j                  «       dv | _	        n|| _	        t        t        j                  ¬«      | _        |j                  d	t        | j!                  «       «      «       t#        ‰| �H  d
i |¤Ž y )NÚPROMPTGUARD_API_KEYztPromptGuard API key is required. Set PROMPTGUARD_API_KEY in the environment or pass api_key in the guardrail config.ÚPROMPTGUARD_API_BASEú/ÚPROMPTGUARD_BLOCK_ON_ERRORÚtrue)r;   Ú1Úyes)Úllm_providerÚsupported_event_hooksr&   )ÚosÚenvironÚgetr1   r.   r   Úrstripr2   Úlowerr3   r   r   ÚGuardrailCallbackÚasync_handlerÚ
setdefaultr%   Úget_supported_event_hooksÚsuperÚ__init__)Úselfr1   r2   r3   r4   ÚenvÚ	__class__s         €r(   rJ   zPromptGuardGuardrail.__init__=   sð   ø€ ð ò 
¤"§*¡*§.¡.Ø!ó#
ˆŒð �|Š|Ü/ð(óð ð "Ò`¤R§Z¡Z§^¡^Ð4JÓ%KÒ`ÔO`×hÑhÐilÓmˆŒàÐ!ÜŸ™Ÿ™Ð(DÀfÓMˆCØ"%§)¡)£+ð 2ð #ˆDÕð #1ˆDÔä3Ü-×?Ñ?ô
ˆÔð 	×ÑÐ1´4¸×8VÑ8VÓ8XÓ3YÔZä‰ÑÑ"˜6Ó"r'   r   c                  ó   — ddl m}  | S )Nr   ©ÚPromptGuardConfigModel)Ú:litellm.types.proxy.guardrails.guardrail_hooks.promptguardrP   rO   s    r(   Úget_config_modelz%PromptGuardGuardrail.get_config_modelc   s   € õ	
ð &Ð%r'   c                 óB   — t         j                  t         j                  gS ©N)r   Úpre_callÚ	post_call)Úclss    r(   rH   z.PromptGuardGuardrail.get_supported_event_hooksk   s    € ô  ×(Ñ(Ü×)Ñ)ð
ð 	
r'   ÚinputsÚrequest_dataÚ
input_type)ÚrequestÚresponseÚlogging_objÚLiteLLMLoggingObjc           
   ƒ   óä  K  — |j                  dg «      }|j                  dg «      }|j                  dg «      }|j                  d«      }|rt        |«      }	n|r|D �
cg c]  }
d|
dœ‘Œ	 }	}
n|S |dk(  rdnd	}|	|d
œ}|r||d<   |r||d<   | j                  › t        › �}t	        j
                  d||t        |	«      t        |«      «       	 | j                  j                  || j                  ddœ|d¬«      ƒ d {  –—† }|j                  «        d|j                  «       i}|d   }t	        j
                  d|j                  d«      |j                  d«      «       |j                  d«      xs d}|dk(  rX|j                  dd«      }|j                  dd«      }|j                  dd«      }t!        | j"                  d|› d|› d |› d!�d"¬#«      ‚|d$k(  r6|j                  d%«      }|r#|r||d<   d|v r| j%                  |«      }|r||d<   |S c c}
w 7 �Œ# t        $ rR}t	        j                  dt        |«      «       | j                  rt!        | j"                  d|› �¬«      |‚|cY d }~S d }~ww xY w­w)&NÚtextsÚimagesÚstructured_messagesÚmodelÚuser)ÚroleÚcontentr[   ÚinputÚoutput)ÚmessagesÚ	directionz,PromptGuard: %s direction=%s msgs=%d imgs=%dzapplication/json)z	X-API-KeyzContent-Typeg      $@)ÚurlÚheadersÚjsonÚtimeoutr,   zPromptGuard API error: %sz3PromptGuard API unreachable (block_on_error=True): )Úguardrail_nameÚmessagez"PromptGuard: decision=%s threat=%sr   r   ÚallowÚblockÚunknownr   Ú r   g        zBlocked by PromptGuard: z (confidence=z, event_id=ú)T)ro   rp   Úblocked_contentÚredactr   )rB   r%   r2   r   r
   ÚdebugÚlenrF   Úpostr1   Úraise_for_statusrm   Ú	ExceptionÚerrorr"   r3   r   ro   Ú_extract_texts_from_messages)rK   rX   rY   rZ   r]   r`   ra   rb   rc   ri   Útextrj   ÚpayloadÚendpointr\   ÚviewÚresultÚexcr   r   r   r   ÚredactedÚ	extracteds                           r(   Úapply_guardrailz$PromptGuardGuardrail.apply_guardrailr   s½  è ø€ ð —z‘z '¨2Ó.ˆØŸ
™
 8¨RÓ0ˆØ%+§Z¡ZÐ0EÀrÓ%JÐØ—z‘z 'Ó*ˆáÜÐ/Ó0‰HÙØFKÖL¸d °DÓ9ÐLˆHÑLàˆMà&0°IÒ&=™7À8ˆ	ð !Ø"ñ-
ˆñ Ø$ˆG�GÑÙØ &ˆG�HÑà!Ÿ]™]˜O¬OÐ+<Ð=ˆä×"Ñ"Ø:ØØÜ�‹MÜ�‹Kô	
ð	Ø$(×$6Ñ$6×$;Ñ$;Øà!%§¡Ø$6ñð Øð %<ó %÷ ˆHð ×%Ñ%Ô'Ø0@À(Ç-Á-Ã/Ð/RˆDØ Ð!1Ñ2ˆFô 	×"Ñ"Ø0Ø�J‰J�zÓ"Ø�J‰J�}Ó%ô	
ð !Ÿ*™* ZÓ0Ò;°Gˆà�wÒØ!'§¡¨M¸9Ó!EˆKØ$Ÿj™j¨°RÓ8ˆHØ &§
¡
¨<¸Ó =ˆJÜ*Ø#×2Ñ2Ø3°K°=ÀÈjÈ\ÐYdÐemÐdnÐnoÐpØ $ôð ð �xÒØ$Ÿj™jÐ)<Ó=ˆHÙÙ&Ø4<�FÐ0Ñ1Ø˜fÑ$Ø'+×'HÑ'HØ ó(�Iñ !Ø*3˜˜w™àˆùò[ Mð4úô ò 	Ü ×&Ñ&Ð'BÄCÈÃHÔMØ×"Ò"Ü.Ø#'×#6Ñ#6ØQÐRUÐQVÐWôð ðð �Mûð	üsW   ‚AI0ÁH
Á*A I0Ã/H Ã:HÃ;+H Ä&C)I0ÈH È	I-ÈAI(É"I-É#I0É(I-É-I0ri   c                 ón  — g }| D ]­  }|j                  d«      dk7  rŒ|j                  d«      }t        |t        «      r|j                  |«       ŒKt        |t        «      sŒ\|D ]M  }t        |t
        «      sŒ|j                  d«      dk(  sŒ)|j                  d«      }|sŒ=|j                  |«       ŒO Œ¯ |S )zóExtract text content from user-role messages only.

        Only user messages are extracted to avoid injecting system or
        assistant content into the ``texts`` list, which should mirror
        the original user-provided input.
        re   rd   rf   Útyper   )rB   Ú
isinstancer"   Úappendr%   Údict)ri   r`   rp   rf   Úitemr   s         r(   r~   z1PromptGuardGuardrail._extract_texts_from_messagesÑ   s§   € ð #%ˆØò 	/ˆGØ�{‰{˜6Ó" fÒ,ØØ—k‘k )Ó,ˆGÜ˜'¤3Ô'Ø—‘˜WÕ%Ü˜G¤TÕ*Ø#ò /�DÜ! $¬Õ-°$·(±(¸6Ó2BÀfÓ2LØ#Ÿx™x¨Ó/˜ÚØ!ŸL™L¨Õ.ñ	/ð	/ð ˆr'   )NNNrT   )r   r   r    r"   Úboolr   rJ   Ústaticmethodr‰   rR   Úclassmethodr%   r   rH   r   r   rŒ   Úobjectr   r   r‡   r   r~   Ú__classcell__)rM   s   @r(   r0   r0   <   s)  ø„ ð #Ø#Ø&*ñ	$#à�t‘ð$#ð ˜‘*ð$#ð ˜t™ð	$#ð
 ð$#ð 
õ$#ðL ð&˜dÐ#9Ñ:¸TÑAò &ó ð&ð ð
¨$Ð/BÑ*Cò 
ó ð
ð ð 6:ñ\à)ð\ð ˜3 ˜;Ñ'ð\ð Ð1Ñ2ð	\ð
 Ð1Ñ2ð\ð 
#ò\ó ð\ð| ð¨tÐ4DÑ/Eð È$ÈsÉ)ò ó ôr'   r0   )(r!   r@   Útypingr   r   r   r   r   r   Útyping_extensionsr	   Úlitellm._loggingr
   Úlitellm.exceptionsr   Ú%litellm.integrations.custom_guardrailr   r   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.guardrailsr   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   r^   Ú3litellm.types.proxy.guardrails.guardrail_hooks.baser   r   r#   r   r   r+   r|   r.   r0   r&   r'   r(   ú<module>rž      s‹   ðòó 
ß J× Jå &å 1Ý 7÷÷õ 9Ý 6Ý 9áõõð 8Ð �5Ó 7Ø(€�Ó (ô8 )°5õ 8ô:˜)ô :ô	 Iô 	ôj˜?õ jr'   