o
    ig                     @  s  d dl mZ d dl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mZmZ d dlZddlmZmZmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lm Z  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z( e)g dZ*e	g e+f Z,e	g df Z-edeej.ej/f dZ0edee"e e#e f dZ1d2g dZ3G dd de%Z4G dd de(e0e1f Z5G dd de5ej.e"e f eZ6G dd de5ej/e#e f eZ7dS )    )annotationsN)AnyUnionMappingTypeVarCallable	Awaitablecastoverload)Selfoverride   )	NOT_GIVENOmitQueryTimeoutNotGiven)is_given
is_mapping)OpenAIAsyncOpenAI)
model_copy)FinalRequestOptions)StreamAsyncStream)OpenAIError)DEFAULT_MAX_RETRIES
BaseClient)z/completionsz/chat/completionsz/embeddingsz/audio/transcriptionsz/audio/translationsz/audio/speechz/images/generationsz/images/editszstr | Awaitable[str]_HttpxClientT)bound_DefaultStreamT )<zmissing API key>c                      s   e Zd Zd fddZ  ZS )MutuallyExclusiveAuthErrorreturnNonec                   s   t  d d S )NzThe `api_key`, `azure_ad_token` and `azure_ad_token_provider` arguments are mutually exclusive; Only one can be passed at a time)super__init__)self	__class__ J/home/kim/smarthome/.venv/lib/python3.10/site-packages/openai/lib/azure.pyr(   .   s   z#MutuallyExclusiveAuthError.__init__)r%   r&   )__name__
__module____qualname__r(   __classcell__r,   r,   r*   r-   r$   -   s    r$   c                      sL   e Zd ZU ded< ded< eddd fddZed fddZ  ZS )BaseAzureClientzhttpx.URL | None_azure_endpoint
str | None_azure_deploymentr   retries_takenoptionsr   r7   intr%   httpx.Requestc                  sZ   |j tv r%t|jr%|jd}|d ur%dt| jjvr%d| |j  |_ t j	||dS )Nmodelz/deploymentsz/deployments/r6   )
url_deployments_endpointsr   Z	json_datagetstrbase_urlpathr'   _build_request)r)   r8   r7   r;   r*   r,   r-   rB   8   s
   zBaseAzureClient._build_requestr<   r?   	httpx.URLc                   s`   | j r*| jr*|tvr*t|}|jr(| jjdd |jd }| jj	|dS |S t
 |S )zAdjust the URL if the client was configured with an Azure endpoint + deployment
        and the API feature being called is **not** a deployments-based endpoint
        (i.e. requires /deployments/deployment-name in the URL path).
           /s   /openai/raw_path)r5   r3   r=   httpxURLZis_relative_urlrF   rstriplstrip	copy_withr'   _prepare_url)r)   r<   Z	merge_urlmerge_raw_pathr*   r,   r-   rL   F   s   
zBaseAzureClient._prepare_url)r8   r   r7   r9   r%   r:   )r<   r?   r%   rC   )r.   r/   r0   __annotations__r   rB   rL   r1   r,   r,   r*   r-   r2   4   s   
 r2   c                      s*  e Zd Zeddddddddeedddddd>d d!Zeddddddddeedddddd?d"d!Zedddddddeeddddd#d@d%d!Zdddddddddddeeddddd&dA fd(d!Zedddddddddededdddi d)dB fd0d1ZeZ	dCd2d3Z
edDd6d7ZdEd<d=Z  ZS )FAzureOpenAINF)azure_deploymentapi_versionapi_keyazure_ad_tokenazure_ad_token_providerorganizationwebhook_secretwebsocket_base_urltimeoutmax_retriesdefault_headersdefault_queryhttp_client_strict_response_validationazure_endpointr?   rP   r4   rQ   rR   str | Callable[[], str] | NonerS   rT   AzureADTokenProvider | NonerU   rV   rW   str | httpx.URL | NonerX   !float | Timeout | None | NotGivenrY   r9   rZ   Mapping[str, str] | Noner[   Mapping[str, object] | Noner\   httpx.Client | Noner]   boolr%   r&   c                C     d S Nr,   )r)   r^   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r,   r,   r-   r(   Z      zAzureOpenAI.__init__c                C  rg   rh   r,   )r)   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r,   r,   r-   r(   o      )rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r@   c                C  rg   rh   r,   )r)   r@   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r,   r,   r-   r(      rj   )rQ   r^   rP   rR   rS   rT   rU   projectrV   rW   r@   rX   rY   rZ   r[   r\   r]   rk   c                  sh  |du r
t jd}|du rt jd}|du r$|du r$|du r$td|du r.t jd}|du r6td|du r?d|i}ni |d|i}|du ru|du rUt jd}|du r]td	|durl|d
 d| }n|d
 d}n|dur}td|du rt}t j||||	|||||||
|d || _	|| _
|| _|r|nd| _|rt|| _dS d| _dS )aa  Construct a new synchronous azure openai client instance.

        This automatically infers the following arguments from their corresponding environment variables if they are not provided:
        - `api_key` from `AZURE_OPENAI_API_KEY`
        - `organization` from `OPENAI_ORG_ID`
        - `project` from `OPENAI_PROJECT_ID`
        - `azure_ad_token` from `AZURE_OPENAI_AD_TOKEN`
        - `api_version` from `OPENAI_API_VERSION`
        - `azure_endpoint` from `AZURE_OPENAI_ENDPOINT`

        Args:
            azure_endpoint: Your Azure endpoint, including the resource, e.g. `https://example-resource.azure.openai.com/`

            azure_ad_token: Your Azure Active Directory token, https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-id

            azure_ad_token_provider: A function that returns an Azure Active Directory token, will be invoked on every request.

            azure_deployment: A model deployment, if given with `azure_endpoint`, sets the base client URL to include `/deployments/{azure_deployment}`.
                Not supported with Assistants APIs.
        NAZURE_OPENAI_API_KEYAZURE_OPENAI_AD_TOKENMissing credentials. Please pass one of `api_key`, `azure_ad_token`, `azure_ad_token_provider`, or the `AZURE_OPENAI_API_KEY` or `AZURE_OPENAI_AD_TOKEN` environment variables.OPENAI_API_VERSION_Must provide either the `api_version` argument or the `OPENAI_API_VERSION` environment variableapi-versionAZURE_OPENAI_ENDPOINTuMust provide one of the `base_url` or `azure_endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable//openai/deployments//openai2base_url and azure_endpoint are mutually exclusiverR   rU   rk   rV   r@   rX   rY   rZ   r[   r\   rW   r]   osenvironr>   r   
ValueErrorrI   API_KEY_SENTINELr'   r(   _api_version_azure_ad_token_azure_ad_token_providerr5   rG   rH   r3   )r)   rQ   r^   rP   rR   rS   rT   rU   rk   rV   rW   r@   rX   rY   rZ   r[   r\   r]   r*   r,   r-   r(      d   )
rR   rU   rk   rV   rW   rQ   rS   rT   r@   rX   r\   rY   rZ   set_default_headersr[   set_default_query_extra_kwargsint | NotGivenr   r   r   Mapping[str, Any]r   c                  F   t  j||||||	|
|||||||p| j|p| j|p| jd|dS z~
        Create a new client instance re-using the same options given to the current client with optional overriding.
        )rQ   rS   rT   )rR   rU   rk   rV   rW   r@   rX   r\   rY   rZ   r   r[   r   r   r'   copyr~   r   r   r)   rR   rU   rk   rV   rW   rQ   rS   rT   r@   rX   r\   rY   rZ   r   r[   r   r   r*   r,   r-   r     *   zAzureOpenAI.copyc                 C  sH   | j d ur| j S | j}|d ur"| }|rt|ts td| |S d S NzOExpected `azure_ad_token_provider` argument to return a string but it returned )r   r   
isinstancer?   r|   r)   providertokenr,   r,   r-   _get_azure_ad_token2  s   
zAzureOpenAI._get_azure_ad_tokenr8   r   c                 C  s   t |jr
i |jni }t|}||_|  }|d ur+|dd u r)d| |d< |S | jtur>|dd u r<| j|d< |S tdNAuthorizationBearer api-keyzUnable to handle authr   headersr   r   r>   rR   r}   r|   r)   r8   r   rS   r,   r,   r-   _prepare_optionsA  s   

zAzureOpenAI._prepare_optionsr;   extra_queryr    tuple[httpx.URL, dict[str, str]]c           
      C  s   i }i || j | jp|d}| jr| jdkrd| ji}n|  }|r*dd| i}| jd urDt| j}|jdd }|j	|d}n| 
d	}|j	d
d}|j	i |d}	|	|fS N)rq   Z
deploymentz<missing API key>r   r   r   rD   s	   /realtimerE   z	/realtimewss)scheme)paramsr~   r5   rR   r   rW   rG   rH   rF   rI   rK   rL   
r)   r;   r   Zauth_headersqueryr   r@   rM   Zrealtime_urlr<   r,   r,   r-   _configure_realtimeU  s(   

zAzureOpenAI._configure_realtime) r^   r?   rP   r4   rQ   r4   rR   r_   rS   r4   rT   r`   rU   r4   rV   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   re   r]   rf   r%   r&   )rP   r4   rQ   r4   rR   r_   rS   r4   rT   r`   rU   r4   rV   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   re   r]   rf   r%   r&   )r@   r?   rQ   r4   rR   r_   rS   r4   rT   r`   rU   r4   rV   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   re   r]   rf   r%   r&   )$rQ   r4   r^   r4   rP   r4   rR   r_   rS   r4   rT   r`   rU   r4   rk   r4   rV   r4   rW   ra   r@   r4   rX   rb   rY   r9   rZ   rc   r[   rd   r\   re   r]   rf   r%   r&   )$rR   r_   rU   r4   rk   r4   rV   r4   rW   ra   rQ   r4   rS   r4   rT   r`   r@   ra   rX   rb   r\   re   rY   r   rZ   rc   r   rc   r[   rd   r   rd   r   r   r%   r   r%   r4   r8   r   r%   r   r;   r?   r   r   r%   r   r.   r/   r0   r
   r   r   r(   r   r   Zwith_optionsr   r   r   r1   r,   r,   r*   r-   rO   Y   s    j.
rO   c                      s0  e Zd Zedddddddddeedddddd>d!d"Zedddddddddeedddddd?d#d"Zeddddddddeeddddd$d@d&d"Zdddddddddddeeddddd'dA fd(d"Zedddddddddededdddi d)dB fd0d1ZeZ	dCd2d3Z
edDd6d7ZdEd<d=Z  ZS )FAsyncAzureOpenAINF)rP   rQ   rR   rS   rT   rU   rk   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r?   rP   r4   rQ   rR   )str | Callable[[], Awaitable[str]] | NonerS   rT    AsyncAzureADTokenProvider | NonerU   rk   rV   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   httpx.AsyncClient | Noner]   rf   r%   r&   c                C  rg   rh   r,   )r)   r^   rP   rQ   rR   rS   rT   rU   rk   rV   rW   rX   rY   rZ   r[   r\   r]   r,   r,   r-   r(   p  s   zAsyncAzureOpenAI.__init__c                C  rg   rh   r,   )r)   rP   rQ   rR   rS   rT   rU   rk   rV   rW   rX   rY   rZ   r[   r\   r]   r,   r,   r-   r(     ri   )rQ   rR   rS   rT   rU   rk   rV   rW   rX   rY   rZ   r[   r\   r]   r@   c                C  rg   rh   r,   )r)   r@   rQ   rR   rS   rT   rU   rk   rV   rW   rX   rY   rZ   r[   r\   r]   r,   r,   r-   r(     ri   )r^   rP   rQ   rR   rS   rT   rU   rk   rV   r@   rW   rX   rY   rZ   r[   r\   r]   c                  sh  |du r
t jd}|du rt jd}|du r$|du r$|du r$td|du r.t jd}|du r6td|du r?d|i}ni |d|i}|
du ru|du rUt jd}|du r]td	|durl|d
 d| }
