Ë
    tPêjï-  ã                   ól   — d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	 erd dl
mZ neZ G d„ de	«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_logger)ÚCustomLogger)ÚStandardLoggingPayloadc                   ó†   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zdedz  defd„Zd„ Zdedefd„Zd„ Zy)ÚMlflowLoggerc                 óh   — ddl m}  |«       | _        i | _        t	        j
                  «       | _        y )Nr   )ÚMlflowClient)Úmlflow.trackingr   Ú_clientÚ_stream_id_to_spanÚ	threadingÚLockÚ_lock)Úselfr   s     ú`/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/mlflow.pyÚ__init__zMlflowLogger.__init__   s$   € Ý0á#“~ˆŒà"$ˆÔÜ—^‘^Ó%ˆ�
ó    c                 ó,   — | j                  ||||«       y ©N©Ú_handle_success©r   ÚkwargsÚresponse_objÚ
start_timeÚend_times        r   Úlog_success_eventzMlflowLogger.log_success_event   ó   € Ø×Ñ˜V \°:¸xÕHr   c              ƒ   ó4   K  — | j                  ||||«       y ­wr   r   r   s        r   Úasync_log_success_eventz$MlflowLogger.async_log_success_event   ó   è ø€ Ø×Ñ˜V \°:¸xÕHùó   ‚c                 ó”  — ddl m} 	 t        j                  d«       |j	                  d«      r| j                  ||||«       y
| j                  ||«      }t        |j                  «       dz  «      }| j                  |||«       | j                  |||j                  |¬«       y
# t        $ r t        j                  dd¬	«       Y y
w xY w)z‹
        Log the success event as an MLflow span.
        Note that this method is called asynchronously in the background thread.
        r   ©ÚSpanStatusCodez&MLflow logging start for success eventÚstreamç    eÍÍA©ÚspanÚoutputsÚstatusÚend_time_nszMLflow Logging ErrorT©Ú
stack_infoN)Úmlflow.entitiesr(   r   ÚdebugÚgetÚ_handle_stream_eventÚ_start_span_or_traceÚintÚ	timestampÚ _extract_and_set_chat_attributesÚ_end_span_or_traceÚOKÚ	Exception)r   r   r   r   r   r(   r,   r/   s           r   r   zMlflowLogger._handle_success   sÁ   € õ
 	3ð	JÜ× Ñ Ð!IÔJà�z‰z˜(Ô#Ø×)Ñ)¨&°,À
ÈHÕUà"×7Ñ7¸À
ÓK�Ü%(¨×);Ñ);Ó)=ÀÑ)CÓ%D�Ø×5Ñ5°d¸FÀLÔQØ×'Ñ'ØØ(Ø)×,Ñ,Ø +ð	 (õ øô ò 	JÜ× Ñ Ð!7ÀD×Ið	Jús   ˆ:B$ ÁA B$ Â$ CÃCc                 óH  — 	 ddl m}m} | j	                  |«      }|j                  dg «      }t        |dg «      D �cg c]  }|j                  j                  d¬«      ‘Œ  }	}g |¢|	¢x}
r	 |||
«       |j                  d«      x}r
 |||«       y y # t        $ r Y y w xY wc c}w )Nr   )Úset_span_chat_messagesÚset_span_chat_toolsÚmessagesÚchoicesT)Úexclude_noneÚtools)	Úmlflow.tracing.utilsr>   r?   ÚImportErrorÚ_construct_inputr4   ÚgetattrÚmessageÚ
model_dump)r   r,   r   r   r>   r?   ÚinputsÚinput_messagesÚcÚoutput_messagesr@   rC   s               r   r9   z-MlflowLogger._extract_and_set_chat_attributes6   sº   € ð	÷ð ×-Ñ-¨fÓ5ˆØ &§
¡
¨:°rÓ :ˆÜSZÐ[gÐirÐtvÓSwÖ!xÈa !§)¡)×"6Ñ"6ÀDÐ"6Õ"IÐ!xˆÐ!xØ:˜Ð:¨/Ð:Ð:ˆ8Ð:Ù" 4¨Ô2Ø—J‘J˜wÓ'Ð'ˆ5Ð'Ù  eÕ,ð (øô ò 	Ùð	üò
 "ys   ‚B ¼#BÂ	BÂBc                 ó,   — | j                  ||||«       y r   ©Ú_handle_failurer   s        r   Úlog_failure_eventzMlflowLogger.log_failure_eventG   r!   r   c              ƒ   ó4   K  — | j                  ||||«       y ­wr   rO   r   s        r   Úasync_log_failure_eventz$MlflowLogger.async_log_failure_eventJ   r$   r%   c                 ó˜  — ddl m}m} 	 | j                  ||«      }t	        |j                  «       dz  «      }|j                  d«      x}	r |j                  |j                  |	«      «       | j                  |||«       | j                  |||j                  |¬«       y	# t        $ r"}
t        j                  d|
d¬«       Y d	}
~
y	d	}
~
ww xY w)
zŽ
        Log the failure event as an MLflow span.
        Note that this method is called *synchronously* unlike the success handler.
        r   )Ú	SpanEventr(   r*   Ú	exceptionr+   zMLflow Logging Error - %sTr0   N)r2   rU   r(   r6   r7   r8   r4   Ú	add_eventÚfrom_exceptionr9   r:   ÚERRORr<   r   r3   )r   r   r   r   r   rU   r(   r,   r/   rV   Úes              r   rP   zMlflowLogger._handle_failureM   sÅ   € ÷
 	>ð	RØ×3Ñ3°F¸JÓGˆDä!$ X×%7Ñ%7Ó%9¸CÑ%?Ó!@ˆKð #ŸJ™J {Ó3Ð3ˆyÐ3Ø—‘˜y×7Ñ7¸	ÓBÔCà×1Ñ1°$¸ÀÔMØ×#Ñ#ØØ$Ø%×+Ñ+Ø'ð	 $õ øô ò 	RÜ× Ñ Ð!<¸aÈD×QÒQûð	Rús   ŠBB Â	C	Â'CÃC	c                 ó’  — ddl m} |j                  d«      }|| j                  vrD| j                  5  || j                  vr!| j                  ||«      }|| j                  |<   ddd«       | j                  |   }| j                  ||«       |j                  d«      xs |j                  d«      }|rt        |j                  «       dz  «      }	| j                  |||«       | j                  |||j                  |	¬«       | j                  5  | j                  j                  |«       ddd«       yy# 1 sw Y   ŒÐxY w# 1 sw Y   yxY w)	aÓ  
        Handle the success event for a streaming response. For streaming calls,
        log_success_event handle is triggered for every chunk of the stream.
        We create a single span for the entire stream request as follows:

        1. For the first chunk, start a new span and store it in the map.
        2. For subsequent chunks, add the chunk as an event to the span.
        3. For the final chunk, end the span and remove the span from the map.
        r   r'   Úlitellm_call_idNÚcomplete_streaming_responseÚ!async_complete_streaming_responser*   r+   )r2   r(   r4   r   r   r6   Ú_add_chunk_eventsr7   r8   r9   r:   r;   Úpop)
r   r   r   r   r   r(   r\   r,   Úfinal_responser/   s
             r   r5   z!MlflowLogger._handle_stream_eventh   sD  € õ 	3à!'§¡Ð,=Ó!>ˆà $×"9Ñ"9Ñ9Ø—‘ñ Dà"¨$×*AÑ*AÑAà×4Ñ4°V¸ZÓH�DØ?C�D×+Ñ+¨OÑ<÷Dð ×&Ñ& Ñ7ˆØ×Ñ˜t \Ô2ð  Ÿ™Ð$AÓBÒuÀfÇjÁjÐQtÓFuˆÙÜ!$ X×%7Ñ%7Ó%9¸CÑ%?Ó!@ˆKà×1Ñ1°$¸ÀÔOØ×#Ñ#ØØ&Ø%×(Ñ(Ø'ð	 $ô ð —‘ñ =Ø×'Ñ'×+Ñ+¨OÔ<÷=ð =ð ÷Dð Dú÷4=ð =ús   ²0D1ÄD=Ä1D:Ä=Ec                 ó  — ddl m} 	 |j                  D ]J  }|j                   |ddt	        j
                  |j                  j                  t        ¬«      i¬«      «       ŒL y # t        $ r t        j                  dd¬	«       Y y w xY w)
Nr   )rU   Ústreaming_chunkÚdelta)Údefault)ÚnameÚ
attributesz!Error adding chunk events to spanTr0   )r2   rU   rA   rW   ÚjsonÚdumpsrd   rI   Ústrr<   r   r3   )r   r,   r   rU   Úchoices        r   r_   zMlflowLogger._add_chunk_events”   sz   € Ý-ð		WØ&×.Ñ.ò �Ø—‘ÙØ.Ø$+¬T¯Z©Z¸¿¹×8OÑ8OÔY\Ô-]Ð#^ôõñøô ò 	WÜ× Ñ Ð!DÐQU×Vð	Wús   ˆAA" Á" BÂBc                 óî   — d|j                  d«      i}|j                  d«      x}r||d<   dD ],  }|j                  di «      j                  |d«      x}sŒ(|||<   Œ. |j                  d«      x}r||d<   |S )z.Construct span inputs with optional parametersr@   rC   )Ú	functionsrC   r)   Útool_choiceÚuserÚoptional_paramsNÚ
prediction)r4   r`   )r   r   rJ   rC   ÚkeyÚvaluerq   s          r   rF   zMlflowLogger._construct_input¢   s“   € à# V§Z¡Z°
Ó%;Ð<ˆØ—J‘J˜wÓ'Ð'ˆ5Ð'Ø#ˆF�7‰OàJò 	$ˆCØŸ
™
Ð#4°bÓ9×=Ñ=¸cÀ4ÓHÐHˆuÑHØ#��s’ð	$ð  Ÿ™ LÓ1Ð1ˆ:Ð1Ø#-ˆF�<Ñ àˆr   c                 óÆ  — |j                  d«      |j                  d«      |j                  d«      dœ}|j                  d«      }|r¦|j                  |j                  d«      |j                  d«      |j                  d«      |j                  d	«      |j                  d
«      dœ|j                  d«      |j                  d«      |j                  d«      |j                  d«      dœ«       |S |j                  di «      }|j                  |j                  d«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      dœ«       |S )a  
        Extract span attributes from kwargs.

        With the latest version of litellm, the standard_logging_object contains
        canonical information for logging. If it is not present, we extract
        subset of attributes from other kwargs.
        r\   Ú	call_typeÚmodel)r\   ru   rv   Ústandard_logging_objectÚapi_baseÚ	cache_hitÚprompt_tokensÚcompletion_tokensÚtotal_tokens)Úinput_tokensÚoutput_tokensr|   ÚresponseÚresponse_costÚsaved_cache_costÚrequest_tags)rx   ry   zmlflow.chat.tokenUsageÚraw_llm_responser€   r�   r‚   Úlitellm_paramsÚcustom_llm_provider)rv   ry   r…   rx   r€   )r4   Úupdate)r   r   rg   Ústandard_objr„   s        r   Ú_extract_attributesz MlflowLogger._extract_attributes±   sT  € ð  &Ÿz™zÐ*;Ó<ØŸ™ KÓ0Ø—Z‘Z Ó(ñ
ˆ
ð
 >D¿Z¹ZÐHaÓ=bˆÙØ×Ñà ,× 0Ñ 0°Ó <Ø!-×!1Ñ!1°+Ó!>à(4×(8Ñ(8¸Ó(IØ)5×)9Ñ)9Ð:MÓ)NØ(4×(8Ñ(8¸Ó(Hñ/ð
 )5×(8Ñ(8¸Ó(DØ%1×%5Ñ%5°oÓ%FØ(4×(8Ñ(8Ð9KÓ(LØ$0×$4Ñ$4°^Ó$Dñôð4 Ðð %+§J¡JÐ/?ÀÓ$DˆNØ×Ñà#ŸZ™Z¨Ó0Ø!'§¡¨KÓ!8Ø+1¯:©:Ð6KÓ+LØ .× 2Ñ 2°:Ó >Ø%+§Z¡Z°Ó%@ñôð Ðr   ru   NÚreturnc                 óh   — ddl m} |dv r|j                  S |dk(  r|j                  S |j                  S )Nr   )ÚSpanType)Ú
completionÚacompletionÚ
embeddings)r2   r‹   ÚLLMÚ	EMBEDDING)r   ru   r‹   s      r   Ú_get_span_typezMlflowLogger._get_span_typeÜ   s6   € Ý,àÐ5Ñ5Ø—<‘<ÐØ˜,Ò&Ø×%Ñ%Ð%à—<‘<Ðr   c                 óæ  — ddl }|j                  dd«      }d|› �}| j                  |«      }t        |j	                  «       dz  «      }| j                  |«      }| j                  |«      }	|j                  «       x}
r6| j                  j                  ||
j                  |
j                  |||	|¬«      S | j                  j                  ||||	| j                  |	j                  dg «      «      |¬	«      S )
z­
        Start an MLflow span or a trace.

        If there is an active span, we start a new span as a child of
        that span. Otherwise, we start a new trace.
        r   Nru   rŒ   zlitellm-r*   )rf   Útrace_idÚ	parent_idÚ	span_typerJ   rg   Ústart_time_nsr‚   )rf   r•   rJ   rg   Útagsr–   )Úmlflowr4   r‘   r7   r8   rF   rˆ   Úget_current_active_spanr   Ú
