
    ih                         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j6                  e      Z G d	 d
e      Zy)    )annotationsN)Any	AwaitableCallableDictListMappingOptionalUnion)LangSmithParams)from_envsecret_from_env)Field	SecretStrmodel_validator)Selfcast)
BaseOpenAIc                      e Zd ZU dZ e edd            Zded<   	  edd	      Zd
ed<   	  ed edd            Z	ded<   	  ed e
ddgd            Zded<    e e
dd            Zded<   	 dZded<   	 dZded<   	  e edd            Zded<   	 dZded <   	 ed,d!       Zed-d"       Zed.d#       Z ed$%      d/d&       Zed0 fd'       Zed1 fd(       Z	 d2	 	 	 	 	 d3 fd)Zed4d*       Zed1d+       Z xZS )5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_urlc                
    g dS )z*Get the namespace of the langchain object.)	langchainllmsopenai clss    Y/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain_openai/llms/azure.pyget_lc_namespacezAzureOpenAI.get_lc_namespace]   s
     /.    c                    dddS )Nr"   r%   )r$   r&   r2   selfs    r5   
lc_secretszAzureOpenAI.lc_secretsb   s     55
 	
r7   c                     y)z9Return whether this model can be serialized by Langchain.Tr2   r3   s    r5   is_lc_serializablezAzureOpenAI.is_lc_serializablei   s     r7   after)modec                |   | j                   dk  rt        d      | j                  r| j                   dkD  rt        d      | j                  r| j                  dkD  rt        d      | j                  }|rc| j
                  rWd|vr<t        t        | j                        j                  d      dz   | _        t        d      | j                  rt        d      | j                  | j                  | j                  | j                  r| j                  j                         nd	| j                  r| j                  j                         nd	| j                  | j                   | j                  | j"                  | j$                  i | j&                  xs i d
di| j(                  d}| j*                  s4d| j,                  i}t/        j0                  di ||j2                  | _        | j4                  sOd| j6                  i}| j8                  r| j8                  |d<   t/        j:                  di ||j2                  | _        | 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'   r2   )n
ValueError	streamingbest_ofopenai_api_baser-   r   strrstripr   r    r   r$   get_secret_valuer&   r'   openai_organizationrequest_timeoutrF   rG   rH   clientrI   r1   r   completionsasync_clienthttp_async_clientr(   AsyncAzureOpenAI)r:   rN   client_paramssync_specificasync_specifics        r5   validate_environmentz AzureOpenAI.validate_environmentn   sA    66A:455>>dffqj@AA>>dllQ.FGG ..t55/d223::3?)K $ !- 
 ## ,   22"11 $ 4 4"" **;;="" #11BBD'+'C'C 44,,++++ ''-2 E  "//'
* {{*D,<,<=M ,,  k K   +T-C-CDN1166 78 !' 7 7 !! ! k 
 r7   c                8    i d| j                   it        |   S )Nr   )r   super_identifying_params)r:   	__class__s    r5   r_   zAzureOpenAI._identifying_params   s-    
 $"6"67
g)
 	
r7   c                <    d| j                   i}i |t        |   S )Nmodel)r   r^   _invocation_params)r:   openai_paramsr`   s     r5   rc   zAzureOpenAI._invocation_params   s(     $"6"67>->57#=>>r7   c                |    t        |   dd|i|}| j                  }d|d<   |j                  d      x}r||d<   |S )z Get standard params for tracing.stopr*   ls_providerrb   ls_model_namer2   )r^   _get_ls_paramsrc   get)r:   rf   kwargsparamsinvocation_params
model_namer`   s         r5   ri   zAzureOpenAI._get_ls_params   sW     '<T<V< 33 '}*..w77:7&0F?#r7   c                     y)zReturn type of llm.r*   r2   r9   s    r5   	_llm_typezAzureOpenAI._llm_type   s     r7   c                4    | j                   | j                  dS )Nr+   r    rr   r9   s    r5   lc_attributeszAzureOpenAI.lc_attributes   s       $33"&"9"9
 	
r7   )returnz	List[str])rt   zDict[str, str])rt   r,   )rt   r   )rt   zMapping[str, Any])rt   zDict[str, Any])N)rf   zOptional[List[str]]rk   r   rt   r   )rt   rO   )__name__
__module____qualname____doc__r   r   r   __annotations__r   r    r   r$   r&   r'   r(   r+   r-   classmethodr6   propertyr;   r=   r   r\   r_   rc   ri   rp   rs   __classcell__)r`   s   @r5   r   r      s     %* !8$G%NM  ).dBT(UO%U
 ). !5tD)  T +0'#%56
+N'  +0'(?N+N'  ?C;B
 PT!#LS &+ !2GD&O]  ,"t" / / 
 
   '"F #FP 
 
 ? ?
 +/	'	:=			   
 
r7   r   )
__future__r   loggingtypingr   r   r   r   r   r	   r
   r   r1   langchain_core.language_modelsr   langchain_core.utilsr   r   pydanticr   r   r   typing_extensionsr   r   langchain_openai.llms.baser   	getLoggerru   loggerr   r2   r7   r5   <module>r      sI    "  Q Q Q  : : 6 6 ( 1			8	$G
* G
r7   