
    AHj              
          d dl Z d dlZd dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZ d dlm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mZ d d	lmZmZ d d
lmZ d dlm Z  d dl! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- erd dl.m/Z/m0Z0 d dl1m2Z2 neZ2eZ0eZ/de3fdZ4 G d d      Z5de6de6de	e+   dede6f
dZ7d Z8de6fdZ9y)    N)datetime)	TYPE_CHECKINGAnyCallableDictListOptionalTupleUnioncast)Version)verbose_logger) MAX_LANGFUSE_INITIALIZED_CLIENTS)safe_deep_copyreconstruct_model_namefilter_exceptions_from_params)redact_user_api_key_info)create_mock_langfuse_clientshould_use_langfuse_mock)_get_httpx_client)str_to_bool)*)HttpxBinaryResponseContentResponsesAPIResponse)EmbeddingResponseImageResponseModelResponseRerankResponseStandardLoggingPayload'StandardLoggingPromptManagementMetadataTextCompletionResponseTranscriptionResponse)LangfuseStatefulTraceClient)DynamicLoggingCachereturnc                     | j                  d      xs d}t        | d      rGt        | dd      }|8t        |d      r,t        |dd      }|t        |t        t
        f      r|dkD  r|}|S )a  
    Extract cache_read_input_tokens from usage object.

    Checks both:
    1. Top-level cache_read_input_tokens (Anthropic format)
    2. prompt_tokens_details.cached_tokens (Gemini, OpenAI format)

    See: https://github.com/BerriAI/litellm/issues/18520

    Args:
        usage_obj: Usage object from LLM response

    Returns:
        int: Number of cached tokens read, defaults to 0
    cache_read_input_tokensr   prompt_tokens_detailsNcached_tokens)gethasattrgetattr
isinstanceintfloat)	usage_objr(   r)   r*   s       ^/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/integrations/langfuse/langfuse.py _extract_cache_read_input_tokensr3   :   s      (mm,EFK! y12 '	3JD Q ,!?2
 $$9?DQM)}sEl;!A%*7'""    c                   l   e Zd Z	 	 	 	 d,dZdedefdZedededefd       Z	 	 	 	 	 d-d	ed
e	dee
eeeeeeef
   dee   dee   dee   dedee   defdZd	ed
e	dee
eeeeeeef
   dededee   deee   ee	eeef      f   fdZd Zd Zd Zdee   dededee	eeef      dee   dee   d	ededee   dedee   defdZed
efd       Zed
efd       Zed
efd       Z edee!   de"e   fd       Z#d  Z$d! Z%d" Z&d# Z'd$ Z(ed%e)d&e*e)ge)f   de)fd'       Z+ed(e,de,fd)       Z-d*e.dee!   fd+Z/y).LangFuseLoggerNc                 ~   	 dd l }ddl m} |xs t        j                  d      | _        |xs t        j                  d      | _        |xs t        j                  dd	      | _	        | j                  j                  d
      s/| j                  j                  d      sd
| j                  z   | _	        t        j                  d      | _        t        j                  d      | _        t        j                  |      | _        t!               rt#               | _        d| _        n"t)               }|j*                  | _        d| _        | j                  | j                  | j                  | j                  | j                  | j                  | j$                  d}	|j,                  j.                  | _        t3        | j0                        t3        d      k\  rd|	d<   | j5                  |	      | _        | j&                  r)dt
        j6                  d<   t9        j:                  d       nY	 | j                  j*                  j<                  j?                         j@                  d   jB                  }
|
t
        j6                  d<   t        j                  d      | jD                  tG        | jD                        nd }t        j                  d      | _$        t        j                  d      | _%        t        j                  d      | _&        t        j                  d      | _'        t        j                  d      | _"         || jJ                  | jH                  | jL                  | jN                  ||nd      | _(        y d | _(        y # t        $ r)}t        d| dt        j                          d      d }~ww xY w# t        $ r d }
