
    7|h,i                    X   d dl m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 d dlZd dlZd dlmZmZ d dlmZ d dlmZmZmZ d dlmZ d dlm Z m!Z!m"Z" d d	l#m$Z$m%Z%m&Z&m'Z' d d
l(m)Z)  ejT                  e+      Z,	 	 	 	 	 	 	 	 ddZ-	 	 	 	 ddZ. G d de      Z/ G d de/      Z0y)    )annotationsN)AbstractSetAnyAsyncIterator
CollectionDictIteratorListLiteralMappingOptionalSetTupleUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)get_pydantic_field_names)_build_model_kwargsfrom_envsecret_from_env)
ConfigDictField	SecretStrmodel_validator)Selfc                    | 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        Y/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_openai/llms/base.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   r.   finish_reasonNlogprobsr/   r0   r.   generation_info)r   dictget)stream_responses    r(   $_stream_response_to_generation_chunkr7   1   sr     9%B''Y'*62))4Q7;;OTR$Y/266z4H
 r*   c                  d    e Zd ZU d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 edd             Zd!ed"<   	  ed# ed$d             Zd%ed&<   	  ed' ed(d)gd             Zd%ed*<   	  e ed+d            Zd%ed,<   d-Zded.<   	  edd/
      Zd0ed1<   	 dZd2ed3<   	 d4Zded5<   	 dZd6ed7<   	 dZd6ed8<   	 d9Zd:ed;<   	  e       Z d<ed=<   	 d>Z!d?ed@<   	 dZ"d%edA<   	 dZ#dBedC<   dZ$dDedE<   dZ%dFedG<   	 dZ&dFedH<   	 dZ'dIedJ<   	  e(dK      Z) e*dLM      e+d`dN              Z, e*dOM      dadP       Z-e.dbdQ       Z/	 	 dc	 	 	 	 	 	 	 	 	 dddRZ0	 	 dc	 	 	 	 	 	 	 	 	 dedSZ1	 	 dc	 	 	 	 	 	 	 	 	 dfdTZ2	 	 dc	 	 	 	 	 	 	 	 	 dgdUZ3	 dh	 	 	 	 	 	 	 didVZ4ddW	 	 	 	 	 	 	 	 	 	 	 djdXZ5e.dbdY       Z6e.dkdZ       Z7e.dld[       Z8dm fd\Z9e:dnd]       Z;e.dod^       Z<dpd_Z= xZ>S )q
BaseOpenAIz'Base OpenAI large language model class.NT)defaultexcluder   clientasync_client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Dict[str, Any]model_kwargsapi_keyOPENAI_API_KEY)r:   )r@   rN   zOptional[SecretStr]openai_api_keybase_urlOPENAI_API_BASEOptional[str]openai_api_baseorganizationOPENAI_ORG_IDOPENAI_ORGANIZATIONopenai_organizationOPENAI_PROXYopenai_proxy   
batch_sizetimeoutz,Union[float, Tuple[float, float], Any, None]request_timeoutzOptional[Dict[str, float]]
logit_bias   max_retrieszOptional[int]seedr0   Fbool	streamingz'Union[Literal['all'], AbstractSet[str]]allowed_specialallz&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http_async_clientzOptional[Mapping[str, Any]]
extra_body)populate_by_namebefore)modec                4    t        |       }t        ||      }|S )z>Build extra kwargs from additional params that were passed in.)r   r   )clsvaluesall_required_field_namess      r(   build_extrazBaseOpenAI.build_extra   s!     $<C#@ $V-EFr*   afterc                   | j                   dk  rt        d      | j                  r| j                   dkD  rt        d      | j                  r| j                  dkD  rt        d      | j                  r| j                  j                         nd| j                  | j                  | j                  | j                  | j                  | j                  d}| j                  s4d| j                  i}t        j                  di ||j                   | _        | j"                  s4d| j$                  i}t        j&                  di ||j                   | _        | S )	z?Validate that api key and python package exists in environment.rH   zn must be at least 1.z!Cannot stream results when n > 1.z'Cannot stream results when best_of > 1.N)rQ   rX   rT   r`   rd   rl   rm   rn    )rL   
ValueErrorrg   rM   rS   get_secret_valuer[   rW   ra   rd   rl   rm   r<   rn   openaiOpenAIcompletionsr=   ro   AsyncOpenAI)selfclient_paramssync_specificasync_specifics       r(   validate_environmentzBaseOpenAI.validate_environment   s6    66A:455>>dffqj@AA>>dllQ.FGG ;?:M:M##446SW 44,,++++#33!//

 {{*D,<,<=M --I-I=IUUDK  +T-C-CDN & 2 2 !! ! k 
 r*   c                   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  d}| j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  dkD  r| j                  |d<   i || j                  S )z2Get the default parameters for calling OpenAI API.)rD   rI   rJ   rK   rL   re   r0   rb   rG   rp   rH   rM   )rD   rI   rJ   rK   rL   re   r0   rb   rG   rp   rM   rP   )r   normal_paramss     r(   _default_paramszBaseOpenAI._default_params   s      ++ZZ!%!7!7 $ 5 5II)
 ??&*.//M,'??&*.//M,'??&*.//M,' <<!'+||M)$5-54#4#455r*   c              +    K   i | j                   |ddi}| j                  ||g|        | j                  j                  dd|i|D ]w  }t	        |t
              s|j                         }t        |      }|rD|j                  |j                  || j                  |j                  r|j                  d   nd        | y y wNstreamTpromptr0   )chunkverboser0   r{   )_invocation_paramsget_sub_promptsr<   create
