Ë
    uPêj1k  ã                   óÞ  — 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
 d dlZd dl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mZ d
Z ej4                  dd¬«      Ze	ej4                  e      ed<    ej4                  dd¬«      Ze	ej4                  e      ed<   dZe	ed<   dedefd„Z deddfd„Z!deddfd„Z"edu r ejF                  d«        ejH                  dd«      jK                  «       dk7  Z&e	ed<   dedefd„Z'dedz  dedefd „Z(dedefd!„Z)d"ejT                  dedz  fd#„Z+ G d$„ d%ejX                  «      Z- e-«       Z.e	ed&<   de/fd'„Z0d(e/defd)„Z1d*ed+e/defd,„Z2 G d-„ d.ejX                  «      Z3 e3«       Z4e	ed/<    G d0„ d1ejX                  «      Z5 e5«       Z6e	ed2<   d3Z7e	ed4<   d5Z8e	ed6<   e7e8z   Z9e	ed7<   d8e7› d9e8› �Z:e	ed:<   d;e
dz  de;fd<„Z<d=e
dz  d>e
dz  defd?„Z= G d@„ dAej|                  «      Z?dedz  de;fdB„Z@ e@ ejH                  dC«      «      ZAe	edD<    ejH                  dEdF«      ZBe	edG<    eCeeBj‰                  «       «      ZEe	e   edH<    e?«       ZFe	edI<   eFj�                  eE«       eFj‘                  e.«       eFj‘                  e6«       dJedeIeef   dz  fdK„ZJdJedeIeef   dz  fdL„ZKdeLfdM„ZM eM«       ZNe	edN<    eLdO«      ZOe	edP<    G dQ„ dRe«      ZP G dS„ dTej                  «      ZQdU„ ZReAr$eFj§                   eP«       «        eR eP«       «       n; eQ e=ej¨                  ejª                  «      dV¬W«      ZVe	edX<   eFj§                  eV«        ej®                  dY«      ZX ej®                  dZ«      ZY ej®                  d[«      ZZeYj·                  eF«       eXj·                  eF«       eZj·                  eF«       eYj‘                  e4«       eXj‘                  e4«       eZj‘                  e4«       d\„ Z\d]Z]e	e^ed^f      ed_<   dkd`„Z_ e\«         e_«         ej®                  «       eZeYeXgZ`e	eda<   db„ ZadIejÄ                  fdc„Zcdd„ Zdde„ Zedf„ Zfdg„ Zgdh„ Zhdi„ Zide;fdj„Zjy)lé    N)Údatetime)Ú	Formatter)ÚAnyÚFinalÚTextIO)ÚLITELLM_TRUNCATED_PAYLOAD_FIELDÚ(LITELLM_TRUNCATION_STDOUT_SAFEGUARD_NOTEÚMAX_STRING_LENGTH_STDOUT_LOG)Úget_env_int)Ú
safe_dumps)Úsafe_json_loads)Úredact_stringÚredact_structured_valueFÚ
session_idÚ ©ÚdefaultÚsession_id_varÚtrace_idÚtrace_id_varé   Ú_MAX_CORRELATION_ID_LENGTHÚvalueÚreturnc                 óV   — dj                  d„ | D «       «      }t        |dt         «      S )aÆ  Strip control characters, bound length, and redact credential-shaped
    content before a caller-controlled trace_id/session_id (e.g.
    litellm_session_id, x-litellm-trace-id) is stamped into log lines.

    Without the first two, a caller could embed \r/\n or terminal escape
    sequences to forge fake log entries, or submit an oversized value repeated
    across every log line for the request. Without the redaction, a caller
    could smuggle a real credential (e.g. an sk-... key) through this field:
    CorrelationContextFilter stamps trace_id/session_id onto the record after
    SecretRedactionFilter has already run, so those two fields never otherwise
    pass through credential redaction.
    r   c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w©N)Úisprintable)Ú.0Úchs     úU/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/_logging.pyú	<genexpr>z+_sanitize_correlation_id.<locals>.<genexpr>*   s   è ø€ ÒE R°B·N±NÕ4DœbÑEùs   ‚˜N)ÚjoinÚ_redact_stringr   )r   Ústrippeds     r!   Ú_sanitize_correlation_idr&      s,   € ð —g‘gÑE¨5ÔEÓE€HÜ˜(Ð#>Ô$>Ð?Ó@Ð@ó    zcontextvars.Token[str]c                 ó>   — t         j                  t        | «      «      S r   )r   Úsetr&   )r   s    r!   Úset_session_idr*   .   s   € Ü×ÑÔ6°zÓBÓCÐCr'   c                 ó>   — t         j                  t        | «      «      S r   )r   r)   r&   )r   s    r!   Úset_trace_idr,   2   s   € Ü×ÑÔ4°XÓ>Ó?Ð?r'   Tze`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs.ÚLITELLM_DISABLE_REDACT_SECRETSÚtrueÚ_ENABLE_SECRET_REDACTIONc                 ó(   — t         s| S t        | «      S r   )r/   r   ©r   s    r!   r$   r$   >   s   € Ý#ØˆÜ˜ÓÐr'   Úkeyc                 ó*   — t         s|S t        | |«      S r   )r/   r   )r2   r   s     r!   Ú_redact_structured_valuer4   D   s   € Ý#ØˆÜ" 3¨Ó.Ð.r'   c                 ó(   — t         s| S t        | «      S )u5  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$   r1   s    r!   Úredact_secretsr6   J   s   € õ $ØˆÜ˜%Ó Ð r'   Úrecordc                 ó´   — | j                   j                  d«      }t        |t        «      r| j                  sy	 || j                  z  S # t
        $ r |cY S w xY w)a´  Render a record's ``color_message`` against its args, or None if absent.

    uvicorn's colorized formatter re-renders `color_message` against
    record.args at emit time (see uvicorn.logging.ColourizedFormatter) instead
    of using the already-formatted record.msg, so it has to be substituted
    before args are cleared or it is later formatted with no args and prints
    the raw "%s://%s:%d" placeholders instead of the URL.
    Úcolor_messageN)Ú__dict__ÚgetÚ
