Ë
    tPêj?H  ã                   óî   — 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	 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Zeed<   dZeed<   dZeed<    G d„ de«      Zy)a@  Akto guardrail integration for LiteLLM proxy.

Uses a two-config-entry pattern:
  - akto-validate (pre_call): Checks request against Akto guardrails, blocks if flagged.
  - akto-ingest (post_call): Sends request+response to Akto for data ingestion.

For monitor-only mode, enable only akto-ingest without akto-validate.
é    N)Údatetime)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteral)ÚHTTPException)Úverbose_proxy_logger)ÚCustomGuardrailÚlog_guardrail_information)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚGuardrailEventHooks)ÚGenericGuardrailAPIInputs)ÚGuardrailConfigModelz/api/http-proxyÚHTTP_PROXY_PATHÚlitellmÚAKTO_CONNECTOR_NAMEé   ÚDEFAULT_GUARDRAIL_TIMEOUTc                   óÐ  ‡ — e Zd ZdZdddœZeded   f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   ded	z  dedd	fˆ fd„Zeded	z  deded	z  fd„«       Zededefd„«       Zdeeef   fd„Zedededeeef   fd„«       Zededeeef   fd„«       Ze	 d0deded	z  deeef   fd„«       Ze	 d0deded	z  deeef   fd„«       Zededeeef   fd„«       Zd d!d"œdeded#ed$edeeef   f
d%„Zdeded&edej<                  fd'„Zedej<                  de eef   fd(„«       Z!ded)e"defd*„Z#deded&edd	fd+„Z$e%	 d0deded,ed-   defd.„«       Z&ˆ xZ'S )1ÚAktoGuardrailzOLiteLLM guardrail hook that validates and ingests LLM traffic via the Akto API.ÚrequestÚresponse)Úpre_callÚ	post_callÚreturnr   c                  ó   — ddl m}  | S )z?Return the Pydantic config model for YAML-based initialization.r   ©ÚAktoConfigModel)Ú3litellm.types.proxy.guardrails.guardrail_hooks.aktor   r   s    úw/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/guardrails/guardrail_hooks/akto/akto.pyÚget_config_modelzAktoGuardrail.get_config_model-   s   € õ	
ð Ðó    c                 óB   — t         j                  t         j                  gS ©N)r   r   r   )Úclss    r!   Úget_supported_event_hooksz'AktoGuardrail.get_supported_event_hooks6   s    € ô  ×(Ñ(Ü×)Ñ)ð
ð 	
r#   NÚakto_base_urlÚakto_api_keyÚakto_account_idÚakto_vxlan_idÚunreachable_fallback)Úfail_closedÚ	fail_openÚguardrail_timeoutÚkwargsc                 óü  •— t        t        j                  ¬«      | _        t	        «       | _        |xs  t        j                  j                  dd«      j                  d«      | _
        | j                  st        d«      ‚|xs  t        j                  j                  dd«      | _        | j                  st        d«      ‚|| _        |xs t        | _        |xs  t        j                  j                  dd	«      | _        |xs  t        j                  j                  d
