U
    ·ÜŸjd  ã                   @  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)dddddddgƒ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 2dddg¡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Ú
BaseClientz/completionsz/chat/completionsz/embeddingsz/audio/transcriptionsz/audio/translationsz/audio/speechz/images/generationszstr | Awaitable[str]Ú_HttpxClientT)ÚboundÚ_DefaultStreamTÚ ú<zmissing API keyú>c                      s"   e Zd Zddœ‡ fdd„Z‡  ZS )ÚMutuallyExclusiveAuthErrorÚNone©Úreturnc                   s   t ƒ  d¡ d S )Nz€The `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__© ú4/tmp/pip-unpacked-wheel-2qj3ofc_/openai/lib/azure.pyr)   -   s    ÿz#MutuallyExclusiveAuthError.__init__)Ú__name__Ú
__module__Ú__qualname__r)   Ú__classcell__r-   r-   r+   r.   r$   ,   s   r$   c                      sZ   e Zd ZU ded< ded< eddœddd	d
œ‡ fdd„ƒZedddœ‡ fdd„ƒZ‡  ZS )ÚBaseAzureClientzhttpx.URL | NoneÚ_azure_endpointú
str | NoneÚ_azure_deploymentr   ©Úretries_takenr   Úintzhttpx.Request)Úoptionsr8   r'   c                  sZ   |j tkrJt|jƒrJ|j d¡}|d k	rJdt| jjƒkrJd|› |j › �|_ tƒ j	||d�S )NÚmodelz/deploymentsz/deployments/r7   )
ÚurlÚ_deployments_endpointsr   Z	json_dataÚgetÚstrÚbase_urlÚpathr(   Ú_build_request)r*   r:   r8   r;   r+   r-   r.   rB   7   s
    zBaseAzureClient._build_requestr?   z	httpx.URL)r<   r'   c                   s`   | j rT| jrT|tkrTt |¡}|jrP| jj d¡d |j d¡ }| jj	|d�S |S t