isinstancer4   
model_dumpr7   on_llm_new_tokenr.   r   r3   r   r   stoprun_managerkwargsparamsstream_respr   s           r(   _streamzBaseOpenAI._stream   s      GD++FvFxFVfXt4-4;;--FVFvF 	Kk40)4468EE,,JJ LL !00 --j9! - 	 K!	s   CCc                 K   i | j                   |ddi}| j                  ||g|        | j                  j                  dd|i| 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   r=   r   r   r4   r   r7   r   r.   r   r3   r   s           r(   _astreamzBaseOpenAI._astream   s     GD++FvFxFVfXt4'?t'8'8'?'? (
(
#(
 "
 	 	+ k40)4468EE!22JJ LL !00 --j9! 3 	 	 	 K%"
 		"
sI   A
C!CC!CCCA5C!CC!CC!C!c                \   | j                   }i ||}| j                  |||      }g }i }h d}	d}
|D ]b  }| 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        | j                  j                  dd	|i|}t        |t              s|j                         }|j                  d
      rt	        |j                  d
            |j                  |d          t!        |	||       |
rR|j                  d      }
e | 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_tokensNrH   ,Cannot stream results with multiple prompts.r   r/   r0   r.   r/   r0   r   errorr,   system_fingerprintr   r{   )r   r   rg   lenr|   r   appendr.   r3   r5   r<   r   r   r4   r   extendr)   create_llm_resultr   promptsr   r   r   r   sub_promptsr,   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+
	,
 "--- *  *99 '66::?K!%  *99 '66:::F!%  .4;;--HXHH!(D1  (224H <<($X\\'%:;;x	23#E8[A))16J)K&Y,	LZ %%WfkFX & 
 	
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  } | j                  j                  dd	|i| 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       K7 ӭw)z:Call out to OpenAI's endpoint async with k unique prompts.>   r   r   r   NrH   r   r   r/   r0   r   r   r,   r   r{   )r   r   rg   r   r|   r   r   r.   r3   r5   r=   r   r   r4   r   r   r)   r   r   s                  r(   
_ageneratezBaseOpenAI._ageneratel  s     ((%F%f%**67DA&( G,0# "	BH~~x=1$$%STT8<
#04==QK{$6<$ , ,% ")%*
"e+
$ ":!2!2!9!9!T!TV!TT!(D1'224Hx	23#E8[AE"	BF %%WfkFX & 
 	
;, $ "--- *  *99 '66::?K!%  *99 '66:::F!%  Us8   A4F6D:D	;D>-F+E?,AF	DA5Fc                   |||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   rG   rH   z7max_tokens set to -1 not supported for multiple inputs.r   )r   r|   max_tokens_for_promptranger_   )r   r   r   r   ir   s         r(   r   zBaseOpenAI.get_sub_prompts  s     !F6N,2%7|q  M  $(#=#=gaj#IF<  1c'lDOO<
 ADOO+,
 
 	
s   "A?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.rL   rH   r.   r/   r0   r1   r2   )r%   rB   r   )generations
llm_output)r5   rL   	enumerater   r   r4   rB   r   )r   r,   r   r   r%   r   r   rL   r   _sub_choiceschoicer   s                r(   r   zBaseOpenAI.create_llm_result  s     JJsDFF#g& 	DAq!!a%1q5A+6K #.	  #F^(,*0**_*E%+ZZ
%;)		 &1P
/AJ+,[ZHH	s   A B9
c                    | j                   S )z,Get the parameters used to invoke the model.)r   r   s    r(   r   zBaseOpenAI._invocation_params  s     ###r*   c                :    i d| j                   i| j                  S )zGet the identifying parameters.rB   )rB   r   r   s    r(   _identifying_paramszBaseOpenAI._identifying_params  s$     K<1JT5I5IJJr*   c                     y)zReturn type of llm.r~   r{   r   s    r(   	_llm_typezBaseOpenAI._llm_type  s     r*   c                   | j                   | j                  |      S t        j                  d   dk  rt        |   |      S | j
                  xs | j                  }	 t        j                  |      }|j                  || j                  | j                        S # t        $ r t        j                  d      }Y Hw xY w)z-Get the token IDs using the tiktoken package.rH      cl100k_base)rh   rj   )custom_get_token_idssysversion_infosuperget_num_tokensrk   rB   tiktokenencoding_for_modelKeyErrorget_encodingencoderh   rj   )r   r.   rB   enc	__class__s       r(   get_token_idszBaseOpenAI.get_token_ids  s    $$0,,T22A"7)$//--@
	7--j9C zz 00#66  
 	
  	7''6C	7s   B B=<B=c                B   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}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-4o-minii  zgpt-4ozgpt-4o-2024-05-13zgpt-4i    z
