
    it                        d Z ddlmZmZmZmZmZmZ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 ddlmZmZmZ ddl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'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 erddl8m9Z: ddlm;Z; ddl%m<Z< e:Z=neZ= G d dee!      Z> G d de      Z?y)z
Support for gpt model family
    )TYPE_CHECKINGAnyAsyncIterator	CoroutineDictIteratorListLiteralOptionalTupleUnioncastoverloadN)map_finish_reason)_extract_reasoning_content#_handle_invalid_parallel_tool_calls&_should_convert_tool_call_to_json_mode)get_tool_call_names)async_convert_url_to_base64convert_url_to_base64)BaseModelResponseIterator)BaseLLMModelInfo)
BaseConfigBaseLLMException)get_secret_str)AllMessageValuesChatCompletionFileObjectChatCompletionFileObjectFileChatCompletionImageObjectChatCompletionImageUrlObjectOpenAIChatCompletionChoicesOpenAIMessageContentListBlock)ChatCompletionMessageToolCallChoicesFunctionMessageModelResponseModelResponseStream) convert_to_model_response_object   )OpenAIError)Logging)BaseTokenCounterChatCompletionToolParamc                   P    e Zd ZU dZdZdZee   ed<   dZ	ee
eef      ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee
eef      ed<   dZee   ed<   dZee   ed<   dZee   ed<   	 	 	 	 	 	 	 	 	 	 	 dNdee   dee
eef      dee   dee   dee   d	ee   d
ee   dee
eef      dee   dee   dee   ddfdZe fd       ZdedefdZdededededef
dZdededededef
dZdedefdZdedefdZ dedefdZ!dedefdZ"de#de#fdZ$de#de#fdZ%	 dOde#d!ede#fd"Z&e'd#e(e)   ded!e*d   de+e,e,e(e)   f   fd$       Z-e'	 dOd#e(e)   ded!e*d    de(e)   fd%       Z-	 dOd#e(e)   ded!ede
e(e)   e+e,e,e(e)   f   f   fd&Z-	 dPded#e(e)   d'ee(d(      de.e(e)   ee(d(      f   fd)Z/ded#e(e)   ded*ed+edefd,Z0ded#e(e)   ded*ed+edefd-Z1dedefd.Z2d/ededee3   fd0Z4d1e5d2edefd3Z6	 	 dQd4e(e7   d5ee   dee   de(e8   fd6Z9	 	 dQded7e:jv                  d8e<d9e=d:ed#e(e)   ded*ed;e,d<ee   d5ee   de<fd=Z>d>ed?ed+e
ee:j~                  f   de@fd@ZA	 dPdAee   d<ee   deded*edBee   defdCZB	 	 dQd+eded#e(e)   ded*ed<ee   dAee   defdDZC	 dQd<ee   dAee   de(e   fdEZDeEdPd<ee   dee   fdF       ZFeEdPdAee   dee   fdG       ZGeEdPdee   dee   fdH       ZHdedI   fdJZI	 dOdKe
eJe   eKe   e<f   dLed5ee   de,fdMZL xZMS )ROpenAIGPTConfiga  
    Reference: https://platform.openai.com/docs/api-reference/chat/create

    The class `OpenAIConfig` provides configuration for the OpenAI's Chat API interface. Below are the parameters:

    - `frequency_penalty` (number or null): Defaults to 0. Allows a value between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, thereby minimizing repetition.

    - `function_call` (string or object): This optional parameter controls how the model calls functions.

    - `functions` (array): An optional parameter. It is a list of functions for which the model may generate JSON inputs.

    - `logit_bias` (map): This optional parameter modifies the likelihood of specified tokens appearing in the completion.

    - `max_tokens` (integer or null): This optional parameter helps to set the maximum number of tokens to generate in the chat completion.

    - `n` (integer or null): This optional parameter helps to set how many chat completion choices to generate for each input message.

    - `presence_penalty` (number or null): Defaults to 0. It penalizes new tokens based on if they appear in the text so far, hence increasing the model's likelihood to talk about new topics.

    - `stop` (string / array / null): Specifies up to 4 sequences where the API will stop generating further tokens.

    - `temperature` (number or null): Defines the sampling temperature to use, varying between 0 and 2.

    - `top_p` (number or null): An alternative to sampling with temperature, used for nucleus sampling.
    TNfrequency_penaltyfunction_call	functions
