
    Ng                    N   d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZ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mZ d dlmZmZ d dlmZm Z m!Z! d dl"m#Z#m$Z$m%Z% d d	l&m'Z' d d
l(m)Z) d dl*m+Z+m,Z,m-Z- d dl.m/Z/  ej0        e1          Z2d5dZ3d6dZ4d7dZ5d8dZ6	 d9d:dZ7	 d9d;d#Z8	 d9d<d%Z9 G d& d'e          Z: ed(d)d*+           G d, d-e:                      Z; ed(d)d.+           G d/ d0e:                      Z< ed1d)d2+           G d3 d4e                      Z=dS )=    )annotationsN)AbstractSetAnyAsyncIterator	AwaitableCallable
CollectionDictIteratorListLiteralMappingOptionalSetTupleUnion)
deprecated)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLMcreate_base_retry_decorator)
GenerationGenerationChunk	LLMResult)get_from_dict_or_envget_pydantic_field_namespre_init)
get_fields)_build_model_kwargs)
ConfigDictFieldmodel_validator)is_openai_v1keysSet[str]responseDict[str, Any]token_usagereturnNonec                    |                      |d                   }|D ]4}||vr|d         |         ||<   ||xx         |d         |         z  cc<   5dS )zUpdate token usage.usageN)intersection)r$   r&   r(   _keys_to_use_keys        [/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/openai.pyupdate_token_usager1   .   s     $$Xg%677L 9 9{"" ( 1$ 7K'!24!88	9 9    stream_responser   c           
        | d         st          d          S t          | d         d         d         t          | d         d                             dd          | d         d                             dd          	          
          S )z0Convert a stream response to a generation chunk.choices textr   r8   finish_reasonNlogprobsr9   r:   r8   generation_info)r   dictget)r3   s    r0   $_stream_response_to_generation_chunkr@   :   s     9% (B''''Y'*62))4Q7;;OTRR$Y/266z4HH
 
 
   r2   c                
   | d         d         dxx         |d         d         d         z  cc<   |d         d                              dd          | d         d         d<   |d         d         d         | d         d         d<   dS )z)Update response from the stream response.r5   r   r8   r9   Nr:   )r?   )r&   r3   s     r0   _update_responserB   I   s    Y6"""oi&@&CF&KK""".=i.H.K.O.O/ /HY?+ *9)CA)Fz)RHY:&&&r2   c                     ddd d dgiS )Nr5   r6   r8   r9   r:    rE   r2   r0   _streaming_response_templaterF   R   s'    !%  
 r2   llmUnion[BaseOpenAI, OpenAIChat]run_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]Callable[[Any], Any]c                    dd l }|j        j        |j        j        |j        j        |j        j        |j        j        g}t          || j        |          S )Nr   )error_typesmax_retriesrI   )	openaierrorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr   rN   )rG   rI   rO   errorss       r0   _create_retry_decoratorrW   ^   s`     MMM 	'#,F '[   r2   "Optional[CallbackManagerForLLMRun]kwargsr   c                     t                      r  j        j        di |S t           |          }|d fd            } |di |S )z*Use tenacity to retry the completion call.rI   rY   r   r)   c                 (     j         j        di | S NrE   )clientcreaterY   rG   s    r0   _completion_with_retryz5completion_with_retry.<locals>._completion_with_retry}   s     sz **6***r2   rE   rY   r   r)   r   )r#   r^   r_   rW   rG   rI   rY   retry_decoratorra   s   `    r0   completion_with_retryre   r   s     ~~ + sz **6***-c{KKKO+ + + + + _+ "!++F+++r2   'Optional[AsyncCallbackManagerForLLMRun]c                    K   t                      r  j        j        di | d{V S t           |          }|d fd            } |di | d{V S )	z0Use tenacity to retry the async completion call.Nr[   rY   r   r)   c                 8   K    j         j        di |  d {V S r]   )r^   acreater`   s    r0   ra   z6acompletion_with_retry.<locals>._completion_with_retry   s6       (SZ'11&111111111r2   rE   rb   )r#   async_clientr_   rW   rc   s   `    r0   acompletion_with_retryrk      s       ~~ 7,S%,66v666666666-c{KKKO2 2 2 2 2 _2 ('11&111111111r2   c                  P    e Zd ZU dZedrd            Zedsd            Zedtd            Zedud
            Z	 e
dd          Zded<    e
dd          Zded<    e
dd          Zded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 dZded <   	 dZded!<   	 dZded"<   	  e
e#          Zded$<   	  e
dd%          Zd&ed'<   	  e
dd(          Zd&ed)<   	  e
dd*          Zd&ed+<   	 dZd&ed,<   d-Zded.<   	  e
dd/          Zd0ed1<   	  e
e#          Zd2ed3<   	 d4Zded5<   	 d6Z d	ed7<   	  e!            Z"d8ed9<   	 d:Z#d;ed<<   	 dZ$d&ed=<   	 dZ%d>ed?<   dZ&d@edA<   dZ'dBedC<   	 dv fdFZ( e)dG          Z* e+dHI          edwdK                        Z,e-dxdM            Z.edtdN            Z/	 	 dydzdVZ0	 	 dyd{dYZ1	 	 dyd|d\Z2	 	 dyd}d]Z3	 d~dd`Z4ddaddfZ5edtdg            Z6eddi            Z7eddj            Z8d fdmZ9e:ddo            Z;eddp            Z<ddqZ= xZ>S )
BaseOpenAIz'Base OpenAI large language model class.r)   Dict[str, str]c                
    ddiS )Nopenai_api_keyOPENAI_API_KEYrE   selfs    r0   
lc_secretszBaseOpenAI.lc_secrets   s     "233r2   	List[str]c                
    g dS z*Get the namespace of the langchain object.)	langchainllmsrO   rE   clss    r0   get_lc_namespacezBaseOpenAI.get_lc_namespace        /...r2   r'   c                p    i }| j         r
| j         |d<   | j        r
| j        |d<   | j        r
| j        |d<   |S )Nopenai_api_baseopenai_organizationopenai_proxy)r   r   r   )rs   
attributess     r0   lc_attributeszBaseOpenAI.lc_attributes   sY    %'
 	A,0,@J()# 	I040HJ,- 	;)-):J~&r2   boolc                    dS )NTrE   rz   s    r0   is_lc_serializablezBaseOpenAI.is_lc_serializable   s    tr2   NTdefaultexcluder   r^   rj   gpt-3.5-turbo-instructmodelr   aliasstr
model_namegffffff?floattemperature   int
max_tokens   top_pr   frequency_penaltypresence_penaltynbest_ofdefault_factorymodel_kwargsapi_keyOptional[str]rp   base_urlr   organizationr   r      
batch_sizetimeoutz,Union[float, Tuple[float, float], Any, None]request_timeoutzOptional[Dict[str, float]]
logit_bias   rN   F	streaming'Union[Literal['all'], AbstractSet[str]]allowed_specialall&Union[Literal['all'], Collection[str]]disallowed_specialtiktoken_model_namezUnion[Mapping[str, str], None]default_headersz!Union[Mapping[str, object], None]default_queryzUnion[Any, None]http_clientdataUnion[OpenAIChat, BaseOpenAI]c                   |                     dd          }|                    d          s|                    d          r$d|vr t          j        d           t	          di |S t                                          |           S )zInitialize the OpenAI object.r   r6   gpt-3.5-turbogpt-4z	-instructYou are trying to use a chat model. This way of initializing it is no longer supported. Instead, please use: `from langchain_community.chat_models import ChatOpenAI`rE   )r?   
startswithwarningswarn
OpenAIChatsuper__new__)r{   r   r   	__class__s      r0   r   zBaseOpenAI.__new__   s    XXlB//
!!/22	&6@6K6KG6T6T	&++MK  
 %%%%%wws###r2   )populate_by_namebeforemodevaluesc                D    t          |           }t          ||          }|S )>Build extra kwargs from additional params that were passed in.)r   r   )r{   r   all_required_field_namess      r0   build_extrazBaseOpenAI.build_extra  s'     $<C#@#@ $V-EFFr2   r
   c           	        |d         dk     rt          d          |d         r|d         dk    rt          d          |d         r|d         dk    rt          d          t          |dd	          |d<   |d
         pt          j        d          |d
<   t          |ddd          |d<   |d         p't          j        d          pt          j        d          |d<   	 ddl}n# t
          $ r t          d          w xY wt                      r|d         |d         |d
         |d         |d         |d         |d         |d         d}|                    d          s |j        di |j	        |d<   |                    d          s |j
        di |j	        |d<   n!|                    d          s|j        |d<   n	 |S )?Validate that api key and python package exists in environment.r   r   n must be at least 1.r   !Cannot stream results when n > 1.r   'Cannot stream results when best_of > 1.rp   rq   r   OPENAI_API_BASEr   OPENAI_PROXYr6   r   r   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NTCould not import openai python package. Please install it with `pip install openai`.r   rN   r   r   r   )r   r   r   r   rN   r   r   r   r^   rj   rE   )
ValueErrorr   osgetenvrO   ImportErrorr#   r?   OpenAIcompletionsAsyncOpenAI
Completion)r{   r   rO   client_paramss       r0   validate_environmentzBaseOpenAI.validate_environment  sY    #;??4555+ 	B6#;??@AAA+ 	H6)#4q#8#8FGGG#7$&6$
 $
  %++<$= %
B
 B
 ! "6	"
 "
 "
~ () 0y))0y.// 	$%
	MMMM 	 	 	?  	 >> 	!"23 &'< ="#45!"34%m4#)*;#<!'!8%m4	 	M ::h'' N#06=#A#A=#A#A#Mx ::n-- Y););)L)Lm)L)L)X~&H%% 	%0F8s   C$ $C>c                    | j         | j        | j        | j        | j        | j        d}| j        
| j        |d<   | j        t                      s
| j        |d<   | j	        dk    r
| j	        |d<   i || j
        S )2Get the default parameters for calling OpenAI API.)r   r   r   r   r   r   Nr   r   r   r   )r   r   r   r   r   r   r   r   r#   r   r   )rs   normal_paramss     r0   _default_paramszBaseOpenAI._default_paramsL  s      +Z!%!7 $ 5/)
 )
 ?&*./M,'+LNN+/3/CM+, <!'+|M)$5-54#455r2   promptstopOptional[List[str]]rI   rX   rY   Iterator[GenerationChunk]c              +  h  K   i | j         |ddi}|                     ||g|           t          | f||d|D ]w}t          |t                    s|                                }t          |          }|r7|                    |j        || j        |j	        r|j	        d         nd            |V  xd S NstreamTr   rI   r:   )chunkverboser:   )
_invocation_paramsget_sub_promptsre   
isinstancer>   r@   on_llm_new_tokenr8   r   r=   rs   r   r   rI   rY   paramsstream_respr   s           r0   _streamzBaseOpenAI._streamd  s      GD+FvFxFFVfXt4440
[
 
<B
 
 	 	K k400 1)..008EEE ,,J L,U2:>> -    KKKK	 	r2   rf   AsyncIterator[GenerationChunk]c                 K   i | j         |ddi}|                     ||g|           t          | f||d| d {V 2 3 d {V }t          |t                    s|                                }t          |          }|r=|                    |j        || j        |j	        r|j	        d         nd            d {V  |W V  6 d S r   )
r   r   rk   r   r>   r@   r   r8   r   r=   r   s           r0   _astreamzBaseOpenAI._astream~  sd      GD+FvFxFFVfXt444'=(
[(
 (
<B(
 (
 "
 "
 "
 "
 "
 "
 	 	 	 	 	 	 	+ k400 1)..008EEE !22J L,U2:>> 3          KKKKK"
 "
 "
s    Cpromptsr   c                   | j         }i ||}|                     |||          }g }i }h d}	d}
|D ]2}| j        rt          |          dk    rt	          d          d} | j        |d         ||fi |D ]}||}||z  }|J |                    |j        |j        r|j        	                    d          nd|j        r|j        	                    d          ndd           t          | f||d	|}t          |t                    s|                                }|                    |d
                    t          |	||           |
s|	                    d          }
4|                     |||||
          S )at  Call out to OpenAI's endpoint with k unique prompts.

        Args:
            prompts: The prompts to pass into the model.
            stop: Optional list of stop words to use when generating.

        Returns:
            The full LLM output.

        Example:
            .. code-block:: python

                response = openai.generate(["Tell me a joke."])
           total_tokensprompt_tokenscompletion_tokensNr   ,Cannot stream results with multiple prompts.r   r9   r:   rD   r   r5   system_fingerprintr   )r   r   r   lenr   r   appendr8   r=   r?   re   r   r>   extendr1   create_llm_resultrs   r   r   rI   rY   r   sub_promptsr5   r(   _keysr   _prompts
generationr   r&   s                  r0   	_generatezBaseOpenAI._generate  s   , (%F%f%**67DAA&( GFF,0# #	L #	LH~ "Lx==1$$$%STTT8<
)T\(1+t[SSFSS , ,E!)%*

"e+

!--- *%5*")C)G)G)X)X)X!%5%"J$>$B$B:$N$N$N! 
 
 
 
 1!){ FL  "(D11 /  (}}Hx	2333"5(K@@@) L)16J)K)K&%%1 & 
 
 	
r2   c                  K   | j         }i ||}|                     |||          }g }i }h d}	d}
|D ]'}| j        rt          |          dk    rt	          d          d} | j        |d         ||fi |2 3 d{V }||}||z  }6 |J |                    |j        |j        r|j        	                    d          nd|j        r|j        	                    d          ndd           t          | f||d	| d{V }t          |t                    s|                                }|                    |d
                    t          |	||           )|                     |||||
          S )z:Call out to OpenAI's endpoint async with k unique prompts.r   Nr   r   r   r9   r:   rD   r   r5   r   )r   r   r   r   r   r   r   r8   r=   r?   rk   r   r>   r  r1   r  r  s                  r0   
_ageneratezBaseOpenAI._agenerate  sE      (%F%f%**67DAA&( GFF,0#  	A  	AH~ Ax==1$$$%STTT8<
#04=QK{$ $6<$ $ , , , , , , ,% ")%*

"e+

$ "--- *%5*")C)G)G)X)X)X!%5%"J$>$B$B:$N$N$N! 
 
 
 
 "8"!){" "FL" "       "(D11 /'}}Hx	2333"5(K@@@@%%1 & 
 
 	
s   7B	r   List[List[str]]c                6    |d|v rt          d          ||d<   |d         dk    r@t                    dk    rt          d                               d                   |d<    fd	t          dt                     j                  D             }|S )
z!Get the sub prompts for llm call.Nr   2`stop` found in both the input and default params.r   r   z7max_tokens set to -1 not supported for multiple inputs.r   c                4    g | ]}||j         z            S rE   )r   ).0ir   rs   s     r0   
<listcomp>z.BaseOpenAI.get_sub_prompts.<locals>.<listcomp>.  s:     
 
 
 ADO++,
 
 
r2   )r   r   max_tokens_for_promptranger   )rs   r   r   r   r  s   ` `  r0   r   zBaseOpenAI.get_sub_prompts  s      !UVVV!F6N,2%%7||q   M   $(#=#=gaj#I#IF< 
 
 
 
 
1c'llDO<<
 
 
 r2   r   r5   r(   Dict[str, int]r   c                  g }|                     d| j                  }t          |          D ]7\  }}	|||z  |dz   |z           }
|                    d |
D                        8|| j        d}|r||d<   t          ||          S )z2Create the LLMResult from the choices and prompts.r   r   c                    g | ]N}t          |d          t          |                    d          |                    d                              OS )r8   r9   r:   r;   r<   )r   r>   r?   )r  choices     r0   r  z0BaseOpenAI.create_llm_result.<locals>.<listcomp>C  sp     	 	 	  #F^(,*0**_*E*E%+ZZ
%;%;) ) )  	 	 	r2   r(   r   r   generations
llm_output)r?   r   	enumerater   r   r   )rs   r5   r   r   r(   r   r  r   r  _sub_choicesr  s               r0   r  zBaseOpenAI.create_llm_result4  s     JJsDF##g&& 	 	DAq!!a%1q5A+"56K	 	 #.	 	 	    &1PP
 	B/AJ+,[ZHHHHr2   c                    i }t                      s(|                    | j        | j        | j        d           | j        rddl}| j        | j        d|_        i || j        S )z,Get the parameters used to invoke the model.)r   api_baser   r   Nhttphttps)	r#   updaterp   r   r   r   rO   proxyr   )rs   openai_credsrO   s      r0   r   zBaseOpenAI._invocation_paramsS  s     (*~~ 	#2 $ 4$($<     	SMMM$($5@QRRFL7,7$"677r2   Mapping[str, Any]c                &    i d| j         i| j        S zGet the identifying parameters.r   r   r   rr   s    r0   _identifying_paramszBaseOpenAI._identifying_paramse       K<1JT5IJJr2   c                    dS )Return type of llm.rO   rE   rr   s    r0   	_llm_typezBaseOpenAI._llm_typej  s	     xr2   r8   	List[int]c                   t           j        d         dk     r!t                                          |          S 	 ddl}n# t
          $ r t          d          w xY w| j        p| j        }	 |                    |          }nA# t          $ r4 t                              d           d}|                    |          }Y nw xY w|                    || j        | j                  S )	-Get the token IDs using the tiktoken package.r      r   NCould not import tiktoken python package. This is needed in order to calculate get_num_tokens. Please install it with `pip install tiktoken`.z5Warning: model not found. Using cl100k_base encoding.cl100k_baser   r   )sysversion_infor   get_num_tokenstiktokenr   r   r   encoding_for_modelKeyErrorloggerwarningget_encodingencoder   r   )rs   r8   r;  r   encr   r   s         r0   get_token_idszBaseOpenAI.get_token_idso  s    A""77))$///	OOOO 	 	 	A  	 -@
	/--j99CC 	/ 	/ 	/NNRSSS!E''..CCC	/
 zz 0#6  
 
 	
s   ? A+B ;B?>B?	modelnamec                n   i dddddddddddd	d
d	dd	ddddddddddddddddddddddddddddd
}d| v r|                      d          d         } |                    | d           }|;t          d!|  d"d#                    |                                          z             |S )$ao  Calculate the maximum number of tokens possible to generate for a model.

        Args:
            modelname: The modelname we want to know the context size for.

        Returns:
            The maximum context size

        Example:
            .. code-block:: python

                max_tokens = openai.modelname_to_contextsize("gpt-3.5-turbo-instruct")
        zgpt-4oi  zgpt-4o-2024-05-13r   i    z
gpt-4-0314z
gpt-4-0613z	gpt-4-32ki   zgpt-4-32k-0314zgpt-4-32k-0613r   i   zgpt-3.5-turbo-0301zgpt-3.5-turbo-0613zgpt-3.5-turbo-16ki@  zgpt-3.5-turbo-16k-0613r   ztext-ada-001i  adaztext-babbage-001i  i  iA  i   )
babbageztext-curie-001curiedavinciztext-davinci-003ztext-davinci-002zcode-davinci-002zcode-davinci-001zcode-cushman-002zcode-cushman-001zft-:r   NzUnknown model: z=. Please provide a valid OpenAI model name.Known models are: z, )splitr?   r   joinr$   )rD  model_token_mappingcontext_sizes      r0   modelname_to_contextsizez#BaseOpenAI.modelname_to_contextsize  s   
g

 T
 $	

 $
 
 e
 e
 T
 !$
 !$
  
 %e
 %d
 D
  4!
" #
$ " $ $ $ $ $ $7
 
 
> I!,,Q/I*..y$??%) % % %'+yy1D1I1I1K1K'L'LM  
 r2   c                6    |                      | j                  S )z$Get max context size for this model.)rO  r   rr   s    r0   max_context_sizezBaseOpenAI.max_context_size  s     ,,T_===r2   c                @    |                      |          }| j        |z
  S )ao  Calculate the maximum number of tokens possible to generate for a prompt.

        Args:
            prompt: The prompt to pass into the model.

        Returns:
            The maximum number of tokens to generate for a prompt.

        Example:
            .. code-block:: python

                max_tokens = openai.max_token_for_prompt("Tell me a joke.")
        )r:  rQ  )rs   r   
num_tokenss      r0   r  z BaseOpenAI.max_tokens_for_prompt  s%     ((00
$z11r2   )r)   rn   r)   ru   r)   r'   )r)   r   )r   r   r)   r   r   r'   r)   r   r   r
   r)   r
   NN
r   r   r   r   rI   rX   rY   r   r)   r   
r   r   r   r   rI   rf   rY   r   r)   r   
r   ru   r   r   rI   rX   rY   r   r)   r   
r   ru   r   r   rI   rf   rY   r   r)   r   N)r   r'   r   ru   r   r   r)   r  )r5   r   r   ru   r   r'   r(   r  r   r   r)   r   r)   r(  r)   r   r8   r   r)   r1  )rD  r   r)   r   )r)   r   )r   r   r)   r   )?__name__
__module____qualname____doc__propertyrt   classmethodr|   r   r   r!   r^   __annotations__rj   r   r   r   r   r   r   r   r   r>   r   rp   r   r   r   r   r   r   rN   r   setr   r   r   r   r   r   r   r    model_configr"   r   r   r   r   r   r   r  r
  r   r  r   r,  r0  rC  staticmethodrO  rQ  r  __classcell__r   s   @r0   rm   rm      s        114 4 4 X4 / / / [/    X    [ %d333F3333dD999L9999e$<GLLLJLLLLK+J( ED     ;$AJJJJ;GK#(5#>#>#>L>>>>V %*E$i$H$H$HNHHHHO%*U4z%J%J%JOJJJJ).t>)R)R)RRRRRN"&L&&&&JHDIEIE E EO    -2U4-H-H-HJHHHHDK<I/?BsuuODDDD3AFFFFF7)-----J 7;O::::7;M;;;; %)K(((( $ $ $ $ $ $ :  L _(###   [ $# 6 6 6 X6p 6 6 6 X64 %):>	    : %)?C	    : %):>	I
 I
 I
 I
 I
\ %)?C	8
 8
 8
 8
 8
| %)	    < -1I I I I I I> 8 8 8 X8" K K K XK    X
 
 
 
 
 
8 8 8 8 \8t > > > X>2 2 2 2 2 2 2 2r2   rm   z0.0.10z1.0zlangchain_openai.OpenAI)sinceremovalalternative_importc                  L     e Zd ZdZedd            Zed fd            Z xZS )	r   a  OpenAI large language models.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``OPENAI_API_KEY`` set with your API key.

    Any parameters that are valid to be passed to the openai.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            openai = OpenAI(model_name="gpt-3.5-turbo-instruct")
    r)   ru   c                
    g dS rw   rE   rz   s    r0   r|   zOpenAI.get_lc_namespace  r}   r2   r'   c                @    i d| j         it                      j        S )Nr   )r   r   r   rs   r   s    r0   r   zOpenAI._invocation_params  s!    K7DO,K0JKKr2   rT  rU  )	ra  rb  rc  rd  rf  r|   re  r   rk  rl  s   @r0   r   r     s}          / / / [/ L L L L L XL L L L Lr2   r   zlangchain_openai.AzureOpenAIc                      e Zd ZU dZdZded<   	  edd          Zded<   	  edd	          Zd
ed<   	  edd          Z	ded<   	 dZ
ded<   	 dZded<   	 dZded<   	 dZd
ed<   	 dZded<   	 ed#d            Zed$d            Zed% fd            Zed& fd             Zed'd!            Zed&d"            Z xZS )(AzureOpenAIa   Azure-specific OpenAI large language models.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``OPENAI_API_KEY`` set with your API key.

    Any parameters that are valid to be passed to the openai.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.llms import AzureOpenAI

            openai = AzureOpenAI(model_name="gpt-3.5-turbo-instruct")
    NzUnion[str, None]azure_endpointazure_deploymentr   deployment_namer6   api_versionr   openai_api_versionr   rp   azure_ad_tokenzUnion[Callable[[], str], None]azure_ad_token_providerz)Union[Callable[[], Awaitable[str]], None]azure_ad_async_token_provideropenai_api_typeTr   validate_base_urlr)   ru   c                
    g dS rw   rE   rz   s    r0   r|   zAzureOpenAI.get_lc_namespace7  r}   r2   r   r
   c                   |d         dk     rt          d          |d         r|d         dk    rt          d          |d         r|d         dk    rt          d          |d         p't          j        d	          pt          j        d
          |d<   |d         pt          j        d          |d<   |d         pt          j        d          |d<   |d         pt          j        d          |d<   t          |ddd          |d<   |d         p't          j        d          pt          j        d          |d<   |d         pt          j        d          |d<   t          |ddd          |d<   	 ddl}n# t
          $ r t          d          w xY wt                      r[|d         }|r|d          rd!|vrB|d                             d"          d!z   |d<   t          j	        d#| d$|d          d%           |d&         rct          j	        d'           |d&         |d         vr:t          j	        d(| d$|d          d%           |dxx         d)|d&         z   z  cc<   d|d&<   |d         |d         |d&         |d         |d         |d*         |d         |d         |d+         |d,         |d-         |d.         |d/         d0} |j
        d4i |j        |d1<   |d2         }|r||d*<    |j        d4i |j        |d3<   n
|j        |d1<   |S )5r   r   r   r   r   r   r   r   rp   AZURE_OPENAI_API_KEYrq   rv  AZURE_OPENAI_ENDPOINTr{  AZURE_OPENAI_AD_TOKENr   r   r   r   r6   r   r   r   r   rz  OPENAI_API_VERSIONr~  OPENAI_API_TYPEazurer   Nr   r  z/openai/zAs of openai>=1.0.0, Azure endpoints should be specified via the `azure_endpoint` param not `openai_api_base` (or alias `base_url`). Updating `openai_api_base` from z to .rx  zAs of openai>=1.0.0, if `deployment_name` (or alias `azure_deployment`) is specified then `openai_api_base` (or alias `base_url`) should not be. Instead use `deployment_name` (or alias `azure_deployment`) and `azure_endpoint`.zAs of openai>=1.0.0, if `openai_api_base` (or alias `base_url`) is specified it is expected to be of the form https://example-resource.azure.openai.com/openai/deployments/example-deployment. Updating z/deployments/r|  r   rN   r   r   r   )ry  rv  rw  r   r{  r|  r   r   r   rN   r   r   r   r^   r}  rj   rE   )r   r   r   r   rO   r   r#   rstripr   r   ru  r   AsyncAzureOpenAIr   )r{   r   rO   r   r   r}  s         r0   r   z AzureOpenAI.validate_environment<  s    #;??4555+ 	B6#;??@AAA+ 	H6)#4q#8#8FGGG #$ +y/00+y)** 	  $**:#; $
ry#@
 @
  $**:#; $
ry#@
 @
  %++<$= %
B
 B
 ! "6	"
 "
 "
~ () 0y))0y.// 	$%
 (..B'C (
ry H
 H
#$ %9%'8'%
 %
 %
 !	MMMM 	 	 	?  	
 >> ?	1 %%67O 56*=#> 5O330188==	I ,- MM +M M 177H0IM M M   +, 5M0   /0?P8QQQ < )8	< <
  &&78< < <   0111+f5F.GG111 15F,-%&:;"()9":$*+<$=!"23"()9":+12K+L &'< ="#45!"34%m4#)*;#<!'!8%m4 M  2v1BBMBBNF8,23R,S), Y;X78%<V%< & && & >""
  &0F8s   1E6 6Fr(  c                @    i d| j         it                      j        S )Nrx  )rx  r   r,  rs  s    r0   r,  zAzureOpenAI._identifying_params  s,    
 $"67
gg)
 	
r2   r'   c                    t                      r
d| j        i}n| j        | j        | j        d}i |t	                      j        S )Nr   )engineapi_typery  )r#   rx  r~  rz  r   r   )rs   openai_paramsr   s     r0   r   zAzureOpenAI._invocation_params  sW    >> 	$d&:;MM . 0#6 M
 ?->577#=>>r2   c                    dS )r/  r  rE   rr   s    r0   r0  zAzureOpenAI._llm_type  s	     wr2   c                     | j         | j        dS )Nr~  rz  r  rr   s    r0   r   zAzureOpenAI.lc_attributes  s      $3"&"9
 
 	
r2   rT  rW  r^  rU  r_  )ra  rb  rc  rd  rv  rg  r!   rx  rz  rp   r{  r|  r}  r~  r  rf  r|   r   r   re  r,  r   r0  r   rk  rl  s   @r0   ru  ru    s           (,N++++ ).dBT(U(U(UOUUUU
 $eBmDDDDDDDS',uT'K'K'KNKKKKU'+N++++ ?CBBBB
 PT!SSSS O+""""" / / / [/ t t t Xtl 
 
 
 
 
 X
 	? 	? 	? 	? 	? X	?    X 
 
 
 X
 
 
 
 
r2   ru  z0.0.1zlangchain_openai.ChatOpenAIc                  P    e Zd ZU dZ edd          Zded<    edd          Zded<   dZd	ed
<   	  ee	          Z
ded<   	  edd          Zded<   	  edd          Zded<   	 dZded<   dZded<   	  ee          Zded<   	 dZded<   	  e            Zded<   	 dZd ed!<   	  ed"#          edBd&                        ZedCd(            ZedDd)            Z	 dEdFd/Z	 	 dGdHd5Z	 	 dGdId8Z	 	 dGdJd:Z	 	 dGdKd;Z edLd=            Z!edMd>            Z"dN fdAZ# xZ$S )Or   a  OpenAI Chat large language models.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``OPENAI_API_KEY`` set with your API key.

    Any parameters that are valid to be passed to the openai.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAIChat
            openaichat = OpenAIChat(model_name="gpt-3.5-turbo")
    NTr   r   r^   rj   r   r   r   r   r'   r   r   r   r   rp   r   r   r      r   rN   r   prefix_messagesFr   r   r   r   r   r   r   r   r   r   r)   c                   d t          |                                           D             }|                    di           }t          |          D ]5}||vr/||v rt	          d| d          |                    |          ||<   6||d<   |S )r   c                    h | ]	}|j         
S rE   )r   )r  fields     r0   	<setcomp>z)OpenAIChat.build_extra.<locals>.<setcomp>  s    #V#V#VEEK#V#V#Vr2   r   zFound z supplied twice.)r   r   r?   listr   pop)r{   r   r   extra
field_names        r0   r   zOpenAIChat.build_extra  s     $W#VZ__=S=S=U=U#V#V#V 

>2..v,, 	; 	;J!999&&$%Jj%J%J%JKKK$*JJz$:$:j!!&~r2   r
   c                   t          |dd          }t          |ddd          }t          |ddd          }t          |d	d
d          }	 ddl}||_        |r||_        |r||_        |r
||d|_        n# t          $ r t          d          w xY w	 |j        |d<   n# t          $ r t          d          w xY wt          j        d           |S )r   rp   rq   r   r   r6   r   r   r   r   r   r   Nr"  r   r^   z`openai` has no `ChatCompletion` attribute, this is likely due to an old version of the openai package. Try upgrading it with `pip install --upgrade openai`.r   )r   rO   r   r!  r   r&  r   ChatCompletionAttributeErrorr   r   r   )r{   r   rp   r   r   r   rO   s          r0   r   zOpenAIChat.validate_environment  sk    .$&6
 
 /	
 
 
 ,	
 
 
 3)+@"
 
 
	MMM+FN 2"1" :&9# M(4|LL 	 	 	?  	
	%4F8 	 	 	7  	 	G	
 	
 	

 s   )A6 6B
B B9c                    | j         S )r   )r   rr   s    r0   r   zOpenAIChat._default_paramsE  s       r2   r   ru   r   r   r   c                   t          |          dk    rt          d|           | j        d|d         dgz   }i d| j        i| j        }|d|v rt          d          ||d<   |                    d	          d
k    r|d	= ||fS )Nr   z6OpenAIChat currently only supports single prompt, got userr   )rolecontentr   r   r  r   r  )r   r   r  r   r   r?   )rs   r   r   messagesr   s        r0   _get_chat_paramszOpenAIChat._get_chat_paramsJ  s     w<<!RRR   'Fwqz+R+R*SS!WWdo$>!W$BV!W !UVVV!F6N::l##r))|$r2   r   rI   rX   rY   r   c              +  t  K   |                      |g|          \  }}i ||ddi}t          | f||d|D ]}t          |t                    s|                                }|d         d         d                             dd          }t          |	          }	|r|                    ||	
           |	V  d S Nr   Tr  rI   r5   r   deltar  r6   r7   )r   )r  re   r   r>   r?   r   r   
rs   r   r   rI   rY   r  r   r   tokenr   s
             r0   r   zOpenAIChat._stream\  s        00&4@@&5F5f5h550
#
 
@F
 
 		 		K k400 1)..00	*1-g6::9bIIE#///E A,,U%,@@@KKKK		 		r2   rf   r   c                 K   |                      |g|          \  }}i ||ddi}t          | f||d| d {V 2 3 d {V }t          |t                    s|                                }|d         d         d                             dd          }t          |	          }	|r|                    ||	
           d {V  |	W V  6 d S r  )r  rk   r   r>   r?   r   r   r  s
             r0   r   zOpenAIChat._astreamp  sP       00&4@@&5F5f5h55'=(
#(
 (
@F(
 (
 "
 "
 "
 "
 "
 "
 		 		 		 		 		 		 		+ k400 1)..00	*1-g6::9bIIE#///E G!2252FFFFFFFFFKKKKK"
 "
 "
s   C
r   c                   | j         r;d } | j        |d         ||fi |D ]}||}||z  }|J t          |gg          S |                     ||          \  }}i ||}t	          | f||d|}	t          |	t                    s|	                                }	|	d         | j        d}
t          t          |	d         d         d         d         	          gg|

          S Nr   )r  r  r,   r  r5   messager  r7   r  )	r   r   r   r  re   r   r>   r   r   rs   r   r   rI   rY   r  r   r  r   full_responser  s              r0   r  zOpenAIChat._generate  sP    > 	948J%gaj$NNvNN ( (%!&JJ%'JJ))):,888800$??&%F%f%-
#
 
@F
 
 -.. 	1)..00M(1/
 

 y!9!!<Y!G	!RSSST "	
 
 
 	
r2   c                  K   | j         rAd } | j        |d         ||fi |2 3 d {V }||}||z  }6 |J t          |gg          S |                     ||          \  }}i ||}t	          | f||d| d {V }	t          |	t                    s|	                                }	|	d         | j        d}
t          t          |	d         d         d         d         	          gg|

          S r  )	r   r   r   r  rk   r   r>   r   r   r  s              r0   r
  zOpenAIChat._agenerate  s      > 	948J,t}WQZ{UUfUU ( ( ( ( ( ( (e%!&JJ%'JJ	  V
 ))):,888800$??&%F%f%4
#
 
@F
 
 
 
 
 
 
 
 -.. 	1)..00M(1/
 

 y!9!!<Y!G	!RSSST "	
 
 
 	
s   4r(  c                &    i d| j         i| j        S r*  r+  rr   s    r0   r,  zOpenAIChat._identifying_params  r-  r2   c                    dS )r/  zopenai-chatrE   rr   s    r0   r0  zOpenAIChat._llm_type  s	     }r2   r8   r1  c                0   t           j        d         dk     r!t                                          |          S 	 ddl}n# t
          $ r t          d          w xY w|                    | j                  }|                    || j	        | j
                  S )r3  r   r4  r   Nr5  r7  )r8  r9  r   rC  r;  r   r<  r   rA  r   r   )rs   r8   r;  rB  r   s       r0   rC  zOpenAIChat.get_token_ids  s     A""77((...	OOOO 	 	 	A  	 ))$/::zz 0#6  
 
 	
s	   ? ArV  rW  rU  r]  )r   ru   r   r   r)   r   rX  rY  rZ  r[  r\  r^  r_  r`  )%ra  rb  rc  rd  r!   r^   rg  rj   r   r>   r   rp   r   r   rN   r  r  r   rh  r   r   r"   rf  r   r   r   re  r   r  r   r   r  r
  r,  r0  rC  rk  rl  s   @r0   r   r     s          %d333F3333dD999L9999%J%%%%#(5#>#>#>L>>>>V %*E$i$H$H$HNHHHHO%*U4z%J%J%JOJJJJ #'L&&&&K<!E$777O7777,I/?BsuuODDDD3AFFFFF7_(###   [ $# 0 0 0 X0d ! ! ! X!
 ?C         * %):>	    . %)?C	    . %):>	!
 !
 !
 !
 !
L %)?C	!
 !
 !
 !
 !
F K K K XK    X
 
 
 
 
 
 
 
 
 
r2   r   )r$   r%   r&   r'   r(   r'   r)   r*   )r3   r'   r)   r   )r&   r'   r3   r'   r)   r*   rU  r]  )rG   rH   rI   rJ   r)   rK   )rG   rH   rI   rX   rY   r   r)   r   )rG   rH   rI   rf   rY   r   r)   r   )>
__future__r   loggingr   r8  r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   langchain_core._api.deprecationr   langchain_core.callbacksr   r   #langchain_core.language_models.llmsr   r   langchain_core.outputsr   r   r   langchain_core.utilsr   r   r   langchain_core.utils.pydanticr   langchain_core.utils.utilsr   pydanticr    r!   r"    langchain_community.utils.openair#   	getLoggerra  r>  r1   r@   rB   rF   rW   re   rk   rm   r   ru  r   rE   r2   r0   <module>r     s   " " " " " "  				 



                                  $ 7 6 6 6 6 6        U T T T T T T T I I I I I I I I I I         
 5 4 4 4 4 4 : : : : : : 7 7 7 7 7 7 7 7 7 7 9 9 9 9 9 9		8	$	$	9 	9 	9 	9   S S S S	 	 	 	  		    , 7;, , , , ,( <@2 2 2 2 2&C	2 C	2 C	2 C	2 C	2 C	2 C	2 C	2L (E>WXXXL L L L LZ L L YXL4 
E6T  U
 U
 U
 U
 U
* U
 U
 U
p 
4  
O
 O
 O
 O
 O
 O
 O
 
O
 O
 O
r2   