ƒ  |¡S )zïAdjust 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)r6   r4   r=   ÚhttpxÚURLZis_relative_urlrE   ÚrstripÚlstripÚ	copy_withr(   Ú_prepare_url)r*   r<   Z	merge_urlÚmerge_raw_pathr+   r-   r.   rK   E   s    
ÿzBaseAzureClient._prepare_url)r/   r0   r1   Ú__annotations__r   rB   rK   r2   r-   r-   r+   r.   r3   3   s   
ür3   c                      sÖ  e Zd Zedddddddeedddddœdddddddddd	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dddddd	d
dddddœdd„ƒZeddddddeedddddœddddddddd	d
dddddœdd„ƒZddddddddddeedddddœdddddddddddd	d
dddddœ‡ fdd„Zeddddddddededdddi dœdddddddddddd
d
dddddœ‡ fdd „ƒZeZ	dd!œd"d#„Z
ed$d$d%œd&d'„ƒZdd(d)d*œd+d,„Z‡  ZS )-ÚAzureOpenAINF)Úazure_deploymentÚapi_versionÚapi_keyÚazure_ad_tokenÚazure_ad_token_providerÚorganizationÚwebsocket_base_urlÚtimeoutÚmax_retriesÚdefault_headersÚdefault_queryÚhttp_clientÚ_strict_response_validationr?   r5   zAzureADTokenProvider | Noneústr | httpx.URL | Noneú!float | Timeout | None | NotGivenr9   úMapping[str, str] | NoneúMapping[str, object] | Nonezhttpx.Client | NoneÚboolr%   )Úazure_endpointrO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r'   c                C  s   d S ©Nr-   )r*   ra   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r-   r-   r.   r)   Y   s    zAzureOpenAI.__init__)rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r'   c                C  s   d S rb   r-   )r*   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r-   r-   r.   r)   m   s    )rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   )r@   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r'   c                C  s   d S rb   r-   )r*   r@   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r-   r-   r.   r)   €   s    )rP   ra   rO   rQ   rR   rS   rT   ÚprojectrU   r@   rV   rW   rX   rY   rZ   r[   )rP   ra   rO   rQ   rR   rS   rT   rc   rU   r@   rV   rW   rX   rY   rZ   r[   r'   c                  sb  |dkrt j d¡}|dkr(t j d¡}|dkrH|dkrH|dkrHtdƒ‚|dkr\t j d¡}|dkrltdƒ‚|dkr~d|i}n|d|i–}|
dkræ|dkr¦t j d¡}|dkr¶td	ƒ‚|dk	rÔ| d
¡› d|› �}
qö| d
¡› d�}
n|dk	rötdƒ‚|dk�rt}tƒ j||||
||||||	|d� || _	|| _
|| _|�rB|nd| _|�rXt |¡n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_TOKENú¯Missing 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_ENDPOINTúuMust provide one of the `base_url` or `azure_endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variableú/ú/openai/deployments/ú/openaiú2base_url and azure_endpoint are mutually exclusive©rQ   rT   rc   r@   rV   rW   rX   rY   rZ   rU   r[   ©ÚosÚenvironr>   r   Ú
ValueErrorrH   ÚAPI_KEY_SENTINELr(   r)   Ú_api_versionÚ_azure_ad_tokenÚ_azure_ad_token_providerr6   rF   rG   r4   )r*   rP   ra   rO   rQ   rR   rS   rT   rc   rU   r@   rV   rW   rX   rY   rZ   r[   r+   r-   r.   r)   “   sb    (ÿÿ
ÿ
õ©rQ   rT   rc   rU   rP   rR   rS   r@   rV   rZ   rW   rX   Úset_default_headersrY   Úset_default_queryÚ_extra_kwargsúint | NotGivenúMapping[str, Any]r   ©rQ   rT   rc   rU   rP   rR   rS   r@   rV   rZ   rW   rX   rz   rY   r{   r|   r'   c                  sD   t ƒ j||||||	|
||||||p&| j|p.| j|p6| jdœ|–d�S ©z~
        Create a new client instance re-using the same options given to the current client with optional overriding.
        )rP   rR   rS   )rQ   rT   rc   rU   r@   rV   rZ   rW   rX   rz   rY   r{   r|   ©r(   Úcopyrv   rw   rx   ©r*   rQ   rT   rc   rU   rP   rR   rS   r@   rV   rZ   rW   rX   rz   rY   r{   r|   r+   r-   r.   r‚   û   s(    ýüózAzureOpenAI.copyr&   c                 C  sH   | j d k	r| j S | j}|d k	rD|ƒ }|r2t|tƒs@td|› �ƒ‚|S d S ©NzOExpected `azure_ad_token_provider` argument to return a string but it returned )rw   rx   Ú
isinstancer?   rt   ©r*   ZproviderÚtokenr-   r-   r.   Ú_get_azure_ad_token*  s    
ÿzAzureOpenAI._get_azure_ad_tokenr   ©r:   r'   c                 C  s‚   t |jƒr|j–ni }t|ƒ}||_|  ¡ }|d k	rR| d¡d kr~d|› �|d< n,| jtk	rv| d¡d kr~| j|d< ntdƒ‚|S ©NÚAuthorizationúBearer úapi-keyzUnable to handle auth©r   Úheadersr   rˆ   r>   rQ   ru   rt   ©r*   r:   r�   rR   r-   r-   r.   Ú_prepare_options9  s    
zAzureOpenAI._prepare_optionsr   ú tuple[httpx.URL, dict[str, str]]©r;   Úextra_queryr'   c           
      C  sª   i }|| j | jp|dœ–}| jdkr0d| ji}n|  ¡ }|rJdd|› �i}| jd k	r~t | j¡}|j d¡d }|j	|d�}n|  
d	¡}|j	d
d�}|j	|–d�}	|	|fS ©N)ri   Z
deploymentz<missing API key>r�   r‹   rŒ   rC   s	   /realtimerD   z	/realtimeÚwss)Úscheme)Úparams©rv   r6   rQ   rˆ   rU   rF   rG   rE   rH   rJ   rK   ©
r*   r;   r”   Zauth_headersÚqueryr‡   r@   rL   Zrealtime_urlr<   r-   r-   r.   Ú_configure_realtimeM  s$    ý


zAzureOpenAI._configure_realtime©r/   r0   r1   r
   r   r   r)   r   r‚   Zwith_optionsrˆ   r‘   rœ   r2   r-   r-   r+   r.   rN   X   s¨   ð0ñ.ñ.î6hî8,rN   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dddddddd	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ddddddd	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ddddddd	d
dddddœdd„ƒZddddddddddeedddddœdddddddddddd	d
dddddœ‡ fdd„Zeddddddddededdddi dœdddddddddddd
d
dddddœ‡ fdd „ƒZeZ	dd!œd"d#„Z
ed$d$d%œd&d'„ƒZdd(d)d*œd+d,„Z‡  ZS )-ÚAsyncAzureOpenAINF)rO   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r?   r5   z AsyncAzureADTokenProvider | Noner\   r]   r9   r^   r_   zhttpx.AsyncClient | Noner`   r%   )ra   rO   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r'   c                C  s   d S rb   r-   )r*   ra   rO   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r-   r-   r.   r)   h  s    zAsyncAzureOpenAI.__init__)rO   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r'   c                C  s   d S rb   r-   )r*   rO   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r-   r-   r.   r)   }  s    )rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   )r@   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r'   c                C  s   d S rb   r-   )r*   r@   rP   rQ   rR   rS   rT   rc   rU   rV   rW   rX   rY   rZ   r[   r-   r-   r.   r)   ‘  s    )ra   rO   rP   rQ   rR   rS   rT   rc   r@   rU   rV   rW   rX   rY   rZ   r[   )ra   rO   rP   rQ   rR   rS   rT   rc   r@   rU   rV   rW   rX   rY   rZ   r[   r'   c                  sb  |dkrt j d¡}|dkr(t j d¡}|dkrH|dkrH|dkrHtdƒ‚|dkr\t j d¡}|dkrltdƒ‚|dkr~d|i}n|d|i–}|	dkræ|dkr¦t j d¡}|dkr¶td	ƒ‚|dk	rÔ| d
¡› d|› �}	qö| d
¡› d�}	n|dk	rötdƒ‚|dk�rt}tƒ j||||	||||||
|d� || _	|| _
|| _|�rB|nd| _|�rXt |¡n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.
        Nrd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   )r*   ra   rO   rP   rQ   rR   rS   rT   rc   r@   rU   rV   rW   rX   rY   rZ   r[   r+   r-   r.   r)   ¥  sb    (ÿÿ
ÿ
õry   r}   r~   r   r   c                  sD   t ƒ j||||||	|
||||||p&| j|p.| j|p6| jdœ|–d�S r€   r�   rƒ   r+   r-   r.   r‚     s(    ýüózAsyncAzureOpenAI.copyr&   c                 Ã  sf   | j d k	r| j S | j}|d k	rb|ƒ }t |¡r8|I d H }|rLttt|ƒtƒsZtd|› �ƒ‚t|ƒS d S r„   )	rw   rx   ÚinspectÚisawaitabler…   r	   r   r?   rt   r†   r-   r-   r.   rˆ   <  s    