logit_bias
max_tokensnpresence_penaltystoptemperaturetop_presponse_formatreturnc                     t               j                         }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' d| j                  _        y )NselfF)localscopyitemssetattr	__class___is_base_class)r?   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   locals_keyvalues                  |/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/openai/chat/gpt_transformation.py__init__zOpenAIGPTConfig.__init__p   sO     (--/!--/JCf}!2U3 * ).%    c                      t         |          S N)super
get_config)clsrD   s    rI   rO   zOpenAIGPTConfig.get_config   s    w!##rK   modelc                     g d}g }|dk7  r|dk7  r|j                  d       d|v r|j                  dd      d   n|}|t        j                  v s|t        j                  v r|j                  d       ||z   S )N)r2   r5   logprobstop_logprobsr6   max_completion_tokens
modalities
predictionr7   r8   seedr9   streamstream_optionsr:   r;   toolstool_choicer3   r4   max_retriesextra_headersparallel_tool_callsaudioweb_search_optionsservice_tiersafety_identifierprompt_cache_keyprompt_cache_retentionstorezgpt-3.5-turbo-16kzgpt-4r<   z
responses/   user)appendsplitlitellmopen_ai_chat_completion_modelsopen_ai_text_completion_models)r?   rQ   base_paramsmodel_specific_paramsmodel_for_checks        rI   get_supported_openai_paramsz+OpenAIGPTConfig.get_supported_openai_params   s    
B !#((Ug-=!(():; 0<u/DEKKa(+% 	 wEEE F FF!(( 222rK   non_default_paramsoptional_paramsdrop_paramsc                 l    | j                  |      }|j                         D ]  \  }}||v s|||<    |S )a  
        If any supported_openai_params are in non_default_params, add them to optional_params, so they are use in API call

        Args:
            non_default_params (dict): Non-default parameters to filter.
            optional_params (dict): Optional parameters to update.
            model (str): Model name for parameter support check.

        Returns:
            dict: Updated optional_params with supported non-default parameters.
        )rq   rB   )r?   rr   rs   rQ   rt   supported_openai_paramsparamrH   s           rI   _map_openai_paramsz"OpenAIGPTConfig._map_openai_params   sG    $ #'"B"B5"I.446LE5//).& 7 rK   c                 ,    | j                  ||||      S )N)rr   rs   rQ   rt   )rx   )r?   rr   rs   rQ   rt   s        rI   map_openai_paramsz!OpenAIGPTConfig.map_openai_params   s(     &&1+#	 ' 
 	
rK   content_itemc                 ^    g d}|j                  d      rt        fd|D              ryy)N)zhttps://zhttp://zwww.file_idc              3   @   K   | ]  }j                  |        y wrM   )
startswith).0startr}   s     rI   	<genexpr>z3OpenAIGPTConfig.contains_pdf_url.<locals>.<genexpr>   s!      
3K%Gu%3Ks   TF)getany)r?   r{   potential_pdf_url_startsr}   s      @rI   contains_pdf_urlz OpenAIGPTConfig.contains_pdf_url   s8    #B ""9-s 
3K
 
 rK   c                     |j                         }|j                  d      }|&t        |      }||d<   d|d<   |j                  d       |S Nr}   	file_datamy_file.pdffilename)rA   r   r   pop)r?   r{   content_copyr}   base64_datas        rI   _handle_pdf_urlzOpenAIGPTConfig._handle_pdf_url   sZ     $((*""9-/8K(3L%'4L$Y'rK   c                    K   |j                  d      }|.t        |       d {   }||d<   d|d<   |j                  d       |S 7 !wr   )r   r   r   )r?   r{   r}   r   s       rI   _async_handle_pdf_urlz%OpenAIGPTConfig._async_handle_pdf_url   sY      ""9- ;G DDK(3L%'4L$Y'	 Es   "AA"Ac                 \    |j                  d      }|j                  d      }||d|d<   |S )Nr   r   r   r   )r?   r{   r   r   s       rI   _common_file_data_checkz'OpenAIGPTConfig._common_file_data_check  s?     !$$[1	##J/ X%5'4L$rK   c           
         dh}|j                  d      dk(  r}t        t        |      }t        |d   t              rd|d   i|d<   |S t        |d   t
              r9t        di |d   j                         D ci c]  \  }}||vr|| c}}}||d<   |S |j                  d      dk(  rKt        t        |      }|d   }t        di |j                         D ci c]  \  }}||vr|| c}}}||d<   |S c c}}w c c}}w )Nformattype	image_urlurlfile )
