a
    bg                     @  s  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0e1Z2dddddddZ3dddddZ4ddddddZ5ddddZ6d:dddd d!d"Z7d;dd#d$d$d%d&d'Z8d<dd(d$d$d%d)d*Z9G d+d, d,eZ:ed-d.d/d0G d1d2 d2e:Z;ed-d.d3d0G d4d5 d5e:Z<ed6d.d7d0G d8d9 d9eZ=dS )=    )annotationsN)AbstractSetAnyAsyncIterator	AwaitableCallable
CollectionDictIteratorListLiteralMappingOptionalSetTupleUnion)
deprecated)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLMcreate_base_retry_decorator)
GenerationGenerationChunk	LLMResult)get_from_dict_or_envget_pydantic_field_namespre_init)
get_fields)_build_model_kwargs)
ConfigDictFieldmodel_validator)is_openai_v1zSet[str]Dict[str, Any]None)keysresponsetoken_usagereturnc                 C  sN   |  |d }|D ]6}||vr0|d | ||< q||  |d | 7  < qdS )zUpdate token usage.usageN)intersection)r%   r&   r'   Z_keys_to_use_key r,   m/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/llms/openai.pyupdate_token_usage.   s
    r.   r   )stream_responser(   c                 C  sR   | d st ddS t | d d d t| d d dd| d d dd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)r/   r,   r,   r-   $_stream_response_to_generation_chunk:   s    
r;   )r&   r/   r(   c                 C  sd   | d d d  |d d d 7  < |d d  dd| d d d< |d d d | d d d< dS )z)Update response from the stream response.r0   r   r3   r4   Nr5   )r:   )r&   r/   r,   r,   r-   _update_responseI   s
    $r<   r(   c                   C  s   ddd d dgiS )Nr0   r1   r3   r4   r5   r,   r,   r,   r,   r-   _streaming_response_templateR   s    r?   zUnion[BaseOpenAI, OpenAIChat]zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]zCallable[[Any], Any])llmrun_managerr(   c                 C  s:   dd l }|jj|jj|jj|jj|jjg}t|| j|dS )Nr   )Zerror_typesmax_retriesrA   )	openaierrorTimeoutZAPIErrorZAPIConnectionErrorZRateLimitErrorZServiceUnavailableErrorr   rB   )r@   rA   rC   errorsr,   r,   r-   _create_retry_decorator^   s    rG   "Optional[CallbackManagerForLLMRun]r   )r@   rA   kwargsr(   c                   sJ   t  r jjf i |S t |d}|ddd fdd}|f i |S )z*Use tenacity to retry the completion call.rA   r   rI   r(   c                    s    j jf i | S N)clientcreaterI   r@   r,   r-   _completion_with_retry}   s    z5completion_with_retry.<locals>._completion_with_retry)r"   rM   rN   rG   r@   rA   rI   Zretry_decoratorrQ   r,   rP   r-   completion_with_retryr   s    rS   'Optional[AsyncCallbackManagerForLLMRun]c                   sV   t  r jjf i |I dH S t |d}|ddd fdd}|f i |I dH S )z0Use tenacity to retry the async completion call.NrJ   r   rK   c                    s    j jf i | I d H S rL   )rM   ZacreaterO   rP   r,   r-   rQ      s    z6acompletion_with_retry.<locals>._completion_with_retry)r"   async_clientrN   rG   rR   r,   rP   r-   acompletion_with_retry   s    rV   c                      sR  e Zd ZU dZeddddZeddddZed	dd
