
    j5              
       \   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 d dlmZ d dlZd dlmZ d dlmZ d dlmZ d dl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)m*Z* d dl+m,Z, neZ,eZ*eZ) G d d      Z-de.de.dee%   dede.f
dZ/d Z0de.fdZ1y)    N)datetime)TYPE_CHECKINGAnyDictListOptionalTupleUnioncast)Version)verbose_logger) MAX_LANGFUSE_INITIALIZED_CLIENTS)safe_deep_copy)redact_user_api_key_info)_get_httpx_client)str_to_bool)*)HttpxBinaryResponseContentResponsesAPIResponse)EmbeddingResponseImageResponseModelResponseRerankResponseStandardLoggingPayload'StandardLoggingPromptManagementMetadataTextCompletionResponseTranscriptionResponse)LangfuseStatefulTraceClient)DynamicLoggingCachec                   B   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)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!               }|j"                  | _        | j                  | j                  | j                  | j                  | j                  | j                  | j$                  d}	|j&                  j(                  | _        t-        | j*                        t-        d      k\  rd|	d<   | j/                  |	      | _        	 | j                  j"                  j0                  j3                         j4                  d   j6                  }
|
t
        j8                  d<   t        j                  d      | j:                  t=        | j:                        nd }t        j                  d      | _        t        j                  d      | _         t        j                  d      | _!        t        j                  d      | _"        t        j                  d      | _         || j@                  | j>                  | jB                  | jD                  ||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_DEBUG)
public_key
secret_keyhostreleasedebugflush_intervalhttpx_clientz2.6.0litellmsdk_integrationLANGFUSE_PROJECT_IDUPSTREAM_LANGFUSE_SECRET_KEYUPSTREAM_LANGFUSE_PUBLIC_KEYUPSTREAM_LANGFUSE_HOSTUPSTREAM_LANGFUSE_RELEASEUPSTREAM_LANGFUSE_DEBUGF)r+   r,   r-   r.   r/   )$langfuser   	Exception	traceback
format_excosgetenvr,   r+   langfuse_host
startswithlangfuse_releaselangfuse_debugr"   _get_langfuse_flush_intervallangfuse_flush_intervalr   clientlangfuse_clientversion__version__langfuse_sdk_versionr   safe_init_langfuse_clientprojectsgetdataidenvironupstream_langfuse_debugr   upstream_langfuse_secret_keyupstream_langfuse_public_keyupstream_langfuse_hostupstream_langfuse_releaseupstream_langfuse)selflangfuse_public_keylangfuse_secretr@   r0   r:   r   ehttp_client
parameters
project_idrQ   s               /Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/integrations/langfuse/langfuse.py__init__zLangFuseLogger.__init__*   s   	) *MRYY7L-M-Q;P1Q* 
bii9/
 )))4!!,,Z8 "+T-?-?!?D "		*< = ii(89'5'R'R(
$ ()*11 ////&&,,((":: 00

 *2)9)9)E)E!4,,-1AA,5J()"&"@"@"L	--66::<AA!DGGJ0:BJJ,- 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"U  	hijhkkmnw  oC  oC  oE  nF  FM  N 	X  	J	s*   
L AM 	M$$MMMMr\   returnc                    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   r$   zMax langfuse clients reached: z is greater than    zCreated langfuse client number  )r:   r   r2   initialized_langfuse_clientsr   r;   r   r/   )rW   r\   r   rG   s       r^   rK   z(LangFuseLogger.safe_init_langfuse_client   s     	&//3SS01U1U0VVg  iI  hJ  K  #0Z0,,1,-g.R.R-ST	
     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_ rb   zOverwriting Langfuse `z` from request headerzFound Langfuse `z` in request header)rM   rA   replacer   warningr/   )rf   rg   proxy_headersmetadata_param_keytrace_param_keys        r^   add_metadata_from_headerz'LangFuseLogger.add_metadata_from_header   s     !O45=OH 5r:>>y"MSQS 	 #0!,,[9"4"<"<["a"P"h."**00AAVW #((*?*;;NO -:,=,=>P,Q) #0 re   kwargsresponse_obj