Y Dw xY w)Nr   r#   zS[91mLangfuse not installed, try running 'pip install langfuse' to fix this error: 
z[0mLANGFUSE_SECRET_KEYLANGFUSE_PUBLIC_KEYLANGFUSE_HOSTzhttps://cloud.langfuse.comzhttp://zhttps://LANGFUSE_RELEASELANGFUSE_DEBUGTF)
public_key
secret_keyhostreleasedebugflush_intervalhttpx_clientz2.6.0litellmsdk_integrationzmock-project-idLANGFUSE_PROJECT_IDz$Langfuse Mock: Using mock project IDUPSTREAM_LANGFUSE_SECRET_KEYUPSTREAM_LANGFUSE_PUBLIC_KEYUPSTREAM_LANGFUSE_HOSTUPSTREAM_LANGFUSE_RELEASEUPSTREAM_LANGFUSE_DEBUG)r?   r@   rA   rB   rC   ))langfuser#   	Exception	traceback
format_excosgetenvr@   r?   langfuse_host
startswithlangfuse_releaselangfuse_debugr6   _get_langfuse_flush_intervallangfuse_flush_intervalr   r   langfuse_clientis_mock_moder   clientversion__version__langfuse_sdk_versionr   safe_init_langfuse_clientenvironr   rC   projectsr+   dataidupstream_langfuse_debugr   upstream_langfuse_secret_keyupstream_langfuse_public_keyupstream_langfuse_hostupstream_langfuse_releaseupstream_langfuse)selflangfuse_public_keylangfuse_secretrT   rD   rN   r#   ehttp_client
parameters
project_idre   s               r2   __init__zLangFuseLogger.__init___   s[   	) *MRYY7L-M-Q;P1Q* 
bii9/
 )))4!!,,Z8 "+T-?-?!?D "		*< = ii(89'5'R'R(
$ $%#>#@D  $D+-K#.#5#5D  %D ////&&,,((":: 00

 *2)9)9)E)E!4,,-1AA,5J()"&"@"@"L 0ABJJ,-  !GH"!]]11::>>@EEaHKK
4>

01 9934@ //; D889 $
 13		.1D- 13		.1D- +-))4L*MD'-/YY7R-SD*+-995N+OD(%-<<<<0066 /: ,
&D" &*D"i  	hijhkkmnw  oC  oC  oE  nF  FM  N 	l  "!
"s*   
M8 AN- 8	N*$N%%N*-N<;N<rp   r&   c                    ddl m} t        j                  t        k\  r#t        dt        j                   dt                |di |}t        xj                  dz  c_        t        j                  dt        j                          |S )aM  
        Safely init a langfuse client if the number of initialized clients is less than the max

        Note:
            - Langfuse initializes 1 thread everytime a client is initialized.
            - We've had an incident in the past where we reached 100% cpu utilization because Langfuse was initialized several times.
        r   r8   zMax langfuse clients reached: z is greater than    zCreated langfuse client number  )rN   r#   rF   initialized_langfuse_clientsr   rO   r   rC   )rk   rp   r#   rZ   s       r2   r`   z(LangFuseLogger.safe_init_langfuse_client   s     	&//3SS01U1U0VVg  iI  hJ  K  #0Z0,,1,-g.R.R-ST	
 r4   litellm_paramsmetadatac                 v   | |S | j                  d      |S |i }| j                  di       j                  di       xs i }|D ]r  }|j                  d      s|j                  ddd      }||v rt        j                  d| d       nt        j
                  d| d	       |j                  |      ||<   t |S )
at  
        Adds metadata from proxy request headers to Langfuse logging if keys start with "langfuse_"
        and overwrites litellm_params.metadata if already included.

        For example if you want to append your trace to an existing `trace_id` via header, send
        `headers: { ..., langfuse_existing_trace_id: your-existing-trace-id }` via proxy request.
        proxy_server_requestheaders	langfuse_ rt   zOverwriting Langfuse `z` from request headerzFound Langfuse `z` in request header)r+   rU   replacer   warningrC   )rw   rx   proxy_headersmetadata_param_keytrace_param_keys        r2   add_metadata_from_headerz'LangFuseLogger.add_metadata_from_header   s     !O45=OH 5r:>>y"MSQS 	 #0 	R!,,[9"4"<"<["a"P"h."**00AAVW #((*?*;;NO -:,=,=>P,Q)	R r4   kwargsresponse_obj
