
    hM              
       T   d dl Z 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 d dl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 Z.de,fdZ/y)    N)datetime)TYPE_CHECKINGAnyDictListOptionalTupleUnioncast)Version)verbose_logger) MAX_LANGFUSE_INITIALIZED_CLIENTS)redact_user_api_key_info)_get_httpx_client)str_to_bool)*)HttpxBinaryResponseContent)EmbeddingResponseImageResponseModelResponseRerankResponseStandardLoggingPayload'StandardLoggingPromptManagementMetadataTextCompletionResponseTranscriptionResponse)LangfuseStatefulTraceClient)DynamicLoggingCachec                   (   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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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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>   r.   r8   r   ehttp_client
parameters
project_idrO   s               b/var/www/Befach/backend/env/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rZ   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  )r8   r   r0   initialized_langfuse_clientsr   r9   r   r-   )rU   rZ   r   rE   s       r\   rI   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_ r`   zOverwriting Langfuse `z` from request headerzFound Langfuse `z` in request header)rK   r?   replacer   warningr-   )rd   re   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 rc   kwargsresponse_obj
start_timeend_timeuser_idlevelstatus_messagec                 T   	 t        j                  d|        d}d}	|j                  di       }
|j                  dd      }|
j                  di       xs i }| j                  |
|      }t	        j
                  |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 Nrd   litellm_call_idre   optional_paramsmessages	functionstools)rq   rr   promptrv   rw   zOUTPUT IN LANGFUSE: z; original: )ru   re   rd   outputrs   rt   rq   rz   inputrr   rv   ry   )	ru   re   r   rs   rt   rq   rz   r   rr   z0Langfuse Layer Logging - final response object: z(Langfuse Layer Logging - logging success)trace_idgeneration_idz.Langfuse Layer Error(): Exception occured - {})r   r-   rK   rp   copydeepcopypopitems
isinstancestrintboolfloatr9   "_get_langfuse_input_output_content_is_langfuse_v2_log_langfuse_v2_log_langfuse_v1info	exceptionformat)rU   rq   rr   rs   rt   ru   rv   rw   r   r   rd   ry   re   rz   r~   r|   r}   paramvaluer   r   rX   s                         r\   log_event_on_langfusez$LangFuseLogger.log_event_on_langfuse   s   .T	=  GxP
 EF#ZZ(8"=N$jj):DAO"":r28b  44^XNH"mmFJJ7H",MNO &**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   DG" GB8G" 	GG" GG" "	H'+1H"H'"H'r~   c                 4   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 |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-outputrL   text
_arealtimer   pass_through_endpointresponserj   )r   r   rK   r0   r   r   _get_chat_content_for_langfuser   r   )_get_text_completion_content_for_langfuser   r   r   resultslistdict)rU   rq   rr   r~   rv   rw   r   r   s           r\   r   z1LangFuseLogger._get_langfuse_input_output_content'  s   @ 8<W*>3/E#Fj f}i %JJ{D)[8,(A(ABEF^ f}] %*'//+
 E88FFT f}S %*'<<+
 E$FJ f}I %*'88+
 ECCLQF@ f}? %*'//+
 E!%%fd3F6 f}5 %*'77+
 E!%%fd3F, f}+ %*'00+
 E!))F" f} JJ{#/

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

;'+BB(<.E!%%j"5Ff}rc   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
        Nra   )rU   rq   rr   rs   rt   ru   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)r8   r   rF   rG   )rU   r8   s     r\   r   zLangFuseLogger._is_langfuse_v2  s&    x''3348HHHrc   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usagere   )langfuse.modelr   r   r   rl   r   tracerK   
generationr   r   r   )rU   ru   re   r   rs   rt   rq   rz   r   rr   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 "	
rc   r   rz   r   ry   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                  dGi |}(t;        |(|       | j=                  |(|8       d })d }*|
yt?        |
d      r2|
j                  dd        t        j@                  jC                  ||
      })tE        |
d9d       }+|+r,|+jF                  |+jH                  | jK                         r| nd d:}*|j#                  d;d       },|,Qt        t        t$           |j                  d<d             }-dt        t$        |j                  dd             },|-d=|- },|
tE        |
d>d       }.nd }.|.|.|d><   |,|j#                  d?|)      |||d@   ||s|	nd|s|nd|*tM        |      ||j#                  dd       dA}/|j                  dBd       }0|0|0|/dB<   | jO                         rtQ        |/||| j6                  C      }/|t        |t$              r
|d"k(  r||/d#<   | jS                         r|j                  dDd       |/dD<    |(jT                  dGi |/}1|1jV                  |)fS # tX        $ r- t        jZ                  dEt]        j^                                 Y yFw xY w)HNz/Langfuse Layer Logging - logging to langfuse v2standard_logging_objectr   re   user_api_key_end_user_idprompt_management_metadata:)rh   endpointcaching_groupsprevious_models)tagsrq   re   
session_id
trace_namer   existing_trace_idupdate_trace_keysdebug_langfuse
mask_inputFmask_output)re   zlitellm-r   r   rM   trace_rj   c                 $    | j                  d      S Nr   r?   keys    r\   <lambda>z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>/      s~~h'?rc   r   zredacted-by-litellmr   trace_versionrF   )rM   r   r   r   rF   ru   c                 $    | j                  d      S r   r   r   s    r\   r   z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>H  r   rc   r   rw   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   rg   methodurlrh   )authorizationcookiereferer)r   r   r   )r   r   
total_costr   user_api_key_aliaszlitellm:system_fingerprintr   r   )r   rM   rs   rt   r   model_parametersr   r   r   re   rv   rF   parent_observation_id)generation_paramsclean_metadatar   rE   completion_start_timezLangfuse Layer Error - )NNra   )0r   r-   r   r   r   rK   _supports_tags_get_langfuse_tagsr   r   r   r   r0   langfuse_default_tagsr   appendadd_default_langfuse_tagsr   r   r   rk   filterkeyslowerr<   rN   updater   r   )log_provider_specific_information_as_span"_log_guardrail_information_as_spanhasattrutilsget_logging_idgetattrr   r   _supports_costslog_requester_metadata_supports_prompt _add_prompt_to_generation_params_supports_completion_start_timer   r   r9   errorr:   r;   )2rU   ru   re   rd   r   rs   rt   rq   rz   r   rr   rv   ry   r   r   end_user_idr   r   r   r   r   r   r   r   r   r-   r   r   trace_paramsrn   ro   updated_trace_valuecostr   r   r   r   rg   rh   clean_headersr   r   r   
_usage_objr   _user_api_key_aliasr   r   r   generation_clients2                                                     r\   r   zLangFuseLogger._log_langfuse_v2  s    	NOW	~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'L$/$((t4@$+MM$@$@"L%M %\7DA
)3)A)A-7-I-I.2.B.B.Dd$E
 -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] 5H$] 3^^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)rr   r   s     r\   r   z-LangFuseLogger._get_chat_content_for_langfuse  sD     C(<(<$=$A!),Q/	:??AFMrc   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   )rr   s    r\   r   z8LangFuseLogger._get_text_completion_content_for_langfuse  s9     C(<(<$=$A''*///rc   r   c                 6    | g S | j                  dg       xs g S )Nrequest_tags)rK   r   s    r\   r   z!LangFuseLogger._get_langfuse_tags  s'     #*I&**>2>D"Drc   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:ra   )r0   r   r   r   rK   r   cache!_get_preset_cache_key_from_kwargs)rU   r   rq   re   _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rc   c                 D    t        | j                        t        d      k\  S )z/Check if current langfuse version supports tagsz2.6.3r   rH   rU   s    r\   r   zLangFuseLogger._supports_tags&      t001WW5EEErc   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_prompt*  r  rc   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  rc   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_time2  r  rc   r.   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=   )r.   s    r\   rB   z+LangFuseLogger._get_langfuse_flush_interval6  s     29967I>JJrc   r   c                    |t        j                  d       y|j                  dd      }|t        j                  d       y|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_informationzONot logging guardrail information as span because guardrail_information is None	guardrailguardrail_requestguardrail_responseguardrail_nameguardrail_modemasked_entity_count)r&  r'  guardrail_masked_entity_countrs   rt   )r   r   r   re   rs   rt   z&Logged guardrail information as span: )r   r-   rK   spanend)rU   r   r   r"  r*  s        r\   r   z1LangFuseLogger._log_guardrail_information_as_spanF  s	    #*  c  7 ; ;#T!
 !(  a zz'++,?F(,,-A4H"7";";<Ld"S"7";";<Ld"S1F1J1J)42 -00tD*..z4@  
 	EdVLM
rc   )NNNr`   )NNNDEFAULTN)+__name__
__module____qualname__r]   r   r   rI   staticmethodrp   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   rB   r   r   ra   rc   r\   r    r    (   s    !T*lD X * " " "$ " "d *.'+!%(,%k=k= "!&(

k= X&k= 8$k=  #!k=" #k=$ !%k=& 
'k=Z]] "!&(

] ] ]  !!]" 
x~xc4o(>??	@#]~I
*
Xh#h h 	h
 sD$/0h X&h 8$h h h ~h h "#h 
hT	 
#
 
 	,	 	 E!)*@!AE	cE E6FFFF KS KS K K'"' "**@!A'rc   r    r   r   r   rE   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~   typerj   chat)r~   r   rF   model_fieldsr   config)r   r~   rF   r:  labelsr   z5[Non-blocking] Langfuse Logger: Invalid prompt formatzS[Non-blocking] Langfuse Logger: Invalid prompt format. No prompt logged to Langfuseprompt_integrationr8   	prompt_idzI[Non-blocking] Langfuse Logger: Error getting prompt client for logging: ra   )r8   r   r   r3  r4  r5  r6  r   r   r   r   rK   r   r   
__fields__r   r   r   
get_promptr9   r-   )r   r   r   rE   r   r3  r4  r5  r6  user_prompt_prompt_chat_prompt_textprompt_text_params_data_prompt_objprompt_chat_paramsrX   s                    r\   r   r   p  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   )rK   r   r   r   r   r*  )r   r   r  rH  elemr   r   s          r\   r   r     s     $''>N#1#5#5&$  $/2D94dD)&*jjl
U

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