
    Mi J                         S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJrJr  S SK	J
r
JrJrJr  S SKrS SKJr  S SKrS SKJr  S SKJr  S SKJrJr  S S	K7  S S
KJrJr  S r " S S\5      rg)    N)uuid)datetimetimezone)AnyDictListOptional)	BaseModel)verbose_logger)CustomBatchLogger)get_async_httpx_clienthttpxSpecialProvider)*)StandardCallbackDynamicParamsStandardLoggingPayloadc                     [         R                  [         R                  [         R                  [        4n[        X5      (       + $ )N)typesCoroutineTypeFunctionTypeGeneratorTyper
   
isinstance)valuenon_serializable_typess     x/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/litellm/integrations/langsmith.pyis_serializabler      s8    	 %888    c            
       ^  ^  \ rS rSr    SS\\   S\\   S\\   S\\   4U 4S jjjr   SS\\   S\\   S\\   S\4S jjr	S	\4S
 jr
S rS rS rS r S S\S\S\S\4S jjrS	\S\\   4S jrS\\\4   4S jrS\\\4   S\4S jrS\\\4   S\4S jrS rS rS\4S jrSrU =r$ )!LangsmithLogger$   langsmith_api_keylangsmith_projectlangsmith_base_urllangsmith_sampling_ratec                   > [         R                  " 5       U l        [        TU ]  " S	0 UDSU R                  0D6  U R                  UUUS9U l        [        R                  " S5      b_  [        R                  " S5      R                  5       R                  5       (       a(  U=(       d    [        [        R                  " S5      5      OSU l        [        R                  " SS5      U l        [        [        R                   S9U l        [        R                  " SS 5      =(       d    [$        R&                  nU(       a  [)        U5      U l        / U l        [         R.                  " U R1                  5       5        g )
N
flush_lockr    r!   r"   LANGSMITH_SAMPLING_RATEg      ?LANGSMITH_DEFAULT_RUN_NAMELLMRun)llm_providerLANGSMITH_BATCH_SIZE )asyncioLockr%   super__init__get_credentials_from_envdefault_credentialsosgetenvstripisdigitfloatsampling_ratelangsmith_default_run_namer   r   LoggingCallbackasync_httpx_clientlitellmlangsmith_batch_sizeint
batch_size	log_queuecreate_taskperiodic_flush)selfr    r!   r"   r#   kwargs_batch_size	__class__s          r   r0   LangsmithLogger.__init__%   s+    ",,.>6>doo>#'#@#@//1 $A $
  yy23?		34::<DDFF $ ;RYY89:  	 +-))((+
' #9-==#
 II,d3Sw7S7S 	 !+.DO57D//12r   returnc                     U=(       d    [         R                  " S5      nU=(       d    [         R                  " S5      =(       d    SnU=(       d    [         R                  " S5      =(       d    Sn[        UUUS9$ )NLANGSMITH_API_KEYLANGSMITH_PROJECTzlitellm-completionLANGSMITH_BASE_URLzhttps://api.smith.langchain.com)rJ   rL   rK   )r3   r4   LangsmithCredentialsObject)rC   r    r!   r"   _credentials_api_key_credentials_project_credentials_base_urls          r   r1   (LangsmithLogger.get_credentials_from_envJ   sr      1RBII>Q4RW+>!?WCW 	  1yy-.10 	 *242
 	
r   credentialsc           
          UR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  SUS   5      nUR                  SU R                  5      n	UR                  SUR                  SS 5      5      n
UR                  SS 5      nUR                  S	S 5      nUR                  S
S 5      nUR                  SS 5      n[        R                  " SU SU	 35        UR                  SS 5      nUc  [	        S5      eUS   nU	SUUS   UUS   US   US   US.	nUS   b  US   S:X  a  US   US'   U
(       a  U
US'   U(       a  UUS'   U(       a  UUS	'   U(       a  UUS
'   U(       a  UUS'   UR                  S5      n
SU;  d  US   c$   [        [        R                  " 5       5      n
U
US'   S	U;  d  US	   c  U
b  [        U
[
        5      (       a  U
US	'   SU;  d  US   c*  U
b'  [        U
[
        5      (       a  U R                  U
S9US'   [        R                  " SU5        U$ ! [         a    e f = f)Nlitellm_paramsmetadataproject_namerK   run_nameidrun_idparent_run_idtrace_id
session_iddotted_orderz"Langsmith Logging - project_name: z, run_name standard_logging_objectz,Error logging request payload. Payload=none.llmresponse	startTimeendTimerequest_tags)	namerun_typeinputsoutputssession_name
start_timeend_timetagsextra	error_strstatusfailureerror)rY   z'Langsmith Logging data on langsmith: %s)
getr9   r   debug	Exceptionstrr   uuid4r   make_dot_order)rC   rD   response_objri   rj   rR   _litellm_paramsrU   rV   rW   rY   rZ   r[   r\   r]   payloaddatas                    r   _prepare_log_data!LangsmithLogger._prepare_log_data`   s   U	$jj)92>D"O&**:r:@bH#<<,? @L  ||J0O0OPH\\$Xt(DEF$LL$?M||J5H!lD9J#<<=L  4\N+hZX
 9?

)49G  NOOH
 !!!":. ,%k2#I./!
D {#/GH4E4R ' 4W#T
(5_%#+Z %/\"'3^$$(HHTNF44:#5 TZZ\*#T
 $&
#+'Jvs,C,C#)Z  d*'/'Jvs,C,C'+':':&':'I^$  !JDQK 		s   H5H8 8Ic                 Z    U R                  US9n[        R                  " 5       nXe:  a&  [        R                  " SR	                  XV5      5        g [        R
                  " SUU5        U R                  US9nU R                  UUUUUS9nU R                  R                  [        UUS95        [        R
                  " SU R                   S35        [        U R                  5      U R                  :  a  U R                  5         g g ! [         a    [        R                   " S5         g f = f)	NrD   >Skipping Langsmith logging. Sampling rate={}, random_sample={}z;Langsmith Sync Layer Logging - kwargs: %s, response_obj: %srD   rw   ri   rj   rR   rz   rR   z/Langsmith, event added to queue. Will flush in z seconds...z/Langsmith Layer Error - log_success_event error)%_get_sampling_rate_to_use_for_requestrandomr   infoformatrr   #_get_credentials_to_use_for_requestr{   r@   appendLangsmithQueueObjectflush_intervallenr?   _send_batchrs   	exception	rC   rD   rw   ri   rj   r8   random_samplerR   rz   s	            r   log_success_event!LangsmithLogger.log_success_event   s0   &	X FFfFUM"MMOM,##T[[%
   M BB&BQK)))%!' * D NN!!$ +   A$BUBUAVVab 4>>"doo5  " 6  	X$$%VW	Xs   AD B4D  D*)D*c                   #     U R                  US9n[        R                  " 5       nXe:  a&  [        R                  " SR	                  XV5      5        g [        R
                  " SUU5        U R                  US9nU R                  UUUUUS9nU R                  R                  [        UUS95        [        R
                  " S[        U R                  5      U R                  5        [        U R                  5      U R                  :  a  U R                  5       I S h  vN   g g  N! [         a    [        R                  " S5         g f = f7f)Nr~   r   z<Langsmith Async Layer Logging - kwargs: %s, response_obj: %sr   r   1Langsmith logging: queue length %s, batch size %sz:Langsmith Layer Error - error logging async success event.)r   r   r   r   r   rr   r   r{   r@   r   r   r   r?   flush_queuers   r   r   s	            r   async_log_success_event'LangsmithLogger.async_log_success_event   s:    '	 FFfFUM"MMOM,##T[[%
   N
 BB&BQK)))%!' * D NN!!$ +   CDNN#
 4>>"doo5&&((( 6( 	$$L	sH   E
AD$ E
CD$ D"D$  E
"D$ $ EE
EE
c                   #    U R                  US9n[        R                  " 5       nXe:  a&  [        R                  " SR	                  XV5      5        g [        R                  " S5         U R                  US9nU R                  UUUUUS9nU R                  R                  [        UUS95        [        R                  " S[        U R                  5      U R                  5        [        U R                  5      U R                  :  a  U R                  5       I S h  vN   g g  N! [         a    [        R                  " S5         g f = f7f)Nr~   r   z Langsmith Failure Event Logging!r   r   r   z:Langsmith Layer Error - error logging async failure event.)r   r   r   r   r   r   r{   r@   r   r   rr   r   r?   r   rs   r   r   s	            r   async_log_failure_event'LangsmithLogger.async_log_failure_event  s0    BB&BQ(PWW!
 >?	BB&BQK)))%!' * D NN!!$ +   CDNN#
 4>>"doo5&&((( 6( 	$$L	s=   A&E)B0D" D D" E D" " EEEEc                    #    U R                   (       d  gU R                  5       nUR                  5        H/  nU R                  UR                  UR
                  S9I Sh  vN   M1     g N	7f)a  
Handles sending batches of runs to Langsmith

self.log_queue contains LangsmithQueueObjects
    Each LangsmithQueueObject has the following:
        - "credentials" - credentials to use for the request (langsmith_api_key, langsmith_project, langsmith_base_url)
        - "data" - data to log on to langsmith for the request


This function
 - groups the queue objects by credentials
 - loops through each unique credentials and sends batches to Langsmith


This was added to support key/team based logging on langsmith
NrR   queue_objects)r@   _group_batches_by_credentialsvalues_log_batch_on_langsmithrR   r   )rC   batch_groupsbatch_groups      r   async_send_batch LangsmithLogger.async_send_batch8  sf     " ~~99;'..0K..'33)77 /    1s   AA+A) 
A+urlendpointapi_versionc                 |    X1;  a  UR                  S5       U 3nUR                  S5      (       a  U U 3$ U SU 3$ )N/)rstripendswith)rC   r   r   r   s       r   _add_endpoint_to_url$LangsmithLogger._add_endpoint_to_urlS  sP     !ZZ_%k]3C<<U8*%%az""r   r   c                 B  #    US   nUS   nU R                  US5      nSU0nU Vs/ s H  owS   PM	     nn [        R                  " S[        U5      5        U R                  R                  USU0US9I S	h  vN n	U	R                  5         U	R                  S
:  a1  [        R                  " SU	R                   SU	R                   35        g	[        R                  " S[        U R                  5       S35        g	s  snf  N! [        R                   aN  n
[        R                  " SU
R                  R                   SU
R                  R                   35         S	n
A
g	S	n
A
f[         a/    [        R                  " S[         R"                  " 5        35         g	f = f7f)a  
Logs a batch of runs to Langsmith
sends runs to /batch endpoint for the given credentials

Args:
    credentials: LangsmithCredentialsObject
    queue_objects: List[LangsmithQueueObject]

Returns: None

Raises: Does not raise an exception, will only verbose_logger.exception()
rL   rJ   z
runs/batch	x-api-keyrz   z%Sending batch of %s runs to Langsmithpost)r   jsonheadersNi,  zLangsmith Error: z - z	Batch of z runs successfully createdzLangsmith HTTP Error: zLangsmith Layer Error - )r   r   rr   r   r;   r   raise_for_statusstatus_coderp   textr@   httpxHTTPStatusErrorr   r`   rs   	traceback
format_exc)rC   rR   r   langsmith_api_baser    r   r   queue_objectelements_to_logr`   es              r   r   'LangsmithLogger._log_batch_on_langsmith]  s    " ))=>'(;<''(:LI 12DQRML/MR	  7_9M "4499o. :  H
 %%'##s*$$'(<(<'=SP $$DNN 344NO% S $$ 	$$()?)?(@AJJOOCTU   	$$*9+?+?+A*BC	se   %FC<FA D 8D9AD F-D ;FD FAE F 9FFFFc                    0 nU R                    Hv  nUS   nUS   b  US   c   [        R                  " SUS   US   5        M4  [        US   US   US   S9nXA;  a  [	        U/ S9X'   X   R
                  R                  U5        Mx     U$ )z@Groups queue objects by credentials using a proper key structurerR   rJ   rK   zBLangsmith Logging - credentials missing - api_key: %s, project: %srL   )api_keyprojectbase_urlr   )r@   r   warningCredentialsKey
BatchGroupr   r   )rC   log_queue_by_credentialsr   rR   keys        r   r   -LangsmithLogger._group_batches_by_credentials  s    EG  NNL&}5K /0823;&&X 34 34
  #$78#$78$%9:C 20: +21(- %)77>>|L1 +4 ('r   rD   c                     UR                  SS 5      nU R                  nUb  UR                  S5      nUb  [        U5      nU$ )N standard_callback_dynamic_paramsr#   )rq   r8   r7   )rC   rD   r   r8   _sampling_rates        r   r   5LangsmithLogger._get_sampling_rate_to_use_for_request  sT    JJ94@ 	)  $11+7=AA)N ) %n 5r   c                     UR                  SS5      nUbC  U R                  UR                  SS5      UR                  SS5      UR                  SS5      S9nU$ U R                  nU$ )z
Handles key/team based logging

If standard_callback_dynamic_params are provided, use those credentials.

Otherwise, use the default credentials.
r   Nr    r!   r"   r&   )rq   r1   r2   )rC   rD   r   rR   s       r   r   3LangsmithLogger._get_credentials_to_use_for_request  s     JJ94@ 	) ,777"B"F"F'# #C"F"F'# $D#G#G($$ 8 
K  22Kr   c                 n   U R                   (       d  g [        R                  " 5       nUR                  5       (       a%  [        R                  " U R                  5       5        gUR                  U R                  5       5        g! [         a'    [        R                  " U R                  5       5         gf = f)z'Calls async_send_batch in an event loopN)	r@   r-   get_event_loop
is_runningrA   r   run_until_completeRuntimeErrorrun)rC   loops     r   r   LangsmithLogger._send_batch  s    ~~	1))+D  ##D$9$9$;< ''(=(=(?@ 	1KK--/0	1s   AB #B .B43B4c                     U R                   S   nU R                   S   nU SU 3n[        R                  R                  USU0S9nUR	                  5       $ )NrJ   rL   z/runs/r   )r   r   )r2   r<   module_level_clientrq   r   )rC   rY   r    r   r   r`   s         r   get_run_by_idLangsmithLogger.get_run_by_id  sl     445HI!556JK#$F6(3..22 "34 3 

 }}r   rY   c                     [         R                  " [        R                  5      nUnUR	                  S5      [        U5      -   $ )Nz%Y%m%dT%H%M%S%fZ)r   nowr   utcstrftimert   )rC   rY   stid_s       r   rv   LangsmithLogger.make_dot_order  s2    \\(,,'{{-.S99r   )r;   r?   r2   r%   r9   r@   r8   )NNNN)NNN)z/api/v1)__name__
__module____qualname____firstlineno__r	   rt   r7   r0   rM   r1   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rv   __static_attributes____classcell__)rF   s   @r   r   r   $   sq    ,0+/,037#3#C=#3 $C=#3 %SM	#3
 "*%#3 #3N ,0+/,0	
#C=
 $C=
 %SM	

 
$
,] 0]~'XR(T$L8 ;D##"%#47#	#1/1 011f(tNJ4N/O (@DcN u 38n	#:1$:S : :r   r   )r-   r3   r   r   r   litellm._uuidr   r   r   typingr   r   r   r	   r   pydanticr
   r<   litellm._loggingr   (litellm.integrations.custom_batch_loggerr   &litellm.llms.custom_httpx.http_handlerr   r   $litellm.types.integrations.langsmithlitellm.types.utilsr   r   r   r   r,   r   r   <module>r      sR     	     ' , ,    + F 3 U9X:' X:r   