n|d
 d}
n|dur}td|du rt}t j||||	|
|||||||d || _	|| _
|| _|r|nd| _|rt|| _dS d| _dS )ab  Construct a new asynchronous azure openai client instance.

        This automatically infers the following arguments from their corresponding environment variables if they are not provided:
        - `api_key` from `AZURE_OPENAI_API_KEY`
        - `organization` from `OPENAI_ORG_ID`
        - `project` from `OPENAI_PROJECT_ID`
        - `azure_ad_token` from `AZURE_OPENAI_AD_TOKEN`
        - `api_version` from `OPENAI_API_VERSION`
        - `azure_endpoint` from `AZURE_OPENAI_ENDPOINT`

        Args:
            azure_endpoint: Your Azure endpoint, including the resource, e.g. `https://example-resource.azure.openai.com/`

            azure_ad_token: Your Azure Active Directory token, https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-id

            azure_ad_token_provider: A function that returns an Azure Active Directory token, will be invoked on every request.

            azure_deployment: A model deployment, if given with `azure_endpoint`, sets the base client URL to include `/deployments/{azure_deployment}`.
                Not supported with Assistants APIs.
        Nrl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   )r)   r^   rP   rQ   rR   rS   rT   rU   rk   rV   r@   rW   rX   rY   rZ   r[   r\   r]   r*   r,   r-   r(     r   r   r   r   r   r   r   r   c                  r   r   r   r   r*   r,   r-   r     r   zAsyncAzureOpenAI.copyc                   sh   | j d ur	| j S | j}|d ur2| }t|r|I d H }|r'ttt|ts.td| t|S d S r   )	r   r   inspectisawaitabler   r	   r   r?   r|   r   r,   r,   r-   r   K  s   


