o
    Zh{                     @  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Z3d=ddZ4d>ddZ5d?ddZ6	d@dAd#d$Z7	d@dBd(d)Z8	d@dCd+d,Z9G d-d. d.eZ:ed/d0d1d2G d3d4 d4e:Z;ed/d0d5d2G d6d7 d7e:Z<ed8d0d9d2G d:d; d;eZ=dS )D    )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_v1keysSet[str]responseDict[str, Any]token_usagereturnNonec                 C  sN   |  |d }|D ]}||vr|d | ||< q	||  |d | 7  < q	dS )zUpdate token usage.usageN)intersection)r#   r%   r'   Z_keys_to_use_key r-   V/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/openai.pyupdate_token_usage.   s   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   r4   finish_reasonNlogprobsr5   r6   r4   generation_info)r   dictget)r0   r-   r-   r.   $_stream_response_to_generation_chunk:   s   
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.r1   r   r4   r5   Nr6   )r;   )r%   r0   r-   r-   r.   _update_responseI   s
   $ r=   c                   C  s   ddd d dgiS )Nr1   r2   r4   r5   r6   r-   r-   r-   r-   r.   _streaming_response_templateR   s   r?   llmUnion[BaseOpenAI, OpenAIChat]run_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]Callable[[Any], Any]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_retriesrB   )	openaierrorTimeoutZAPIErrorZAPIConnectionErrorZRateLimitErrorZServiceUnavailableErrorr   rE   )r@   rB   rF   errorsr-   r-   r.   _create_retry_decorator^   s   rJ   "Optional[CallbackManagerForLLMRun]kwargsr   c                   sD   t  r jjdi |S t |d}|d	 fdd}|di |S )
z*Use tenacity to retry the completion call.rB   rL   r   r(   c                    s    j jdi | S Nr-   )clientcreaterL   r@   r-   r.   _completion_with_retry}   s   z5completion_with_retry.<locals>._completion_with_retryNr-   rL   r   r(   r   )r"   rO   rP   rJ   r@   rB   rL   Zretry_decoratorrS   r-   rR   r.   completion_with_retryr   s   rV   'Optional[AsyncCallbackManagerForLLMRun]c                   sR   t  r jjdi |I dH S t |d}|d	 fdd}|di |I dH S )
z0Use tenacity to retry the async completion call.NrM   rL   r   r(   c                    s    j jdi | I d H S rN   )rO   ZacreaterQ   rR   r-   r.   rS      s   z6acompletion_with_retry.<locals>._completion_with_retryr-   rT   )r"   async_clientrP   rJ   rU   r-   rR   r.   acompletion_with_retry   s   rY   c                      s  e Zd ZU dZedddZedddZedd
dZedd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 fdJdKZ(e)ddLZ*e+dMdNeddPdQZ,e-ddSdTZ.eddUdVZ/		ddd^d_Z0		dddbdcZ1		dddfdgZ2		dddhdiZ3	dddldmZ4ddnddsdtZ5eddudvZ6eddxdyZ7eddzd{Z8d fd~dZ9e:dddZ;edddZ<dddZ=  Z>S )
BaseOpenAIz'Base OpenAI large language model class.r(   Dict[str, str]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     g dS z*Get the namespace of the langchain object.)Z	langchainZllmsrF   r-   clsr-   r-   r.   get_lc_namespace      zBaseOpenAI.get_lc_namespacer&   c                 C  s8   i }| j r
| j |d< | jr| j|d< | jr| j|d< |S )Nopenai_api_baseopenai_organizationopenai_proxy)rh   ri   rj   )r_   
attributesr-   r-   r.   lc_attributes   s   


