Ë
    tPêjä1  ã                   ó  — U d 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	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 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 «      Z! G d„ de«      Z" G d„ de«      Z#y)zçOvalix guardrail integration: pre- and post-call checks via the Tracker service.

Use Ovalix Guardrails for your LLM calls. Supports pre_call (user input) and
post_call (model output) checkpoints with optional correction/blocking.
é    N)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteral)Úverbose_proxy_logger)ÚGuardrailRaisedException)ÚCustomGuardrailÚlog_guardrail_information)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚGuardrailEventHooks)ÚGenericGuardrailAPIInputs)ÚLogging)ÚGuardrailConfigModelz"This message was blocked by OvalixÚ"BLOCKED_BY_OVALIX_FALLBACK_MESSAGEÚblockÚBLOCKED_ACTION_TYPEc                   ó   — e Zd ZdZy)ÚOvalixGuardrailMissingSecretszZRaised when required Ovalix config (API base, key, application/checkpoint IDs) is missing.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/ovalix/ovalix.pyr   r   $   s   „ Údr   r   c                   óB   ‡ — e Zd ZdZdZ	 	 	 ddedz  dedefˆ fd„Zˆ xZS )	ÚOvalixGuardrailBlockedExceptionz“
    Raised when Ovalix blocks a message. Sets status_code=400 so the proxy
    returns 400 and HTTP clients do not retry (they retry on 5xx).
    i�  NÚguardrail_nameÚmessageÚ should_wrap_with_default_messagec                 ó,   •— t         ‰| �  |||d¬«       y )NT)r   r    r!   Úblocked_content)ÚsuperÚ__init__)Úselfr   r    r!   Ú	__class__s       €r   r%   z(OvalixGuardrailBlockedException.__init__0   s#   ø€ ô 	‰ÑØ)ØØ-MØ ð	 	õ 	
r   )NÚ T)	r   r   r   r   Ústatus_codeÚstrÚboolr%   Ú__classcell__©r'   s   @r   r   r   (   sD   ø„ ñð
 €Kð &*ØØ15ñ	
à˜d™
ð
ð ð
ð +/÷	
ñ 
r   r   c                   óŽ  ‡ — e Zd ZdZedee   fd„«       Z	 	 	 	 	 d&dedz  dedz  dedz  dedz  d	edz  d
e	fˆ fd„Z
dee   ddfd„Zdedefd„Zdedefd„Zdedefd„Zdededededeee	f   f
d„Ze	 d'dededed   dddef
d„«       Zdee   dedededee   f
d„Zd eddfd!„Zd"ededz  fd#„Zeded$   dz  fd%„«       Zˆ xZS )(ÚOvalixGuardrailz»
    Ovalix guardrail: pre-prompt (pre_call) and post-prompt (post_call) checks
    via the Tracker service, with application and checkpoint resolution from the
    Monolith backend.
    Úreturnc                 óB   — t         j                  t         j                  gS ©N)r   Úpre_callÚ	post_call)Úclss    r   Úget_supported_event_hooksz)OvalixGuardrail.get_supported_event_hooksE   s    € ô  ×(Ñ(Ü×)Ñ)ð
ð 	
r   NÚtracker_api_baseÚtracker_api_keyÚapplication_idÚpre_checkpoint_idÚpost_checkpoint_idÚkwargsc                 ó  •— |xs t         j                  j                  d«      | _        |xs t         j                  j                  d«      | _        |xs t         j                  j                  d«      | _        |xs t         j                  j                  d«      | _        |xs t         j                  j                  d«      | _        d|vrg |d<   | j                  |d   «       t        j                  d| j                  › �dd	œd
¬«      | _        t        t        j                  ¬«      | _        t!        ‰| �D  di |¤Ž t%        j&                  d| j                  | j
                  | j                  | j                  «       y )NÚOVALIX_TRACKER_API_BASEÚOVALIX_TRACKER_API_KEYÚOVALIX_APPLICATION_IDÚOVALIX_PRE_CHECKPOINT_IDÚOVALIX_POST_CHECKPOINT_IDÚsupported_event_hookszBearer zapplication/json)ÚAuthorizationzContent-Typezutf-8)Úencoding)Úllm_providerzhOvalix Guardrail initialized: tracker=%s, application_id=%s, pre_checkpoint_id=%s, post_checkpoint_id=%sr   )ÚosÚenvironÚgetÚ_tracker_api_baseÚ_tracker_api_keyÚ_application_idÚ_pre_checkpoint_idÚ_post_checkpoint_idÚ_validate_configÚhttpxÚHeadersÚ_tracker_headersr   r   ÚGuardrailCallbackÚ_async_handlerr$   r%   r   Údebug)r&   r7   r8   r9   r:   r;   r<   r'   s          €r   r%   zOvalixGuardrail.__init__L   s=  ø€ ð "2Ò!^´R·Z±Z·^±^ÐD]Ó5^ˆÔØ /Ò [´2·:±:·>±>ÐBZÓ3[ˆÔØ-ÒX´·±·±Ð@WÓ1XˆÔØ"3Ò"a´r·z±z·~±~ÐF`Ó7aˆÔØ#5Ò#d¼¿¹¿¹ÐHcÓ9dˆÔ à"¨&Ñ0Ø.0ˆFÐ*Ñ+à×Ñ˜fÐ%<Ñ=Ô>ä %§¡à#*¨4×+@Ñ+@Ð*AÐ!BØ 2ñð ô!
