o
    Ag{                     @  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'   _keys_to_use_key r.   f/var/www/html/development/chatbot/venv/lib/python3.10/site-packages/langchain_community/llms/openai.pyupdate_token_usage.   s   r0   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   r5   finish_reasonNlogprobsr6   r7   r5   generation_info)r   dictget)r1   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.r2   r   r5   r6   Nr7   )r<   )r%   r1   r.   r.   r/   _update_responseI   s
   $ r>   c                   C  s   ddd d dgiS )Nr2   r3   r5   r6   r7   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   )error_typesmax_retriesrC   )	openaierrorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr   rG   )rA   rC   rH   errorsr.   r.   r/   _create_retry_decorator^   s   rP   "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.rC   rR   r   r(   c                    s    j jdi | S Nr.   )clientcreaterR   rA   r.   r/   _completion_with_retry}   s   z5completion_with_retry.<locals>._completion_with_retryNr.   rR   r   r(   r   )r"   rU   rV   rP   rA   rC   rR   retry_decoratorrY   r.   rX   r/   completion_with_retryr   s   r]   '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.NrS   rR   r   r(   c                    s    j jdi | I d H S rT   )rU   acreaterW   rX   r.   r/   rY      s   z6acompletion_with_retry.<locals>._completion_with_retryr.   rZ   )r"   async_clientrV   rP   r[   r.   rX   r/   acompletion_with_retry   s   ra   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.)	langchainllmsrH   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)rr   rs   rt   )rg   
attributesr.   r.   r/   lc_attributes   s   


zBaseOpenAI.lc_attributesboolc                 C     dS )NTr.   rn   r.   r.   r/   is_lc_serializable   s   zBaseOpenAI.is_lc_serializableNTdefaultexcluder   rU   r`   gpt-3.5-turbo-instructmodelr{   aliasstr
model_namegffffff?floattemperature   int
max_tokens   top_pr   frequency_penaltypresence_penaltynbest_ofdefault_factorymodel_kwargsapi_keyOptional[str]rd   base_urlrr   organizationrs   rt      
batch_sizetimeoutz,Union[float, Tuple[float, float], Any, None]request_timeoutzOptional[Dict[str, float]]
logit_bias   rG   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.r   r3   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__)ro   r   r   	__class__r.   r/   r      s   zBaseOpenAI.__new__)populate_by_namebeforemodevaluesc                 C  s   t | }t||}|S )>Build extra kwargs from additional params that were passed in.)r   r   )ro   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.rd   re   rr   OPENAI_API_BASErt   OPENAI_PROXYr3   r{   rs   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NTCould not import openai python package. Please install it with `pip install openai`.r   rG   r   r   r   )r   r   r   r   rG   r   r   r   rU   r`   r.   )
ValueErrorr   osgetenvrH   ImportErrorr"   r<   OpenAIcompletionsAsyncOpenAI
Completion)ro   r   rH   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.)r   r   r   r   r   r   Nr   r   r   r   )r   r   r   r   r   r   r   r   r"   r   r   )rg   normal_paramsr.   r.   r/   _default_paramsL  s   
	



zBaseOpenAI._default_paramspromptstopOptional[List[str]]rC   rQ   rR   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   rC   r7   )chunkverboser7   )
_invocation_paramsget_sub_promptsr]   
isinstancer;   r=   on_llm_new_tokenr5   r   r:   rg   r   r   rC   rR   paramsstream_respr   r.   r.   r/   _streamd  s0   

zBaseOpenAI._streamr^   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   ra   r   r;   r=   r   r5   r   r:   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."])
           total_tokensprompt_tokenscompletion_tokensNr   ,Cannot stream results with multiple prompts.r   r6   r7   r?   r   r2   system_fingerprintr   )r   r   r   lenr   r   appendr5   r:   r<   r]   r   r;   extendr0   create_llm_resultrg   r   r   rC   rR   r   sub_promptsr2   r'   _keysr   _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   r6   r7   r?   r   r2   r   )r   r   r   r   r   r   r   r5   r:   r<   ra   r   r;   r   r0   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   rg   r.   r/   