r   r   r   
isinstancestrdictr    rB   r   r   )r?   r{   litellm_specific_paramskvnew_image_url_objfile_objnew_file_objs           rI   $_apply_common_transform_content_itemz4OpenAIGPTConfig._apply_common_transform_content_item  sV    $,*F#{2 9<HL,{3S9<4-[)0 + L5t<$@ % %1$=$C$C$E$EDAq$;; 1$E%! ->[)  f%/ 8,GL#F+H7  !) 0 01 77 qD 0L $0L 's   7C6C<c                 .   | j                  |      }|j                  d      }|j                  d      }|dk(  r\|rZt        t        |      }t        t        |      }| j                  |      r| j                  |      }| j                  |      }||d<   |}|S Nr   r   )r   r   r   r   r   r   r   r   )r?   r{   content_item_typepotential_file_objr   content_item_typeds         rI   _transform_content_itemz'OpenAIGPTConfig._transform_content_item.  s     @@N(,,V4)--f5&+=8:LMH!%&>!M$$X.//933H=H)1v&-LrK   Fis_asyncc                 J  K   | j                  |      }|j                  d      }|j                  d      }|dk(  rd|rbt        t        |      }t        t        |      }| j                  |      r| j                  |       d {   }| j                  |      }||d<   |}|S 7 wr   )r   r   r   r   r   r   r   r   )r?   r{   r   r   r   r   r   s          rI   _async_transform_content_itemz-OpenAIGPTConfig._async_transform_content_item?  s      @@N(,,V4)--f5&+=8:LMH!%&>!M$$X.!%!;!;H!EE33H=H)1v&-L	 Fs   B B#B!B#messagesc                      y rM   r   r?   r   rQ   r   s       rI   _transform_messagesz#OpenAIGPTConfig._transform_messagesQ  s     	rK   c                      y rM   r   r   s       rI   r   z#OpenAIGPTConfig._transform_messagesW  s     	rK   c                 F     fd}|r |       S D ]  }|j                  d      }|j                  d      }|dk(  s+|s.t        |t              s?t        t        t
           |      }t        |      D ]'  \  }	}
 j                  t        t
        |
            ||	<   )  S )zSOpenAI no longer supports image_url as a string, so we need to convert it to a dictc                  B  K   D ]  } | j                  d      }| j                  d      }|dk(  s+|s.t        |t              s?t        t        t
           |      }t        |      D ]/  \  }}j                  t        t
        |             d {   ||<   1  S 7 w)Ncontentrolerh   )r   r   listr   r	   r"   	enumerater   )messagemessage_contentmessage_rolemessage_content_typesir{   r   r?   s         rI   _async_transformz=OpenAIGPTConfig._transform_messages.<locals>._async_transformg  s     #")++i"8&{{62 !F*'"?D9,0:;_-) ,55J+K< #'"D"D !>M#  . ,L $$ Os"   -BBBA
