o
    +ih:                     @  s  d dl m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	 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 d d
lmZ eeZG dd dZG dd dZ d0ddZ!d1ddZ"d2ddZ#d3d d!Z$d4d#d$Z%d5d)d*Z&d6d.d/Z'dS )7    )annotationsN)Iterable)BufferedReader)LiteralOptionalUnioncast)schemas)_orjson)CompressedTraces)MultipartPartMultipartPartsAndContext)
dumps_jsonc                   @  s   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< 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&d d!ZdS )'SerializedRunOperationLiteral['post', 'patch']	operation	uuid.UUIDidtrace_idbytes_noneOptional[bytes]inputsoutputseventsextraerror
serialized Optional[ls_schemas.Attachments]attachmentsr   r   r   r   r   r   r   r   r   r   r   NreturnNonec                 C  sF   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
d S Nr    )selfr   r   r   r   r   r   r   r   r   r   r    r%   \/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/langsmith/_internal/_operations.py__init__3   s   
zSerializedRunOperation.__init__intc                 C  s   d}| j r|t| j 7 }| jr|t| j7 }| jr |t| j7 }| jr*|t| j7 }| jr4|t| j7 }| jr>|t| j7 }| jrH|t| j7 }| jr`| j	 D ]\}}t
|tr_|t|7 }qP|S )3Calculate actual serialized size of this operation.r   )r   lenr   r   r   r   r   r   r   values
isinstancer   )r$   sizecontent_typedata_or_pathr%   r%   r&   calculate_serialized_sizeM   s*   
z0SerializedRunOperation.calculate_serialized_sizedictc                 C  s^   t | j}| jdurt | j|d< | jdur t | j|d< | jdur-t | j|d< |S )zFDeserialize the main run info (_none and extra, error and serialized).Nr   r   r   )r
   loadsr   r   r   r   )r$   run_infor%   r%   r&   deserialize_run_infod   s   


z+SerializedRunOperation.deserialize_run_infootherobjectboolc                 C  sj   t |to4| j| j| j| j| j| j| j| j	| j
| j| jf|j|j|j|j|j|j|j|j	|j
|j|jfkS r#   )r,   r   r   r   r   r   r   r   r   r   r   r   r   r$   r5   r%   r%   r&   __eq__r   s4   
zSerializedRunOperation.__eq__)NNNNNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r"   r!   r(   )r!   r1   r5   r6   r!   r7   )	__name__
__module____qualname____annotations__	__slots__r'   r0   r4   r9   r%   r%   r%   r&   r      s0   
 

r   c                   @  sH   e Zd ZU ded< ded< ded< dZdd	d
ZdddZdddZdS )SerializedFeedbackOperationr   r   r   r   feedbackr   r   rB   r!   r"   c                 C  s   || _ || _|| _d S r#   rC   )r$   r   r   rB   r%   r%   r&   r'      s   
z$SerializedFeedbackOperation.__init__r(   c                 C  s
   t | jS )r)   )r*   rB   )r$   r%   r%   r&   r0      s   
z5SerializedFeedbackOperation.calculate_serialized_sizer5   r6   r7   c                 C  s*   t |to| j| j| jf|j|j|jfkS r#   )r,   rA   r   r   rB   r8   r%   r%   r&   r9      s   
z"SerializedFeedbackOperation.__eq__N)r   r   r   r   rB   r   r!   r"   r:   r;   )r<   r=   r>   r?   r@   r'   r0   r9   r%   r%   r%   r&   rA      s   
 

rA   rB   &Union[ls_schemas.FeedbackCreate, dict]r!   c                 C  s   t | drtt| dr|  }ntt| }d|vr!t |d< nt|d tr1t	|d |d< d|vr<t |d< nt|d trLt	|d |d< t
|d |d t|dS )Nr1   r   r   rC   )hasattrcallablegetattrr1   r   uuiduuid4r,   strUUIDrA   _dumps_json)rB   feedback_creater%   r%   r&   serialize_feedback_dict   s    

rN   r   r   payloadr1   c           	      C  s   | dd }| dd }| dd }| dd }| dd }| dd }| dd }t| |d |d	 t||d ur=t|nd |d urFt|nd |d urOt|nd |d urXt|nd |d urat|nd |d urjt|nd |d urs|d
S d d
S )Nr   r   r   r   r   r   r   r   r   r    )popr   rL   )	r   rO   r   r   r   r   r   r   r   r%   r%   r&   serialize_run_dict   s,   
rQ   ops@list[Union[SerializedRunOperation, SerializedFeedbackOperation]]c                 C  sX  dd | D }g }| D ]}t |tr|jdkrq||j}|d u r(|| q|jd urQ|j|jkrQt|j}dd t|j	 D }|
| t||_|jd urZ|j|_|jd urc|j|_|jd url|j|_|jd uru|j|_|jd ur~|j|_|jd ur|j|_|jd ur|jd u ri |_|j
|j q|| qtt| |S )Nc                 S  s(   i | ]}t |tr|jd kr|j|qS )post)r,   r   r   r   ).0opr%   r%   r&   
<dictcomp>   s    
z7combine_serialized_queue_operations.<locals>.<dictcomp>rT   c                 S  s   i | ]\}}|d ur||qS r#   r%   rU   kvr%   r%   r&   rW      s    )r,   r   r   getr   appendr   r
   r2   itemsupdatedumpsr   r   r   r   r   r   r   list	itertoolschainr+   )rR   create_ops_by_idpassthrough_opsrV   	create_opcreate_op_dictop_dictr%   r%   r&   #combine_serialized_queue_operations   sN   











rh   rV   r   c              	   C  s@   t d| j d | jddtt| jiffgd| j d| j S )Nz	feedback.application/jsonContent-Lengthtrace=,id=)r   r   rB   rJ   r*   r   )rV   r%   r%   r&   <serialized_feedback_operation_to_multipart_parts_and_context  s   
rm   :tuple[MultipartPartsAndContext, dict[str, BufferedReader]]c                 C  s  g }i }| | j d| j d | jddtt| jiff d| jfd| jfd| jfd| j	fd| j
fd	| jffD ]&\}}|d u rAq8|}| | j d| j d| d |ddtt|iff q8| jr| j D ]x\}\}}d|v rtd
| d| j d qgt|tr| d| j d| d ||dtt|iff qgztj|}	t|d}
W n ty   td| j| Y qgw |
|t|tt  < | d| j d| d |
| d|	 i ff qgt|d| j d| j |fS )N.ri   rj   r   r   r   r   r   r   z Skipping logging of attachment 'z
' for run zx: Invalid attachment name.  Attachment names must not contain periods ('.'). Please rename the attachment and try again.zattachment.rbz(Attachment file not found for run %s: %sz	; length=rk   rl   )r\   r   r   r   rJ   r*   r   r   r   r   r   r   r   r]   loggerwarningr,   r   ospathgetsizeopenFileNotFoundErrorrH   rI   r   r   )rV   	acc_partsopened_files_dictkeyvaluevalbnr.   r/   	file_sizefiler%   r%   r&   7serialized_run_operation_to_multipart_parts_and_context  s   
r   parts_and_contextboundaryrJ   4Iterable[tuple[bytes, Union[bytes, BufferedReader]]]c                 c  s    | j D ]>\}\}}}}d| dd| dg}|r#|d| d |d| dgdd | D d d	| |fV  qd S )
Nz--
z&Content-Disposition: form-data; name=""z; filename="z
Content-Type: c                 S  s    g | ]\}}| d | dqS )z: r   r%   rX   r%   r%   r&   
<listcomp>  s     z6encode_multipart_parts_and_context.<locals>.<listcomp> )partsr\   extendr]   joinencode)r   r   	part_namefilenamedatar.   headersheader_partsr%   r%   r&   "encode_multipart_parts_and_contextx  s"   


r   compressed_tracesr   r7   c           
      C  s  |j j}g }d}t| |D ]'\}}t|ttfs't|tr!| nt|	 }|
||f |t|7 }qt|dd}|dur\|dkr\|j}	|	dkr\|	| |kr\td|| j|	| dS |D ]\}}|| | jt|7  _|| |d q^|j
| j dS )zCompress multipart parts into the shared compressed buffer.

    Returns True if the parts were enqueued into the compressed buffer, or False
    if they were rejected because the configured in-memory size limit would be
    exceeded.
    r   max_uncompressed_size_bytesNzCompressed traces queue size limit (%s bytes) exceeded. Dropping trace data with context: %s. Current queue size: %s bytes, attempted addition: %s bytes.Fs   
T)compressor_writerwriter   r,   r   	bytearrayr   readrJ   r   r\   r*   rG   uncompressed_sizerq   rr   context_context)
r   r   r   r   r   op_uncompressed_sizer   r   	max_bytescurrent_sizer%   r%   r&   $compress_multipart_parts_and_context  s<   	
r   )rB   rD   r!   rA   )r   r   rO   r1   r!   r   )rR   rS   r!   rS   )rV   rA   r!   r   )rV   r   r!   rn   )r   r   r   rJ   r!   r   )r   r   r   r   r   rJ   r!   r7   )(
__future__r   ra   loggingrs   rH   collections.abcr   ior   typingr   r   r   r   	langsmithr	   
ls_schemaslangsmith._internalr
   &langsmith._internal._compressed_tracesr   langsmith._internal._multipartr   r   langsmith._internal._serder   rL   	getLoggerr<   rq   r   rA   rN   rQ   rh   rm   r   r   r   r%   r%   r%   r&   <module>   s.    
z



6

Y