
    6|haX                       U d Z ddlmZ ddlZddlZddlZ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mZ ddlmZmZ 	 ddlmZmZ ddlZddlZddlmZ dd	lm Z  dd
l!m"Z"m#Z#m$Z$m%Z%m&Z&  ejN                  e(      Z)dZ* ejV                  e* d      Z,e,j[                  d      Z. ejV                  e* d      Z/ ejV                  e* d      Z0 ejV                  e* d      Z1da2de3d<    ejh                         Z5ddZ6 G d dejn                        Z8 G d d      Z9ddZ:	 	 	 	 	 	 ddZ;ddgZ<y# e$ r ddlmZmZ Y w xY w)zSchemas for the LangSmith API.    )annotationsN)datetimetimezone)	AnyDictListMappingOptionalSequenceTupleUnioncast)UUIDuuid4)Fieldroot_validator)schemas)utils)ID_TYPE
RUN_TYPE_TClient_dumps_json_ensure_uuidz
langsmith-traceutf-8metadatatagsprojectOptional[Client]_CLIENTc                 <    t         t         t        di | a t         S )N )r    r   )init_kwargss    R/var/www/html/test/engine/venv/lib/python3.12/site-packages/langsmith/run_trees.pyget_cached_clientr%   *   s    ?+{+GN    c                      e Zd ZU dZded<    ee      Zded<    ed      Zded	<    ed
       Z	ded<    edd      Z
ded<    eeddhi      Zded<    ed d      Zded<    edd      Zded<    ee      Zded <    ee      Zd!ed"<    ee      Zd#ed$<   	  edd      Zd%ed&<    ed'd()      Zded*<    ed'd+)      Zded,<    ed-d.)      Zd/ed0<    G d1 d2      Z ed3      dLd4       Z ed-3      dLd5       ZedMd6       ZedNd7       Z fd8ZdOd9ZdPd:Z dQd;Z!dRd<Z"	 	 	 	 dSd=Z#dddddd>	 	 	 	 	 	 	 	 	 	 	 dTd?Z$	 dUdddddddddddd@	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dVdAZ%dB Z&dWdXdCZ'dYdDZ(dYdEZ)dZdFZ*e+	 	 	 	 	 	 d[dG       Z,e+	 	 	 	 	 	 d\dH       Z-e+	 	 	 	 	 	 d]dI       Z.d^dJZ/dK Z0 xZ1S )_RunTreez1Run Schema with back-references for posting runs.strname)default_factoryr   idchain)defaultrun_typec                 H    t        j                  t        j                        S N)r   nowr   utcr"   r&   r$   <lambda>zRunTree.<lambda>8   s    hll9S r&   r   
start_timeNT)r.   excludeOptional[RunTree]
parent_run__all__parent_run_id)r+   r6   zList[RunTree]
child_runsc                 2    t        j                         xs dS )Nr.   )r   get_tracer_projectr"   r&   r$   r4   zRunTree.<lambda>?   s     8 8 : Gi r&   project_name)r+   aliassession_name
project_id)r.   r?   Optional[UUID]
session_idr   extraOptional[List[str]]r   z
List[Dict]eventszOptional[Any]	ls_client z!The order of the run in the tree.)r.   descriptiondotted_orderzThe trace id of the run.trace_idFz3Whether to allow filesystem access for attachments.zOptional[bool]dangerously_allow_filesystemc                      e Zd ZdZdZdZdZy)RunTree.ConfigzPydantic model configuration.TignoreN)__name__
__module____qualname____doc__arbitrary_types_allowedallow_population_by_field_namerD   r"   r&   r$   ConfigrN   Q   s    +"&)-&r&   rV   )prec                   |j                  d      9|j                  d      (d|d   v r|d   d   |d<   nd|d   v r|d   d   d   |d<   |j                  d      d|d<   d|v r|j                  d      |d<   nd	|v r|j                  d	      |d<   |j                  d      sd|d<   |j                  d
      |d
   j                  |d<   d|vrt               |d<   d|vrd
|v r|d
   j                  |d<   n|d   |d<   t        t        |j                  di              |j                  d      g |d<   |j                  d      g |d<   |j                  d      i |d<   |j                  d      i |d<   |S )zAssign name to the run.r*   N
