
    g                        d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
mZmZ d dl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 d dlmZ erd dlmZ ne	Z G d d      Zde de de fdZ!d Z"de fdZ#y)    N)MutableMappingMutableSequence
MutableSet)TYPE_CHECKINGAnyDictOptionalcast)Version)	BaseModel)verbose_logger)redact_user_api_key_info)_get_httpx_client)str_to_bool)*)StandardLoggingPayload)DynamicLoggingCachec                       e Zd Z	 	 	 	 ddZedededefd       Z	 	 ddefdZd Zd	 Z	d
 Z
dedefdZdee   defdZdefdZ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                  d      xs || _        t               }|j                  | _        | j                  | j                  | j                  | j                  | j                  | j                  | j                   d}	t#        |j$                  j&                        t#        d      k\  rd|	d<    |di |	| _        	 | j                  j                  j(                  j+                         j,                  d   j.                  }
|
t
        j0                  d<   t        j                  d      | j2                  t5        | j2                        nd }t        j                  d      | _        t        j                  d      | _        t        j                  d      | _        t        j                  d      | _        t        j                  d      | _         || j8                  | j6                  | j:                  | j<                  ||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   )LangfusezS[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LANGFUSE_FLUSH_INTERVAL)
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_debuglangfuse_flush_intervalr   clientlangfuse_clientr   version__version__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_secretr5   r$   r/   r   ehttp_client
parameters
project_idrC   s               [/var/www/openai/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II/0BN 	$ ()*11 ////&&,,((":: 00

 8##//0GG4DD,5J() .:.	--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L: 	L7$L22L7:M	M	litellm_paramsmetadatareturnc                 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_    zOverwriting Langfuse `z` from request headerzFound Langfuse `z` in request header)r?   r6   replacer   warningr#   )rR   rS   proxy_headersmetadata_param_keytrace_param_keys        rP   add_metadata_from_headerz'LangFuseLogger.add_metadata_from_headerr   s     !O45=OH 5r:>>y"MSQS 	 #0!,,[9"4"<"<["a"P"h."**00AAVW #((*?*;;NO -:,=,=>P,Q) #0     c	                    	 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 |d	k(  r|t        |t              r|}	|}
n|5|j                  d
d       dk(  st        |t        j                        r|}	d }
n|7t        |t        j                         r|}	|d   d   d   j#                         }
nd| t        |t        j$                        r|}	d}
nB|7t        |t        j&                        r|}	|j(                  d   j*                  }
n	|"t        |t        j,                        r|}	|d   }
n|"t        |t        j.                        r|}	|d   }
n|)t        |t        j0                        r|}	|j2                  }
n|j                  d
      :|j                  d
      dk(  r&|$t        |t4              r|j                  d      }	|}
nK|j                  d
      :|j                  d
      dk(  r&|$t        |t6              r|}	|j                  dd      }
t        j                  d|
 d|        d }d }| j9                         r!| j;                  ||||
|||||	||||      \  }}n|| j=                  |||
|||||	|	       t        j                  d|        t        j>                  d       ||dS # t        $ r Y w xY w# t        $ r<}t        j@                  djC                  t        |                   d d dcY d }~S d }~ww xY w)Nz5Langfuse Logging - Enters logging function for model rR   litellm_call_idrS   optional_paramsmessages	functionstoolsERROR	call_type	embeddingchoicesr   messagezspeech-outputr@   text
_arealtimeinputpass_through_endpointresponserY   zOUTPUT IN LANGFUSE: z; original: z0Langfuse Layer Logging - final response object: z(Langfuse Layer Logging - logging success)trace_idgeneration_idz.Langfuse Layer Error(): Exception occured - {})"r   r#   r?   r`   copydeepcopypopitems
isinstancestrintboolfloatr0   r&   EmbeddingResponseModelResponsejsonHttpxBinaryResponseContentTextCompletionResponserk   rm   ImageResponseTranscriptionResponseRerankResponseresultslistdict_is_langfuse_v2_log_langfuse_v2_log_langfuse_v1info	exceptionformat)rI   kwargsresponse_obj
start_timeend_timeuser_idprint_verboselevelstatus_messagero   outputrR   rc   rS   rd   promptrf   rg   paramvaluerr   rs   rL   s                          rP   _old_log_eventzLangFuseLogger._old_log_event   sK   J	=  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  ".~s3')