isinstanceÚstrÚargsÚ	TypeError)r7   r9   s     r!   Ú_substituted_color_messager@   [   sT   € ð "Ÿ?™?×.Ñ.¨Ó?€MÜ�m¤SÔ)°·²ØðØ˜vŸ{™{Ñ*Ð*øÜò ØÒðús   ºA	 Á	AÁA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.r7   r   c                 óš  — t         syt        |«      }|�||_        	 t        |j	                  «       «      |_        d |_        |j                  rQ|j                  d   �B	 t        |j                  xs% | 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é   )r/   r@   r9   r$   Ú
getMessageÚmsgr>   Ú	Exceptionr<   r=   Úexc_infoÚexc_textÚ
_formatterÚformatExceptionÚlistr:   ÚitemsÚ_STANDARD_RECORD_ATTRSÚsetattr)Úselfr7   Úsubstituted_color_messager2   r   s        r!   ÚfilterzSecretRedactionFilter.filterr   s  € Ý'Øô ,FÀfÓ+MÐ!Ø$Ð0Ø#<ˆFÔ ð	8Ü'¨×(9Ñ(9Ó(;Ó<ˆFŒJØˆFŒKð �?Š?˜vŸ™¨qÑ1Ð=ðÜ"0°·±Ò1tÀDÇOÁO×DcÑDcÐdj×dsÑdsÓDtÓ"u�”ô
 ˜vŸ™×4Ñ4Ó6Ó7ò 	<‰JˆC�ØÔ0Ò0´ZÀÄsÕ5KÜ˜ ¤^°EÓ%:Õ;ð	<ð øô! ò 	8Ü˜&Ÿ*™*¤cÔ*Ü+¨F¯J©JÓ7�”
ùð	8ûô ò Ùðús$   �%C; ÁAD> Ã;=D;Ä:D;Ä>	E
Å	E
N©
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úloggingr   rJ   Ú	LogRecordÚboolrR   © r'   r!   rB   rB   m   s.   „ ÙCà"�×"Ñ"Ó$€Jð˜W×.Ñ.ð °4ô r'   rB   Ú_secret_filterc                  ó"   — t        dt        «      S )zhRead the limit per record so a value loaded later via proxy config
    environment_variables is honored.r
   )r   r
   r[   r'   r!   Ú!_get_max_string_length_stdout_logr^   •   s   € ô Ð5Ô7SÓTÐTr'   Úskipped_charsc                 ó*   — dt         › d| › dt        › d�S )Nz... (z	 skipped z chars. z) ...)r   r	   )r_   s    r!   Ú_stdout_truncation_markerra   ›   s%   € à
