
    %Gg>                       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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jR                  e*      Z+ejX                  d%d       Z-d&dZ.d'dZ/d(dZ0d)dZ1d*dZ2d+dZ3d,dZ4	 	 	 d-	 	 	 	 	 	 	 	 	 	 	 	 	 d.dZ5	 	 d/	 	 	 	 	 	 	 	 	 	 	 d0dZ6d1dZ7 G d ded       Z8dd!dd"	 	 	 	 	 	 	 	 	 d2d#Z9d3d$Z:y)4    )annotationsN)defaultdict)Mapping)
TYPE_CHECKINGAnyCallableDefaultDictDictListOptionalTypeTypeVarUnion)	TypedDict)client)run_helpers)InputTokenDetailsOutputTokenDetailsUsageMetadata)AsyncOpenAIOpenAI)ChatCompletionChunkChoiceChoiceDeltaToolCall)
Completion)ResponseStreamEventCr   r   )boundc                 2    	 ddl m}  | S # t        $ r Y y w xY w)Nr   NotGiven)openai._typesr!   ImportErrorr    s    w/home/kushmeetdev/apache_webroot/langgraph_flaskproject/venv/lib/python3.12/site-packages/langsmith/wrappers/_openai.py_get_not_givenr%   )   s!    * s   
 	c                   	 t               }|| 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	not_givenkves        r$   _strip_not_givenr3   3   s    "$	H 	
1q),h1GAI qD
 	
 

  1!56s3   A A ,AA A 	B"B;BBc                   t        |      }|j                  d      }|rt        |t              r|g}d| |j                  d      |j                  d      |j                  d      xs$ |j                  d      xs |j                  d      |d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)r3   getr)   str)
model_typekwargsstrippedr5   s       r$   _infer_invocation_paramsrG   B   s    'H<<D
4%v  #!g.",,}5!l3 -<</0-<<+,	 	    c                   t        t        |             }ddd}|D ]A  }t        |d      st        |j                  dd       s(|j                  j
                  |d<    n t        t               }| D ]N  }t        |d      st        |j                  d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                  |       " Q |r|j                         D 	cg c]  }	d  c}	|d<   |j                         D ]  \  }
}|
t        d |D        d       t        d |D        d       d|d   |
<   |D ]  }t        |dd       s|d   |
   j                  d      sddd|d   |
   d<   t        |j                   d	d       }|r|d   |
   d   }|d	xx   |z  cc<   t        |j                   d
d       }|s|d   |
   d   }|d
xx   |z  cc<     | rt        | d   dd      ndt        d |D        d       |dS c c}	w )N	assistant rolecontentdeltarM   rN   function_call)name	argumentsrQ   rR   
tool_callsc              3  N   K   | ]  }|j                   s|j                     y wN)id.0cs     r$   	<genexpr>z"_reduce_choices.<locals>.<genexpr>w   s     CQaddADDC   %%c              3  N   K   | ]  }|j                   s|j                     y wrU   )typerW   s     r$   rZ   z"_reduce_choices.<locals>.<genexpr>x   s     I!&&affIr[   )indexrV   r]   functionr   r^   c              3  N   K   | ]  }t        |d d      r|j                    yw)finish_reasonN)getattrra   rW   s     r$   rZ   z"_reduce_choices.<locals>.<genexpr>   s(      1ot4 s   #%)r^   ra   message)listreversedhasattrrb   rO   rM   r   rN   rB   rP   rS   r^   appendkeysr(   nextr_   )choicesreversed_choicesrc   rY   rS   name_
arguments_tool_calls_list	tool_call_r^   tool_call_chunkschunkfn_s                 r$   _reduce_choicesrt   U   s   HW-.G  1g7177FD#AggllGFO ?J$>OJ >1g7177It#D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 >	"177+229=>!>$ /9/@ A! A'1'7'7'9 	7#E#C*:CTJI.>I4P,GL!%(
 * 75*d3"<07;;JG$&)+D-e4Z@ $ENNFDAE%l3E::FFu,!(d!KJ!%l3E::FK(J6(7	7, 5<Wa0)
 
  - !Bs   	K3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 )	Nrj   rc   rJ   rK   rL   usageusage_metadata)
r   rd   rj   r^   rg   
model_dumpvaluesrt   pop_create_usage_metadata)
all_chunkschoices_by_indexrr   choicer.   rj   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   rK   rv   textrj   )rj   r   rg   joinry   )r}   all_contentrr   rN   r.   s        r$   _reduce_completionsr      s    K (--"''w'( ggk"GrN%%')*) H &'*+,HrH   c                ~   | j                  d      xs | j                  d      xs d}| j                  d      xs | j                  d      xs d}| j                  d      xs ||z   }| j                  d      xs | j                  d      xs i j                  d	      | j                  d      xs | j                  d      xs i j                  d
      d}| j                  d      xs | j                  d      xs i j                  d	      | j                  d      xs | j                  d      xs i j                  d      d}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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 )rB   r   r   r(   r   )r   r   r   r   r   r   r0   r1   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1q}q!tM
 0 
 4 : : <N1q!tN

 

 N Os   )