start_timeend_timeuser_idlevelstatus_messagec                 @   	 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      }|||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 Nrf   litellm_call_idrg   optional_paramsmessages	functionstools)rs   rt   promptrx   ry   zOUTPUT IN LANGFUSE: z; original: )rw   rg   rf   outputru   rv   rs   r|   inputrt   rx   r{   )	rw   rg   r   ru   rv   rs   r|   r   rt   z0Langfuse Layer Logging - final response object: z(Langfuse Layer Logging - logging success)trace_idgeneration_idz.Langfuse Layer Error(): Exception occured - {})r   r/   rM   rr   r   popitems
isinstancestrintboolfloatr;   "_get_langfuse_input_output_content_is_langfuse_v2_log_langfuse_v2_log_langfuse_v1info	exceptionformat)rW   rs   rt   ru   rv   rw   rx   ry   r   r   rf   r{   rg   r|   r   r~   r   paramvaluer   r   rZ   s                         r^   log_event_on_langfusez$LangFuseLogger.log_event_on_langfuse   s   0T	=  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$&/{# "'w !0 5 5 7u!%#sD%)@A14U. !8 !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   C>G G	B8G 		GG GG 	H!1H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-outputrN   text
_arealtimer   pass_through_endpointresponserl   )r   r   rM   r2   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)rW   rs   rt   r   rx   ry   r   r   s           r^   r   z1LangFuseLogger._get_langfuse_input_output_content(  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}re   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
        Nrc   )rW   rs   rt   ru   rv   rw   s         r^   _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)r:   r   rH   rI   )rW   r:   s     r^   r   zLangFuseLogger._is_langfuse_v2  s&    x''3348HHHre   c
                 d   ddl m}
m} t        j                  d       | j
                  j                   ||j                  dd      |||            }|j                   |
|j                  d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model)prompt_tokenscompletion_tokens)	r   	startTimeendTimer   modelParametersr   
completionusagerg   )langfuse.modelr   r   r   rn   r   tracerM   
generationr   r   r   )rW   rw   rg   r   ru   rv   rs   r|   r   rt   r   r   r   s                r^   r   zLangFuseLogger._log_langfuse_v1  s     	Az	
 ##\\"35IJ	
 	\\"35IJ$ Wo /!%1%7%7%E%E)5););)M)M "	
re   r   r|   r   r{   c                    t        j                  d       	 |xs i }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|      }|j#                  dd       }t        t        |j#                  dg             }|j#                  dd       }|j#                  dd      }|j#                  dd      }t'        |      }||d|j                  dd       }|d|i}|D ]3  }|j)                  dd      }||vs|j#                  |d       }|/|||<   5 t        t+        d |j-                                     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! |j-                                     D ]'  }|j#                  |d       ||j)                  dd      <   ) |d"k(  r||d#<   n	|s|nd|d<   |d$u s#t        |t$              r'|j/                         d%k(  rd|v r	||d   d&<   nd&|i|d<   |j                  d'd       } t        j                  d(|         | |d)<   ||d*   |d*<   t        j                  ft        t        j                  t              rHd+t        j                  v r6t0        j2                  j                  d,d       }!|!|j                  d-|!        |j                  d.d       }"|"r|"|d.<   |j                  d/d       }#|#r|#|d/<   |j                  d0d       }$|$r|$|d0<   | j                         r+d1|v r|d1   d|d1<   |d1   |d1<   ||j5                  d2|i       |j                  d3d       }%|%rj|%j                  d4d        |%j                  d5d        |%j                  d6d       }&i }'|&r0|&j                         D ]  \  }}|j/                         d7vs||'|<     | j6                  j8                  dNi |}(t;        |(|       | j=                  |(|8       d })d }*d }+|
t?        |
d      r2|
j                  dd        t        j@                  jC                  ||
      })tE        |
d9d       },|,rtE        |,d:d       xs d;}-tE        |,d<d       xs d;}.tE        |,d=d       xs d;}/|,j                  d>      xs d;}0|,j                  d?      xs d;}1|-|.| jG                         r| nd d@}*|-|1z
  }2tI        |2|.|/|0|1A      }+|j#                  dBd       }3|3Qt        t        t$           |j                  dCd             }4dt        t$        |j                  dd             }3|4dD|4 }3|
