
    9iCJ                    $   d dl mZ d dlZd dlZd dlmZ d dl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 d dlmZ d d	lmZmZmZ e	rd d
lmZmZ d dlmZmZmZ d dl m!Z! d dl"m#Z#  ededde
f         Z$ ejJ                  e&      Z'ejP                  d&d       Z)d'dZ*d'dZ+d(dZ,d)dZ-d*dZ.d+dZ/	 d,	 	 	 	 	 d-dZ0d.dZ1	 	 	 d/	 	 	 	 	 	 	 	 	 	 	 	 	 d0dZ2	 	 d1	 	 	 	 	 	 	 	 	 	 	 d2dZ3d3dZ4 G d ded !      Z5dd"dd#	 	 	 	 	 	 	 	 	 d4d$Z6d5d%Z7y)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                     g } 	 ddl m}m} | j                  |       | j                  |       t        |       S # t        $ r Y t        |       S w xY w)z4Get NotGiven/Omit sentinel types used by OpenAI SDK.r   )NotGivenOmit)openai._typesr   r   appendImportErrortuple)typesr   r   s      d/var/www/html/backtest/airagagent/rag_env/lib/python3.12/site-packages/langsmith/wrappers/_openai.py_get_omit_typesr$   %   sS      E0XT <  <s   *9 	AAc                   	 t               }|s| S | j                         D ci c]'  \  }}t        ||      s|j                  d      r|||) c}}S c c}}w # t        $ r$}t
        j                  d|        | cY d }~S d }~ww xY w)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 	
1q*-!,,x2HQY qD
 	
 

  1!56s3   A A ,AA A 	B"B;BBc                    t        |       } d| v r(| d   }t        |d      r	 i | d|j                         iS | S # t        $ r Y | S w xY w)zCStrip `NotGiven` values and serialize `text_format` to JSON schema.text_formatmodel_json_schema)r2   hasattrr5   r*   )r-   r4   s     r#   _process_inputsr7   C   su    A &; 34!;#@#@#B  H  Hs   : 	AAc                   t        |      }|j                  d      }|rt        |t              r|g}h d}|j	                         D ci c]  \  }}||v s|| }}}|| |j                  d      |j                  d      |j                  d      xs$ |j                  d      xs |j                  d      ||dS c c}}w )	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 ")AQ2I-I1 
  #!g.",,}5!l3 -<</0-<<+, 1
 
	s   	B;B;c                   t        t        |             }ddd}|D ]A  }t        |d      st        |j                  dd       s(|j                  j
                  |d<    n t        t               }| D ]5  }t        |d      st        |j                  dd       r!|dxx   |j                  j                  z  cc<   t        |j                  dd       r|j                  d      sddd|d<   t        |j                  j                  d	d       }|r|d   d	xx   |z  cc<   t        |j                  j                  d
d       }|r|d   d
xx   |z  cc<   t        |j                  dd       s|j                  j                  }||D ]   }||j                     j                  |       " 8 |rt        t        |j                               dz         D 	cg c]  }	d  c}	|d<   |j!                         D ]  \  }
}|
t#        d |D        d       t#        d |D        d       dddd|d   |
<   |D ]o  }t        |dd       st        |j$                  d	d       }|r|d   |
   d   d	xx   |z  cc<   t        |j$                  d
d       }|sZ|d   |
   d   d
xx   |z  cc<   q  | rt        | d   dd      ndt#        d |D        d       |dS c c}	w )N	assistant rolecontentdeltarh   ri   function_call)name	argumentsrl   rm   
tool_calls   c              3  N   K   | ]  }|j                   s|j                     y wN)id.0cs     r#   	<genexpr>z"_reduce_choices.<locals>.<genexpr>   s     CQaddADDC   %%c              3  N   K   | ]  }|j                   s|j                     y wrq   )typers   s     r#   rv   z"_reduce_choices.<locals>.<genexpr>   s     I!&&affIrw   )indexrr   ry   functionr{   r   rz   c              3  N   K   | ]  }t        |d d      r|j                    yw)finish_reasonN)getattrr}   rs   s     r#   rv   z"_reduce_choices.<locals>.<genexpr>   s(      1ot4 s   #%)rz   r}   message)listreversedr6   r~   rj   rh   r   ri   r[   rk   rn   rz   r   rangemaxkeysr'   nextr{   )choicesreversed_choicesr   ru   rn   name_
arguments_tool_calls_list	tool_call_rz   tool_call_chunkschunks                r#   _reduce_choicesr      s   HW-.G  1g7177FD#AggllGFO ?J$>OJ F1gqww	40	"aggoo5"qww6{{?38:/LGO, 5 5vtDO,V4=4$QWW%:%:KN
O,[9ZG9qwwd3"#''"4"4".%4 F	"9??3::9EF!F$ /4S9J5Ka5O/P Q! Q'1'7'7'9 	#E#C*:CTJI.>I4P%'b9	,GL!%( * 	5*d3#ENNFDAE-e4Z@HEQH!(d!KJ!-e4Z@M&M		$ 5<Wa0)
 
  % !Rs   	K	c                v   t        t              }| D ]1  }|j                  D ]   }||j                     j	                  |       " 3 | r>| d   j                         }|j                         D cg c]  }t        |       c}|d<   n
