o
    ưia                     @   s   d dl mZmZmZmZmZmZmZ d dlZd dl	Z	d dlm
Z
mZ d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lm Z m!Z!m"Z" ersd dl#m$Z% e%Z&neZ&dZ'G dd dZ(dS )    )TYPE_CHECKINGAnyCallableOptionalTupleUnioncastN)ClientSessionFormData)
BaseConfig)BaseImageVariationConfig)AsyncHTTPHandlerHTTPHandler_get_httpx_client)LiteLLMAiohttpTransport)	FileTypes)HttpHandlerRequestFieldsImageResponseLlmProviders)CustomStreamWrapperModelResponseProviderConfigManager)LoggingiX  c                #   @   s0  e Zd Z			dCdeej dee deej fddZdee fdd	Z	deej fd
dZ
defddZ	dDdee defddZdd Zdd Z		dEdee dedededee deeejf dedee dedejfdd Z				dFd!edededededeeeejf  deded"ee d#ed$ee dejfd%d&Z		dGd'edededededeeejf d(ed)ed*ed+e d,eded-ed.ee d/ee fd0d1Z!dddi dfd(ed+e ded'ed)ed*ed,edeeejf ded2edee d3ed.ee dee d/eeee"ef  fd4d5Z#		dHdedededed(ed+e dedeeejf d3ed/ee de$eef fd6d7Z%d/ee de&dedede'deded)e(d*ed.ed(ee d8e)d,ede(fd9d:Z*							dId)e(d.ed(ee d8e)ded'ed*ed,eded;ee+ dee d<ed=ee dee de(fd>d?Z,d@e-defdAdBZ.dS )JBaseLLMAIOHTTPHandlerNclient_session	transport	connectorc                 C   s4   || _ |d u | _|| _|d u | _|| _|d u | _d S N)r   _owns_sessionr   _owns_transportr   Z_owns_connector)selfr   r   r    r!   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/custom_httpx/aiohttp_handler.py__init__$   s   zBaseLLMAIOHTTPHandler.__init__returnc                 C   s:   | j r| j S zt | _ d| _| j W S  ty   Y dS w )z5Get existing transport or create a new one if needed.TN)r   r   Z_create_aiohttp_transportr   	Exceptionr    r!   r!   r"   _get_or_create_transport9   s   
z.BaseLLMAIOHTTPHandler._get_or_create_transportc                 C   sF   | j r| j S | jr!t| jdr!| jj}t|rdS t|dr!|j S dS )z1Get or create a connector for the client session.clientNr   )r   r   hasattrr(   callable)r    r(   r!   r!   r"   _get_connectorG   s   
z$BaseLLMAIOHTTPHandler._get_connectorc                 C   sH   |   }| jrt| jdr| j }|S |rtj|d}|S t }|S )zGCreate a new client session using transport or connector configuration._get_valid_client_session)r   )r+   r   r)   r,   aiohttpr	   )r    r   sessionr!   r!   r"   %_create_client_session_with_transportU   s   
z;BaseLLMAIOHTTPHandler._create_client_session_with_transportdynamic_client_sessionc                 C   s*   |r|S | j r
| j S |  | _ d| _| j S )NT)r   r/   r   )r    r0   r!   r!   r"   _get_async_client_sessionf   s   
z/BaseLLMAIOHTTPHandler._get_async_client_sessionc                    sv   | j r| j js| jr| j  I dH  | jr5| jr7t| jdr9z| j I dH  W dS  ty4   Y dS w dS dS dS )z>Close the aiohttp client session and transport if we own them.Naclose)	r   closedr   closer   r   r)   r2   r%   r&   r!   r!   r"   r4   s   s(   
zBaseLLMAIOHTTPHandler.closec                 C   s   | j durb| j jsd| jrfzKddl}z| }| r"||   n||   W W dS W W dS  t	yW   |
 }|| z||   W |  n|  w Y W dS w  tya   Y dS w dS dS dS )z
        Cleanup: close aiohttp session on instance destruction.

        Provides defense-in-depth for issue #12443 - ensures cleanup happens
        even if atexit handler doesn't run (abnormal termination).
        Nr   )r   r3   r   asyncioget_event_loop
is_runningcreate_taskr4   run_until_completeRuntimeErrornew_event_loopset_event_loopr%   )r    r5   loopr!   r!   r"   __del__   s0   

