
    3fi                    \   d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZ ddlZddlmZ  G d d	ej"                        Z G d
 dej&                        Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZe
	 	 	 	 	 	 dd       Ze
	 	 	 	 	 	 dd       Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 ddZy)zHelpers for creating OpenAI API clients.

This module allows for the caching of httpx clients to avoid creating new instances
for each instance of ChatOpenAI.

Logic is largely replicated from openai._base_client.
    )annotationsN)	AwaitableCallable)	lru_cache)Anycast)	SecretStrc                      e Zd ZdZddZy)_SyncHttpxClientWrapper"Borrowed from openai._base_client.c                ^    | j                   ry 	 | j                          y # t        $ r Y y w xY wN)	is_closedclose	Exceptionselfs    h/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_openai/chat_models/_client_utils.py__del__z_SyncHttpxClientWrapper.__del__   s,    >>	JJL 		s     	,,NreturnNone__name__
__module____qualname____doc__r        r   r   r      s
    ,r   r   c                      e Zd ZdZddZy)_AsyncHttpxClientWrapperr   c                    | j                   ry 	 t        j                         j                  | j	                                y # t
        $ r Y y w xY wr   )r   asyncioget_running_loopcreate_taskacloser   r   s    r   r   z _AsyncHttpxClientWrapper.__del__&   s@    >>	$$&224;;=A 		s   1A 	AANr   r   r   r   r   r!   r!   #   s
    ,r   r!   c                f    t        | xs# t        j                  j                  d      xs d|      S NOPENAI_BASE_URLzhttps://api.openai.com/v1base_urltimeout)r   osenvirongetr*   s     r   _build_sync_httpx_clientr0   1   s5     # '::>>+,'&	 r   c                f    t        | xs# t        j                  j                  d      xs d|      S r(   )r!   r-   r.   r/   r*   s     r   _build_async_httpx_clientr2   <   s5     $ '::>>+,'&	 r   c                    t        | |      S r   )r0   r*   s     r   _cached_sync_httpx_clientr4   G   s     $Hg66r   c                    t        | |      S r   )r2   r*   s     r   _cached_async_httpx_clientr6   N   s     %Xw77r   c                h    	 t        |       t        | |      S # t        $ r t        | |      cY S w xY wzpGet default httpx client.

    Uses cached client unless timeout is `httpx.Timeout`, which is not hashable.
    )hashr4   	TypeErrorr0   r*   s     r   _get_default_httpx_clientr;   U   s;    <W )7;;  ;''::;    11c                h    	 t        |       t        | |      S # t        $ r t        | |      cY S w xY wr8   )r9   r6   r:   r2   r*   s     r   _get_default_async_httpx_clientr>   d   s;    =W *(G<<  <(7;;<r<   c                     t         t              r$ j                         } j                         }||fS t               r5t	        j
                         r }d}||fS t        t               }d fd}|}fS )zResolve sync and async API key values.

    Because OpenAI and AsyncOpenAI clients support either sync or async callables for
    the API key, we need to resolve separate values here.
    Nc                    K   t        j                         j                  d t        t                      d {   S 7 wr   )r#   get_event_looprun_in_executorr   r   )api_keys   r   async_api_key_wrapperz?_resolve_sync_and_async_api_keys.<locals>.async_api_key_wrapper   s9     $335EE$x1   s   6A >A )r   str)
isinstancer	   get_secret_valuecallableinspectiscoroutinefunctionr   r   )rC   sync_api_key_valueasync_api_key_valuerD   s   `   r    _resolve_sync_and_async_api_keysrM   s   s     '9%=D=U=U=W$$& 	" 222 
'	&&w/")!% 222 "&h!8
 #8222r   )r+   
str | Noner,   r   r   r   )r+   rN   r,   r   r   r!   )rC   z<SecretStr | Callable[[], str] | Callable[[], Awaitable[str]]r   zItuple[str | None | Callable[[], str], str | Callable[[], Awaitable[str]]])r   
__future__r   r#   rI   r-   collections.abcr   r   	functoolsr   typingr   r   openaipydanticr	   DefaultHttpxClientr   DefaultAsyncHttpxClientr!   r0   r2   r4   r6   r;   r>   rM   r   r   r   <module>rW      s,   #   	 /    
f77 
v== #&#& 77#&77 7 88#&88 8<<#&<<==#&==3I3N3r   