tE        |
dEd       }5nd }5|5|5|dE<   |3|j#                  dF|)      |||dG   ||s|	nd|s|nd|*|+tK        |      ||j#                  dd       dH}6|j                  dId       }7|7|7|6dI<   | jM                         rtO        |6||| j6                  J      }6|t        |t$              r
|d"k(  r||6d#<   | jQ                         r|j                  dKd       |6dK<    |(jR                  dNi |6}8|8jT                  |)fS # tV        $ r- t        jX                  dLt[        j\                                 Y yMw xY w)ONz/Langfuse Layer Logging - logging to langfuse v2standard_logging_objectr   rg   user_api_key_end_user_idprompt_management_metadata:)rj   endpointcaching_groupsprevious_models)tagsrs   rg   
session_id
trace_namer   existing_trace_idupdate_trace_keysdebug_langfuse
mask_inputFmask_output)rg   zlitellm-r   r   rO   trace_rl   c                 $    | j                  d      S Nr   rA   keys    r^   <lambda>z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>6      s~~h'?re   r   zredacted-by-litellmr   trace_versionrH   )rO   r   r   r   rH   rw   c                 $    | j                  d      S r   r   r   s    r^   r   z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>O  r   re   r   ry   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   ri   methodurlrj   )authorizationcookiereferer)r   r   r   r   r   r   total_tokenscache_creation_input_tokenscache_read_input_tokens)r   r   
total_cost)r   r   totalr   r   r   user_api_key_aliaszlitellm:system_fingerprintr   r   )r   rO   ru   rv   r   model_parametersr   r   r   usage_detailsrg   rx   rH   parent_observation_id)generation_paramsclean_metadatar   rG   completion_start_timezLangfuse Layer Error - )NNrc   )/r   r/   r   r   r   rM   _supports_tags_get_langfuse_tagsr   r   r   r   r2   langfuse_default_tagsr   appendadd_default_langfuse_tagsr   r   r   rm   filterkeyslowerr>   rP   updater   r   )log_provider_specific_information_as_span"_log_guardrail_information_as_spanhasattrutilsget_logging_idgetattr_supports_costsLangfuseUsageDetailslog_requester_metadata_supports_prompt _add_prompt_to_generation_params_supports_completion_start_timer   r   r;   errorr<   r=   )9rW   rw   rg   rf   r   ru   rv   rs   r|   r   rt   rx   r{   r   r   end_user_idr   r   r   r   r   r   r   r   r   r/   r   r   trace_paramsrp   rq   updated_trace_valuecostr   r   r   r   ri   rj   clean_headersr   r   r   r   
_usage_objr   r   r   r   r   input_tokensr   _user_api_key_aliasr   r   r   generation_clients9                                                            r^   r   zLangFuseLogger._log_langfuse_v2  sX	    	NOr	~2HHL/0

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