ÿz$AsyncAzureOpenAI._get_azure_ad_tokenr   r‰   c                 Ã  sˆ   t |jƒr|j–ni }t|ƒ}||_|  ¡ I d H }|d k	rX| d¡d kr„d|› �|d< n,| jtk	r|| d¡d kr„| j|d< ntdƒ‚|S rŠ   rŽ   r�   r-   r-   r.   r‘   M  s    
z!AsyncAzureOpenAI._prepare_optionsr   r’   r“   c           
      Ã  s°   i }|| j | jp|dœ–}| jdkr0d| ji}n |  ¡ I d H }|rPdd|› �i}| jd k	r„t | j¡}|j d¡d }|j	|d�}n|  
d	¡}|j	d
d�}|j	|–d�}	|	|fS r•   r™   rš   r-   r-   r.   rœ   a  s$    ý


z$AsyncAzureOpenAI._configure_realtimer�   r-   r-   r+   r.   rž   g  s®   ï2ð0ð0î6hî8,rž   )8Ú
__future__r   rr   rŸ   Útypingr   r   r   r   r   r   r	   r
   Útyping_extensionsr   r   rF   Ú_typesr   r   r   r   r   Ú_utilsr   r   Z_clientr   r   Ú_compatr   Z_modelsr   Z
_streamingr   r   Ú_exceptionsr   Z_base_clientr   r   Úsetr=   r?   ZAzureADTokenProviderZAsyncAzureADTokenProviderZClientZAsyncClientr   r    Újoinru   r$   r3   rN   rž   r-   r-   r-   r.   Ú<module>   sD   (ùÿ%   