dddddigi}|j                  dd       }|rt        |      nd |d<   |S c c}w )	Nr   r   re   rf   rg   usageusage_metadata)
r   r   r   rz   r   
model_dumpvaluesr   pop_create_usage_metadata)
all_chunkschoices_by_indexr   choicer-   r   oai_token_usages          r#   _reduce_chatr      s    7B47H :mm 	:FV\\*11&9	:: rN%%'4D4K4K4M
)0OG$
) )kb%IJKL eeGT*O3B/  H
s   -B6c                    g }| D ]/  }|j                   d   j                  }||j                  |       1 dj                  |      }| r| d   j	                         }d|ig|d<   |S dd|igi}|S )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                ,   |dv r|nd }|r| dnd}| j                  d      xs | j                  d      xs d}| j                  d      xs | j                  d      xs d}| j                  d	      xs ||z   }d
| j                  d      xs | j                  d      xs i j                  d      | d| j                  d      xs | j                  d      xs i j                  d      i}d
| j                  d      xs | j                  d      xs i j                  d      | d| j                  d      xs | j                  d      xs i j                  d      i}|r<||j                  | d      xs dz
  ||<   ||j                  | d      xs dz
  ||<   t        |||t        di |j                         D 	
ci c]  \  }	}
|
	|	|
 c}
}	t	        di |j                         D 	
ci c]  \  }	}
|
	|	|
 c}
}	      S c c}
}	w c c}
}	w )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
34 9F $$(;'<I%FGL19
45 !#!- 
 3 9 9 ;M1q}q!tM
 0 
 4 : : <N1q!tN

 

 N Os    
H
H
/
H:Hc                    	 | j                         }|j                  dd       }|rt        ||j                  d            nd |d<   |S # t        $ r&}t
        j                  d|        d| icY d }~S d }~ww xY w)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  #?EIIn4MN 	
  #9!=>'""#s   AA 	A7A2,A72A7c                     |xs i t        j                          fd       }t        j                          fd       }t        j                         r|S |S )Nc            
         t        j                  dd|j                  d      du rnd t        d}  |      | i |S 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#   createz_get_wrapper.<locals>.createH  s_    )) 
#)::h#74#?iT*"6+
 
	 *y)4:6::r   c            
        K   t        j                  dd|j                  d      du rnd t        d}  |      | i | d {   S 7 wr   r   r   s	      r#   acreatez_get_wrapper.<locals>.acreateV  si     )) 
#)::h#74#?iT*"6+
 
	 0Y/@@@@@s   AA
AA	functoolswrapsr   is_async)	r   rl   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r#   _get_wrapperr   >  sn      bF___%; ; &; ___%
A 
A &
A "**?;7GGr   c                     |xs i t        j                          fd       }t        j                          fd       }t        j                         r|S |S )Nc            
     `    t        j                  ddd t        d}  |      | i |S Nr   r   r   r   r   r7   r   r_   r   r   rl   original_parser   r   s      r#   parsez!_get_parse_wrapper.<locals>.parseo  sM    )) 
*"6+
 
	 )y($9&99r   c            
     |   K   t        j                  ddd t        d}  |      | i | d {   S 7 wr   r   r   s      r#   aparsez"_get_parse_wrapper.<locals>.aparse|  sW     )) 
*"6+
 
	 /Y~.?????s   2<:<r   )r   rl   r   r   r   r   r   r   s   ``` `  @r#   _get_parse_wrapperr   f  sc      bF__^$
: %
: __^$
@ %
@ !)).96DuDr   c                `    | D ](  }|j                   dk(  st        |j                        c S  i S )Nzresponse.completed)ry   _process_responses_api_outputresponse)eventsevents     r#   _reduce_response_eventsr     s6     A::--0@@A Ir   c                  ,    e Zd ZU ded<   ded<   ded<   y)TracingExtrazOptional[Mapping[str, Any]]metadatazOptional[list[str]]tagszOptional[ls_client.Client]r   N)__name__
__module____qualname____annotations__r   r   r#   r   r     s    ))
&&r   r   F)total
ChatOpenAI)r   	chat_namecompletions_namec                  |xs i }d}	 ddl m}m} t        | |      st        | |      rd}d}d}t        | j                  j                  j                  |t        |t        j                  t        d|      t              | j                  j                  _        t        | j                  j                  |t        |t        j                  t        d	|      
      | j                  _        t        | d      rt        | j                   d      rt        | j                   j                  d      rt        | j                   j                  j                  d      rxt#        | j                   j                  j                  j$                  |t        |t        j                  t        d|      
      | j                   j                  j                  _        t        | d      rt        | j                  d      rt        | j                  j                  d      rdt#        | j                  j                  j$                  |t        |t        j                  t        d|      
      | j                  j                  _        t        | d      rt        | j&                  d      rUt        | j&                  j                  |t(        t*        |t        j                  t        d|            | j&                  _        t        | j&                  d      rPt#        | j&                  j$                  |t*        |t        j                  t        d|      
      | j&                  _        | S # t        $ r Y .w xY w)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: The client to patch.
        tracing_extra: Extra tracing information.
        chat_name: The run name for the chat completions endpoint.
        completions_name: The run name for the completions endpoint.

    Returns:
        The patched client.

    Example:
        ```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)
        ```

    !!! warning "Behavior changed in `langsmith` 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   r "'RMK8fk*jAQ.R!K)I,
 &2&&#&..$fk
 1	&FKK" !-!!#&..$e[
!F 	FKK(FKK$$m4FKK$$00':-?KK((..$'!*!2!2(&+".
$$* 	FKK/FKK++W5(:KK##))$'!*!2!2(&+")
% v{#6##X.&2  ''' =+%.%6%6,fk&	'F# 6##W-%7  &&-+%.%6%6,fk&&F" Me  s   &M 	MMc                    | rH	 | j                  dd      }|j                  dd       x}rt        ||j                  d            |d<   |S i S # t        $ r d| icY S w xY w)NTjson)exclude_nonemoder   rE   r   r   )r   r   r   r[   r*   )r   r   r   s      r#   r   r   1  s}    	(((d(HF

7D11u1+A6::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!$UU *U 	U
 U Upr   