
    AHj:                        U d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZ dZedu r ej"                  d	        ej$                  d
d      j'                         dk7  ZdZdej,                  fdZ e       ZdedefdZ G d dej6                        Z e       Z e ej$                  dd            Z ej$                  dd      Z  e!ee jE                               Z#ee$d<    ejJ                         Z&e&jO                  e#       e&jQ                  e       dedee	eef      fdZ)dedee	eef      fdZ*de+fdZ, e,       Z- G d de      Z.d Z/er$e&ja                   e.               e/ e.              n% ej                  dd !      Z1e&ja                  e1        ejd                  d"      Z3 ejd                  d#      Z4 ejd                  d$      Z5e4jm                  e&       e3jm                  e&       e5jm                  e&       d% Z7 e7         ejd                         e5e4e3gZ8d& Z9d'ejt                  fd(Z;d) Z<d* Z=d+ Z>d, Z?d- Z@d. ZAdefd/ZBy)0    N)datetime)	Formatter)AnyDictListOptional)
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REDACTEDreturnc                  p    g d} t        j                  dj                  |       t         j                        S )N)z(?:AKIA|ASIA)[0-9A-Z]{16}zZ(?:aws_secret_access_key|aws_session_token|aws_access_key_id)\s*[:=]\s*[A-Za-z0-9/+=]{20,}z"Bearer\s+[A-Za-z0-9\-._~+/]{10,}=*z Basic\s+[A-Za-z0-9+/]{10,}={0,2}zsk-[A-Za-z0-9\-_]{20,}z9(?:api[_-]?key)['\"]?\s*[:=]\s*['\"]?[^\s,'\"})\]{}>]{8,}z<(?:x-api-key|api-key)['\"]?\s*[:=]\s*['\"]?[^\s,'\"})\]{}>]+zx-ak-[A-Za-z0-9\-_]{20,}zAIza[0-9A-Za-z\-_]{35}z^\w*(?:password|passwd|client_secret|secret_key|_secret)['\"]?\s*[:=]\s*['\"]?[^\s,'\"})\]{}>]+z!(?<=://)[^\s'\"]*:[^\s'\"@]+(?=@)zdapi[0-9a-f]{32}z(?:master_key|database_url|db_url|connection_string|private_key|signing_key|encryption_key|auth_token|access_token|refresh_token|slack_webhook_url|webhook_url|database_connection_string|huggingface_token|jwt_secret)['\"]?\s*[:=]\s*['\"]?[^\s,'\"})\]{}>]+|)recompilejoin
IGNORECASE)patternss    H/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/_logging.py_build_secret_patternsr      s*    &HN ::chhx("--88    valuec                 6    t         j                  t        |       S N)
_SECRET_REsub	_REDACTED)r   s    r   _redact_stringr    I   s    >>)U++r   c                   V    e Zd ZdZ ej
                         Zdej                  defdZ	y)SecretRedactionFilterz9Scrubs known secret/credential patterns from log records.recordr   c                 V   t         sy	 t        |j                               |_        d |_        |j                  rC|j                  d   4	 t        | j                  j                  |j                              |_        t        |j                  j                               D ]5  \  }}|t        vst        |t              s t!        ||t        |             7 y# t
        $ r7 t        |j                  t              rt        |j                        |_        Y w xY w# t
        $ r Y w xY w)NT   )_ENABLE_SECRET_REDACTIONr    
getMessagemsgargs	Exception
isinstancestrexc_info
_formatterformatExceptionexc_textlist__dict__items_STANDARD_RECORD_ATTRSsetattr)selfr#   keyr   s       r   filterzSecretRedactionFilter.filterR   s    '	8'(9(9(;<FJFK ??vq1="0OO33FOOD# v4467 	<JC00Zs5K^E%:;	< %  	8&**c*+FJJ7
	8  s#   %C 
