a
    ~gaX                     @  s  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 zddlmZmZ W n" ey   ddlmZmZ Y n0 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'e(Z)dZ*e+e* dZ,e,-dZ.e+e* dZ/e+e* dZ0e+e* dZ1da2de3d< e4 Z5dddddZ6G dd dej7Z8G dd dZ9ddddd Z:d!d"dd#d$d%Z;ddgZ<dS )&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]_CLIENTr   r   )init_kwargsreturnc                  K  s"   t d u rt d u rtf i | a t S N)r   r   )r     r#   X/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/langsmith/run_trees.pyget_cached_client*   s    r%   c                      s   e Zd ZU dZded< eedZded< eddZded	< ed
d dZ	ded< edddZ
ded< eeddhidZded< edd ddZded< edddZded< eedZd ed!< eedZd"ed#< eedZd$ed%< edddZd&ed'< ed(d)d*Zded+< ed(d,d*Zded-< ed.d/d*Zd0ed1< G d2d3 d3Zedd4d5d5d6d7d8Zed.d4d5d5d6d9d:Zed;d<d=d>Zed?d<d@dAZ fdBdCZdDdEdFdGdHZdIdEdJdKdLZ dIdEdMdNdOZ!dIdEdPdQdRZ"dSdEdTdUdVZ#ddddddWdXdYdZd[d\dEd]d^d_Z$ddddddddddddd`ddadbdXdXdXdYddZdZd"dXdcd dddedfZ%dgdh Z&ddidEdjdkdlZ'dEd<dmdnZ(dEd<dodpZ)dd<dqdrZ*e+ddsd dtdudvZ,e+dwdsddxdydzZ-e+d{dsdd|d}d~Z.dd<ddZ/dd Z0  Z1S )RunTreez1Run Schema with back-references for posting runs.strname)default_factoryr   idchain)defaultrun_typec                   C  s   t tjS r"   )r   nowr   utcr#   r#   r#   r$   <lambda>8       zRunTree.<lambda>r   
start_timeNT)r,   excludezOptional[RunTree]
parent_run__all__parent_run_id)r)   r3   zList[RunTree]
child_runsc                   C  s   t  p
dS )Nr,   )r   get_tracer_projectr#   r#   r#   r$   r0   ?   r1   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                   @  s   e Zd ZdZdZdZdZdS )zRunTree.ConfigzPydantic model configuration.TignoreN)__name__
__module____qualname____doc__arbitrary_types_allowedallow_population_by_field_namer?   r#   r#   r#   r$   ConfigQ   s   rO   )predict)valuesr!   c                 C  s  | ddu rZ| ddurZd|d v r:|d d |d< n d|d v rZ|d d d |d< | ddu rpd|d< d|v r|d|d< nd	|v r|d	|d< | dsd|d< | d
dur|d
 j|d< d|vrt |d< d|vrd
|v r|d
 j|d< n|d |d< tt|di  | ddu r8g |d< | ddu rPg |d< | ddu rhi |d< | ddu ri |d< |S )zAssign name to the run.r(   N
serializedr*   ZUnnamedclientrB   _clientr4   r6   rF   r?   rA   r   outputsattachments)getpopr*   r   rF   r   rQ   
setdefault)clsrR   r#   r#   r$   infer_defaultsX   s>    



zRunTree.infer_defaultsc                 C  sX   | d}|r| r|S t|d |d }|d rL|d jd | |d< n||d< |S )z#Ensure the dotted order of the run.rE   r2   r*   r4   .)rY   strip_create_current_dotted_orderrE   )r\   rR   Zcurrent_dotted_orderr#   r#   r$   ensure_dotted_order|   s    
zRunTree.ensure_dotted_orderr   r!   c                 C  s   | j du rt | _ | j S )zReturn the client.N)rB   r%   selfr#   r#   r$   rU      s    
zRunTree.clientr   c                 C  s   | j S r"   )rB   rc   r#   r#   r$   rV      s    zRunTree._clientc                   s"   |dkr|| _ nt ||S dS )zSet the _client specially.rV   N)rB   super__setattr__)rd   r(   value	__class__r#   r$   rf      s    zRunTree.__setattr__zUnion[Sequence[str], str]None)r   r!   c                 C  s0   t |tr|g}| jdu r g | _| j| dS )zAdd tags to the run.N)
isinstancer'   r   extend)rd   r   r#   r#   r$   add_tags   s
    

zRunTree.add_tagszDict[str, Any])r   r!   c                 C  s2   | j du ri | _ tt| j di }|| dS )zAdd metadata to the run.Nr   )r?   r   rQ   r[   update)rd   r   	metadata_r#   r#   r$   add_metadata   s    
zRunTree.add_metadata)rW   r!   c                 C  s    | j du ri | _ | j | dS zUpsert the given outputs into the run.

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

        Returns:
            None
        N)rW   rn   )rd   rW   r#   r#   r$   add_outputs   s    	