Ô/Ð0°	¸-¸ÈÜ3Ð
4°Eð	;ðr'   ÚtextÚlimitc                 ó²   — |t        t        t        | «      «      «      z
  }|dk  r| d | S |dz  }||z
  }| d | › t        t        | «      |z
  «      › | | d  › �S )Nr   é   )Úlenra   )rb   rc   Ú
kept_charsÚ
head_charsÚ
tail_charss        r!   Ú_truncate_for_stdout_logrj   ¢   sz   € Ø¤Ô$=¼cÀ$»iÓ$HÓ IÑI€JØ�Q‚Ø�F�Uˆ|ÐØ" a™€JØ" ZÑ/€JØ�;�JÐÐ Ô!:¼3¸t»9ÀzÑ;QÓ!RÐ SÐTXÐZdÐYdÐYeÐTfÐSgÐhÐhr'   c                   óV   — e Zd ZdZ ej
                  «       Zdej                  defd„Z	y)ÚStdoutLogTruncationFiltera9  Bounds how much of an oversized log line reaches stdout.

    A provider error string can echo the whole request payload, so one failed agentic
    request writes hundreds of KB to stdout, repeatedly as the exception propagates from
    the router to the proxy handler and into its traceback, all inline on the event loop.

    DEBUG records pass through untouched, since dumping full payloads is the point of
    `--detailed_debug`, and logging callbacks (OTEL, Datadog, etc.) don't run through
    logging filters at all, so they still get the untruncated error.
    r7   r   c                 óÐ  — |j                   t        j                  k  ryt        «       }|dk  ry	 |j	                  «       }t        |«      |kD  rt        ||«      |_	        d |_
        t        |j                  t        «      rR|j                  xs% | j                  j!                  |j                  «      }t        |«      |kD  rt        ||«      |_        y# t
        t        f$ r Y yw xY w)NTr   )ÚlevelnorX   ÚINFOr^   rE   r?   Ú
ValueErrorrf   rj   rF   r>   r<   rH   ÚtuplerI   rJ   rK   )rP   r7   rc   ÚmessagerI   s        r!   rR   z StdoutLogTruncationFilter.filter¹   sÊ   € Ø�>‰>œGŸL™LÒ(Øä8Ó:ˆØ�AŠ:Øð	Ø#×.Ñ.Ó0ˆGô ˆw‹<˜%ÒÜ1°'¸5ÓAˆFŒJØˆFŒKä�f—o‘o¤uÔ-Ø$Ÿo™oÒa°·±×1PÑ1PÐQW×Q`ÑQ`Ó1aˆHÜ�8‹}˜uÒ$Ü":Ø˜eó#�”ð øô œ:Ð&ò 	Ùð	ús   °C ÃC%Ã$C%NrS   r[   r'   r!   rl   rl   «   s2   „ ñ	ð #�×"Ñ"Ó$€Jð˜W×.Ñ.ð °4ô r'   rl   Ú_stdout_truncation_filterc                   ó4   — e Zd ZdZdej
                  defd„Zy)ÚCorrelationContextFiltera	  Stamps each log record with the current request's trace_id and session_id from contextvars.

    Works in tandem with JsonFormatter: the formatter's record.__dict__ loop picks up these
    attributes as first-class JSON fields without any formatter-level code.
    r7   r   c                 óš   — t         j                  syt        j                  «       }|r||_        t
        j                  «       }|r||_        y)NT)ÚlitellmÚrequest_correlation_in_logsr   r;   r   r   r   )rP   r7   r   r   s       r!   rR   zCorrelationContextFilter.filterÞ   sB   € Ü×2Ò2ØÜ&×*Ñ*Ó,ˆÙØ&ˆFŒOÜ*×.Ñ.Ó0ˆ