;-<lG,E,EF)jg33/ %i03I>CCE)jg@@/ ()jg<</ %--a055)jg33/ %f-)jg;;/ %f-)jg44/ %--

;'3JJ{+|; ,|T2

7+%

;'3JJ{+/FF ,|T2%))*b9  &vhl<.I H M##%*.*?*?"# !#+'- )%%# 
   B<.Q  JK (=IIM % N  	=$$@GGAO !%t<<		=sC   DN: N*JN: *	N73N: 6N77N: :	O?1O:4O?:O?c                    K   yw)zH
        TODO: support async calls when langfuse is truly async
        Nr.   )rI   r   r   r   r   r   r   s          rP   _async_log_eventzLangFuseLogger._async_log_event0  s     s   c                 `    dd l }t        |j                  j                        t        d      k\  S )Nr   z2.0.0)r/   r   r<   r=   )rI   r/   s     rP   r   zLangFuseLogger._is_langfuse_v27  s&    x''3348HHHra   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)namero   r   userIdmodel)prompt_tokenscompletion_tokens)	r   	startTimeendTimer   modelParametersr   
completionusagerS   )langfuse.modelr   r   r   r\   r   tracer?   
generationr   r   r   )rI   r   rS   r   r   r   r   rd   ro   r   r   r   r   s                rP   r   zLangFuseLogger._log_langfuse_v1<  s     	Az	
 ##\\"35IJ	
 	\\"35IJ$ Wo /!%1%7%7%E%E)5););)M)M "	
ra   r   c                 d    t         t        t        t        t        t
        t        f}t        ||      S N)rz   r|   ry   r{   r   r   tuplerx   )rI   r   
base_typess      rP   is_base_typezLangFuseLogger.is_base_typeh  s#    5#tT4?
%,,ra   c                     	 |y |j                         D ci c]  \  }}t        |      r|| }}}t        j                  |      S c c}}w # t        $ r%}t        j                  d| d|        Y d }~nd }~ww xY wi }t        |t              st        j                  d       |S |j                         D ]N  \  }}	 t        |t              r# j                  t        t        |            ||<   nt        |t              rt         fd|D              ||<   nt        |t              rt         fd|D              ||<   n`t        |t               r|j#                         ||<   n< j%                  |      r|||<   n%t        j                  dt'        |       d|        # t(        t        j*                  f$ rI t        j                  d| d	t'        |       d
t'        |       dt-        j.                                 Y Mw xY w |S )NLangfuse Layer Error - z, metadata: zOLangfuse Layer Logging - metadata is not a MutableMapping, returning empty dictc              3      K   | ]H  }t        |t              rj                  t        t        |            nt        j                  |       J y wr   rx   r   _prepare_metadatar
   r   rt   ru   .0vrI   s     rP   	<genexpr>z3LangFuseLogger._prepare_metadata.<locals>.<genexpr>  sK      - "'A  *!^< !224a=A!%q!12 "'   AAc              3      K   | ]H  }t        |t              rj                  t        t        |            nt        j                  |       J y wr   r   r   s     rP   r   z3LangFuseLogger._prepare_metadata.<locals>.<genexpr>  sK      , "'A  *!^< !224a=A!%q!12 "'r   z2Langfuse Layer Error - Unsupported metadata type: z
 for key: z3Langfuse Layer Error - Couldn't copy metadata key: z, type of key: z, type of value: z - )rw   callablert   ru   r0   r   r#   rx   r   r   r
   r   r   r   r   setr   