dZeddddZ	e
dddZded< e
dddZded< e
d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d'Zd	ed(< e
dd)dZd*ed+< e
dd,dZd*ed-< e
dd.dZd*ed/< dZd*ed0< d1Zded2< e
dd3dZd4ed5< e
ed'Zd6ed7< d8Zded9< d:Z 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dHdI fdJdKZ(e)ddLZ*e+dMdNed	ddOdPdQZ,e-dRdRdOdSdTZ.ed	ddUdVZ/dddWdXddYdZd[d\Z0dddWd]dd^dZd_d`Z1dddWdXddadbdcddZ2dddWd]ddadbdedfZ3dd	ddWdgdhdidjZ4ddkddd	dld*dadmdndoZ5ed	ddpdqZ6edrddsdtZ7edddudvZ8ddwdx fdydzZ9e:ddd{d|d}Z;eddd~dZ<dddddZ=  Z>S )
BaseOpenAIz'Base OpenAI large language model class.zDict[str, str]r=   c                 C  s   ddiS )Nopenai_api_keyOPENAI_API_KEYr,   selfr,   r,   r-   
lc_secrets   s    zBaseOpenAI.lc_secrets	List[str]c                 C  s   g dS z*Get the namespace of the langchain object.)Z	langchainZllmsrC   r,   clsr,   r,   r-   get_lc_namespace   s    zBaseOpenAI.get_lc_namespacer#   c                 C  s8   i }| j r| j |d< | jr$| j|d< | jr4| j|d< |S )Nopenai_api_baseopenai_organizationopenai_proxy)rb   rc   rd   )r[   
attributesr,   r,   r-   lc_attributes   s    


zBaseOpenAI.lc_attributesboolc                 C  s   dS )NTr,   r_   r,   r,   r-   is_lc_serializable   s    zBaseOpenAI.is_lc_serializableNTdefaultexcluder   rM   rU   gpt-3.5-turbo-instructmodelrj   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]rX   base_urlrb   organizationrc   rd      
batch_sizetimeoutz,Union[float, Tuple[float, float], Any, None]request_timeoutzOptional[Dict[str, float]]
logit_bias   rB   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_clientzUnion[OpenAIChat, BaseOpenAI])datar(   c                   sL   | dd}|ds |dr@d|vr@td tf i |S t | S )zInitialize the OpenAI object.rq   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`)r:   
startswithwarningswarn
OpenAIChatsuper__new__)r`   r   rq   	__class__r,   r-   r      s    zBaseOpenAI.__new__)Zpopulate_by_namebeforemodevaluesr(   c                 C  s   t | }t||}|S )>Build extra kwargs from additional params that were passed in.)r   r   )r`   r   all_required_field_namesr,   r,   r-   build_extra  s    
zBaseOpenAI.build_extrar	   c              	   C  sn  |d dk rt d|d r0|d dkr0t d|d rL|d dkrLt dt|dd	|d< |d
 pltd|d
< t|dddd|d< |d ptdptd|d< zddl}W n ty   tdY n0 t rR|d |d |d
 |d |d |d |d |d d}|ds.|jf i |j	|d< |dsj|j
f i |j	|d< n|dsj|j|d< n |S )?Validate that api key and python package exists in environment.r{   rw   n must be at least 1.r   !Cannot stream results when n > 1.r|   'Cannot stream results when best_of > 1.rX   rY   rb   OPENAI_API_BASErd   OPENAI_PROXYr1   rj   rc   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NTCould not import openai python package. Please install it with `pip install openai`.r   rB   r   r   r   )r   r   r   r   rB   r   r   r   rM   rU   )
ValueErrorr   osgetenvrC   ImportErrorr"   r:   OpenAIcompletionsZAsyncOpenAI
Completion)r`   r   rC   client_paramsr,   r,   r-   validate_environment  s\    


zBaseOpenAI.validate_environmentc                 C  sn   | j | j| j| j| j| jd}| jdur2| j|d< | jdurLt sL| j|d< | j	dkr`| j	|d< i || j
S )2Get the default parameters for calling OpenAI API.)rs   rx   ry   rz   r{   r   Nrv   r   rw   r|   )rs   rx   ry   rz   r{   r   rv   r   r"   r|   r   )r[   Znormal_paramsr,   r,   r-   _default_paramsL  s    	




zBaseOpenAI._default_paramsOptional[List[str]]rH   Iterator[GenerationChunk]promptstoprA   rI   r(   c                 k  s   i | j |ddi}| ||g| t| f||d|D ]N}t|tsR| }t|}|r|j|j|| j|j	r||j	d nd d |V  q<d S NstreamTr   rA   r5   )chunkverboser5   )
_invocation_paramsget_sub_promptsrS   
isinstancer9   r;   on_llm_new_tokenr3   r   r8   r[   r   r   rA   rI   paramsstream_respr   r,   r,   r-   _streamd  s,    

zBaseOpenAI._streamrT   AsyncIterator[GenerationChunk]c                 K s   i | j |ddi}| ||g| t| f||d|I d H 2 z\3 d H W }t|ts`| }t|}|r|j|j|| j|j	r|j	d nd dI d H  |V  qB6 d S r   )
r   r   rV   r   r9   r;   r   r3   r   r8   r   r,   r,   r-   _astream~  s,    
zBaseOpenAI._astreamr   promptsr   rA   rI   r(   c                 K  s<  | j }i ||}| |||}g }i }h d}	d}
|D ]}| jrt|dkrVtdd}| j|d ||fi |D ]}|du r|}qt||7 }qt|dusJ ||j|jr|j	dnd|jr|j	dndd q8t
| f||d	|}t|ts| }||d
  t|	|| |