d«      | _        t%        | j'                  «       «      |d<   t)        ‰| �T  di |¤Ž t-        j.                  d| j                  | j                  «       y)u@  Initialize the Akto guardrail.

        Args:
            akto_base_url: Akto API base URL. Falls back to AKTO_GUARDRAIL_API_BASE env var.
            akto_api_key: Akto API key. Falls back to AKTO_API_KEY env var.
            akto_account_id: Akto account ID. Falls back to AKTO_ACCOUNT_ID env var, then "1000000".
            akto_vxlan_id: Akto VXLAN ID. Falls back to AKTO_VXLAN_ID env var, then "0".
            unreachable_fallback: Behavior when Akto is unreachable â€” block or allow.
            guardrail_timeout: HTTP timeout in seconds for Akto API calls.
        )Úllm_providerÚAKTO_GUARDRAIL_API_BASEÚ ú/zTakto_base_url is required. Set AKTO_GUARDRAIL_API_BASE or pass it in litellm_params.ÚAKTO_API_KEYzHakto_api_key is required. Set AKTO_API_KEY or pass it in litellm_params.ÚAKTO_ACCOUNT_IDÚ1000000ÚAKTO_VXLAN_IDÚ0Úsupported_event_hooksz3Akto guardrail initialized: base_url=%s fallback=%sN© )r   r   ÚGuardrailCallbackÚasync_handlerÚsetÚbackground_tasksÚosÚenvironÚgetÚrstripr(   Ú
ValueErrorr)   r,   r   r/   r*   r+   Úlistr'   ÚsuperÚ__init__r	   Údebug)	Úselfr(   r)   r*   r+   r,   r/   r0   Ú	__class__s	           €r!   rH   zAktoGuardrail.__init__=   s3  ø€ ô( 4Ü-×?Ñ?ô
ˆÔô &)£UˆÔà+Ò\¬r¯z©z¯~©~Ð>WÐY[Ó/\×dÑdÐehÓiˆÔØ×!Ò!ÜÐsÓtÐtà(ÒN¬B¯J©J¯N©N¸>È2Ó,NˆÔØ× Ò ÜÐgÓhÐhàI]ˆÔ!Ø!2Ò!OÔ6OˆÔØ.Ò^´"·*±*·.±.ÐARÐT]Ó2^ˆÔØ*ÒR¬b¯j©j¯n©n¸_ÈcÓ.RˆÔä*.¨t×/MÑ/MÓ/OÓ*PˆÐ&Ñ'Ü‰ÑÑ"˜6Ò"ä×"Ñ"ØAØ×ÑØ×%Ñ%õ	
r#   Úrequest_dataÚkeyc                 óÆ   — | €ydD ]Y  }| j                  |«      xs i }t        |t        «      sŒ)|sŒ,|j                  |«      }|€Œ@t        |«      j	                  «       c S  y)zALook up a metadata value from litellm_metadata or metadata dicts.N)Úlitellm_metadataÚmetadata)rC   Ú
isinstanceÚdictÚstrÚstrip)rL   rM   Údict_keyÚ	containerÚvalues        r!   Úresolve_metadata_valuez$AktoGuardrail.resolve_metadata_valuel   si   € ð ÐØØ8ò 	.ˆHØ$×(Ñ(¨Ó2Ò8°bˆIÜ˜)¤TÕ*ªyØ!Ÿ™ cÓ*�ØÑ$Ü˜u›:×+Ñ+Ó-Ò-ð	.ð r#   c                 ó~   — | j                  d«      xs i }t        |t        «      si }|j                  d«      }|r|S dS )zPExtract the API route from request metadata, defaulting to /v1/chat/completions.rP   Úuser_api_key_request_routez/v1/chat/completions)rC   rQ   rR   )rL   rP   Úroutes      r!   Úextract_request_pathz"AktoGuardrail.extract_request_pathy   sE   € ð  ×#Ñ# JÓ/Ò5°2ˆÜ˜(¤DÔ)ØˆHØ—|‘|Ð$@ÓAˆÙˆuÐ9Ð#9Ð9r#   c                 ó    — d| j                   dœS )z)Build HTTP headers for the Akto API call.úapplication/json)úcontent-typeÚAuthorization)r)   )rJ   s    r!   Úprepare_headerszAktoGuardrail.prepare_headers‚   s   € ð /Ø!×.Ñ.ñ
ð 	
r#   Ú
guardrailsÚingest_datac                 ó2   — dt         i}| rd|d<   |rd|d<   |S )z^Build query params that control Akto backend behavior (guardrail check and/or data ingestion).Úakto_connectorÚtruerb   rc   )r   )rb   rc   Úparamss      r!   Úbuild_query_paramsz AktoGuardrail.build_query_params‰   s.   € ð *:Ô;NÐ(OˆÙØ#)ˆF�<Ñ ÙØ$*ˆF�=Ñ!Øˆr#   c                 ó  — ddi}| j                  di «      }t        |t        «      s|S |j                  d«      }t        |t        «      rC|j                  «       D ]0  \  }}|sŒ	|sŒt	        |«      |t	        |«      j                  «       <   Œ2 |S )z:Build the requestHeaders field from proxy request headers.r_   r^   Úproxy_server_requestÚheaders)rC   rQ   rR   ÚitemsrS   Úlower)rL   rk   Ú	proxy_reqÚproxy_req_headersrM   Úvals         r!   Úbuild_request_headersz#AktoGuardrail.build_request_headers“   sŒ   € ð +9Ð:LÐ)MˆØ'×+Ñ+Ð,BÀBÓGˆ	Ü˜)¤TÔ*ØˆNØ#,§=¡=°Ó#;ÐÜÐ'¬Ô.Ø-×3Ñ3Ó5ò 9‘��SÚš3Ü03°C³�GœC ›HŸN™NÓ,Ò-ð9ð ˆr#   Úinputsc                 óÐ  — | j                  dd«      xs d}d|i}| j                  d«      }|r||d<   na|�3|j                  d«      r"|d   |d<   |j                  d«      r5|d   |d<   n,| j                  dg «      }|r|D �cg c]  }d|dœ‘Œ	 c}ng |d<   | j                  d«      }|r||d<   n|�|j                  d«      r|d   |d<   | j                  d	«      }|r||d	<   |S c c}w )
zJBuild the LLM request body from guardrail inputs (messages, model, tools).Úmodelr4   Ústructured_messagesÚmessagesÚtextsÚuser)ÚroleÚcontentÚtoolsÚ
tool_calls)rC   )	rr   rL   rt   ÚbodyÚ
structuredrw   Útr{   r|   s	            r!   Úbuild_request_bodyz AktoGuardrail.build_request_body¡   s  € ð —z‘z '¨2Ó.Ò4°"ˆØ'.°Ð&6ˆà"ŸJ™JÐ'<Ó=ˆ
ÙØ)ˆD�ÒØÐ%¨,×*:Ñ*:¸:Ô*FØ+¨JÑ7ˆD�ÑØ×Ñ Ô(Ø ,¨WÑ 5��W’à!Ÿ:™: g¨rÓ2ˆEÙRWÈÖNÀ1¨¸AÓ >ÓNÐ]_ˆD�Ñà—z‘z 'Ó*ˆÙØ!ˆD�ŠMØÐ%¨,×*:Ñ*:¸7Ô*CØ(¨Ñ1ˆD�‰Mà"ŸJ™J |Ó4ˆ
ÙØ!+ˆD�Ñàˆùò  Os   ÂC#c                 óÌ   — |r|j                  d«      nd}|�t        |d«      r|j                  «       S | j                  dg «      }|rd|D �cg c]	  }d|ddœi‘Œ c}iS i S c c}w )	zOBuild the LLM response body, preferring the actual model response if available.r   NÚ
model_dumprw   ÚchoicesÚmessageÚ	assistant)rz   ry   )rC   Úhasattrr‚   )rr   rL   Úmodel_responserw   r   s        r!   Úbuild_response_bodyz!AktoGuardrail.build_response_bodyÁ   sy   € ñ AM × 0Ñ 0°Ô <ÐRVˆØÐ%¬'°.À,Ô*OØ!×,Ñ,Ó.Ð.à—z‘z '¨2Ó.ˆÙØÐZ_Ö`ÐUV ¸À;Ñ,OÒ PÒ`ÐaÐaØˆ	ùò  as   ÁA!c                 ó‚   — ddi}t         j                  | d«      }t         j                  | d«      }|r||d<   |r||d<   |S )zCBuild tag/metadata dict with user_id and team_id for Akto tracking.zgen-aizGen AIÚuser_api_key_user_idÚuser_api_key_team_idÚuser_idÚteam_id)r   rX   )rL   ÚtagrŒ   r�   s       r!   Úbuild_tag_metadataz AktoGuardrail.build_tag_metadataÐ   sQ   € ð '/°Ð%9ˆÜ&×=Ñ=¸lÐLbÓcˆÜ&×=Ñ=¸lÐLbÓcˆÙØ$ˆC�	‰NÙØ$ˆC�	‰NØˆ
r#   éÈ   F)Ústatus_codeÚinclude_responser‘   r’   c          	      ó†  — | j                  |«      }| j                  |«      }| j                  ||«      }| j                  |«      }t	        j
                  i «      }	i }