model_dumpr   type	TypeErrorErrorr1   r2   )	rI   rS   kr   sanitized_metadatarL   new_metadatakeyr   s	   `        rP   r   z LangFuseLogger._prepare_metadatam  s:   		V 4<>>3C!W3C41a8TU;!Q$3C!W==!344 "X  	V  #:1#\(!TUU	V (* (N3  a  "..*JC$e^4(,(>(>tD%?P(QL%7(, - "'- )L%  z2(+ , "', )L%  y1(-(8(8(:L%&&u-(-L%"((LTRW[MYcdgchi tzz* $$I#o^bcf^g]hhyz~  @E  {F  zG  GJ  KT  K_  K_  Ka  Jb  cE +N sE   A A A
A
A 
A 	A>A99A>C"F&&AHHc                 (   dd l }t        j                  d       	 | j                  |      }t	        |j
                  j                        }|t	        d      k\  }|t	        d      k\  }|t	        d      k\  }|t	        d      k\  }|r|j                  dg       ng }t        t        t           |j                  dd             }|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 |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,<   ||d-   |d-<   t        j                   ft        t        j                   t"              rHd.t        j                   v r6t4        j6                  j                  d/d       }(|(|j%                  d0|(        |j                  d1d       })|)r|)|d1<   |j                  d2d       }*|*r|*|d2<   |j                  d3d       }+|+r|+|d3<   |r+d4|v r|d4   d|d4<   |d4   |d4<   ||#j9                  d|i       |j                  d5d       },|,rj|,j                  d6d        |,j                  d7d        |,j                  d8d       }-i }.|-r0|-j                         D ]  \  }}|j3                         d9vs||.|<     | j:                  j<                  dHi |#}/t?        |/|       d }0d }1|
ktA        |
d      r2|
j                  dd        t        jB                  jE                  ||
      }0tG        |
d:d       }2|2r|2jH                  |2jJ                  |r|'nd d;}1|j                  d<d       }3|3Qt        t        t(           |j                  d=d             }4dt        t(        |j                  dd             }3|4d>|4 }3|
tG        |
d?d       }5nd }5|5|5|d?<   |3|j                  d@|0      |||dA   ||!s|	nd|"s|nd|1tM        |      ||j                  d"d       dB}6|j                  dCd       }7|7|7|6dC<   |rtO        |6|D      }6|t        |t(              r
|d%k(  r||6d&<   |r|j                  dEd       |6dE<    |/jP                  dHi |6}8|8jR                  |0fS # tT        $ r- t        jV                  dFtY        jZ                                 Y yGw xY w)INr   z/Langfuse Layer Logging - logging to langfuse v2z2.6.3z2.7.3tagsstandard_logging_objectrS   user_api_key_end_user_idprompt_management_metadata:)rW   endpointcaching_groupsprevious_models)r   r   rS   
session_id
trace_namerr   existing_trace_idupdate_trace_keysdebug_langfuse
mask_inputFmask_output)rS   zlitellm-ri   r   rA   trace_rY   c                 $    | j                  d      S Nr   r6   r   s    rP   <lambda>z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>       s~~h'?ra   ro   zredacted-by-litellmr   trace_versionr<   )rA   r   r   ro   r<   r   c                 $    | j                  d      S r   r   r   s    rP   r   z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>9  r   ra   rh   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_hitrV   methodurlrW   )authorizationcookierefererr   )r   r   
total_costr   user_api_key_aliaszlitellm:system_fingerprintrs   r   )r   rA   r   r   r   model_parametersro   r   r   rS   r   r<   parent_observation_id)generation_paramsclean_metadatacompletion_start_timer   )NNr.   ).r/   r   r#   r   r   r<   r=   rv   r
   r	   r   r?   r   rx   rw   r&   langfuse_default_tagsr   appendadd_default_langfuse_tagsry   r   r[   filterkeyslowerr3   rB   updater   r   )log_provider_specific_information_as_spanhasattrutilsget_logging_idgetattrr   r   log_requester_metadata _add_prompt_to_generation_paramsr   rr   r0   errorr1   r2   )9rI   r   rS   rR   r   r   r   r   rd   ro   r   r   r   rc   r/   langfuse_versionsupports_tagssupports_promptsupports_costssupports_completion_start_timer   r   end_user_idr   r   r   r   r   r   rr   r   r   r#   r   r   trace_paramsr^   r_   updated_trace_valuecostr   r   r   r   rV   rW   clean_headersr   rs   r   
_usage_objr   _user_api_key_aliasr   r   r   generation_clients9                                                            rP   r   zLangFuseLogger._log_langfuse_v2  s     	NOV	--h7H&x'7'7'C'CD,0@@M.''2BBO-1AAN-=AQ-Q*/<8<<+"DHL/0

4d;I#
 '."=A*5jAEE. .2TN+J7;;4d.* .0N)5. ;< (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 (DMM''7,7E 6e^L ME'L$/$((t4@$+MM$@$@"L%M %\7DA
)3)A)A-7-I-I.<d$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%! !j&=%7BR6<!"23-=CZZ+T>!"9: !1 0 0 E3D E$--}<< 	  #:9;O;O;Q:R!ST	s&   J	] %] :K] ?G] 3^^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:r.   )r&   r   rx   r   r?   r   cache!_get_preset_cache_key_from_kwargs)rI   r   r   rS   _cache_hit_value_hidden_params
_cache_key_preset_cache_keys           rP   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ra   )NNNrZ   )DEFAULTN)__name__
__module____qualname__rQ   staticmethodr   r`   r   r   r   r   r   r{   r   r	   r   r   r   r   r.   ra   rP   r   r      s     !T*l " " "$ " "X W= 
W=rI
*
X-# -$ -
<(4. <S <|j 
jX	ra   r   r   r   rT   c                    ddl m}m}m}m} |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<   | S )Nr   )ChatPromptClientPrompt_ChatPrompt_TextTextPromptClientr   r   rY   chat)r   rm   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 Langfuser.   )r   r$  r%  r&  r'  rv   rx   r   r?   ry   r  
__fields__r   r   r  )r   r   r$  r%  r&  r'  user_prompt_prompt_chat_prompt_textprompt_text_params_data_prompt_objprompt_chat_paramss                rP   r  r    s     !$$Xt4Kl k 
K	&??62&&0&55L*:,*Oh'd c __VR(F2&55L*:,*Oh'^ ] +%(k*A+h/5%,1G1G&" (/)(3*95)ooh=	 11f@R6R&1ooh&C&IrE(O$/OOFB$?$E2E&M)2E2.>k.R!(+< 9 K148%,1G1G&" (/)(3*95)ooh=	 11f@R6R&1ooh&C&IrE(O$/OOFB$?$E2E&M)2E2.>k.R!(+  $$K    e  '2(#ra   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   ro   )r?   rx   r   r   rw   span)r   r   r  r5  elemr   r   s          rP   r  r  8  s     $''>N#1#5#5&$  $/2D94dD)&*jjl
U

!$"' #  '3 JJ;"   5 JJ32   0ra   c                     i }| j                  d      xs i }| j                         D ]  \  }}||vs|||<    |j                  d|i       |S )Nrequester_metadata)r?   rw   r   )r   returned_metadatar9  r   r   s        rP   r  r  d  sg    '++,@AGR$$&1&&#$a  ' 24FGHra   )$rt   r3   r1   collections.abcr   r   r   typingr   r   r   r	   r
   packaging.versionr   pydanticr   r&   litellm._loggingr   *litellm.litellm_core_utils.redact_messagesr   &litellm.llms.custom_httpx.http_handlerr   litellm.secret_managers.mainr   #litellm.types.integrations.langfuselitellm.types.utilsr   *litellm.litellm_core_utils.litellm_loggingr   r   r   r  r  r  r.   ra   rP   <module>rF     s     	  G G ; ; %   + O D 4 1 6NV VrBB-1B	BJ)X	4 	ra   