BBBr   r   rh   )r   r   r   r   r	   r"   r   r   )r?   r   rQ   r   r   r   r   r   r   r   r{   s   ``         rI   r   z#OpenAIGPTConfig._transform_messagesb  s    
	* #%%#")++i"8&{{62 F*'"?D9,0:;_-) ,5_+E<373O3O !>M4-a0 ,F $ OrK   r[   r/   c                     ddl m} ddlm} t	        |      D ]  \  }}t        t         ||d            ||<   ! |)t	        |      D ]  \  }}t        | ||d            ||<    ||fS )Nr   )filter_value_from_dictr.   cache_control)8litellm.litellm_core_utils.prompt_templates.common_utilsr   litellm.types.llms.openair/   r   r   r   )	r?   rQ   r   r[   r   r/   r   r   tools	            rI   1remove_cache_control_flag_from_messages_and_toolszAOpenAIGPTConfig.remove_cache_control_flag_from_messages_and_tools  s}    	
 	F#H-JAw "8/"RHQK . $U+4+*4Aa ,
 rK   litellm_paramsheadersc                     | j                  ||      }| j                  |||j                  dg             \  }}|t        |      dkD  r||d<   |j	                  dd       ||d|S )z
        Transform the overall request to be sent to the API.

        Returns:
            dict: The transformed request. Sent as the body of the API call.
        )r   rQ   r[   rQ   r   r[   Nr   r]   rQ   r   )r   r   r   lenr   )r?   rQ   r   rs   r   r   r[   s          rI   transform_requestz!OpenAIGPTConfig.transform_request  s     ++XU+KPP(/2E2Egr2R Q 
% Ua',OG$M40  
 
 	
rK   c                 "  K   | j                  ||d       d {   }| j                  |||j                  dg             \  }}|t        |      dkD  r||d<   | j                  j
                  r||d|S | j                  |||||      S 7 rw)NT)r   rQ   r   r[   r   r   r   )r   r   r   r   rD   rE   r   )r?   rQ   r   rs   r   r   transformed_messagesr[   s           rI   async_transform_requestz'OpenAIGPTConfig.async_transform_request  s      &*%=%=UT &> &
  
 BB)!%%gr2 C 
	
  Ua',OG$>>((0 "  ))x.' + 
s   BBA3Bc                 *    |j                  dd       d uS )Nr[   r   )r?   rs   s     rI   _passed_in_toolsz OpenAIGPTConfig._passed_in_tools  s    ""7D1==rK   r   c                 `   ddl }| j                  |      syt        |j                  dg             }	 |j	                  |      }|j                  d      dk(  rH|j                  d      |v r5t        t        |j                  d      |j                  d            	      S y# t        $ r Y yw xY w)
z5
        Check if the content is a tool call
        r   Nr[   r   functionname	arguments)r   r   )r   )jsonr   r   r   loadsr#   r%   	Exception)r?   r   rs   r   tool_call_namesjson_contents         rI   &_check_and_fix_if_content_is_tool_callz6OpenAIGPTConfig._check_and_fix_if_content_is_tool_call  s     	$$_5-o.A.A'2.NO	::g.L  (J6 $$V,?4%)--f5"."2"2;"?    		s   A,B! !	B-,B-r   received_finish_reasonc                      |j                   y|S )N
tool_calls)r   )r?   r   r   s      rI   _get_finish_reasonz"OpenAIGPTConfig._get_finish_reason  s    )))rK   choices	json_modec                    g }|D ]`  }|d   j                  dd       }d }|d   j                  dd       }|5g }	|D ]  }
t        di |
}|	j                  |         t        |	      }|6|}n3|1|r/t	        |t
              r| j                  ||      }|d |d   d<   |g}d }d }|rBt        ||      r5t        |d   d   j                  dd            xs d }|t        |	      }d
}|/t        t        t        |d               \  }}t        d||d |      }||d   }t        ||d   |d d       }t        | j                  ||d               |_        |j                  |       c |S )Nr   r   r   )r   convert_tool_call_to_json_moder   r   r    )r   r9   	assistant)r   r   reasoning_contentthinking_blocksr   finish_reasonindex)r   r   r   rS   enhancementsr   )r   r#   ri   r   r   r   r   r   r&   r   r   r   r$   r   r   r   )r?   r   r   rs   transformed_choiceschoicer   new_tool_callsr   _openai_tool_calls_tc
_openai_tcfixed_tool_callsnew_tool_calltranslated_messager   json_mode_content_strr   content_strtranslated_choices                       rI   _transform_choicesz"OpenAIGPTConfig._transform_choices
  s    !F	*..|TBJLPN$Y/33ItDO%%'"%C!>!E!EJ&--j9 & $G&$  $/%5N+#4 $ K K#_! !,37F9%i0&3_N48+/M"H)/8# q)*599+rJKSt & )4)09N)O&$*M!)
 /tD&:K/LM% &-$'&7$(-&" $ & 7 '+Wo*!! /@''(:F?<ST/+  &&'89O R #"rK   raw_responsemodel_responselogging_objrequest_dataencodingapi_keyc                    |j                  ||
|j                  d|i       	 |j                         }t        |j                        }t        ||d|i|      }t        t        |      S # t        $ rM}t	        |dd      }t        dj                  t        |      |j                        |j                  |      d}~ww xY w)zt
        Transform the response from the API.

        Returns:
            dict: The transformed response.
        complete_input_dict)inputr   original_responseadditional_argsr   Nz7Unable to get json response - {}, Original Response: {})r   status_coder   )response_objectmodel_response_objecthidden_params_response_headers)	post_calltextr   r   getattrr+   r   r   r  r   r   r)   r   r'   )r?   rQ   r   r   r   r   r   rs   r   r   r   r   completion_responseeresponse_headersraw_response_headersfinal_response_objs                    rI   transform_responsez"OpenAIGPTConfig.transform_response]  s    , 	*//2LA	 	 	

	"."3"3"5  $L$8$89=/"0$&:;2	
 M#566#  	&|YEQXXFL-- )44( 	s   A) )	B?2AB::B?error_messager  c                 N    t        ||t        t        j                  |            S )N)r  r   r   )r+   r   httpxHeaders)r?   r  r  r   s       rI   get_error_classzOpenAIGPTConfig.get_error_class  s%     #!0
 	