ˆÔô 5ÔBV×BhÑBhÔiˆÔä‰ÑÑ"˜6Ò"Ü×"Ñ"ØvØ×"Ñ"Ø× Ñ Ø×#Ñ#Ø×$Ñ$õ	
r   rC   c                 óú  — g }| j                   s|j                  d«       | j                  s|j                  d«       | j                  s|j                  d«       | j                  s#t
        j                  |v r|j                  d«       | j                  s#t
        j                  |v r|j                  d«       | j                  s| j                  s|j                  d«       |rt        ddj                  |«      z   «      ‚| j                  r1t
        j                  |vr|j                  t
        j                  «       | j                  r3t
        j                  |vr |j                  t
        j                  «       y	y	y	)
zXEnsure required secrets and checkpoint IDs are set; auto-add hooks when IDs are present.zFTracker API base, set OVALIX_TRACKER_API_BASE or pass tracker_api_basezCTracker API key, set OVALIX_TRACKER_API_KEY or pass tracker_api_keyz@Application ID, set OVALIX_APPLICATION_ID or pass application_idzIPre-checkpoint ID, set OVALIX_PRE_CHECKPOINT_ID or pass pre_checkpoint_idzLPost-checkpoint ID, set OVALIX_POST_CHECKPOINT_ID or pass post_checkpoint_idz’Pre-checkpoint ID or Post-checkpoint ID, set OVALIX_PRE_CHECKPOINT_ID or OVALIX_POST_CHECKPOINT_ID or pass pre_checkpoint_id or post_checkpoint_idz/Missing Ovalix guardrail configuration errors: z. N)rJ   ÚappendrK   rL   rM   r   r3   rN   r4   r   Újoin)r&   rC   Úerrorss      r   rO   z OvalixGuardrail._validate_configs   s>  € à#%ˆà×%Ò%Ø�M‰MÐbÔcØ×$Ò$Ø�M‰MÐ_Ô`Ø×#Ò#Ø�M‰MÐ\Ô]Ø×&Ò&Ô+>×+GÑ+GÐK`Ñ+`Ø�M‰MÐeÔfØ×'Ò'Ô,?×,IÑ,IÐMbÑ,bØ�M‰MÐhÔiØ×&Ò&¨t×/GÒ/GØ�M‰Mð eôñ Ü/Ð0aÐdh×dmÑdmÐntÓduÑ0uÓvÐvð ×"Ò"Ô':×'CÑ'CÐK`Ñ'`Ø!×(Ñ(Ô)<×)EÑ)EÔFØ×#Ò#Ô(;×(EÑ(EÐMbÑ(bØ!×(Ñ(Ô)<×)FÑ)FÕGð )cÐ#r   Údatac                 ó¬   — |j                  d«      xs |j                  d«      xs i }|j                  d«      r|d   S |j                  d«      r|d   S y)zOReturn a stable actor identifier from request metadata (e.g. user email or id).ÚmetadataÚlitellm_metadataÚuser_api_key_user_emailÚuser_api_key_user_idÚunknown)rI   )r&   rZ   r\   s      r   Ú
_get_actorzOvalixGuardrail._get_actor�   sZ   € àŸ(™( :Ó.ÒT°$·(±(Ð;MÓ2NÒTÐRTˆØ�<‰<Ð1Ô2ØÐ5Ñ6Ð6Ø�<‰<Ð.Ô/ØÐ2Ñ3Ð3Ør   c                 ó�   — | j                  |«      j                  «       }t        j                  |«      j	                  «       dd }|S )zLNormalize the actor string into a short, stable id for Tracker API payloads.Né   )ra   ÚencodeÚhashlibÚsha256Ú	hexdigest)r&   rZ   Úactor_idÚnormalized_actor_ids       r   Ú_get_tracker_actor_idz%OvalixGuardrail._get_tracker_actor_id˜   s@   € ð Ÿ/™/¨$Ó/×6Ñ6Ó8ˆÜ%,§^¡^°HÓ%=×%GÑ%GÓ%IÈ"È1Ð%MÐØ"Ð"r   c                 óØ   — | j                  |«      }t        j                  j                  t        j                  j                  «      j                  d«      }|› d|› d| j                  › �S )zPReturn a unique identifier for the chat/session (actor + date + application_id).z%Y-%m-%dÚ_)rj   ÚdatetimeÚnowÚtimezoneÚutcÚstrftimerL   )r&   rZ   Ú
actor_hashÚtodays       r   Ú_get_session_idzOvalixGuardrail._get_session_id¢   s]   € à ×6Ñ6°tÓ<ˆ
Ü×(Ñ(×,Ñ,¬X×->Ñ->×-BÑ-BÓC×LÑLÈZÓXˆØ�˜Q˜u˜g Q t×';Ñ';Ð&<Ð=Ð=r   ÚcontentÚcheckpoint_idÚactorÚ
session_idc              ƒ   ó.  K  — | j                   }|r|st        d«      ‚| j                  › d�}t        | j                  «      }||||dd|idœ}| j
                  j                  |||¬«      ƒ d{  –—† }	|	j                  «        |	j                  «       S 7 Œ$­w)zDCall the Ovalix Tracker checkpoint API and return the JSON response.z4Ovalix: application_id or checkpoint_id not resolvedz'/tracking/custom_application/checkpointÚTEXTru   )r9   rv   rw   rx   Ú	data_typerZ   )ÚheadersÚjsonN)	rL   Ú
