
    3fi0"                        d Z ddlmZ ddlZddlmZmZmZ ddl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j2                  e      Z G d de      Zy)zHAzure OpenAI large language models. Not to be confused with chat models.    )annotationsN)	AwaitableCallableMapping)Any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d/ fd&       Zed0 fd'       Z	 d1	 	 	 	 	 d2 fd(Zed3d)       Zed0d*       Z xZS )4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:
        ```python
        from langchain_openai import AzureOpenAI

        openai = AzureOpenAI(model_name="gpt-3.5-turbo-instruct")
        ```
    AZURE_OPENAI_ENDPOINTN)default)default_factoryz
str | Noneazure_endpointazure_deployment)r   aliasdeployment_nameapi_versionOPENAI_API_VERSION)r   r   openai_api_versionapi_keyAZURE_OPENAI_API_KEYOPENAI_API_KEYzSecretStr | Noneopenai_api_keyAZURE_OPENAI_AD_TOKENazure_ad_tokenzCallable[[], str] | Noneazure_ad_token_providerz#Callable[[], Awaitable[str]] | Noneazure_ad_async_token_providerOPENAI_API_TYPEazureopenai_api_typeTboolvalidate_base_urlc                
    g dS )zsGet the namespace of the LangChain object.

        Returns:
            `["langchain", "llms", "openai"]`
        )	langchainllmsopenai clss    Y/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_openai/llms/azure.pyget_lc_namespacezAzureOpenAI.get_lc_namespaceb   s
     /.    c                    dddS )z0Mapping of secret keys to environment variables.r   r!   )r    r"   r.   selfs    r1   
lc_secretszAzureOpenAI.lc_secretsk   s     55
 	
r3   c                     y)z9Return whether this model can be serialized by LangChain.Tr.   r/   s    r1   is_lc_serializablezAzureOpenAI.is_lc_serializables   s     r3   after)modec                   | j                   dk  rd}t        |      | j                  r| j                   dkD  rd}t        |      | j                  r| j                  dkD  rd}t        |      | j                  }|rg| j
                  r[d|vr>t        t        | j                        j                  d      dz   | _        d}t        |      | j                  rd}t        |      | 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#   r.   )n
ValueError	streamingbest_ofopenai_api_baser)   r   strrstripr   r   r   r    get_secret_valuer"   r#   openai_organizationrequest_timeoutrB   rC   rD   clientrE   r-   r   completionsasync_clienthttp_async_clientr$   AsyncAzureOpenAI)r6   msgrJ   client_paramssync_specificasync_specifics         r1   validate_environmentz AzureOpenAI.validate_environmentx   sN    66A:)CS/!>>dffqj5CS/!>>dllQ.;CS/! ..t55/d223::3?)K $- 
 !o%##,  !o%  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 
 r3   c                4    d| j                   it        |   S )Nr   )r   super_identifying_params)r6   	__class__s    r1   r\   zAzureOpenAI._identifying_params   s'     t33
g)
 	
r3   c                <    d| j                   i}i |t        |   S )Nmodel)r   r[   _invocation_params)r6   openai_paramsr]   s     r1   r`   zAzureOpenAI._invocation_params   s(     $"6"67>->57#=>>r3   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_namer.   )r[   _get_ls_paramsr`   get)r6   rc   kwargsparamsinvocation_params
model_namer]   s         r1   rf   zAzureOpenAI._get_ls_params   sW     '<T<V< 33 '}*..w77:7&0F?#r3   c                     y)zReturn type of llm.r&   r.   r5   s    r1   	_llm_typezAzureOpenAI._llm_type   s     r3   c                4    | j                   | j                  dS )zAttributes relevant to tracing.r'   r   ro   r5   s    r1   lc_attributeszAzureOpenAI.lc_attributes   s       $33"&"9"9
 	
r3   )returnz	list[str])rq   zdict[str, str])rq   r(   )rq   r   )rq   zMapping[str, Any])rq   zdict[str, Any])N)rc   zlist[str] | Nonerh   r   rq   r	   )rq   rK   )__name__
__module____qualname____doc__r   r
   r   __annotations__r   r   r   r    r"   r#   r$   r'   r)   classmethodr2   propertyr7   r9   r   rY   r\   r`   rf   rm   rp   __classcell__)r]   s   @r1   r   r      s     "' !8$G"NJ  #(<N"OOZO &+ !5tD&
  T (-'#%56
(N$  (-'(?N(N$  9=5<
 JN!#FM #( !2GD#OZ  ."t" / / 
 
   '"K #KZ 
 
 ? ?
 (,	$	7:			   
 
r3   r   )ru   
__future__r   loggingcollections.abcr   r   r   typingr   r   r-   langchain_core.language_modelsr	   langchain_core.utilsr
   r   pydanticr   r   r   typing_extensionsr   langchain_openai.llms.baser   	getLoggerrr   loggerr   r.   r3   r1   <module>r      sL    N "  8 8   : : 6 6 " 1			8	$T
* T
r3   