
    %Gg:Y                       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    p/home/kushmeetdev/apache_webroot/langgraph_flaskproject/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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/d0+      Zd1ed2<    G d3 d4      Z ed5      dNd6       Z ed/5      dNd7       ZedOd8       ZedPd9       Z fd:ZdQd;Z dRd<Z!dSd=Z"dTd>Z#	 	 	 	 dUd?Z$dddddd@	 	 	 	 	 	 	 	 	 	 	 dVdAZ%	 dWddddddddddddB	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dXdCZ&dD Z'dYdZdEZ(d[dFZ)d[dGZ*d\dHZ+e,	 	 	 	 	 	 d]dI       Z-e,	 	 	 	 	 	 d^dJ       Z.e,	 	 	 	 	 	 d_dK       Z/d`dLZ0dM Z1 xZ2S )a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Optional[str]parent_dotted_order__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>A   s     8 8 : Gi r&   project_name)r+   aliassession_name
project_id)r.   rA   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_namerF   r"   r&   r$   ConfigrP   S   s    +"&)-&r&   rX   )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<   |j                  |d<   d|vrt	               |d<   d|vr||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clientrI   _clientr8   r<   r:   rM   rF   rH   r   outputsattachments)	getpopr,   rL   r   rM   r   dict
setdefault)clsvaluesr8   s      r$   infer_defaultszRunTree.infer_defaultsZ   s    ::f%&**\*B*N--!'!5f!=v--!'!5d!;B!?v::f%&F6Nv"(**X"6F;& "(**Y"7F;zz+&"&F;ZZd3
!&0mmF?#,6,C,CF()v 7F4LV#%%/%8%8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         }|j                  d      }||dz   |z   |d<   |S ||d<   |S )z#Ensure the dotted order of the run.rL   r5   r,   r:   .)rb   strip_create_current_dotted_order)rf   rg   current_dotted_orderr:   s       r$   ensure_dotted_orderzRunTree.ensure_dotted_order   s      &zz.9$8$>$>$@M;< &, 
 %jj)>?*%83%>AU%UF>"  &:F>"r&   c                P    | j                   t               | _         | j                   S )zReturn the client.)rI   r%   selfs    r$   r^   zRunTree.client   s"    
 >>!.0DN~~r&   c                    | j                   S r1   )rI   rp   s    r$   r_   zRunTree._client   s     ~~r&   c                >    |dk(  r|| _         yt        | 	  ||      S )zSet the _client specially.r_   N)rI   super__setattr__)rq   r*   value	__class__s      r$   ru   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)rq   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   )rF   r   rd   re   update)rq   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}   )rq   r`   s     r$   add_outputszRunTree.add_outputs   s'     <<DLG$r&   c                `    | j                   i | _         | j                   j                  |       yr   )inputsr}   )rq   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)rH   ry   rd   appendr)   r   r2   r   r3   	isoformatrz   )rq   rH   s     r$   	add_eventzRunTree.add_event   s    * ;;DKfd#KKv&$KK#$LL6@@B% KKv&r&   )r`   errorend_timerH   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   )rq   r`   r   r   rH   r   s         r$   endzRunTree.end   s{     !>HLL$><<&##G,DJNN6"h'  r&   )run_idr[   r   r`   r   reference_example_idr5   r   r   rF   ra   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,   r[   r   r`   r   r/   r   r5   r   rF   r8   r@   rI   r   ra   rN   r"   )r(   r   r   r2   r   r3   rB   rI   rN   r=   r   )rq   r*   r/   r   r[   r   r`   r   r   r5   r   r   rF   ra   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`   )rd   r   copyr`   )rq   	self_dicts     r$   _get_dicts_safezRunTree._get_dicts_safe3  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.ra   uploaded_attachmentr   F)exclude_child_runsNr"   )r   r^   