<listcomp>.  s    z.BaseOpenAI.get_sub_prompts.<locals>.<listcomp>)r   r   max_tokens_for_promptranger   )rg   r   r   r   r   r.   r   r/   r     s   zBaseOpenAI.get_sub_promptsr   r2   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 )r5   r6   r7   r8   r9   )r   r;   r<   )r   choicer.   r.   r/   r   C  s    z0BaseOpenAI.create_llm_result.<locals>.<listcomp>r'   r   r   generations
llm_output)r<   r   	enumerater   r   r   )rg   r2   r   r   r'   r   r  r   r   _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"   updaterd   rr   rs   rt   rH   proxyr   )rg   openai_credsrH   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.r   r   r   rf   r.   r.   r/   _identifying_paramse     zBaseOpenAI._identifying_paramsc                 C  rx   )Return type of llm.rH   r.   rf   r.   r.   r/   	_llm_typej     zBaseOpenAI._llm_typer5   	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.cl100k_baser   r   )sysversion_infor   get_num_tokenstiktokenr   r   r   encoding_for_modelKeyErrorloggerwarningget_encodingencoder   r   )rg   r5   r"  r   encr~   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-0613r}   ztext-ada-001i  adaztext-babbage-001i  i  iA  i   )
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, )splitr<   r   joinr#   )r+  model_token_mapping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.)r5  r   rf   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!  r6  )rg   r   
num_tokensr.   r.   r/   r     s   

