
    $h=                    ,   S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
JrJrJrJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJr  \	(       a  S S
KJrJr  S SKJrJrJr  S SK J!r!  S SK"J#r#  \" S\SS\
4   S9r$\RJ                  " \&5      r'\RP                  S%S j5       r)S&S jr*S'S jr+S(S jr,S)S jr-S*S jr.S+S jr/S,S jr0   S-             S.S jjr1  S/           S0S jjr2S1S jr3 " S S\SS 9r4SS!SS".         S2S# jjr5S3S$ jr6g)4    )annotationsN)defaultdict)Mapping)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)	TypedDict)client)run_helpers)InputTokenDetailsOutputTokenDetailsUsageMetadata)AsyncOpenAIOpenAI)ChatCompletionChunkChoiceChoiceDeltaToolCall)
Completion)ResponseStreamEventCr   r   )boundc                 4     SSK Jn   U $ ! [         a     g f = f)Nr   NotGiven)openai._typesr   ImportErrorr   s    R/var/www/html/shao/venv/lib/python3.13/site-packages/langsmith/wrappers/_openai.py_get_not_givenr!   %   s!    * s   
 
c                2    [        5       nUc  U $ U R                  5        VVs0 sH4  u  p#[        X15      (       a  M  UR                  S5      (       a  Uc  M2  X#_M6     snn$ s  snnf ! [         a$  n[
        R                  SU 35        U s S nA$ S nAff = f)Nextra_zError stripping NotGiven: )r!   items