zBaseOpenAI.lc_attributesboolc                 C     dS )NTr-   rd   r-   r-   r.   is_lc_serializable   s   zBaseOpenAI.is_lc_serializableNTdefaultexcluder   rO   rX   gpt-3.5-turbo-instructmodelrq   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]r\   base_urlrh   organizationri   rj      
batch_sizetimeoutz,Union[float, Tuple[float, float], Any, None]request_timeoutzOptional[Dict[str, float]]
logit_bias   rE   F	streaming'Union[Literal['all'], AbstractSet[str]]allowed_specialall&Union[Literal['all'], Collection[str]]disallowed_specialtiktoken_model_namezUnion[Mapping[str, str], None]default_headersz!Union[Mapping[str, object], None]default_queryzUnion[Any, None]http_clientdataUnion[OpenAIChat, BaseOpenAI]c                   sL   | dd}|ds|dr d|vr td tdi |S t | S )	zInitialize the OpenAI object.rx   r2   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`Nr-   )r;   
startswithwarningswarn
OpenAIChatsuper__new__)re   r   rx   	__class__r-   r.   r      s   zBaseOpenAI.__new__)Zpopulate_by_namebeforemodevaluesc                 C  s   t | }t||}|S )>Build extra kwargs from additional params that were passed in.)r   r   )re   r   all_required_field_namesr-   r-   r.   build_extra  s   
zBaseOpenAI.build_extrar	   c              	   C  sh  |d dk r
t d|d r|d dkrt d|d r&|d dkr&t dt|dd	|d< |d
 p6td|d
< t|dddd|d< |d pPtdpPtd|d< zddl}W n tyd   tdw t r|d |d |d
 |d |d |d |d |d d}|ds|jdi |j	|d< |ds|j
di |j	|d< |S |ds|j|d< |S 	 |S )?Validate that api key and python package exists in environment.r   r~   n must be at least 1.r   !Cannot stream results when n > 1.r   'Cannot stream results when best_of > 1.r\   r]   rh   OPENAI_API_BASErj   OPENAI_PROXYr2   rq   ri   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NTCould not import openai python package. Please install it with `pip install openai`.r   rE   r   r   r   )r   r   r   r   rE   r   r   r   rO   rX   r-   )
ValueErrorr   osgetenvrF   ImportErrorr"   r;   OpenAIcompletionsZAsyncOpenAI
Completion)re   r   rF   client_paramsr-   r-   r.   validate_environment  sd   





zBaseOpenAI.validate_environmentc                 C  sn   | j | j| j| j| j| jd}| jdur| j|d< | jdur&t s&| j|d< | j	dkr0| j	|d< i || j
S )2Get the default parameters for calling OpenAI API.)rz   r   r   r   r   r   Nr}   r   r~   r   )rz   r   r   r   r   r   r}   r   r"   r   r   )r_   Znormal_paramsr-   r-   r.   _default_paramsL  s   
	



zBaseOpenAI._default_paramspromptstopOptional[List[str]]rB   rK   rL   Iterator[GenerationChunk]c                 k  s    i | j |ddi}| ||g| t| f||d|D ]'}t|ts*| }t|}|rC|j|j|| j|j	r?|j	d nd d |V  qd S NstreamTr   rB   r6   )chunkverboser6   )
_invocation_paramsget_sub_promptsrV   
isinstancer:   r<   on_llm_new_tokenr4   r   r9   r_   r   r   rB   rL   paramsstream_respr   r-   r-   r.   _streamd  s0   

zBaseOpenAI._streamrW   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s1| }t|}|rM|j|j|| j|j	rF|j	d nd dI d H  |V  q"6 d S r   )
r   r   rY   r   r:   r<   r   r4   r   r9   r   r-   r-   r.   _astream~  s0   
zBaseOpenAI._astreampromptsr   c                 K  s<  | j }i ||}| |||}g }i }h d}	d}
|D ]w}| jrkt|dkr+tdd}| j|d ||fi |D ]}|du rC|}q:||7 }q:|dusNJ ||j|jr[|j	dnd|jre|j	dndd qt
| f||d	|}t|ts| }||d
  t|	|| |