z$AsyncAzureOpenAI._get_azure_ad_tokenr8   r   c                   s   t |jri |jni }t|}||_|  I d H }|d ur/|dd u r-d| |d< |S | jturB|dd u r@| j|d< |S tdr   r   r   r,   r,   r-   r   \  s   

z!AsyncAzureOpenAI._prepare_optionsr;   r   r   r   c           
        s   i }i || j | jp|d}| jr| jdkrd| ji}n|  I d H }|r.dd| i}| jd urHt| j}|jdd }|j	|d}n| 
d	}|j	d
d}|j	i |d}	|	|fS r   r   r   r,   r,   r-   r   p  s*   

z$AsyncAzureOpenAI._configure_realtime)"r^   r?   rP   r4   rQ   r4   rR   r   rS   r4   rT   r   rU   r4   rk   r4   rV   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   r   r]   rf   r%   r&   ) rP   r4   rQ   r4   rR   r   rS   r4   rT   r   rU   r4   rk   r4   rV   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   r   r]   rf   r%   r&   ) r@   r?   rQ   r4   rR   r   rS   r4   rT   r   rU   r4   rk   r4   rV   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   r   r]   rf   r%   r&   )$r^   r4   rP   r4   rQ   r4   rR   r   rS   r4   rT   r   rU   r4   rk   r4   rV   r4   r@   r4   rW   ra   rX   rb   rY   r9   rZ   rc   r[   rd   r\   r   r]   rf   r%   r&   )$rR   r   rU   r4   rk   r4   rV   r4   rW   ra   rQ   r4   rS   r4   rT   r   r@   ra   rX   rb   r\   r   rY   r   rZ   rc   r   rc   r[   rd   r   rd   r   r   r%   r   r   r   r   r   r,   r,   r*   r-   r   o  s    j.
r   )8
__future__r   rz   r   typingr   r   r   r   r   r   r	   r
   Ztyping_extensionsr   r   rG   _typesr   r   r   r   r   Z_utilsr   r   Z_clientr   r   Z_compatr   Z_modelsr   Z
_streamingr   r   _exceptionsr   Z_base_clientr   r   setr=   r?   ZAzureADTokenProviderZAsyncAzureADTokenProviderZClientZAsyncClientr   r    joinr}   r$   r2   rO   r   r,   r,   r,   r-   <module>   s8    ( %  $