isinstance
startswith	Exceptionloggererror)d	not_givenkves        r    _strip_not_givenr/   /   s    "$	H 	
!q, 12h1G1GA AD!
 	
 

  1!56s>   A( A( A"A"A"A( "A( (
B2BBBc                D   [        U5      nUR                  S5      nU(       a  [        U[        5      (       a  U/nSU UR                  S5      UR                  S5      UR                  S5      =(       d)    UR                  S5      =(       d    UR                  S5      US.$ )	Nstopopenaimodeltemperature
max_tokensmax_completion_tokensmax_output_tokens)ls_providerls_model_typels_model_namels_temperaturels_max_tokensls_stop)r/   getr%   str)
model_typekwargsstrippedr1   s       r    _infer_invocation_paramsrC   >   s    'H<<D
4%%v  #!g.",,}5!l3 -<</0-<<+,	 	    c                N   [        [        U 5      5      nSSS.nU HM  n[        US5      (       d  M  [        UR                  SS 5      (       d  M4  UR                  R
                  US'     O   [        [         5      nU  GH_  n[        US5      (       d  M  [        UR                  SS 5      (       a!  US==   UR                  R                  -  ss'   [        UR                  SS 5      (       a  UR                  S5      (       d  SSS.US'   [        UR                  R                  S	S 5      nU(       a  US   S	==   U-  ss'   [        UR                  R                  S
S 5      nU(       a  US   S
==   U-  ss'   [        UR                  SS 5      (       d  GM  UR                  R                  nUc  GM9  U H   nXHR                     R                  U5        M"     GMb     U(       Ga
  [        [        UR                  5       5      S-   5       V	s/ sH  n	S PM     sn	US'   UR!                  5        H  u  pU
[#        S U 5       S 5      [#        S U 5       S 5      SSS.S.US   U
'   U H  n[        USS 5      (       d  M  [        UR$                  S	S 5      nU(       a  US   U
   S   S	==   U-  ss'   [        UR$                  S
S 5      nU(       d  Mk  US   U
   S   S
==   U-  ss'   M     M     U (       a  [        U S   SS5      OS[#        S U 5       S 5      US.$ s  sn	f )N	assistant rolecontentdeltarI   rJ   function_call)name	argumentsrM   rN   
tool_calls   c              3  \   #    U H#  oR                   (       d  M  UR                   v   M%     g 7fN)id.0cs     r    	<genexpr>"_reduce_choices.<locals>.<genexpr>s   s     C*:QddDADD*:   ,,c              3  \   #    U H#  oR                   (       d  M  UR                   v   M%     g 7frR   )typerT   s     r    rW   rX   t   s     I.>&&faff.>rY   )indexrS   r[   functionr]   r   r\   c              3  `   #    U H%  n[        US S5      (       d  M  UR                  v   M'     g7f)finish_reasonN)getattrr_   rT   s     r    rW   rX      s)      )A1ot4  )s   ..)r\   r_   message)listreversedhasattrr`   rK   rI   r   rJ   r>   rL   rO   r\   appendrangemaxkeysr$   nextr]   )choicesreversed_choicesra   rV   rO   name_
arguments_tool_calls_list	tool_call_r\   tool_call_chunkschunks                r    _reduce_choicesrs   Q   s   HW-.G 1g7177FD#A#AggllGFO  ?J$>OJ1gqww	400	"aggoo5"qww66{{?338:/LGO, 5 5vtDO,V4=4$QWW%:%:KN
O,[9ZG9qwwd33"#''"4"4".%4	"??3::9E &5! $ /4S9J5Ka5O/P Q/P!/P Q'1'7'7'9#EC*:CTJI.>I4P%'b9	,GL!%( *5*d33#ENNFDAE-e4Z@HEQH!(d!KJ!z-e4Z@M&M * (:$ 5<Wa0)
 
  % !Rs   L"c                   [        [        5      nU  H3  nUR                   H   nXR                     R	                  U5        M"     M5     U (       a@  U S   R                  5       nUR                  5        Vs/ sH  n[        U5      PM     snUS'   O
SSSSS.0/0nUR                  SS 5      nU(       a  [        U5      OS US'   U$ s  snf )	Nrj   ra   rF   rG   rH   usageusage_metadata)
r   rb   rj   r\   re   
model_dumpvaluesrs   pop_create_usage_metadata)
all_chunkschoices_by_indexrr   choicer*   rj   oai_token_usages          r    _reduce_chatr      s    7B47HmmF\\*11&9 $  rN%%'4D4K4K4M
4MOG$4M
) )kb%IJKL eeGT*O3B/  H
s   5Cc                    / nU  H2  nUR                   S   R                  nUc  M!  UR                  U5        M4     SR                  U5      nU (       a  U S   R	                  5       nSU0/US'   U$ SSU0/0nU$ )Nr   rG   ru   textrj   )rj   r   re   joinrx   )r|   all_contentrr   rJ   r*   s        r    _reduce_completionsr      s    K--"''w'  ggk"GrN%%')*) H &'*+,HrD   c                    U R                  S5      =(       d    U R                  S5      =(       d    SnU R                  S5      =(       d    U R                  S5      =(       d    SnU R                  S5      =(       d    X-   nU R                  S5      =(       d    U R                  S5      =(       d    0 R                  S	5      U R                  S5      =(       d    U R                  S5      =(       d    0 R                  S
5      S.nU R                  S5      =(       d    U R                  S5      =(       d    0 R                  S	5      U R                  S5      =(       d    U R                  S5      =(       d    0 R                  S5      S.n[        UUU[        S0 UR                  5        VVs0 sH  u  pgUc  M
  Xg_M     snnD6[	        S0 UR                  5        VVs0 sH  u  pgUc  M
  Xg_M     snnD6S9$ s  snnf s  snnf )Nprompt_tokensinput_tokensr   completion_tokensoutput_tokenstotal_tokensprompt_tokens_detailsinput_tokens_detailsaudio_tokenscached_tokens)audio
cache_readcompletion_tokens_detailsoutput_tokens_detailsreasoning_tokens)r   	reasoning)r   r   r   input_token_detailsoutput_token_details )r>   r   r   r$   r   )r   r   r   r   r   r   r,   r-   s           r    r{   r{      s   O,X0C0CN0SXWX  	/0 	/	 
 #&&~6V,:VL  78 ""#9:
#n
 78 ""#9:
#o
!  ;< ""#:;
#n
 ;< ""#:;
# 
!" !#!- 
 3 9 9 ;M ;qtqt ;M
 0 
 4 : : <N <tqt <N

 

 N Os   )G45G4G:&G:c                     U R                  5       nUR                  SS 5      nU(       a  [        U5      OS US'   U$ ! [         a&  n[        R                  SU 35        SU 0s S nA$ S nAff = f)Nrv   rw   z"Error processing chat completion: output)rx   rz   r{   BaseExceptionr(   debug)outputsrdictr   r.   s       r    _process_chat_completionr      ss    	#""$))GT27F"?3D 	  #9!=>'""#s   := 
A-A("A-(A-c                   ^ ^^^^^ U=(       d    0 m[         R                  " T 5      UUU UUU4S j5       n[         R                  " T 5      UUU UUU4S j5       n[        R                  " T 5      (       a  U$ U$ )Nc            
        > [         R                  " STSUR                  S5      SL a  TOS [        TTS.TD6nU" T5      " U 0 UD6$ NllmstreamTrM   run_type	reduce_fnprocess_inputs_invocation_params_fnprocess_outputsr   )r   	traceabler>   r/   	argsrA   	decoratorinvocation_params_fnrM   original_creater   r   textras	      r    create_get_wrapper.<locals>.create   s]    )) 
#)::h#74#?iT+"6+
 
	 )4:6::rD   c            
        >#    [        U5      n[        R                  " STSUR                  S5      SL a  TOS [         TTS.TD6nU" T5      " U 0 UD6I S h  vN $  N7fr   )r/   r   r   r>   r   s	      r    acreate_get_wrapper.<locals>.acreate  sp     !&))) 
#)::h#74#?iT+"6+
 
	 /@@@@@s   AAAA	functoolswrapsr   is_async)	r   rM   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r    _get_wrapperr      sq      bF___%; ; &; ___%A A &A "**?;;7GGrD   c                   ^ ^^^^ U=(       d    0 m[         R                  " T 5      UUU UU4S j5       n[         R                  " T 5      UUU UU4S j5       n[        R                  " T 5      (       a  U$ U$ )Nc            
     b   > [         R                  " STSS [        TTS.TD6nU" T5      " U 0 UD6$ Nr   r   r   )r   r   r/   r   rA   r   r   rM   original_parser   r   s      r    parse!_get_parse_wrapper.<locals>.parse"  sK    )) 
+"6+
 
	 ($9&99rD   c            
        >#    [        U5      n[        R                  " STSS [         TTS.TD6nU" T5      " U 0 UD6I S h  vN $  N7fr   )r/   r   r   r   s      r    aparse"_get_parse_wrapper.<locals>.aparse/  s^     !&))) 
+"6+
 
	 ~.?????s   >AAAr   )r   rM   r   r   r   r   r   r   s   ``` `  @r    _get_parse_wrapperr     sq      bF__^$
: 
: %
: __^$@ @ %@ !)).996DuDrD   c                f    U  H*  nUR                   S:X  d  M  [        UR                  5      s  $    0 $ )Nzresponse.completed)r[   _process_responses_api_outputresponse)eventsevents     r    _reduce_response_eventsr   @  s/    ::--0@@  IrD   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
TracingExtraiG  zOptional[Mapping[str, Any]]metadatazOptional[list[str]]tagszOptional[ls_client.Client]r   r   N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r   rD   r    r   r   G  s    ))
&&rD   r   F)total
ChatOpenAI)r   	chat_namecompletions_namec               8   U=(       d    0 n[        U R                  R                  R                  U[        U[
        R                  " [        S5      [        S9U R                  R                  l        [        U R                  R                  U[        U[
        R                  " [        S5      S9U R                  l        [        U S5      (       a  [        U R                  S5      (       a  [        U R                  R                  S5      (       a  [        U R                  R                  R                  S5      (       au  [        U R                  R                  R                  R                  U[        U[
        R                  " [        S5      S9U R                  R                  R                  l        [        U S5      (       a  [        U R                  S	5      (       aR  [        U R                  R                  U[        [         U[
        R                  " [        S5      S
9U R                  l        [        U R                  S5      (       aM  [        U R                  R                  U[         U[
        R                  " [        S5      S9U R                  l        U $ )a  Patch the OpenAI client to make it traceable.

Supports:
    - Chat and Responses API's
    - Sync and async OpenAI clients
    - create() and parse() methods
    - with and without streaming

Args:
    client (Union[OpenAI, AsyncOpenAI]): The client to patch.
    tracing_extra (Optional[TracingExtra], optional): Extra tracing information.
        Defaults to None.
    chat_name (str, optional): The run name for the chat completions endpoint.
        Defaults to "ChatOpenAI".
    completions_name (str, optional): The run name for the completions endpoint.
        Defaults to "OpenAI".

Returns:
    Union[OpenAI, AsyncOpenAI]: The patched client.

Example:

    .. code-block:: python

        import openai
        from langsmith import wrappers

        # Use OpenAI client same as you normally would.
        client = wrappers.wrap_openai(openai.OpenAI())

        # Chat API:
        messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {
                "role": "user",
                "content": "What physics breakthroughs do you predict will happen by 2300?",
            },
        ]
        completion = client.chat.completions.create(
            model="gpt-4o-mini", messages=messages
        )
        print(completion.choices[0].message.content)

        # Responses API:
        response = client.responses.create(
            model="gpt-4o-mini",
            messages=messages,
        )
        print(response.output_text)

.. versionchanged:: 0.3.16

    Support for Responses API added.
chat)r   r   r   r   )r   r   betacompletionsr   	responsesr   )r   r   r   )r   r   r   r   r   r   partialrC   r   r   rd   r   r   r   r   r   r   )r   r   r   r   s       r    wrap_openair   M  s   z "'RM &2&&#&../GP0&FKK" !-!!#&../GO!F 	FKK((FKK$$m44FKK$$00'::-?KK((..$'!*!2!23KV!T.
$$* v{##6##X..&2  ''' =+%.%6%6,f&	'F# 6##W--%7  &&-+%.%6%6,f&&F" MrD   c                    U (       a:   U R                  SSS9nUR                  SS 5      =n(       a  [        U5      US'   U$ 0 $ ! [         a    SU 0s $ f = f)NTjson)exclude_nonemoderv   rw   r   )rx   rz   r{   r'   )r   r   rv   s      r    r   r     sm    	(((d(HF

7D11u1+A%+H'(M I  	(h''	(s   8A AA)returnzOptional[type])r*   dictr   r   )r@   r?   rA   r   )rj   zlist[Choice]r   r   )r|   zlist[ChatCompletionChunk]r   r   )r|   zlist[Completion]r   r   )r   r   r   r   )r   r   )NNN)r   r   rM   r?   r   r   r   Optional[TracingExtra]r   Optional[Callable]r   r   r   r   )NN)r   r   rM   r?   r   r   r   r   r   r   r   r   )r   zlist[ResponseStreamEvent]r   r   )
r   r   r   r   r   r?   r   r?   r   r   )r   r   r   r   )7
__future__r   r   loggingcollectionsr   collections.abcr   typingr   r   r   r	   r
   r   typing_extensionsr   	langsmithr   	ls_clientr   langsmith.schemasr   r   r   r2   r   r   'openai.types.chat.chat_completion_chunkr   r   r   openai.types.completionr   openai.types.responsesr   r   	getLoggerr   r(   	lru_cacher!   r/   rC   rs   r   r   r{   r   r   r   r   r   r   r   r   rD   r    <module>r      s   "   # #  ( ) ! R R* 
 3: CuX}c9:;			8	$  &;|* ,^
#" -1/3*.&H&H
&H &H *	&H
 -&H (&H &HZ -1/3$E$E
$E $E *	$E
 -$E $EN'9E ' -1!$xx *x 	x
 x xv	rD   