o
    Zh4=                     @  sv  d dl mZ d dlZd dlZd dlmZ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mZ d dlmZ d dlmZ d d	lmZmZ e	rbd dlZd d
lmZmZ d dlm Z m!Z!m"Z" ededde
f dZ#e$e%Z&ej'dDddZ(dEddZ)dFddZ*dGdd Z+dHd#d$Z,dId'd(Z-dJd*d+Z.dKd.d/Z/dLd7d8Z0dMd:d;Z1G d<d6 d6ed=d>Z2dd?dNdBdCZ3dS )O    )annotationsN)AsyncIteratorMappingSequence)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)TypeAdapter)Self	TypedDict)client)run_helpers)InputTokenDetailsUsageMetadata)	AnthropicAsyncAnthropic)
CompletionMessageMessageStreamEventCr   r   )boundreturnOptional[type]c                  C  s(   z	ddl m}  | W S  ty   Y d S w )Nr   NotGiven)Zanthropic._typesr   ImportErrorr    r   T/var/www/html/lang_env/lib/python3.10/site-packages/langsmith/wrappers/_anthropic.py_get_not_given   s   r!   ddictc              
     s   zt    d ur fdd|  D } W n ty. } ztd|  W Y d }~nd }~ww d| v rHd| d dg| dg  | d< | d dd |  D S )Nc                   s    i | ]\}}t | s||qS r   )
isinstance.0kvZ	not_givenr   r    
<dictcomp>,   s     z$_strip_not_given.<locals>.<dictcomp>zError stripping NotGiven: system)Zrolecontentmessagesc                 S     i | ]\}}|d ur||qS Nr   r%   r   r   r    r*   5       )r!   items	Exceptionloggererrorgetpop)r"   er   r)   r    _strip_not_given)   s   

r8   kwargsc                 C  sP   t | }|d}|rt|tr|g}dd|dd |dd |dd |dS )Nstop	anthropicZchatmodelZtemperatureZ
max_tokens)Zls_providerZls_model_typeZls_model_nameZls_temperatureZls_max_tokensZls_stop)r8   r5   r$   str)r9   strippedr:   r   r   r    _infer_ls_params8   s   



r?   eventr   current_snapshotMessage | Nonec                 C  s   zddl m} W n ty   td | Y S w |d u r.| jdkr%| jS td| j d| jdkrGt|}|	| j
 }|j| |S | jdkrh|j| j }|jd	krf| jjd
krf| j| jj7  _|S | jdkr}| jj|_| jj|_| jj|j_|S )Nr   )ContentBlockzError importing ContentBlockmessage_startzUnexpected event order, got z before "message_start"Zcontent_block_startZcontent_block_deltatextZ
text_deltaZmessage_delta)anthropic.typesrC   r   r3   debugtypemessageRuntimeErrorr   Zvalidate_pythonZcontent_block
model_dumpr,   appendindexdeltarE   Zstop_reasonZstop_sequenceusageoutput_tokens)r@   rA   rC   adapterZcontent_block_instancer,   r   r   r    _accumulate_eventI   s>   






rR   
all_chunksr   c                 C  s   d }| D ]*}zt ||d}W q ty. } ztd|  d| iW  Y d }~  S d }~ww |d u r7d| iS | }t|di |d< |dd  d|iS )N)r@   rA   z/Error accumulating event in Anthropic Wrapper: outputrO   usage_metadatarH   rI   )rR   rJ   r3   rG   rK   _create_usage_metadatar6   )rS   Zfull_messagechunkr7   r"   r   r   r    _reduce_chat_chunkso   s   rX   anthropic_token_usager   c              
   C  sh   |  dpd}|  dpd}|| }d|  dd|  dd i}t|||td
i dd | D d	S )Ninput_tokensr   rP   Z
cache_readZcache_creation_input_tokensZcache_read_input_tokensc                 S  r.   r/   r   r%   r   r   r    r*      r0   z*_create_usage_metadata.<locals>.<dictcomp>)rZ   rP   total_tokensinput_token_detailsr   )r5   r   r   r1   )rY   rZ   rP   r[   r\   r   r   r    rV      s   
rV   list[Completion]c                 C  sd   g }| D ]}|j }|d ur|| qd|}| r)| d  }d|ig|d< |S dd|igi}|S )N rE   choices)
completionrL   joinrK   )rS   Zall_contentrW   r,   r"   r   r   r    _reduce_completions   s   

rc   outputsr   c              
   C  s|   z|   }|dd }|rt|nd |d< |dd  d|iW S  ty= } ztd|  d| iW  Y d }~S d }~ww )NrO   rU   rH   rI   z"Error processing chat completion: rT   )rK   r6   rV   BaseExceptionr3   rG   )rd   ZrdictrY   r7   r   r   r    _process_chat_completion   s   

rf   original_creater   namer=   	reduce_fntracing_extraTracingExtrac                   sJ   t  fdd}t  fdd}tr#|S |S )Nc               	     sF   | d}tjd d|rnd tttd}|| i |}|S Nstreamllm)rh   run_typeri   process_inputsprocess_outputs_invocation_params_fnr   r5   r   	traceabler8   rf   r?   argsr9   rm   	decoratorresultrh   rg   ri   rj   r   r    create   s   


