o
    {qi8"                     @  s   d Z ddlmZ ddlZddlmZmZ ddl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 dd
lmZ eeZG dd deZdS )zHAzure OpenAI large language models. Not to be confused with chat models.    )annotationsN)	AwaitableMapping)AnyCallableOptionalUnioncast)LangSmithParams)from_envsecret_from_env)Field	SecretStrmodel_validator)Self)
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)   b/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/langchain_openai/llms/azure.pyget_lc_namespacec   s   zAzureOpenAI.get_lc_namespacedict[str, str]c                 C  s
   dddS )z0Mapping of secret keys to environment variables.r   r   )r   r   r)   selfr)   r)   r,   
lc_secretsh   s   zAzureOpenAI.lc_secretsc                 C     dS )z9Return whether this model can be serialized by LangChain.Tr)   r*   r)   r)   r,   is_lc_serializablep      zAzureOpenAI.is_lc_serializableafter)moder   c                 C  sb  | j dk rd}t|| jr| j dkrd}t|| jr'| jdkr'd}t|| j}|rN| jrNd|vrEtt| jdd | _d}t|| j	rNd}t|| j
| j| j	| jr\| j nd	| jre| j nd	| j| j| j| j| ji | jpui 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)r0   msgrA   Zclient_paramsZsync_specificZasync_specificr)   r)   r,   validate_environmentu   s   



z AzureOpenAI.validate_environmentMapping[str, Any]c                   s   d| j it jS )Nr   )r   super_identifying_paramsr/   	__class__r)   r,   rJ      s   zAzureOpenAI._identifying_paramsdict[str, Any]c                   s   d| j i}i |t jS )Nmodel)r   rI   _invocation_params)r0   Zopenai_paramsrK   r)   r,   rO      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.rP   r"   Zls_providerrN   Zls_model_nameNr)   )rI   _get_ls_paramsrO   get)r0   rP   rR   paramsZinvocation_paramsZ
model_namerK   r)   r,   rS      s   zAzureOpenAI._get_ls_paramsrB   c                 C  r2   )zReturn type of llm.r"   r)   r/   r)   r)   r,   	_llm_type   r4   zAzureOpenAI._llm_typec                 C  s   | j | jdS )zAttributes relevant to tracing.r#   r   rW   r/   r)   r)   r,   lc_attributes   s   zAzureOpenAI.lc_attributes)r&   r'   )r&   r.   )r&   r$   )r&   r   )r&   rH   )r&   rM   )N)rP   rQ   rR   r   r&   r
   )r&   rB   )__name__
__module____qualname____doc__r   r   r   __annotations__r   r   r   r   r   r    r!   r#   r%   classmethodr-   propertyr1   r3   r   rG   rJ   rO   rS   rV   rX   __classcell__r)   r)   rK   r,   r      sf   
 



Mr   )r\   
__future__r   loggingcollections.abcr   r   typingr   r   r   r   r	   r(   Zlangchain_core.language_modelsr
   Zlangchain_core.utilsr   r   Zpydanticr   r   r   Ztyping_extensionsr   Zlangchain_openai.llms.baser   	getLoggerrY   loggerr   r)   r)   r)   r,   <module>   s    
