
    hjC                       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,dZ/d-dZ0	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 	 	 d/dZ1	 	 d0	 	 	 	 	 	 	 	 	 	 	 d1dZ2d2dZ3 G d ded       Z4dd!dd"	 	 	 	 	 	 	 	 	 d3d#Z5d4d$Z6y)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                 2    	 ddl m}  | S # t        $ r Y y w xY w)Nr   NotGiven)openai._typesr   ImportErrorr   s    X/var/www/html/eduruby.in/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_givenr/   /   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}|| |j                  d      |j                  d      |j                  d      xs$ |j                  d      xs |j                  d      |d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)r/   getr%   str)
model_typeproviderkwargsstrippedr1   s        r    _infer_invocation_paramsrC   >   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 ]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deltarI   rJ   function_call)name	argumentsrM   rN   
tool_calls   c              3  N   K   | ]  }|j                   s|j                     y wN)id.0cs     r    	<genexpr>z"_reduce_choices.<locals>.<genexpr>s   s     CQaddADDC   %%c              3  N   K   | ]  }|j                   s|j                     y wrR   )typerT   s     r    rW   z"_reduce_choices.<locals>.<genexpr>t   s     I!&&affIrX   )indexrS   rZ   functionr\   r   r[   c              3  N   K   | ]  }t        |d d      r|j                    yw)finish_reasonN)getattrr^   rT   s     r    rW   z"_reduce_choices.<locals>.<genexpr>   s(      1ot4 s   #%)r[   r^   message)listreversedhasattrr_   rK   rI   r   rJ   r=   rL   rO   r[   appendrangemaxkeysr$   nextr\   )choicesreversed_choicesr`   rV   rO   name_
arguments_tool_calls_list	tool_call_r[   tool_call_chunkschunks                r    _reduce_choicesrr   Q   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 )	Nri   r`   rF   rG   rH   usageusage_metadata)
r   ra   ri   r[   rd   
model_dumpvaluesrr   pop_create_usage_metadata)
all_chunkschoices_by_indexrq   choicer*   ri   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   rG   rt   textri   )ri   r   rd   joinrw   )r{   all_contentrq   rJ   r*   s        r    _reduce_completionsr      s    K (--"''w'( ggk"GrN%%')*) H &'*+,HrD   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flexro   rG   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,   r-   s              r    rz   rz      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)Nru   r   rv   z"Error processing chat completion: output)rw   ry   rz   r=   BaseExceptionr(   debug)outputsrdictr~   r.   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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    createz_get_wrapper.<locals>.create  s_    )) 
#)::h#74#?iT+"6+
 
	 *y)4:6::rD   c            
        K   t        |      }t        j                  dd|j                  d      du rnd t         d}  |      | i | d {   S 7 wr   )r/   r   r   r=   r   s	      r    acreatez_get_wrapper.<locals>.acreate  ss     !&))) 
#)::h#74#?iT+"6+
 
	 0Y/@@@@@s   AAAA	functoolswrapsr   is_async)	r   rM   r   tracing_extrar   r   r   r   r   s	   ``` ``  @r    _get_wrapperr     sn      bF___%; ; &; ___%A A &A "**?;7GGrD   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   r/   r   rA   r   r   rM   original_parser   r   s      r    parsez!_get_parse_wrapper.<locals>.parse9  sM    )) 
+"6+
 
	 )y($9&99rD   c            
        K   t        |      }t        j                  ddd t         d}  |      | i | d {   S 7 wr   )r/   r   r   r   s      r    aparsez"_get_parse_wrapper.<locals>.aparseF  sa     !&))) 
+"6+
 
	 /Y~.?????s   =A AAr   )r   rM   r   r   r   r   r   r   s   ``` `  @r    _get_parse_wrapperr   0  sc      bF__^$
: %
: __^$@ %@ !)).96DuDrD   c                `    | D ](  }|j                   dk(  st        |j                        c S  i S )Nzresponse.completed)rZ   _process_responses_api_outputresponse)eventsevents     r    _reduce_response_eventsr   W  s6     A::--0@@A IrD   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   rD   r    r   r   ^  s    ))
&&rD   r   F)total
ChatOpenAI)r   	chat_namecompletions_namec               x   |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      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 (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   rc   r   r   r   r   r   r   )r   r   r   r   r7   r   r   s          r    wrap_openair   d  s:   z "'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(&+".
$$* v{#6##X.&2  ''' =+%.%6%6,fk&	'F# 6##W-%7  &&-+%.%6%6,fk&&F" ME  s   &J, ,	J98J9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moderu   r   rv   r   )rw   ry   rz   r=   r'   )r   r   ru   s      r    r   r     s}    	(((d(HF

7D11u1+A6::n5,'( M I  	(h''	(s   AA AA)returnzOptional[type])r*   dictr   r   )r?   r>   r@   r>   rA   r   )ri   zlist[Choice]r   r   )r{   zlist[ChatCompletionChunk]r   r   )r{   zlist[Completion]r   r   rR   )r~   r   r   zOptional[str]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   r   r   r   'openai.types.chat.chat_completion_chunkr   r   r   openai.types.completionr   openai.types.responsesr   r   	getLoggerr   r(   	lru_cacher!   r/   rC   rr   r   r   rz   r   r   r   r   r   r   r   r   rD   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!$II *I 	I
 I IXrD   