ValueErrorrJ   ÚdictrR   rT   ÚpostÚraise_for_statusr}   )
r&   ru   rv   rw   rx   r9   Úurlr|   ÚpayloadÚresponses
             r   Ú_call_checkpointz OvalixGuardrail._call_checkpoint¨   s§   è ø€ ð !%× 4Ñ 4ˆÙ¡]ÜÐSÓTÐTà×.Ñ.Ð/Ð/VÐWˆÜ˜d×3Ñ3Ó4ˆà,Ø*ØØ$ØØ Ð(ñ
ˆð !%× 3Ñ 3× 8Ñ 8¸ÀgÐT[Ð 8Ó \×\ˆØ×!Ñ!Ô#Ø�}‰}‹Ðð ]ús   ‚A,BÁ.BÁ/%BÚinputsÚrequest_dataÚ
input_type)Úrequestr„   Úlogging_objzLiteLLMLoggingObj | Nonec              ƒ   óÖ  K  — | j                   s| j                  s|S | j                  |«      }| j                  |«      }|j	                  d«      xs g }|rt        |t        «      s|S |dk(  r<| j                  s|S | j                  |||| j                  «      ƒ d{  –—† }i |¥d|i¥S | j                   r.| j                  |||| j                   «      ƒ d{  –—† }	i |¥d|	i¥S |S 7 ŒH7 Œ­w)av  
        Apply Ovalix guardrail to the given inputs (request or response text).

        Used by the unified guardrail flow and the /apply_guardrail API.
        For "request", uses the pre-checkpoint; for "response", uses the post-checkpoint.

        Args:
            inputs: Guardrail API inputs (e.g. texts to check).
            request_data: Full request payload (messages, metadata, response).
            input_type: "request" (pre_call) or "response" (post_call).
            logging_obj: Optional logging context.

        Returns:
            Updated inputs (e.g. with replaced/corrected texts, or unchanged).
        Útextsr„   N)rM   rN   rj   rt   rI   Ú
isinstanceÚlistÚ"_generate_post_guardrail_llm_texts)
r&   r†   r‡   rˆ   rŠ   Útracker_actor_idrx   rŒ   Úcorrected_llm_responsesÚpost_guardrail_textss
             r   Úapply_guardrailzOvalixGuardrail.apply_guardrailÂ   s	  è ø€ ð. ×&Ò&¨t×/GÒ/GØˆMà"&×"<Ñ"<¸\Ó"JÐØ ×0Ñ0°Ó>ˆ
