o
    Zh                      @  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                      sx  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dAd#d$ZedBd&d'ZedCd(d)Zed*d+dDd-d.ZedE fd0d1ZedF fd3d4Z	dGdH fd:d;ZedId=d>ZedFd?d@Z  ZS )J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_urlreturn	List[str]c                 C  s   g dS )z*Get the namespace of the langchain object.)Z	langchainZllmsopenai clsr+   r+   R/var/www/html/lang_env/lib/python3.10/site-packages/langchain_openai/llms/azure.pyget_lc_namespace]   s   zAzureOpenAI.get_lc_namespace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     dS )z9Return whether this model can be serialized by Langchain.Tr+   r,   r+   r+   r.   is_lc_serializablei      zAzureOpenAI.is_lc_serializableafter)moder   c                 C  sN  | j dk r	td| jr| j dkrtd| jr!| jdkr!td| j}|rD| jrDd|vr=tt| jdd | _td| j	rDtd| j
| j| j	| jrR| j nd	| jr[| j nd	| j| j| j| j| ji | jpki d
di| jd}| jsd| ji}tjdi ||j| _| jsd| ji}| jr| j|d< tjd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"   r+   )n
ValueErrorZ	streamingZbest_ofopenai_api_baser'   r   strrstripr   r   r   r   Zget_secret_valuer!   r"   Zopenai_organizationrequest_timeoutr=   r>   r?   clientr@   r*   r   ZcompletionsZasync_clientZhttp_async_clientr#   ZAsyncAzureOpenAI)r2   rC   Zclient_paramsZsync_specificZasync_specificr+   r+   r.   validate_environmentn   sz   

	

z AzureOpenAI.validate_environmentMapping[str, Any]c                   s   i d| j it jS )Nr   )r   super_identifying_paramsr1   	__class__r+   r.   rK      s
   zAzureOpenAI._identifying_paramsDict[str, Any]c                   s   d| j i}i |t jS )Nmodel)r   rJ   _invocation_params)r2   Zopenai_paramsrL   r+   r.   rP      s   
zAzureOpenAI._invocation_paramsstopOptional[List[str]]kwargsr   r   c                   s>   t  jdd|i|}| j}d|d< |d }r||d< |S )z Get standard params for tracing.rQ   r$   Zls_providerrO   Zls_model_nameNr+   )rJ   _get_ls_paramsrP   get)r2   rQ   rS   paramsZinvocation_paramsZ
model_namerL   r+   r.   rT      s   zAzureOpenAI._get_ls_paramsrD   c                 C  r4   )zReturn type of llm.r$   r+   r1   r+   r+   r.   	_llm_type   r6   zAzureOpenAI._llm_typec                 C  s   | j | jdS )Nr%   r   rX   r1   r+   r+   r.   lc_attributes   s   zAzureOpenAI.lc_attributes)r(   r)   )r(   r0   )r(   r&   )r(   r   )r(   rI   )r(   rN   )N)rQ   rR   rS   r   r(   r   )r(   rD   )__name__
__module____qualname____doc__r   r   r   __annotations__r   r   r   r   r!   r"   r#   r%   r'   classmethodr/   propertyr3   r5   r   rH   rK   rP   rT   rW   rY   __classcell__r+   r+   rL   r.   r      sf   
 



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   	getLoggerrZ   loggerr   r+   r+   r+   r.   <module>   s    (