zRunTree.add_outputs)inputsr!   c                 C  s    | j du ri | _ | j | dS rq   )rs   rn   )rd   rs   r#   r#   r$   
add_inputs   s    	
zRunTree.add_inputszTUnion[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent], Sequence[dict], dict, str])rA   r!   c                 C  sd   | j du rg | _ t|tr(| j | n8t|trT| j dttj	 |d n| j 
| dS )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)rA   rk   rQ   appendr'   r   r.   r   r/   	isoformatrl   )rd   rA   r#   r#   r$   	add_event   s    


zRunTree.add_event)rW   errorend_timerA   r   zOptional[Dict]Optional[str]Optional[datetime]z'Optional[Sequence[ls_schemas.RunEvent]]zOptional[Dict[str, Any]])rW   r|   r}   rA   r   r!   c                C  sj   |pt tj| _|dur4| js(|| _n| j| |durB|| _|durT| | |durf| 	| dS )z/Set the end time of the run and all child runs.N)
r   r.   r   r/   r}   rW   rn   r|   r{   rp   )rd   rW   r|   r}   rA   r   r#   r#   r$   end   s    

zRunTree.end)run_idrS   rs   rW   r|   reference_example_idr2   r}   r   r?   rX   r   zOptional[ID_TYPE]z Optional[ls_schemas.Attachments])r(   r-   r   rS   rs   rW   r|   r   r2   r}   r   r?   rX   r!   c                C  sl   |p
d|i}t |t|||pi |p$i ||||	p8ttj|
|p@i | | j| j||pRi | jd}| j	
| |S )z Add a child run to the run tree.r(   )r(   r*   rS   rs   rW   r|   r-   r   r2   r}   r?   r4   r9   rB   r   rX   rG   )r&   r   r   r.   r   r/   r;   rB   rG   r7   ry   )rd   r(   r-   r   rS   rs   rW   r|   r   r2   r}   r   r?   rX   Zserialized_runr#   r#   r$   create_child  s,    zRunTree.create_childc                 C  sF   | j h ddd}| jd ur*| j |d< | jd urB| j |d< |S )N>   rs   rW   r7   T)r3   exclude_noners   rW   )rQ   rs   copyrW   )rd   	self_dictr#   r#   r$   _get_dicts_safe0  s    

zRunTree._get_dicts_safebool)exclude_child_runsr!   c                 C  sz   |   }| jjf i | |d }rZdd |D }| jdttj	
 t|d |sv| jD ]}|jdd qddS )	z,Post the run tree to the API asynchronously.rX   c                 S  s   g | ]}t |qS r#   )r'   ).0r(   r#   r#   r$   
<listcomp>B  r1   z RunTree.post.<locals>.<listcomp>uploaded_attachmentrv   F)r   N)r   rU   
create_runrY   rA   ry   r   r.   r   r/   rz   setr7   post)rd   r   kwargsrX   keys	child_runr#   r#   r$   r   =  s    
zRunTree.postc                   s   | j s|   dd | j D }z8|rXtdd | jD d  rX fdd| D }W n4 ty } ztd|  W Y d}~n
d}~0 0 | j	j
| j| j| jr| j nd| jr| j nd| j| j| j| j | j| j| j| j| j|d dS )	z5Patch the run tree to the API in a background thread.c                 S  s    i | ]\}}t |tr||qS r#   )rk   tupler   avr#   r#   r$   
<dictcomp>R  s   z!RunTree.patch.<locals>.<dictcomp>c                 s  s    | ]}| d dkr|V  qdS )r(   r   N)rY   )r   evr#   r#   r$   	<genexpr>Y  s   z RunTree.patch.<locals>.<genexpr>Nc                   s"   i | ]\}}| d  vr||qS )rx   r#   r   uploadedr#   r$   r   a  s   z'Error filtering attachments to upload: )r(   r   rs   rW   r|   r6   r   r}   rE   rF   rA   r   r?   rX   )r}   r   rX   itemsnextrA   	ExceptionloggerwarningrU   
update_runr(   r*   rs   r   rW   r|   r6   r   rE   rF   r   r?   )rd   rX   er#   r   r$   patchN  sF    

&zRunTree.patchc                 C  s   dS )z"Wait for all _futures to complete.Nr#   rc   r#   r#   r$   waity  s    zRunTree.waitc                 C  s   | j j| dS )zReturn the URL of the run.)r   )rU   get_run_urlrc   r#   r#   r$   get_url}  s    zRunTree.get_urlr   )rE   r   r!   c                 K  s    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)r\   rE   r   headersr#   r#   r$   from_dotted_order  s    zRunTree.from_dotted_orderzOptional[dict])configr   r!   c              
     s  z0ddl m}m} ddlm}m} ddlm  W n. ty^ } ztd|W Y d}~n