serializedr,   UnnamedclientrG   _clientr8   r:   rK   rD   rF   r   outputsattachments)getpopr,   r   rK   r   dict
setdefault)clsvaluess     r$   infer_defaultszRunTree.infer_defaultsX   s    ::f%&**\*B*N--!'!5f!=v--!'!5d!;B!?v::f%&F6Nv"(**X"6F;& "(**Y"7F;zz+&"&F;::l#/&,\&:&=&=F?#v 7F4LV#v%%+L%9%B%Bz"%+D\z"T6$$Wb12::h'!F8::f%F6N::i ( "F9::m$,$&F=!r&   c                    |j                  d      }|r|j                         r|S t        |d   |d         }|d   r|d   j                  dz   |z   |d<   |S ||d<   |S )z#Ensure the dotted order of the run.rJ   r5   r,   r8   .)r`   strip_create_current_dotted_orderrJ   )rd   re   current_dotted_orders      r$   ensure_dotted_orderzRunTree.ensure_dotted_order|   s      &zz.9$8$>$>$@M;< &, 
 ,|$11C7:NN >"
  &:F>"r&   c                P    | j                   t               | _         | j                   S )zReturn the client.)rG   r%   selfs    r$   r\   zRunTree.client   s"    
 >>!.0DN~~r&   c                    | j                   S r1   )rG   rn   s    r$   r]   zRunTree._client   s     ~~r&   c                >    |dk(  r|| _         yt        | 	  ||      S )zSet the _client specially.r]   N)rG   super__setattr__)ro   r*   value	__class__s      r$   rs   zRunTree.__setattr__   s&     9"DN7&tU33r&   c                    t        |t              r|g}| j                  g | _        | j                  j                  |       y)zAdd tags to the run.N)
isinstancer)   r   extend)ro   r   s     r$   add_tagszRunTree.add_tags   s6    dC 6D99DI		r&   c                    | j                   i | _         t        t        | j                         j                  di       }|j	                  |       y)zAdd metadata to the run.Nr   )rD   r   rb   rc   update)ro   r   	metadata_s      r$   add_metadatazRunTree.add_metadata   s>    ::DJtTZZ0;;JK	"r&   c                `    | j                   i | _         | j                   j                  |       yzUpsert the given outputs into the run.

        Args:
            outputs (Dict[str, Any]): A dictionary containing the outputs to be added.

        Returns:
            None
        N)r^   r{   )ro   r^   s     r$   add_outputszRunTree.add_outputs   s'     <<DLG$r&   c                `    | j                   i | _         | j                   j                  |       yr   )inputsr{   )ro   r   s     r$   
add_inputszRunTree.add_inputs   s'     ;;DK6"r&   c                v   | j                   g | _         t        |t              r| j                   j                  |       yt        |t              rO| j                   j                  dt        j                  t        j                        j                         |d       y| j                   j                  |       y)a~  Add an event to the list of events.

        Args:
            events (Union[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent],
                    Sequence[dict], dict, str]):
                The event(s) to be added. It can be a single event, a sequence
                of events, a sequence of dictionaries, a dictionary, or a string.

        Returns:
            None
        Neventr*   timemessage)rF   rw   rb   appendr)   r   r2   r   r3   	isoformatrx   )ro   rF   s     r$   	add_eventzRunTree.add_event   s    * ;;DKfd#KKv&$KK#$LL6@@B% KKv&r&   )r^   errorend_timerF   r   c                  |xs# t        j                  t        j                        | _        |/| j
                  s|| _        n| j
                  j                  |       ||| _        || j                  |       || j                  |       yy)z/Set the end time of the run and all child runs.N)