start_spanÚ
request_idÚspan_idÚstart_traceÚ_transform_tag_list_to_dict)r   r   r   r˜   ru   Ú	span_namer•   r–   rJ   rg   Úactive_spans              r   r6   z!MlflowLogger._start_span_or_traceæ   s  € ó 	à!Ÿ:™: k°<Ó@ˆ	Ø% i [Ð1ˆ	Ø×.Ñ.¨yÓ9ˆ	Ü" :×#7Ñ#7Ó#9¸CÑ#?Ó@ˆà×-Ñ-¨fÓ5ˆØ ×4Ñ4°VÓ<ˆ
à ×8Ñ8Ó:Ð:ˆ;Ð:Ø—<‘<×*Ñ*ØØ$×/Ñ/Ø%×-Ñ-Ø#ØØ%Ø+ð +ó ð ð —<‘<×+Ñ+ØØ#ØØ%Ø×5Ñ5°j·n±nÀ^ÐUWÓ6XÓYØ+ð ,ó ð r   Útag_listc                 ó´   — i }|D ]P  }d|v r7|j                  dd«      \  }}|j                  «       ||j                  «       <   Œ>d||j                  «       <   ŒR |S )z”
        Transform a list of colon-separated tags into a dictionary.
        Tags without colons are stored with empty string as the value.
        ú:é   Ú )ÚsplitÚstrip)r   r¡   r—   ÚtagÚkÚvs         r   rž   z(MlflowLogger._transform_tag_list_to_dict  s_   € ð
 ˆØò 	'ˆCØ�c‰zØ—y‘y  aÓ(‘��1Ø"#§'¡'£)��Q—W‘W“Y’à$&��S—Y‘Y“[Ò!ð	'ð ˆr   c                 óØ   — |j                   €*| j                  j                  |j                  |||¬«       y| j                  j	                  |j                  |j
                  |||¬«       y)zEnd an MLflow span or a trace.N)r“   r-   r.   r/   )r“   rœ   r-   r.   r/   )r”   r   Ú	end_tracer›   Úend_spanrœ   )r   r,   r-   r/   r.   s        r   r:   zMlflowLogger._end_span_or_trace  sc   € à�>‰>Ð!Ø�L‰L×"Ñ"ØŸ™ØØØ'ð	 #õ ð �L‰L×!Ñ!ØŸ™ØŸ™ØØØ'ð "õ r   )Ú__name__Ú
__module__Ú__qualname__r   r    r#   r   r9   rQ   rS   rP   r5   r_   rF   rˆ   rj   r‘   r6   ÚlistÚdictrž   r:   © r   r   r
   r
      s|   „ ò&òIòIòJò2-ò"IòIòRò6*=òXWòò)ðV ¨¨d©
ð  °só  ò#ðJ°Dð ¸Tó ór   r
   )rh   r   Útypingr   r   r   Úlitellm._loggingr   Ú"litellm.integrations.custom_loggerr   Úlitellm.types.utilsr   r
   r³   r   r   ú<module>r¸      s1   ðÛ Û ß ,Ñ ,å +Ý ;áÞ:à Ðô[�<õ [r   