
    ^hwF                         S SK r 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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)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/home/james-whalen/.local/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\\   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\\   4S jrS\\\4   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_urlc                   > U R                  UUUS9U l        [        R                  " S5      bV  [        R                  " S5      R	                  5       R                  5       (       a  [        [        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 R)                  5       5        [$        R*                  " 5       U l        [.        TU ]`  " S	0 UDSU R,                  0D6  g )
Nr   r    r!   LANGSMITH_SAMPLING_RATE      ?LANGSMITH_DEFAULT_RUN_NAMELLMRun)llm_providerLANGSMITH_BATCH_SIZE
flush_lock )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asynciocreate_taskperiodic_flushLockr*   super__init__)selfr   r    r!   kwargs_batch_size	__class__s         r   rA   LangsmithLogger.__init__%   s"    $(#@#@//1 $A $
  yy23?		34::<DDFF "))567 	 	 +-))((+
' #9-==#
 II,d3Sw7S7S 	 !+.DO57D//12!,,.>6>doo>r   returnc                 J   U=(       d    [         R                  " S5      nUc  [        S5      eU=(       d    [         R                  " S5      =(       d    SnUc  [        S5      eU=(       d    [         R                  " S5      =(       d    SnUc  [        S5      e[        UUUS	9$ )
NLANGSMITH_API_KEYz;Invalid Langsmith API Key given. _credentials_api_key=None.LANGSMITH_PROJECTzlitellm-completionz;Invalid Langsmith API Key given. _credentials_project=None.LANGSMITH_BASE_URLzhttps://api.smith.langchain.comz<Invalid Langsmith API Key given. _credentials_base_url=None.)rI   rK   rJ   )r.   r/   	ExceptionLangsmithCredentialsObject)rB   r   r    r!   _credentials_api_key_credentials_project_credentials_base_urls          r   r,   (LangsmithLogger.get_credentials_from_envH   s      1RBII>Q4R'M  W+>!?WCW 	  'M   1yy-.10 	
 !(N  *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_namerJ   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)
getr4   r
   debugrL   struuiduuid4r   make_dot_order)rB   rC   response_objri   rj   rR   _litellm_paramsrU   rV   rW   rY   rZ   r[   r\   r]   payloaddatas                    r   _prepare_log_data!LangsmithLogger._prepare_log_datak   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                     [         R                  " S5      bV  [         R                  " S5      R                  5       R                  5       (       a  [	        [         R                  " S5      5      OS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)Nr$   r%   >Skipping Langsmith logging. Sampling rate={}, random_sample={}z;Langsmith Sync Layer Logging - kwargs: %s, response_obj: %srC   rC   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)r.   r/   r0   r1   r2   randomr
   infoformatrr   #_get_credentials_to_use_for_requestr{   r;   appendLangsmithQueueObjectflush_intervallenr:   _send_batchrL   	exception	rB   rC   rw   ri   rj   r3   random_samplerR   rz   s	            r   log_success_event!LangsmithLogger.log_success_event   sq   *	X 9967CII78>>@HHJJ bii 9:; 	  #MMOM,##T[[%
   M
 BB&BQK)))%!' * D NN!!$ +   A$BUBUAVVab 4>>"doo5  " 6  	X$$%VW	Xs   B.E' 1B4E' ' F
	F
c                   #     U R                   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~   z<Langsmith Async Layer Logging - kwargs: %s, response_obj: %sr   r   r   1Langsmith logging: queue length %s, batch size %sz:Langsmith Layer Error - error logging async success event.)r3   r   r
   r   r   rr   r   r{   r;   r   r   r   r:   flush_queuerL   r   r   s	            r   async_log_success_event'LangsmithLogger.async_log_success_event   s2    '	 ..M"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                   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~   z Langsmith Failure Event Logging!r   r   r   r   z:Langsmith Layer Error - error logging async failure event.)r3   r   r
   r   r   r   r{   r;   r   r   rr   r   r:   r   rL   r   r   s	            r   async_log_failure_event'LangsmithLogger.async_log_failure_event!  s(    **(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   )rB   batch_groupsbatch_groups      r   async_send_batch LangsmithLogger.async_send_batchG  sf     " ~~99;'..0K..'33)77 /    1s   AA+A) 
A+r   c                 (  #    US   nUS   nU S3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()
rK   rI   z/runs/batch	x-api-keyrz   z%Sending batch of %s runs to Langsmithpost)urljsonheadersNi,  zLangsmith Error: z - z	Batch of z runs successfully createdzLangsmith HTTP Error: zLangsmith Layer Error - )r
   rr   r   r6   r   raise_for_statusstatus_coderp   textr;   httpxHTTPStatusErrorr   r`   rL   	traceback
format_exc)rB   rR   r   langsmith_api_baser   r   r   queue_objectelements_to_logr`   es              r   r   'LangsmithLogger._log_batch_on_langsmithb  s    " ))=>'(;<#$K0 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 C6 +C4,AC6  F-C6 .F4C6 6F
AEF9FFFFc                     0 nU R                    HJ  nUS   n[        US   US   US   S9nXA;  a  [        U/ S9X'   X   R                  R	                  U5        ML     U$ )z@Groups queue objects by credentials using a proper key structurerR   rI   rJ   rK   )api_keyprojectbase_urlr   )r;   CredentialsKey
BatchGroupr   r   )rB   log_queue_by_credentialsr   rR   keys        r   r   -LangsmithLogger._group_batches_by_credentials  s    EG  NNL&}5K #$78#$78$%9:C 20: +21(- %)77>>|L + ('r   rC   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.
 standard_callback_dynamic_paramsNr   r    r!   r#   )rq   r,   r-   )rB   rC   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_runningr=   r   run_until_completeRuntimeErrorrun)rB   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       $ )NrI   rK   z/runs/r   )r   r   )r-   r7   module_level_clientrq   r   )rB   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strftimers   )rB   rY   stid_s       r   rv   LangsmithLogger.make_dot_order  s2    \\(,,'{{-.S99r   )r6   r:   r-   r*   r4   r;   r3   )NNN)__name__
__module____qualname____firstlineno__r   rs   rA   rM   r,   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rv   __static_attributes____classcell__)rE   s   @r   r   r   $   s    ,0+/,0	!?#C=!? $C=!? %SM	!? !?J ,0+/,0	!
#C=!
 $C=!
 %SM	!

 
$!
F] 0]~+XZ(T$L61/1 011f(tNJ4N/O (*38n	#:1$:S : :r   r   )r<   r.   r   r   r   rt   r   r   typingr   r   r   r   r   pydanticr	   r7   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F:' F:r   