s8|	d}
q8| j|||||
d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."])
           Zprompt_tokensZcompletion_tokensZtotal_tokensNrw   ,Cannot stream results with multiple prompts.r   r4   r5   r>   r   r0   system_fingerprintr   )r   r   r   lenr   r   appendr3   r8   r:   rS   r   r9   extendr.   create_llm_resultr[   r   r   rA   rI   r   sub_promptsr0   r'   Z_keysr   Z_prompts
generationr   r&   r,   r,   r-   	_generate  s^    

zBaseOpenAI._generatec                   s@  | j }i ||}| |||}g }i }h d}	d}
|D ]}| jrt|dkrVtdd}| j|d ||fi |2 z"3 dH W }|du r|}qt||7 }qt6 |dusJ ||j|jr|j	dnd|jr|j	dndd q8t
| f||d	|I dH }t|ts| }||d
  t|	|| q8| j|||||
dS )z:Call out to OpenAI's endpoint async with k unique prompts.r   Nrw   r   r   r4   r5   r>   r   r0   r   )r   r   r   r   r   r   r   r3   r8   r:   rV   r   r9   r   r.   r   r   r,   r,   r-   
_agenerate  sb    
zBaseOpenAI._ageneratezList[List[str]])r   r   r   r(   c                   sx   |dur d|v rt d||d< |d dkrRt dkr@t d d |d<  fd	d
tdt jD }|S )z!Get the sub prompts for llm call.Nr   2`stop` found in both the input and default params.rv   rw   z7max_tokens set to -1 not supported for multiple inputs.r   c                   s   g | ]} ||j   qS r,   )r   ).0ir   r[   r,   r-   
<listcomp>.  s   z.BaseOpenAI.get_sub_prompts.<locals>.<listcomp>)r   r   max_tokens_for_promptranger   )r[   r   r   r   r   r,   r   r-   r     s    zBaseOpenAI.get_sub_promptsr   zDict[str, int])r0   r   r   r'   r   r(   c                C  st   g }| d| j}t|D ]4\}}	||| |d |  }
|dd |
D  q|| jd}|rh||d< t||dS )z2Create the LLMResult from the choices and prompts.r{   rw   c              	   S  s0   g | ](}t |d  t|d|dddqS )r3   r4   r5   r6   r7   )r   r9   r:   )r   choicer,   r,   r-   r   C  s   z0BaseOpenAI.create_llm_result.<locals>.<listcomp>r'   rq   r   generations
llm_output)r:   r{   	enumerater   rq   r   )r[   r0   r   r   r'   r   r   r{   r   _Zsub_choicesr   r,   r,   r-   r   4  s    
zBaseOpenAI.create_llm_resultc                 C  sN   i }t  s"|| j| j| jd | jr@ddl}| j| jd|_i || jS )z,Get the parameters used to invoke the model.)r   api_baser   r   Nhttphttps)	r"   updaterX   rb   rc   rd   rC   proxyr   )r[   Zopenai_credsrC   r,   r,   r-   r   S  s    zBaseOpenAI._invocation_paramsMapping[str, Any]c                 C  s   i d| j i| jS zGet the identifying parameters.rq   rq   r   rZ   r,   r,   r-   _identifying_paramse  s    zBaseOpenAI._identifying_paramsc                 C  s   dS )Return type of llm.rC   r,   rZ   r,   r,   r-   	_llm_typej  s    zBaseOpenAI._llm_type	List[int]r3   r(   c                   s   t jd dk rt |S zddl}W n ty@   tdY n0 | jpL| j}z||}W n* t	y   t
d d}||}Y n0 |j|| j| jdS )	-Get the token IDs using the tiktoken package.rw      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.Zcl100k_baser   r   )sysversion_infor   get_num_tokenstiktokenr   r   rq   encoding_for_modelKeyErrorloggerwarningZget_encodingencoder   r   )r[   r3   r  rq   encrm   r   r,   r-   get_token_idso  s(    

zBaseOpenAI.get_token_ids)	modelnamer(   c                 C  s   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 rR|  dd } || d}|du rtd|  dd|  |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")
        i  i    i   i   i@  i  i  i  iA  i   )zgpt-4ozgpt-4o-2024-05-13r   z
