
    ;ibK                    F   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-S jjr0S.S jr1   S/             S0S jjr2  S1           S2S jjr3S3S jr4 " S S\S S!9r5SS"SS#.         S4S$ jjr6S5S% jr7g)6    )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/home/dmtnaga/Documents/work/airagagent/rag_env/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                    [        U 5      n SU ;   a-  U S   n[        US5      (       a   0 U ESUR                  5       0E$ U $ ! [         a     U $ f = f)z?Strip NotGiven values and serialize text_format to JSON schema.text_formatmodel_json_schema)r2   hasattrr5   r*   )r-   r4   s     r#   _process_inputsr7   C   sx    A &; 344!;#@#@#B  H  Hs   A 
AAc                   [        U5      nUR                  S5      nU(       a  [        U[        5      (       a  U/n1 SknUR	                  5        VVs0 s H  u  pgXe;   d  M  Xg_M     nn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US.$ s  snnf )	Nstop>   nseedusertop_plogprobs	reasoning	verbosity
logit_bias
modalities
prediction
truncationservice_tiertop_logprobsstream_optionsresponse_formatpresence_penaltyprompt_cache_keyreasoning_effortfrequency_penaltyweb_search_optionsparallel_tool_calls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ls_invocation_params)r2   getr(   strr'   )	
model_typeproviderkwargsstrippedr9   allowed_invocation_keysr/   r0   invocation_paramss	            r#   _infer_invocation_paramsrc   U   s    'H<<D
4%%v4 "))Q-I)  
  #!g.",,}5!l3 -<</0-<<+, 1
 
	s   C"C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deltarh   ri   function_call)name	argumentsrl   rm   
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     C*:QddDADD*:   --c              3  ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7frq   )typers   s     r#   rv   rw      s     I.>&&faff.>rx   )indexrr   rz   functionr|   r   r{   c              3  b   #    U  H%  n[        US S5      (       d  M  UR                  v   M'     g7f)finish_reasonN)getattrr~   rs   s     r#   rv   rw      s)      )A1ot4  )s   //)r{   r~   message)listreversedr6   r   rj   rh   r   ri   r[   rk   rn   r{   r   rangemaxkeysr'   nextr|   )choicesreversed_choicesr   ru   rn   name_
arguments_tool_calls_list	tool_call_r{   tool_call_chunkschunks                r#   _reduce_choicesr      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 )	Nr   r   re   rf   rg   usageusage_metadata)
r   r   r   r{   r   
model_dumpvaluesr   pop_create_usage_metadata)
all_chunkschoices_by_indexr   choicer-   r   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   rf   r   textr   )r   r   r   joinr   )r   all_contentr   ri   r-   s        r#   _reduce_completionsr      s    K--"''w'  ggk"GrN%%')*) H &'*+,H    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flexr   rf   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_detailsr?   reasoning_tokens)r   r   r   input_token_detailsoutput_token_details )r[   r   r   r'   r   )r   rE   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)Nr   rE   r   z"Error processing chat completion: output)r   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rl   run_type	reduce_fnprocess_inputs_invocation_params_fnprocess_outputsr   r   	traceabler[   r7   	argsr_   	decoratorinvocation_params_fnrl   original_creater   r   textras	      r#   create_get_wrapper.<locals>.createH  s]    )) 
#)::h#74#?iT*"6+
 
	 )4:6::r   c            
        >#    [         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   s	      r#   acreate_get_wrapper.<locals>.acreateV  sf     )) 
#)::h#74#?iT*"6+
 
	 /@@@@@s   A	AAA	functoolswrapsr   is_async)	r   rl   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r#   _get_wrapperr   >  sq      bF___%; ; &; ___%
A 
A &
A "**?;;7GGr   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   r7   r   r_   r   r   rl   original_parser   r   s      r#   parse!_get_parse_wrapper.<locals>.parseo  sK    )) 
*"6+
 
	 ($9&99r   c            
     ~   >#    [         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   s      r#   aparse"_get_parse_wrapper.<locals>.aparse|  sT     )) 
*"6+
 
	 ~.?????s   3=;=r   )r   rl   r   r   r   r   r   r   s   ``` `  @r#   _get_parse_wrapperr   f  sq      bF__^$
: 
: %
: __^$
@ 
@ %
@ !)).996DuDr   c                f    U  H*  nUR                   S:X  d  M  [        UR                  5      s  $    0 $ )Nzresponse.completed)rz   _process_responses_api_outputresponse)eventsevents     r#   _reduce_response_eventsr     s/    ::--0@@  Ir   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
TracingExtrai  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   r   r#   r   r     s    ))
&&r   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   partialrc   r   r   r6   r  r   r   r  r   r   )r   r   r   r   rT   r  r  s          r#   wrap_openair
    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moder   rE   r   r   )r   r   r   r[   r*   )r   r   r   s      r#   r   r   5  s{    	(((d(HF

7D11u1+A::n5,'( M I  	(h''	(s   AA A$#A$)returnztuple[type, ...])r-   dictr  r  )r]   r\   r^   r\   r_   r  )r   zlist[Choice]r  r  )r   zlist[ChatCompletionChunk]r  r  )r   zlist[Completion]r  r  rq   )r   r  rE   zOptional[str]r  r   )r   r   )NNN)r   r   rl   r\   r   r   r   Optional[TracingExtra]r   Optional[Callable]r   r  r  r   )NN)r   r   rl   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  )8
__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   r7   rc   r   r   r   r   r   r   r   r   r   r
  r   r   r   r#   <module>r!     s   "   # #  ( ) ! R R* 
 3: CuX}c9:;			8	$  $0f;|*" :>AA)6AAH#& -1/3*.%H%H
%H %H *	%H
 -%H (%H %HX -1/3#E#E
#E #E *	#E
 -#E #EL'9E ' -1!$YY *Y 	Y
 Y Yxr   