o
    Zh-u                     @  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
 ddlmZmZmZmZ ddlmZmZmZmZ z
ddlmZmZ W n eyX   ddlmZmZ Y nw ddl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(e)Z*dZ+e,e+ dZ-e-.dZ/e,e+ dZ0e,e+ dZ1e,e+ dZ2e,dZ3ede4 Z5da6de7d< e8 Z9ej:eee;e<ee= f    dddZ>d0ddZ?d1dd Z@G d!d" d"e jAZBG d#d$ d$ZCd2d(d)ZDd3d.d/ZEd"d"gZFdS )4zSchemas for the LangSmith API.    )annotationsN)MappingSequence)datetimetimezone)AnyOptionalUnioncast)NAMESPACE_DNSUUIDuuid4uuid5)Fieldroot_validator)schemas)utils)ID_TYPE
RUN_TYPE_TClient_dumps_json_ensure_uuidz
langsmith-traceutf-8metadatatagsprojectZ__omit_auto_outputsOptional[Client]_CLIENT	_REPLICASdefaultinit_kwargsr   returnr   c                  K  s"   t d u rt d u rtdi | a t S )N )r   r   )r"   r$   r$   J/var/www/html/lang_env/lib/python3.10/site-packages/langsmith/run_trees.pyget_cached_client3   s   r&   data!ls_schemas.ExtractedUsageMetadatac                 C  s.   h d}t |  | }|rtd| | S )z2Validate that the dict only contains allowed keys.>
   Zoutput_token_detailsZtotal_tokensZinput_tokensZinput_token_detailsZ
total_costZoutput_tokensZinput_cost_detailsZ
input_costZoutput_cost_detailsZoutput_costz#Unexpected keys in usage metadata: )setkeys
ValueError)r'   Zallowed_keysZ
extra_keysr$   r$   r%   !validate_extracted_usage_metadata;   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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d0d1d,Zd2ed3< edd4d,Zd5ed6< G d7d8 d8Zedd9dd<d=Zed0d9dd>d?ZeddAdBZeddDdEZ fdFdGZ e!e!e!e!e!dHddQdRZ"ddTdUZ#ddWdXZ$ddYdZZ%dd[d\Z&dd^d_Z'dddddd`ddgdhZ(	dddddddddddddiddqdrZ)dsdt Z*	dddvdwZ+dddzd{Z,d0d|dd~dZ-dddZ.dddZ/e0dddZ1e0dddZ2e0dddZ3dddZ4dd Z5  Z6S )RunTreez1Run Schema with back-references for posting runs.strname)default_factoryr   idchainr    run_typec                   C  s   t tjS N)r   nowr   utcr$   r$   r$   r%   <lambda>X       zRunTree.<lambda>r   
start_timeNT)r!   excludeOptional[RunTree]
parent_runOptional[str]parent_dotted_order__all__parent_run_id)r0   r:   zlist[RunTree]
child_runsc                   C  s   t  pdS )Nr!   )r   Zget_tracer_projectr$   r$   r$   r%   r7   a   r8   project_name)r0   aliassession_nameZ
project_id)r!   rC   Optional[UUID]
session_iddict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_filesystemz8Projects to replicate this run to with optional updates.z.Optional[Sequence[tuple[str, Optional[dict]]]]replicasc                   @  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_namerH   r$   r$   r$   r%   Configw   s
    rW   )prevaluesr#   c                 C  s  | ddu r-| ddur-d|d v r|d d |d< nd|d v r-|d d d |d< | ddu r8d|d< d|v rD|d|d< nd	|v rO|d	|d< | dsXd|d< |d
d}|durl|j|d< |j|d< d|vrut |d< d|vr|dur|j|d< n|d |d< tt|di  | ddu rg |d< | ddu rg |d< | ddu ri |d< | ddu ri |d< | ddu rt	  |d< |S )zAssign name to the run.r/   N
serializedr1   ZUnnamedclientrK   _clientr<   r@   r>   rO   rH   rJ   r   outputsattachmentsrQ   )
getpopr1   rN   r   rO   r
   rG   
setdefaultr   )clsrY   r<   r$   r$   r%   infer_defaults~   sF   



zRunTree.infer_defaultsc                 C  s^   | d}|r| r|S t|d |d }| d}|dur)|d | |d< |S ||d< |S )z#Ensure the dotted order of the run.rN   r9   r1   r>   N.)r`   strip_create_current_dotted_order)rc   rY   Zcurrent_dotted_orderr>   r$   r$   r%   ensure_dotted_order   s   

