
    h!                        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j4                  e      Z G d
 de      Zy)    )annotationsN)	AwaitableMapping)AnyCallableOptionalUnioncast)LangSmithParams)from_envsecret_from_env)Field	SecretStrmodel_validator)Self)
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/eduruby.in/venv/lib/python3.12/site-packages/langchain_openai/llms/azure.pyget_lc_namespacezAzureOpenAI.get_lc_namespacea   s
     /.    c                    dddS )Nr    r#   )r"   r$   r0   selfs    r3   
lc_secretszAzureOpenAI.lc_secretsf   s     55
 	
r5   c                     y)z9Return whether this model can be serialized by LangChain.Tr0   r1   s    r3   is_lc_serializablezAzureOpenAI.is_lc_serializablem   s     r5   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%   r0   )n
ValueError	streamingbest_ofopenai_api_baser+   r
   strrstripr   r   r   r"   get_secret_valuer$   r%   openai_organizationrequest_timeoutrD   rE   rF   clientrG   r/   r   completionsasync_clienthttp_async_clientr&   AsyncAzureOpenAI)r8   rL   client_paramssync_specificasync_specifics        r3   validate_environmentz AzureOpenAI.validate_environmentr   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 
 r5   c                8    i d| j                   it        |   S )Nr   )r   super_identifying_params)r8   	__class__s    r3   r]   zAzureOpenAI._identifying_params   s-    
 $"6"67
g)
 	
r5   c                <    d| j                   i}i |t        |   S )Nmodel)r   r\   _invocation_params)r8   openai_paramsr^   s     r3   ra   zAzureOpenAI._invocation_params   s(     $"6"67>->57#=>>r5   c                |    t        |   dd|i|}| j                  }d|d<   |j                  d      x}r||d<   |S )z Get standard params for tracing.stopr(   ls_providerr`   ls_model_namer0   )r\   _get_ls_paramsra   get)r8   rd   kwargsparamsinvocation_params
model_namer^   s         r3   rg   zAzureOpenAI._get_ls_params   sW     '<T<V< 33 '}*..w77:7&0F?#r5   c                     y)zReturn type of llm.r(   r0   r7   s    r3   	_llm_typezAzureOpenAI._llm_type   s     r5   c                4    | j                   | j                  dS )Nr)   r   rp   r7   s    r3   lc_attributeszAzureOpenAI.lc_attributes   s       $33"&"9"9
 	
r5   )returnz	list[str])rr   zdict[str, str])rr   r*   )rr   r   )rr   zMapping[str, Any])rr   zdict[str, Any])N)rd   zOptional[list[str]]ri   r   rr   r   )rr   rM   )__name__
__module____qualname____doc__r   r   r   __annotations__r   r   r   r"   r$   r%   r&   r)   r+   classmethodr4   propertyr9   r;   r   rZ   r]   ra   rg   rn   rq   __classcell__)r^   s   @r3   r   r      s   " %* !8$G%NM  ).dBT(UO%U ). !5tD)  V +0'#%56
+N'  +0'(?N+N'  ?C;B
 PT!#LS &+ !2GD&O]  0"t" / / 
 
   '"F #FP 
 
 ? ?
 +/	'	:=			   
 
r5   r   )
__future__r   loggingcollections.abcr   r   typingr   r   r   r	   r
   r/   langchain_core.language_modelsr   langchain_core.utilsr   r   pydanticr   r   r   typing_extensionsr   langchain_openai.llms.baser   	getLoggerrs   loggerr   r0   r5   r3   <module>r      sI    "  . 7 7  : : 6 6 " 1			8	$J
* J
r5   