r   r2   r   r3   r   r^   r{   r   r   r}   )ro   r^   r   r   rF   r   s         r$   endzRunTree.end   s{     !>HLL$><<&##G,DJNN6"h'  r&   )run_idrY   r   r^   r   reference_example_idr5   r   r   rD   r_   c               |   |xs d|i}t        di d|dt        |      d|d|xs i d|xs i d|d|d|d	|	xs# t        j                  t        j
                        d
|
d|xs i d| d| j                  d| j                  d|d|xs i d| j                  }| j                  j                  |       |S )z Add a child run to the run tree.r*   r,   rY   r   r^   r   r/   r   r5   r   rD   r8   r>   rG   r   r_   rL   r"   )r(   r   r   r2   r   r3   r@   rG   rL   r;   r   )ro   r*   r/   r   rY   r   r^   r   r   r5   r   r   rD   r_   serialized_runs                   r$   create_childzRunTree.create_child  s   $ !2VTN 

F#
 #
 <R	

 Mr
 
 
 "6
 "?X\\(,,%?
 
 +2
 
 **
 nn
 
  $)r!
" *.)J)J#
& 	s#
r&   c                    | j                  h dd      }| j                  | j                  j                         |d<   | j                  | j                  j                         |d<   |S )N>   r   r^   r;   T)r6   exclude_noner   r^   )rb   r   copyr^   )ro   	self_dicts     r$   _get_dicts_safezRunTree._get_dicts_safe0  sd    II7d  
	 ;;""&++"2"2"4Ih<<##'<<#4#4#6Ii r&   c                   | j                         } | j                  j                  di | |j                  d      x}ro|D cg c]  }t	        |       }}| j
                  j                  dt        j                  t        j                        j                         t        |      d       |s$| j                  D ]  }|j                  d        yyc c}w )z,Post the run tree to the API asynchronously.r_   uploaded_attachmentr   F)exclude_child_runsNr"   )r   r\   
create_runr`   r)   rF   r   r   r2   r   r3   r   setr;   post)ro   r   kwargsr_   r*   keys	child_runs          r$   r   zRunTree.post=  s    %%'(( **]33;3*56$CI6D6KK1$LL6@@B"4y "!__ 9	%89 " 7s   Cc                   | j                   s| j                          | j                  j                         D ci c]  \  }}t	        |t
              s|| }}}	 |rIt        d | j                  D        d      }|r*|j                         D ci c]  \  }}||d   vr|| }}}| j                  j                  | j                  | j                  | j                  r| j                  j!                         nd| j"                  r| j"                  j!                         nd| j$                  | j&                  | j(                  | j                   | j*                  | j,                  | j                  | j.                  | j0                  |       yc c}}w c c}}w # t        $ r#}t        j                  d|        Y d}~d}~ww xY w)z5Patch the run tree to the API in a background thread.c              3  H   K   | ]  }|j                  d       dk(  r|  yw)r*   r   N)r`   ).0evs     r$   	<genexpr>z RunTree.patch.<locals>.<genexpr>Y  s)      66&>-BB s    "Nr   z'Error filtering attachments to upload: )r*   r   r   r^   r   r:   r   r   rJ   rK   rF   r   rD   r_   )r   r   r_   itemsrw   tuplenextrF   	Exceptionloggerwarningr\   
update_runr*   r,   r   r   r^   r   r:   r   rJ   rK   r   rD   )ro   avr_   uploadedes         r$   patchzRunTree.patchN  s   }}HHJ!--335
QAu9MAqD
 
	J"&++
   %0$5$5$7# AqHY$77 1#K # 	77)-4;;##%$+/<<DLL%%'T**,,!%!:!:]]**]];;**# 	 	