z_get_wrapper.<locals>.createc               	     sN   | d}tjd d|rnd tttd}|| i |I d H }|S rl   rs   ru   ry   r   r    acreate   s   

	z_get_wrapper.<locals>.acreate)	functoolswrapsr   is_async)rg   rh   ri   rj   rz   r{   r   ry   r    _get_wrapper   s
   r   original_streamc                   s   ddl }dt v }tjd|tdttd|tjd|dtttd||r@G fddd G  fd	d
d
}|S G fdddG fddd}|S )z;Create a wrapper for Anthropic's streaming context manager.r   Nasyncrn   )rh   ri   ro   rp   rr   )rh   ro   rp   rq   rr   c                      s   e Zd Zd'ddZefddZed(d
dZed)ddZd*ddZd+ fddZ	d,ddZ
d-ddZd-ddZd.ddZd/d d!Zd-d"d#Zed.d$d%Zd&S )0z6_get_stream_wrapper.<locals>.AsyncMessageStreamWrapperwrapped4anthropic.lib.streaming._messages.AsyncMessageStreamr   Nonec                 [     || _ || _d S r/   _wrapped_kwargsselfr   r9   r   r   r    __init__      
z?_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__init__c                        fdd}|di  j S )Nc                   sF    j j2 z	3 d H W }|V  q6 t } j  I d H }t||_d S r/   r   text_streamr   Zget_current_run_treeget_final_messagerf   rd   )_rW   run_treefinal_messager   r   r    _text_stream   s   zX_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.text_stream.<locals>._text_streamr   r   r   r   configured_traceable_textr   r    r      s   zB_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.text_streamhttpx.Responsec                 S     | j jS r/   r   responser   r   r   r    r   
     z?_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.response
str | Nonec                 S  r   r/   r   
request_idr   r   r   r    r     r   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.request_idr   c                   s   |   }| I d H S r/   )	__aiter__	__anext__)r   aiterr   r   r    r     s   z@_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__anext__!AsyncIterator[MessageStreamEvent]c                  s<    fdd}|di  j 2 z	3 d H W }|V  q6 d S )Nc                    
    j  S r/   )r   r   r   r   r   r    traced_iter     
zU_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aiter__.<locals>.traced_iterr   r   )r   r   rW   configured_traceabler   r    r     s   z@_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aiter__r   c                   s   | j  I d H  | S r/   )r   
__aenter__r   r   r   r    r     s   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aenter__c                      | j j| I d H  d S r/   )r   	__aexit__r   excr   r   r    r   "     z@_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aexit__c                      | j  I d H  d S r/   r   closer   r   r   r    r   %     z<_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.closer   c                      | j  I d H S r/   r   r   r   r   r   r    r   (     zH_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.get_final_messager=   c                   r   r/   r   get_final_textr   r   r   r    r   +  r   zE_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.get_final_textc                   r   r/   r   
until_doner   r   r   r    r   .  r   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.until_donec                 S  r   r/   r   current_message_snapshotr   r   r   r    r   1  r   zO_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.current_message_snapshotN)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r=   )__name__
__module____qualname__r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    AsyncMessageStreamWrapper   s$    







r   c                      *   e Zd Zdd Z fddZdd ZdS )z>_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapperc                 [  
   || _ d S r/   r   r   r9   r   r   r    r   6     
zG_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__init__c                   s6   di | j | _| j I d H } |fi | j S Nr   )r   _managerr   )r   rm   r   r   r   r    r   9  s   zI_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__aenter__c                   r   r/   )r   r   r   r   r   r    r   >  r   zH_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__aexit__N)r   r   r   r   r   r   r   r   r   r    !AsyncMessagesStreamManagerWrapper5  s    r   c                      s   e Zd Zd&ddZed'dd	Zed(ddZefddZd)ddZ fddZ	d*ddZ
d+ddZd+ddZd,ddZd-dd Zd+d!d"Zed,d#d$Zd%S ).z1_get_stream_wrapper.<locals>.MessageStreamWrapperr   /anthropic.lib.streaming._messages.MessageStreamr   r   c                 [  r   r/   r   r   r   r   r    r   E  r   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__init__r   c                 S  r   r/   r   r   r   r   r    r   M  r   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.responser   c                 S  r   r/   r   r   r   r   r    r   Q  r   z<_get_stream_wrapper.<locals>.MessageStreamWrapper.request_idc                   r   )Nc                  ;  s0     j jE d H  t } j  }t||_d S r/   r   )r   r   r   r   r   r    r   W  s
   