s|	d}
q| 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total_tokensZcompletion_tokensZprompt_tokensNr~   ,Cannot stream results with multiple prompts.r   r5   r6   r>   r   r1   system_fingerprintr   )r   r   r   lenr   r   appendr4   r9   r;   rV   r   r:   extendr/   create_llm_resultr_   r   r   rB   rL   r   sub_promptsr1   r'   Z_keysr   Z_prompts
generationr   r%   r-   r-   r.   	_generate  s`   


zBaseOpenAI._generatec                   s@  | j }i ||}| |||}g }i }h d}	d}
|D ]x}| jrqt|dkr,tdd}| j|d ||fi |2 z3 dH W }|du rH|}q;||7 }q;6 |dusTJ ||j|jra|j	dnd|jrk|j	dndd qt
| f||d	|I dH }t|ts| }||d
  t|	|| q| j|||||
dS )z:Call out to OpenAI's endpoint async with k unique prompts.r   Nr~   r   r   r5   r6   r>   r   r1   r   )r   r   r   r   r   r   r   r4   r9   r;   rY   r   r:   r   r/   r   r   r-   r-   r.   
_agenerate  sf   


zBaseOpenAI._agenerater   List[List[str]]c                   sx   |durd|v rt d||d< |d dkr)t 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.r}   r~   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   r1   r'   Dict[str, int]r   c                C  st   g }| d| j}t|D ]\}}	||| |d |  }
|dd |
D  q|| jd}|r4||d< t||dS )z2Create the LLMResult from the choices and prompts.r   r~   c              	   S  s0   g | ]}t |d  t|d|dddqS )r4   r5   r6   r7   r8   )r   r:   r;   )r   choicer-   r-   r.   r   C  s    z0BaseOpenAI.create_llm_result.<locals>.<listcomp>r'   rx   r   generations
llm_output)r;   r   	enumerater   rx   r   )r_   r1   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"   updater\   rh   ri   rj   rF   proxyr   )r_   Zopenai_credsrF   r-   r-   r.   r   S  s   zBaseOpenAI._invocation_paramsMapping[str, Any]c                 C     i d| j i| jS zGet the identifying parameters.rx   rx   r   r^   r-   r-   r.   _identifying_paramse     zBaseOpenAI._identifying_paramsc                 C  rn   )Return type of llm.rF   r-   r^   r-   r-   r.   	_llm_typej     zBaseOpenAI._llm_typer4   	List[int]c                   s   t jd dk rt |S zddl}W n ty   tdw | jp$| j}z||}W n t	yA   t
d d}||}Y nw |j|| j| jdS )	-Get the token IDs using the tiktoken package.r~      r   NCould not import tiktoken python package. This is needed in order to calculate get_num_tokens. Please install it with `pip install tiktoken`.z5Warning: model not found. Using cl100k_base encoding.Zcl100k_baser   r   )sysversion_infor   get_num_tokenstiktokenr   r   rx   encoding_for_modelKeyErrorloggerwarningZget_encodingencoder   r   )r_   r4   r  rx   encrt   r   r-   r.   get_token_idso  s,   
zBaseOpenAI.get_token_ids	modelnamec                 C  s   i dddddddddddd	d
d	dd	ddddddddddddddddddddddddddddd
}d| v rM|  dd } || d }|d u rft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")
        zgpt-4oi  zgpt-4o-2024-05-13r   i    z
gpt-4-0314z
gpt-4-0613z	gpt-4-32ki   zgpt-4-32k-0314zgpt-4-32k-0613r   i   zgpt-3.5-turbo-0301zgpt-3.5-turbo-0613zgpt-3.5-turbo-16ki@  zgpt-3.5-turbo-16k-0613rs   ztext-ada-001i  adaztext-babbage-001i  i  iA  i   )
Z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  sp   	

z#BaseOpenAI.modelname_to_contextsizec                 C  s   |  | jS )z$Get max context size for this model.)r  rx   r^   r-   r-   r.   max_context_size  s   zBaseOpenAI.max_context_sizec                 C  s   |  |}| j| 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   Z
num_tokensr-   r-   r.   r     s   

z BaseOpenAI.max_tokens_for_prompt)r(   r[   r(   ra   r(   r&   )r(   rm   )r   r   r(   r   r   r&   r(   r   r   r	   r(   r	   NN
r   rw   r   r   rB   rK   rL   r   r(   r   
r   rw   r   r   rB   rW   rL   r   r(   r   
r   ra   r   r   rB   rK   rL   r   r(   r   
r   ra   r   r   rB   rW   rL   r   r(   r   N)r   r&   r   ra   r   r   r(   r   )r1   r   r   ra   r   r&   r'   r   r   r   r(   r   r(   r   r(   rw   r4   rw   r(   r  )r  rw   r(   r|   )r(   r|   )r   rw   r(   r|   )?__name__
__module____qualname____doc__propertyr`   classmethodrf   rl   ro   r    rO   __annotations__rX   rx   rz   r}   r   r   r   r   r   r:   r   r\   rh   ri   rj   r   r   r   rE   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.   rZ      s   
 	8N>:rZ   z0.0.10z1.0zlangchain_openai.OpenAI)ZsinceZremovalZalternative_importc                      s4   e Zd ZdZed	ddZe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(   ra   c                 C  rb   rc   r-   rd   r-   r-   r.   rf     rg   zOpenAI.get_lc_namespacer&   c                      i d| j it jS )Nrt   )rx   r   r   r^   r   r-   r.   r     s   zOpenAI._invocation_paramsr  r  )	r)  r*  r+  r,  r.  rf   r-  r   r2  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Zed*ddZed+ fd d!Zed, fd#d$Zed-d%d&Ze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_deploymentru   deployment_namer2   api_versionrw   openai_api_versionr   r\   azure_ad_tokenzUnion[Callable[[], str], None]azure_ad_token_providerz)Union[Callable[[], Awaitable[str]], None]azure_ad_async_token_provideropenai_api_typeTrm   validate_base_urlr(   ra   c                 C  rb   rc   r-   rd   r-   r-   r.   rf   7  rg   zAzureOpenAI.get_lc_namespacer   r	   c                 C  s  |d dk r
