
    ZǻioK                       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mZ d dlmZ d dlmZ d dlmZ d d	lmZmZ e	rd dlZd d
lmZmZ d dl m!Z!m"Z" d dl#m$Z$m%Z%m&Z&  ededde
f         Z' ejP                  e)      Z*ejV                  d#d       Z,d$dZ-d%dZ.ejV                  d&d       Z/d'dZ0d(dZ1d)dZ2d*dZ3d+dZ4	 	 	 	 	 	 	 	 	 	 	 	 d,dZ5	 	 	 	 	 	 	 	 	 	 d-dZ6 G d ded      Z7dd dd!	 	 	 	 	 	 	 	 	 d.d"Z8y)/    )annotationsN)AsyncIteratorMappingSequence)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)Self	TypedDict)client)run_helpers)dumps)InputTokenDetailsUsageMetadata)	AnthropicAsyncAnthropic)AsyncMessageStreamMessageStream)
CompletionMessageMessageStreamEventCr   r   )boundc                 :    	 ddl m} m} | |fS # t        $ r Y y w xY w)Nr   NotGivenOmit)anthropic._typesr   r    ImportErrorr   s     [/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/langsmith/wrappers/_anthropic.py_get_not_givenr$       s'    3$ s    	c                   	 t               x}r8| j                         D ci c]  \  }t        fd|D              s| } }}d| v r0d| d   dg| j                  dg       z   | d<   | j                  d       | j                         D ci c]  \  }}|	|| c}}S c c}}w # t        $ r"}t        j                  d|        Y d }~d }~ww xY wc c}}w )Nc              3  6   K   | ]  }t        |        y wN)
isinstance).0tvs     r#   	<genexpr>z#_strip_not_given.<locals>.<genexpr>0   s     ?:a+?s   zError stripping NotGiven: system)rolecontentmessages)r$   itemsany	Exceptionloggererrorgetpop)d	not_givenkr+   es      ` r#   _strip_not_givenr<   *   s    7&((9( GGI Aq?Y?? 1A  1}"*q{CDquuH
 
* 	
hWWY8TQ!-AqD88
  71!5667 9s4    B( !B"B( 
CC"B( (	C1CCc                D   t        |      }|j                  d      }|rt        |t              r|g}h d}|j	                         D ci c]  \  }}||v s|| }}}dd|j                  dd       |j                  dd       |j                  dd       |i | |dS c c}}w )	Nstop>   top_ktop_pstreamthinkingmcp_serverstool_choiceservice_tier	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<   r6   r(   strr1   )prepopulated_invocation_paramskwargsstrippedr>   allowed_invocation_keysr:   r+   invocation_paramss           r#   _infer_ls_paramsrX   =   s    'H<<D
4%v ")AQ2I-I1 
 #!gt4",,}d;!lD9!
,!
!
 	s   	BBc                 2    	 ddl m}  | S # t        $ r Y y w xY w)Nr   accumulate_event)!anthropic.lib.streaming._messagesr[   r"   rZ   s    r#   _get_sdk_accumulate_eventr]   c   s"    F s   
 	c                   | j                  d      xs d}| j                  d      xs d}i }| j                  d      xs d}|r||d<   | j                  d      xs i }|r9|j                  d      xs d}|j                  d      xs d}|r||d<   |r"||d<   n| j                  d	      xs d}|r||d<   t        |j                               }	||	z   }
|
|z   }t        |
||
      }|rt	        di ||d<   |S )Ninput_tokensr   output_tokenscache_read_input_tokens
cache_readcache_creationephemeral_5m_input_tokensephemeral_1h_input_tokenscache_creation_input_tokens)r_   r`   total_tokensinput_token_details )r6   sumvaluesr   r   )anthropic_token_usager_   r`   rh   rb   cache_creation_objephemeral_5mephemeral_1hrc   cache_token_sumadjusted_inputadjusted_totalresults                r#   _create_usage_metadatart   m   s;   (,,^<AL)--o>C!M "&**+DEJJ,6L).223CDJ)--.IJOa)--.IJOa?K ;<?K ;<.223PQVUV4B 01 -4467O!O3N#m3N###F
 (9(P<O(P$%M    c                   | j                         }|j                  dd      }|rt        |      |d<   |j                  dd       |j                  d      xs g }|D cg c]*  }t	        |t
              s|j                  d      dk(  s)|, }}|r|D cg c]8  }t	        |t
              r&|j                  d      dk(  r|j                  dd      : }}dj                  |      xs d|d<   t        |      D cg c]Y  \  }}|j                  d	d