start_timeend_timeuser_idlevelstatus_messagec                 d   	 t        j                  d|        d}d}	|j                  di       }
|j                  dd      }|
j                  di       xs i }| j                  |
|      }t	        |j                  di             }d|j                  d      i}|j                  dd      }|j                  d	d      }|j                  d
d       |||d<   |||d	<   |j                         D ]5  \  }}t        |t        t        t        t        f      r'	 t        |      ||<   7 | j                  |||||      \  }}	t        j                  d|	 d|        d}d}| j                         r!| j                  |||
|	||||||||      \  }}n|| j!                  |||	||||||	       t        j                  d|        t        j"                  d       ||dS # t        $ r Y w xY w# t        $ r<}t        j$                  dj'                  t        |                   dddcY d}~S d}~ww xY w)z;
        Logs a success or error event on Langfuse
        z5Langfuse Logging - Enters logging function for model Nrw   litellm_call_idrx   optional_paramsmessages	functionstoolssecret_fields)r   r   promptr   r   zOUTPUT IN LANGFUSE: z; original: )r   rx   rw   outputr   r   r   r   inputr   r   r   )	r   rx   r   r   r   r   r   r   r   z0Langfuse Layer Logging - final response object: z(Langfuse Layer Logging - logging success)trace_idgeneration_idz.Langfuse Layer Error(): Exception occured - {})r   rC   r+   r   r   popitemsr.   strr/   boolr0   rO   "_get_langfuse_input_output_content_is_langfuse_v2_log_langfuse_v2_log_langfuse_v1info	exceptionformat)rk   r   r   r   r   r   r   r   r   r   rw   r   rx   r   r   r   r   paramvaluer   r   rn   s                         r2   log_event_on_langfusez$LangFuseLogger.log_event_on_langfuse   s   0V	=  GxP
 EF#ZZ(8"=N$jj):DAO"":r28b  44^XNH,VZZ8I2-NOO &**Z"89F'++K>I#''6E6$&/{# "'w !0 5 5 7 u!%#sD%)@A14U. !CC)- D ME6   &vhl<.I H M##%*.*?*?#%#1!)%!$3!-$3 +@ +'- )%%#%!)%!$3!- & 
   B<.Q  JK (=IIa % b  	=$$@GGAO !%t<<		=sC   DG* G"B8G* 	G'$G* &G''G* *	H/31H*$H/*H/r   c                    d}d}|dk(  r|t        |t              r|}|}||fS |7|j                  dd      dk(  st        |t        j                        r|}d}||fS |1t        |t        j
                        r|}| j                  |      }||fS |"t        |t        j                        r|}d}||fS |1t        |t        j                        r|}| j                  |      }||fS |2t        |t        j                        r|}|j                  dd      }||fS |2t        |t        j                        r|}|j                  dd      }||fS |,t        |t        j                        r|}|j                  }||fS |1t        |t        j                        r|}| j                  |      }||fS |j                  d      =|j                  d      dk(  r)|'t        |t               r|j                  d	      }|}||fS |j                  d      :|j                  d      d
k(  r&|$t        |t"              r|}|j                  dd      }||fS )a  
        Get the input and output content for Langfuse logging

        Args:
            kwargs: The keyword arguments passed to the function
            response_obj: The response object returned by the function
            prompt: The prompt used to generate the response
            level: The level of the log message
            status_message: The status message of the log message

        Returns:
            input: The input content for Langfuse logging
            output: The output content for Langfuse logging
        NERROR	call_type	embeddingzspeech-outputrc   text
_arealtimer   pass_through_endpointresponser}   )r.   r   r+   rF   r   r   _get_chat_content_for_langfuser   r!   )_get_text_completion_content_for_langfuser   r"   r   resultsr   '_get_responses_api_content_for_langfuselistdict)rk   r   r   r   r   r   r   r   s           r2   r   z1LangFuseLogger._get_langfuse_input_output_contenti  s   B 8<W*>3/E#Ft f}s %JJ{D)[8,(A(ABEFh f}g %*'//+
 E88FF^ f}] %*'<<+
 E$FT f}S %*'88+
 ECCLQFJ f}I %*'//+
 E!%%fd3F@ f}? %*'77+
 E!%%fd3F6 f}5 %*'00+
 E!))F, f}+ %*'66+
 EAA,OF" f} JJ{#/