zRunTree.ensure_dotted_orderr   c                 C  s   | j du r	t | _ | j S )zReturn the client.N)rK   r&   selfr$   r$   r%   r\      s   
zRunTree.clientr   c                 C  s   | j S r4   )rK   ri   r$   r$   r%   r]      s   zRunTree._clientc                   s    |dkr	|| _ dS t ||S )zSet the _client specially.r]   N)rK   super__setattr__)rj   r/   value	__class__r$   r%   rl      s   
zRunTree.__setattr__)inputsr^   r   r   usage_metadatarp   Optional[Mapping[str, Any]]r^   Optional[Sequence[str]]r   rq   +Optional[ls_schemas.ExtractedUsageMetadata]Nonec                C  s   |t ur	t|| _|t ur| jdi |pi  |t ur/d| jd< |du r*i | _nt|| _|t urEd| jt< |du r@i | _	nt|| _	|t urVt
|| jdi d< dS dS )a  Set the inputs, outputs, tags, and metadata of the run.

        If performed, this will override the default behavior of the
        end() method to ignore new outputs (that would otherwise be added)
        by the @traceable decorator.

        If your LangChain or LangGraph versions are sufficiently up-to-date,
        this will also override the default behavior LangChainTracer.

        Args:
            inputs: The inputs to set.
            outputs: The outputs to set.
            tags: The tags to set.
            metadata: The metadata to set.
            usage_metadata: Usage information to set.

        Returns:
            None
        r   Finputs_is_truthyNTrq   )NOT_PROVIDEDlistr   rH   rb   updaterp   rG   OVERRIDE_OUTPUTSr^   r,   )rj   rp   r^   r   r   rq   r$   r$   r%   r)      s$   




zRunTree.setUnion[Sequence[str], str]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)rj   r   r$   r$   r%   add_tags   s
   

zRunTree.add_tagsdict[str, Any]c                 C  s2   | j du ri | _ tt| j di }|| dS )zAdd metadata to the run.Nr   )rH   r
   rG   rb   ry   )rj   r   	metadata_r$   r$   r%   add_metadata  s   
zRunTree.add_metadatac                 C  s    | j du ri | _ | j | dS )Upsert the given outputs into the run.

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

        Returns:
            None
        N)r^   ry   )rj   r^   r$   r$   r%   add_outputs  s   
	zRunTree.add_outputsc                 C  s*   | j du ri | _ | j | d| jd< dS )r   NFrv   )rp   ry   rH   )rj   rp   r$   r$   r%   
add_inputs  s   
	zRunTree.add_inputsTUnion[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent], Sequence[dict], dict, str]c                 C  sh   | j du rg | _ t|tr| j | dS t|tr,| j dttj	 |d dS | 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)rJ   r|   rG   appendr.   r   r5   r   r6   	isoformatr}   )rj   rJ   r$   r$   r%   	add_event+  s   


zRunTree.add_event)r^   errorend_timerJ   r   Optional[dict]r   r   Optional[datetime]'Optional[Sequence[ls_schemas.RunEvent]]Optional[dict[str, Any]]c                C  sz   |pt tj| _| jts |dur | js|| _n| j	| |dur'|| _
|dur0| | |dur;| | dS dS )z/Set the end time of the run and all child runs.N)r   r5   r   r6   r   rH   r`   rz   r^   ry   r   r   r   )rj   r^   r   r   rJ   r   r$   r$   r%   endO  s   

zRunTree.end)run_idrZ   rp   r^   r   reference_example_idr9   r   r   rH   r_   r   r   Optional[ID_TYPE]rZ   r   r_    Optional[ls_schemas.Attachments]c                C  s   |pd|i}t di d|dt|d|d|pi d|pi d|d|d|d	|	p/ttjd
|
d|p7i d| d| jd| jd| jd|d|p]i d| j	}| j
| |S d| j	}| j
| |S )z Add a child run to the run tree.r/   r1   rZ   rp   r^   r   r3   r   r9   r   rH   r<   rB   rQ   rK   r   r_   rP   Nr$   )r-   r   r   r5   r   r6   rD   rQ   rK   rP   rA   r   )rj   r/   r3   r   rZ   rp   r^   r   r   r9   r   r   rH   r_   Zserialized_runr$   r$   r%   create_childi  sd   	
zRunTree.create_childc                 C  sF   | j h ddd}| jd ur| j |d< | jd ur!| j |d< |S )N>   rA   rp   r^   T)r:   Zexclude_nonerp   r^   )rG   rp   copyr^   )rj   Z	self_dictr$   r$   r%   _get_dicts_safe  s   

zRunTree._get_dicts_safeupdatesc                 C  s6  |   }|d }tt| d| }|d}|r$tt| d| }nd}|d}|r8tt| d| }	nd}	|drt|d }
g }|
dd D ]\}}tt| d| }||dt|  qM|
d \}}||dt|  d	|}nd}t	
|}||||	||d
 |r|| |S )zDRewrites ids/dotted_order for a given project with optional updates.r1   :rO   Nr@   rN   r[   %Y%m%dT%H%M%S%fZre   )r1   rO   r@   rN   rD   )r   r   r   r`   _parse_dotted_orderr   strftimer.   joinr   Zdeepish_copyry   )rj   rB   r   run_dictZold_idZnew_idZ	old_traceZ	new_traceparentZ