gpt-4-0314z
gpt-4-0613z	gpt-4-32kzgpt-4-32k-0314zgpt-4-32k-0613r   zgpt-3.5-turbo-0301zgpt-3.5-turbo-0613zgpt-3.5-turbo-16kzgpt-3.5-turbo-16k-0613rl   ztext-ada-001adaztext-babbage-001Zbabbageztext-curie-001ZcurieZ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%   )r  Zmodel_token_mappingZcontext_sizer,   r,   r-   modelname_to_contextsize  sL    
z#BaseOpenAI.modelname_to_contextsizec                 C  s   |  | jS )z$Get max context size for this model.)r  rq   rZ   r,   r,   r-   max_context_size  s    zBaseOpenAI.max_context_size)r   r(   c                 C  s   |  |}| j| S )ao  Calculate the maximum number of tokens possible to generate for a prompt.

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

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

        Example:
            .. code-block:: python

                max_tokens = openai.max_token_for_prompt("Tell me a joke.")
        )r  r  )r[   r   Z
num_tokensr,   r,   r-   r     s    
z BaseOpenAI.max_tokens_for_prompt)NN)NN)NN)NN)N)?__name__
__module____qualname____doc__propertyr\   classmethodra   rf   rh   r    rM   __annotations__rU   rq   rs   rv   rx   ry   rz   r{   r|   r9   r   rX   rb   rc   rd   r   r   r   rB   r   setr   r   r   r   r   r   r   r   Zmodel_configr!   r   r   r   r   r   r   r   r   r   r   r   r   r   r  staticmethodr  r  r   __classcell__r,   r,   r   r-   rW      s   

8      N  > :rW   z0.0.10z1.0zlangchain_openai.OpenAI)ZsinceZremovalZalternative_importc                      s<   e Zd ZdZeddddZedd fddZ  ZS )	r   a  OpenAI large language models.

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

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

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            openai = OpenAI(model_name="gpt-3.5-turbo-instruct")
    r]   r=   c                 C  s   g dS r^   r,   r_   r,   r,   r-   ra     s    zOpenAI.get_lc_namespacer#   c                   s   i d| j it jS )Nrm   )rq   r   r   rZ   r   r,   r-   r     s    zOpenAI._invocation_params)	r  r  r  r  r  ra   r  r   r  r,   r,   r   r-   r     s
   r   zlangchain_openai.AzureOpenAIc                      s  e Zd ZU dZdZded< edddZded< edd	dZd
