Ë
    uPêj†/  ã                   óì   — U d 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 erddlmZ ddlmZ dd	l
mZ dd
lmZ  G d„ de	«      Zi aeeee	   f   ed<   deeee	   f   fd„Z G d„ de	«      Zy)zù
Pass-Through Endpoint Message Handler for Unified Guardrails

This module provides a handler for passthrough endpoint requests.
It uses the field targeting configuration from litellm_logging_obj
to extract specific fields for guardrail processing.
é    )ÚTYPE_CHECKINGÚAnyÚFinalÚOptional)Úverbose_proxy_logger)ÚBaseTranslation)ÚPassThroughGuardrailSettings)ÚGenericGuardrailAPIInputs)ÚCustomGuardrail)ÚLogging)ÚUserAPIKeyAuth)ÚProxyLoggingc                   ó²   — e Zd ZdZded   dedz  dedz  fd„Zded	e	e   dz  defd
„Z
	 ddeddded   defd„Z	 	 	 ddeddded   dedz  dedz  defd„Zy)ÚPassThroughEndpointHandlerzÓ
    Handler for processing passthrough endpoint requests with guardrails.

    Uses passthrough_guardrails_config from litellm_logging_obj
    to determine which fields to extract for guardrail processing.
    Úlitellm_logging_objÚLiteLLMLoggingObjÚguardrail_nameNÚreturnc                 ó\   — ddl m} |€yt        |dd«      }|r|sy|j                  ||«      S )zW
        Get the guardrail settings for a specific guardrail from logging_obj.
        r   )ÚPassthroughGuardrailHandlerNÚpassthrough_guardrails_config)Ú;litellm.proxy.pass_through_endpoints.passthrough_guardrailsr   ÚgetattrÚget_settings)Úselfr   r   r   Úpassthrough_configs        ú|/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/pass_through/guardrail_translation/handler.pyÚ_get_guardrail_settingsz2PassThroughEndpointHandler._get_guardrail_settings   s@   € õ	