rK   api_baserY   c                 J    |d}d}|j                  d      }||v r|S | d| S )z~
        Get the complete URL for the API call.

        Returns:
            str: The complete URL for the API call.
        https://api.openai.comzchat/completions/)rstrip)r?   r  r   rQ   rs   r   rY   endpoints           rI   get_complete_urlz OpenAIGPTConfig.get_complete_url  sD     /H% ??3' xO1XJ''rK   c                 4    |d| |d<   d|vr	d|vrd|d<   |S )NBearer Authorizationzcontent-typezContent-Typezapplication/jsonr   )r?   r   rQ   r   rs   r   r   r  s           rI   validate_environmentz$OpenAIGPTConfig.validate_environment  s;     )0	':GO$ (^7-J&8GN#rK   c                    |d}|t        d      }t        j                  |      }|j                   d|j                   }|j
                  r|d|j
                   z  }t        j                  j                  | ddd| i      }|j                  d	k7  rt        d
|j                         |j                         d   }|D cg c]  }|d   	 c}S c c}w )zV
        Calls OpenAI's `/v1/models` endpoint and returns the list of models.
        r  OPENAI_API_KEYz://:z
/v1/modelsr   r  )r   r      zFailed to get models: dataid)r   r  URLschemehostportrk   module_level_clientr   r  r   r
  r   )r?   r   r  
parsed_urlbase_urlresponsemodelsrQ   s           rI   
get_modelszOpenAIGPTConfig.get_models  s     /H?$%56G YYx(
 ''(JOO+<=??!JOO,--H..22*J'$y&9: 3 

 3&4X]]ODEE()/0d000s   Cc                 h    | xs/ t         j                  xs t         j                  xs t        d      S )Nr#  )rk   r   
openai_keyr   )r   s    rI   get_api_keyzOpenAIGPTConfig.get_api_key  s6      00!!0 ./		
rK   c                 f    | xs. t         j                  xs t        d      xs t        d      xs dS )NOPENAI_BASE_URLOPENAI_API_BASEzhttps://api.openai.com/v1)rk   r  r   )r  s    rI   get_api_basezOpenAIGPTConfig.get_api_base  sB      ++/0+ /0+ +	
rK   c                     | S rM   r   )rQ   s    rI   get_base_modelzOpenAIGPTConfig.get_base_model  s    rK   r-   c                     ddl m}  |       S )Nr   )OpenAITokenCounter)8litellm.llms.openai.responses.count_tokens.token_counterr<  )r?   r<  s     rI   get_token_counterz!OpenAIGPTConfig.get_token_counter  s    	
 "##rK   streaming_responsesync_streamc                     t        |||      S )N)r?  r@  r   )$OpenAIChatCompletionStreamingHandler)r?   r?  r@  r   s       rI   get_model_response_iteratorz+OpenAIGPTConfig.get_model_response_iterator  s     41#
 	