gpt-4-0314z
gpt-4-0613z	gpt-4-32ki   zgpt-4-32k-0314zgpt-4-32k-0613zgpt-3.5-turboi   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  adai  i  iA  i   )ztext-babbage-001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, )splitr5   r|   joinr#   )	modelnamemodel_token_mappingcontext_sizes      r(   modelname_to_contextsizez#BaseOpenAI.modelname_to_contextsize  sr   
7
g
  
 T	

 $
 $
 
 e
 e
 T
 !$
 !$
  
 %e
 %d
  D!
" 4#
$ !%" $ $ $ $ $ $9
@ I!,Q/I*..y$?!) -% %'+yy1D1I1I1K'LM 
 r*   c                8    | j                  | j                        S )z$Get max context size for this model.)r   rB   r   s    r(   max_context_sizezBaseOpenAI.max_context_size7  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   )r   r   
num_tokenss      r(   r   z BaseOpenAI.max_tokens_for_prompt<  s%     ((0
$$z11r*   )rv   rO   returnr   )r   r   r   rO   )NN)
r   rA   r   Optional[List[str]]r   "Optional[CallbackManagerForLLMRun]r   r   r   zIterator[GenerationChunk])
r   rA   r   r   r   'Optional[AsyncCallbackManagerForLLMRun]r   r   r   zAsyncIterator[GenerationChunk])
r   	List[str]r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )N)r   rO   r   r   r   r   r   zList[List[str]])r,   r   r   r   r   rO   r%   zDict[str, int]r   rV   r   r   )r   zMapping[str, Any])r   rA   )r.   rA   r   z	List[int])r   rA   r   rF   )r   rF   )r   rA   r   rF   )?__name__
__module____qualname____doc__r   r<   __annotations__r=   rB   rD   rG   rI   rJ   rK   rL   rM   r4   rP   r   rS   r   rW   r[   r]   r_   ra   rb   rd   re   r0   rg   setrh   rj   rk   rl   rm   rn   ro   rp   r   model_configr   classmethodrx   r   propertyr   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   __classcell__r   s   @r(   r9   r9   @   sr   1d3FC3dD9L#9$<GLJLK+J( E5D u ;e$AsJ;GSK#(#>L.>V*/9ISW)X+N'  P%*(3Dd*S&O] ). 34d
*  O"' >#L-  JHDIIEOA -1J*1DK<D-"Hm"#It/?BuO<D3AF>F7)--J 7;O3:7;M4; %)K!( +/'.S.2J+2@ t4L(#  $ '" #@ 6 6> %):>	 " 8	
  
#< %)?C	 " =	
  
(@ %):>	N
N
 "N
 8	N

 N
 
N
f %)?C	6
6
 "6
 =	6

 6
 