|r@| j                  ||«      }t	        j
                  dt	        j
                  |«      i«      }	ddi}
d}|j                  di «      }t        |t        «      r|j                  di «      ni }t        |t        «      rN|j                  d«      xs |j                  d«      xs d}d	|v r"|j                  d	«      d
   j                  «       }i d|“dt	        j
                  |«      “dt	        j
                  |
«      “dd“dt	        j
                  dt	        j
                  |«      i«      “d|	“d|“dd“dt        t        t        j                  «       j!                  «       dz  «      «      “dt        |«      “dd“dt        |«      “d| j"                  “d| j$                  “dd“dd “d!d"“d"d"d"d"t	        j
                  |«      t	        j
                  |«      d#d$œ¥S )%zÙBuild the flat MIRRORING payload sent to Akto's HTTP proxy endpoint.

        All body fields use double-encoding: json.dumps({"body": json.dumps(actual_body)})
        to match the canonical CLI hook format.
        r}   r_   r^   r4   rj   rk   zx-forwarded-forz	x-real-ipú,r   ÚpathÚrequestHeadersÚresponseHeadersÚmethodÚPOSTÚrequestPayloadÚresponsePayloadÚipÚdestIpz	127.0.0.1Útimeiè  Ú
statusCodeÚtypezHTTP/1.1Ústatusr*   r+   Ú
is_pendingÚfalseÚsourceÚ	MIRRORINGÚ	directionNÚAGENTIC)Ú
process_idÚ	socket_idÚdaemonset_idÚenabled_graphrŽ   rP   ÚcontextSource)r\   rq   r€   r�   ÚjsonÚdumpsrˆ   rC   rQ   rR   ÚsplitrT   rS   Úintr   ÚnowÚ	timestampr*   r+   )rJ   rr   rL   r‘   r’   Úrequest_pathÚrequest_headersÚrequest_bodyrŽ   Úresponse_payloadÚresponse_headersÚresponse_bodyrœ   rn   Úproxy_headerss                  r!   Úbuild_akto_payloadz AktoGuardrail.build_akto_payloadÜ   s  € ð #×7Ñ7¸ÓEˆØ!%×!;Ñ!;¸LÓ!IˆØ"×5Ñ5°f¸lÓKˆØ×,Ñ,¨\Ó:ˆäŸ:™: b›>ÐØ+-ÐÙØ#'×#;Ñ#;¸FÀLÓ#QˆMÜ#Ÿz™z¨6´4·:±:¸mÓ3LÐ*MÓNÐØ .Ð0BÐCÐð ˆØ'×+Ñ+Ð,BÀBÓGˆ	Ü?IÈ)ÔUYÔ?Z˜yŸ}™}¨Y¸Ô;Ð`bˆÜ�m¤TÔ*Ø×"Ñ"Ð#4Ó5Ò]¸×9JÑ9JÈ;Ó9WÒ]Ð[]ˆBØ�b‰yØ—X‘X˜c“] 1Ñ%×+Ñ+Ó-�ð
Ø�Lð
àœdŸj™j¨Ó9ð
ð œtŸz™zÐ*:Ó;ð
ð �fð	
ð
 œdŸj™j¨&´$·*±*¸\Ó2JÐ)KÓLð
