ó
    ýÞ j:€  ã                  ót  • S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	J
r
  SSKJrJr  SSKrSSKrSSKJ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'  SSK(J)r)  SSK*J+r+  \RX                  " \-5      r.        SS jr/    SS jr0 " S S\5      r1 " S S\15      r2g)zQBase classes for OpenAI large language models. Chat models are in `chat_models/`.é    )ÚannotationsN)ÚAsyncIteratorÚCallableÚ
CollectionÚIteratorÚMapping)ÚAnyÚLiteral)Ú
deprecated)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚBaseLLM)Ú
GenerationÚGenerationChunkÚ	LLMResult)Úget_pydantic_field_names)Ú_build_model_kwargsÚfrom_envÚsecret_from_env)Ú
ConfigDictÚFieldÚ	SecretStrÚmodel_validator)ÚSelf)Ú__version__)Ú	_PROFILESc                ó„   • 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        ÚT/var/www/html/gaurav/venv/lib/python3.13/site-packages/langchain_openai/llms/base.pyÚ_update_token_usager&      sS   € ð ×$Ñ$ X¨gÑ%6Ó7€LÛˆØÓ"Ø (¨Ñ 1°$Ñ 7ˆKÓàÓ ¨'Ñ!2°4Ñ!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	.S
9$ )z0Convert a stream response to a generation chunk.ÚchoicesÚ )Útextr   r+   Úfinish_reasonNÚlogprobs©r,   r-   ©r+   Úgeneration_info)r   Úget)Ústream_responses    r%   Ú$_stream_response_to_generation_chunkr3   *   su   € ð ˜9×%Ü BÑ'Ð'ÜØ˜YÑ'¨Ñ*¨6Ñ2×8°bà,¨YÑ7¸Ñ:×>Ñ>¸ÐPTÓUØ'¨	Ñ2°1Ñ5×9Ñ9¸*ÀdÓKñ
ñð r'   c                  ól  ^ • \ 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\,SgSO j5       5       r-\+" SPSN9ShSQ j5       r.\+" SPSN9ShSR j5       r/\0SiSS j5       r1  Sj         SkST jjr2  Sj         SlSU jjr3  Sj         SmSV jjr4  Sj         SnSW jjr5 So       SpSX jjr6SSY.           SqSZ jjr7\0SiS[ j5       r8\0SrS\ j5       r9\0SsS] j5       r:StU 4S^ jjr;\<\=" S_S`SaSb9SuSc j5       5       r>\0SvSd j5       r?SwSe jr@SfrAU =rB$ )xÚ
BaseOpenAIé9   u3  Base OpenAI large language model class.

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

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

Key init args â€” completion params:
    model_name:
        Name of OpenAI model to use.
    temperature:
        Sampling temperature.
    max_tokens:
        Max number of tokens to generate.
    top_p:
        Total probability mass of tokens to consider at each step.
    frequency_penalty:
        Penalizes repeated tokens according to frequency.
    presence_penalty:
        Penalizes repeated tokens.
    n:
        How many completions to generate for each prompt.
    best_of:
        Generates best_of completions server-side and returns the "best".
    logit_bias:
        Adjust the probability of specific tokens being generated.
    seed:
        Seed for generation.
    logprobs:
        Include the log probabilities on the logprobs most likely output tokens.
    streaming:
        Whether to stream the results or not.

Key init args â€” client params:
    openai_api_key:
        OpenAI API key. If not passed in will be read from env var
        `OPENAI_API_KEY`.
    openai_api_base:
        Base URL path for API requests, leave blank if not using a proxy or
        service emulator. Falls back to env var `OPENAI_API_BASE`, then to
        `OPENAI_BASE_URL` (read by the underlying SDK client).
    openai_organization:
        OpenAI organization ID. If not passed in will be read from env
        var `OPENAI_ORG_ID`.
    request_timeout:
        Timeout for requests to OpenAI completion API.
    max_retries:
        Maximum number of retries to make when generating.
    batch_size:
        Batch size to use when passing multiple documents to generate.

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

Instantiate:
    ```python
    from langchain_openai.llms.base import BaseOpenAI

    model = BaseOpenAI(
        model_name="gpt-3.5-turbo-instruct",
        temperature=0.7,
        max_tokens=256,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0,
        # openai_api_key="...",
        # openai_api_base="...",
        # openai_organization="...",
        # other params...
    )
    ```

