
    $hi                    P   S SK Jr  S SKrS SKrS SKJrJrJrJr  S SK	J
r
JrJrJr  S SKrS SKrS SKJrJr  S SKJr  S SKJrJrJr  S SKJr  S S	KJrJrJr  S S
KJ r J!r!J"r"J#r#  S SK$J%r%  \RL                  " \'5      r(        SS jr)    SS jr* " S S\5      r+ " S S\+5      r,g)    )annotationsN)AsyncIterator
CollectionIteratorMapping)AnyLiteralOptional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                    U R                  US   5      nU H&  nXB;  a  US   U   X$'   M  X$==   US   U   -  ss'   M(     g)zUpdate token usage.usageN)intersection)keysresponsetoken_usage_keys_to_use_keys        R/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_openai/llms/base.py_update_token_usager$      sS     $$Xg%67L" ( 1$ 7K'!24!88	     c           
         U S   (       d	  [        SS9$ [        U S   S   S   =(       d    S[        U S   S   R                  SS5      U S   S   R                  SS5      S	9S
9$ )z0Convert a stream response to a generation chunk.choices )textr   r)   finish_reasonNlogprobsr*   r+   r)   generation_info)r   dictget)stream_responses    r#   $_stream_response_to_generation_chunkr2   $   sw     9%B''Y'*628b))4Q7;;OTR$Y/266z4H
 r%   c                  :  ^  \ rS rSr% Sr\" SSS9rS\S'   \" SSS9rS\S'   \" S	S