;'<7(<.JJw'E!F f} JJ{#/

;'+BB(<.E!%%j"5Ff}r4   c                    K   yw)z
        Langfuse SDK uses a background thread to log events

        This approach does not impact latency and runs in the background
        Nru   )rk   r   r   r   r   r   s         r2   _async_log_eventzLangFuseLogger._async_log_event  s     s   c                 `    dd l }t        |j                  j                        t        d      k\  S )Nr   z2.0.0)rN   r   r]   r^   )rk   rN   s     r2   r   zLangFuseLogger._is_langfuse_v2  s&    x''3348HHHr4   c
                    ddl m}
m} t        j                  d       | j
                  j                   ||j                  dd      |||            }t        t        t           |j                  d            }t        |j                  dd	      ||      }|j                   |
|j                  dd      |||||||	j                  j                  |	j                  j                  d
|	             y )Nr   )CreateGenerationCreateTracezlPlease upgrade langfuse to v2.0.0 or higher: https://github.com/langfuse/langfuse-python/releases/tag/v2.0.1generation_namezlitellm-completion)namer   r   userIdcustom_llm_providermodelr}   )prompt_tokenscompletion_tokens)	r   	startTimeendTimer   modelParametersr   
completionusagerx   )langfuse.modelr   r   r   r   r#   tracer+   r   r	   r   r   
generationr   r   r   )rk   r   rx   r   r   r   r   r   r   r   r   r   r   r   
model_names                  r2   r   zLangFuseLogger._log_langfuse_v1  s     	Az	
 ##\\"35IJ	
 #8C=&**=R2ST+JJw#%8(

 	\\"35IJ$   /!%1%7%7%E%E)5););)M)M "	
r4   r   r   r   r   c                 4   t        j                  d       	 t        t        t           |j                  dd             }| j                         r| j                  |      ng }|d }d }n?|d   j                  dd       }t        t        t           |d   j                  dd             }i }|||d<   t        |t              rx|j                         D ]e  \  }}t        j                  Ft        t        j                  t              r(|t        j                  v r|j                  | d|        |dv ra|||<   g | j!                  |||	      }|j#                  d
d       }t        t        t$           |j#                  dd             }|j#                  dd       }|(|&t        t        t$           |j                  d            }||j                  d      xs |}|j#                  dd       }||}t        t        |j#                  dg             }|j#                  dd       }|j#                  dd      }|j#                  dd      }|j                  d      xs |j#                  dd       }|/t'        |      r$| j)                  |	|      }	| j)                  ||      }t+        |      }||d|j                  dd       }|d|i}|D ]3  }|j-                  dd      }||vs|j#                  |d       } | /| ||<   5 t        t/        d |j1                                     D ]  }|j#                  |d         d|v r	|s|	nd|d<   d |v r|s|nd|d <   n||||s|	nd|j#                  d!|j                  d"d             |d#}t        t/        d$ |j1                                     D ]'  }|j#                  |d       ||j-                  dd      <   ) |d%k(  r||d&<   n	|s|nd|d <   |d'u s#t        |t$              r'|j3                         d(k(  rd|v r	||d   d)<   nd)|i|d<   |j                  d*d       }!t        j                  d+|!        |!|d,<   | |j                  d-i       }"t5        |"      |d-<   t        j                  ft        t        j                  t              rHd.t        j                  v r6t6        j8                  j                  d/d       }#|#|j                  d0|#        |j                  d1d       }$|$r|$|d1<   |j                  d2d       }%|%r|%|d2<   |j                  d3d       }&|&r|&|d3<   | j                         r+d4|v r|d4   d|d4<   |d4   |d4<   ||j;                  d5|i       |j                  d6d       }'|'rj|'j                  d7d        |'j                  d8d        |'j                  d9d       }(i })|(r0|(j                         D ]  \  }}|j3                         d:vs||)|<     | j<                  j>                  dTi |}*tA        |*|       | jC                  |*|;       d }+d },d }-|
tE        |
d      r2|
j                  dd        t        jF                  jI                  ||
      }+tK        |
d<d       }.|.rtK        |.d=d       xs d>}/tK        |.d?d       xs d>}0tK        |.d@d       xs d>}1|.j                  dA      xs d>}2tM        |.      }3|/|0| jO                         r|!nd dB},|/|3z
  }4tQ        |4|0|1|2|3C      }-|j#                  dDd       }5|5Qt        t        t$           |j                  dEd             }6dt        t$        |j                  dd             }5|6dF|6 }5|
tK        |
dGd       }7nd }7|7|7|dG<   t        t        t$           |j                  dH            }8tS        |j                  dId      |8|      }9|5|j#                  dJ|+      |||9||s|	nd|s|nd|,|-tU        |      ||j#                  d"d       dK}:|j                  dLd       };|;|;|:dL<   | jW                         rtY        |:||| j<                  M      }:|t        |t$              r
|d%k(  r||:d&<   | j[                         r|j                  dNd       |:dN<    |*j\                  dTi |:}<tE        |<d      rA|<j^                  r5|<j^                  |k7  r&t        j`                  dO| dP|<j^                   dQ       ||+fS # tb        $ r- t        jd                  dRtg        jh                                 Y ySw xY w)UNz/Langfuse Layer Logging - logging to langfuse v2standard_logging_objectr   rx   user_api_key_end_user_idprompt_management_metadata:)r{   endpointcaching_groupsprevious_models)tagsr   rx   
session_id
trace_namer   litellm_trace_idexisting_trace_idupdate_trace_keysdebug_langfuse
mask_inputFmask_output_langfuse_masking_functionlangfuse_masking_function)rx   zlitellm-r   r   rd   trace_r}   c                 $    | j                  d      S Nr   rU   keys    r2   <lambda>z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>      s~~h'? r4   r   zredacted-by-litellmr   trace_versionr]   )rd   r   r   r   r]   r   c                 $    | j                  d      S r   r   r   s    r2   r   z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>  r   r4   r   r   Ttruemetadata_passed_to_litellmresponse_costztrace: litellm_response_costhidden_paramsproxy_base_urlPROXY_BASE_URLzproxy_base_url:api_basevertex_locationaws_region_name	cache_hitr   rz   methodurlr{   )authorizationcookiereferer)r   r   r   r   r   r   total_tokenscache_creation_input_tokens)r   r   
total_cost)r   r   totalr   r(   r   user_api_key_aliaszlitellm:system_fingerprintr   r   r   )r   rd   r   r   r   model_parametersr   r   r   usage_detailsrx   r   r]   parent_observation_id)generation_paramsclean_metadatar   rZ   completion_start_timez Langfuse trace_id mismatch: set z, but langfuse returned z.. Using our intended trace_id for consistency.zLangfuse Layer Error - )NNru   )5r   rC   r   r	   r   r+   _supports_tags_get_langfuse_tagsr    r.   r   r   rF   langfuse_default_tagsr   appendadd_default_langfuse_tagsr   r   callable_apply_masking_functionr   r~   filterkeyslowerr   rR   ra   updater#   r   )log_provider_specific_information_as_span"_log_guardrail_information_as_spanr,   utilsget_logging_idr-   r3   _supports_costsLangfuseUsageDetailsr   log_requester_metadata_supports_prompt _add_prompt_to_generation_params_supports_completion_start_timer   r   r   rO   errorrP   rQ   )=rk   r   rx   rw   r   r   r   r   r   r   r   r   r   r   r   end_user_idr   r  r   r   r   r   r   r   r   rC   r   r   masking_functiontrace_paramsr   r   updated_trace_valuecostr   r   r   r   r   rz   r{   clean_headersr   r   r   r   
_usage_objr   r   r   r   r(   input_tokensr   _user_api_key_aliasr   r   r   r   r   generation_clients=                                                                r2   r   zLangFuseLogger._log_langfuse_v2  s
    	NOV	HL/0

4d;I# &&( ''@W'X  '."  + 6jAEE. .2DE+J7;;4d.* .0N)5 / 0 (D)"*.."2 4JC  55A&w'D'DdK7#@#@@se1UG$45    !.3s+%4* 11&8 2 D (++L$?Jhsm^-?-?d-STJ%))*d;H $;$G/F/J/J:/VW!::&89L_ . 2 23F M !,, $T>+=+=>QSU+V W"&&'7>E'++L%@J(,,]EBK  .11,   G##$?F 
  +9I0J44U<LM55f>NO5~NN!&7&?  (

;(M'NO
 ,046G/H +< P&&8&@&@2&NO&l:.<.@.@./+ /:<OL9P  ?ATATAVW 2C #&&sD12 //%/5J !) 00&17L !*
 #&",*4U:O-11'););It)L   +	   ?ATATAVW C ?M>P>PT?LXr!:; G#5;L!12 '27L !* }E3!7EKKMV<S-MUL,-IJ0Lh/WL,::ot4D  74&!126:N23&2 7 ; ;OR P2O!3/
 --9w<<dC$(E(EE!#0@$!G!-KK/.1A BC%))*d;H-5z*$jj):DAO4C01$jj):DAO4C01""$&(k*2.3{+282EN;/$, ''7#1#5#56Ld#S #$((48$((5.229dC "&-mmo 7
U99;.TT16M#.7
 *=)<)<)L|)LE 6e^L 33(? 4 
 !ME M'L$/$((t4@$+MM$@$@"L%M %\7DA
 %,J$N$SRSM
,?FK! & $+:~t#L#QPQL #'DEJ 0 /O"/+
 *7->.2.B.B.Dd$E $13J#JL$8*0*4O0G%M -001BDIO& '+SM>#5#56JD#Q'# tCK)NOPQ   '2(01D0E&FO'%,\;OQU%V"%)"!-8J 45"&x}fjjAV6W"X/

7B')<hJ
 ($((-H($#$3&06K(3&9N!.2>B)--i>!  %-LL1H$$O!$0=R!"9:$$&$D&7#1/I$(MM	%! !j&=%7BR6<!"23335=CZZ+T>!"9: !1 0 0 E3D E (*5:K:T:T$--9"**:8*D\]n]w]w\x yG G ]** 	  #:9;O;O;Q:R!ST	s&   K
c! "c! 7K*c! "K>c! !3ddc                     | j                   r3t        | j                         dkD  r| d   d   d   j                         }|S y)z;
        Get the chat content for Langfuse logging
        r   choicesmessageN)r$  lenjson)r   r   s     r2   r   z-LangFuseLogger._get_chat_content_for_langfusev  sD     C(<(<$=$A!),Q/	:??AFMr4   c                 ~    | j                   r1t        | j                         dkD  r| j                   d   j                  S y)zF
        Get the text completion content for Langfuse logging
        r   N)r$  r&  r   r   s    r2   r   z8LangFuseLogger._get_text_completion_content_for_langfuse  s9     C(<(<$=$A''*///r4   c                 L    t        | d      r| j                  r| j                  S y)zD
        Get the responses API content for Langfuse logging
        r   N)r,   r   r)  s    r2   r   z6LangFuseLogger._get_responses_api_content_for_langfuse  s%     <*|/B/B&&&r4   r   c                 6    | g S | j                  dg       xs g S )Nrequest_tags)r+   r   s    r2   r  z!LangFuseLogger._get_langfuse_tags  s'     #*I&**>2>D"Dr4   c                    t         j                  t        t         j                  t              rdt         j                  v r&|j	                  dd      }|j                  d|        dt         j                  v ro|j	                  di       xs i }|j	                  dd      }|1t         j                  !t        j                  j                  di |}|}|j                  d|        |S )	z
        Helper function to add litellm default langfuse tags

        - Special LiteLLM tags:
            - cache_hit
            - cache_key

        Nr   Fz