zS_get_stream_wrapper.<locals>.MessageStreamWrapper.text_stream.<locals>._text_streamr   r   r   r   r   r    r   U  s   z=_get_stream_wrapper.<locals>.MessageStreamWrapper.text_streamr   c                 S  s   |    S r/   )__iter____next__r   r   r   r    r   `  s   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__next__c                   r   )Nc                    r   r/   )r   r   r   r   r   r    r   d  r   zO_get_stream_wrapper.<locals>.MessageStreamWrapper.__iter__.<locals>.traced_iterr   r   )r   r   r   r   r    r   c  s   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__iter__r   c                 S  s   | j   | S r/   )r   	__enter__r   r   r   r    r   j  s   
z;_get_stream_wrapper.<locals>.MessageStreamWrapper.__enter__c                 W     | j j|  d S r/   )r   __exit__r   r   r   r    r   n     z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__exit__c                 S  s   | j   d S r/   r   r   r   r   r    r   q  s   z7_get_stream_wrapper.<locals>.MessageStreamWrapper.closer   c                 S  
   | j  S r/   r   r   r   r   r    r   t  r   zC_get_stream_wrapper.<locals>.MessageStreamWrapper.get_final_messager=   c                 S  r   r/   r   r   r   r   r    r   w  r   z@_get_stream_wrapper.<locals>.MessageStreamWrapper.get_final_textc                 S  r   r/   r   r   r   r   r    r   z  r   z<_get_stream_wrapper.<locals>.MessageStreamWrapper.until_donec                 S  r   r/   r   r   r   r   r    r   }  r   zJ_get_stream_wrapper.<locals>.MessageStreamWrapper.current_message_snapshotN)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   r   r   r   r   r   r    MessageStreamWrapperD  s$    








r   c                      r   )z9_get_stream_wrapper.<locals>.MessagesStreamManagerWrapperc                 [  r   r/   r   r   r   r   r    r     r   zB_get_stream_wrapper.<locals>.MessagesStreamManagerWrapper.__init__c                   s*   di | j | _ | j fi | j S r   )r   r   r   r   r   r   r   r    r     s   zC_get_stream_wrapper.<locals>.MessagesStreamManagerWrapper.__enter__c                 W  r   r/   )r   r   r   r   r   r    r     r   zB_get_stream_wrapper.<locals>.MessagesStreamManagerWrapper.__exit__N)r   r   r   r   r   r   r   r   r   r    MessagesStreamManagerWrapper  s    r   r   )	r;   r=   lowerr   rt   rX   r8   r?   rf   )r   rh   rj   r;   r~   r   r   r   )r   r   r   r   r   r    _get_stream_wrapper   s6   	@=r   c                   @  s&   e Zd ZU ded< ded< ded< dS )rk   zOptional[Mapping[str, Any]]metadatazOptional[list[str]]tagszOptional[ls_client.Client]r   N)r   r   r   __annotations__r   r   r   r    rk     s   
 F)total)rj   r   Optional[TracingExtra]c                C  s   |pi }t | jjdt|| j_t| jjd|| j_t | jjdt|| j_t| drCt| j	drCt| j	jdrCt | j	jjdt|| j	j_| S )a  Patch the Anthropic client to make it traceable.

    Args:
        client (Union[Anthropic, AsyncAnthropic]): The client to patch.
        tracing_extra (Optional[TracingExtra], optional): Extra tracing information.
            Defaults to None.

    Returns:
        Union[Anthropic, AsyncAnthropic]: The patched client.

    Example:

        .. code-block:: python

            import anthropic
            from langsmith import wrappers

            client = wrappers.wrap_anthropic(anthropic.Anthropic())

            # Use Anthropic client same as you normally would:
            system = "You are a helpful assistant."
            messages = [
                {
                    "role": "user",
                    "content": "What physics breakthroughs do you predict will happen by 2300?",
                }
            ]
            completion = client.messages.create(
                model="claude-3-5-sonnet-latest",
                messages=messages,
                max_tokens=1000,
                system=system,
            )
            print(completion.content)

            # You can also use the streaming context manager:
            with client.messages.stream(
                model="claude-3-5-sonnet-latest",
                messages=messages,
                max_tokens=1000,
                system=system,
            ) as stream:
                for text in stream.text_stream:
                    print(text, end="", flush=True)
                message = stream.get_final_message()

    ZChatAnthropicr   betar-   rz   )
r   r-   rz   rX   r   rm   Zcompletionsrc   hasattrr   )r   rj   r   r   r    wrap_anthropic  s>   0

r   )r   r   )r"   r#   r   r#   )r9   r#   )r@   r   rA   rB   r   rB   )rS   r   r   r#   )rY   r#   r   r   )rS   r]   r   r#   )rd   r   )
rg   r   rh   r=   ri   r   rj   rk   r   r   )r   r   rh   r=   rj   rk   r   r   )r   r   rj   r   r   r   )4
__future__r   r|   loggingcollections.abcr   r   r   typingr   r   r   r	   r
   r   Zpydanticr   typing_extensionsr   r   Z	langsmithr   Z	ls_clientr   Zlangsmith.schemasr   r   Zhttpxr;   r   r   rF   r   r   r   r   	getLoggerr   r3   	lru_cacher!   r8   r?   rR   rX   rV   rc   rf   r   r   rk   r   r   r   r   r    <module>   s<     	

	


&




( 7