ed< ed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ddZedddddZedd fd d!Zed"d fd#d$Zed
dd%d&Zed"dd'd(Z  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_deploymentrn   deployment_namer1   api_versionrp   openai_api_versionr   rX   azure_ad_tokenzUnion[Callable[[], str], None]azure_ad_token_providerz)Union[Callable[[], Awaitable[str]], None]azure_ad_async_token_provideropenai_api_typeTrg   validate_base_urlr]   r=   c                 C  s   g dS r^   r,   r_   r,   r,   r-   ra   7  s    zAzureOpenAI.get_lc_namespacer	   r   c                 C  s  |d dk rt d|d r0|d dkr0t d|d rL|d dkrLt d|d pftd	pftd
|d< |d p|td|d< |d ptd|d< |d ptd|d< t|dddd|d< |d ptdptd|d< |d ptd|d< t|dddd|d< zddl}W n ty4   tdY n0 t r|d }|r|d  rd!|vr|d d"d! |d< t	d#| d$|d  d% |d& rt	d' |d& |d vrt	d(| d$|d  d% |d  d)|d&  7  < d|d&< |d |d |d& |d |d |d* |d |d |d+ |d, |d- |d. |d/ d0}|j
f i |j|d1< |d2 }|rt||d*< |jf i |j|d3< n
|j|d1< |S )4r   r{   rw   r   r   r   r|   r   rX   ZAZURE_OPENAI_API_KEYrY   r  ZAZURE_OPENAI_ENDPOINTr#  ZAZURE_OPENAI_AD_TOKENrb   r   rd   r   r1   r   rc   r   r   r"  ZOPENAI_API_VERSIONr&  ZOPENAI_API_TYPEazurer   Nr   r'  z/openai/zAs of openai>=1.0.0, Azure endpoints should be specified via the `azure_endpoint` param not `openai_api_base` (or alias `base_url`). Updating `openai_api_base` from z to .r   zAs of openai>=1.0.0, if `deployment_name` (or alias `azure_deployment`) is specified then `openai_api_base` (or alias `base_url`) should not be. Instead use `deployment_name` (or alias `azure_deployment`) and `azure_endpoint`.zAs of openai>=1.0.0, if `openai_api_base` (or alias `base_url`) is specified it is expected to be of the form https://example-resource.azure.openai.com/openai/deployments/example-deployment. Updating z/deployments/r$  r   rB   r   r   r   )r!  r  r  r   r#  r$  r   r   r   rB   r   r   r   rM   r%  rU   )r   r   r   r   rC   r   r"   rstripr   r   r  r   ZAsyncAzureOpenAIr   )r`   r   rC   rb   r   r%  r,   r,   r-   r   <  s    






z AzureOpenAI.validate_environmentr   c                   s   i d| j it jS )Nr   )r   r   r   rZ   r   r,   r-   r     s
    zAzureOpenAI._identifying_paramsr#   c                   s4   t  rd| ji}n| j| j| jd}i |t jS )Nrm   )ZengineZapi_typer!  )r"   r   r&  r"  r   r   )r[   Zopenai_paramsr   r,   r-   r     s    zAzureOpenAI._invocation_paramsc                 C  s   dS )r   r(  r,   rZ   r,   r,   r-   r     s    zAzureOpenAI._llm_typec                 C  s   | j | jdS )Nr&  r"  r,  rZ   r,   r,   r-   rf     s    zAzureOpenAI.lc_attributes)r  r  r  r  r  r  r    r   r"  rX   r#  r$  r%  r&  r'  r  ra   r   r   r  r   r   r   rf   r  r,   r,   r   r-   r    s,   