rK   )NNNNNNNNNNN)FrM   )NN)N__name__
__module____qualname____doc__rE   r2   r   int__annotations__r3   r   r   r   r4   r   r5   r6   r7   r8   r9   r:   r;   r<   rJ   classmethodrO   rq   boolrx   rz   r   r   r   r   r   r"   r   r   r   r   r	   r   r
   r   r   r   r   r   r   r   r   r#   r   r&   r   r!   r$   r   r  Responser'   LiteLLMLoggingObjr  r  r   r  r  r!  r1  staticmethodr4  r8  r:  r>  r   r   rC  __classcell__)rD   s   @rI   r1   r1   F   s   6 N'+x}+04M8E#t),-4 $Ix~$!%J% $J$Ax}&*hsm*'+D(5d#
$+!%K#%E8C=&*OXd^* ,048$(%)$(*.+/%)#*..#C=.  c4i 01. D>	.
 TN. SM. C=. #3-. uS$Y'(. c]. }. "$. 
.* $ $23 23 23h   	
  
0
 
 
 	

 
 

-I d 
8
	%
	8		%	8	% 3  
' D3 
'$ MR9EI	&$ -.7:FMdm	3T"233	4 
 
 $)	'(  %.	
 
	  NS,-.,7:,FJ,	t$%yc4@P;Q1Q'RR	S,d <@	 '( 678	
 
t$%x5N0O'PP	Q.

 '(
 	

 
 
 

: '( 	
   
B> > >-1	/	08*' *3 *SV * %)*.	Q#12Q# D>Q# "$	Q#
 
gQ#| "&$(1717 nn17 &	17
 '17 17 '(17 17 17 17 #17 D>17 
17f
 
/2
=B4CV=W
	
  "&(3-( #( 	(
 ( ( ( 
(F "&"&  '(	
   # 3- 
( HL1}17?}1	c1: 
Xc] 
hsm 
 
 
x} 
 
 
 hsm x}  $8,>#? $ %*	

!(3-s1C]"RS

 

 D>	


 


rK   r1   c                   ,    e Zd ZdedefdZdedefdZy)rB  r   r=   c                 j    |D ]-  }|j                  di       }d|v s|j                  d      |d<   / |S )a  
        Map 'reasoning' field to 'reasoning_content' field in delta.

        Some OpenAI-compatible providers (e.g., GLM-5, hosted_vllm) return
        delta.reasoning, but LiteLLM expects delta.reasoning_content.

        Args:
            choices: List of choice objects from the streaming chunk

        Returns:
            List of choices with reasoning field mapped to reasoning_content
        delta	reasoningr   )r   r   )r?   r   r   rR  s       rI   #_map_reasoning_to_reasoning_contentzHOpenAIChatCompletionStreamingHandler._map_reasoning_to_reasoning_content  sA     FJJw+Ee#-2YY{-C)*  rK   chunkc                    	 |j                  dg       }| j                  |      }|j                  d      d|j                  d      |j                  d      |d}d|v r|d   |d   |d<   t        di |S # t        $ r}|d }~ww xY w)	Nr   r'  zchat.completion.chunkcreatedrQ   )r'  objectrW  rQ   r   usager   )r   rT  r(   r   )r?   rU  r   kwargsr  s        rI   chunk_parserz1OpenAIChatCompletionStreamingHandler.chunk_parser$  s    	ii	2.G>>wGG iio1 99Y/7+"&F %E'N$>"'.w&000 	G	s   A3A6 6	B?BBN)rD  rE  rF  r   rT  r   r(   r[  r   rK   rI   rB  rB    s)    4 D &$ +> rK   rB  )@rG  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r  rk   'litellm.litellm_core_utils.core_helpersr   Flitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser   r   r   r   r   :litellm.litellm_core_utils.prompt_templates.image_handlingr   r   )litellm.llms.base_llm.base_model_iteratorr    litellm.llms.base_llm.base_utilsr   )litellm.llms.base_llm.chat.transformationr   r   litellm.secret_managers.mainr   r   r   r   r   r   r    r!   r"   litellm.types.utilsr#   r$   r%   r&   r'   r(   litellm.utilsr)   common_utilsr+   *litellm.litellm_core_utils.litellm_loggingr,   _LiteLLMLoggingObjr-   r/   rM  r1   rB  r   rK   rI   <module>ri     s          E 
 Y P = R 7    ; &XAA*G
&
 G
T$+D $rK   