U
    h                     @  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
 d dlZd dl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CallableDictListMappingOptionalUnion)LangSmithParams)Field	SecretStrroot_validator)from_envsecret_from_env)
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< 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*d+d,d-Zed.d  fd/d0Zed1d  fd2d3Zd?d4d5d6d7 fd8d9Zed:d d;d<Zed1d 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_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OPENAI_API_TYPEazureopenai_api_typeTboolvalidate_base_urlz	List[str])returnc                 C  s
   dddgS )z*Get the namespace of the langchain object.Z	langchainZllmsopenai clsr&   r&   ?/tmp/pip-unpacked-wheel-n8reftby/langchain_openai/llms/azure.pyget_lc_namespaceV   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_secrets[   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_serializableb   s    zAzureOpenAI.is_lc_serializableF)preZskip_on_failureZallow_reuser   )valuesr$   c                 C  sl  |d dk rt d|d r0|d dkr0t d|d rL|d dkrLt d|d }|r|d	 rd
|kr|d dd
 |d< t d|d rt dd|d< |d |d |d |d r|d  nd|d r|d  nd|d |d |d |d |d |d |d d}|ds:d|d i}tjf ||j|d< |dshd|d i}tjf ||j|d< |S )z?Validate that api key and python package exists in environment.n   zn must be at least 1.Z	streamingz!Cannot stream results when n > 1.Zbest_ofz'Cannot stream results when best_of > 1.openai_api_baser#   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`).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`.Nr   r   r   r   r   Zopenai_organizationrequest_timeoutmax_retriesdefault_headersdefault_query)r   r   r   r   r   r   Zorganizationbase_urltimeoutr6   r7   r8   clienthttp_clientZasync_clientZhttp_async_client)
ValueErrorrstripZget_secret_valuegetr%   r   ZcompletionsZAsyncAzureOpenAI)r(   r0   r3   Zclient_paramsZsync_specificZasync_specificr&   r&   r)   validate_environmentg   sb      z AzureOpenAI.validate_environmentzMapping[str, Any]c                   s   d| j it jS )Nr   )r   super_identifying_paramsr+   	__class__r&   r)   rB      s    zAzureOpenAI._identifying_paramszDict[str, Any]c                   s   d| j i}|t jS )Nmodel)r   rA   _invocation_params)r,   Zopenai_paramsrC   r&   r)   rF      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.rG   r    Zls_providerrE   Zls_model_name)rA   _get_ls_paramsrF   r?   )r,   rG   rH   paramsZinvocation_paramsZ
model_namerC   r&   r)   rI      s    zAzureOpenAI._get_ls_paramsstrc                 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   rM   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#   classmethodr*   propertyr-   r.   r   r@   rB   rF   rI   rL   rN   __classcell__r&   r&   rC   r)   r      sT   

	
 


= r   )
__future__r   loggingtypingr   r   r   r   r   r   r	   r%   Zlangchain_core.language_modelsr
   Zlangchain_core.pydantic_v1r   r   r   Zlangchain_core.utilsr   r   Zlangchain_openai.llms.baser   	getLoggerrO   loggerr   r&   r&   r&   r)   <module>   s   $
