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#   a/var/www/html/cobodadashboardai.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   Zget_tracer_projectr#   r#   r#   r$   r0   ?   r1   project_name)r)   aliassession_nameZ
project_id)r,   r9   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__Zarbitrary_types_allowedZallow_population_by_field_namer=   r#   r#   r#   r$   ConfigQ   s   rK   )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clientr@   _clientr4   r6   rD   r=   r?   r   outputsattachments)getpopr*   r   rD   r   rM   
setdefault)clsrN   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.rC   r2   r*   r4   .)rU   strip_create_current_dotted_orderrC   )rX   rN   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)r@   r%   selfr#   r#   r$   rQ      s    
zRunTree.clientr   c                 C  s   | j S r"   )r@   r_   r#   r#   r$   rR      s    zRunTree._clientc                   s"   |dkr|| _ nt ||S dS )zSet the _client specially.rR   N)r@   super__setattr__)r`   r(   value	__class__r#   r$   rb      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)r`   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   rM   rW   update)r`   r   	metadata_r#   r#   r$   add_metadata   s    
zRunTree.add_metadata)rS   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)rS   rj   )r`   rS   r#   r#   r$   add_outputs   s    	
zRunTree.add_outputs)inputsr!   c                 C  s    | j du ri | _ | j | dS rm   )ro   rj   )r`   ro   r#   r#   r$   
add_inputs   s    	
zRunTree.add_inputszTUnion[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent], Sequence[dict], dict, str])r?   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)r?   rg   rM   appendr'   r   r.   r   r/   	isoformatrh   )r`   r?   r#   r#   r$   	add_event   s    


zRunTree.add_event)rS   errorend_timer?   r   zOptional[Dict]Optional[str]Optional[datetime]z'Optional[Sequence[ls_schemas.RunEvent]]zOptional[Dict[str, Any]])rS   rx   ry   r?   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/   ry   rS   rj   rx   rw   rl   )r`   rS   rx   ry   r?   r   r#   r#   r$   end   s    

zRunTree.end)run_idrO   ro   rS   rx   reference_example_idr2   ry   r   r=   rT   r   zOptional[ID_TYPE]z Optional[ls_schemas.Attachments])r(   r-   r}   rO   ro   rS   rx   r~   r2   ry   r   r=   rT   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*   rO   ro   rS   rx   r-   r~   r2   ry   r=   r4   r8   r@   r   rT   rE   )r&   r   r   r.   r   r/   r:   r@   rE   r7   ru   )r`   r(   r-   r}   rO   ro   rS   rx   r~   r2   ry   r   r=   rT   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>   r7   rS   ro   T)r3   Zexclude_nonero   rS   )rM   ro   copyrS   )r`   Z	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.rT   c                 S  s   g | ]}t |qS r#   )r'   ).0r(   r#   r#   r$   
<listcomp>B  r1   z RunTree.post.<locals>.<listcomp>uploaded_attachmentrr   F)r   N)r   rQ   Z
create_runrU   r?   ru   r   r.   r   r/   rv   setr7   post)r`   r   kwargsrT   keysZ	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#   )rg   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)rU   )r   Zevr#   r#   r$   	<genexpr>Y  s   z RunTree.patch.<locals>.<genexpr>Nc                   s"   i | ]\}}| d  vr||qS )rt   r#   r   Zuploadedr#   r$   r   a  s   z'Error filtering attachments to upload: )r(   r}   ro   rS   rx   r6   r~   ry   rC   rD   r?   r   r=   rT   )ry   r|   rT   itemsnextr?   	ExceptionloggerwarningrQ   Z
update_runr(   r*   ro   r   rS   rx   r6   r~   rC   rD   r   r=   )r`   rT   er#   r   r$   patchN  sF    

&zRunTree.patchc                 C  s   dS )z"Wait for all _futures to complete.Nr#   r_   r#   r#   r$   waity  s    zRunTree.waitc                 C  s   | j j| dS )zReturn the URL of the run.)r   )rQ   Zget_run_urlr_   r#   r#   r$   get_url}  s    zRunTree.get_urlr   )rC   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)rX   rC   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"   )rg   )r   tr   r#   r$   r     r1   z/RunTree.from_runnable_config.<locals>.<genexpr>r-   ro   rS   r2   ry   r   r(   r=   r   	order_map   rQ   r8   )%Z langchain_core.callbacks.managerr   r   Zlangchain_core.runnablesr   r   Z langchain_core.tracers.langchainr   ImportErrorrg   rM   r   rU   r6   r   handlersZrun_mapr'   rC   r-   ro   rS   r2   ry   sortedr   r   r(   rW   rj   r   hasattrr   rQ   r8   r&   r   )rX   r   r   r   r   r   r   r   Zconfig_cbZtracerr   rC   Zextra_rk   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   rD   rP   r*   rC      r6   r2   r-   r+   r(   parentr=   r   r   r8   )r   r   r	   r'   rU   r   bytesLANGSMITH_DOTTED_ORDER_BYTESdecoder[   _parse_dotted_orderlenr   r.   r   r/   _Baggager   r   r   rW   r   r   r8   r&   )rX   r   r   Z	init_argsZlangsmith_traceZlangsmith_trace_bytesZparent_dotted_orderZparsed_dotted_orderrD   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   r8   r   )	rD   rC   r   r   r=   rU   r   r:   	to_header)r`   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-   rC   r_   r#   r#   r$   __repr__  s    zRunTree.__repr__)r+   )T)2rG   rH   rI   rJ   __annotations__r   r   r*   r-   r2   r4   listr7   r:   r<   rM   r=   r   r?   r@   rC   rD   rE   rK   r   rY   r]   propertyrQ   rR   rb   ri   rl   rn   rp   rw   r|   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__r#   r#   rd   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>   rz   r   c                 C  s   |pi | _ |pg | _|| _dS )zInitialize the Baggage object.Nr   )r`   r   r   r8   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   )	rX   r   r   r   r8   itemkeyrc   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   )rX   r   r#   r#   r$   r   D  s
    z_Baggage.from_headersr'   r^   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   ru   LANGSMITH_PREFIXr   r   quoter   joinr8   )r`   r   Zserialized_metadataZserialized_tagsr#   r#   r$   r   M  s     
z_Baggage.to_header)NNN)	rG   rH   rI   rJ   r   r   r   r   r   r#   r#   r#   r$   r      s      r   r'   zList[Tuple[datetime, UUID]])rC   r!   c                 C  s   |  d}dd |D S )zParse the dotted order string.rZ   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   )rC   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}   stZid_r#   r#   r$   r\   j  s    
r\   )=rJ   
__future__r   r   loggingsysr   r   typingr   r   r   r   r	   r
   r   r   r   uuidr   r   Zpydantic.v1r   r   r   Zpydantic	threadingurllib.parser   Z	langsmithr   Z
ls_schemasr   Zlangsmith.clientr   r   r   r   r   	getLoggerrG   r   r   internr   encoder   r   r   r   r   r   LockZ_LOCKr%   ZRunBaser&   r   r   r\   r5   r#   r#   r#   r$   <module>   sD   ,

   qA		