;(M'NO
 ,046G/H +<&&8&@&@2&NO&l:.<.@.@./+ /:<OL9 +<  ?ATATAVWC #&&sD1 //%/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&22I#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
U99;.TT16M#. '6
 *=)<)<)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 #'@AFQ ,
 *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 ($((-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$--}<< 	  #:9;O;O;Q:R!ST	s&   H5^; ^; "K^; 5J^; ;3_10_1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)rt   r   s     r^   r   z-LangFuseLogger._get_chat_content_for_langfuse  sD     C(<(<$=$A!),Q/	:??AFMre   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   rt   s    r^   r   z8LangFuseLogger._get_text_completion_content_for_langfuse  s9     C(<(<$=$A''*///re   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    r^   r   z6LangFuseLogger._get_responses_api_content_for_langfuse%  s%     <*|/B/B&&&re   r   c                 6    | g S | j                  dg       xs g S )Nrequest_tags)rM   r   s    r^   r   z!LangFuseLogger._get_langfuse_tags2  s'     #*I&**>2>D"Dre   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:rc   )r2   r   r   r   rM   r   cache!_get_preset_cache_key_from_kwargs)rW   r   rs   rg   _cache_hit_value_hidden_params
_cache_key_preset_cache_keys           r^   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re   c                 D    t        | j                        t        d      k\  S )z/Check if current langfuse version supports tagsz2.6.3r   rJ   rW   s    r^   r   zLangFuseLogger._supports_tagsU      t001WW5EEEre   c                 D    t        | j                        t        d      k\  S )z1Check if current langfuse version supports prompt2.7.3r"  r#  s    r^   r  zLangFuseLogger._supports_promptY  r$  re   c                 D    t        | j                        t        d      k\  S )z0Check if current langfuse version supports costsr&  r"  r#  s    r^   r   zLangFuseLogger._supports_costs]  r$  re   c                 D    t        | j                        t        d      k\  S )z@Check if current langfuse version supports completion start timer&  r"  r#  s    r^   r  z.LangFuseLogger._supports_completion_start_timea  r$  re   r0   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   r>   r?   )r0   s    r^   rD   z+LangFuseLogger._get_langfuse_flush_intervale  s     29967I>JJre   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)r0  r1  guardrail_masked_entity_countru   rv   )r   r   r   rg   ru   rv   z&Logged guardrail information as span: )	r   r/   rM   r   r   typer   spanend)rW   r   r   r,  guardrail_entryr5  s         r^   r   z1LangFuseLogger._log_guardrail_information_as_spanu  sb    #*  c  7 ; ;#T!
 %  b /6  k*+ 4O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  5re   )NNNrb   )NNNDEFAULTN)-__name__
__module____qualname__r_   r   r   rK   staticmethodrr   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   rD   r   r   rc   re   r^   r"   r"   (   s3    !T*lD X * " " "$ " "f *.'+!%(,'l=l= "!& 	"
l= X&l=  8$!l=" ##l=$ %l=& !'l=( 
)l=\cc "!& 	"
c c  !c" !#c$ 
x~xc4o(>??	@%cJI
*
XC#C C 	C
 sD$/0C X&C 8$C C C ~C C "#C 
CJ
 
#
 
 	,	 	 
*
 
 E!)*@!AE	cE E6FFFF KS KS K K6"6 "**@!A6re   r"   r   r   r   rG   r`   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   r$   )ChatPromptClientPrompt_ChatPrompt_TextTextPromptClientr   r4  rl   chat)r   r   rH   model_fieldsr   config)r   r   rH   rE  labelsr   z5[Non-blocking] Langfuse Logger: Invalid prompt formatzS[Non-blocking] Langfuse Logger: Invalid prompt format. No prompt logged to Langfuseprompt_integrationr:   	prompt_idzI[Non-blocking] Langfuse Logger: Error getting prompt client for logging: rc   )r:   r   r   r?  r@  rA  rB  r   r   r   r   rM   r   r   
__fields__r   r   r  
get_promptr;   r/   )r   r   r   rG   r   r?  r@  rA  rB  user_prompt_prompt_chat_prompt_textprompt_text_params_data_prompt_objprompt_chat_paramsrZ   s                    r^   r  r    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   )rM   r   r   r   r   r5  )r   r   r  rS  elemr   r   s          r^   r   r     s     $''>N#1#5#5&$  $/2D94dD)&*jjl
U

!$"' #  '3 JJ;"   5 JJ32   0re   c                     i }| j                  d      xs i }| j                         D ]  \  }}||vs|||<    |j                  d|i       |S )Nrequester_metadata)rM   r   r   )r   returned_metadatarV  kvs        r^   r  r  3  sg    '++,@AGR$$&1&&#$a  ' 24FGHre   )2r>   r<   r   typingr   r   r   r   r   r	   r
   r   packaging.versionr   r2   litellm._loggingr   litellm.constantsr   'litellm.litellm_core_utils.core_helpersr   *litellm.litellm_core_utils.redact_messagesr   &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"   r   r  r   r  rc   re   r^   <module>rg     s    
   O O O %  + > B O D 4 1 V	 	 	 =NHC CLVVV !))P QV 	V
 
Vr)X	4 	re   