cache_hit:	cache_keyr   z
cache_key:ru   )rF   r  r.   r   r+   r  cache!_get_preset_cache_key_from_kwargs)rk   r   r   rx   _cache_hit_value_hidden_params
_cache_key_preset_cache_keys           r2   r  z(LangFuseLogger.add_default_langfuse_tags  s     ((4))4:
 g;;;#)::k5#A j)9(:;<g;;;!)or!B!Hb+//TB
%'--*C(/(W(W ) )% "3Jj56r4   c                 D    t        | j                        t        d      k\  S )z/Check if current langfuse version supports tagsz2.6.3r   r_   rk   s    r2   r  zLangFuseLogger._supports_tags      t001WW5EEEr4   c                 D    t        | j                        t        d      k\  S )z1Check if current langfuse version supports prompt2.7.3r6  r7  s    r2   r  zLangFuseLogger._supports_prompt  r8  r4   c                 D    t        | j                        t        d      k\  S )z0Check if current langfuse version supports costsr:  r6  r7  s    r2   r  zLangFuseLogger._supports_costs  r8  r4   c                 D    t        | j                        t        d      k\  S )z@Check if current langfuse version supports completion start timer:  r6  r7  s    r2   r  z.LangFuseLogger._supports_completion_start_time  r8  r4   rc   r  c                    | y	 t        | t              r ||       S t        | t              r5i }| j                         D ]  \  }}t        j                  ||      ||<     |S t        | t              r$| D cg c]  }t        j                  ||       c}S  ||       S c c}w # t        $ r%}t        j                  d| d       | cY d}~S d}~ww xY w)a%  
        Apply a masking function to data, handling different data types.

        Args:
            data: The data to mask (can be str, dict, list, or None)
            masking_function: A callable that takes data and returns masked data

        Returns:
            The masked data
        Nz"Failed to apply masking function: z. Returning original data.)
r.   r   r   r   r6   r	  r   rO   r   r   )rc   r  masked_dictr   r   itemrn   s          r2   r	  z&LangFuseLogger._apply_masking_function  s     <	$$'--D$' "&**, JC'5'M'M/(K$ #"D$' !% #::4AQR  (--  	""4QC7QR K		sA   B# AB# "B# 6BB# B# B# #	C,CCCrD   c                 F    t        t        j                  d      xs |       S )a  
        Get the langfuse flush interval to initialize the Langfuse client

        Reads `LANGFUSE_FLUSH_INTERVAL` from the environment variable.
        If not set, uses the flush interval passed in as an argument.

        Args:
            flush_interval: The flush interval to use if LANGFUSE_FLUSH_INTERVAL is not set

        Returns:
            [int] The flush interval to use to initialize the Langfuse client
        LANGFUSE_FLUSH_INTERVAL)r/   rR   rS   )rD   s    r2   rX   z+LangFuseLogger._get_langfuse_flush_interval  s     29967I>JJr4   r   c                    |t        j                  d       y|j                  dd      }|st        j                  d       yt        |t              s t        j                  dt        |             y|D ]  }t        |t              s t        j                  dt        |             3|j                  d|j                  dd      |j                  d	d      |j                  d