Ø—z‘z 'Ó*Ò0¨bˆÙœJ u¬dÔ3ØˆMà˜Ò#Ø×+Ò+Ø�Ø37×3ZÑ3ZØÐ'¨°T×5MÑ5Mó4÷ .Ð#ð @�fÐ?˜gÐ'>Ñ?Ð?à×"Ò"Ø04×0WÑ0WØÐ'¨°T×5LÑ5Ló1÷ +Ð ð =�fÐ<˜gÐ';Ñ<Ð<Øˆð.øð+ús$   ‚BC)ÂC%Â9C)ÃC'ÃC)Ã'C)rŒ   c              ƒ   ó6  K  — g }d}t        |«      D ]½  }	 | j                  ||||«      ƒ d{  –—† }|j                  d«      xs dj                  «       }
| j                  |«      xs t        }|
t        k(  r|r| j                  |«       nC|
t        k(  r|j                  d	|«       n'| j                  |«      xs |}|j                  d	|«       d}Œ¿ |S 7 Œ¦# t        $ r7}	t        j                  d|	«       t        | j                  d|	› �d¬«      |	‚d}	~	ww xY w­w)
zBGenerate post-guardrail LLM responses for the given LLM responses.TNz1Ovalix apply_guardrail checkpoint call failed: %szOvalix guardrail error: F©r   r    r!   Úaction_typer(   r   )Úreversedr…   Ú	Exceptionr   Ú	exceptionr   r   rI   ÚlowerÚ_get_trackers_corrected_messager   r   Ú_block_current_messageÚinsert)r&   rŒ   rw   rx   rv   r’   Úis_first_responseÚllm_responseÚrespÚer–   Úblocking_messageÚcorrected_texts                r   r�   z2OvalixGuardrail._generate_post_guardrail_llm_textsñ   s3  è ø€ ð 24Ðà ÐÜ$ U›Oò 	&ˆLðØ!×2Ñ2°<ÀÐPUÐWaÓb×b�ð  Ÿ8™8 MÓ2Ò8°b×?Ñ?ÓAˆKØ#×CÑCÀDÓIÒoÔMoÐØÔ1Ò1Ñ6GØ×+Ñ+Ð,<Õ=ØÔ 3Ò3Ø$×+Ñ+¨AÐ/?Õ@à!%×!EÑ!EÀdÓ!KÒ![È|�Ø$×+Ñ+¨A¨~Ô>Ø %Ñð)	&ð* $Ð#ð' cùÜò Ü$×.Ñ.Ð/bÐdeÔfÜ.Ø#'×#6Ñ#6Ø6°q°cÐ:Ø5:ôð ð	ûðüs8   ‚D–C­C®C²B"DÃCÃ	DÃ2DÄDÄDr¢   c                 ó2   — t        | j                  |d¬«      ‚)zRRaise OvalixGuardrailBlockedException with the given message (no default wrapper).Fr•   )r   r   )r&   r¢   s     r   rœ   z&OvalixGuardrail._block_current_message  s   € ä-Ø×.Ñ.Ø$Ø-2ô
ð 	
r   r    c                 óX   — |j                  d«      }t        |t        «      r	d|v r|d   S y)zLExtract corrected/blocking message content from Tracker checkpoint response.Úmodified_dataru   N)rI   r�   r   )r&   r    Úmodifieds      r   r›   z/OvalixGuardrail._get_trackers_corrected_message  s/   € àŸ(™( ?Ó3ˆÜ�h¤Ô%¨)°xÑ*?Ø˜IÑ&Ð&Ør   r   c                  ó   — ddl m}  | S )Nr   ©ÚOvalixGuardrailConfigModel)Ú5litellm.types.proxy.guardrails.guardrail_hooks.ovalixrª   r©   s    r   Úget_config_modelz OvalixGuardrail.get_config_model  s   € õ	
ð *Ð)r   )NNNNNr2   )r   r   r   r   ÚclassmethodrŽ   r   r6   r*   r   r%   rO   r   ra   rj   rt   r…   r
   r   r   r“   r�   rœ   r›   ÚstaticmethodÚtyper¬   r,   r-   s   @r   r/   r/   >   sö  ø„ ñð ð
¨$Ð/BÑ*Cò 
ó ð
ð (,Ø&*Ø%)Ø(,Ø)-ñ%
à ™*ð%
ð ˜t™ð%
ð ˜d™
ð	%
ð
  ™:ð%
ð   $™Jð%
ð õ%
ðNH°dÐ;NÑ6Oð HÐTXó Hð8˜tð ¨ó ð#¨$ð #°3ó #ð> Dð >¨Só >ðàðð ðð ð	ð
 ðð 
ˆc�3ˆh‰óð4 ð 37ñ,à)ð,ð ð,ð Ð1Ñ2ð	,ð
 0ð,ð 
#ò,ó ð,ð\$Ø˜#‘Yð$Ø'*ð$Ø8;ð$ØLOð$à	ˆc‰ó$ð<
°sð 
¸tó 
ð°Dð ¸SÀ4¹Zó ð ð*˜dÐ#9Ñ:¸TÑAò *ó ô*r   r/   )$r   rm   re   rG   Útypingr   r   r   r   rP   Úlitellm._loggingr   Úlitellm.exceptionsr   Ú%litellm.integrations.custom_guardrailr	   r
   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.guardrailsr   Úlitellm.types.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   ÚLiteLLMLoggingObjÚ3litellm.types.proxy.guardrails.guardrail_hooks.baser   r   Ú__annotations__r   r˜   r   r   r/   r   r   r   ú<module>r»      s�   ðòó Û Û 	ß 5Ó 5ã å 1Ý 7÷÷õ 9Ý 9áÝWÝXð -QÐ " EÓ PØ$Ð �UÓ $ôe Iô eô
Ð&>ô 
ô,f*�oõ f*r   