
    CjK7                        % S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJr  S SKJr  Sr\S	L a  \R"                  " S
5        \R$                  " SS5      R'                  5       S:g  rS\S\4S jrS\S\4S jr " S S\R0                  5      r\" 5       r\" \R$                  " SS5      5      r\R$                  " SS5      r\" \\R?                  5       5      r \\!S'   \RD                  " 5       r#\#RI                  \ 5        \#RK                  \5        S\S\	\\\4      4S jr&S\S\	\\\4      4S jr'S\(4S jr)\)" 5       r* " S S\5      r+S r,\(       a$  \#R[                  \+" 5       5        \," \+" 5       5        O"\R
                  " SS S!9r.\#R[                  \.5        \R^                  " S"5      r0\R^                  " S#5      r1\R^                  " S$5      r2\1Rg                  \#5        \0Rg                  \#5        \2Rg                  \#5        S% r4\4" 5         \R^                  " 5       \2\1\0/r5S& r6S'\Rn                  4S( jr8S) r9S* r:S+ r;S, r<S- r=S. r>S\4S/ jr?g)0    N)datetime)	Formatter)AnyDictOptional)redact_string)
safe_dumps)safe_json_loadsFTze`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs.LITELLM_DISABLE_REDACT_SECRETS truevaluereturnc                 2    [         (       d  U $ [        U 5      $ N)_ENABLE_SECRET_REDACTIONr   r   s    b/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/litellm/_logging.py_redact_stringr      s    ##    c                 2    [         (       d  U $ [        U 5      $ )u  Public API: redact known secret/credential patterns from an arbitrary string.

Use this for code paths that bypass the logging system — e.g. Slack/Teams
alerting, HTTP error response bodies, or any other string that may contain
secrets and will be sent to an external sink.

Not to be confused with redact_message_input_output_from_logging() in
litellm_core_utils/redact_messages.py, which redacts LLM prompt/response
content for privacy — this function redacts credential patterns (API keys,
PEM blocks, tokens, etc.) by shape.
)r   r   r   s    r   redact_secretsr      s     $#%  r   c                   `    \ rS rSrSr\R                  " 5       rS\R                  S\	4S jr
Srg)SecretRedactionFilter0   z9Scrubs known secret/credential patterns from log records.recordr   c                    [         (       d  g [        UR                  5       5      Ul        S Ul        UR                  (       aD  UR                  S   b4   [        U R                  R                  UR                  5      5      Ul        [        UR                  R                  5       5       H=  u  p#U[        ;  d  M  [        U[        5      (       d  M(  [!        X[        U5      5        M?     g! [
         a<    [        UR                  [        5      (       a  [        UR                  5      Ul         Nf = f! [
         a     Nf = f)NT   )r   r   
getMessagemsgargs	Exception
isinstancestrexc_info
_formatterformatExceptionexc_textlist__dict__items_STANDARD_RECORD_ATTRSsetattr)selfr   keyr   s       r   filterSecretRedactionFilter.filter5   s    ''	8'(9(9(;<FJFK ??vq1="0OO33FOOD# v4467JC00Zs5K5K^E%:; 8 %  	8&**c**+FJJ7
	8  s$   %C- 3D6 -AD32D36
EE N)__name__
__module____qualname____firstlineno____doc__loggingr   r&   	LogRecordboolr0   __static_attributes__r2   r   r   r   r   0   s,    C""$JW.. 4 r   r   	JSON_LOGSLITELLM_LOGDEBUGnumeric_levelmessagec                     U (       a  [        U [        5      (       d  gU R                  5       nUR                  S5      (       d  UR                  S5      (       d  g[	        U SS9nUb  [        U[
        5      (       d  gU$ )z
Try to parse a log message as JSON. Returns parsed dict if valid, else None.
Handles messages that are entirely valid JSON (e.g. json.dumps output).
Uses shared safe_json_loads for consistent error handling.
N{[)default)r#   r$   strip
startswithr
   dict)r@   msg_strippedparseds      r   _try_parse_json_messagerJ   ]   sj     *Wc22==?L##C((L,C,CC,H,HWd3F~Z55Mr   c                    U (       a  [        U [        5      (       a  SU ;  a  gSnU[        U 5      :  a  U R                  SU5      nUS:X  a   gSn[	        U[        U 5      5       Ho  nX   nUS:X  a  US-  nM  US:X  d  M  US-  nUS:X  d  M)  XUS-    n [
        R                  " U5      n[        U[        5      (       a  [        U5      S:  a  Us  $   O   US-   nU[        U 5      :  a  M  g! [        [        [        4 a     N2f = f)a"  
Try to find and parse a Python dict repr (e.g. str(d) or repr(d)) embedded in
the message. Handles patterns like:
"get_available_deployment for model: X, Selected deployment: {'model_name': '...', ...} for model: X"
Uses ast.literal_eval for safe parsing. Returns the parsed dict or None.
rB   Nr   r   })r#   r$   lenfindrangeastliteral_evalrG   
ValueErrorSyntaxError	TypeError)r@   istartdepthjcsubstrresults           r   _try_parse_embedded_python_dictr]   n   s    *Wc22c6H	A
c'l
S!$B;$ # uc'l+A
ACx
c
A:$QU3F!$!1!1&!9%fd33Fa#)M  , AI) c'l
* 	 'Y? s   ;C00DDc                  |    [        [        R                  " SSSSSSS5      R                  R	                  5       5      $ )z]Standard LogRecord attribute names - excludes extra keys from logger.debug(..., extra={...}).r   r   r2   N)	frozensetr8   r9   r*   keysr2   r   r   _get_standard_record_attrsra      s3    W&&r1b!RTBKKPPRSSr   c                   8   ^  \ rS rSrU 4S jrSS jrS rSrU =r$ )JsonFormatter   c                 *   > [         [        U ]  5         g r   )superrc   __init__)r.   	__class__s    r   rg   JsonFormatter.__init__   s    mT+-r   c                 b    [         R                  " UR                  5      nUR                  5       $ r   )r   fromtimestampcreated	isoformat)r.   r   datefmtdts       r   
formatTimeJsonFormatter.formatTime   s"    ##FNN3||~r   c                 `   UR                  5       nUUR                  U R                  U5      S.n[        U5      nUc  [	        U5      nUb$  UR                  5        H  u  pVXS;  d  M  XcU'   M     UR                  R                  5        H  u  pVU[        ;  d  M  XS;  d  M  XcU'   M     SU;  a  UR                  US'   SU;  a  UR                   SUR                   3US'   UR                  (       a1  UR                  =(       d    U R                  UR                  5      US'   [        U5      $ )N)r@   level	timestamp	componentlogger:
stacktrace)r   	levelnamerp   rJ   r]   r+   r*   r,   namefilenamelinenor%   r(   r'   r	   )r.   r   message_strjson_recordrI   r/   r   s          r   formatJsonFormatter.format   s   '')"%%0'
 )5>4[AF$lln
)',$ -
 !////1JC00S5K#(C  2
 k)'-{{K$;&'-&7q$HK!??(. )4;O;O<K% +&&r   r2   r   )	r3   r4   r5   r6   rg   rp   r   r;   __classcell__)rh   s   @r   rc   rc      s    .
!' !'r   rc   c                   ^ [         R                  " 5       mTR                  U 5        TR                  [        5        U4S jnU[
        l         SS KnU4S jnUR                  5       R                  U5        g ! [         a     g f = f)Nc                    > [         R                  " S[         R                  SS[        U5      SXU4S9nTR	                  U5        g )NLiteLLMr   r   r2   rz   rs   pathnamer|   r    r!   r%   )r8   r9   ERRORr$   handle)exc_type	exc_valueexc_tracebackr   error_handlers       r   json_excepthook7_setup_json_exception_handlers.<locals>.json_excepthook   sE    ""--I=9
 	V$r   r   c                   > UR                  S5      nU(       aZ  [        U5      n[        R                  " S[        R                  SS[        U5      SX2UR                  4S9nTR                  U5        g U R                  U5        g )N	exceptionr   r   r   r2   r   )	gettyper8   r9   r   r$   __traceback__r   default_exception_handler)loopcontextr   r   r   r   s        r   async_json_exception_handlerD_setup_json_exception_handlers.<locals>.async_json_exception_handler   ss    K0I	? **"!--I&93J3JK $$V,..w7r   )r8   StreamHandlersetFormatter	addFilter_secret_filtersys
excepthookasyncioget_event_loopset_exception_handlerr"   )	formatterr   r   r   r   s       @r   _setup_json_exception_handlersr      st    ))+My)N+
% %CN	8" 	 667ST s   )A9 9
BBzT[92m%(asctime)s - %(name)s:%(levelname)s[0m: %(filename)s:%(lineno)s - %(message)sz%H:%M:%S)rn   zLiteLLM ProxyzLiteLLM Routerr   c                  B   [         R                  " S5      n U R                  [         R                  5        [         R                  " S5      nUR                  [         R                  5        [         R                  " S5      nUR                  [         R                  5        g)z$Suppress noisy loggers at INFO levelhttpxzapscheduler.executors.defaultzapscheduler.schedulerN)r8   	getLoggersetLevelWARNING)httpx_loggerapscheduler_executors_loggerapscheduler_scheduler_loggers      r   _suppress_loggersr     sp     $$W-L'//* $+#4#45T#U  ))'//:#*#4#45L#M  ))'//:r   c                      SSK n [        [        5      nSS1n[        U R                  U R
                  -   5      nX#-  (       a%  UR                  [        R                  " S5      5        U$ )z
Get all loggers that should be initialized with the JSON handler.

Includes third-party integration loggers (like langfuse) if they are
configured as callbacks.
r   Nlangfuselangfuse_otel)	litellmr)   ALL_LOGGERSsetsuccess_callbackfailure_callbackappendr8   r   )r   loggerslangfuse_callbacksall_callbackss       r   _get_loggers_to_initializer   %  s[     ;G %o60073K3KKLM)w((45Nr   handlerc                     U R                  [        5        [        5        H5  nUR                  R	                  5         UR                  U 5        SUl        M7     g)z
Initialize all loggers with a handler

- Adds a handler to each logger
- Prevents bubbling to parent/root (critical to prevent duplicate JSON logs)
FN)r   r   r   handlersclear
addHandler	propagate)r   lgs     r    _initialize_loggers_with_handlerr   9  sB     n%(*

g +r   c            
          Sn [         R                  5       nSSSU 0SU 0SU 0S.SSSS	.S
SSS	.S.S/USS.S/USS.S
/USS.S.S.nU$ )z
Generate a uvicorn log_config dictionary that applies JSON formatting to all loggers.

This ensures that uvicorn's access logs, error logs, and all application logs
are formatted as JSON when json_logs is enabled.
zlitellm._logging.JsonFormatterr   Fz())jsonrD   accessr   zlogging.StreamHandlerzext://sys.stdout)r   classstreamr   )rD   r   rD   )r   rs   r   )uvicornzuvicorn.errorzuvicorn.access)versiondisable_existing_loggers
formattersr   r   )	log_levelupper)json_formatter_classuvicorn_log_level
log_configs      r   _get_uvicorn_json_log_configr   G  s     < ") $) * * *

 $0, &0,
 'K*" 'K*" &J*"
5+JZ r   c                      [         R                  " 5       n U R                  [        5       5        [	        U 5        [        [        5       5        g)z>
Turn on JSON logging

- Adds a JSON formatter to all loggers
N)r8   r   r   rc   r   r   )r   s    r   _turn_on_jsonr     s4     ##%G)$W-"=?3r   c                      [         R                  [        R                  S9  [        R                  [        R                  S9  [
        R                  [        R                  S9  g )N)rs   )verbose_loggerr   r8   r>   verbose_router_loggerverbose_proxy_loggerr2   r   r   _turn_on_debugr     sA    '--0"""7!!!6r   c                  F    S[         l        S[        l        S[        l        g)z7Disable the package, router, and proxy verbose loggers.TNr   disabledr   r   r2   r   r   _disable_debuggingr     s    "N%)"$(!r   c                  F    S[         l        S[        l        S[        l        g )NFr   r2   r   r   _enable_debuggingr     s    #N%*"$)!r   c                 x     [         (       a  [        [        [        U 5      5      5        g g ! [         a     g f = fr   )set_verboseprintr   r$   r"   )print_statements    r   print_verboser     s5    ;._!567  s   (, 
99c                  f    [         R                  [        R                  5      =(       d    [        SL $ )z!
Returns True if debugging is on
T)r   isEnabledForr8   r>   r   r2   r   r   _is_debugging_onr     s#     &&w}}5L9LLr   )@rQ   r8   osr   r   r   typingr   r   r   +litellm.litellm_core_utils.secret_redactionr   *litellm.litellm_core_utils.safe_json_dumpsr	   *litellm.litellm_core_utils.safe_json_loadsr
   r   warninggetenvlowerr   r$   r   r   Filterr   r   r:   	json_logsr   getattrr   r?   __annotations__r   r   r   r   rJ   r]   r_   ra   r,   rc   r   r   r   r   r   r   r   r   r   r   r   Handlerr   r   r   r   r   r   r   r   r2   r   r   <module>r      s   
  	 
   & & E A F$OOo
 II.399;vE 
 #  #  !# !# !"GNN B '( ;./	IImW-	Wioo&78s 8



!       . !S Xd38n-E "S Xd38n5M HTI T
 45 *'I *'\,` )"=?3!!dI
 #((9 ))*:; ""9-      )    (   ' "
;   	(goo 9x
47)*M$ Mr   