3D =DD	D('D(N)
__name__
__module____qualname____doc__loggingr   r.   	LogRecordboolr8    r   r   r"   r"   M   s.    C"""$JW.. 4 r   r"   	JSON_LOGSLITELLM_LOGDEBUGnumeric_levelmessagec                     | rt        | t              sy| j                         }|j                  d      s|j                  d      syt	        | d      }|t        |t
              sy|S )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)rE   msg_strippedparseds      r   _try_parse_json_messagerO   z   s^     *Wc2==?L##C(L,C,CC,HWd3F~Z5Mr   c                    | rt        | t              rd| vryd}|t        |       k  r| j                  d|      }|dk(  r	 yd}t	        |t        |             D ]d  }| |   }|dk(  r|dz  }|dk(  s|dz  }|dk(  s$| ||dz    }	 t        j                  |      }t        |t              rt        |      dkD  r|c S  n |dz   }|t        |       k  ry# t        t        t        f$ r Y .w xY w)a6  
    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.
    rG   Nr   r%   })r+   r,   lenfindrangeastliteral_evalrL   
ValueErrorSyntaxError	TypeError)rE   istartdepthjcsubstrresults           r   _try_parse_embedded_python_dictrb      s    *Wc2c6H	A
c'l
S!$B;$ # uc'l+ 	A
ACx
c
A:$UQU3F!$!1!1&!9%fd3Fa#)M 	 AI) c'l
* 	 'Y? s   4CC+*C+c                  z    t        t        j                  ddddddd      j                  j	                               S )z]Standard LogRecord attribute names - excludes extra keys from logger.debug(..., extra={...}).r   r   r@   N)	frozensetr=   r>   r2   keysr@   r   r   _get_standard_record_attrsrf      s3    W&&r1b!RTBKKPPRSSr   c                   ,     e Zd Z fdZddZd Z xZS )JsonFormatterc                 *    t         t        |           y r   )superrh   __init__)r6   	__class__s    r   rk   zJsonFormatter.__init__   s    mT+-r   c                 `    t        j                  |j                        }|j                         S r   )r   fromtimestampcreated	isoformat)r6   r#   datefmtdts       r   
formatTimezJsonFormatter.formatTime   s"    ##FNN3||~r   c                    |j                         }||j                  | j                  |      d}t        |      }|t	        |      }|"|j                         D ]  \  }}||vs|||<    |j                  j                         D ]  \  }}|t        vs||vs|||<    |j                  r,|j                  xs | j                  |j                        |d<   t        |      S )N)rE   level	timestamp
stacktrace)r'   	levelnamers   rO   rb   r3   r2   r4   r-   r0   r/   r	   )r6   r#   message_strjson_recordrN   r7   r   s          r   formatzJsonFormatter.format   s    '')"%%0'
 )5>4[AF$lln -
Uk)',K$-
 !////1 	)JC00S5K#(C 	) ??(. )4;O;O<K% +&&r   r   )r9   r:   r;   rk   rs   r{   __classcell__)rl   s   @r   rh   rh      s    .
'r   rh   c                 
   t        j                         j                  |        j                  t               fd}|t
        _        	 dd l}fd}|j                         j                  |       y # t        $ r Y y w xY w)Nc                     t        j                  dt         j                  ddt        |      d| ||f      }j	                  |       y )NLiteLLMr   r   r@   nameru   pathnamelinenor(   r)   r-   )r=   r>   ERRORr,   handle)exc_type	exc_valueexc_tracebackr#   error_handlers       r   json_excepthookz7_setup_json_exception_handlers.<locals>.json_excepthook   sG    ""--I	=9
 	V$r   r   c                    |j                  d      }|r]t        |      }t        j                  dt        j                  ddt        |      d|||j                  f      }j                  |       y | j                  |       y )N	exceptionr   r   r   r@   r   )	gettyper=   r>   r   r,   __traceback__r   default_exception_handler)loopcontextr   r   r#   r   s        r   async_json_exception_handlerzD_setup_json_exception_handlers.<locals>.async_json_exception_handler   su    K0I	? **"!--I&	93J3JK $$V,..w7r   )r=   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   (A6 6	BBzT[92m%(asctime)s - %(name)s:%(levelname)s[0m: %(filename)s:%(lineno)s - %(message)sz%H:%M:%S)rq   zLiteLLM ProxyzLiteLLM Routerr   c                  <   t        j                  d      } | j                  t         j                         t        j                  d      }|j                  t         j                         t        j                  d      }|j                  t         j                         y)z$Suppress noisy loggers at INFO levelhttpxzapscheduler.executors.defaultzapscheduler.schedulerN)r=   	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                      ddl } t        t              }ddh}t        | j                  | j
                  z         }||z  r$|j                  t        j                  d             |S )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)	litellmr1   ALL_LOGGERSsetsuccess_callbackfailure_callbackappendr=   r   )r   loggerslangfuse_callbacksall_callbackss       r   _get_loggers_to_initializer   <  s]     ;G %o60073K3KKLMM)w((45Nr   handlerc                     | j                  t               t               D ]4  }|j                  j	                          |j                  |        d|_        6 y)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   P  sG     n%(* 

gr   c            
          d} t         j                         }ddd| id| id| iddddd	d
ddd	ddg|dddg|ddd
g|dddd}|S )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())jsonrI   accessr   zlogging.StreamHandlerzext://sys.stdout)r   classstreamr   )rI   r   rI   )r   ru   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   ^  s     < ") $) * * *

 $0, &0,
 'K*" 'K*" &J*"
5+JZ r   c                      t        j                         } | j                  t                      t	        |        t        t                      y)zJ
    Turn on JSON logging

    - Adds a JSON formatter to all loggers
    N)r=   r   r   rh   r   r   )r   s    r   _turn_on_jsonr     s4     ##%G)$W-"=?3r   c                      t         j                  t        j                         t        j                  t        j                         t
        j                  t        j                         y )N)ru   )verbose_loggerr   r=   rC   verbose_router_loggerverbose_proxy_loggerr@   r   r   _turn_on_debugr     sA    '--0"""7!!!6r   c                  F    dt         _        dt        _        dt        _        y )NTr   disabledr   r   r@   r   r   _disable_debuggingr     s    "N%)"$(!r   c                  F    dt         _        dt        _        dt        _        y )NFr   r@   r   r   _enable_debuggingr     s    #N%*"$)!r   c                 H    	 t         rt        |        y y # t        $ r Y y w xY wr   )set_verboseprintr*   )print_statements    r   print_verboser     s)    /"  s    	!!c                  \    t         j                  t        j                        xs t        du S )z)
    Returns True if debugging is on
    T)r   isEnabledForr=   rC   r   r@   r   r   _is_debugging_onr     s#     &&w}}5L9LLr   )CrV   r=   osr   r   r   r   typingr   r   r   r   *litellm.litellm_core_utils.safe_json_dumpsr	   *litellm.litellm_core_utils.safe_json_loadsr
   r   warninggetenvlowerr&   r   Patternr   r   r,   r    Filterr"   r   r?   	json_logsr   getattrr   rD   __annotations__r   r   r   r   rO   rb   rd   rf   r4   rh   r   r   r   r   r   r   r   r   r   r   r   Handlerr   r   r   r   r   r   r   r   r@   r   r   <module>r      s   
  	 	 
   , , A F$GOOo
 BII.399;vE  	(9

 (9V $%
,# ,# ,GNN B '( ;./	BIImW-	Wioo&78s 8
'


!       . !S Xd38n-E "S Xd38n5M HTI T
 45 $'I $'P,` )"=?3!!!dI
 #(w((9 )))*:; """9-      )    (   ' "
;   G	(goo 9x
47)*M$ Mr   