z BaseOpenAI.max_tokens_for_prompt)r(   rc   r(   ri   r(   r&   )r(   rw   )r   r   r(   r   r   r&   r(   r   r   r	   r(   r	   NN
r   r   r   r   rC   rQ   rR   r   r(   r   
r   r   r   r   rC   r^   rR   r   r(   r   
r   ri   r   r   rC   rQ   rR   r   r(   r   
r   ri   r   r   rC   r^   rR   r   r(   r   N)r   r&   r   ri   r   r   r(   r   )r2   r   r   ri   r   r&   r'   r   r   r   r(   r   r(   r  r(   r   r5   r   r(   r  )r+  r   r(   r   )r(   r   )r   r   r(   r   )?__name__
__module____qualname____doc__propertyrh   classmethodrp   rv   ry   r    rU   __annotations__r`   r   r   r   r   r   r   r   r   r;   r   rd   rr   rs   rt   r   r   r   rG   r   setr   r   r   r   r   r   r   r   model_configr!   r   r   r   r   r   r   r   r   r   r   r   r  r  r*  staticmethodr5  r6  r   __classcell__r.   r.   r   r/   rb      s   
 	8N>:rb   z0.0.10z1.0zlangchain_openai.OpenAI)sinceremoval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(   ri   c                 C  rj   rk   r.   rn   r.   r.   r/   rp     rq   zOpenAI.get_lc_namespacer&   c                      i d| j it jS )Nr~   )r   r   r   rf   r   r.   r/   r     s   zOpenAI._invocation_paramsr8  r9  )	rE  rF  rG  rH  rJ  rp   rI  r   rO  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_deploymentr   deployment_namer3   api_versionr   openai_api_versionr   rd   azure_ad_tokenzUnion[Callable[[], str], None]azure_ad_token_providerz)Union[Callable[[], Awaitable[str]], None]azure_ad_async_token_provideropenai_api_typeTrw   validate_base_urlr(   ri   c                 C  rj   rk   r.   rn   r.   r.   r/   rp   7  rq   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   rd   AZURE_OPENAI_API_KEYre   rU  AZURE_OPENAI_ENDPOINTrZ  AZURE_OPENAI_AD_TOKENrr   r   rt   r   r3   r   rs   r   r   rY  OPENAI_API_VERSIONr]  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 .rW  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   rG   r   z
User-Agentz"langchain-comm-python-azure-openair   r   )rX  rU  rV  r   rZ  r[  r   r   r   rG   r   r   r   rU   r\  r`   r.   )r   r   r   r   rH   r   r"   rstripr   r   rT  r   AsyncAzureOpenAIr   )ro   r   rH   rr   r   r\  r.   r.   r/   r   <  s   



z AzureOpenAI.validate_environmentr  c                   rS  )NrW  )rW  r   r  rf   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 )Nr~   )engineapi_typerX  )r"   rW  r]  rY  r   r   )rg   openai_paramsr   r.   r/   r     s   zAzureOpenAI._invocation_paramsc                 C  rx   )r  rd  r.   rf   r.   r.   r/   r    r  zAzureOpenAI._llm_typec                 C  s   | j | jdS )Nr]  rY  rl  rf   r.   r.   r/   rv     s   zAzureOpenAI.lc_attributesr8  r;  rB  r9  rC  )rE  rF  rG  rH  rU  rK  r    rW  rY  rd   rZ  r[  r\  r]  r^  rJ  rp   r   r   rI  r  r   r  rv   rO  r.   r.   r   r/   rT    s@   
 yrT  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")
    NTrz   r   rU   r`   r   r   r   r   r&   r   r   r   r   rd   r   rr   rt      r   rG   r   prefix_messagesFrw   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.   )r   )r   fieldr.   r.   r/   	<setcomp>
  s    z)OpenAIChat.build_extra.<locals>.<setcomp>r   zFound z supplied twice.)r   r   r<   listr   pop)ro   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   rd   re   rr   r   r3   r   rt   r   rs   r   r   Nr
  r   rU   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   rH   r   r	  r   r  r   ChatCompletionAttributeErrorr   r   r   )ro   r   rd   rr   rt   rs   rH   r.   r.   r/   r     sX   zOpenAIChat.validate_environmentc                 C  s   | j S )r   )r   rf   r.   r.   r/   r   H  s   zOpenAIChat._default_paramsr   ri   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   )rolecontentr~   r   r   r   r   )r   r   rn  r   r   r<   )rg   r   r   messagesr   r.   r.   r/   _get_chat_paramsM  s   zOpenAIChat._get_chat_paramsr   rC   rQ   rR   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rz  rC   r2   r   deltary  r3   r4   )r   )r{  r]   r   r;   r<   r   r   
rg   r   r   rC   rR   rz  r   r   tokenr   r.   r.   r/   r   _  s$   


zOpenAIChat._streamr^   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 r|  )r{  ra   r   r;   r<   r   r   r  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  r}  r*   r  r2   messagery  r4   r  )	r   r   r   r{  r]   r   r;   r   r   rg   r   r   rC   rR   r   r   rz  r   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 r  )	r   r   r   r{  ra   r   r;   r   r   r  r.   r.   r/   r     s:   &

zOpenAIChat._agenerater  c                 C  r  r  r  rf   r.   r.   r/   r    r  zOpenAIChat._identifying_paramsc                 C  rx   )r  zopenai-chatr.   rf   r.   r.   r/   r    r  zOpenAIChat._llm_typer5   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#  r   r(  r   r   )rg   r5   r"  r)  r   r.   r/   r*    s   zOpenAIChat.get_token_idsr:  r;  r9  rA  )r   ri   r   r   r(   r   r<  r=  r>  r?  r@  rB  rC  rD  )%rE  rF  rG  rH  r    rU   rK  r`   r   r;   r   rd   rr   rt   rG   rq  rn  r   rL  r   r   r!   rJ  r   r   r   rI  r   r{  r   r   r   r   r  r  r*  rO  r.   r.   r   r/   r     sb   
 2&#r   )r#   r$   r%   r&   r'   r&   r(   r)   )r1   r&   r(   r   )r%   r&   r1   r&   r(   r)   r9  rA  )rA   rB   rC   rD   r(   rE   )rA   rB   rC   rQ   rR   r   r(   r   )rA   rB   rC   r^   rR   r   r(   r   )>
__future__r   loggingr   r  r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   langchain_core._api.deprecationr   langchain_core.callbacksr   r   #langchain_core.language_models.llmsr   r   langchain_core.outputsr   r   r   langchain_core.utilsr   r   r   langchain_core.utils.pydanticr   langchain_core.utils.utilsr   pydanticr   r    r!    langchain_community.utils.openair"   	getLoggerrE  r%  r0   r=   r>   r@   rP   r]   ra   rb   r   rT  r   r.   r.   r.   r/   <module>   sX    D




	    J \