new_parentZsegsZrebuilttsZseg_idreplZts_last_Zdotteddupr$   r$   r%   _remap_for_project  sB   



	
zRunTree._remap_for_projectexclude_child_runsboolc                 C  s   | j r%| j D ]\}}|| jkr|  }n| ||}| jjdi | qn|  }| jjdi | | jrOdd | jD }| jdt	
tj t|d |s]| jD ]
}|jdd qTdS dS )	z,Post the run tree to the API asynchronously.c                 S  s   g | ]}t |qS r$   )r.   ).0r/   r$   r$   r%   
<listcomp>  s    z RunTree.post.<locals>.<listcomp>uploaded_attachmentr   F)r   Nr$   )rQ   rD   r   r   r\   Z
create_runr_   rJ   r   r   r5   r   r6   r   r)   rA   post)rj   r   rB   r   r   kwargsr*   Z	child_runr$   r$   r%   r     s,   


zRunTree.post)exclude_inputsr   c                  s  | j s|   dd | j D }z|r,tdd | jD d  r, fdd| D }W n tyG } ztd|  W Y d}~nd}~ww | j	r| j	D ]S\}}|| j
kr\|  }n| ||}| jj|d |d	 |rodn|d
 |d |d|d|d|d|d|d|d|d|d|d|d qNdS | jj| j| j|rdn	| jr| j nd| jr| j nd| j| j| j
| j| j | j| j| j| j| j|d dS )zPatch the run tree to the API in a background thread.

        Args:
            exclude_inputs: whether to exclude inputs from the patch request.
        c                 S  s    i | ]\}}t |tr||qS r$   )r|   tupler   avr$   r$   r%   
<dictcomp>  s
    z!RunTree.patch.<locals>.<dictcomp>c                 s  s"    | ]}| d dkr|V  qdS )r/   r   N)r`   )r   Zevr$   r$   r%   	<genexpr>  s    z RunTree.patch.<locals>.<genexpr>Nc                   s"   i | ]\}}| d  vr||qS )r   r$   r   Zuploadedr$   r%   r     s
    z'Error filtering attachments to upload: r/   r1   rp   r^   r   r@   rD   r   r   rN   rO   rJ   r   rH   )r/   r   rp   r^   r   r@   rD   r   r   rN   rO   rJ   r   rH   r_   )r   r   r_   itemsnextrJ   	ExceptionloggerwarningrQ   rD   r   r   r\   Z
update_runr`   r/   r1   rp   r   r^   r   r@   r   rN   rO   r   rH   )rj   r   r_   erB   r   r   r$   r   r%   patch  s   



zRunTree.patchc                 C  s   dS )z"Wait for all _futures to complete.Nr$   ri   r$   r$   r%   wait4  s   zRunTree.waitc                 C  s   | j j| dS )zReturn the URL of the run.)r   )r\   Zget_run_urlri   r$   r$   r%   get_url8  s   zRunTree.get_urlr   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)rc   rN   r   headersr$   r$   r%   from_dotted_order<  s   zRunTree.from_dotted_orderconfigc              
     s  zddl m}m} ddlm}m} ddlm  W n ty) } ztd|d}~ww |du r=|t	|t
r9t||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pg |dg  |d< |j|d< |di }|di }||j nt|
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 r4   )r|   )r   tr   r$   r%   r   s  s    z/RunTree.from_runnable_config.<locals>.<genexpr>r3   rp   r^   r9   r   r   r/   rH   r   	order_map   r\   rB   )%Z langchain_core.callbacks.managerr   r   Zlangchain_core.runnablesr   r   Z langchain_core.tracers.langchainr   ImportErrorr|   rG   r
   r`   r@   r   handlersZrun_mapr.   rN   r3   rp   r^   r9   r   sortedr)   r   r/   rb   ry   r   hasattrr   r\   rB   r-   r   )rc   r   r   r   r   r   r   r   Zconfig_cbZtracerr   rN   Zextra_r   r$   r   r%   from_runnable_configL  s^   





"


zRunTree.from_runnable_configr   -Mapping[Union[str, bytes], Union[str, bytes]]c                 K  s|  |  }ttt |t}|s#ttt |t}|sdS |d}|	 }t
|}|d d }||d< |d d |d< ||d< t|d	krO|d
 d |d< |dpYttj|d< |dpbd|d< |dpkd|d< t|}	|	jsy|	jr|di |d< |d di |d d< i |	j|d d }