S9r	S\S'    Sr
S\S'    SrS\S'    SrS\S'    SrS\S'    SrS\S'    SrS\S'    SrS\S'    \" \S9rS\S'    \" S\" SSS 9S!9rS"\S#'    \" S$\" S%SS 9S!9rS&\S''    \" S(\" S)S*/SS 9S!9rS&\S+'    \" \" S,SS 9S9rS&\S-'   S.rS\S/'    \" SS0S9rS1\S2'    SrS3\S4'    S5rS\S6'    SrS7\S8'    SrS7\S9'    S:rS;\S<'    \ " 5       r!S=\S>'    S?r"S@\SA'    Sr#S&\SB'    Sr$SC\SD'   Sr%SE\SF'   Sr&SG\SH'    Sr'SG\SI'    Sr(SJ\SK'    \)" SSL9r*\+" SMSN9\,SbSO j5       5       r-\+" SPSN9ScSQ j5       r.\/SdSR j5       r0  Se         SfSS jjr1  Se         SgST jjr2  Se         ShSU jjr3  Se         SiSV jjr4 Sj       SkSW jjr5SSX.           SlSY jjr6\/SdSZ j5       r7\/SmS[ j5       r8\/SnS\ j5       r9SoU 4S] jjr:\;SpS^ j5       r<\/SqS_ j5       r=SrS` jr>Sar?U =r@$ )s
BaseOpenAI3   z'Base OpenAI large language model class.NT)defaultexcluder   clientasync_clientgpt-3.5-turbo-instructmodel)r6   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)r6   )r<   rJ   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]seedr+   Fbool	streamingzUnion[Literal['all'], set[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                2    [        U 5      n[        X5      nU$ )z>Build extra kwargs from additional params that were passed in.)r   r   )clsvaluesall_required_field_namess      r#   build_extraBaseOpenAI.build_extra   s     $<C#@ $VFr%   afterc                   U R                   S:  a  [        S5      eU R                  (       a  U R                   S:  a  [        S5      eU R                  (       a  U R                  S:  a  [        S5      eU R                  (       a  U R                  R                  5       OSU R                  U R                  U R                  U R                  U R                  U R                  S.nU R                  (       d5  SU R                  0n[        R                  " S0 UDUD6R                   U l        U R"                  (       d5  SU R$                  0n[        R&                  " S0 UDUD6R                   U l        U $ )	z?Validate that api key and python package exists in environment.rD   zn must be at least 1.z!Cannot stream results when n > 1.z'Cannot stream results when best_of > 1.N)rM   rT   rP   r\   r`   rh   ri   rj    )rH   
ValueErrorrc   rI   rO   get_secret_valuerW   rS   r]   r`   rh   ri   r8   rj   openaiOpenAIcompletionsr9   rk   AsyncOpenAI)selfclient_paramssync_specificasync_specifics       r#   validate_environment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                   U R                   U R                  U R                  U R                  U R                  U R
                  U R                  S.nU R                  b  U R                  US'   U R                  b  U R                  US'   U R                  b  U R                  US'   U R                  S:  a  U R                  US'   0 UEU R                  E$ )z2Get the default parameters for calling OpenAI API.)r@   rE   rF   rG   rH   ra   r+   r^   rC   rl   rD   rI   )r@   rE   rF   rG   rH   ra   r+   r^   rC   rl   rI   rL   )r   normal_paramss     r#   _default_paramsBaseOpenAI._default_params   s      ++ZZ!%!7!7 $ 5 5II)
 ??&*.//M,'??&*.//M,'??&*.//M,' <<!'+||M)$5-54#4#455r%   c              +    #    0 U R                   EUESS0EnU R                  XQ/U5        U R                  R                  " SSU0UD6 H  n[	        U[
        5      (       d  UR                  5       n[        U5      nU(       aF  UR                  UR                  UU R                  UR                  (       a  UR                  S   OS S9  Uv   M     g 7fNstreamTpromptr+   )chunkverboser+   rx   )_invocation_paramsget_sub_promptsr8   create
isinstancer/   
model_dumpr2   on_llm_new_tokenr)   r   r.   r   r   stoprun_managerkwargsparamsstream_respr   s           r#   _streamBaseOpenAI._stream   s      GD++FvFxFVXt4;;--FVFvFKk400)4468EE,,JJ LL !00 --j9! - 	 K! Gs   CCc                 #    0 U R                   EUESS0EnU R                  XQ/U5        U R                  R                  " SSU0UD6I S h  vN   S h  vN n[	        U[
        5      (       d  UR                  5       n[        U5      nU(       aN  UR                  UR                  UU R                  UR                  (       a  UR                  S   OS S9I S h  vN   U7v   M   N N N
 g 7fr   )r   r   r9   r   r   r/   r   r2   r   r)   r   r.   r   s           r#   _astreamBaseOpenAI._astream   s      GD++FvFxFVXt4'+'8'8'?'? (
(
#(
 "
 "
 	+ k400)4468EE!22JJ LL !00 --j9! 3 	 	 	 K%"
 		"
sI   A	C-C%C-C+C'C+BC-C)C-'C+)C-+C-c                   U R                   n0 UEUEnU R                  XQU5      n/ n0 n1 Skn	Sn
U GH  nU R                  (       a  [        U5      S:  a  [	        S5      eSnU R
                  " US   X#40 UD6 H  nUc  UnM
  X-  nM     Uc  [	        S5      eUR                  UR                  UR                  (       a  UR                  R                  S5      OSUR                  (       a  UR                  R                  S5      OSS	.5        M  U R                  R                  " SS
U0UD6n[        U[        5      (       d  UR                  5       nUR                  S5      (       a  [	        UR                  S5      5      eUR                  US   5        [!        XU5        U
(       a  GM~  UR                  S5      n
GM     U R#                  XqXXU
S9$ )a-  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_tokensNrD   ,Cannot stream results with multiple prompts.r   $Generation is empty after streaming.r*   r+   r)   r*   r+   r   errorr'   system_fingerprintr   rx   )r   r   rc   lenry   r   appendr)   r.   r0   r8   r   r   r/   r   extendr$   create_llm_resultr   promptsr   r   r   r   sub_promptsr'   r    _keysr   _prompts
generationr   r   s                  r#   	_generateBaseOpenAI._generate  s   . ((%F%f%**6DA&( G,0#H~~x=1$$%STT8<
!\\(1+tSFSE!)%*
"+
	 T
 %$%KLL *  *99 '66::?K!%  *99 '66:::F!%   ;;--HXHH!(D11  (224H <<(($X\\'%:;;x	23#E[A)))16J)K&[ $\ %%fFX & 
 	
r%   c                >  #    U R                   n0 UEUEnU R                  XQU5      n/ n0 n1 Skn	Sn
U H  nU R                  (       aI  [        U5      S:  a  [	        S5      eSnU R
                  " US   X#40 UD6  Sh  vN nUc  UnM  X-  nM  U R                  R                  " SS
U0UD6I Sh  vN n[        U[        5      (       d  UR                  5       nUR                  US   5        [!        XU5        M     U R#                  XqXXU
S9$  N
 Uc  [	        S5      eUR                  UR                  UR                  (       a  UR                  R                  S5      OSUR                  (       a  UR                  R                  S5      OSS	.5        GMh   N7f)z:Call out to OpenAI's endpoint async with k unique prompts.>   r   r   r   NrD   r   r   r   r*   r+   r   r   r'   r   rx   )r   r   rc   r   ry   r   r   r)   r.   r0   r9   r   r   r/   r   r   r$   r   r   s                  r#   
_agenerateBaseOpenAI._agenerateb  s     ((%F%f%**6DA&( G,0#H~~x=1$$%STT8<
#'==QK$6<$ ,% ")%*
"+
& "&!2!2!9!9!T!TV!TT!(D11'224Hx	23#E[AG $H %%fFX & 
 	
=, $ %$%KLL *  *99 '66::?K!%  *99 '66:::F!%  Us8   A8F:D>D?D/F1F2AFDB
Fc                   Ub  X1S'   US   S:X  a1  [        U5      S:w  a  [        S5      eU R                  US   5      US'   [        S[        U5      U R                  5       Vs/ sH  nX$X@R                  -    PM     nnU$ s  snf )z!Get the sub prompts for llm call.r   rC   rD   z7max_tokens set to -1 not supported for multiple inputs.r   )r   ry   max_tokens_for_promptranger[   )r   r   r   r   ir   s         r#   r   BaseOpenAI.get_sub_prompts  s     !6N,2%7|q  M  $(#=#=gaj#IF<  1c'lDOO<
< OO+,< 	 
 	
s   $Br   c               r   / nUR                  SU R                  5      n[        U5       Hd  u  pXU-  US-   U-   n
UR                  U
 Vs/ sH6  n[	        US   [        UR                  S5      UR                  S5      S9S9PM8     sn5        Mf     X@R                  S.nU(       a  X\S	'   [        XlS
9$ s  snf )z2Create the LLMResult from the choices and prompts.rH   rD   r)   r*   r+   r,   r-   )r    r>   r   )generations
llm_output)r0   rH   	enumerater   r   r/   r>   r   )r   r'   r   r   r    r   r   rH   r   _sub_choiceschoicer   s                r#   r   BaseOpenAI.create_llm_result  s     JJsDFF#g&DA!a%1q5A+6K #.	 #. #F^(,*0**_*E%+ZZ
%;) #.	 ' &1P
/A+,[HH	s   <B4
c                    U R                   $ )z,Get the parameters used to invoke the model.)r   r   s    r#   r   BaseOpenAI._invocation_params  s     ###r%   c                :    0 SU R                   0EU R                  E$ )zGet the identifying parameters.r>   )r>   r   r   s    r#   _identifying_paramsBaseOpenAI._identifying_params  s$     K<1JT5I5IJJr%   c                    g)zReturn type of llm.r{   rx   r   s    r#   	_llm_typeBaseOpenAI._llm_type  s     r%   c                  > U R                   b  U R                  U5      $ [        R                  S   S:  a  [        TU ]  U5      $ U R
                  =(       d    U R                  n [        R                  " U5      nUR                  UU R                  U R                  S9$ ! [         a    [        R                  " S5      n NGf = f)z-Get the token IDs using the tiktoken package.rD      cl100k_base)rd   rf   )custom_get_token_idssysversion_infosuperget_num_tokensrg   r>   tiktokenencoding_for_modelKeyErrorget_encodingencoderd   rf   )r   r)   r>   enc	__class__s       r#   get_token_idsBaseOpenAI.get_token_ids  s    $$0,,T22A"7)$//--@
	7--j9C zz 00#66  
 	
  	7''6C	7s   &B! ! CCc                H   0 SS_SS_SS_SS_SS_SS_S	S
_SS
_SS
_SS_SS_SS_SS_SS_SS_SS_SS_SSSSSSSSSSSS.EnSU ;   a  U R                  S5      S   n UR                  U S 5      nUc/  [        S!U  S"3S#R                  UR	                  5       5      -   5      eU$ )$a0  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, )splitr0   ry   joinr   )	modelnamemodel_token_mappingcontext_sizes      r#   modelname_to_contextsize#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    U R                  U R                  5      $ )z$Get max context size for this model.)r   r>   r   s    r#   max_context_sizeBaseOpenAI.max_context_size/  s     ,,T__==r%   c                B    U R                  U5      nU R                  U-
  $ )a1  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    BaseOpenAI.max_tokens_for_prompt4  s%     ((0
$$z11r%   )r9   r8   )rr   rK   returnr   )r   r   r   rK   )NN)
r   r=   r   Optional[list[str]]r   "Optional[CallbackManagerForLLMRun]r   r   r   zIterator[GenerationChunk])
r   r=   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   rK   r   r   r   r   r   zlist[list[str]])r'   r   r   r   r   rK   r    zdict[str, int]r   rR   r   r   )r   zMapping[str, Any])r   r=   )r)   r=   r   z	list[int])r   r=   r   rB   )r   rB   )r   r=   r   rB   )A__name__
__module____qualname____firstlineno____doc__r   r8   __annotations__r9   r>   r@   rC   rE   rF   rG   rH   rI   r/   rL   r   rO   r   rS   rW   rY   r[   r]   r^   r`   ra   r+   rc   setrd   rf   rg   rh   ri   rj   rk   rl   r   model_configr   classmethodrt   r   propertyr   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   __static_attributes____classcell__r   s   @r#   r4   r4   3   sw   1d3FC3dD9L#9$<GLJLK+J( E5D u ;e$AsJ;GSK#(#>L.>V*/9ISW)X+N'  R%*(3Dd*S&O] ). 34d
*  Q"' >#L-  JHDIIEOA -1J*1DK<D-"Hm"#It/7:uO4<3AF>F7)--J 7;O3:7;M4; %)K!( +/'.W.2J+2@ t4L(#  $ '" #@ 6 6> %):>	 " 8	
  
#< %)?C	 " =	
  
(@ %):>	P
P
 "P
 8	P

 P
 
P
j %)?C	7
7
 "7
 =	7

 7
 
7
z %)	  "	
 
8 -1II I 	I
 $I *I 
I> $ $ K K  
( : :x > >2 2r%   r4   c                     ^  \ rS rSrSr\S	S j5       r\S
S j5       r\SU 4S jj5       r	\SS j5       r
\SS j5       rSrU =r$ )r|   iG  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                
    / SQ$ )z*Get the namespace of the langchain object.)	langchainllmsr{   rx   rq   s    r#   get_lc_namespaceOpenAI.get_lc_namespace  s
     /.r%   c                    g)z9Return whether this model can be serialized by LangChain.Trx   r  s    r#   is_lc_serializableOpenAI.is_lc_serializable  s     r%   c                8   > 0 SU R                   0E[        TU ]  E$ )Nr;   )r>   r   r   )r   r   s    r#   r   OpenAI._invocation_params  s!    K7DOO,K0JKKr%   c                
    SS0$ )NrO   rN   rx   r   s    r#   
lc_secretsOpenAI.lc_secrets  s     "233r%   c                    0 nU R                   (       a  U R                   US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U$ )NrS   rW   rY   )rS   rW   rY   )r   
attributess     r#   lc_attributesOpenAI.lc_attributes  sZ    %'
,0,@,@J()##040H0HJ,-)-):):J~&r%   rx   )r   r   )r   rb   r   )r   zdict[str, str])r   r   r   r   r   r  r  r  r  r   r  r  r  r  r  s   @r#   r|   r|   G  sp    bH / /   L L 4 4  r%   r|   )r   zset[str]r   rK   r    rK   r   None)r1   rK   r   r   )-
__future__r   loggingr   collections.abcr   r   r   r   typingr   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$   r2   r4   r|   rx   r%   r#   <module>r)     s    "  
 H H 0 0   8 I I 9 U U B B "			8	$	9
	9,	9;I	9		9#Q2 Q2hCZ Cr%   