
    )hBF                    <   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,S jjr/S-S jr0   S.             S/S jjr1  S0           S1S jjr2S2S jr3 " S S\SS 9r4SS!SS".         S3S# jjr5S4S$ jr6g)5    )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                     / n  SSK JnJn  U R                  U5        U R                  U5        [        U 5      $ ! [         a     Nf = f)z4Get NotGiven/Omit sentinel types used by OpenAI SDK.r   )NotGivenOmit)openai._typesr   r   appendImportErrortuple)typesr   r   s      J/root/34ku/venv/lib/python3.13/site-packages/langsmith/wrappers/_openai.py_get_omit_typesr$   %   sI     E0XT <  s   *9 
AAc                <    [        5       nU(       d  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
omit_typeskves        r#   _strip_not_givenr2   4   s    $&
H 	
!q- 23,,x2H2HQ AD!
 	
 

  1!56s?   A- A- A'A'A'#A- 'A- -
B7BBBc                D   [        U5      nUR                  S5      nU(       a  [        U[        5      (       a  U/nU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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)r2   getr(   str)
model_typeproviderkwargsstrippedr4   s        r#   _infer_invocation_paramsrF   C   s    'H<<D
4%%v  #!g.",,}5!l3 -<</0-<<+,	 	    c                P   [        [        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deltarL   rM   function_call)name	argumentsrP   rQ   
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>x   s     C*:QddDADD*:   --c              3  ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7frU   )typerW   s     r#   rZ   r[   y   s     I.>&&faff.>r\   )indexrV   r^   functionr`   r   r_   c              3  b   #    U  H%  n[        US S5      (       d  M  UR                  v   M'     g7f)finish_reasonN)getattrrb   rW   s     r#   rZ   r[      s)      )A1ot4  )s   //)r_   rb   message)listreversedhasattrrc   rN   rL   r   rM   r@   rO   rR   r_   r   rangemaxkeysr'   nextr`   )choicesreversed_choicesrd   rY   rR   name_
arguments_tool_calls_list	tool_call_r_   tool_call_chunkschunks                r#   _reduce_choicesru   V   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 (       aA  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 )	Nrl   rd   rI   rJ   rK   usageusage_metadata)
r   re   rl   r_   r   
model_dumpvaluesru   pop_create_usage_metadata)
all_chunkschoices_by_indexrt   choicer-   rl   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   rJ   rw   textrl   )rl   r   r   joinrz   )r~   all_contentrt   rM   r-   s        r#   _reduce_completionsr      s    K--"''w'  ggk"GrN%%')*) H &'*+,HrG   c                   US;   a  UOS nU(       a  U S3OSn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    XE-   nS
U R                  S5      =(       d    U R                  S5      =(       d    0 R                  S5      U S3U R                  S5      =(       d    U R                  S5      =(       d    0 R                  S5      0nS
U R                  S5      =(       d    U R                  S5      =(       d    0 R                  S5      U S3U R                  S5      =(       d    U R                  S5      =(       d    0 R                  S5      0nU(       aD  UUR                  U S35      =(       d    S-
  Xr'   UUR                  U S35      =(       d    S-
  X'   [        UUU[        S0 UR                  5        V	V
s0 s H  u  pU
c  M
  X_M     sn
n	D6[	        S0 UR                  5        V	V
s0 s H  u  pU
c  M
  X_M     sn
n	D6S9$ s  sn
n	f s  sn
n	f )N)priorityflexrr   rJ   prompt_tokensinput_tokensr   completion_tokensoutput_tokenstotal_tokensaudioprompt_tokens_detailsinput_tokens_detailsaudio_tokens
cache_readcached_tokenscompletion_tokens_detailsoutput_tokens_details	reasoningreasoning_tokens)r   r   r   input_token_detailsoutput_token_details )r@   r   r   r'   r   )r   service_tierrecognized_service_tierservice_tier_prefixr   r   r   r   r   r/   r0   s              r#   r}   r}      s    %(<<$  *A"
#1%b 
 	O,X0C0CN0SXWX  	/0 	/	 
 #&&~6V,:VL 78 ""#9:
#n

z* 78 ""#9:
#o
! 	 ;< ""#:;
#n

y) ;< ""#:;
# 
!"  8D##':&;:$FGL18
4 9F $$(;'<I%FGL19
5 !#!- 
 3 9 9 ;M ;qtqt ;M
 0 
 4 : : <N <tqt <N

 

 N Os   	I!!I!	I'I'c                     U R                  5       nUR                  SS 5      nU(       a  [        X!R                  S5      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)Nrx   r   ry   z"Error processing chat completion: output)rz   r|   r}   r@   BaseExceptionr+   debug)outputsrdictr   r1   s       r#   _process_chat_completionr      s    #""$))GT2  #?IIn4MN 	
  #9!=>'""#s   A	A 
A<A71A<7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rP   run_type	reduce_fnprocess_inputs_invocation_params_fnprocess_outputsr   )r   	traceabler@   r2   	argsrD   	decoratorinvocation_params_fnrP   original_creater   r   textras	      r#   create_get_wrapper.<locals>.create  s]    )) 
#)::h#74#?iT+"6+
 
	 )4:6::rG   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   )r2   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   rP   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r#   _get_wrapperr     sq      bF___%; ; &; ___%A A &A "**?;;7GGrG   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   r2   r   rD   r   r   rP   original_parser   r   s      r#   parse!_get_parse_wrapper.<locals>.parse>  sK    )) 
+"6+
 
	 ($9&99rG   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   )r2   r   r   r   s      r#   aparse"_get_parse_wrapper.<locals>.aparseK  s^     !&))) 
+"6+
 
	 ~.?????s   >AAAr   )r   rP   r   r   r   r   r   r   s   ``` `  @r#   _get_parse_wrapperr   5  sq      bF__^$
: 
: %
: __^$@ @ %@ !)).996DuDrG   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@@  IrG   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
TracingExtraic  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   rG   r#   r   r   c  s    ))
&&rG   r   F)total
ChatOpenAI)r   	chat_namecompletions_namec               ,   U=(       d    0 nSn SSK JnJn  [        X5      (       d  [        X5      (       a  SnSnSn[        U R                  R                  R                  U[        U[        R                  " [        SU5      [        S9U R                  R                  l        [        U R                  R                  U[        U[        R                  " [        S	U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      (       av  [#        U R                   R                  R                  R$                  U[        U[        R                  " [        SU5      S
9U R                   R                  R                  l        [        U S5      (       a  [        U R                  S5      (       a  [        U R                  R                  S5      (       ab  [#        U R                  R                  R$                  U[        U[        R                  " [        SU5      S
9U R                  R                  l        [        U S5      (       a  [        U R&                  S5      (       aS  [        U R&                  R                  U[(        [*        U[        R                  " [        SU5      S9U R&                  l        [        U R&                  S5      (       aN  [#        U R&                  R$                  U[*        U[        R                  " [        SU5      S
9U R&                  l        U $ ! [         a     GNUf = f)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.
openair   )AsyncAzureOpenAIAzureOpenAIazureAzureChatOpenAIr   chat)r   r   r   r   )r   r   betacompletionsr   	responsesr   )r   r   r   )r   r   r   r(   r    r   r   r   r   r   r   partialrF   r   r   rg   r   r   r   r   r   r   )r   r   r   r   r:   r   r   s          r#   wrap_openair   i  s   z "'RMK8f**j.R.R!K)I,
 &2&&#&..$fk
 1	&FKK" !-!!#&..$e[
!F 	FKK((FKK$$m44FKK$$00'::-?KK((..$'!*!2!2(&+".
$$* 	FKK//FKK++W55(:KK##))$'!*!2!2(&+")
% v{##6##X..&2  ''' =+%.%6%6,fk&	'F# 6##W--%7  &&-+%.%6%6,fk&&F" Me  s   .N 
NNc                    U (       aI   U R                  SSS9nUR                  SS 5      =n(       a  [        X!R                  S5      5      US'   U$ 0 $ ! [         a    SU 0s $ f = f)NTjson)exclude_nonemoderx   r   ry   r   )rz   r|   r}   r@   r*   )r   r   rx   s      r#   r   r     s{    	(((d(HF

7D11u1+A::n5,'( M I  	(h''	(s   AA A$#A$)returnztuple[type, ...])r-   dictr   r   )rB   rA   rC   rA   rD   r   )rl   zlist[Choice]r   r   )r~   zlist[ChatCompletionChunk]r   r   )r~   zlist[Completion]r   r   rU   )r   r   r   zOptional[str]r   r   )r   r   )NNN)r   r   rP   rA   r   r   r   Optional[TracingExtra]r   Optional[Callable]r   r   r   r   )NN)r   r   rP   rA   r   r   r   r   r   r   r   r   )r   zlist[ResponseStreamEvent]r   r   )
r   r   r   r   r   rA   r   rA   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   r   r   r   'openai.types.chat.chat_completion_chunkr   r   r   openai.types.completionr   openai.types.responsesr   r   	getLoggerr   r+   	lru_cacher$   r2   rF   ru   r   r   r}   r   r   r   r   r   r   r   r   rG   r#   <module>r     s   "   # #  ( ) ! R R* 
 3: CuX}c9:;			8	$  &;|*" :>AA)6AAH#& -1/3*.&H&H
&H &H *	&H
 -&H (&H &HZ -1/3$E$E
$E $E *	$E
 -$E $EN'9E ' -1!$YY *Y 	Y
 Y YxrG   