a
    `g=>                     @  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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rd dl(m)Z) e*dZ+ej,e d dZ-ej.G dd dZ/d:dddddddZ0d;ddddddd Z1ddddd!d"d#d$Z2d%d&d'd(Z3d)d*d+d,d-Z4d.d!d/d0d1Z5d<d.d3d!d4d5d6Z6d.dd!d7d8d9Z7dS )=    )annotationsN)	cpu_count)EmptyQueue)TYPE_CHECKINGListOptionalTuple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)Clientzlangsmith.client   )max_workersc                   @  sX   e Zd ZU dZded< ded< dZddddd	d
Zd ddddZdd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priorityz:Union[SerializedRunOperation, SerializedFeedbackOperation]itemr   r   None)r   r   returnc                 C  s   || _ || _d S Nr   )selfr   r    r"   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langsmith/_internal/_background_thread.py__init__<   s    zTracingQueueItem.__init__bool)otherr   c                 C  s   | j | jjf|j |jjfk S r    )r   r   	__class__r!   r&   r"   r"   r#   __lt__D   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__J   s    
zTracingQueueItem.__eq__N)	__name__
__module____qualname____doc____annotations__	__slots__r$   r)   r,   r"   r"   r"   r#   r   -   s   
r   d   Tr   intr%   zList[TracingQueueItem])tracing_queuelimitblockr   c                 C  sl   g }zP| j |dd }r"|| | j |dd }rR|| |r"t||kr"qRq"W n tyf   Y n0 |S )Ng      ?)r7   timeout皙?)getappendlenr   )r5   r6   r7   
next_batchr   r"   r"   r#   _tracing_thread_drain_queueQ   s    

r>     @r   z
int | Nonez6Tuple[Optional[io.BytesIO], Optional[Tuple[int, int]]])client
size_limitsize_limit_bytesr   c                 C  s  | j d u rdS | j j | j j  | j j }| j j}|d urV|dkrVtd| |d urt|dk rttd| |d u s||k r|d u s| j j|k rW d    dS | j j	dt
 d  | j j  | j j}||f}| j   W d    n1 s0    Y  |d ||fS )N)NNr   z!size_limit must be positive; got z*size_limit_bytes must be nonnegative; got z--z--
)compressed_traceslockZcompressor_writerflushbuffertelluncompressed_size
ValueErrorZtrace_countwriter   encodecloseresetseek)r@   rA   rB   Zcurrent_sizeZpre_compressed_sizeZfilled_buffercompressed_traces_infor"   r"   r#   '_tracing_thread_drain_compressed_bufferf   s6    


(
rP   r   )r@   r5   batchuse_multipartr   c              	   C  s   zzdt dd |D }|r&| | n>tdd |D rPtd dd |D }| ttt | W n  t	y   tj
ddd	 Y n0 W |D ]}|  qn|D ]}|  q0 d S )
Nc                 S  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   rS   opr"   r"   r#   	<genexpr>   rU   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"   rV   rW   r"   r"   r#   rT      s   zError in tracing queueTexc_info)r   Z_multipart_ingest_opsanyloggerwarnZ_batch_ingest_run_opsr   r   r   	Exceptionerror	task_done)r@   r5   rQ   rR   ops_r"   r"   r#   _tracing_thread_handle_batch   s&    rd   zOptional[int]r   c                  C  sF   t d} | d urBz
t| W S  ty@   td|  d Y n0 d S )NZBATCH_INGEST_SIZE_LIMITz+Invalid value for BATCH_INGEST_SIZE_LIMIT: z, continuing with default)ls_utilsget_env_varr4   rI   r]   warning)Zsize_limit_strr"   r"   r#   get_size_limit_from_env   s    


ri   zls_schemas.LangSmithInfozls_schemas.BatchIngestConfig)infor   c                 C  sf   t jdd dtttd}| s|S z,| js,|W S t }|d urD|| jd< | jW S  ty`   | Y S 0 d S )NFr3   )use_multipart_endpointrB   rA   scale_up_nthreads_limitscale_up_qsize_triggerscale_down_nempty_triggerrA   )
ls_schemasZBatchIngestConfigr   r   r   batch_ingest_configri   BaseException)rj   Zdefault_configZenv_size_limitr"   r"   r#   _ensure_ingest_config   s&    
rr   zweakref.ref[Client])
client_refr   c                   s  |    d u rd S  j }|d us$J t j}|d }|d }|d }|dd}g dtd}t|s|rΈ jjp|i ddst	d	 n<t
  _t  _t  _tjtt fd
  d7 dd fdd}| rnD ]}	|	 s|	 qt|k rN| |krNtjtt |fd
}
|
 |
  t||d }rt ||| qt||dd }rt ||| qnd S )NrA   rl   rm   rk   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%   re   c                     sP    rt  dr jrdS t  s(dS t tdrHt t kS dS d S )N_manual_cleanupFgetrefcountT)hasattrrw   	threadingmain_threadis_alivesysrx   r<   r"   r@   num_known_refsZsub_threadsr"   r#   keep_thread_active   s    
