o
    +if>                     @  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[tuple[type, ...]]c                  C  s0   zddl m} m} | |fW S  ty   Y d S w )Nr   NotGivenOmit)anthropic._typesr   r   ImportErrorr    r!   Z/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/langsmith/wrappers/_anthropic.py_get_not_given   s   
r#   ddictc              
     s   zt    r fdd|  D } W n ty, } ztd|  W Y d }~nd }~ww d| v rFd| d dg| dg  | d< | d dd |  D S )Nc                   s,   i | ]\} t  fd dD s| qS )c                 3  s    | ]}t  |V  qd S N)
isinstance).0tvr!   r"   	<genexpr>/   s    z._strip_not_given.<locals>.<dictcomp>.<genexpr>)any)r(   k	not_givenr*   r"   
<dictcomp>,   s    z$_strip_not_given.<locals>.<dictcomp>zError stripping NotGiven: system)rolecontentmessagesc                 S     i | ]\}}|d ur||qS r&   r!   r(   r.   r+   r!   r!   r"   r1   9       )r#   items	Exceptionloggererrorgetpop)r$   er!   r/   r"   _strip_not_given)   s    



r@   kwargsc                   sp   t | }|d}|rt|tr|g}h d  fdd| D }dd|dd |dd |d	d ||d
S )Nstop>   top_ktop_pstreamthinkingmcp_serversservice_tierc                   s   i | ]\}}| v r||qS r!   r!   r7   allowed_invocation_keysr!   r"   r1   O   s    z$_infer_ls_params.<locals>.<dictcomp>	anthropicchatmodeltemperature
max_tokens)ls_providerls_model_typels_model_namels_temperaturels_max_tokensls_stopls_invocation_params)r@   r=   r'   strr9   )rA   strippedrB   invocation_paramsr!   rI   r"   _infer_ls_params<   s    





rZ   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"content_block_startcontent_block_deltatext
text_deltamessage_delta)anthropic.typesr^   r    r;   debugtypemessageRuntimeErrorr   validate_pythoncontent_block
model_dumpr4   appendindexdeltarb   stop_reasonstop_sequenceusageoutput_tokens)r[   r\   r^   adaptercontent_block_instancer4   r!   r!   r"   _accumulate_event^   s>   






rv   
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[   r\   z/Error accumulating event in Anthropic Wrapper: outputrr   usage_metadatarg   rh   )rv   ri   r;   rf   rl   _create_usage_metadatar>   )rw   full_messagechunkr?   r$   r!   r!   r"   _reduce_chat_chunks   s   r}   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   rs   
cache_readcache_creation_input_tokenscache_read_input_tokensc                 S  r6   r&   r!   r7   r!   r!   r"   r1      r8   z*_create_usage_metadata.<locals>.<dictcomp>)r   rs   total_tokensinput_token_detailsr!   )r=   r   r   r9   )r~   r   rs   r   r   r!   r!   r"   rz      s   
rz   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 rb   choices)
completionrm   joinrl   )rw   all_contentr|   r4   r$   r!   r!   r"   _reduce_completions   s   

r   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 )Nrr   ry   rg   rh   z"Error processing chat completion: rx   )rl   r>   rz   BaseExceptionr;   rf   )r   rdictr~   r?   r!   r!   r"   _process_chat_completion   s   

r   original_creater   namerW   	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 NrE   llm)r   run_typer   process_inputsprocess_outputs_invocation_params_fnr!   r=   r   	traceabler@   r   rZ   argsrA   rE   	decoratorresultr   r   r   r   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 r   r   r   r   r!   r"   acreate   s   

	z_get_wrapper.<locals>.acreate)	functoolswrapsr   is_async)r   r   r   r   r   r   r!   r   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asyncr   )r   r   r   r   r   )r   r   r   r   r   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   rA   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   get_current_run_treeget_final_messager   r   )_r|   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   r|   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   3  s   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aenter__c                      | j j| I d H  d S r&   )r   	__aexit__r   excr!   r!   r"   r   7     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_messagerW   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   C  r   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.until_donec                 S  r   r&   r   current_message_snapshotr   r!   r!   r"   r   F  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   rW   )__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   rA   r!   r!   r"   r   K     