ÙØ *ˆFÔØr'   N)rT   rU   rV   rW   rX   rY   rZ   rR   r[   r'   r!   ru   ru   ×   s    „ ñð	˜W×.Ñ.ð 	°4ô 	r'   ru   Ú_correlation_filterz$%(asctime)s - %(name)s:%(levelname)sÚ_LOG_FORMAT_PREFIXz': %(filename)s:%(lineno)s - %(message)sÚ_LOG_FORMAT_SUFFIXÚ_PLAIN_LOG_FORMATz[92mz[0mÚ_COLOR_LOG_FORMATÚstreamc                 óZ   — 	 | duxr | j                  «       S # t        t        f$ r Y yw xY w)zãTrue when the stream is an open interactive terminal; never raises.

    A stream can be None (pythonw/embedded interpreters), lack isatty entirely
    (GUI log-redirect shims), or be closed; import must survive all three.
    NF)ÚisattyÚAttributeErrorrp   )r~   s    r!   Ú_stream_is_ttyr‚   ó   s4   € ðØ˜TÐ!Ò5 f§m¡m£oÐ5øÜœJÐ'ò Ùðús   ‚ ˜*©*ÚstdoutÚstderrc                 ó�   — t         j                  j                  d«      rt        S t	        | «      rt	        |«      rt
        S t        S )zÛThe plain-text log format, colorized only when both streams are an interactive terminal.

    Honors the NO_COLOR convention from no-color.org: color is disabled when
    NO_COLOR is present with a non-empty value.
    ÚNO_COLOR)ÚosÚenvironr;   r|   r‚   r}   )rƒ   r„   s     r!   Ú_plain_log_formatr‰   ÿ   s5   € ô 
‡z�z‡~�~�jÔ!Ü Ð Ü .¨vÔ 6¼>È&Ô;QÔÐhÔWhÐhr'   c                   ó@   ‡ — e Zd ZdZdej
                  ddfˆ fd„Zˆ xZS )ÚLevelRoutingStreamHandlerz§Writes records below WARNING to stdout and WARNING and above to stderr.

    Collectors that derive severity from the stream report every stderr line as an error.
    r7   r   Nc                 óö   •— |j                   t        j                  k  rt        j                  nt        j
                  }|�t        |dd«      rt        j
                  | _        n|| _        t        ‰| �%  |«       y )NÚclosedF)
rn   rX   ÚWARNINGÚsysrƒ   r„   Úgetattrr~   ÚsuperÚemit)rP   r7   Ú	preferredÚ	__class__s      €r!   r’   zLevelRoutingStreamHandler.emit  sP   ø€ Ø)/¯©¼'¿/¹/Ò)Iœ3Ÿ:š:ÌsÏzÉzˆ	ØÐ¤¨	°8¸UÔ CÜŸ*™*ˆD�Kà#ˆDŒKÜ‰‰�VÕr'   )rT   rU   rV   rW   rX   rY   r’   Ú__classcell__©r”   s   @r!   r‹   r‹   
  s&   ø„ ñð
˜7×,Ñ,ð °÷ ñ r'   r‹   c                 ó0   — | xs dj                  «       dk(  S )a  Strict opt-in parse for the JSON_LOGS env var: only "true" (any case) enables JSON logs.

    Matches the reader in litellm-proxy-extras/_logging.py. The previous
    bool(os.getenv(...)) treated any non-empty value, including "false" and "0",
    as enabled.
    r   r.   )Úlowerr1   s    r!   Ú_parse_json_logs_envr™     s   € ð ŠK�R×ÑÓ  FÑ*Ð*r'   Ú	JSON_LOGSÚ	json_logsÚLITELLM_LOGÚDEBUGÚ	log_levelÚnumeric_levelÚhandlerrr   c                 óÒ   — | 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ú{ú[r   )r<   r=   ÚstripÚ
startswithr   Údict)rr   Úmsg_strippedÚparseds      r!   Ú_try_parse_json_messager©   -  s^   € ñ œ* W¬cÔ2ØØ!Ÿ-™-›/€LØ×#Ñ# CÔ(¨L×,CÑ,CÀCÔ,HØÜ# G°TÔ:€FØ€~œ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.
    r¢   Nr   éÿÿÿÿrD   ú})r<   r=   rf   ÚfindÚrangeÚastÚliteral_evalr¦   rp   ÚSyntaxErrorr?   )rr   ÚiÚstartÚdepthÚjÚcÚsubstrÚresults           r!   Ú_try_parse_embedded_python_dictr¹   >  s  € ñ œ* W¬cÔ2°cÀÑ6HØØ	€AØ