zBaseLLMAIOHTTPHandler.__del__Fasync_client_sessionprovider_configapi_baseheadersdatatimeoutlitellm_params	form_datastreamc
                    s   |j }
d}| j|d}tt|
dD ]E}z|j||||dI dH }|js)|  W n- tjyE } zt	|d|j
 | j||dd}~w tyW } z| j||dd}~ww  |du re|jddi d	|S )
zbCommon implementation across stream + non-stream calls. Meant to ensure consistent error-handling.N)r0      )urlrB   jsonrC   texter@   No response from the API  error_messagestatus_coderB   )'max_retry_on_unprocessable_entity_errorr1   rangemaxpostokraise_for_statusr-   ZClientResponseErrorsetattrmessage_handle_errorr%   get_error_class)r    r?   r@   rA   rB   rC   rD   rE   rF   rG   rS   responseirM   r!   r!   r"   _make_common_async_call   sD   z-BaseLLMAIOHTTPHandler._make_common_async_callsync_httpx_clientfilescontentparamsc                 C   s   |j }d }tt|dD ]V}z|j||||||	|
|d}W nD tjyO } z%|d |k}|j||d}|rD|sD|j||d}W Y d }~q| j||dd }~w t	ya } z| j||dd }~ww  |d u ro|j
ddi d|S )	NrH   )rI   rB   rC   rD   rG   ra   rb   rc   )rM   rE   )rM   request_datarL   rN   rO   rP   )rS   rT   rU   rV   httpxZHTTPStatusErrorZ9should_retry_llm_api_inside_llm_translation_on_http_errorZ/transform_request_on_unprocessable_entity_errorr[   r%   r\   )r    r`   r@   rA   rB   rC   rD   rE   rG   ra   rb   rc   rS   r]   r^   rM   Zhit_max_retryZshould_retryr!   r!   r"   _make_common_sync_call   sP   

z,BaseLLMAIOHTTPHandler._make_common_sync_callcustom_llm_providermodelmodel_responselogging_objmessagesoptional_paramsencodingapi_keyr(   c                    sJ   | j |||||||ddI d H }|j||||	|||
|||d
I d H }|S )NF)r?   r@   rA   rB   rC   rD   rE   rG   
rh   raw_responseri   rj   rn   rd   rk   rl   rE   rm   )r_   transform_response)r    rg   r@   rA   rB   rC   rD   rh   ri   rj   rk   rl   rE   rm   rn   r(   	_responseZ_transformed_responser!   r!   r"   async_completion  s0   
z&BaseLLMAIOHTTPHandler.async_completionacompletionfake_streamc                 C   s  t j|t|d}|d u rtd| d| |j||pi ||||
|d}|j|||||
|d}|j||||
|d}|j|||||dd |d	u rl| j	||||||	|||||||
||d urht
|trh|d
S d d
S |d	u r|d	urx||d< | j||||||||	||d urt
|tr|nd |
d\}}t||||dS |d u st
|tst }n|}| j|||||	|
|d}|j|||||||||
|d
S )Nrh   providerz%Provider config not found for model: z and provider: rn   rB   rh   rk   rl   rE   rA   rA   rn   rh   rl   rE   rG   )rh   rk   rl   rE   rB   )complete_input_dictrA   rB   inputrn   additional_argsT)rg   r@   rA   rB   rC   rD   rh   ri   rj   rn   rk   rl   rE   rm   r(   rG   )r@   rA   rB   rC   rh   rk   rj   rD   ru   r(   rE   )completion_streamrh   rg   rj   )r`   r@   rA   rB   rD   rE   rC   ro   )r   Zget_provider_chat_configlitellmr   
ValueErrorvalidate_environmentget_complete_urlZtransform_requestpre_callrs   
isinstancer	   make_sync_callr   r   r   rf   rq   )r    rh   rk   rA   rg   ri   rm   rj   rl   rD   rE   rt   rG   ru   rn   rB   r(   r@   rC   r~   r`   r]   r!   r!   r"   
completionA  s   

		

	z BaseLLMAIOHTTPHandler.completionc              
   C   s   |d u s	t |tst }n|}d}|
du rd}| j||||||	||d}|
du r2|j| dd}n	|j| dd}|j|ddd|id |t|j	fS )	NTF)r`   r@   rA   rB   rC   rD   rE   rG   )Zstreaming_responseZsync_stream zfirst stream response receivedrz   )r|   rn   original_responser}   )
r   r   r   rf   Zget_model_response_iteratorrJ   
iter_lines	post_calldictrB   )r    r@   rA   rB   rC   rh   rk   rj   rE   rD   ru   r(   r`   rG   r]   r~   r!   r!   r"   r     s<   z$BaseLLMAIOHTTPHandler.make_sync_callimagec                    s   d }d|v r9d|v r9t  }|d  D ]\}}|j||d |d |d d q|d  D ]
\}}||| q.| j|||||d urEd ntt||||dd	I d H }|	j|
|j||d	d
 |j||||	tt||||d |
d
I d H S )Nra   rC   rH   r      )filenamecontent_typeF)	r?   r@   rA   rB   rC   rF   rD   rE   rG   rB   rA   rn   r   r}   
rh   ri   rp   rj   rd   r   rl   rE   rm   rn   )	r
   itemsZ	add_fieldr_   r   r   r   rK   Z(async_transform_response_image_variation)r    r(   r@   rA   rB   rC   rD   rE   ri   rj   rn   rh   r   rl   rF   kvkeyvaluerr   r!   r!   r"   async_image_variations  sL    
z,BaseLLMAIOHTTPHandler.async_image_variationsprint_verboseaimage_variationorganizationc                 C   sf  |d u rt dtj|t|d}|d u rt d| d|j|||||	dd}|j||p.i |ddd	g||	|d
}|j||||d}|jd|||| dd |		ddrh| j
||||||||||	||dS |d u sqt|tsut }n|}| j||||||	d|	dpi |	d|	d|	dd}|j||j||dd |j||||tt||||	d |d
S )Nz1model is required for non-openai image variationsrv   z$image variation provider not found: .Fry   usertest)Zrolerb   rx   )rh   r   rl   rB   r   )rB   rA   rz   r{   Z
async_call)rA   rC   rB   ri   rj   rh   rD   r(   rl   rE   r   r@   rC   ra   rb   rc   )r`   r@   rA   rB   rD   rE   rG   rC   ra   rb   rc   r   r   r   )r   r   Z#get_provider_image_variation_configr   r   r   Z!transform_request_image_variationr   copygetr   r   r   r   rf   r   rK   Z"transform_response_image_variationr   r   )r    ri   rn   rh   r   rD   rg   rj   rl   rE   r   rA   r   Z	logger_fnr(   r   rB   r@   rC   r`   r]   r!   r!   r"   image_variationsA  s   
	



