o
    ZhO                     @  s  d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dl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 d dlmZ d dlmZ d d	lmZmZm Z m!Z! d d
l"m#Z#m$Z$m%Z% erxd dl&m'Z' d dl(m)Z) e*dZ+ej,e d dZ-ej.G dd dZ/	dAdBddZ0	dCdDd%d&Z1dEd*d+Z2dFd,d-Z3dGd/d0Z4dHd4d5Z5dId8d9Z6	:dJdKd=d>Z7dLd?d@Z8dS )M    )annotationsN)	cpu_count)EmptyQueue)TYPE_CHECKINGOptionalUnioncast)schemas)utils)CompressedTraces)_AUTO_SCALE_DOWN_NEMPTY_TRIGGER_AUTO_SCALE_UP_NTHREADS_LIMIT_AUTO_SCALE_UP_QSIZE_TRIGGER	_BOUNDARY)SerializedFeedbackOperationSerializedRunOperation#combine_serialized_queue_operations)Context)Clientzlangsmith.client   )max_workersc                   @  sP   e Zd ZU dZded< ded< ded< dZ		ddddZdddZdddZd	S )TracingQueueItemzAn item in the tracing queue.

    Attributes:
        priority (str): The priority of the item.
        action (str): The action associated with the item.
        item (Any): The item itself.
    strpriority:Union[SerializedRunOperation, SerializedFeedbackOperation]itemOptional[Context]otel_contextr   r   r   NreturnNonec                 C  s   || _ || _|| _d S Nr   )selfr   r   r    r$   ]/var/www/html/lang_env/lib/python3.10/site-packages/langsmith/_internal/_background_thread.py__init__=   s   
zTracingQueueItem.__init__otherboolc                 C  s   | j | jjf|j |jjfk S r"   )r   r   	__class__r#   r'   r$   r$   r%   __lt__G   s   zTracingQueueItem.__lt__objectc                 C  s&   t |to| j| jjf|j|jjfkS r"   )
isinstancer   r   r   r)   r*   r$   r$   r%   __eq__M   s   
zTracingQueueItem.__eq__r"   )r   r   r   r   r   r   r    r!   )r'   r   r    r(   )r'   r,   r    r(   )	__name__
__module____qualname____doc____annotations__	__slots__r&   r+   r.   r$   r$   r$   r%   r   -   s   
 

r   d   Ttracing_queuer   limitintblockr(   r    list[TracingQueueItem]c                 C  s   g }z6| j |dd }r|| | j |dd }r6|| |r*t||kr*W |S | j |dd }sW |S W |S  tyB   Y |S w )Ng      ?)r9   timeout皙?)getappendlenr   )r6   r7   r9   
next_batchr   r$   r$   r%   _tracing_thread_drain_queueT   s"   

rA     @clientr   
size_limitsize_limit_bytes
int | None6tuple[Optional[io.BytesIO], Optional[tuple[int, int]]]c                 C  sN  z| j d u r	W dS | j jw | j j  | j j }| j j}|d ur-|dkr-td| |d ur<|dk r<td| |d u sD||k rX|d u sN| j j|k rX	 W d    W dS | j j	dt
 d  | j j  | j j}| j j|_||f}| j   W d    n1 sw   Y  |d ||fW S  ty   tjddd	 Y dS w )
N)NNr   z!size_limit must be positive; got z*size_limit_bytes must be nonnegative; got z--z--
uLangSmith tracing error: Failed to submit trace data.
This does not affect your application's runtime.
Error details:Texc_info)compressed_traceslockZcompressor_writerflushbuffertelluncompressed_size
ValueErrorZtrace_countwriter   encodeclose_contextcontextresetseek	Exceptionloggererror)rC   rD   rE   Zcurrent_sizeZpre_compressed_sizeZfilled_buffercompressed_traces_infor$   r$   r%   '_tracing_thread_drain_compressed_bufferi   sF   