ð Ð/ð
ð �"ð
ð �kð
ð ”CœœHŸL™L›N×4Ñ4Ó6¸Ñ=Ó>Ó?ð
ð œ#˜kÓ*ð
ð �Jð
ð ”c˜+Ó&ð
ð ˜t×3Ñ3ð
ð ˜T×/Ñ/ð
ð ˜'ð
ð  �kð!
ð" ˜ð#
ð$ ØØ Ø!Ü—:‘:˜c“?ÜŸ
™
 3›Ø&ò1
ð 	
r#   Úpayloadc             ƒ   ó  K  — | j                   › t        › �}| j                  ||¬«      }| j                  «       }| j                  j                  |t        j                  |«      ||| j                  ¬«      ƒ d{  –—† S 7 Œ­w)z+Send an HTTP POST to the Akto API endpoint.)rb   rc   )ÚurlÚdatarg   rk   ÚtimeoutN)	r(   r   rh   ra   r>   Úpostr­   r®   r/   )rJ   rb   rc   r»   Úendpointrg   rk   s          r!   Úsend_requestzAktoGuardrail.send_request  sˆ   è ø€ ð "×/Ñ/Ð0´Ð0AÐBˆØ×/Ñ/¸:ÐS^Ð/Ó_ˆØ×-Ñ-Ó/ˆØ×'Ñ'×,Ñ,ØÜ—‘˜GÓ$ØØØ×*Ñ*ð -ó 
÷ 
ð 	
ð 
ús   ‚A8BÁ:A?Á;Bc                 óØ  — | j                   dk7  rOt        j                  d| j                   «       t        j                  d| j                   › �| j
                  | ¬«      ‚	 | j                  «       }t        |t        «      sy|j                  d«      xs i }t        |t        «      sy|j                  d«      xs i }t        |t        «      syt        |j                  dd«      «      t        |j                  dd«      «      fS # t        j                  t        f$ rM}t        | dd«      }t        j                  d|dd «       t        j                  d	| j
                  ¬