d      |j                  dd      |j                  dd      d|j                  dd      |j                  dd            }t        j                  d|        |j                           y)z5
        Log guardrail information as a span
        NzQNot logging guardrail information as span because standard_logging_object is Noneguardrail_informationzPNot logging guardrail information as span because guardrail_information is emptyzYNot logging guardrail information as span because guardrail_information is not a list: %sz1Skipping guardrail entry with unexpected type: %s	guardrailguardrail_requestguardrail_responseguardrail_nameguardrail_modemasked_entity_count)rG  rH  guardrail_masked_entity_countr   r   )r   r   r   rx   r   r   z&Logged guardrail information as span: )	r   rC   r+   r.   r   typer   spanend)rk   r   r   rC  guardrail_entryrL  s         r2   r  z1LangFuseLogger._log_guardrail_information_as_span  sg    #*  c  7 ; ;#T!
 %  b /6  k*+ 4 	Oot4$$G) :: %))*=tD&**+?F&5&9&9:JD&Q&5&9&9:JD&Q5D5H5H-t6 +..|TB(,,Z>  D   #I$!PQHHJ1	r4   )NNNrt   )NNNDEFAULTN)0__name__
__module____qualname__rr   r   r#   r`   staticmethodr   r   r   r   r!   r   r"   r   r   r   r	   r   r   r   r
   r   r   r   r   r   tupler   r   r   r   r   r   r  r  r  r  r  r  r   r   r	  r/   rX   r$   r  ru   r4   r2   r6   r6   ]   sk    !^*@D X * " " "$ " "f *.'+!%(,'n=n= "!& 	"