Œc�'‹lÒ
Ø—‘˜S !Ó$ˆØ�BŠ;Øð$ ð# ˆÜ�uœc '›lÓ+ò 	ˆAØ˜‘
ˆAØ�CŠxØ˜‘
‘Ø�c“Ø˜‘
�Ø˜A“:Ø$ U¨Q°©UÐ3�FðÜ!$×!1Ñ!1°&Ó!9˜Ü% f¬dÔ3¼¸F»ÀaºØ#)šMñ ð	ð �A‰Iˆð) Œ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)Ú	frozensetrX   rY   r:   Úkeysr[   r'   r!   Ú_get_standard_record_attrsr½   b  s3   € ä”W×&Ñ& r¨1¨b°!°R¸¸TÓB×KÑK×PÑPÓRÓSÐSr'   rN   )r   r   Ú_RESERVED_CORRELATION_FIELDSc                   ó,   ‡ — e Zd Zˆ fd„Zdd„Zd„ Zˆ xZS )ÚJsonFormatterc                 ó"   •— t         ‰| �  «        y r   )r‘   Ú__init__)rP   r”   s    €r!   rÂ   zJsonFormatter.__init__p  s   ø€ Ü‰ÑÕr'   c                 ó`   — t        j                  |j                  «      }|j                  «       S r   )r   ÚfromtimestampÚcreatedÚ	isoformat)rP   r7   ÚdatefmtÚdts       r!   Ú
formatTimezJsonFormatter.formatTimes  s"   € ä×*Ñ*¨6¯>©>Ó:ˆØ�|‰|‹~Ðr'   c                 ó�  — |j                  «       }||j                  | j                  |«      dœ}t        |«      }|€t	        |«      }|�+|j                  «       D ]  \  }}||vsŒ|t        vsŒ|||<   Œ |j                  j                  «       D ]  \  }}|t        vsŒ||vsŒ|||<   Œ t        D ]  }t        ||d «      }|sŒ|||<   Œ d|vr|j                  |d<   d|vr|j                  › d|j                  › �|d<   |j                  r,|j                  xs | j                  |j                  «      |d<   t!        |t"        ¬«      S )N)rr   ÚlevelÚ	timestampÚ	componentÚloggerú:Ú
stacktrace)Úvalue_transform)rE   Ú	levelnamerÉ   r©   r¹   rM   r¾   r:   rN   r�   ÚnameÚfilenameÚlinenorH   rI   rK   r   r4   )rP   r7   Úmessage_strÚjson_recordr¨   r2   r   Úreserved_keys           r!   ÚformatzJsonFormatter.formatx  sc  € Ø#×.Ñ.Ó0ˆà"Ø×%Ñ%ØŸ™¨Ó0ñ.
ˆô )¨Ó5ˆØˆ>Ü4°[ÓAˆFØÐØ$Ÿl™l›nò -‘
��UØ˜kÒ)¨cÔ9UÒ.UØ',�K Ò$ð-ð
 !Ÿ/™/×/Ñ/Ó1ò 	)‰JˆC�ØÔ0Ò0°SÀÒ5KØ#(�˜CÒ ð	)ô 9ò 	2ˆLÜ˜F L°$Ó7ˆEÚØ,1�˜LÒ)ð	2ð ˜kÑ)Ø'-§{¡{ˆK˜Ñ$Ø˜;Ñ&Ø'-§¡Ð&7°q¸¿¹¸Ð$HˆK˜Ñ!à�?Š?Ø(.¯©Ò(`¸4×;OÑ;OÐPV×P_ÑP_Ó;`ˆK˜Ñ%ä˜+Ô7OÔPÐPr'   r   )rT   rU   rV   rÂ   rÉ   rÙ   r•   r–   s   @r!   rÀ   rÀ   o  s   ø„ ôóö
0Qr'   rÀ   c                   ó@   ‡ — e Zd ZdZdej
                  defˆ fd„Zˆ xZS )ÚCorrelationPlainFormatterzðAppends trace_id/session_id to plain-text log lines stamped by CorrelationContextFilter.

    Mirrors JsonFormatter's handling of these two fields so request_correlation_in_logs
    behaves the same whether or not json_logs is enabled.
    r7   r   c                 óæ   •— t        t        ‰| �	  |«      «      }t        |dd «      }t        |dd «      }|s|s|S t	        d„ |rd|› �nd |rd|› �nd fD «       «      }|› ddj                  |«      › d�S )	Nr   r   c              3   ó$   K  — | ]  }|r|–— Œ
 y ­wr   r[   )r   Úps     r!   r"   z3CorrelationPlainFormatter.format.<locals>.<genexpr>¸  s   è ø€ ò 