Invoke:
    ```python
    input_text = "The meaning of life is "
    response = model.invoke(input_text)
    print(response)
    ```

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

Stream:
    ```python
    for chunk in model.stream(input_text):
        print(chunk, end="")
    ```
    ```txt
    a philosophical question that has been debated by thinkers and
    scholars for centuries.
    ```

Async:
    ```python
    response = await model.ainvoke(input_text)

    # stream:
    # async for chunk in model.astream(input_text):
    #     print(chunk, end="")

    # batch:
    # await model.abatch([input_text])
    ```
    ```
    "a philosophical question that has been debated by thinkers and
    scholars for centuries."
    ```

NT)ÚdefaultÚexcluder	   ÚclientÚasync_clientúgpt-3.5-turbo-instructÚmodel)r7   Ú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)r7   )r=   rK   z$SecretStr | None | Callable[[], str]Úopenai_api_keyÚbase_urlÚOPENAI_API_BASEú
str | NoneÚopenai_api_baseÚorganizationÚOPENAI_ORG_IDÚOPENAI_ORGANIZATIONÚopenai_organizationÚOPENAI_PROXYÚopenai_proxyé   Ú
batch_sizeÚtimeoutz(float | tuple[float, float] | Any | NoneÚrequest_timeoutzdict[str, float] | NoneÚ
logit_biasé   Úmax_retriesz
int | NoneÚseedr-   FÚboolÚ	streamingzLiteral['all'] | set[str]Úallowed_specialÚallz Literal['all'] | Collection[str]Údisallowed_specialÚtiktoken_model_namezMapping[str, str] | NoneÚdefault_headerszMapping[str, object] | NoneÚdefault_queryz
Any | NoneÚhttp_clientÚhttp_async_clientzMapping[str, Any] | NoneÚ
extra_body)Úpopulate_by_nameÚbefore)Úmodec                ó.   • [        U 5      n[        X5      $ )z>Build extra kwargs from additional params that were passed in.)r   r   )ÚclsÚvaluesÚall_required_field_namess      r%   Úbuild_extraÚBaseOpenAI.build_extra3  s   € ô $<¸CÓ#@Ð Ü" 6ÓDÐDr'   Úafterc                ó2   • U R                  S[        5        U $ )z Set package version in metadata.zlangchain-openai)Ú_add_versionr   ©Úselfs    r%   Ú_set_openai_versionÚBaseOpenAI._set_openai_version:  s   € ð 	×ÑÐ,¬kÔ:Øˆr'   c                óz  • U R                   S:  a  Sn[        U5      eU R                  (       a  U R                   S:”  a  Sn[        U5      eU R                  (       a  U R                  S:”  a  Sn[        U5      eSnU R                  b`  [        U R                  [        5      (       a  U R                  R                  5       nO&[        U R                  5      (       a  U R                  nU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.rE   zn must be at least 1.z!Cannot stream results when n > 1.z'Cannot stream results when best_of > 1.N)rN   rU   rQ   r]   ra   ri   rj   rk   © )rI   Ú
ValueErrorrd   rJ   rP   Ú
isinstancer   Úget_secret_valueÚcallablerX   rT   r^   ra   ri   rj   r9   rk   ÚopenaiÚOpenAIÚcompletionsr:   rl   ÚAsyncOpenAI)r{   ÚmsgÚapi_key_valueÚclient_paramsÚsync_specificÚasync_specifics         r%   Úvalidate_environmentÚBaseOpenAI.validate_environment@  s{  € ð �6‰6�A‹:Ø)ˆCÜ˜S“/Ð!Ø�>�>˜dŸf™f q›jØ5ˆCÜ˜S“/Ð!Ø�>�>˜dŸl™l¨QÓ.Ø;ˆCÜ˜S“/Ð!ð 9=ˆØ×ÑÑ*Ü˜$×-Ñ-¬y×9Ñ9Ø $× 3Ñ 3× DÑ DÓ F‘Ü˜$×-Ñ-×.Ñ.Ø $× 3Ñ 3�ð %Ø ×4Ñ4Ø×,Ñ,Ø×+Ñ+Ø×+Ñ+Ø#×3Ñ3Ø!×/Ñ/ñ
ˆð �{�{Ø*¨D×,<Ñ,<Ð=ˆMÜ Ÿ-š-ÑI¨-ÐI¸=ÑI×UÑUˆDŒKØ× × Ø+¨T×-CÑ-CÐDˆNÜ &× 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.)rA   rF   rG   rH   rI   rb   r-   r_   rD   rm   rE   rJ   )rA   rF   rG   rH   rI   rb   r-   r_   rD   rm   rJ   rM   )r{   Únormal_paramss     r%   Ú_default_paramsÚBaseOpenAI._default_paramsj  s¾   € ð  ×+Ñ+Ø—Z‘ZØ!%×!7Ñ!7Ø $× 5Ñ 5Ø—‘Ø—I‘IØŸ™ñ)
ˆð �?‰?Ñ&Ø*.¯/©/ˆM˜,Ñ'à�?‰?Ñ&Ø*.¯/©/ˆM˜,Ñ'à�?‰?Ñ&Ø*.¯/©/ˆM˜,Ñ'ð �<‰<˜!ÓØ'+§|¡|ˆM˜)Ñ$à5�-Ð5 4×#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-   r   )Ú_invocation_paramsÚget_sub_promptsr9   Úcreater�   ÚdictÚ
model_dumpr3   Úon_llm_new_tokenr+   r˜   r0   ©r{   r–   ÚstopÚrun_managerÚkwargsÚparamsÚstream_respr—   s           r%   Ú_streamÚBaseOpenAI._stream‡  sÉ   é € ð G�D×+Ñ+ÐF¨vÐF°xÀÑFˆØ×Ñ˜V X¨tÔ4ØŸ;™;×-Ò-ÑF°VÐF¸vÔFˆKÜ˜k¬4×0Ñ0Ø)×4Ñ4Ó6�Ü8¸ÓEˆEæØ×,Ñ,Ø—J‘JØØ ŸL™Lð !×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š   r:   r›   r�   rœ   r�   r3   rž   r+   r˜   r0   rŸ   s           r%   Ú_astreamÚBaseOpenAI._astream¢  sü   é € ð G�D×+Ñ+ÐF¨vÐF°xÀÑFˆØ×Ñ˜V X¨tÔ4Ø'+×'8Ñ'8×'?Ò'?ñ (
Øð(
Ø#ñ(
÷ "
ð "
÷ 	�+ô ˜k¬4×0Ñ0Ø)×4Ñ4Ó6�Ü8¸ÓEˆEæØ!×2Ñ2Ø—J‘JØØ ŸL™Lð !×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n[	        U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n[	        U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        [!        XŸU5        U
(       a  GM‚  UR                  S5      n
GM–     U R#                  XqXXU
S9$ )ab  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.
    run_manager: Optional callback manager to use for the call.

Returns:
    The full LLM output.

Example:
    ```python
    response = openai.generate(["Tell me a joke."])
    ```
>   Útotal_tokensÚprompt_tokensÚcompletion_tokensNrE   ú,Cannot stream results with multiple prompts.r   ú$Generation is empty after streaming.r,   r-   ©r+   r,   r-   r–   Úerrorr)   Úsystem_fingerprint©r²   r   )r™   rš   rd   Úlenr€   r¥   Úappendr+   r0   r1   r9   r›   r�   rœ   r�   Úextendr&   Úcreate_llm_result©r{   Úpromptsr    r¡   r¢   r£   Úsub_promptsr)   r"   Ú_keysr²   Ú_promptsrˆ   Ú
generationr—   r!   s                   r%   Ú	_generateÚBaseOpenAI._generate¿  s×  € ð. ×(Ñ(ˆØ%�FÐ%˜fÐ%ˆØ×*Ñ*¨6¸DÓAˆØˆØ&(ˆò GˆØ)-ÐÜ#ˆHØ�~�~Ü�x“= 1Ó$ØH�CÜ$ S›/Ð)à59�
Ø!Ÿ\š\¨(°1©+°tÑSÈFÔS�EØ!Ñ)Ø%*š
à"Ñ+š
ñ	 Tð
 Ñ%Ø@�CÜ$ S›/Ð)Ø—‘à *§¡ð  *×9×9ð '×6Ñ6×:Ñ:¸?ÔKà!%ð  *×9×9ð '×6Ñ6×:Ñ:¸:ÔFà!%ñöð   Ÿ;™;×-Ò-ÑH°XÐHÀÑH�Ü! (¬D×1Ñ1ð  (×2Ñ2Ó4�Hð —<‘< ×(Ñ(Ü$ X§\¡\°'Ó%:Ó;Ð;à—‘˜x¨	Ñ2Ô3Ü# E°[ÔAß)Ñ)Ø)1¯©Ð6JÓ)KÓ&ñ_ $ð` ×%Ñ%Ø˜fÐFXð &ð 
ð 	
r'   c              ‹  óF  #   • 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                  (       aK  [        U5      S:”  a  Sn[	        U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        [!        XŸU5        MÌ     U R#                  XqXXU
S9$  N‘
 Uc  Sn[	        U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Ml   Në7f)z:Call out to OpenAI's endpoint async with k unique prompts.>   r«   r¬   r­   NrE   r®   r   r¯   r,   r-   r°   r–   r)   r³   r   )r™   rš   rd   r´   r€   r¨   rµ   r+   r0   r1   r:   r›   r�   rœ   r�   r¶   r&   r·   r¸   s                   r%   Ú
_agenerateÚBaseOpenAI._agenerate  s¹  é € ð ×(Ñ(ˆØ%�FÐ%˜fÐ%ˆØ×*Ñ*¨6¸DÓAˆØˆØ&(ˆò GˆØ)-ÐÛ#ˆHØ�~�~Ü�x“= 1Ó$ØH�CÜ$ S›/Ð)à59�
Ø#'§=¢=Ø˜Q‘K ñ$Ø6<ò$÷ ,˜%ð "Ñ)Ø%*š
à"Ñ+š
ð( "&×!2Ñ!2×!9Ò!9Ñ!TÀÐ!TÈVÑ!T×T�Ü! (¬D×1Ñ1Ø'×2Ñ2Ó4�HØ—‘˜x¨	Ñ2Ô3Ü# E°[ÖAñK $ðL ×%Ñ%Ø˜fÐFXð &ð 
ð 	
ñ?,ð $ð Ñ%Ø@�CÜ$ S›/Ð)Ø—‘à *§¡ð  *×9×9ð '×6Ñ6×:Ñ:¸?ÔKà!%ð  *×9×9ð '×6Ñ6×:Ñ:¸:ÔFà!%ñ÷ñ  Uùs8   ‚A:F!Á<DÂ DÂDÂ/F!Â3FÂ4AF!ÄDÄBF!c                ó  • Ub  X1S'   US   S:X  a3  [        U5      S:w  a  Sn[        U5      eU R                  US   5      US'   [        S[        U5      U R                  5       Vs/ sH  nX%XPR                  -    PM     sn$ s  snf )z!Get the sub prompts for llm call.r    rD   éÿÿÿÿrE   z7max_tokens set to -1 not supported for multiple inputs.r   )r´   r€   Úmax_tokens_for_promptÚranger\   )r{   r£   r¹   r    rˆ   Úis         r%   rš   ÚBaseOpenAI.get_sub_promptsN  s–   € ð ÑØ!�6‰NØ�,Ñ 2Ó%Ü�7‹|˜qÓ ØO�Ü  “oÐ%Ø#'×#=Ñ#=¸gÀa¹jÓ#IˆF�<Ñ ô ˜1œc '›l¨D¯O©OÔ<ó
á<�ð ˜ŸO™OÑ+Ó,Ù<ñ
ð 	
ùò 
s   Á&Br³   c               óh  • / nUR                  SU R                  5      n[        U5       H_  u  p‰XU-  US-   U-   n
UR                  U
 Vs/ sH1  n[	        US   UR                  S5      UR                  S5      S.S9PM3     sn5        Ma     X@R
                  S.nU(       a  X\S	'   [        XlS
9$ s  snf )z2Create the LLMResult from the choices and prompts.rI   rE   r+   r,   r-   r.   r/   )r"   r?   r²   )ÚgenerationsÚ
llm_output)r1   rI   Ú	enumeraterµ   r   r?   r   )r{   r)   r¹   r£   r"   r²   rÊ   rI   rÇ   Ú_Úsub_choicesÚchoicerË   s                r%   r·   ÚBaseOpenAI.create_llm_resulta  sÆ   € ð ˆØ�J‰J�s˜DŸF™FÓ#ˆÜ˜gÖ&‰DˆAØ! a¡%¨1¨q©5°A©+Ð6ˆKØ×Ññ #.ó	ñ #.˜ô Ø# F™^à-3¯Z©Z¸Ó-HØ(.¯
©
°:Ó(>ñ)ôñ #.ñ	öñ 'ð &1ÇÁÑPˆ
ÞØ/AÐ+Ñ,Ü [ÑHÐHùò	s   Á7B/
c                ó   • U R                   $ )z,Get the parameters used to invoke the model.)r‘   rz   s    r%   r™   ÚBaseOpenAI._invocation_params€  s   € ð ×#Ñ#Ð#r'   c                ó6   • SU R                   0U R                  E$ )zGet the identifying parameters.r?   )r?   r‘   rz   s    r%   Ú_identifying_paramsÚBaseOpenAI._identifying_params…  s   € ð ˜dŸo™oÐF°×1EÑ1EÐFÐFr'   c                ó   • g)zReturn type of llm.r„   r   rz   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.rE   é   Úcl100k_base)re   rg   )Úcustom_get_token_idsÚsysÚversion_infoÚsuperÚget_num_tokensrh   r?   ÚtiktokenÚencoding_for_modelÚKeyErrorÚget_encodingÚencodere   rg   )r{   r+   r?   ÚencÚ	__class__s       €r%   Úget_token_idsÚBaseOpenAI.get_token_ids�  sº   ø€ à×$Ñ$Ñ0Ø×,Ñ,¨TÓ2Ð2ä×Ñ˜AÑ Ó"Ü‘7Ñ)¨$Ó/Ð/à×-Ñ-×@°·±ˆ
ð	7Ü×-Ò-¨jÓ9ˆCð �z‰zØØ ×0Ñ0Ø#×6Ñ6ð ð 
ð 	
øô ó 	7Ü×'Ò'¨Ó6ŠCð	7ús   Á&B! Â! CÃCz1.2z2.0zgthe model profile's `max_input_tokens` field (e.g. `ChatOpenAI(model=...).profile['max_input_tokens']`))ÚsinceÚremovalÚalternativec           	     ó"  • 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.EnSU ;   a  U R                  SSS 9S!   n [        R                  " U 5      nU(       a  UR                  S"5      OS#nUb  Uc  [        R	                  S$U 5        Uc  UR                  U 5      nUcS  [        1 [        R                  " 5       kUR                  5       k5      nS%U  S&3S'R                  U5      -   n[        U5      eU$ )(aL  Return the maximum input context size for a model.

Prefers the model's profile (`max_input_tokens`) and falls back to a
mapping of legacy models that have no profile.

!!! warning "Changed in 1.2"

    Now returns `max_input_tokens` from the model profile, which is the
    input context window. Earlier releases returned a hand-maintained
    number that for some newer models (e.g. `gpt-5`) reflected the
    *total* context (input + output). Callers using the result as an
    input-token budget are unaffected; callers using it as a combined
    input+output budget should switch to the profile fields directly.

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

Returns:
    The maximum input context size.

Example:
    ```python
    max_tokens = openai.modelname_to_contextsize("gpt-3.5-turbo-instruct")
    ```
z
gpt-4-0314i    z
gpt-4-0613z	gpt-4-32ki €  zgpt-4-32k-0314zgpt-4-32k-0613zgpt-4o-2024-05-13i ô zgpt-3.5-turbo-0301i   z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ø  Úbabbageztext-curie-001Úcuriei  iA  i   )Údavinciztext-davinci-003ztext-davinci-002zcode-davinci-002zcode-davinci-001zcode-cushman-002zcode-cushman-001zft-Ú:rE   )Úmaxsplitr   Úmax_input_tokensNzSProfile for model %s is missing `max_input_tokens`; falling back to legacy mapping.zUnknown model: zz. Please provide a valid OpenAI model name, or read `max_input_tokens` from the model profile directly. Known models are: z, )	Úsplitr   r1   ÚloggerÚwarningÚsortedr    Újoinr€   )Ú	modelnameÚlegacy_token_mappingÚprofileÚcontext_sizeÚknownrˆ   s         r%   Úmodelname_to_contextsizeÚ#BaseOpenAI.modelname_to_contextsize£  sÍ  € ðH 
Ø˜$ð 
à˜$ð 
ð ˜ð 
ð ˜eð	 
ð
 ˜eð 
ð   ð 
ð ! $ð 
ð ! $ð 
ð   ð 
ð % eð 
ð % dð 
ð ˜Dð 
ð �4ð 
ð  ð 
ð �tð 
ð  ˜dð! 
ð" �Tð# 
ð$ Ø $Ø $Ø $Ø $Ø $Ø $ò1 
Ðð8 �IÓØ!Ÿ™¨°a˜Ð8¸Ñ;ˆIä—-’- 	Ó*ˆÞ:A�w—{‘{Ð#5Ô6ÀtˆØÑ <Ñ#7Ü�N‰Nð2àôð
 ÑØ/×3Ñ3°IÓ>ˆLàÑÜÐLœYŸ^š^Ó-ÐLÐ0D×0IÑ0IÓ0KÐLÓMˆEà! ) ð -%ð %à'+§y¡y°Ó'7ñ8ð ô
 ˜S“/Ð!àÐr'   c                ó8   • U R                  U R                  5      $ )z$Get max context size for this model.)rÿ   r?   rz   s    r%   Úmax_context_sizeÚBaseOpenAI.max_context_sizeü  s   € ð ×,Ñ,¨T¯_©_Ó=Ð=r'   c                óB   • U R                  U5      nU R                  U-
  $ )a&  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:
    ```python
    max_tokens = openai.max_tokens_for_prompt("Tell me a joke.")
    ```
)rà   r  )r{   r–   Ú
num_tokenss      r%   rÅ   Ú BaseOpenAI.max_tokens_for_prompt  s%   € ð ×(Ñ(¨Ó0ˆ
Ø×$Ñ$ zÑ1Ð1r'   )r:   r9   )rs   rL   Úreturnr	   )r  r   ©r  rL   )NN)
r–   r>   r    úlist[str] | Noner¡   úCallbackManagerForLLMRun | Noner¢   r	   r  zIterator[GenerationChunk])
r–   r>   r    r	  r¡   ú$AsyncCallbackManagerForLLMRun | Noner¢   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£   rL   r¹   r  r    r	  r  zlist[list[str]])r)   r	   r¹   r  r£   rL   r"   zdict[str, int]r²   rS   r  r   )r  zMapping[str, Any])r  r>   )r+   r>   r  z	list[int])rú   r>   r  rC   )r  rC   )r–   r>   r  rC   )CÚ__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r9   Ú__annotations__r:   r?   rA   rD   rF   rG   rH   rI   rJ   rœ   rM   r   rP   r   rT   rX   rZ   r\   r^   r_   ra   rb   r-   rd   Úsetre   rg   rh   ri   rj   rk   rl   rm   r   Úmodel_configr   Úclassmethodru   r|   r�   Úpropertyr‘   r¥   r¨   r¾   rÁ   rš   r·   r™   rÔ   r×   rè   Ústaticmethodr   rÿ   r  rÅ   Ú__static_attributes__Ú__classcell__©rç   s   @r%   r5   r5   9   s¹  ø‡ ñpñd  ¨dÑ3€FˆCÓ3á d°DÑ9€L�#Ó9áÐ$<ÀGÑL€J�ÓLØà€K�ÓØ+à€J�Óð(ð €Eˆ5ÓØDà Ð�uÓ Ø;àÐ�eÓØ$à€A€sƒJØ;à€GˆSÓØKá#(¸Ñ#>€L�.Ó>ØVá;@Ø©Ð9IÐSWÑ)Xñ<€NÐ8ó ð Pá"'Ø©(Ð3DÈdÑ*Sñ#€O�Zó ðñ ',ØÙ ØÐ3Ð4¸dñ
ñ'Ð˜ó ð Oñ  %Ù  ¸Ñ>ñ €L�*ó ð €J�ÓØHá@EØ˜IñA€OÐ=ó ðð +/€JÐ'Ó.ØDà€K�ÓØ<à€Dˆ*ÓØà€HˆjÓð"ð €IˆtÓØ/á14³€OÐ.Ó6Ø3à;@ÐÐ8Ó@Ø7à&*Ð˜Ó*ðð 15€OÐ-Ó4à15€MÐ.Ó5ð #€K�Ó"ðð %)Ð�zÓ(ðð ,0€JÐ(Ó/ð@ñ ¨tÑ4€Lá˜(Ñ#ØóEó ó $ðEñ
 ˜'Ñ"óó #ðñ
 ˜'Ñ"ó'ó #ð'ðR ó6ó ð6ð> "&Ø7;ð	àðð ðð 5ð	ð
 ðð 
#õð< "&Ø<@ð	àðð ðð :ð	ð
 ðð 
(õð@ "&Ø7;ð	R
àðR
ð ðR
ð 5ð	R
ð
 ðR
ð 
õR
ðn "&Ø<@ð	9
àð9
ð ð9
ð :ð	9
ð
 ð9
ð 
õ9
ð~ "&ð	
àð
ð ð
ð ð	
ð
 
õ
ð4 *.ñIàðIð ðIð ð	Ið
 $ðIð 'ðIð 
õIð> ó$ó ð$ð óGó ðGð óó ð÷
ð( ÙØØðIñ	óNóó ðNð` ó>ó ð>÷2ò 2r'   r5   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…   i  uJ	  OpenAI completion model integration.

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

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

Key init args â€” completion params:
    model:
        Name of OpenAI model to use.
    temperature:
        Sampling temperature.
    max_tokens:
        Max number of tokens to generate.
    logprobs:
        Whether to return logprobs.
    stream_options:
        Configure streaming outputs, like whether to return token usage when
        streaming (`{"include_usage": True}`).

Key init args â€” client params:
    timeout:
        Timeout for requests.
    max_retries:
        Max number of retries.
    api_key:
        OpenAI API key. If not passed in will be read from env var `OPENAI_API_KEY`.
    base_url:
        Base URL for API requests. Only specify if using a proxy or service
        emulator.
    organization:
        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:
    ```python
    from langchain_openai import OpenAI

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

Invoke:
    ```python
    input_text = "The meaning of life is "
    model.invoke(input_text)
    ```
    ```txt
    "a philosophical question that has been debated by thinkers and scholars for centuries."
    ```

Stream:
    ```python
    for chunk in model.stream(input_text):
        print(chunk, end="|")
    ```
    ```txt
    a| philosophical| question| that| has| been| debated| by| thinkers| and| scholars| for| centuries|.
    ```

    ```python
    "".join(model.stream(input_text))
    ```
    ```txt
    "a philosophical question that has been debated by thinkers and scholars for centuries."
    ```

Async:
    ```python
    await model.ainvoke(input_text)

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

    # batch:
    # await model.abatch([input_text])
    ```
    ```txt
    "a philosophical question that has been debated by thinkers and scholars for centuries."
    ```
c                ó
   • / SQ$ )z[Get the namespace of the LangChain object.

Returns:
    `["langchain", "llms", "openai"]`
)Ú	langchainÚllmsr„   r   ©rr   s    r%   Úget_lc_namespaceÚOpenAI.get_lc_namespaces  s
   € ò /Ð.r'   c                ó   • g)z9Return whether this model can be serialized by LangChain.Tr   r  s    r%   Úis_lc_serializableÚOpenAI.is_lc_serializable|  s   € ð r'   c                ó4   >• SU R                   0[        TU ]  E$ )Nr<   )r?   rß   r™   )r{   rç   s    €r%   r™   ÚOpenAI._invocation_params�  s   ø€ à˜Ÿ™ÐG¬E©GÑ,FÐGÐGr'   c                ó
   • SS0$ )z0Mapping of secret keys to environment variables.rP   rO   r   rz   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$ )z$LangChain attributes for this class.rT   rX   rZ   )rT   rX   rZ   )r{   Ú
attributess     r%   Úlc_attributesÚOpenAI.lc_attributesŠ  s\   € ð &(ˆ
Ø××Ø,0×,@Ñ,@ˆJÐ(Ñ)à×#×#Ø04×0HÑ0HˆJÐ,Ñ-à××Ø)-×):Ñ):ˆJ�~Ñ&àÐr'   r   )r  r  )r  rc   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…     sp   ø† ñ]ð~ ó/ó ð/ð óó ðð öHó ðHð ó4ó ð4ð óó ör'   r…   )r    zset[str]r!   rL   r"   rL   r  ÚNone)r2   rL   r  r   )3r  Ú
__future__r   ÚloggingrÝ   Úcollections.abcr   r   r   r   r   Útypingr	   r
   r„   rá   Úlangchain_core._api.deprecationr   Ú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   Úlangchain_openai._versionr   Úlangchain_openai.data._profilesr   Ú	getLoggerr  rö   r&   r3   r5   r…   r   r'   r%   Ú<module>r>     s²   ðÙ Wå "ã Û 
ß RÕ Rß ã Û Ý 6÷õ 8ß IÑ IÝ 9ß UÑ Uß BÓ BÝ "å 1Ý 5à	×	Ò	˜8Ó	$€ð	9Ø
ð	9Ø,ð	9Ø;Ið	9à	ô	9ðØ#ðàôôW2�ô W2ôtDˆZõ Dr'   