create_runrb   r)   rH   r   r   r2   r   r3   r   setr=   post)rq   r   kwargsra   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)rb   ).0evs     r$   	<genexpr>z RunTree.patch.<locals>.<genexpr>\  s)      66&>-BB s    "Nr   z'Error filtering attachments to upload: )r*   r   r   r`   r   r<   r   r   rL   rM   rH   r   rF   ra   )r   r   ra   itemsry   tuplenextrH   	Exceptionloggerwarningr^   
update_runr*   r,   r   r   r`   r   r<   r   rL   rM   r   rF   )rq   avra   uploadedes         r$   patchzRunTree.patchQ  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"   rp   s    r$   waitzRunTree.wait|  s    r&   c                :    | j                   j                  |       S )zReturn the URL of the run.)r   )r^   get_run_urlrp   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)rf   rL   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   )ry   )r   tr   s     r$   r   z/RunTree.from_runnable_config.<locals>.<genexpr>  s     N1z!_/MQNs   r/   r   r`   r5   r   r   r*   rF   r   	order_map   r^   r@   )% langchain_core.callbacks.managerr   r   langchain_core.runnablesr   r    langchain_core.tracers.langchainr   ImportErrorry   rd   r   rb   r<   r   handlersrun_mapr)   rL   r/   r   r`   r5   r   sortedr   r   r*   re   r}   r   hasattrr   r^   r@   r(   r   )rf   configr   r   r   r   r   r   config_cbtracerr   rL   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   rM   r\   r,   rL      r<   r5   r/   r-   r*   parentrF   r   r   r@   r"   )r   r   r
   r)   rb   r   bytesLANGSMITH_DOTTED_ORDER_BYTESdecoderk   _parse_dotted_orderlenr   r2   r   r3   _Baggager   r   r   re   r   r   r@   r(   )rf   r   r   	init_argslangsmith_tracelangsmith_trace_bytesr:   parsed_dotted_orderrM   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   )	rM   rL   r   r   rF   rb   r   rB   	to_header)rq   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/   rL   rp   s    r$   __repr__zRunTree.__repr__  sB     $''(499+ 6'89J9J8K2O	
r&   )rg   rd   returnrd   )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   )rH   zTUnion[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent], Sequence[dict], dict, str]r   r   )r`   Optional[Dict]r   r9   r   Optional[datetime]rH   z'Optional[Sequence[ls_schemas.RunEvent]]r   zOptional[Dict[str, Any]]r   r   )r-   )r*   r)   r/   r   r   zOptional[ID_TYPE]r[   r   r   r   r`   r   r   r9   r   rD   r5   r   r   r   r   rG   rF   r   ra   z Optional[ls_schemas.Attachments]r   r(   )T)r   boolr   r   )r   r   r   r)   )rL   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])3rR   rS   rT   rU   __annotations__r   r   r,   r/   r5   r8   r:   listr=   rB   rE   rd   rF   r   rH   rI   rL   rM   rN   rX   r   rh   rn   propertyr^   r_   ru   r{   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__)rw   s   @r$   r(   r(   2   s   ;
IU+B+'*Hc* 1STJT$)$$EJ!E).tT)JJ %_-.!J  GL#  "'t<!HJH-E4- %d ;D
;t4FJ4$T4@I}@ CL#  23MNHdN38#X4 .   # #J      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   )rq   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   )	rf   header_valuer   r   r@   itemkeyrv   r   s	            r$   from_headerz_Baggage.from_header1  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   )rf   r   s     r$   r   z_Baggage.from_headersG  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@   )rq   r   serialized_metadataserialized_tagss       r$   r   z_Baggage.to_headerP  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   rG   r@   r9   )r
  r9   r   r   )r   zMapping[Union[str, bytes], Any]r   r   r   )	rR   rS   rT   rU   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.rj   Ni%Y%m%dT%H%M%S%fZ)r  r   strptimer   )rL   partsparts      r$   r   r   d  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$   rl   rl   m  s@     
	1x||HLL1B

EGC;;)*SX55r&   )r#   r   r   r   )rL   r)   r   zList[Tuple[datetime, UUID]])r5   r   r   rD   r   r)   )=rU   
__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   	getLoggerrR   r   r  internr   encoder   r  r  r	  r    r   Lock_LOCKr%   RunBaser(   r   r   rl   r;   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;<  	  	n
j   n
b> >B6"6,:66 i
 Q   s   D. .D>=D>