àÙô ñ
ùs   ‚z	trace_id=zsession_id=z [ú ú])r$   r‘   rÙ   r�   rq   r#   )rP   r7   Ú	formattedr   r   Úpartsr”   s         €r!   rÙ   z CorrelationPlainFormatter.format²  s‘   ø€ Ü)¬%©'©.¸Ó*@ÓAˆ	Ü! &¨*°dÓ;ˆÜ# F¨L¸$Ó?ˆ
Ù¡
ØÐÜñ 
á08˜	 ( Ñ,¸dÑblÀkÐR\ÐQ]ÑD^ÐrvÐwô
ó 
ˆð
 �˜B˜sŸx™x¨›Ð/¨qÐ1Ð1r'   )	rT   rU   rV   rW   rX   rY   r=   rÙ   r•   r–   s   @r!   rÛ   rÛ   «  s&   ø„ ñð2˜W×.Ñ.ð 2°3÷ 2ñ 2r'   rÛ   c                 ó^  ‡— t        j                  «       Š‰j                  | «       ‰j                  t        «       ‰j                  t
        «       ‰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[   ©rÓ   rË   ÚpathnamerÕ   rF   r>   rH   )rX   rY   ÚERRORr=   Úhandle)Úexc_typeÚ	exc_valueÚexc_tracebackr7   Ú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æ   )	r;   ÚtyperX   rY   rè   r=   Ú__traceback__ré   Údefault_exception_handler)ÚloopÚcontextrð   rê   r7   rí   s        €r!   Úasync_json_exception_handlerzD_setup_json_exception_handlers.<locals>.async_json_exception_handlerÜ  su   ø€ Ø&Ÿ{™{¨;Ó7ˆIÙÜ"& y£/�Ü '× 1Ñ 1Ø"Ü!Ÿ-™-ØØÜ˜I›ØØ&¨	°9×3JÑ3JÐKô!�ð ×$Ñ$ VÕ,à×.Ñ.¨wÕ7r'   )rX   ÚStreamHandlerÚsetFormatterÚ	addFilterr\   rs   ry   r�   Ú
excepthookÚasyncioÚget_event_loopÚset_exception_handlerrG   )Ú	formatterrî   rû   rö   rí   s       @r!   Ú_setup_json_exception_handlersrÿ   Á  s’   ø€ ä"×0Ñ0Ó2€MØ×Ñ˜yÔ)Ø×ÑœNÔ+Ø×ÑÔ5Ô6Ø×ÑÔ/Ô0ô
%ð %„C„NðÛô	8ð" 	×ÑÓ ×6Ñ6Ð7SÕTøÜò Ùðús   Á7(B  Â 	B,Â+B,z%H:%M:%S)rÇ   rþ   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Úhttpxúapscheduler.executors.defaultúapscheduler.schedulerN)rX   Ú	getLoggerÚsetLevelrŽ   )Úhttpx_loggerÚapscheduler_executors_loggerÚapscheduler_scheduler_loggers      r!   Ú_suppress_loggersr	    sp   € ô "×+Ñ+¨GÓ4€LØ×Ñœ'Ÿ/™/Ô*ô +2×*;Ñ*;Ð<[Ó*\Ð Ø ×)Ñ)¬'¯/©/Ô:Ü*1×*;Ñ*;Ð<SÓ*TÐ Ø ×)Ñ)¬'¯/©/Õ:r'   )r  r  rû   Úbackoffr  úuvicorn.error.Ú_REDACTED_THIRD_PARTY_LOGGERSc                  ój   — t         D ]*  } t        j                  | «      j                  t        «       Œ, y)aW  Extend secret redaction to records litellm does not emit directly.

    litellm's own loggers are covered by the filter on their shared handler, but a
    litellm value can also reach a log record through a dependency that logs on its
    own logger. Those records never pass through a litellm handler.

    The filter is attached to each emitting logger rather than to the root logger or
    to root's handlers. `Logger.handle` applies the emitting logger's filters before
    any handler runs, so redaction happens once, at the earliest point in the
    record's life, and covers every downstream handler regardless of who owns it.
    The alternatives do not hold: `callHandlers` consults ancestors for handlers but
    never for filters, so a filter on the root logger never sees these records at
    all, and a filter on a root handler only covers that one handler, leaving
    handlers registered earlier or on the emitting logger itself untouched.

    Each name is the exact logger a dependency emits on; a parent name would not
    cover its children, for the same reason the root logger does not.
    N)r  rX   r  rù   r\   )rÓ   s    r!   Ú_redact_third_party_loggersr  %  s,   € ô& .ò :ˆÜ×Ñ˜$Ó×)Ñ)¬.Õ9ñ:r'   ÚALL_LOGGERSc                  óÊ   — 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)	rw   rL   r  r)   Úsuccess_callbackÚfailure_callbackÚappendrX   r  )rw   ÚloggersÚlangfuse_callbacksÚall_callbackss       r!   Ú_get_loggers_to_initializer  H  s]   € ó äœ+Ó&€Gð ",¨_Ð =ÐÜ˜w×7Ñ7¸'×:RÑ:RÑRÓS€MØ˜MÒ)Ø�‰”w×(Ñ(¨Ó4Ô5à€Nr'   c                 óÚ   — | j                  t        «       | 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\   ry   r  ÚhandlersÚclearÚ
addHandlerÚ	propagate)r    Úlgs     r!   Ú _initialize_loggers_with_handlerr   \  sV   € ð ×Ñ”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.JsonFormatterrD   Fz())Újsonr   Úaccessr"  zlogging.StreamHandlerzext://sys.stdout)rþ   Úclassr~   r#  )r   r#  r   )r  rË   r  )Úuvicornr  zuvicorn.access)ÚversionÚdisable_existing_loggersÚ
formattersr  r  )rž   Úupper)Újson_formatter_classÚuvicorn_log_levelÚ
log_configs      r!   Ú_get_uvicorn_json_log_configr-  k  s¾   € ð #CÐô  )Ÿ™Ó0Ðð Ø$)ð Ð*ðð Ð*ðð Ð*ðñ