ð Ð&Øä$+Ð,?ÐA`ÐbfÓ$gÐÙ!©Øà*×7Ñ7Ð8JÈNÓ[Ð[ó    ÚdataÚfield_expressionsc                 óH  — ddl m} |r8|j                  ||¬«      }t        j                  d|r|dd «       |S d«       |S ddlm} |j                  «       D ��ci c]  \  }}|j                  d«      rŒ|d	vsŒ||“Œ! }}}t        j                  d
«        ||«      S c c}}w )z»
        Extract text from data for guardrail processing.

        If field_expressions provided, extracts only those fields.
        Otherwise, returns the full payload as JSON.
        r   )ÚJsonPathExtractor)r    Újsonpath_expressionsz9PassThroughEndpointHandler: Extracted targeted fields: %sNéÈ   )Ú
safe_dumpsÚ_)Úmetadatar   z<PassThroughEndpointHandler: Using full payload for guardrail)	Ú7litellm.proxy.pass_through_endpoints.jsonpath_extractorr#   Úextract_fieldsr   ÚdebugÚ*litellm.litellm_core_utils.safe_json_dumpsr&   ÚitemsÚ
startswith)	r   r    r!   r#   Útextr&   ÚkÚvÚpayload_to_checks	            r   Ú_extract_text_for_guardrailz6PassThroughEndpointHandler._extract_text_for_guardrail4   sÃ   € õ	
ñ Ø+×:Ñ:ØØ%6ð ;ó ˆDô !×&Ñ&ØKÙ"��T�c�
ôð ˆKð )-ôð ˆKõ 	Jð "ŸZ™Z›\÷#
Ù�Q˜°·±¸cÕ1BÀqÐPsÒGsˆAˆq‰Dð#
Ðñ #
ô 	×"Ñ"Ð#aÔbÙÐ*Ó+Ð+ùó	#
s   ÁBÁ4BÁ9BÚguardrail_to_applyr   c              ƒ   ót  K  — |j                   }t        j                  d|«       | j                  ||«      }|r|j                  nd}| j                  ||«      }|st        j                  d«       |S t        |g¬«      }|j                  d«      }	|	r|	|d<   |j                  ||d|¬«      ƒ d{  –—† }
|S 7 Œ­w)zZ
        Process input by applying guardrails to targeted fields or full payload.
        z=PassThroughEndpointHandler: Processing input for guardrail=%sNz@PassThroughEndpointHandler: No text to check, skipping guardrail©ÚtextsÚmodelÚrequest©ÚinputsÚrequest_dataÚ
input_typeÚlogging_obj)	r   r   r+   r   Úrequest_fieldsr3   r
   ÚgetÚapply_guardrail)r   r    r4   r   r   Úsettingsr!   Útext_to_checkr;   r8   Ú_guardrailed_inputss              r   Úprocess_input_messagesz1PassThroughEndpointHandler.process_input_messagesW   sÔ   è ø€ ð !3× AÑ AˆÜ×"Ñ"ØKØô	
ð ×6Ñ6Ð7JÈNÓ[ˆÙ>F 8×#:Ò#:ÈDÐð  $×?Ñ?ÀÐFWÓXˆáÜ ×&Ñ&Ð'iÔjØˆKô 2¸¸ÔHˆà—x‘x Ó(ˆÙØ#ˆF�7‰OØ+=×+MÑ+MØØØ Ø+ð	 ,Nó ,
÷ &
Ðð ˆð&
ús   ‚B-B8Â/B6Â0B8ÚresponseÚuser_api_key_dictr<   c              ƒ   ó”  K  — t        |t        «      st        j                  d«       |S |j                  }t        j                  d|«       | j                  ||«      }|r|j                  nd}| j                  ||«      }	|	s|S |€%t        |t        «      sd|in|j                  «       }n)d|vr%t        |t        «      s|n|j                  «       |d<   d|vr| j                  |«      }
|
r|
|d<   t        |	g¬«      }t        |t        «      r|j                  d«      nd}|r||d<   |j                  ||d|¬«      ƒ d{  –—† }|S 7 Œ­w)	aU  
        Process output response by applying guardrails to targeted fields.

        Args:
            response: The response to process
            guardrail_to_apply: The guardrail instance to apply
            litellm_logging_obj: Optional logging object
            user_api_key_dict: User API key metadata to pass to guardrails
        z<PassThroughEndpointHandler: Response is not a dict, skippingz>PassThroughEndpointHandler: Processing output for guardrail=%sNrF   Úlitellm_metadatar6   r8   r:   )Ú
isinstanceÚdictr   r+   r   r   Úresponse_fieldsr3   ÚcopyÚ'transform_user_api_key_dict_to_metadatar
   r@   rA   )r   rF   r4   r   rG   r<   r   rB   r!   rC   Úuser_metadatar;   Úresponse_modelrD   s                 r   Úprocess_output_responsez2PassThroughEndpointHandler.process_output_response€   sg  è ø€ ô" ˜(¤DÔ)Ü ×&Ñ&Ð'eÔfØˆOà 2× AÑ AˆÜ×"Ñ"ØLØô	
ð ×6Ñ6Ð7JÈNÓ[ˆÙ?G 8×#;Ò#;ÈTÐð  $×?Ñ?ÀÐJ[Ó\ˆáØˆOð ÐÜ9CÀHÌdÔ9S˜J¨Ñ1ÐYa×YfÑYfÓYh‰Là Ñ-Ü;EÀhÔPTÔ;U©8Ð[c×[hÑ[hÓ[j�˜ZÑ(ð  \Ñ1Ø#'×#OÑ#OÐPaÓ#bˆMÙØ3@�Ð/Ñ0ô 2¸¸ÔHˆä9CÀHÌdÔ9S §¡¨WÔ 5ÐY]ˆÙØ,ˆF�7‰OØ+=×+MÑ+MØØ%Ø!Ø+ð	 ,Nó ,
÷ &
Ðð ˆð&
ús   ‚D=EÄ?EÅ E©N©NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr	   r   rK   Úlistr3   r   rE   rQ   © r   r   r   r      sþ   „ ñð\à%Ð&9Ñ:ð\ð ˜d™
ð\ð 
&¨Ñ	,ó	\ð*!,àð!,ð   ™9 tÑ+ð!,ð 
ó	!,ðN >Bñ	'àð'ð .ð'ð &Ð&9Ñ:ð	'ð
 
ó'ðZ >BØ(,Ø$(ñ@àð@ð .ð@ð &Ð&9Ñ:ð	@ð
  ™:ð@ð ˜T‘kð@ð 
ô@r   r   Ú_PROVIDER_HANDLERSr   c                  ó.   — t         s
ddlm}  d| ia t         S )Nr   ©Ú"BedrockPassthroughGuardrailHandlerÚbedrock)r[   Ú>litellm.llms.bedrock.passthrough.guardrail_translation.handlerr^   r]   s    r   Ú_get_provider_handlersra   Æ   s   € åõ	
ð (Ð)KÐLÐÜÐr   c                   ó"  — e Zd ZdZ	 ddeddded   defd	„Z	 	 	 dd
eddded   dedz  dedz  defd„Ze	de
dz  de
defd„«       Ze	de
dz  de
dz  fd„«       Ze	de
dz  fd„«       Ze	de
dz  de
dz  defd„«       Ze	dedddddedef
d„«       Zy)ÚLlmPassthroughRouteHandlerzÆ
    Dispatcher for allm_passthrough_route guardrail translation.

    Routes to a per-provider handler based on data["custom_llm_provider"].
    Unknown providers are skipped with a debug log.
    Nr    r4   r   r   r   r   c              ƒ   óà   K  — |j                  d«      }t        «       j                  |xs d«      }|€t        j                  d|«       |S  |«       j	                  |||¬«      ƒ d {  –—† S 7 Œ­w)NÚcustom_llm_providerÚ úJLlmPassthroughRouteHandler: no handler for provider=%s, skipping guardrail)r    r4   r   )r@   ra   r   r+   rE   )r   r    r4   r   ÚproviderÚhandler_clss         r   rE   z1LlmPassthroughRouteHandler.process_input_messagesÙ   s|   è ø€ ð Ÿ(™(Ð#8Ó9ˆÜ3Ó5×9Ñ9¸(º.ÀbÓIˆØÐÜ ×&Ñ&Ø\Øôð ˆKÙ “]×9Ñ9ØØ1Ø 3ð :ó 
÷ 
ð 	
ð 
ús   ‚A%A.Á'A,Á(A.rF   rG   r<   c              ƒ   óì   K  — |xs i j                  d«      }t        «       j                  |xs d«      }|€t        j                  d|«       |S  |«       j	                  |||||¬«      ƒ d {  –—† S 7 Œ­w)Nre   rf   rg   )rF   r4   r   rG   r<   )r@   ra   r   r+   rQ   )r   rF   r4   r   rG   r<   rh   ri   s           r   rQ   z2LlmPassthroughRouteHandler.process_output_responseí   s‰   è ø€ ð (Ò-¨2×2Ñ2Ð3HÓIˆÜ3Ó5×9Ñ9¸(º.ÀbÓIˆØÐÜ ×&Ñ&Ø\Øôð ˆOÙ “]×:Ñ:ØØ1Ø 3Ø/Ø%ð ;ó 
÷ 
ð 	
ð 
ús   ‚A+A4Á-A2Á.A4rh   Úcontent_typec                 ól   — t        «       j                  | xs d«      }t        |dd «      }|€y ||«      S )Nrf   Úis_event_stream_content_typeF©ra   r@   r   )rh   rk   ri   Údetectors       r   Úis_event_stream_responsez3LlmPassthroughRouteHandler.is_event_stream_response  s<   € ä3Ó5×9Ñ9¸(º.ÀbÓIˆÜ! +Ð/MÈtÓTˆØÐØÙ˜Ó%Ð%r   c                 ój   — t        «       j                  | xs d«      }t        |dd «      }|€y  |«       S )Nrf   Úevent_stream_media_typern   )rh   ri   Úgetters      r   rr   z2LlmPassthroughRouteHandler.event_stream_media_type  s7   € ä3Ó5×9Ñ9¸(º.ÀbÓIˆÜ Ð-FÈÓMˆØˆ>ØÙ‹xˆr   c                 óV   — t        «       j                  | xs d«      }t        |dd «      S )Nrf   Úde_anonymize_event_streamrn   )rh   ri   s     r   Ú#_resolve_event_stream_de_anonymizerz>LlmPassthroughRouteHandler._resolve_event_stream_de_anonymizer  s)   € ä3Ó5×9Ñ9¸(º.ÀbÓIˆÜ�{Ð$?ÀÓFÐFr   Úendpointc                 ót   — t        «       j                  | xs d«      }t        |dd «      }|€y ||xs d«      S )Nrf   Ú(event_stream_endpoint_is_de_anonymizableFrn   )rh   rw   ri   Úendpoint_checks       r   Ú&supports_event_stream_de_anonymizationzALlmPassthroughRouteHandler.supports_event_stream_de_anonymization  sA   € ä3Ó5×9Ñ9¸(º.ÀbÓIˆÜ '¨Ð5_ÐaeÓ fˆØÐ!ØÙ˜hšn¨"Ó-Ð-r   Ú
body_bytesÚproxy_logging_objr   r   c              ƒ   ó¶   K  — |j                  d«      }t        j                  |«      }|€t        j                  d|«       | S  || |||¬«      ƒ d {  –—† S 7 Œ­w)Nre   z^LlmPassthroughRouteHandler: no event-stream handler for provider=%s, leaving stream unmodified)r|   r}   rG   r    )r@   rc   rv   r   r+   )r|   r}   rG   r    rh   Úde_anonymizes         r   ru   z4LlmPassthroughRouteHandler.de_anonymize_event_stream"  sm   è ø€ ð Ÿ(™(Ð#8Ó9ˆÜ8×\Ñ\Ð]eÓfˆØÐÜ ×&Ñ&ØpØôð ÐÙ!Ø!Ø/Ø/Øô	
÷ 
ð 	
ð 
ús   ‚AAÁAÁArR   rS   )rT   rU   rV   rW   rK   r   r   rE   rQ   ÚstaticmethodrX   Úboolrp   rr   rv   r{   Úbytesru   rZ   r   r   rc   rc   Ñ   s…  „ ñð >Bñ	
àð
ð .ð
ð &Ð&9Ñ:ð	
ð
 
ó
ð0 >BØ(,Ø$(ñ
àð
ð .ð
ð &Ð&9Ñ:ð	
ð
  ™:ð
ð ˜T‘kð
ð 
ó
ð0 ð&¨3°©:ð &ÀSð &ÈTò &ó ð&ð ð¨#°©*ð ¸¸t¹ò ó ðð ðG°c¸D±jò Gó ðGð ð.¸¸t¹ð .ÈsÐUYÉzð .Ð^bò .ó ð.ð ð
Øð
à)ð
ð ,ð
ð ð	
ð
 
ò
ó ñ
r   rc   N)rW   Útypingr   r   r   r   Úlitellm._loggingr   Ú<litellm.llms.base_llm.guardrail_translation.base_translationr   Úlitellm.proxy._typesr	   Úlitellm.types.utilsr
   Ú%litellm.integrations.custom_guardrailr   Ú*litellm.litellm_core_utils.litellm_loggingr   r   r   Úlitellm.proxy.utilsr   r   r[   rK   rX   ÚtypeÚ__annotations__ra   rc   rZ   r   r   ú<module>r�      s�   ðò÷ 7Ó 6å 1Ý XÝ =Ý 9áÝEÝWÝ3Ý0ôi ô iðX 8:Ð �D˜˜d ?Ñ3Ð3Ñ4Ó 9ð  S¨$¨Ñ*?Ð%?Ñ @ó ôe
 õ e
r   