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")
    ZAZURE_OPENAI_ENDPOINTN)default)default_factoryzOptional[str]azure_endpointazure_deployment)r   aliaszUnion[str, None]deployment_nameapi_versionZOPENAI_API_VERSION)r   r   openai_api_versionapi_keyAZURE_OPENAI_API_KEYZ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_providerZ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.)Z	langchainZllmsopenai clsr*   r*   i/var/www/html/cobodadashboardai.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!   r*   selfr*   r*   r-   
lc_secretsb   s    zAzureOpenAI.lc_secretsc                 C  s   dS )z9Return whether this model can be serialized by Langchain.Tr*   r+   r*   r*   r-   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"   Zorganizationbase_urltimeoutmax_retriesdefault_headersdefault_queryhttp_clientr"   )n
ValueErrorZ	streamingZbest_ofopenai_api_baser'   r   strrstripr   r   r   r   Zget_secret_valuer!   r"   Zopenai_organizationrequest_timeoutr9   r:   r;   clientr<   r)   r   ZcompletionsZasync_clientZhttp_async_clientr#   ZAsyncAzureOpenAI)r0   r?   Zclient_paramsZsync_specificZasync_specificr*   r*   r-   validate_environmentn   st    





z AzureOpenAI.validate_environmentzMapping[str, Any]c                   s   i d| j it jS )Nr   )r   super_identifying_paramsr/   	__class__r*   r-   rF      s
    zAzureOpenAI._identifying_paramszDict[str, Any]c                   s   d| j i}i |t jS )Nmodel)r   rE   _invocation_params)r0   Zopenai_paramsrG   r*   r-   rJ      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.rK   r$   Zls_providerrI   Zls_model_name)rE   _get_ls_paramsrJ   get)r0   rK   rL   paramsZinvocation_paramsZ
model_namerG   r*   r-   rM      s    zAzureOpenAI._get_ls_paramsr@   c                 C  s   dS )zReturn type of llm.r$   r*   r/   r*   r*   r-   	_llm_type   s    zAzureOpenAI._llm_typec                 C  s   | j | jdS )Nr%   r   rQ   r/   r*   r*   r-   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'   classmethodr.   propertyr1   r2   r   rD   rF   rJ   rM   rP   rR   __classcell__r*   r*   rG   r-   r      sT   

	



H r   )
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   r)   Zlangchain_core.language_modelsr   Zlangchain_core.utilsr   r   Zpydanticr   r   r   Ztyping_extensionsr   r   Zlangchain_openai.llms.baser   	getLoggerrS   loggerr   r*   r*   r*   r-   <module>   s   (