d}~0 0 |du r|t	|t
r~t||nd}n
t||}|d }	rt	|	||fr|	jrt fdd	|	jD d }
r|
jt|	j }r|jr|j}|j|d
< |j|d< |j|d< |j|d< |j|d< tt|jpJg |dg  |d< |j|d< |di }|di }||j n0t|
dr|	j|
j v r|
j |	j d }ndS |
j!|d< |
j"|d< t#j$|fi |S dS )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  s   | ]}t | r|V  qd S r"   )rk   )r   tr   r#   r$   r     r1   z/RunTree.from_runnable_config.<locals>.<genexpr>r-   rs   rW   r2   r}   r   r(   r?   r   	order_map   rU   r9   )% langchain_core.callbacks.managerr   r   langchain_core.runnablesr   r    langchain_core.tracers.langchainr   ImportErrorrk   rQ   r   rY   r6   r   handlersrun_mapr'   rE   r-   rs   rW   r2   r}   sortedr   r   r(   r[   rn   r   hasattrr   rU   r9   r&   r   )r\   r   r   r   r   r   r   r   Zconfig_cbtracerr   rE   Zextra_ro   r#   r   r$   from_runnable_config  sZ    
 




$


zRunTree.from_runnable_configz-Mapping[Union[str, bytes], Union[str, bytes]])r   r   r!   c                 K  s  |  }ttt |t}|sFttt |t}|s<dS |d}|	 }t
|}|d d }||d< |d d |d< ||d< t|d	kr|d
 d |d< |dpttj|d< |dpd|d< |dpd|d< t|}	|	js|	jrr|di |d< |d di |d d< i |	j|d d }
|
|d d< tt|	j|dg  }||d< |	jrr|	j|d< tf 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   rF   rT   r*   rE      r6   r2   r-   r+   r(   parentr?   r   r   r9   )r   r   r	   r'   rY   r   bytesLANGSMITH_DOTTED_ORDER_BYTESdecoder_   _parse_dotted_orderlenr   r.   r   r/   _Baggager   r   r   r[   r   r   r9   r&   )r\   r   r   	init_argsZlangsmith_traceZlangsmith_trace_bytesZparent_dotted_orderZparsed_dotted_orderrF   baggager   r   r#   r#   r$   r     sF    


zRunTree.from_headerszDict[str, str]c                 C  sB   i }| j r| j|t < t| jdi | j| jd}| |d< |S )z.Return the RunTree as a dictionary of headers.r   r   r   r9   r   )	rF   rE   r   r   r?   rY   r   r;   	to_header)rd   r   r   r#   r#   r$   
to_headers  s    zRunTree.to_headersc              	   C  s&   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-   rE   rc   r#   r#   r$   __repr__  s    zRunTree.__repr__)r+   )T)2rI   rJ   rK   rL   __annotations__r   r   r*   r-   r2   r4   listr7   r;   r>   rQ   r?   r   rA   rB   rE   rF   rG   rO   r   r]   ra   propertyrU   rV   rf   rm   rp   rr   rt   r{   r   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__r#   r#   rh   r$   r&   2   s   
#' ,)+@8r&   c                   @  sZ   e Zd ZdZdddddddZedd d	d
dZedd dddZddddZdS )r   zBaggage header information.NzOptional[Dict[str, str]]r@   r~   r   c                 C  s   |pi | _ |pg | _|| _dS )zInitialize the Baggage object.Nr   )rd   r   r   r9   r#   r#   r$   __init__#  s    

z_Baggage.__init__)header_valuer!   c           	   
   C  s   |s
|  S i }g }d}zp| dD ]`}| dd\}}|tkrRttj|}q"|tkrntj| d}q"|tkr"tj|}q"W n4 t	y } zt
d|  W Y d}~n
d}~0 0 | |||dS )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   )	r\   r   r   r   r9   itemkeyrg   r   r#   r#   r$   from_header.  s"    &z_Baggage.from_headerzMapping[Union[str, bytes], Any])r   r!   c                 C  sF   d|v r|  |d S d|v r8|  tt|d dS |  d S d S )Nr   s   baggager   )r   r   r   r   )r\   r   r#   r#   r$   r   D  s
    z_Baggage.from_headersr'   rb   c                 C  s   g }| j r0t| j }|t dtj|  | jr^d| j}|t dtj|  | j	r|t dtj| j	  d|S )z,Return the Baggage object as a header value.z	metadata=r   ztags=zproject=)
r   r   ry   LANGSMITH_PREFIXr   r   quoter   joinr9   )rd   r   Zserialized_metadataZserialized_tagsr#   r#   r$   r   M  s     
z_Baggage.to_header)NNN)	rI   rJ   rK   rL   r   r   r   r   r   r#   r#   r#   r$   r      s      r   r'   zList[Tuple[datetime, UUID]])rE   r!   c                 C  s   |  d}dd |D S )zParse the dotted order string.r^   c                 S  s0   g | ](}t |d d dt|dd  fqS )Ni%Y%m%dT%H%M%S%fZ)r   strptimer   )r   partr#   r#   r$   r   d  s   z'_parse_dotted_order.<locals>.<listcomp>)r   )rE   partsr#   r#   r$   r   a  s    
r   r   r=   )r2   r   r!   c                 C  s,   | pt tj}|pt }|dt| S )z Create the current dotted order.r   )r   r.   r   r/   r   strftimer'   )r2   r   stid_r#   r#   r$   r`   j  s    
r`   )=rL   
__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   	getLoggerrI   r   r   internr   encoder   r   r   r   r   r   LockZ_LOCKr%   RunBaser&   r   r   r`   r5   r#   r#   r#   r$   <module>   sD   ,

   qA		