«      |‚d}~ww xY w)z=Parse the Akto guardrail response. Returns (allowed, reason).r�   zAkto returned HTTP %dz Akto returned unexpected status ©r   r   Útextr4   z.Akto returned non-JSON body for status 200: %rNzAkto returned non-JSON body)r   )Tr4   r¾   ÚguardrailsResultÚAllowedTÚReason)r‘   r	   ÚerrorÚhttpxÚHTTPStatusErrorr   r­   ÚJSONDecodeErrorrE   ÚgetattrÚRequestErrorrQ   rR   rC   ÚboolrS   )r   ÚresultÚeÚresponse_textr¾   Úguardrails_results         r!   Úhandle_guardrail_responsez'AktoGuardrail.handle_guardrail_response,  s]  € ð ×Ñ 3Ò&Ü ×&Ñ&Ð'>À×@TÑ@TÔUÜ×'Ñ'Ø2°8×3GÑ3GÐ2HÐIØ ×(Ñ(Ø!ôð ð
	Ø$ŸM™M›OˆFô ˜&¤$Ô'ØØ—j‘j Ó(Ò.¨BˆÜ˜$¤Ô%ØØ#'§8¡8Ð,>Ó#?Ò#EÀ2ÐÜÐ+¬TÔ2ØäÐ"×&Ñ& y°$Ó7Ó8ÜÐ!×%Ñ% h°Ó3Ó4ð
ð 	
øô% ×$Ñ$¤jÐ1ò 		Ü#*¨8°V¸RÓ#@ˆMÜ ×&Ñ&Ø@Ø˜d˜sÐ#ôô ×$Ñ$Ø-Ø ×(Ñ(ôð ðûð		ús   Á D ÄE)ÄAE$Å$E)rÉ   c                 ó¾   — | j                   dk(  r#t        j                  dt        |«      |¬«       |S t        j                  dt        |«      «       t        dd¬«      ‚)zDHandle Akto being unreachable based on fail_open/fail_closed config.r.   z Akto unreachable (fail-open): %s)Úexc_infoz"Akto unreachable (fail-closed): %si÷  z"Akto guardrail service unreachable©r‘   Údetail)r,   r	   ÚcriticalrS   rÉ   r   )rJ   rr   rÉ   s      r!   Úhandle_unreachablez AktoGuardrail.handle_unreachableO  s\   € ð ×$Ñ$¨Ò3Ü ×)Ñ)Ø2Ü�E“
Øõð
 ˆMä×"Ñ"Ð#GÌÈUËÔTÜØØ7ô
ð 	
r#   c             ƒ   ó  K  — 	 | j                  |||¬«      ƒ d{  –—† }|j                  dk7  r!t        j                  d|j                  «       yy7 Œ5# t        $ r)}t        j                  dt        |«      «       Y d}~yd}~ww xY w­w)zPSend a request without awaiting it in the caller. Errors are logged, not raised.©rb   rc   r»   Nr�   z%Akto fire-and-forget returned HTTP %dzAkto fire-and-forget error: %s)rÂ   r‘   r	   rÉ   Ú	ExceptionrS   )rJ   rb   rc   r»   r   rÑ   s         r!   Úfire_and_forget_requestz%AktoGuardrail.fire_and_forget_requestc  sŽ   è ø€ ð	QØ$(×$5Ñ$5Ø%Ø'Øð %6ó %÷ ˆHð
 ×#Ñ# sÒ*Ü$×*Ñ*Ø;Ø×(Ñ(õð +ðùô ò 	QÜ ×&Ñ&Ð'GÌÈQË×PÑPûð	Qüs>   ‚B„A ›Aœ3A ÁBÁA Á	BÁB Á;BÂ BÂBÚ
input_typerÄ   c              ƒ   óf  K  — | j                   j                  t        | j                  «      «      }|r||k7  r|S |dk(  �r | j	                  ||d¬«      }	 | j                  dd|¬«      ƒ d{  –—† }| j                  |«      \  }}	|s×| j	                  ||dd¬	«      }t        j                  d
t        j                  d|	dœ«      i«      |d<   t        j                  ddi«      |d<   t        j                  | j!                  dd|¬«      «      }| j"                  j%                  |«       |j'                  | j"                  j(                  «       t        d|	xs d¬«      ‚|S |dk(  r{| j	                  ||d¬«      }t        j                  | j!                  dd|¬«      «      }| j"                  j%                  |«       |j'                  | j"                  j(                  «       |S 7 �Œv# t        $ r ‚ t        j                  t        j                  f$ r}
| j                  ||
¬«      cY d}
~
S d}
~
ww xY w­w)a2  Main entry point called by LiteLLM's guardrail framework.

        Pre_call (input_type="request"):
          - Awaits guardrail check. If blocked, fires off ingest with 403 marker and raises.
        Post_call (input_type="response"):
          - Fire-and-forget combined guardrail + ingest call.
        r   F)r’   TrÜ   N)rr   rÉ   i“  )r’   r‘   r}   z