|
|d d< tt|	j|dg  }||d< |	jr|	j|d< t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   rO   r[   r1   rN      r@   r9   r3   r2   r/   r   rH   r   r   rB   r$   )r   r
   r   r.   r`   r   bytesLANGSMITH_DOTTED_ORDER_BYTESdecoderf   r   lenr   r5   r   r6   _Baggager   r   r   rb   r   r)   rB   r-   )rc   r   r   Z	init_argsZlangsmith_traceZlangsmith_trace_bytesr>   Zparsed_dotted_orderrO   baggager   r   r$   r$   r%   r     sF   


zRunTree.from_headers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   rB   r   )	rO   rN   r   r   rH   r`   r   rD   	to_header)rj   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'))r1   r/   r3   rN   ri   r$   r$   r%   __repr__  s   zRunTree.__repr__)rY   rG   r#   rG   )r#   r   )r#   r   )rp   rr   r^   rr   r   rs   r   rr   rq   rt   r#   ru   )r   r{   r#   ru   )r   r   r#   ru   )r^   r   r#   ru   )rp   r   r#   ru   )rJ   r   r#   ru   )r^   r   r   r=   r   r   rJ   r   r   r   r#   ru   )r2   )r/   r.   r3   r   r   r   rZ   r   rp   r   r^   r   r   r=   r   rE   r9   r   r   r   r   rI   rH   r   r_   r   r#   r-   r4   )rB   r.   r   r   r#   rG   )T)r   r   r#   ru   )r   r   r#   ru   )r#   ru   r#   r.   )rN   r.   r   r   r#   r-   )r   r   r   r   r#   r;   )r   r   r   r   r#   r;   )r#   r   )7rS   rT   rU   rV   __annotations__r   r   r1   r3   r9   r<   r>   rx   rA   rD   rF   rG   rH   r   rJ   rK   rN   rO   rP   rQ   rW   r   rd   rh   propertyr\   r]   rl   rw   r)   r~   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__r$   r$   rn   r%   r-   R   s   
 '
3



'*-
M
@
8r-   c                   @  sH   e Zd ZdZ			ddd	d
ZedddZedddZdddZdS )r   zBaggage header information.Nr   Optional[dict[str, str]]r   rI   rB   r=   c                 C  s   |pi | _ |pg | _|| _dS )zInitialize the Baggage object.Nr   )rj   r   r   rB   r$   r$   r%   __init__  s   


z_Baggage.__init__header_valuer#   c           	   
   C  s   |s|  S i }g }d}z8| dD ]0}| dd\}}|tkr)ttj|}q|tkr7tj| d}q|tkrAtj|}qW n t	y] } zt
d|  W Y d}~nd}~ww | |||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   )	rc   r   r   r   rB   itemkeyrm   r   r$   r$   r%   from_header  s*   z_Baggage.from_headerr   Mapping[Union[str, bytes], Any]c                 C  sB   d|v r|  |d S d|v r|  tt|d dS |  d S )Nr   s   baggager   )r   r
   r   r   )rc   r   r$   r$   r%   r     s
   
z_Baggage.from_headersr.   c                 C  s   g }| j rt| j }|t dtj|  | jr/d| j}|t dtj|  | j	rA|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   r   LANGSMITH_PREFIXr   r   quoter   r   rB   )rj   r   Zserialized_metadataZserialized_tagsr$   r$   r%   r     s    

z_Baggage.to_header)NNN)r   r   r   rI   rB   r=   )r   r=   r#   r   )r   r   r#   r   r   )	rS   rT   rU   rV   r   r   r   r   r   r$   r$   r$   r%   r     s    r   rN   r.   list[tuple[datetime, UUID]]c                 C  s   |  d}dd |D S )zParse the dotted order string.re   c                 S  s0   g | ]}t |d d dt|dd  fqS )Nir   )r   strptimer   )r   partr$   r$   r%   r     s    "z'_parse_dotted_order.<locals>.<listcomp>)r   )rN   partsr$   r$   r%   r     s   
r   r9   r   r   rE   c                 C  s,   | pt tj}|pt }|dt| S )z Create the current dotted order.r   )r   r5   r   r6   r   r   r.   )r9   r   stZid_r$   r$   r%   rg   %  s   
rg   )r"   r   r#   r   )r'   r(   r#   r(   )rN   r.   r#   r   )r9   r   r   rE   r#   r.   )GrV   
__future__r   r   loggingsyscollections.abcr   r   r   r   typingr   r   r	   r
   uuidr   r   r   r   Zpydantic.v1r   r   r   ZpydanticZcontextvars	threadingurllib.parser   Z	langsmithr   Z
ls_schemasr   Zlangsmith.clientr   r   r   r   r   	getLoggerrS   r   r   internr   encoder   r   r   r   rz   objectrw   r   r   LockZ_LOCKZ
ContextVarr   r.   rG   r   r&   r,   ZRunBaser-   r   r   rg   r?   r$   r$   r$   r%   <module>   s\    




     
A
		