z&BaseLLMAIOHTTPHandler.image_variationsrM   c                 C   s   t |dd}t |dd }t |dt|}t |dd }|d u r&|r&t |dd }|r3t|dr3t |d|}|r:t|}ni }|j|||d)NrR   i  rB   rK   r]   rP   )getattrstrr)   r   r\   )r    rM   r@   rR   Zerror_headersZ
error_textZerror_responser!   r!   r"   r[     s    
z#BaseLLMAIOHTTPHandler._handle_error)NNNr   )NF)FNNN)NN)FN)NNFNNNN)/__name__
__module____qualname__r   r-   r	   r   ZBaseConnectorr#   r'   r+   r/   r1   r4   r>   r   r   r   r   floatre   Timeoutr
   boolZClientResponser_   r   r   Responserf   r   LiteLLMLoggingObjlistrs   r   r   r   r   r   r   r   r   r   r   r   r%   r[   r!   r!   r!   r"   r   #   s   

,	

9	

J	

7	

 	


4	

I	

 r   ))typingr   r   r   r   r   r   r   r-   re   r	   r
   r   Zlitellm.litellm_core_utilsZlitellm.typesZlitellm.types.utilsZ)litellm.llms.base_llm.chat.transformationr   Z5litellm.llms.base_llm.image_variations.transformationr   Z&litellm.llms.custom_httpx.http_handlerr   r   r   Z+litellm.llms.custom_httpx.aiohttp_transportr   Zlitellm.types.llms.openair   r   r   r   Zlitellm.utilsr   r   r   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr   DEFAULT_TIMEOUTr   r!   r!   r!   r"   <module>   s*   $ 