a
    ~g                      @  s   d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
Z
mZ d dlZd dl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 d dlmZ eeZG d	d
 d
eZdS )    )annotationsN)Any	AwaitableCallableDictListMappingOptionalUnion)LangSmithParams)from_envsecret_from_env)Field	SecretStrmodel_validator)Selfcast)
BaseOpenAIc                      s  e Zd ZU dZeeddddZded< eddd	Zd
ed< ededdddZ	ded< ede
ddgdddZded< ee
ddddZded< dZded< dZded< eeddddZded< dZded < ed!d"d#d$Zed%d"d&d'Zedd"d(d)Zed*d+d,d"d-d.Zed/d" fd0d1Zed2d" fd3d4Zd@d5d6d7d8 fd9d:Zed;d"d<d=Zed2d"d>d?Z  ZS )A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_openai import AzureOpenAI

            openai = AzureOpenAI(model_name="gpt-3.5-turbo-instruct")
    AZURE_OPENAI_ENDPOINTN)default)default_factoryzOptional[str]azure_endpointazure_deployment)r   aliaszUnion[str, None]deployment_nameapi_versionOPENAI_API_VERSION)r   r   openai_api_versionapi_keyAZURE_OPENAI_API_KEYOPENAI_API_KEYzOptional[SecretStr]openai_api_keyAZURE_OPENAI_AD_TOKENazure_ad_tokenzUnion[Callable[[], str], None]azure_ad_token_providerz)Union[Callable[[], Awaitable[str]], None]azure_ad_async_token_providerOPENAI_API_TYPEazureopenai_api_typeTboolvalidate_base_urlz	List[str])returnc                 C  s   g dS )z*Get the namespace of the langchain object.)	langchainllmsopenai clsr0   r0   `/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/langchain_openai/llms/azure.pyget_lc_namespace]   s    zAzureOpenAI.get_lc_namespacezDict[str, str]c                 C  s
   dddS )Nr    r#   )r"   r$   r0   selfr0   r0   r3   
lc_secretsb   s    zAzureOpenAI.lc_secretsc                 C  s   dS )z9Return whether this model can be serialized by Langchain.Tr0   r1   r0   r0   r3   is_lc_serializablei   s    zAzureOpenAI.is_lc_serializableafter)moder   c                 C  sZ  | j dk rtd| jr*| j dkr*td| jrB| jdkrBtd| j}|r| jrd|vrztt| jdd | _td| j	rtdd	| _	| j
| j| j	| jr| j nd	| jr| j nd	| j| j| j| j| ji | jpi d
di| jd}| jsd| ji}tjf i ||j| _| jsVd| ji}| jr>| j|d< tjf i ||j| _| S )z?Validate that api key and python package exists in environment.   zn must be at least 1.z!Cannot stream results when n > 1.z'Cannot stream results when best_of > 1.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`).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`.Nz
User-Agentz%langchain-partner-python-azure-openai)r   r   r   r   r$   r%   organizationbase_urltimeoutmax_retriesdefault_headersdefault_queryhttp_clientr%   )n
ValueError	streamingbest_ofopenai_api_baser+   r   strrstripr   r   r   r"   get_secret_valuer$   r%   openai_organizationrequest_timeoutr@   rA   rB   clientrC   r/   r   completionsasync_clienthttp_async_clientr&   AsyncAzureOpenAI)r6   rH   client_paramssync_specificasync_specificr0   r0   r3   validate_environmentn   st    





z AzureOpenAI.validate_environmentzMapping[str, Any]c                   s   i d| j it jS )Nr   )r   super_identifying_paramsr5   	__class__r0   r3   rX      s
    zAzureOpenAI._identifying_paramszDict[str, Any]c                   s   d| j i}i |t jS )Nmodel)r   rW   _invocation_params)r6   Zopenai_paramsrY   r0   r3   r\      s    
zAzureOpenAI._invocation_paramszOptional[List[str]]r   r   )stopkwargsr,   c                   s>   t  jf d|i|}| j}d|d< |d }r:||d< |S )z Get standard params for tracing.r]   r(   ls_providerr[   ls_model_name)rW   _get_ls_paramsr\   get)r6   r]   r^   paramsinvocation_params
model_namerY   r0   r3   ra      s    zAzureOpenAI._get_ls_paramsrI   c                 C  s   dS )zReturn type of llm.r(   r0   r5   r0   r0   r3   	_llm_type   s    zAzureOpenAI._llm_typec                 C  s   | j | jdS )Nr)   r   rg   r5   r0   r0   r3   lc_attributes   s    zAzureOpenAI.lc_attributes)N)__name__
__module____qualname____doc__r   r   r   __annotations__r   r   r   r"   r$   r%   r&   r)   r+   classmethodr4   propertyr7   r8   r   rV   rX   r\   ra   rf   rh   __classcell__r0   r0   rY   r3   r      sT   

	



H r   )
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   r/   langchain_core.language_modelsr   langchain_core.utilsr   r   pydanticr   r   r   typing_extensionsr   r   langchain_openai.llms.baser   	getLoggerri   loggerr   r0   r0   r0   r3   <module>   s   (