6
x %)	  "	
 
8 -1II I 	I
 $I *I 
I> $ $ K K  
( 9 9v > >2r*   r9   c                  v     e Zd ZdZedd       Zedd       Zed	 fd       Zed
d       Z	ed	d       Z
 xZS )r   u  OpenAI completion model integration.

    Setup:
        Install ``langchain-openai`` and set environment variable ``OPENAI_API_KEY``.

        .. code-block:: bash

            pip install -U langchain-openai
            export OPENAI_API_KEY="your-api-key"

    Key init args — completion params:
        model: str
            Name of OpenAI model to use.
        temperature: float
            Sampling temperature.
        max_tokens: Optional[int]
            Max number of tokens to generate.
        logprobs: Optional[bool]
            Whether to return logprobs.
        stream_options: Dict
            Configure streaming outputs, like whether to return token usage when
            streaming (``{"include_usage": True}``).

    Key init args — client params:
        timeout: Union[float, Tuple[float, float], Any, None]
            Timeout for requests.
        max_retries: int
            Max number of retries.
        api_key: Optional[str]
            OpenAI API key. If not passed in will be read from env var OPENAI_API_KEY.
        base_url: Optional[str]
            Base URL for API requests. Only specify if using a proxy or service
            emulator.
        organization: Optional[str]
            OpenAI organization ID. If not passed in will be read from env
            var OPENAI_ORG_ID.

    See full list of supported init args and their descriptions in the params section.

    Instantiate:
        .. code-block:: python

            from langchain_openai import OpenAI

            llm = OpenAI(
                model="gpt-3.5-turbo-instruct",
                temperature=0,
                max_retries=2,
                # api_key="...",
                # base_url="...",
                # organization="...",
                # other params...
            )

    Invoke:
        .. code-block:: python

            input_text = "The meaning of life is "
            llm.invoke(input_text)

        .. code-block:: none

            "a philosophical question that has been debated by thinkers and scholars for centuries."

    Stream:
        .. code-block:: python

            for chunk in llm.stream(input_text):
                print(chunk, end="|")

        .. code-block:: none

            a| philosophical| question| that| has| been| debated| by| thinkers| and| scholars| for| centuries|.

        .. code-block:: python

            "".join(llm.stream(input_text))

        .. code-block:: none

            "a philosophical question that has been debated by thinkers and scholars for centuries."

    Async:
        .. code-block:: python

            await llm.ainvoke(input_text)

            # stream:
            # async for chunk in (await llm.astream(input_text)):
            #    print(chunk)

            # batch:
            # await llm.abatch([input_text])

        .. code-block:: none

            "a philosophical question that has been debated by thinkers and scholars for centuries."

    c                
    g dS )z*Get the namespace of the langchain object.)	langchainllmsr~   r{   ru   s    r(   get_lc_namespacezOpenAI.get_lc_namespace  s
     /.r*   c                     y)z9Return whether this model can be serialized by Langchain.Tr{   r   s    r(   is_lc_serializablezOpenAI.is_lc_serializable  s     r*   c                8    i d| j                   it        |   S )Nr?   )rB   r   r   )r   r   s    r(   r   zOpenAI._invocation_params  s!    K7DOO,K0JKKr*   c                
    ddiS )NrS   rR   r{   r   s    r(   
lc_secretszOpenAI.lc_secrets  s     "233r*   c                    i }| j                   r| j                   |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   |S )NrW   r[   r]   )rW   r[   r]   )r   
attributess     r(   lc_attributeszOpenAI.lc_attributes  sZ    %'
,0,@,@J()##040H0HJ,-)-):):J~&r*   )r   r   )r   rf   r   )r   zDict[str, str])r   r   r   r   r   r   r   r   r   r  r  r   r   s   @r(   r   r   N  sp    bH / /   L L 4 4  r*   r   )r#   zSet[str]r$   rO   r%   rO   r   None)r6   rO   r   r   )1
__future__r   loggingr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r~   r   langchain_core.callbacksr   r   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   r   langchain_core.utilsr   langchain_core.utils.utilsr   r   r   pydanticr   r   r   r   typing_extensionsr   	getLoggerr   loggerr)   r7   r9   r   r{   r*   r(   <module>r     s    "  
       8 I I 9 U U B B "			8	$	9
	9,	9;I	9		9#K2 K2\CZ Cr*   