
    7|h{                    R   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j`                  e1      Z2	 	 	 	 	 	 	 	 d#dZ3	 	 	 	 d$dZ4d%dZ5d&dZ6	 d'	 	 	 	 	 d(dZ7	 d'	 	 	 	 	 	 	 d)dZ8	 d'	 	 	 	 	 	 	 d*dZ9 G d de      Z: eddd       G d de:             Z; eddd       G d de:             Z< eddd        G d! d"e             Z=y)+    )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_v1c                    | j                  |d         }|D ]%  }||vr|d   |   ||<   ||xx   |d   |   z  cc<   ' y)zUpdate token usage.usageN)intersection)keysresponsetoken_usage_keys_to_use_keys        ^/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/openai.pyupdate_token_usager-   .   s^     $$Xg%67L 9{" ( 1$ 7K'!24!88	9    c           
         | d   st        d      S t        | d   d   d   t        | d   d   j                  dd      | d   d   j                  dd      	      
      S )z0Convert a stream response to a generation chunk.choices textr   r3   finish_reasonNlogprobsr4   r5   r3   generation_info)r   dictget)stream_responses    r,   $_stream_response_to_generation_chunkr<   :   sr     9%B''Y'*62))4Q7;;OTR$Y/266z4H
 r.   c                    | d   d   dxx   |d   d   d   z  cc<   |d   d   j                  dd      | d   d   d<   |d   d   d   | d   d   d<   y)z)Update response from the stream response.r0   r   r3   r4   Nr5   )r:   )r(   r;   s     r,   _update_responser>   I   s~    Y6"oi&@&CF&KK".=i.H.K.O.O/HY?+ *9)CA)Fz)RHY:&r.   c                     ddd d dgiS )Nr0   r1   r3   r4   r5    rA   r.   r,   _streaming_response_templaterB   R   s"    !% 
 r.   c                   dd l }|j                  j                  |j                  j                  |j                  j                  |j                  j
                  |j                  j                  g}t        || j                  |      S )Nr   )error_typesmax_retriesrun_manager)	openaierrorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr   rE   )llmrF   rG   errorss       r,   _create_retry_decoratorrP   ^   sk      	''##,,F '[ r.   c                     t               r  j                  j                  di |S t         |      }|d fd       } |di |S )z*Use tenacity to retry the completion call.rF   c                 <     j                   j                  di | S NrA   )clientcreatekwargsrN   s    r,   _completion_with_retryz5completion_with_retry.<locals>._completion_with_retry}   s     szz  *6**r.   rA   rX   r   returnr   )r#   rU   rV   rP   rN   rF   rX   retry_decoratorrY   s   `    r,   completion_with_retryr^   r   sR     ~ szz  *6**-c{KO+ + "+F++r.   c                    K   t               r$  j                  j                  di | d{   S t         |      }|d fd       } |di | d{   S 7 ,7 w)z0Use tenacity to retry the async completion call.NrR   c                 X   K    j                   j                  di |  d {   S 7 wrT   )rU   acreaterW   s    r,   rY   z6acompletion_with_retry.<locals>._completion_with_retry   s)      (SZZ''1&1111s    *(*rA   rZ   )r#   async_clientrV   rP   r\   s   `    r,   acompletion_with_retryrc      si      ~,S%%,,6v666-c{KO2 2 (1&111 7 2s!   *AA'AAAAc                  &    e Zd ZU dZedVd       ZedWd       ZedXd       ZedYd       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d-ed.<   	  e
e       Zd/ed0<   	 d1Zded2<   	 d3Z ded4<   	  e!       Z"d5ed6<   	 d7Z#d8ed9<   	 dZ$d#ed:<   	 dZ%d;ed<<   dZ&d=ed><   dZ'd?ed@<   	 dZ fdAZ( e)d	B      Z* e+dCD      ed[dE              Z,e-d\dF       Z.edXdG       Z/	 	 d]	 	 	 	 	 	 	 	 	 d^dHZ0	 	 d]	 	 	 	 	 	 	 	 	 d_dIZ1	 	 d]	 	 	 	 	 	 	 	 	 d`dJZ2	 	 d]	 	 	 	 	 	 	 	 	 dadKZ3	 db	 	 	 	 	 	 	 dcdLZ4ddM	 	 	 	 	 	 	 	 	 	 	 dddNZ5edXdO       Z6ededP       Z7edfdQ       Z8dg fdRZ9e:dhdS       Z;edidT       Z<djdUZ= xZ>S )k
BaseOpenAIz'Base OpenAI large language model class.c                
    ddiS )Nopenai_api_keyOPENAI_API_KEYrA   selfs    r,   
lc_secretszBaseOpenAI.lc_secrets   s     "233r.   c                
    g dS z*Get the namespace of the langchain object.)	langchainllmsrG   rA   clss    r,   get_lc_namespacezBaseOpenAI.get_lc_namespace   
     /.r.   Dict[str, Any]c                    i }| j                   r| j                   |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   |S )Nopenai_api_baseopenai_organizationopenai_proxy)rv   rw   rx   )rj   