|       d||j                  dd      t        |j                  di             j                         dd[ c}}|d<   |S c c}w c c}w c c}}w )zHConvert an Anthropic Message to a flat outputs dict with usage_metadata.usageNusage_metadatatyper/   tool_usetext idcall_functionnameinput)r   	arguments)r}   ry   indexr   
tool_calls)

model_dumpr7   rt   r6   r(   dictjoin	enumerate_dumpsdecode)	messageoutputsrl   r/   btool_use_blocks
text_partsiblocks	            r#   _message_to_outputsr      su     "G#KK6$:;P$Q !KKkk)$*GjD1aeeFmz6QO   
!T"quuV}'> EE&"

 

  WWZ08D	 &o6!
 5 iiaSk2"!IIfb1!'		'2(>!?!F!F!H	!
 N-
!
s   E!4E!	E!=E&:AE+c                    t               }|d| iS d }| D ]  }	  |||      } |d| iS t	        |      S # t        $ r(}t        j                  d|        d| icY d }~c S d }~ww xY w)Noutput)eventcurrent_snapshotz/Error accumulating event in Anthropic Wrapper: )r]   RuntimeErrorr4   debugr   )
all_chunks
accumulatefull_messagechunkr;   s        r#   _reduce_chat_chunksr      s    *,J*%%L *	*%!-L* *%%|,,  	*LLJ1#NOj))	*s   
6	A'A"A'"A'c                    g }| D ]"  }|j                   }||j                  |       $ dj                  |      }| r| d   j                         }d|ig|d<   |S dd|igi}|S )Nr|   r{   choices)
completionappendr   r   )r   all_contentr   r/   r8   s        r#   _reduce_completionsr      s    K (""w'( ggk"GrN%%')*) H &'*+,Hru   c                    	 t        | d      r&t        | j                        r	 | j                         } t	        |       S # t        $ r Y w xY w# t
        $ r&}t        j                  d|        d| icY d }~S d }~ww xY w)Nparsez"Error processing chat completion: r   )hasattrcallabler   r3   r   BaseExceptionr4   r   )r   r;   s     r#   _process_chat_completionr      s    #
 7G$'--)@!--/ #7++    #9!=>'""#s=   !A ? 
A 	AA 
AA 	A=A82A=8A=TracingExtrac                     t        j                          fd       }t        j                          fd       }t        j                         r|S |S )Nc                     |j                  d      }t        j                  dd|rnd t        t        t        j                  t              d	}  |      | i |}|S NrA   llm)r   run_type	reduce_fnprocess_inputsprocess_outputs_invocation_params_fnri   r6   r   	traceabler<   r   	functoolspartialrX   
argsrT   rA   	decoratorrs   r   original_createrS   r   tracing_extras
        r#   createz_get_wrapper.<locals>.create   st    H%)) 

#)it+4"+"3"3 "@#

 

	 ,?+T<V<ru   c                    K   |j                  d      }t        j                  dd|rnd t        t        t        j                  t              d	}  |      | i | d {   }|S 7 wr   r   r   s
        r#   acreatez_get_wrapper.<locals>.acreate  s     H%)) 

#)it+4"+"3"3 "@#

 

	 2y14B6BB Cs   A#A/&A-'A/)r   wrapsr   is_async)r   r   r   rS   r   r   r   s   `````  r#   _get_wrapperr      sW     ___% &" ___% &  "**?;7GGru   c                   	
 dt               j                         v }t        j                  d|t        dt
        t        j                  t        |      d|	t        j                  d|dt
        t        t        j                  t        |      d|