F34F3
F9#F9c                    	 | j                         }|j                  dd       }|rt        |      nd |d<   |S # t        $ r&}t        j                  d|        d| icY d }~S d }~ww xY w)Nrw   rx   z"Error processing chat completion: output)ry   r{   r|   BaseExceptionr,   debug)outputsrdictr   r2   s       r$   _process_chat_completionr      ss    	#""$))GT27F"?3D 	  #9!=>'""#s   58 	A'A"A'"A'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rQ   run_type	reduce_fnprocess_inputs_invocation_params_fnprocess_outputsr   )r   	traceablerB   r3   	argsrE   	decoratorinvocation_params_fnrQ   original_creater   r   textras	      r$   createz_get_wrapper.<locals>.create  s_    )) 
#)::h#74#?iT+"6+
 
	 *y)4:6::rH   c            
        K   t        |      }t        j                  dd|j                  d      du rnd t         d}  |      | i | d {   S 7 wr   )r3   r   r   rB   r   s	      r$   acreatez_get_wrapper.<locals>.acreate  ss     !&))) 
#)::h#74#?iT+"6+
 
	 0Y/@@@@@s   AAAA	functoolswrapsr   is_async)	r   rQ   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r$   _get_wrapperr      sn      bF___%; ; &; ___%A A &A "**?;7GGrH   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   r3   r   rE   r   r   rQ   original_parser   r   s      r$   parsez!_get_parse_wrapper.<locals>.parse*  sM    )) 
+"6+
 
	 )y($9&99rH   c            
        K   t        |      }t        j                  ddd t         d}  |      | i | d {   S 7 wr   )r3   r   r   r   s      r$   aparsez"_get_parse_wrapper.<locals>.aparse7  sa     !&))) 
+"6+
 
	 /Y~.?????s   =A AAr   )r   rQ   r   r   r   r   r   r   s   ``` `  @r$   _get_parse_wrapperr   !  sc      bF__^$
: %
: __^$@ %@ !)).96DuDrH   c                `    | D ](  }|j                   dk(  st        |j                        c S  i S )Nzresponse.completed)r]   _process_responses_api_outputresponse)eventsevents     r$   _reduce_response_eventsr   H  s6     A::--0@@A IrH   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   rH   r$   r   r   O  s    ))
&&rH   r   F)total
ChatOpenAI)r   	chat_namecompletions_namec                  |xs i }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      rwt        | j                  j                  j                  j                  |t        |t        j                  t        d            | j                  j                  j                  _        t        | d      rt        | j                  d	      rTt        | j                  j                  |t        t         |t        j                  t        d      
      | j                  _        t        | j                  d      rOt        | j                  j                  |t         |t        j                  t        d            | j                  _        | S )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   partialrG   r   r   rf   r   r   r   r   r   r   )r   r   r   r   s       r$   wrap_openair   U  s   z "'RM &2&&#&../GP0&FKK" !-!!#&../GO!F 	FKK(FKK$$m4FKK$$00':-?KK((..$'!*!2!23KV!T.
$$* v{#6##X.&2  ''' =+%.%6%6,f&	'F# 6##W-%7  &&-+%.%6%6,f&&F" MrH   c                    | r8	 | j                  dd      }|j                  dd       x}rt        |      |d<   |S i S # t        $ r d| icY S w xY w)NTjson)exclude_nonemoderw   rx   r   )ry   r{   r|   r+   )r   r   rw   s      r$   r   r     sm    	(((d(HF

7D11u1+A%+H'(M I  	(h''	(s   6= AA)returnzOptional[Type])r.   dictr   r   )rD   rC   rE   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   rQ   rC   r   r   r   Optional[TracingExtra]r   Optional[Callable]r   r   r   r   )NN)r   r   rQ   rC   r   r   r   r   r   r   r   r   )r   zlist[ResponseStreamEvent]r   r   )
r   r   r   r   r   rC   r   rC   r   r   )r   r   r   r   );
__future__r   r   loggingcollectionsr   collections.abcr   typingr   r   r   r	   r
   r   r   r   r   r   typing_extensionsr   	langsmithr   	ls_clientr   langsmith.schemasr   r   r   r6   r   r   'openai.types.chat.chat_completion_chunkr   r   r   openai.types.completionr   openai.types.responsesr   r   	getLoggerr   r,   	lru_cacher%   r3   rG   rt   r   r   r|   r   r   r   r   r   r   r   r   rH   r$   <module>r      s   "   # #   ( ) ! R R* 
 3: CuX}c9:;			8	$  &?D* ,^
#" -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	rH   