attributess     r,   lc_attributeszBaseOpenAI.lc_attributes   sZ    %'
,0,@,@J()##040H0HJ,-)-):):J~&r.   boolc                     y)NTrA   rp   s    r,   is_lc_serializablezBaseOpenAI.is_lc_serializable   s    r.   NTdefaultexcluder   rU   rb   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]rg   base_urlrv   organizationrw   rx      
batch_sizetimeoutz,Union[float, Tuple[float, float], Any, None]request_timeoutzOptional[Dict[str, float]]
logit_bias   rE   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_clientc                    |j                  dd      }|j                  d      s|j                  d      r$d|vr t        j                  d       t	        di |S t
        |   |       S )zInitialize the OpenAI object.r   r1   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`rA   )r:   
startswithwarningswarn
OpenAIChatsuper__new__)rq   datar   	__class__s      r,   r   zBaseOpenAI.__new__   sg    XXlB/
!!/2j6K6KG6T+MMK
 %%%ws##r.   )populate_by_namebeforemodec                4    t        |       }t        ||      }|S )>Build extra kwargs from additional params that were passed in.)r   r   )rq   valuesall_required_field_namess      r,   build_extrazBaseOpenAI.build_extra  s!     $<C#@ $V-EFr.   c           	        |d   dk  rt        d      |d   r|d   dkD  rt        d      |d   r|d   dkD  rt        d      t        |dd	      |d<   |d
   xs t        j                  d      |d
<   t        |ddd      |d<   |d   xs, t        j                  d      xs t        j                  d      |d<   	 ddl}t               r|d   |d   |d
   |d   |d   |d   |d   |d   d}|j                  d      s |j                  di |j                  |d<   |j                  d      s |j                  di |j                  |d<   |S |j                  d      s|j                  |d<   |S 	 |S # t
        $ r t        d      w xY w)?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.rg   rh   rv   OPENAI_API_BASErx   OPENAI_PROXYr1   r   rw   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NTCould not import openai python package. Please install it with `pip install openai`.r   rE   r   r   r   )r   r   r   r   rE   r   r   r   rU   rb   rA   )
ValueErrorr   osgetenvrG   ImportErrorr#   r:   OpenAIcompletionsAsyncOpenAI
Completion)rq   r   rG   client_paramss       r,   validate_environmentzBaseOpenAI.validate_environment  s    #;?455+6#;?@AA+6)#4q#8FGG#7$&6$
  %++<$= %
B
 ! "6	"
~ () 0yy)0yy./ 	$%
	 >!"23 &'< ="#45!"34%m4#)*;#<!'!8%m4	M ::h'#06==#A=#A#M#Mx ::n-);););)Lm)L)X)X~&  H%%00F8  5  	? 	s   <E4 4F	c                h   | j                   | j                  | j                  | j                  | j                  | j
                  d}| j                  | j                  |d<   | j                  t               s| j                  |d<   | j                  dkD  r| j                  |d<   i || j                  S )2Get the default parameters for calling OpenAI API.)r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r#   r   r   )rj   normal_paramss     r,   _default_paramszBaseOpenAI._default_paramsL  s      ++ZZ!%!7!7 $ 5 5//)
 ??&*.//M,'+LN/3/C/CM+, <<!'+||M)$5-54#4#455r.   c              +  n  K   i | j                   |ddi}| j                  ||g|       t        | f||d|D ]w  }t        |t              s|j	                         }t        |      }|rD|j                  |j                  || j                  |j                  r|j                  d   nd        | y y wNstreamTpromptrF   r5   )chunkverboser5   )
_invocation_paramsget_sub_promptsr^   
isinstancer9   r<   on_llm_new_tokenr3   r   r8   rj   r   stoprF   rX   paramsstream_respr   s           r,   _streamzBaseOpenAI._streamd  s      GD++FvFxFVfXt40
[
<B
 	K k40)..08EE,,JJ LL,, #22:> -  K	s   B3B5c                 K   i | j                   |ddi}| j                  ||g|       t        | f||d| d {   2 3 d {   }t        |t              s|j	                         }t        |      }|rL|j                  |j                  || j                  |j                  r|j                  d   nd        d {    | 7 7 7 6 y wr   )
r   r   rc   r   r9   r<   r   r3   r   r8   r   s           r,   _astreamzBaseOpenAI._astream~  s      GD++FvFxFVfXt4'=(
[(
<B(
 "
 	 	+ k40)..08EE!22JJ LL,, #22:> 3    K"
 	"
sF   ;CC
CCCC
A5C?C CCCCc                   | j                   }i ||}| j                  |||      }g }i }h d}	d}
|D ](  }| j                  rt        |      dkD  rt	        d      d} | j
                  |d   ||fi |D ]  }||}||z  } |J |j                  |j                  |j                  r|j                  j                  d      nd|j                  r|j                  j                  d      ndd       t        | f||d	|}t        |t              s|j                         }|j                  |d
          t        |	||       |
r|j                  d      }
+ | j                  |||||
      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   r4   r5   r@   r   r0   system_fingerprintr   )r   r   r   lenr   r   appendr3   r8   r:   r^   r   r9   extendr-   create_llm_resultrj   promptsr   rF   rX   r   sub_promptsr0   r)   _keysr   _prompts
generationr   r(   s                  r,   	_generatezBaseOpenAI._generate  s   , ((%F%f%**67DA&( G,0# #	LH~~x=1$$%STT8<
)T\\(1+t[SFS ,E!)%*
"e+
	,
 "--- *%55 *4)C)C)G)G)X!%55 %/$>$>$B$B:$N!
 1!){FL "(D1  (}}Hx	23"5(K@))16J)K&G#	LH %%1 & 
 	
r.   c                  K   | j                   }i ||}| j                  |||      }g }i }h d}	d}
|D ]  }| j                  rGt        |      dkD  rt	        d      d} | j
                  |d   ||fi |2 3 d{   }||}||z  }t        | f||d	| d{   }t        |t              s|j                         }|j                  |d
          t        |	||        | j                  |||||
      S 7 6 |J |j                  |j                  |j                  r|j                  j                  d      nd|j                  r|j                  j                  d      ndd       <7 ӭw)z:Call out to OpenAI's endpoint async with k unique prompts.>   r   r   r   Nr   r   r   r4   r5   r@   r   r0   r   )r   r   r   r   r   r   r   r3   r8   r:   rc   r   r9   r   r-   r   r   s                  r,   
_ageneratezBaseOpenAI._agenerate  s     ((%F%f%**67DA&( G,0#  	AH~~x=1$$%STT8<
#04==QK{$6<$ , ,% ")%*
"e+
 "8"!){"FL"  "(D1'}}Hx	23"5(K@A 	AB %%1 & 
 	
7, $ "--- *%55 *4)C)C)G)G)X!%55 %/$>$>$B$B:$N!
s8   A4E26C<:C:;C<>E2E0AE2:C<<A5E2c                &   |d|v rt        d      ||d<   |d   dk(  r0t        |      dk7  rt        d      | j                  |d         |d<   t        dt        |      | j                        D cg c]  }|||| j                  z     }}|S c c}w )z!Get the sub prompts for llm call.r   2`stop` found in both the input and default params.r   r   z7max_tokens set to -1 not supported for multiple inputs.r   )r   r   max_tokens_for_promptranger   )rj   r   r   r   ir   s         r,   r   zBaseOpenAI.get_sub_prompts  s      !UVV!F6N,2%7|q  M  $(#=#=gaj#IF<  1c'lDOO<
 ADOO+,
 
 	
s   1Br   c               |   g }|j                  d| j                        }t        |      D ]i  \  }}	|||z  |dz   |z   }
|j                  |
D cg c];  }t	        |d   t        |j                  d      |j                  d                  = c}       k || j                  d}|r||d	<   t        ||
      S c c}w )z2Create the LLMResult from the choices and prompts.r   r   r3   r4   r5   r6   r7   r)   r   r   generations
llm_output)r:   r   	enumerater   r   r9   r   r   )rj   r0   r   r   r)   r   r  r   r  _sub_choiceschoicer  s                r,   r   zBaseOpenAI.create_llm_result4  s     JJsDFF#g& 	DAq!!a%1q5A+6K #.	  #F^(,*0**_*E%+ZZ
%;)		 &1P
/AJ+,[ZHH	s   A B9
c                    i }t               s3|j                  | 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#   updaterg   rv   rw   rx   rG   proxyr   )rj   openai_credsrG   s      r,   r   zBaseOpenAI._invocation_paramsS  sx     (*~#22 $ 4 4$($<$< $($5$5@Q@QRFL7,7$"6"677r.   c                :    i d| j                   i| j                  S zGet the identifying parameters.r   r   r   ri   s    r,   _identifying_paramszBaseOpenAI._identifying_paramse  $     K<1JT5I5IJJr.   c                     y)Return type of llm.rG   rA   ri   s    r,   	_llm_typezBaseOpenAI._llm_typej  s     r.   c                   t         j                  d   dk  rt        |   |      S 	 ddl}| j                  xs | j                  }	 |j                  |      }|j                  || j                  | j                        S # t
        $ r t        d      w xY w# t        $ r+ t        j                  d       d}|j                  |      }Y sw xY w)	-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   )rj   r3   r%  r   encr   r   s         r,   get_token_idszBaseOpenAI.get_token_idso  s     A"7)$//	 --@
	/--j9C zz 00#66  
 	
  	A 	  	/NNRS!E''.C	/s   B  B  B1CCc                @   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| j                  d      d   } |j                  | d       }|/t        d!|  d"d#j                  |j	                               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'   )	modelnamemodel_token_mappingcontext_sizes      r,   modelname_to_contextsizez#BaseOpenAI.modelname_to_contextsize  sn   
g

 T
 $	

 $
 
 e
 e
 T
 !$
 !$
  
 %e
 %d
 D
  4!
" #
$ " $ $ $ $ $ $7
> I!,Q/I*..y$?!) -% %'+yy1D1I1I1K'LM 
 r.   c                8    | j                  | j                        S )z$Get max context size for this model.)r9  r   ri   s    r,   max_context_sizezBaseOpenAI.max_context_size  s     ,,T__==r.   c                B    | j                  |      }| j                  |z
  S )ap  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_tokens_for_prompt("Tell me a joke.")
        )r$  r;  )rj   r   
num_tokenss      r,   r   z BaseOpenAI.max_tokens_for_prompt  s%     ((0
$$z11r.   )r[   zDict[str, str]r[   	List[str]r[   rt   )r[   r{   )r   r   r[   zUnion[OpenAIChat, BaseOpenAI]r   rt   r[   r   r   r
   r[   r
   NN
r   r   r   Optional[List[str]]rF   "Optional[CallbackManagerForLLMRun]rX   r   r[   zIterator[GenerationChunk]
r   r   r   rE  rF   'Optional[AsyncCallbackManagerForLLMRun]rX   r   r[   zAsyncIterator[GenerationChunk]
r   r?  r   rE  rF   rF  rX   r   r[   r   
r   r?  r   rE  rF   rH  rX   r   r[   r   N)r   rt   r   r?  r   rE  r[   zList[List[str]])r0   r   r   r?  r   rt   r)   zDict[str, int]r   r   r[   r   r[   zMapping[str, Any]r[   r   r3   r   r[   z	List[int])r6  r   r[   r   )r[   r   )r   r   r[   r   )?__name__
__module____qualname____doc__propertyrk   classmethodrr   rz   r}   r!   rU   __annotations__rb   r   r   r   r   r   r   r   r   r9   r   rg   rv   rw   rx   r   r   r   rE   r   setr   r   r   r   r   r   r   r    model_configr"   r   r   r   r   r   r   r   r   r   r   r   r  r  r-  staticmethodr9  r;  r   __classcell__r   s   @r,   re   re      s?   14 4 / /     d3FC3dD9L#9$<GLJLK+J( E5D u ;e$AsJ;GSK#(#>L.>V %*$i$HNMHO%*4z%JO]J).t>)RRN"&L-&JHDIIEOA -24-HJ*HDK<It/?BuO<D3AF>F7)--J 7;O3:7;M4; %)K!( $ L (#  $ 6 6p 6 64 %):>	 " 8	
  
#: %)?C	 " =	
  
(: %):>	I
I
 "I
 8	I

 I
 
I
\ %)?C	8
8
 "8
 =	8

 8
 
8
| %)	  "	
 
< -1II I 	I
 $I *I 
I> 8 8" K K  
8 8 8t > >2r.   re   z0.0.10z1.0zlangchain_openai.OpenAI)sinceremovalalternative_importc                  @     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")
    c                
    g dS rm   rA   rp   s    r,   rr   zOpenAI.get_lc_namespace  rs   r.   c                8    i d| j                   it        |   S )Nr   )r   r   r   rj   r   s    r,   r   zOpenAI._invocation_params  s!    K7DOO,K0JKKr.   r>  r@  )	rO  rP  rQ  rR  rT  rr   rS  r   rY  rZ  s   @r,   r   r     s2     / / L Lr.   r   zlangchain_openai.AzureOpenAIc                  N    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_namer1   api_versionr   openai_api_versionr   rg   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_urlc                
    g dS rm   rA   rp   s    r,   rr   zAzureOpenAI.get_lc_namespace7  rs   r.   c                t   |d   dk  rt        d      |d   r|d   dkD  rt        d      |d   r|d   dkD  rt        d      |d   xs, t        j                  d	      xs t        j                  d
      |d<   |d   xs t        j                  d      |d<   |d   xs t        j                  d      |d<   |d   xs t        j                  d      |d<   t        |ddd      |d<   |d   xs, t        j                  d      xs t        j                  d      |d<   |d   xs t        j                  d      |d<   t        |ddd      |d<   	 ddl}t               r1|d   }|r|d    rd!|vr9|d   j                  d"      d!z   |d<   t        j                  d#| d$|d    d%       |d&   rVt        j                  d'       |d&   |d   vr2t        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,   i |d-   xs i d.d/i|d0   |d1   d2} |j                  d6i |j                  |d3<   |d4   }|r||d*<    |j                  d6i |j                  |d5<   |S |j                  |d3<   |S # t
        $ r t        d      w xY w)7r   r   r   r   r   r   r   r   rg   AZURE_OPENAI_API_KEYrh   rd  AZURE_OPENAI_ENDPOINTri  AZURE_OPENAI_AD_TOKENrv   r   rx   r   r1   r   rw   r   r   rh  OPENAI_API_VERSIONrl  OPENAI_API_TYPEazurer   Nr   rm  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 .rf  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/rj  r   rE   r   z
User-Agentz"langchain-comm-python-azure-openair   r   )rg  rd  re  r   ri  rj  r   r   r   rE   r   r   r   rU   rk  rb   rA   )r   r   r   r   rG   r   r#   rstripr   r   rc  r   AsyncAzureOpenAIr   )rq   r   rG   rv   r   rk  s         r,   r   z AzureOpenAI.validate_environment<  s    #;?455+6#;?@AA+6)#4q#8FGG #$ +yy/0+yy)* 	  $**:#; $
ryy#@
  $**:#; $
ryy#@
  %++<$= %
B
 ! "6	"
~ () 0yy)0yy./ 	$%
 (..B'C (
ryy H
#$ %9%'8'%
 !	 > %%67O6*=#>O30188=	I ,- MMR ++47H0I/J!M +,MM0 /0?P8QQ ( )8'8%&789< 01+f5F.GG1 15F,-%&:;"()9":$*+<$=!"23"()9":+12K+L &'< ="#45!"34%m4$/06B$ "F$ "(!8%m4!M$  2v11BMBNNF8,23R,S),;X78%<V%<%< &&k >"   &00F8S  	? 	s   J" "J7c                8    i d| j                   it        |   S )Nrf  )rf  r   r  ra  s    r,   r  zAzureOpenAI._identifying_params  s-    
 $"6"67
g)
 	
r.   c                    t               rd| j                  i}n$| j                  | j                  | j                  d}i |t        |   S )Nr   )engineapi_typerg  )r#   rf  rl  rh  r   r   )rj   openai_paramsr   s     r,   r   zAzureOpenAI._invocation_params  sS    >$d&:&:;M .. 00#66M
 ?->57#=>>r.   c                     y)r  ru  rA   ri   s    r,   r  zAzureOpenAI._llm_type  s     r.   c                4    | j                   | j                  dS )Nrl  rh  r  ri   s    r,   rz   zAzureOpenAI.lc_attributes  s       $33"&"9"9
 	
r.   r>  rB  rL  r@  rM  )rO  rP  rQ  rR  rd  rU  r!   rf  rh  rg   ri  rj  rk  rl  rm  rT  rr   r   r   rS  r  r   r  rz   rY  rZ  s   @r,   rc  rc    s3     (,N$+ ).dBT(UO%U
 $BmDDS',T'KN$KU'+N$+ ?C;B
 PT!#LS OS+"t" / / w wr 
 
 	? 	?   
 
r.   rc  z0.0.1zlangchain_openai.ChatOpenAIc                  N    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d/d$              Zed0d%       Zed1d&       Z	 d2	 	 	 	 	 d3d'Z	 	 d4	 	 	 	 	 	 	 	 	 d5d(Z	 	 d4	 	 	 	 	 	 	 	 	 d6d)Z	 	 d4	 	 	 	 	 	 	 	 	 d7d*Z	 	 d4	 	 	 	 	 	 	 	 	 d8d+Z ed9d,       Z!ed:d-       Z"d; fd.Z# xZ$S )<r   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   rU   rb   r   r   r   r   rt   r   r   r   r   rg   r   rv   rx      r   rE   r   prefix_messagesFr{   r   r   r   r   r   r   r   r   c                   t        |       j                         D ch c]  }|j                   }}|j                  di       }t	        |      D ].  }||vs||v rt        d| d      |j                  |      ||<   0 ||d<   |S c c}w )r   r   zFound z supplied twice.)r   r   r   r:   listr   pop)rq   r   fieldr   extra
field_names         r,   r   zOpenAIChat.build_extra  s     >H_=S=S=U#VEEKK#V #V

>2.v, 	;J!99&$vj\9I%JKK$*JJz$:j!		;
 "'~ $Ws   Bc                x   t        |dd      }t        |ddd      }t        |ddd      }t        |d	d
d      }	 ddl}||_        |r||_        |r||_        |r
||d|_        	 |j                  |d<   t        j                  d       |S # t        $ r t        d      w xY w# t        $ r t        d      w xY w)r   rg   rh   rv   r   r1   r   rx   r   rw   r   r   Nr  r   rU   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   rG   r   r  r   r  r   ChatCompletionAttributeErrorr   r   r   )rq   r   rg   rv   rx   rw   rG   s          r,   r   zOpenAIChat.validate_environment  s    .$&6
 /	
 ,	
 3)+@"
	+FN"1"&9#(4|L	%44F8 	G	

 %  	? 	  	7 	s   )B &B$ B!$B9c                    | j                   S )r   )r   ri   s    r,   r   zOpenAIChat._default_paramsH  s        r.   c                    t        |      dkD  rt        d|       | j                  d|d   dgz   }i d| j                  i| j                  }|d|v rt        d      ||d<   |j                  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:   )rj   r   r   messagesr   s        r,   _get_chat_paramszOpenAIChat._get_chat_paramsM  s     w<!H	R  ''Fwqz+R*SS!WWdoo$>!W$BVBV!W !UVV!F6N::l#r)|$r.   c              +  4  K   | j                  |g|      \  }}i ||ddi}t        | f||d|D ]b  }t        |t              s|j                         }|d   d   d   j	                  dd      }t        |	      }	|r|j                  ||	
       |	 d y wNr   Tr  rF   r0   r   deltar  r1   r2   )r   )r  r^   r   r9   r:   r   r   
rj   r   r   rF   rX   r  r   r   tokenr   s
             r,   r   zOpenAIChat._stream_  s       00&4@&5F5f5h50
#
@F
 		K k40)..0	*1-g6::9bIE#/E,,U%,@K		s   BBc               n  K   | j                  |g|      \  }}i ||ddi}t        | f||d| d {   2 3 d {   }t        |t              s|j                         }|d   d   d   j	                  dd      }t        |	      }	|r|j                  ||	
       d {    |	 s7 w7 p7 6 y wr  )r  rc   r   r9   r:   r   r   r  s
             r,   r   zOpenAIChat._astreams  s       00&4@&5F5f5h5'=(
#(
@F(
 "
 		 		+ k40)..0	*1-g6::9bIE#/E!2252FFFK"
 		 G"
sC   3B5B-B5B3B/B3A B5"B1#B5/B31B53B5c                   | j                   r;d } | j                  |d   ||fi |D ]  }||}||z  } |J t        |gg      S | j                  ||      \  }}i ||}t	        | f||d|}	t        |	t              s|	j                         }	|	d   | j                  d}
t        t        |	d   d   d   d   	      gg|

      S Nr   )r  r  r%   r  r0   messager  r2   r  )	r   r   r   r  r^   r   r9   r   r   rj   r   r   rF   rX   r   r   r  r   full_responser  s              r,   r   zOpenAIChat._generate  s    >>48J%gaj$NvN (%!&J%'J	(
 ))):,8800$?&%F%f%-
#
@F
 -.)..0M(1//

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

      S 7 6 |J t        |gg      S 7 pwr  )	r   r   r   r  rc   r   r9   r   r   r  s              r,   r   zOpenAIChat._agenerate  s/     >>48J,t}}WQZ{UfU ( (e%!&J%'J  00$?&%F%f%4
#
@F
 
 -.)..0M(1//

 y!9!!<Y!G	!RST "	
 	
'(U
 ))):,88
s2   'CCCC9C*C+ACCCc                :    i d| j                   i| j                  S r  r  ri   s    r,   r  zOpenAIChat._identifying_params  r  r.   c                     y)r  zopenai-chatrA   ri   s    r,   r  zOpenAIChat._llm_type  s     r.   c                   t         j                  d   dk  rt        |   |      S 	 ddl}|j                  | j                        }|j                  || j                  | j                        S # t
        $ r t        d      w xY w)r  r   r  r   Nr  r!  )r"  r#  r   r-  r%  r   r&  r   r+  r   r   )rj   r3   r%  r,  r   s       r,   r-  zOpenAIChat.get_token_ids  s     A"7(..	 ))$//:zz 00#66  
 	
  	A 	s   A/ /BrA  rB  r@  rK  )r   r?  r   rE  r[   r   rC  rD  rG  rI  rJ  rL  rM  rN  )%rO  rP  rQ  rR  r!   rU   rU  rb   r   r9   r   rg   rv   rx   rE   r  r  r   rV  r   r   r"   rT  r   r   r   rS  r   r  r   r   r   r   r  r  r-  rY  rZ  s   @r,   r   r     sc    d3FC3dD9L#9%J%#(#>L.>V %*$i$HNMHO%*4z%JO]J #'L-&K<!$7OT7,It/?BuO<D3AF>F7(#  $ 0 0d ! !
 ?C   (; 	 * %):>	 " 8	
  
#. %)?C	 " =	
  
(. %):>	!
!
 "!
 8	!

 !
 
!
L %)?C	!
!
 "!
 =	!

 !
 
!
F K K  
 
r.   r   )r'   zSet[str]r(   rt   r)   rt   r[   None)r;   rt   r[   r   )r(   rt   r;   rt   r[   r  r@  rK  )rN   Union[BaseOpenAI, OpenAIChat]rF   zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]r[   zCallable[[Any], Any])rN   r  rF   rF  rX   r   r[   r   )rN   r  rF   rH  rX   r   r[   r   )>
__future__r   loggingr   r"  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#   	getLoggerrO  r(  r-   r<   r>   rB   rP   r^   rc   re   r   rc  r   rA   r.   r,   <module>r     s   "  	 
     $ 7 U I I 
 5 : 7 7 9			8	$	9
	9,	9;I	9		9#S	  			&
 , 7;,	&,3, , 		,( <@2	&282 2 		2&C	2 C	2L (E>WXLZ L YL4 
E6TX
* X
X
v 
4
O
 O

O
r.   