|r G 	
fdd       G  fdd      }|S  G 	
fd	d
       G  fdd      }|S )z;Create a wrapper for Anthropic's streaming context manager.asyncr   )r   r   r   r   r   )r   r   r   r   r   c                      e Zd Z	 	 	 	 ddZefd       Zedd       Zedd       ZddZd fdZ	ddZ
ddZdd	Zdd
ZddZddZedd       Zy)6_get_stream_wrapper.<locals>.AsyncMessageStreamWrapperc                     || _         || _        y r'   _wrapped_kwargsselfwrappedrT   s      r#   __init__z?_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__init__6      
 !(%ru   c                >      fd       } |di  j                   S )Nc                6  K   j                   j                  2 3 d {   }| 7 
6 t        j                         }j                   j	                          d {  7  }t        |      }||_        |j                  d      x}r||j                  d<   y y wNrx   	r   text_streamr   get_current_run_treeget_final_messager   r   r6   metadata)_r   run_treefinal_messager   rw   r   s         r#   _text_streamzX_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.text_stream.<locals>._text_stream@  s     '+}}'@'@ $ $e#$'@*??AH*.--*I*I*K$K$KM1-@G'.H$ ',< ==u=>C))*:; >s+   B+)+B+2BA ;Bri   r   r   r   configured_traceable_texts   ` r#   r   zB_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.text_stream>  s+    *D +D $3dll33ru   c                .    | j                   j                  S r'   r   responser   s    r#   r   z?_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.responseM      }}---ru   c                .    | j                   j                  S r'   r   
request_idr   s    r#   r   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.request_idQ      }}///ru   c                ^   K   | j                         }|j                          d {   S 7 wr'   )	__aiter__	__anext__)r   aiters     r#   r   z@_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__anext__U  s%     ("__....s   $-+-c               l    K    fd       } |di  j                   2 3 d {   }| 7 
6 y w)Nc                 8    j                   j                         S r'   )r   r   r   r   s    r#   traced_iterzU_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aiter__.<locals>.traced_iterZ  s    ==2244ru   ri   r   )r   r   r   configured_traceables   `  r#   r   z@_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aiter__Y  sD     %5 &5 $/#>#>    %K #>s   4202424c                V   K   | j                   j                          d {    | S 7 wr'   )r   
__aenter__r   s    r#   r   zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aenter__a  s&     mm..000 1s   )')c                R   K    | j                   j                  |  d {    y 7 wr'   )r   	__aexit__r   excs     r#   r   z@_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.__aexit__e        -dmm--s333   '%'c                T   K   | j                   j                          d {    y 7 wr'   r   closer   s    r#   r   z<_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.closeh  s     mm))+++   (&(c                R   K   | j                   j                          d {   S 7 wr'   r   r   r   s    r#   r   zH_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.get_final_messagek  s     !]]<<>>>>   '%'c                R   K   | j                   j                          d {   S 7 wr'   r   get_final_textr   s    r#   r  zE_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.get_final_textn  s     !]]99;;;;r   c                T   K   | j                   j                          d {    y 7 wr'   r   
until_doner   s    r#   r  zA_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.until_doneq  s     mm..000r   c                .    | j                   j                  S r'   r   current_message_snapshotr   s    r#   r	  zO_get_stream_wrapper.<locals>.AsyncMessageStreamWrapper.current_message_snapshott      }}===ru   N)r   r   returnNone)r  zhttpx.Responser  z
str | Noner  r   )r  z!AsyncIterator[MessageStreamEvent]r  r   r  r  r  r   r  rR   )__name__
__module____qualname__r   propertyr   r   r   r   r   r   r   r   r   r  r  r	  r   r   s   r#   AsyncMessageStreamWrapperr   5  s    &+& 	& 4 4 . . 0 0/ 4,?<1 > >ru   r  c                  &    e Zd Zd Z fdZd Zy)>_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapperc                    || _         y r'   r   r   rT   s     r#   r   zG_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__init__y  	    %ru   c                   K    di | j                   | _        | j                  j                          d {   } |fi | j                   S 7 wNri   )r   _managerr   )r   rA   r  original_streams     r#   r   zI_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__aenter__|  sH      / ?$,, ?#}}77990H4<<HH :s   5AAAc                R   K    | j                   j                  |  d {    y 7 wr'   )r   r   r   s     r#   r   zH_get_stream_wrapper.<locals>.AsyncMessagesStreamManagerWrapper.__aexit__  r   r   N)r  r  r  r   r   r   )r  r!  s   r#   !AsyncMessagesStreamManagerWrapperr  x  s    &I
4ru   r#  c                      e Zd Z	 	 	 	 ddZedd       Zedd       Zefd       ZddZ fdZ	ddZ
ddZdd	Zdd
ZddZddZedd       Zy)1_get_stream_wrapper.<locals>.MessageStreamWrapperc                     || _         || _        y r'   r   r   s      r#   r   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__init__  r   ru   c                .    | j                   j                  S r'   r   r   s    r#   r   z:_get_stream_wrapper.<locals>.MessageStreamWrapper.response  r   ru   c                .    | j                   j                  S r'   r   r   s    r#   r   z<_get_stream_wrapper.<locals>.MessageStreamWrapper.request_id  r   ru   c                >      fd       } |di  j                   S )Nc               ;    K   j                   j                  E d {    t        j                         }j                   j	                         }t        |      }||_        |j                  d      x}r||j                  d<   y y 7 hwr   r   )r   r   r   r   rw   r   s        r#   r   zS_get_stream_wrapper.<locals>.MessageStreamWrapper.text_stream.<locals>._text_stream  s|     #}}8888*??AH$(MM$C$C$EM1-@G'.H$ ',< ==u=>C))*:; > 9s   BBA)Bri   r   r   s   ` r#   r   z=_get_stream_wrapper.<locals>.MessageStreamWrapper.text_stream  s+    *D +D $3dll33ru   c                >    | j                         j                         S r'   )__iter____next__r   s    r#   r-  z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__next__  s    }}//11ru   c                >      fd       } |di  j                   S )Nc                 8    j                   j                         S r'   )r   r,  r   s    r#   r   zO_get_stream_wrapper.<locals>.MessageStreamWrapper.__iter__.<locals>.traced_iter  s    ==1133ru   ri   r   )r   r   r   s   ` r#   r,  z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__iter__  s)    %4 &4 #2T\\22ru   c                :    | j                   j                          | S r'   )r   	__enter__r   s    r#   r1  z;_get_stream_wrapper.<locals>.MessageStreamWrapper.__enter__  s    '')ru   c                6     | j                   j                  |  y r'   )r   __exit__r   s     r#   r3  z:_get_stream_wrapper.<locals>.MessageStreamWrapper.__exit__      &&&,ru   c                8    | j                   j                          y r'   r   r   s    r#   r   z7_get_stream_wrapper.<locals>.MessageStreamWrapper.close  s    ##%ru   c                6    | j                   j                         S r'   r   r   s    r#   r   zC_get_stream_wrapper.<locals>.MessageStreamWrapper.get_final_message  s    }}6688ru   c                6    | j                   j                         S r'   r  r   s    r#   r  z@_get_stream_wrapper.<locals>.MessageStreamWrapper.get_final_text  s    }}3355ru   c                6    | j                   j                         S r'   r  r   s    r#   r  z<_get_stream_wrapper.<locals>.MessageStreamWrapper.until_done  s    }}//11ru   c                .    | j                   j                  S r'   r  r   s    r#   r	  zJ_get_stream_wrapper.<locals>.MessageStreamWrapper.current_message_snapshot  r
  ru   N)r   r   r  r  )r  r   r  r  r  r  r  r  )r  r  r  r   r  r   r   r   r-  r,  r1  r3  r   r   r  r  r	  r  s   r#   MessageStreamWrapperr%    s    &&& 	& . . 0 0 4 423-&962 > >ru   r:  c                  &    e Zd Zd Z fdZd Zy)9_get_stream_wrapper.<locals>.MessagesStreamManagerWrapperc                    || _         y r'   r   r  s     r#   r   zB_get_stream_wrapper.<locals>.MessagesStreamManagerWrapper.__init__  r  ru   c                     di | j                   | _         | j                  j                         fi | j                   S r  )r   r   r1  )r   r:  r!  s    r#   r1  zC_get_stream_wrapper.<locals>.MessagesStreamManagerWrapper.__enter__  s7     / ?$,, ?+DMM,C,C,EVVVru   c                6     | j                   j                  |  y r'   )r   r3  r   s     r#   r3  zB_get_stream_wrapper.<locals>.MessagesStreamManagerWrapper.__exit__  r4  ru   N)r  r  r  r   r1  r3  )r:  r!  s   r#   MessagesStreamManagerWrapperr<    s    &W-ru   r@  ri   )