vr  z0.0.1zlangchain_openai.ChatOpenAIc                      s  e Zd ZU dZedddZded< edddZded< dZd	ed
< ee	dZ
ded< edddZded< edddZded< dZded< dZded< eedZded< dZded< e Zded< dZd ed!< ed"d#eddd$d%d&Zed'd'd$d(d)Zedd*d+d,ZdKd-d.d/d0d1d2ZdLd	d.d3dd4d5d6d7ZdMd	d.d8dd9d5d:d;ZdNd-d.d3dd<d=d>d?ZdOd-d.d8dd<d=d@dAZ edBd*dCdDZ!ed	d*dEdFZ"d	dGdH fdIdJZ#  Z$S )Pr   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")
    NTri   r   rM   rU   r   rp   rq   r}   r#   r   r   rn   r   rX   r   rb   rd      ru   rB   r   prefix_messagesFrg   r   r   r   r   r   r   r   r   r   c                 C  sj   dd t |  D }|di }t|D ]2}||vr*||v rNtd| d||||< q*||d< |S )r   c                 S  s   h | ]
}|j qS r,   )ro   )r   fieldr,   r,   r-   	<setcomp>      z)OpenAIChat.build_extra.<locals>.<setcomp>r   zFound z supplied twice.)r   r   r:   listr   pop)r`   r   r   extra
field_namer,   r,   r-   r     s    zOpenAIChat.build_extrar	   c                 C  s   t |dd}t |dddd}t |dddd}t |d	d
dd}z6ddl}||_|rV||_|r`||_|rp||d|_W n ty   tdY n0 z|j|d< W n ty   t	dY n0 t
d |S )r   rX   rY   rb   r   r1   r   rd   r   rc   r   r   Nr   r   rM   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   rC   r   r   r   r   r   ZChatCompletionAttributeErrorr   r   r   )r`   r   rX   rb   rd   rc   rC   r,   r,   r-   r     sR    

zOpenAIChat.validate_environmentr=   c                 C  s   | j S )r   )r   rZ   r,   r,   r-   r   E  s    zOpenAIChat._default_paramsr]   r   r   )r   r   r(   c                 C  s   t |dkrtd| | jd|d dg }i d| ji| j}|d urdd|v r\td||d< |d	d
krx|d	= ||fS )Nrw   z6OpenAIChat currently only supports single prompt, got userr   )Zrolecontentrm   r   r   rv   r   )r   r   r.  rq   r   r:   )r[   r   r   messagesr   r,   r,   r-   _get_chat_paramsJ  s    zOpenAIChat._get_chat_paramsrH   r   r   c           
      k  s   |  |g|\}}i ||ddi}t| f||d|D ]P}t|tsR| }|d d d dd}t|d	}	|r|j||	d
 |	V  q<d S Nr   Tr9  rA   r0   r   deltar8  r1   r2   )r   )r:  rS   r   r9   r:   r   r   
r[   r   r   rA   rI   r9  r   r   tokenr   r,   r,   r-   r   \  s     


zOpenAIChat._streamrT   r   c           
      K s   |  |g|\}}i ||ddi}t| f||d|I d H 2 z^3 d H W }t|ts`| }|d d d dd}t|d	}	|r|j||	d
I d H  |	V  qB6 d S r;  )r:  rV   r   r9   r:   r   r   r>  r,   r,   r-   r   p  s     

zOpenAIChat._astreamr   r   c                 K  s   | j rZd }| j|d ||fi |D ]}|d u r6|}q$||7 }q$|d usLJ t|ggdS | ||\}}i ||}t| f||d|}	t|	ts|	 }	|	d | jd}
tt|	d d d d d	gg|
d
S Nr   )r   r<  r)   r   r0   messager8  r2   r   )	r   r   r   r:  rS   r   r9   rq   r   r[   r   r   rA   rI   r   r   r9  r   Zfull_responser   r,   r,   r-   r     s6    

zOpenAIChat._generatec                   s   | j rdd }| j|d ||fi |2 z"3 d H W }|d u r>|}q$||7 }q$6 |d usVJ t|ggdS | ||\}}i ||}t| f||d|I d H }	t|	ts|	 }	|	d | jd}
tt|	d d d d d	gg|
d
S r@  )	r   r   r   r:  rV   r   r9   rq   r   rB  r,   r,   r-   r     s6    &
zOpenAIChat._agenerater   c                 C  s   i d| j i| jS r   r   rZ   r,   r,   r-   r     s    zOpenAIChat._identifying_paramsc                 C  s   dS )r   zopenai-chatr,   rZ   r,   r,   r-   r     s    zOpenAIChat._llm_typer   r   c                   sb   t jd dk rt |S zddl}W n ty@   tdY n0 || j}|j|| j	| j
dS )r   rw   r   r   Nr   r   )r  r  r   r  r  r   r  rq   r	  r   r   )r[   r3   r  r
  r   r,   r-   r    s    
zOpenAIChat.get_token_ids)N)NN)NN)NN)NN)%r  r  r  r  r    rM   r  rU   rq   r9   r   rX   rb   rd   rB   r2  r.  r   r  r   r   r!   r  r   r   r   r  r   r:  r   r   r   r   r   r   r  r  r,   r,   r   r-   r     sN   
2       &  #r   )N)N)N)>
__future__r   loggingr   r  r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Zlangchain_core._api.deprecationr   Zlangchain_core.callbacksr   r   Z#langchain_core.language_models.llmsr   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   r   r   Zlangchain_core.utils.pydanticr   Zlangchain_core.utils.utilsr   Zpydanticr   r    r!   Z langchain_community.utils.openair"   	getLoggerr  r  r.   r;   r<   r?   rG   rS   rV   rW   r   r  r   r,   r,   r,   r-   <module>   sV   D
	       J Y