
    ia                        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r	d dl#m$Z% e%Z&neZ&dZ' G d d      Z(y)    )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            #          e Zd Z	 	 	 d4deej
                     dee   deej                     fdZdee   fdZ	deej                     fdZ
defd	Z	 d5d
ee   defdZd Zd Z	 	 d6d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j0                  fdZ	 	 	 	 d7d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j8                  fdZ	 	 d8d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d'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d(edee   d)ed%ee   dee   d&eeee"ef      fd*Z#	 	 d9dededededed"e dedeeej*                  f   d)ed&ee   de$eef   fd+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   d,e)d#ede(fd-Z*	 	 	 	 	 	 	 d:d e(d%edee   d,e)deded!ed#eded.ee+   dee   d/ed0ee   dee   de(fd1Z,d2e-defd3Z.y);BaseLLMAIOHTTPHandlerNclient_session	transport	connectorc                 d    || _         |d u | _        || _        |d u | _        || _        |d u | _        y N)r   _owns_sessionr   _owns_transportr   _owns_connector)selfr   r   r   s       z/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/aiohttp_handler.py__init__zBaseLLMAIOHTTPHandler.__init__$   sN     -d" 	 # 	 # 	    returnc                     | j                   r| j                   S 	 t        j                         | _         d| _        | j                   S # t        $ r Y yw xY w)z5Get existing transport or create a new one if needed.TN)r   r   _create_aiohttp_transportr"   	Exceptionr$   s    r%   _get_or_create_transportz.BaseLLMAIOHTTPHandler._get_or_create_transport9   sL    >>>>!	-GGIDN#'D >>! 		s   +A 	AAc                     | j                   r| j                   S | j                  rPt        | j                  d      r:| j                  j                  }t	        |      ryt        |d      r|j                   S y)z1Get or create a connector for the client session.clientNr   )r   r   hasattrr/   callable)r$   r/   s     r%   _get_connectorz$BaseLLMAIOHTTPHandler._get_connectorG   sZ    >>>>!^^ A^^**F-'''r'   c                     | j                         }| j                  r2t        | j                  d      r| j                  j                         }|S |rt	        j
                  |      }|S t	        j
                         }|S )zGCreate a new client session using transport or connector configuration._get_valid_client_session)r   )r2   r   r0   r4   aiohttpr
   )r$   r   sessions      r%   %_create_client_session_with_transportz;BaseLLMAIOHTTPHandler._create_client_session_with_transportU   si    '')	>>gdnn6QRnn>>@GN++i@GN ++-GNr'   dynamic_client_sessionc                     |r|S | j                   r| j                   S | j                         | _         d| _        | j                   S )NT)r   r7   r!   )r$   r8   s     r%   _get_async_client_sessionz/BaseLLMAIOHTTPHandler._get_async_client_sessionf   sI     "))  &&& #'"L"L"ND!%D&&&r'   c                 z  K   | j                   rD| j                   j                  s.| j                  r"| j                   j                          d{    | j                  rH| j
                  r;t        | j                  d      r$	 | j                  j                          d{    yyyy7 Y7 
# t        $ r Y yw xY ww)z>Close the aiohttp client session and transport if we own them.Naclose)	r   closedr!   closer   r"   r0   r<   r+   r,   s    r%   r>   zBaseLLMAIOHTTPHandler.closes   s      ''..""%%++--- NN$$1nn++--- 2 % 	 . . sH   AB;B(2B;B, B* B, $B;*B, ,	B85B;7B88B;c                 <   | j                   | j                   j                  st| j                  rg	 ddl}	 |j	                         }|j                         r |j                  | j                                n |j                  | j                                yyyyy# t        $ rj |j                         }|j                  |       	 |j                  | j                                |j                          n# |j                          w xY wY yw xY w# t        $ r Y yw xY w)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   r=   r!   asyncioget_event_loop
is_runningcreate_taskr>   run_until_completeRuntimeErrornew_event_loopset_event_loopr+   )r$   r@   loops      r%   __del__zBaseLLMAIOHTTPHandler.__del__   s     +''..""%"113D(++DJJL9 //

= : # / , $ %"113D**40%//

=



%  sG   D AB *DC4#D4DD	D DD 	DDFasync_client_sessionprovider_configapi_baseheadersdatatimeoutlitellm_params	form_datastreamc
                   K   |j                   }
d}| j                  |      }t        t        |
d            D ]=  }	 |j	                  ||||       d{   }|j
                  s|j                           n ||j                  ddi 	      |S 7 ;# t        j                  $ r/}t        |d|j                         | j                  ||      d}~wt        $ r}| j                  ||      d}~ww xY ww)
zbCommon implementation across stream + non-stream calls. Meant to ensure consistent error-handling.N)r8      )urlrM   jsonrN   texterK   No response from the API  error_messagestatus_coderM   )'max_retry_on_unprocessable_entity_errorr:   rangemaxpostokraise_for_statusr5   ClientResponseErrorsetattrmessage_handle_errorr+   get_error_class)r$   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   r_   responseirY   s                 r%   _make_common_async_callz-BaseLLMAIOHTTPHandler._make_common_async_call   s*     CC 	0 6:#==#7  >  
 sBAFGAO!5!:!: #"	 "; "   {{--/  H" !118 2   - .. O6199-((1o(NN O((1o(NNOsF   9C6BB B5C6BC3%*CC3C..C33C6sync_httpx_clientfilescontentparamsc                    |j                   }d }t        t        |d            D ]  }	 |j                  ||||||	|
|      } n ||j                  ddi       |S # t        j
                  $ rO}|dz   |k(  }|j                  ||      }|r|s|j                  ||      }Y d }~| j                  ||      d }~wt        $ r}| j                  ||      d }~ww xY w)	NrT   )rU   rM   rN   rO   rR   rn   ro   rp   )rY   rP   )rY   request_datarX   rZ   r[   r\   )r_   r`   ra   rb   httpxHTTPStatusError9should_retry_llm_api_inside_llm_translation_on_http_error/transform_request_on_unprocessable_entity_errorrh   r+   ri   )r$   rm   rK   rL   rM   rN   rO   rP   rR   rn   ro   rp   r_   rj   rk   rY   hit_max_retryshould_retrys                     r%   _make_common_sync_callz,BaseLLMAIOHTTPHandler._make_common_sync_call   s=    CC 	0 .2sBAFGAO,11 ##!#! 2 	4 9 H< !118 2   3 (( S !A)P P.hh  i    'WWd X  
 ,,q/,RR O((1o(NNOs)   AC/2B9&B99CCCcustom_llm_providermodelmodel_responselogging_objmessagesoptional_paramsencodingapi_keyr/   c                    K   | j                  |||||||d       d {   }|j                  ||||	|||
|||
       d {   }|S 7 )7 w)NF)rJ   rK   rL   rM   rN   rO   rP   rR   
r{   raw_responser|   r}   r   rr   r~   r   rP   r   )rl   transform_response)r$   rz   rK   rL   rM   rN   rO   r{   r|   r}   r~   r   rP   r   r   r/   	_response_transformed_responses                     r%   async_completionz&BaseLLMAIOHTTPHandler.async_completion  s     $ 66!'+) 7 	
 	
	 '6&H&H")#+) 'I '
 !
 %$-	
!
s!   AA	"AAAAacompletionfake_streamc                    t        j                  |t        j                  |            }|t	        d| d|       |j                  ||xs i ||||
|      }|j                  |||||
|      }|j                  ||||
|      }|j                  |||||d       |d	u r9| j                  ||||||	|||||||
||t        |t              r|
      S d 
      S |d	u rK|d	ur||d<   | j                  ||||||||	||t        |t              r|nd |
      \  }}t        ||||      S |t        |t              st               }n|}| j!                  |||||	|
|      }|j#                  |||||||||
|
      S )Nr{   providerz%Provider config not found for model: z and provider: r   rM   r{   r~   r   rP   rL   rL   r   r{   r   rP   rR   )r{   r~   r   rP   rM   )complete_input_dictrL   rM   inputr   additional_argsT)rz   rK   rL   rM   rN   rO   r{   r|   r}   r   r~   r   rP   r   r/   rR   )rK   rL   rM   rN   r{   r~   r}   rO   r   r/   rP   )completion_streamr{   rz   r}   )rm   rK   rL   rM   rO   rP   rN   r   )r   get_provider_chat_configlitellmr   
ValueErrorvalidate_environmentget_complete_urltransform_requestpre_callr   
isinstancer
   make_sync_callr   r   r   ry   r   )r$   r{   r~   rL   rz   r|   r   r}   r   rO   rP   r   rR   r   r   rM   r/   rK   rN   r   rm   rj   s                         r%   
completionz BaseLLMAIOHTTPHandler.completionA  sr   & 0HH'"6"67J"K
 "7woNaMbc  "66Mr+) 7 
 #33+) 4 
 00+) 1 
 	'+$" 	 	
 $(($7 /!-'! /-! )j.O ! )  $ % )  , T>$&!'X)-)<)< /!!'' )j.M - *= *&w" '"3$7'	  >FK!@ 1 3 &../+) / 
 11!)#+) 2 
 	
r'   c           
      l   |t        |t              st               }n|}d}|
du rd}| j                  ||||||	||      }|
du r"|j	                  |j                         d      }n!|j	                  |j                         d      }|j                  |ddd|i       |t        |j                        fS )	NTF)rm   rK   rL   rM   rN   rO   rP   rR   )streaming_responsesync_stream zfirst stream response receivedr   )r   r   original_responser   )
r   r   r   ry   get_model_response_iteratorrV   
iter_lines	post_calldictrM   )r$   rK   rL   rM   rN   r{   r~   r}   rP   rO   r   r/   rm   rR   rj   r   s                   r%   r   z$BaseLLMAIOHTTPHandler.make_sync_call  s     >FK!@ 1 3 &$F../+) / 	
 $ / K K#+==? !L ! !0 K K#+#6#6#8d !L !
 	>2D9	 	 	
 !$x'7'7"888r'   imagec                   K   d }d|v rtd|v rpt               }|d   j                         D ]#  \  }}|j                  ||d   |d   |d          % |d   j                         D ]  \  }}|j                  ||        | j                  |||||d nt	        t
        |      |||d	       d {   }|	j                  |
|j                  ||d	
       |j                  ||||	t	        t
        |      |||d |

       d {   S 7 V7 w)Nrn   rN   rT   r      )filenamecontent_typeF)	rJ   rK   rL   rM   rN   rQ   rO   rP   rR   rM   rL   r   r   r   
r{   r|   r   r}   rr   r   r   rP   r   r   )	r   items	add_fieldrl   r	   r   r   rW   (async_transform_response_image_variation)r$   r/   rK   rL   rM   rN   rO   rP   r|   r}   r   r{   r   r   rQ   kvkeyvaluer   s                       r%   async_image_variationsz,BaseLLMAIOHTTPHandler.async_image_variations  sK    " )-	d?v~ 
IW++-1##Aqtad1#N . #6l002
U##C/ 3 66!'+".Dt4D) 7 

 

	 	'nn"$ 	 	
 %MM)"#dD)+) N 
 
 	
/

.
s%   B*D,D-AD>D?DDprint_verboseaimage_variationorganizationc                 J   |t        d      t        j                  |t        |            }|t        d| d      |j	                  |||||	d      }|j                  ||xs i |ddd	g||	|
      }|j                  ||||      }|j                  d||||j                         d       |	j                  dd      r| j                  ||||||||||	||      S |t        |t              st               }n|}| j                  ||||||	d|j                  d      xs i |j                  d      |j                  d      |j                  d            }|j                  ||j                   ||d       |j#                  ||||t%        t&        |      |||	d |
      S )Nz1model is required for non-openai image variationsr   z$image variation provider not found: .Fr   usertest)rolero   r   )r{   r   r   rM   r   )rM   rL   r   r   
async_call)rL   rN   rM   r|   r}   r{   rO   r/   r   rP   r   rK   rN   rn   ro   rp   )rm   rK   rL   rM   rO   rP   rR   rN   rn   ro   rp   r   r   r   )r   r   #get_provider_image_variation_configr   r   r   !transform_request_image_variationr   copygetr   r   r   r   ry   r   rW   "transform_response_image_variationr	   r   )r$   r|   r   r{   r   rO   rz   r}   r   rP   r   rL   r   	logger_fnr/   r   rM   rK   rN   rm   rj   s                        r%   image_variationsz&BaseLLMAIOHTTPHandler.image_variationsA  s>   & =PQQ/SS!"56

 "67J6K1M  #33+) 4 
 "66Mr%&9:+) 7 
 @@+	 A 
 	"$'+yy{ 	 	
 lE2..!-' /- / /   >FK!@ 1 3 &../+)&!'R((7#HHY'88H% / 
 	&mm"$ 	 	
 AA)!#dD)+) B 
 	
r'   rY   c                    t        |dd      }t        |dd       }t        |dt        |            }t        |dd       }||rt        |dd       }|rt        |d      rt        |d|      }|rt        |      }ni }|j	                  |||      )Nr^   i  rM   rW   rj   r\   )getattrstrr0   r   ri   )r$   rY   rK   r^   error_headers
error_texterror_responses          r%   rh   z#BaseLLMAIOHTTPHandler._handle_error  s    a49d3QA/
 J5 ^#NItDMgnf= DJ /MM--$#! . 
 	
r'   )NNNr    )NF)FNNN)NN)FN)NNFNNNN)/__name__
__module____qualname__r   r5   r
   r   BaseConnectorr&   r-   r2   r7   r:   r>   rI   r   r   r   r   floatrs   Timeoutr   boolClientResponserl   r   r   Responsery   r   LiteLLMLoggingObjlistr   r   r   r   r   r   r   r   r   r   r   r   r+   rh    r'   r%   r   r   #   s    ;?7;59	
 !6!67
 34
 G112	
*(3J*K )>)> ? } $ AE'&.}&='	',!X )-.&}5. $. 	.
 . tn. uemm+,. . H%. . 
		.r  $!%9&9 $9 	9
 9 9 %u}} 4569 9 9 ~9 9 9 
9T "&*.!(% (% $(% 	(%
 (% (% uemm+,(% (% &(% '(% (% (% (% (% #(%  '!(%n "'!!%"$PT#L
L
 L
 	L

 !L
 &L
 'L
 L
 uemm+,L
 L
 L
 L
 L
 #L
  $!L
" {,<mKLM#L
r "(,29#29 29 	29
 29 29 29 29 uemm+,29 29 %29 
sDy	29h<
'<
 2<
 	<

 <
 '<
 <
 <
 &<
 '<
 <
 }<
 <
 <
 
<
R -1"&!&&*"&#~
%~
 ~
 }	~

 ~
 ~
 !~
 '~
 ~
 ~
  )~
 3-~
 ~
  sm!~
" $#~
$ 
%~
@
y 
: 
r'   r   ))typingr   r   r   r   r   r   r	   r5   rs   r
   r   r   litellm.litellm_core_utilslitellm.typeslitellm.types.utils)litellm.llms.base_llm.chat.transformationr   5litellm.llms.base_llm.image_variations.transformationr   &litellm.llms.custom_httpx.http_handlerr   r   r   +litellm.llms.custom_httpx.aiohttp_transportr   litellm.types.llms.openair   r   r   r   litellm.utilsr   r   r   *litellm.litellm_core_utils.litellm_loggingr   _LiteLLMLoggingObjr   DEFAULT_TIMEOUTr   r   r'   r%   <module>r      sm    M M M   +  !   @ 
 P / U U S SX*o

 o

r'   