Akto Proxy)zx-blocked-byÚreasonr›   r_   r^   r—   zBlocked by Akto Guardrailsr×   r   )ÚHOOK_TO_INPUTrC   rS   Ú
event_hookrº   rÂ   rÔ   r   rÊ   rÎ   rË   rÚ   r­   r®   ÚasyncioÚcreate_taskrÞ   r@   ÚaddÚadd_done_callbackÚdiscard)rJ   rr   rL   rß   Úlogging_objÚexpectedr»   r   Úallowedrá   rÑ   Úblocked_payloadÚtasks                r!   Úapply_guardrailzAktoGuardrail.apply_guardraily  s[  è ø€ ð  ×,Ñ,×0Ñ0´°T·_±_Ó1EÓFˆÙ˜ JÒ.ØˆMà˜Ó"à×-Ñ-¨f°lÐUZÐ-Ó[ˆGðØ(,×(9Ñ(9Ø#Ø %Ø#ð ):ó )÷ #�ð
 #'×"@Ñ"@ÀÓ"J‘�˜ñ à)-×)@Ñ)@ØØ Ø%*Ø #ð	 *Aó *�ô 6:·Z±Zà¤§
¡
¸LÐTZÑ+[Ó \ðó6�Ð 1Ñ2ô
 6:·Z±ZØ#Ð%7Ð8ó6�Ð 1Ñ2ô ×*Ñ*Ø×0Ñ0Ø#(Ø$(Ø /ð 1ó ó�ð ×%Ñ%×)Ñ)¨$Ô/Ø×&Ñ& t×'<Ñ'<×'DÑ'DÔEÜ#Ø #Ø!ÒAÐ%Aôð ð$ ˆð ˜:Ò%à×-Ñ-¨f°lÐUYÐ-ÓZˆGÜ×&Ñ&Ø×,Ñ,Ø#Ø $Ø#ð -ó óˆDð ×!Ñ!×%Ñ% dÔ+Ø×"Ñ" 4×#8Ñ#8×#@Ñ#@ÔAàˆðu#úô !ò ØÜ×&Ñ&¬×(=Ñ(=Ð>ò Ø×.Ñ.Ø!Øð /ó õ ûðüsI   ‚AH1ÁG% Á,G"Á-G% ÂEH1Ç"G% Ç%,H.ÈH)È#H.È$H1È)H.È.H1)NNNNr-   Nr%   )(Ú__name__Ú
__module__Ú__qualname__Ú__doc__râ   Ústaticmethodr    r"   ÚclassmethodrF   r   r'   rS   r   r°   r   rH   rR   rX   r\   ra   rÏ   rh   rq   r   r€   rˆ   r�   rº   rÊ   ÚResponserÂ   ÚtuplerÔ   rÝ   rÚ   rÞ   r   rî   Ú__classcell__)rK   s   @r!   r   r   '   s„  ø„ ÙYð "+¸ÑD€Màð˜dÐ#9Ñ:ò ó ðð ð
¨$Ð/BÑ*Cò 
ó ð
ð %)Ø#'Ø&*Ø$(ØDQØ(,ñ-
à˜T‘zð-
ð ˜D‘jð-
ð ˜t™ð	-
ð
 ˜T‘zð-
ð &Ð&@ÑAð-
ð  ™:ð-
ð ð-
ð 
õ-
ð^ ð
¨T°D©[ð 
¸sð 
ÀsÈTÁzò 
ó ð
ð ð:¨4ð :°Cò :ó ð:ð
  c¨3 h¡ó 
ð ð¨$ð ¸Tð ÀdÈ3ÐPSÈ8Ánò ó ðð ð¨Dð °T¸#¸s¸(±^ò ó ðð ð %)ñØ)ðà˜T‘kðð 
ˆc�3ˆh‰òó ðð> ð %)ñØ)ðà˜T‘kðð 
ˆc�3ˆh‰òó ðð ð	¨ð 	°$°s¸C°x±.ò 	ó ð	ð  Ø!&ò;
à)ð;
ð ð;
ð
 ð;
ð ð;
ð 
ˆc�3ˆh‰ó;
ðz
ð ð
ð ð	
ð
 ð
ð 
�‰ó
ð& ð 
¨E¯N©Nð  
¸uÀTÈ3ÀYÑ?Oò  
ó ð 
ðD
à)ð
ð ð
ð 
#ó	
ð(Qð ðQð ð	Qð
 ðQð 
óQð, ð ñQà)ðQð ðQð Ð1Ñ2ð	Qð 
#òQó ôQr#   r   ) rò   rä   r­   rA   r   Útypingr   r   r   r   rÊ   Úfastapir   Úlitellm._loggingr	   Ú%litellm.integrations.custom_guardrailr
   r   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.guardrailsr   Úlitellm.types.utilsr   Ú3litellm.types.proxy.guardrails.guardrail_hooks.baser   r   Ú__annotations__r   r   r   r<   r#   r!   ú<module>r     sm   ðòó Û Û 	Ý ß 5Ó 5ã Ý !å 1÷÷õ 9Ý 9áÝXà*€�Ó *Ø&Ð �UÓ &Ø#$Ð ˜5Ó $ôd�Oõ dr#   