zG_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__init__c                   s6   di | j | _| j I d H } |fi | j S Nr!   )r   _managerr   )r   rE   r   r   r!   r"   r   N  s   zI_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__aenter__c                   r   r&   )r   r   r   r!   r!   r"   r   S  r   zH_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__aexit__N)r   r   r   r   r   r   r!   r   r!   r"   !AsyncMessagesStreamManagerWrapperJ  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   Z  r   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__init__r   c                 S  r   r&   r   r   r!   r!   r"   r   b  r   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.responser   c                 S  r   r&   r   r   r!   r!   r"   r   f  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   l  s
   
zS_get_stream_wrapper.<locals>.MessageStreamWrapper.text_stream.<locals>._text_streamr!   r   r   r   r   r"   r   j  s   z=_get_stream_wrapper.<locals>.MessageStreamWrapper.text_streamr   c                 S  s   |    S r&   )__iter____next__r   r!   r!   r"   r   u  s   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__next__c                   r   )Nc                    r   r&   )r   r   r   r   r!   r"   r   y  r   zO_get_stream_wrapper.<locals>.MessageStreamWrapper.__iter__.<locals>.traced_iterr!   r   )r   r   r   r   r"   r   x  s   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__iter__r   c                 S  s   | j   | S r&   )r   	__enter__r   r!   r!   r"   r     s   
z;_get_stream_wrapper.<locals>.MessageStreamWrapper.__enter__c                 W     | j j|  d S r&   )r   __exit__r   r!   r!   r"   r       z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__exit__c                 S  s   | j   d S r&   r   r   r!   r!   r"   r     s   z7_get_stream_wrapper.<locals>.MessageStreamWrapper.closer   c                 S  
   | j  S r&   r   r   r!   r!   r"   r     r   zC_get_stream_wrapper.<locals>.MessageStreamWrapper.get_final_messagerW   c                 S  r  r&   r   r   r!   r!   r"   r     r   z@_get_stream_wrapper.<locals>.MessageStreamWrapper.get_final_textc                 S  r  r&   r   r   r!   r!   r"   r     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"   MessageStreamWrapperY  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!   )	rK   rW   lowerr   r   r}   r@   rZ   r   )r   r   r   rK   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 )r   zOptional[Mapping[str, Any]]metadatazOptional[list[str]]tagszOptional[ls_client.Client]r   N)r   r   r   __annotations__r!   r!   r!   r"   r     s   
 F)total)r   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: The client to patch.
        tracing_extra: Extra tracing information.

    Returns:
        The patched client.

    Example:
        ```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()
        ```
    ChatAnthropicr   betar5   r   )
r   r5   r   r}   r	  rE   completionsr   hasattrr  )r   r   r!   r!   r"   wrap_anthropic  s>   -

r  )r   r   )r$   r%   r   r%   )rA   r%   )r[   r   r\   r]   r   r]   )rw   r   r   r%   )r~   r%   r   r   )rw   r   r   r%   )r   r   )
r   r   r   rW   r   r   r   r   r   r   )r   r   r   rW   r   r   r   r   )r   r   r   r  r   r   )4
__future__r   r   loggingcollections.abcr   r   r   typingr   r   r   r	   r
   r   pydanticr   typing_extensionsr   r   	langsmithr   	ls_clientr   langsmith.schemasr   r   httpxrK   r   r   re   r   r   r   r   	getLoggerr   r;   	lru_cacher#   r@   rZ   rv   r}   rz   r   r   r   r	  r   r  r!   r!   r!   r"   <module>   s<     	

	

"
&




( 7