rR   lowerr   r   r   r<   r   r   rX   r   )r!  r   rS   r   r   r#  r@  r  r:  r   r   s   `      @@@@r#   _get_stream_wrapperrB    s     #o.4466H&00 	%''//<
	 	 !, 5 5 	!'0'//<
	! 	! A	> A	>F
	4 
	4 10>	> >	>@		- 		- ,+ru   c                  ,    e Zd ZU ded<   ded<   ded<   y)r   zOptional[Mapping[str, Any]]r   zOptional[list[str]]tagszOptional[ls_client.Client]r   N)r  r  r  __annotations__ri   ru   r#   r   r     s    ))
&&ru   F)totalChatAnthropic)r   	chat_namecompletions_namec               0   |xs i }t        |j                  d      xs i       }|j                  di       }|j                         D ci c]  \  }}|dk7  s|| }}}|r||d<   t	        | j
                  j                  |t        ||      | j
                  _        t        | j
                  j                  |||      | j
                  _	        t	        | j                  j                  |t        ||      | j                  _        t        | d      rt        | j                  d      rjt        | j                  j
                  d      rJt	        | j                  j
                  j                  |t        ||      | j                  j
                  _        | S c c}}w )a  Patch the Anthropic client to make it traceable.

    Args:
        client: The client to patch.
        tracing_extra: Extra tracing information.
        chat_name: The run name for the messages endpoint.
        completions_name: The run name for the completions endpoint.

    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)

        # With raw response to access headers:
        raw_response = client.messages.with_raw_response.create(
            model="claude-3-5-sonnet-latest",
            messages=messages,
            max_tokens=1000,
            system=system,
        )
        print(raw_response.headers)  # Access HTTP headers
        message = raw_response.parse()  # Get parsed response

        # 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()
        ```
    r   rQ   betar0   r   )r   r6   r7   r1   r   r0   r   r   rB  rA   completionsr   r   rK  )	r   r   rH  rI  r   rS   r:   r+   tracing_extra_rests	            r#   wrap_anthropicrN    su   ~ "'RM M%%j17R8H%-\\2H"%M" ',,.(A!z/1( ( )1:&)&FOO 1&	FOO !-!!&!F 	FKK,FKK(((3&2KK  ''*'
# MQ(s   
FF)r  zOptional[tuple[type, ...]])r8   r   r  r   )rS   r   rT   r   )r  zOptional[Callable])rl   r   r  r   )r   r   r  r   )r   r   r  r   )r   zlist[Completion]r  r   )r   r   )r   r	   r   rR   r   r	   rS   r   r   r   r  r	   )
r!  r	   r   rR   rS   r   r   r   r  r	   )
r   r   r   zOptional[TracingExtra]rH  rR   rI  rR   r  r   )9
__future__r   r   loggingcollections.abcr   r   r   typingr   r   r	   r
   r   r   typing_extensionsr   r   	langsmithr   	ls_clientr   langsmith._internal._orjsonr   r   langsmith.schemasr   r   httpxrF   r   r   anthropic.lib.streamingr   r   anthropic.typesr   r   r   r   	getLoggerr  r4   	lru_cacher$   r<   rX   r]   rt   r   r   r   r   r   rB  r   rN  ri   ru   r#   <module>r]     s   "   < <  . ) ! 7 >3IGGCu[*:C?@A			8	$  9&#L  #LD-& #"*H*H
*H *H %)	*H
  *H *HZ|,|,
|, %)|,  	|,
 |,~'9E ' -1$'nn *n 	n
 n nru   