n= X&n=  8$!n=" ##n=$ %n=& !'n=( 
)n=`cc "!& 	"
c c  !c" !#c$ 
x~xc4o(>??	@%cJI
/
bg#g g 	g
 sD$/0g X&g 8$g g g ~g g "#g 
gR 
#
 
 	,	 	 
*
 
 E!)*@!AE	cE E6FFFF &&%-seSj%9&	& &P KS KS K K6"6 "**@!A6r4   r6   r   r  r   rZ   c                    ddl m} ddlm}m}m}m} t        ||      }|j                  dd       }	|	|	 | S t        |	t              r|	j                  dd      dk(  r |di |	}
 ||
      | d<   | S |	j                  dd      d	k(  r |di |	} ||      | d<   | S d
|	v rPd|	v rKt        |	d   t              rt        |d|j                        }|	d   |	d   |	d
   |	j                  dd       d}d|v r6d|v r2|	j                  dg       xs g |d<   |	j                  dg       xs g |d<    |di |} ||      | d<   | S t        |	d   t              rt        |d|j                        }|	d   |	d   |	d
   |	j                  dd       d}d|v r6d|v r2|	j                  dg       xs g |d<   |	j                  dg       xs g |d<    |di |} ||      | d<   | S t!        j"                  d       | S t!        j"                  d       | S |"|d   dk(  r	 |j%                  |d         | d<   | S |	| d<   | S # t&        $ r#}t!        j(                  d|        Y d }~| S d }~ww xY w)Nr   r8   )ChatPromptClientPrompt_ChatPrompt_TextTextPromptClientr   rK  r}   chat)r   r   r]   model_fieldsr   config)r   r   r]   r\  labelsr   z5[Non-blocking] Langfuse Logger: Invalid prompt formatzS[Non-blocking] Langfuse Logger: Invalid prompt format. No prompt logged to Langfuseprompt_integrationrN   	prompt_idzI[Non-blocking] Langfuse Logger: Error getting prompt client for logging: ru   )rN   r#   r   rV  rW  rX  rY  r   r   r.   r   r+   r   r-   
__fields__r   r   r  
get_promptrO   rC   )r   r  r   rZ   r#   rV  rW  rX  rY  user_prompt_prompt_chat_prompt_textprompt_text_params_data_prompt_objprompt_chat_paramsrn   s                    r2   r  r  A  s$    "  8_5O $$Xt4K9AH G 
K	&??62&&0&55L*:,*Oh'@  __VR(F2&55L*:,*Oh'z y +%(k*A+h/5%,1G1G&" (/)(3*95)ooh=	 11f@R6R&1ooh&C&IrE(O$/OOFB$?$E2E&M)2E2.>k.R!(+X U K148%,1G1G&" (/)(3*95)ooh=	 11f@R6R&1ooh&C&IrE(O$/OOFB$?$E2E&M)2E2.>k.R!(+4 1 $$K0 )   e( ! 	#.&';<
J	*9*D*D*;7+h'  '2(#  	  [\][^_ 
 	s   H6 6	I"?II"c                 L   |j                  dd      }|y|j                  dd      }|{t        |t              rW|D ]Q  }t        |t              r,|j	                         D ]  \  }}| j                  ||        ?| j                  d|       S y| j                  d|       yy)z
    Logs provider-specific information as spans.

    Parameters:
        trace: The tracing object used to log spans.
        clean_metadata: A dictionary containing metadata to be logged.

    Returns:
        None
    r   Nvertex_ai_grounding_metadata)r   r   )r+   r.   r   r   r   rL  )r   r  r2  rj  elemr   r   s          r2   r  r    s     $''>N#1#5#5&$  $/2D94 dD)&*jjl 
U

!$"' #  JJ;"   JJ32   0r4   c                     i }| j                  d      xs i }| j                         D ]  \  }}||vs|||<    |j                  d|i       |S )Nrequester_metadata)r+   r   r  )r  returned_metadatarm  kvs        r2   r  r    sl    '++,@AGR$$& %1&&#$a % 24FGHr4   ):rR   rP   r   typingr   r   r   r   r   r	   r
   r   r   packaging.versionr   rF   litellm._loggingr   litellm.constantsr   'litellm.litellm_core_utils.core_helpersr   r   r   *litellm.litellm_core_utils.redact_messagesr   2litellm.integrations.langfuse.langfuse_mock_clientr   r   &litellm.llms.custom_httpx.http_handlerr   litellm.secret_managers.mainr   #litellm.types.integrations.langfuselitellm.types.llms.openair   r   litellm.types.utilsr   r   r   r   r   r    r!   r"   langfuse.clientr#   r$   *litellm.litellm_core_utils.litellm_loggingr%   r/   r3   r6   r   r  r  r  ru   r4   r2   <module>r     s    
  
 
 
 &  + > 
 P E 4 1 V	 	 	 =NH #3  #Fa aHVVV !))P QV 	V
 
Vr)X	4 	r4   