-
#
  	JNNDQCHII	Js5   FF4F F$F F 	G F>>Gc                     y)z"Wait for all _futures to complete.Nr"   rn   s    r$   waitzRunTree.waity  s    r&   c                :    | j                   j                  |       S )zReturn the URL of the run.)r   )r\   get_run_urlrn   s    r$   get_urlzRunTree.get_url}  s    {{&&4&00r&   c                T    t         |i}t        t         | j                  |fi |      S )zwCreate a new 'child' span from the provided dotted order.

        Returns:
            RunTree: The new span.
        )LANGSMITH_DOTTED_ORDERr   r(   from_headers)rd   rJ   r   headerss       r$   from_dotted_orderzRunTree.from_dotted_order  s2     #L
 G-S--g@@AAr&   c           	        	 ddl m}m} ddlm}m} ddlm |% |t        |t              rt        ||      nd      }nt        ||      }|j                  d      x}	rt        |	||f      r|	j                  rt        fd|	j                  D        d      x}
r|
j                   j                  t#        |	j                              x}r|j$                  r|j$                  }|j&                  |d	<   |j(                  |d
<   |j*                  |d<   |j,                  |d<   |j.                  |d<   t1        t3        |j4                  xs g |j                  dg       z               |d<   |j6                  |d<   |j9                  di       }|j9                  di       }|j;                  |j<                         nBt?        |
d      r5|	j                  |
j@                  v r|
j@                  |	j                     d   }ny|
jB                  |d<   |
jD                  |d<   tG        jH                  |fi |S y# t        $ r}t        d      |d}~ww xY w)zCreate a new 'child' span from the provided runnable config.

        Requires langchain to be installed.

        Returns:
            Optional[RunTree]: The new span or None if
                no parent span information is found.
        r   )AsyncCallbackManagerCallbackManager)RunnableConfigensure_config)LangChainTracerz{RunTree.from_runnable_config requires langchain-core to be installed. You can install it with `pip install langchain-core`.N	callbacksc              3  <   K   | ]  }t        |      s|  y wr1   )rw   )r   tr   s     r$   r   z/RunTree.from_runnable_config.<locals>.<genexpr>  s     N1z!_/MQNs   r/   r   r^   r5   r   r   r*   rD   r   	order_map   r\   r>   )% langchain_core.callbacks.managerr   r   langchain_core.runnablesr   r    langchain_core.tracers.langchainr   ImportErrorrw   rb   r   r`   r:   r   handlersrun_mapr)   rJ   r/   r   r^   r5   r   sortedr   r   r*   rc   r{   r   hasattrr   r\   r>   r(   r   )rd   configr   r   r   r   r   r   config_cbtracerr   rJ   extra_r|   r   s                  @r$   from_runnable_configzRunTree.from_runnable_config  s)   	 OH >#0:640H^V,dG >62G ;;{++R+21EFG  NN   ~~))#b.>.>*?@@@cFVFV"//%(\\z"#&::x $'KKy!'*~~|$%(\\z"!'CHH,SVZZPR=S8S(T!Uv!$v**7B7"--j"=	  .-"2B2BfFVFV2V%//0@0@A!D%}}F8%+%8%8F>",,\DVDDU  	H 	s   H/ /	I	8II	c           	        |j                         }t        t        t           |j	                  t
                    }|s>t        t        t           |j	                  t                    }|sy|j                  d      }|j                         }t        |      }|d   d   }||d<   |d   d   |d<   ||d<   t        |      d	k\  r|d
   d   |d<   |j	                  d      xs# t        j                  t        j                        |d<   |j	                  d      xs d|d<   |j	                  d      xs d|d<   t         j#                  |      }	|	j$                  s|	j&                  r|j)                  di       |d<   |d   j)                  di       |d   d<   i |	j$                  |d   d   }
|
|d   d<   t+        t-        |	j&                  |j	                  dg       z               }||d<   |	j.                  r|	j.                  |d<   t1        di |S )a  Create a new 'parent' span from the provided headers.

        Extracts parent span information from the headers and creates a new span.
        Metadata and tags are extracted from the baggage header.
        The dotted order and trace id are extracted from the trace header.

        Returns:
            Optional[RunTree]: The new span or None if
                no parent span information is found.
        Nr   r   r   rK   rZ   r,   rJ      r:   r5   r/   r-   r*   parentrD   r   r   r>   r"   )r   r   r
   r)   r`   r   bytesLANGSMITH_DOTTED_ORDER_BYTESdecoderi   _parse_dotted_orderlenr   r2   r   r3   _Baggager   r   r   rc   r   r   r>   r(   )rd   r   r   	init_argslangsmith_tracelangsmith_trace_bytesparent_dotted_orderparsed_dotted_orderrK   baggager   r   s               r$   r   zRunTree.from_headers  s    KKM	x}gkk:P.QR$(-I!J%! )3::7CO-33512EF&q)!, (	*-b1!4	$$7	.!"#q()<R)@)CIo& #,--"= #
LLB
	, !*j 9 DW	*%MM&1=X	&''0w||!*!5!5gr!BIg-6w-?-J-JB.Igz* N'**Mi.@.LMH-5Igz*#gllY]]62-FFGHD $If##,3,@,@	.)###r&   c                    i }| j                   r| j                  |t         <   t        | j                  j                  di       | j                  | j                        }|j                         |d<   |S )z.Return the RunTree as a dictionary of headers.r   r   r   r>   r   )	rK   rJ   r   r   rD   r`   r   r@   	to_header)ro   r   r   s      r$   
to_headerszRunTree.to_headers  sh    ==373D3DG-.0ZZ^^J3**

 %..0	r&   c           	     p    d| j                    d| j                   d| j                   d| j                   d	S )z5Return a string representation of the RunTree object.zRunTree(id=z, name='z', run_type='z', dotted_order='z'))r,   r*   r/   rJ   rn   s    r$   __repr__zRunTree.__repr__  sB     $''(499+ 6'89J9J8K2O	
r&   )re   rb   returnrb   )r   r   )r   r   )r   zUnion[Sequence[str], str]r   None)r   Dict[str, Any]r   r   )r^   r   r   r   )r   r   r   r   )rF   zTUnion[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent], Sequence[dict], dict, str]r   r   )r^   Optional[Dict]r   Optional[str]r   Optional[datetime]rF   z'Optional[Sequence[ls_schemas.RunEvent]]r   zOptional[Dict[str, Any]]r   r   )r-   )r*   r)   r/   r   r   zOptional[ID_TYPE]rY   r   r   r   r^   r   r   r   r   rB   r5   r   r   r   r   rE   rD   r   r_   z Optional[ls_schemas.Attachments]r   r(   )T)r   boolr   r   )r   r   r   r)   )rJ   r)   r   r   r   r(   )r   zOptional[dict]r   r   r   r7   )r   z-Mapping[Union[str, bytes], Union[str, bytes]]r   r   r   r7   )r   zDict[str, str])2rP   rQ   rR   rS   __annotations__r   r   r,   r/   r5   r8   listr;   r@   rC   rb   rD   r   rF   rG   rJ   rK   rL   rV   r   rf   rl   propertyr\   r]   rs   ry   r}   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__)ru   s   @r$   r(   r(   2   s{   ;
IU+B+'*Hc* 1STJT$)$$EJ!E %_-.!J  GL#  "'t<!HJH-E4- %d ;D
;t4FJ4$T4@I}@ CL#  23MNHdN38#X4 .   ! !F       4#%#"'
"' 
"'N #'#'+:>-1(  ( 	(
 %( 8( +( 
(4  ''
 %)%)!%"&#/3)-'+$( $8<'' '
 "' #' '  ' ' -' '' %' "' ' 6'  
!'R9")
V1 BB B 
	B B >> > 
	> >@ 6$C6$OR6$	6$ 6$p
r&   r(   c                  V    e Zd ZdZ	 	 	 d	 	 	 	 	 ddZed	d       Zed
d       ZddZy)r   zBaggage header information.Nc                >    |xs i | _         |xs g | _        || _        y)zInitialize the Baggage object.Nr   )ro   r   r   r>   s       r$   __init__z_Baggage.__init__#  s"     !BJB	(r&   c                &   |s |        S i }g }d}	 |j                  d      D ]  }|j                  dd      \  }}|t        k(  r3t        j                  t        j
                  j                  |            }T|t        k(  r/t        j
                  j                  |      j                  d      }|t        k(  st        j
                  j                  |      } 	  | |||      S # t        $ r"}t        j                  d|        Y d}~1d}~ww xY w)z4Create a Baggage object from the given header value.N,=r   zError parsing baggage header: r   )splitLANGSMITH_METADATAjsonloadsurllibparseunquoteLANGSMITH_TAGSLANGSMITH_PROJECTr   r   r   )	rd   header_valuer   r   r>   itemkeyrt   r   s	            r$   from_headerz_Baggage.from_header.  s     5L
	A$**3/ ?!ZZQ/