ð $Ø0Ø,ñð &Ø0Ø,ññ
ð '˜KØ*Ø"ñð '˜KØ*Ø"ñð &˜JØ*Ø"ññ
ñ5+€JðZ Ðr'   c                  ó†   — t        «       } | j                  t        «       «       t        | «       t	        t        «       «       y)zJ
    Turn on JSON logging

    - Adds a JSON formatter to all loggers
    N)r‹   rø   rÀ   r   rÿ   )r    s    r!   Ú_turn_on_jsonr/  §  s.   € ô /Ó0€GØ×Ñœ›Ô)Ü$ WÔ-ä"¤=£?Õ3r'   c                  óÜ   — t         j                  t        j                  ¬«       t        j                  t        j                  ¬«       t
        j                  t        j                  ¬«       y )N)rË   )Úverbose_loggerr  rX   r�   Úverbose_router_loggerÚverbose_proxy_loggerr[   r'   r!   Ú_turn_on_debugr4  ´  sA   € Ü×Ñ¤'§-¡-ÐÔ0Ü×"Ñ"¬¯©Ð"Ô7Ü×!Ñ!¬¯©Ð!Õ6r'   c                  óF   — dt         _        dt        _        dt        _        y)z7Disable the package, router, and proxy verbose loggers.TN©r1  Údisabledr2  r3  r[   r'   r!   Ú_disable_debuggingr8  º  s   € à"„NÔØ%)ÔÔ"Ø$(ÔÕ!r'   c                  óF   — dt         _        dt        _        dt        _        y )NFr6  r[   r'   r!   Ú_enable_debuggingr:  Á  s   € Ø#„NÔØ%*ÔÔ"Ø$)ÔÕ!r'   c                 ól   — 	 t         rt        t        t        | «      «      «       y y # t        $ r Y y w xY wr   )Úset_verboseÚprintr6   r=   rG   )Úprint_statements    r!   Úprint_verboser?  Ç  s3   € ðÝÜ”.¤ _Ó!5Ó6Õ7ð øäò Ùðús   ‚#' §	3²3c                  ó\   — t         j                  t        j                  «      xs t        du S )z)
    Returns True if debugging is on
    T)r1  ÚisEnabledForrX   r�   r<  r[   r'   r!   Ú_is_debugging_onrB  Ï  s#   € ô ×&Ñ&¤w§}¡}Ó5ÒL¼ÈÐ9LÐLr'   )r   N)kr¯   ÚcontextvarsrX   r‡   r�   r   r   Útypingr   r   r   rw   Úlitellm.constantsr   r	   r
   Ú$litellm.litellm_core_utils.env_utilsr   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Ú*litellm.litellm_core_utils.safe_json_loadsr   Ú+litellm.litellm_core_utils.secret_redactionr   r   r<  Ú