r]   batchuse_multipartr!   c              	   C  s   zOz2t dd |D }|r| | ntdd |D r(td dd |D }| ttt | W n t	yC   tj
ddd	 Y nw W |D ]}|  qGd S |D ]}|  qRw )
Nc                 S     g | ]}|j qS r$   r   .0r   r$   r$   r%   
<listcomp>       z0_tracing_thread_handle_batch.<locals>.<listcomp>c                 s  s    | ]}t |tV  qd S r"   r-   r   rc   opr$   r$   r%   	<genexpr>   s    z/_tracing_thread_handle_batch.<locals>.<genexpr>z;Feedback operations are not supported in non-multipart modec                 S  s   g | ]	}t |ts|qS r$   rf   rg   r$   r$   r%   rd      s
    
rH   TrI   )r   Z_multipart_ingest_opsanyrZ   warnZ_batch_ingest_run_opsr	   listr   rY   r[   	task_done)rC   r6   r^   r_   ops_r$   r$   r%   _tracing_thread_handle_batch   s4   

rp   c              	   C  s   zJz-t dd |D }dd |D }dd |D }|r-| jdur(| j|| ntd W n ty>   tjdd	d
 Y nw W |D ]}|  qBdS |D ]}|  qMw )z@Handle a batch of tracing queue items by exporting them to OTEL.c                 S  r`   r$   ra   rb   r$   r$   r%   rd      re   z5_otel_tracing_thread_handle_batch.<locals>.<listcomp>c                 S  s   g | ]	}t |tr|qS r$   )r-   r   rg   r$   r$   r%   rd      s    c                 S  s$   i | ]}t |jtr|jj|jqS r$   )r-   r   r   idr   rb   r$   r$   r%   
<dictcomp>   s    

z5_otel_tracing_thread_handle_batch.<locals>.<dictcomp>NzLangSmith tracing error: Failed to submit OTEL trace data.
This does not affect your application's runtime.
Error details: client.otel_exporter is NonezzLangSmith tracing error: Failed to submit OTEL trace data.
This does not affect your application's runtime.
Error details:TrI   )r   otel_exporterZexport_batchrZ   r[   rY   rm   )rC   r6   r^   rn   Zrun_opsZotel_context_mapro   r$   r$   r%   !_otel_tracing_thread_handle_batch   s2   



rt   Optional[int]c                  C  sH   t d} | d ur"zt| W S  ty!   td|  d Y d S w d S )NZBATCH_INGEST_SIZE_LIMITz+Invalid value for BATCH_INGEST_SIZE_LIMIT: z, continuing with default)ls_utilsget_env_varr8   rQ   rZ   warning)Zsize_limit_strr$   r$   r%   get_size_limit_from_env   s   

ry   infols_schemas.LangSmithInfols_schemas.BatchIngestConfigc                 C  sb   t jdd dtttd}| s|S z| js|W S t }|d ur"|| jd< | jW S  ty0   | Y S w )NFr5   )use_multipart_endpointrE   rD   scale_up_nthreads_limitscale_up_qsize_triggerscale_down_nempty_triggerrD   )
ls_schemasZBatchIngestConfigr   r   r   batch_ingest_configry   BaseException)rz   Zdefault_configZenv_size_limitr$   r$   r%   _ensure_ingest_config   s(   
r   
client_refweakref.ref[Client]c                   s  |    d u r	d S  j }|d usJ t j}|d }|d }|d }|dd}g dttdp9 jd u}|sm|rm jjpCi ddsNt	
d	 nt  _t  _t  _tjtt fd
  d7 d fdd}| rƈD ]}	|	 s|	 q{t|k r| |krtjtt |fd
}
|
 |
  t||d }rÈ jd urt || nt ||| | syt||dd }r jd urt || nt ||| t||dd }st	 d d S )NrD   r~   r   r}   Fr   ZDISABLE_RUN_COMPRESSIONZzstd_compression_enabledz~Run compression is not enabled. Please update to the latest version of LangSmith. Falling back to regular multipart ingestion.)targetargs   r    r(   c                    sr    r
t  dr jrtd dS t  std dS t tdr7t t	 k} | s5td | S dS )N_manual_cleanupz3Client is being cleaned up, stopping tracing threadFz,Main thread is dead, stopping tracing threadgetrefcountzeClient refs count indicates we're the only remaining reference to the client, stopping tracing threadT)
hasattrr   rZ   debug	threadingmain_threadis_alivesysr   r?   Zshould_keep_threadrC   num_known_refsZsub_threadsr$   r%   keep_thread_active6  s(   


z7tracing_control_thread_func.<locals>.keep_thread_activer7   r7   r9   z'Tracing control thread is shutting downr    r(   )!r6   r   rz   r=   rv   Z	is_truishrw   rs   Zinstance_flagsrZ   rx   weakrefWeakSet_futuresr   rK   r   Event_data_available_eventThread-tracing_control_thread_func_compress_parallelrefstartr   remover?   qsize_tracing_sub_thread_funcr>   rA   rt   rp   r   )r   r6   r   rD   r~   r   r_   Zdisable_compressionr   threadZ
new_threadr@   r$   r   r%   tracing_control_thread_func  s   









	r         ?flush_intervalfloatc                   s  |    d u r	d S  j d u s jd u s jd u rtd d S t j}|d }|dd}dd fdd	}t	 }	  jj
dd}| sHnp|r j  t ||\}}	|d ur{zt j||	}
 j|
 W n tyz    ||	 Y nw t	 }n7t	 | |krt ddd\}}	|d urzt
t j||	g W n ty    ||	 Y nw t	 }q=z-t ddd\}}	|d urzt
t j||	g W n ty    ||	 Y nw W n ty   tjdd
d Y nw td d S )NzLangSmith tracing error: Required compression attributes not initialized.
This may affect trace submission but does not impact your application's runtime.rD   rE   rB      r    r(   c                    sj    r
t  dr jrtd dS t  std dS t tdr3t k} | s1td | S dS )Nr   z7Client is being cleaned up, stopping compression threadFz0Main thread is dead, stopping compression threadr   ziClient refs count indicates we're the only remaining reference to the client, stopping compression threadT)	r   r   rZ   r   r   r   r   r   r   r   rC   r   r$   r%   r     s$   


zItracing_control_thread_func_compress_parallel.<locals>.keep_thread_activeTr<   )r;   r   )rD   rE   zuLangSmith tracing error: Failed during final cleanup.
This does not affect your application's runtime.
Error details:rI   z1Compressed traces control thread is shutting downr   )rK   r   r   rZ   r[   r   rz   r=   time	monotonicwaitclearr]   HTTP_REQUEST_THREAD_POOLZsubmitZ_send_compressed_multipart_reqaddRuntimeErrorcfrY   r   )r   r   r   rD   rE   r   Zlast_flush_timeZ	triggeredZdata_streamr\   futureZfinal_data_streamr$   r   r%   r   w  s   





	6	
r   c           	   
   C  sN  |  }|d u r	d S z|j sW d S W n ty* } ztd| W Y d }~d S d }~ww |j}|d us4J t|j }|dd}d}t 	 r{||d kr{t
||d }rkd}|jd urct||| nt|||| n|d7 }t 	 r{||d ksMt
||dd	 }r|jd urt||| nt|||| t
||dd	 }std
 d S )Nz#Error in tracing control thread: %srD   r5   r   r   r   r   Fr   z+Tracing control sub-thread is shutting down)rz   r   rZ   r   r6   r   r=   r   r   r   rA   rs   rt   rp   )	r   r_   rC   er6   r   rD   Zseen_successive_empty_queuesr@   r$   r$   r%   r     s^   






	r   )r5   T)r6   r   r7   r8   r9   r(   r    r:   )r5   rB   )rC   r   rD   r8   rE   rF   r    rG   )
rC   r   r6   r   r^   r:   r_   r(   r    r!   )rC   r   r6   r   r^   r:   r    r!   )r    ru   )rz   r{   r    r|   )r   r   r    r!   )r   )r   r   r   r   r    r!   )r   r   r_   r(   r    r!   )9
__future__r   concurrent.futuresZfuturesr   	functoolsiologgingr   r   r   r   multiprocessingr   queuer   r   typingr   r   r   r	   Z	langsmithr
   r   r   rv   Z&langsmith._internal._compressed_tracesr   Zlangsmith._internal._constantsr   r   r   r   Zlangsmith._internal._operationsr   r   r   Zopentelemetry.context.contextr   Zlangsmith.clientr   	getLoggerrZ   ZThreadPoolExecutorr   total_orderingr   rA   r]   rp   rt   ry   r   r   r   r   r$   r$   r$   r%   <module>   sJ    
'
3
#
(

j 