U,,#zz&,,*>*>u*EFHN*!<<//6<<SAD--#)<<#7#7#>L? H4lKK  	ANN;A3?@@	As   B&C% 8!C% %	D.DDc                    d|v r| j                  |d         S d|v r1| j                  t        t        |d         j                  d            S | j                  d       S )Nr   s   baggager   )r  r   r   r   )rd   r   s     r$   r   z_Baggage.from_headersD  s[    ??79#5667"??4wz/B#C#J#J7#STT??4((r&   c                .   g }| j                   rLt        | j                         }|j                  t         dt        j
                  j                  |              | j                  rRdj                  | j                        }|j                  t         dt        j
                  j                  |              | j                  rA|j                  t         dt        j
                  j                  | j                                dj                  |      S )z,Return the Baggage object as a header value.z	metadata=r   ztags=zproject=)
r   r   r   LANGSMITH_PREFIXr  r  quoter   joinr>   )ro   r   serialized_metadataserialized_tagss       r$   r   z_Baggage.to_headerM  s    =="-dmm"<LL#$Ifll.@.@AT.U-VW 99!hhtyy1OLL#$E&,,*<*<_*M)NO LL#$HV\\-?-?@Q@Q-R,ST xxr&   )NNN)r   zOptional[Dict[str, str]]r   rE   r>   r   )r
  r   r   r   )r   zMapping[Union[str, bytes], Any]r   r   r   )	rP   rQ   rR   rS   r   r   r  r   r   r"   r&   r$   r   r      s`    % .2$(&*		)*	) "	) $		) L L* ) )r&   r   c           	         | j                  d      }|D cg c])  }t        j                  |dd d      t        |dd       f+ c}S c c}w )zParse the dotted order string.rh   Ni%Y%m%dT%H%M%S%fZ)r  r   strptimer   )rJ   partsparts      r$   r   r   a  sX    s#E  
		4:'9	:Dcd<LM  s   .Ac                    | xs# t        j                  t        j                        }|xs
 t	               }|j                  d      t        |      z   S )z Create the current dotted order.r  )r   r2   r   r3   r   strftimer)   )r5   r   stid_s       r$   rj   rj   j  s@     
	1x||HLL1B

EGC;;)*SX55r&   )r#   r   r   r   )rJ   r)   r   zList[Tuple[datetime, UUID]])r5   r   r   rB   r   r)   )=rS   
__future__r   r  loggingsysr   r   typingr   r   r   r	   r
   r   r   r   r   uuidr   r   pydantic.v1r   r   r   pydantic	threadingurllib.parser  	langsmithr   
ls_schemasr   langsmith.clientr   r   r   r   r   	getLoggerrP   r   r  internr   encoder   r  r  r	  r    r   Lock_LOCKr%   RunBaser(   r   r   rj   r9   r"   r&   r$   <module>r0     sW   $ "   
 ' S S S 1   +  S S			8	$ #'7&8$>? 5<<WE SZZ#3"4H => /056CJJ"2!37;<  	  	k
j   k
\> >B6"6,:66 i
 K   s   D. .D>=D>