t d|d r|d dkrt d|d r&|d dkr&t d|d p3td	p3td
|d< |d p>td|d< |d pItd|d< |d pTtd|d< t|dddd|d< |d pntdpntd|d< |d pytd|d< t|dddd|d< zddl}W n ty   tdw t rH|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, i |d- pi d.d/i|d0 |d1 d2}|j
d6i |j|d3< |d4 }|r;||d*< |jd6i |j|d5< |S |j|d3< |S )7r   r   r~   r   r   r   r   r   r\   ZAZURE_OPENAI_API_KEYr]   r5  ZAZURE_OPENAI_ENDPOINTr:  ZAZURE_OPENAI_AD_TOKENrh   r   rj   r   r2   r   ri   r   r   r9  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 .r7  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   rE   r   z
User-Agentz"langchain-comm-python-azure-openair   r   )r8  r5  r6  r   r:  r;  r   r   r   rE   r   r   r   rO   r<  rX   r-   )r   r   r   r   rF   r   r"   rstripr   r   r4  r   ZAsyncAzureOpenAIr   )re   r   rF   rh   r   r<  r-   r-   r.   r   <  s   



z AzureOpenAI.validate_environmentr   c                   r3  )Nr7  )r7  r   r   r^   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 )Nrt   )ZengineZapi_typer8  )r"   r7  r=  r9  r   r   )r_   Zopenai_paramsr   r-   r.   r     s   zAzureOpenAI._invocation_paramsc                 C  rn   )r  r?  r-   r^   r-   r-   r.   r    r  zAzureOpenAI._llm_typec                 C  s   | j | jdS )Nr=  r9  rC  r^   r-   r-   r.   rl     s   zAzureOpenAI.lc_attributesr  r  r&  r  r'  )r)  r*  r+  r,  r5  r/  r    r7  r9  r\   r:  r;  r<  r=  r>  r.  rf   r   r   r-  r   r   r  rl   r2  r-   r-   r   r.   r4    s@   
 yr4  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dMd&d'ZedNd)d*ZedOd+d,Z	dPdQd2d3Z		dRdSd9d:Z		dRdTd=d>Z		dRdUd@dAZ		dRdVdBdCZ edWdEdFZ!edXdGdHZ"dY fdKdLZ#  Z$S )Zr   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")
    NTrp   r   rO   rX   r   rw   rx   r   r&   r   r   ru   r   r\   r   rh   rj      r|   rE   r   prefix_messagesFrm   r   r   r   r   r   r   r   r   r   r(   c                 C  sj   dd t |  D }|di }t|D ]}||vr.||v r'td| d||||< q||d< |S )r   c                 S  s   h | ]}|j qS r-   )rv   )r   fieldr-   r-   r.   	<setcomp>
  s    z)OpenAIChat.build_extra.<locals>.<setcomp>r   zFound z supplied twice.)r   r   r;   listr   pop)re   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}zddl}||_|r+||_|r0||_|r8||d|_W n tyD   tdw z|j|d< W n tyW   t	dw t