ContextVarr   r=   Ú__annotations__r   r   r&   r*   r,   ÚwarningÚgetenvr˜   r/   r$   r4   r6   rY   r@   ÚFilterrB   r\   Úintr^   ra   rj   rl   rs   ru   ry   rz   r{   r|   r}   rZ   r‚   r‰   r÷   r‹   r™   r›   rž   r�   r)  rŸ   r    r  rù   r¦   r©   r¹   r»   r½   rN   r¾   rÀ   rÛ   rÿ   rø   rƒ   r„   rþ   r  r3  r2  r1  r  r	  r  rq   r  r  r  ÚHandlerr   r-  r/  r4  r8  r:  r?  rB  r[   r'   r!   ú<module>rQ     s{  ðÜ 
Û Û Û 	Û 
Ý Ý ß %Ñ %ã ÷ñ õ
 =Ý AÝ Fß ^à€à5K°[×5KÑ5KÈLÐbdÔ5e€��k×,Ñ,¨SÑ1Ñ2Ó eØ3I°;×3IÑ3IÈ*Ð^`Ô3a€ˆe�K×*Ñ*¨3Ñ/Ñ0Ó aà$'Ð ˜EÓ 'ðA Cð A¨Có Að"D˜sð DÐ'?ó Dð@˜3ð @Ð#;ó @ð �$ÑØ€G‡O�OØoôð #, "§)¡)Ð,LÈbÓ"Q×"WÑ"WÓ"YÐ]cÑ"cÐ ˜%Ó cð ˜#ð   #ó  ð/ #¨¡*ð /°Sð /¸Só /ð!˜#ð ! #ó !ð" w×'8Ñ'8ð ¸SÀ4¹Zó ô$"˜GŸN™Nô "ñJ .Ó/€�Ó /ðU¨3ó Uð¨Sð °Só ði 3ð i¨sð i°só iô& §¡ô &ñR $=Ó#>Ð ˜5Ó >ô˜wŸ~™~ô ñ& 6Ó7Ð �UÓ 7ð CÐ �EÓ BØEÐ �EÓ EØ-Ð0BÑBÐ �5Ó BØ%Ð&8Ð%9¸ÐASÐ@TÐUÐ �5Ó Uð	˜6 D™=ð 	¨Tó 	ði˜f t™mð i°V¸d±]ð iÀsó iô × 5Ñ 5ô ð+  d¡
ð +¨tó +ñ (¨	¨¯	©	°+Ó(>Ó?€	ˆ5Ó ?à�2—9‘9˜]¨GÓ4€	ˆ5Ó 4Ù# G¨Y¯_©_Ó->Ó?€ˆu�S‰zÓ ?Ù*Ó,€ˆÓ ,Ø × Ñ �Ô Ø × Ñ �.Ô !Ø × Ñ Ð%Ô &ð Sð ¨T°#°s°(©^¸dÑ-Bó ð"¨Sð °T¸#¸s¸(±^ÀdÑ5Jó ðHT Ió Tñ
 !;Ó <Ð ˜Ó <ñ
 '0Ð0JÓ&KÐ ˜eÓ Kô9Q�Iô 9Qôx2 × 1Ñ 1ô 2ò,.ñd Ø×Ñ™›Ô)Ù"¡=£?Õ3á0Ù˜#Ÿ*™* c§j¡jÓ1Øô€Iˆuó ð
 ×Ñ˜Ô#à(�w×(Ñ(¨Ó9Ð Ø)˜×)Ñ)Ð*:Ó;Ð Ø"�×"Ñ" 9Ó-€ð ×  Ñ   Ô )Ø × Ñ  Ô (Ø × Ñ ˜'Ô "ð × Ñ Ð 9Ô :Ø × Ñ Ð8Ô 9Ø × Ñ Ð2Ô 3ò
;ð9Ð ˜u U¨3°¨8¡_Ñ5ó ó:ñ0 Ô Ù Ô ð €G×ÑÓØØØð	€ˆUó òð(¨g¯o©oó ò9òx
4ò7ò)ò*òðM˜$ô Mr'   