z7tracing_control_thread_func.<locals>.keep_thread_activer6   r6   r7   )r5   rr   rj   r:   rf   rg   Z	is_truishZinstance_flagsr]   rh   set_futuresr   rC   rz   Event_data_available_eventThread-tracing_control_thread_func_compress_parallelweakrefrefstartr|   remover<   qsize_tracing_sub_thread_funcr;   r>   rd   )rs   r5   rp   rA   rl   rm   rR   Zdisable_compressionr   threadZ
new_threadr=   r"   r~   r#   tracing_control_thread_func   sf    







r         ?float)rs   flush_intervalr   c                   s   |    d u rd S  j d u s0 jd u s0 jd u r>td d S t j}|d }|dd}ddd fdd	}t	 } jj
d
d}| sqz|r j  t ||\}}	|d urz t j||	}
 j|
 W n ty    ||	 Y n0 t	 }q|t	 | |kr|t ddd\}}	|d urpzt
t j||	g W n  tyn    ||	 Y n0 t	 }q|z^t ddd\}}	|d urzt
t j||	g W n  ty    ||	 Y n0 W n" ty   tjddd Y n0 d S )Nz/Required compression attributes not initializedrA   rB   r?   r   r%   re   c                    sd    rt  dr jrdS t  s(dS t tdr\tj} tdd | D }t	 | kS dS d S )Nrw   Frx   c                 s  s"   | ]}|d ur|  rdV  qd S )Nrv   )r|   )rS   r   r"   r"   r#   rY   G  s   z\tracing_control_thread_func_compress_parallel.<locals>.keep_thread_active.<locals>.<genexpr>T)
ry   rw   rz   r{   r|   r}   HTTP_REQUEST_THREAD_POOL_threadssumrx   )Zthread_poolactive_countr@   r   r"   r#   r   8  s    
zItracing_control_thread_func_compress_parallel.<locals>.keep_thread_activer9   )r8   rv   )rA   rB   zError in final cleanupTrZ   )rC   r   r   r]   r`   rr   rj   r:   time	monotonicwaitclearrP   r   submitZ_send_compressed_multipart_reqaddRuntimeErrorcfr_   )rs   r   rp   rA   rB   r   Zlast_flush_timeZ	triggeredZdata_streamrO   futureZfinal_data_streamr"   r   r#   r   $  s    





	


	r   )rs   rR   r   c           	   
   C  s   |  }|d u rd S z|j s W d S W n2 tyT } ztd| W Y d }~d S d }~0 0 |j}|d ushJ t|j }|dd}d}t 	 r||d krt
||d }rd}t|||| q|d7 }qt
||dd	 }rt|||| qd S )
Nz#Error in tracing control thread: %srA   r3   r   rn   r   rv   Fr   )rj   rq   r]   debugr5   rr   r:   rz   r{   r|   r>   rd   )	rs   rR   r@   er5   rp   rA   Zseen_successive_empty_queuesr=   r"   r"   r#   r     s<    




r   )r3   T)r3   r?   )r   )8
__future__r   concurrent.futuresfuturesr   	functoolsiologgingr}   rz   r   r   multiprocessingr   queuer   r   typingr   r   r   r	   r
   r   Z	langsmithr   ro   r   rf   Z&langsmith._internal._compressed_tracesr   Zlangsmith._internal._constantsr   r   r   r   Zlangsmith._internal._operationsr   r   r   Zlangsmith.clientr   	getLoggerr]   ThreadPoolExecutorr   total_orderingr   r>   rP   rd   ri   rr   r   r   r   r"   r"   r"   r#   <module>   sD    	
$  'S  