d |S )r   r\   r]   rh   r   r2   r   rj   r   ri   r   r   Nr   r   rO   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   rF   r   r   r   r   r   ZChatCompletionAttributeErrorr   r   r   )re   r   r\   rh   rj   ri   rF   r-   r-   r.   r     sX   zOpenAIChat.validate_environmentc                 C  s   | j S )r   )r   r^   r-   r-   r.   r   H  s   zOpenAIChat._default_paramsr   ra   r   r   r   c                 C  s   t |dkrtd| | jd|d dg }i d| ji| j}|d ur2d|v r.td||d< |d	d
kr<|d	= ||fS )Nr~   z6OpenAIChat currently only supports single prompt, got userr   )Zrolecontentrt   r   r   r}   r   )r   r   rE  rx   r   r;   )r_   r   r   messagesr   r-   r-   r.   _get_chat_paramsM  s   zOpenAIChat._get_chat_paramsr   rB   rK   rL   r   c           
      k  s    |  |g|\}}i ||ddi}t| f||d|D ](}t|ts*| }|d d d dd}t|d	}	|rD|j||	d
 |	V  qd S Nr   TrO  rB   r1   r   deltarN  r2   r3   )r   )rP  rV   r   r:   r;   r   r   
r_   r   r   rB   rL   rO  r   r   tokenr   r-   r-   r.   r   _  s$   


zOpenAIChat._streamrW   r   c           
      K s   |  |g|\}}i ||ddi}t| f||d|I d H 2 z/3 d H W }t|ts1| }|d d d dd}t|d	}	|rN|j||	d
I d H  |	V  q"6 d S rQ  )rP  rY   r   r:   r;   r   r   rT  r-   r-   r.   r   s  s$   

zOpenAIChat._astreamr   c                 K  s   | j r-d }| j|d ||fi |D ]}|d u r|}q||7 }q|d us&J t|ggdS | ||\}}i ||}t| f||d|}	t|	tsO|	 }	|	d | jd}
tt|	d d d d d	gg|
d
S Nr   )r   rR  r*   r   r1   messagerN  r3   r   )	r   r   r   rP  rV   r   r:   rx   r   r_   r   r   rB   rL   r   r   rO  r   Zfull_responser   r-   r-   r.   r     s6   

zOpenAIChat._generatec                   s   | j r3d }| j|d ||fi |2 z3 d H W }|d u r |}q||7 }q6 |d us,J t|ggdS | ||\}}i ||}t| f||d|I d H }	t|	tsX|	 }	|	d | jd}
tt|	d d d d d	gg|
d
S rV  )	r   r   r   rP  rY   r   r:   rx   r   rX  r-   r-   r.   r     s:   &

zOpenAIChat._agenerater   c                 C  r   r   r   r^   r-   r-   r.   r     r  zOpenAIChat._identifying_paramsc                 C  rn   )r  zopenai-chatr-   r^   r-   r-   r.   r    r  zOpenAIChat._llm_typer4   r  c                   s^   t jd dk rt |S zddl}W n ty   tdw || j}|j|| j	| j
dS )r  r~   r  r   Nr  r	  )r
  r  r   r  r  r   r  rx   r  r   r   )r_   r4   r  r  r   r-   r.   r    s   zOpenAIChat.get_token_idsr  r  r  r%  )r   ra   r   r   r(   r   r   r!  r"  r#  r$  r&  r'  r(  )%r)  r*  r+  r,  r    rO   r/  rX   rx   r:   r   r\   rh   rj   rE   rH  rE  r   r0  r   r   r!   r.  r   r   r   r-  r   rP  r   r   r   r   r   r  r  r2  r-   r-   r   r.   r     sb   
 2&#r   )r#   r$   r%   r&   r'   r&   r(   r)   )r0   r&   r(   r   )r%   r&   r0   r&   r(   r)   r  r%  )r@   rA   rB   rC   r(   rD   )r@   rA   rB   rK   rL   r   r(   r   )r@   rA   rB   rW   rL   r   r(   r   )>
__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?   rJ   rV   rY   rZ   r   r4  r   r-   r-   r-   r.   <module>   sX    D




	    J \