
    hl                     d   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 ddlZddl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,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 erddl5m6Z7 ddl"m8Z8 e7Z9neZ9 G d dee      Z: G d de      Z;y)z
Support for gpt model family
    )TYPE_CHECKINGAnyAsyncIterator	CoroutineIteratorListLiteralOptionalTupleUnioncastoverloadN)_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ChatCompletionToolParamc                   >    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<   	 	 	 	 	 	 	 	 	 	 	 dLd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%	 dMd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'	 dMd#e(e)   ded!e*d    de(e)   fd%       Z-	 dMd#e(e)   ded!ede
e(e)   e+e,e,e(e)   f   f   fd&Z-	 dNd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	 	 dOd4e(e7   d5ee   dee   de(e8   fd6Z9	 	 dOd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	 dNdAee   d<ee   deded*edBee   defdCZB	 	 dOd+eded#e(e)   ded*ed<ee   dAee   defdDZC	 dOd<ee   dAee   de(e   fdEZDeEdNd<ee   dee   fdF       ZFeEdNdAee   dee   fdG       ZGeEdNdee   dee   fdH       ZH	 dMdIe
eIe   eJe   e<f   dJed5ee   de,fdKZK xZLS )P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<   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   locals_keyvalues                  g/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/openai/chat/gpt_transformation.py__init__zOpenAIGPTConfig.__init__m   sO     (--/!--/JCf}!2U3 * ).%    c                      t         |          S N)super
get_config)clsrA   s    rF   rL   zOpenAIGPTConfig.get_config   s    w!##rH   modelc                     g d}g }|dk7  r|dk7  r|j                  d       |t        j                  v s|t        j                  v r|j                  d       ||z   S )N)r/   r2   logprobstop_logprobsr3   max_completion_tokens
modalities
predictionr4   r5   seedr6   streamstream_optionsr7   r8   toolstool_choicer0   r1   max_retriesextra_headersparallel_tool_callsaudioweb_search_optionszgpt-3.5-turbo-16kzgpt-4r9   user)appendlitellmopen_ai_chat_completion_modelsopen_ai_text_completion_models)r<   rN   base_paramsmodel_specific_paramss       rF   get_supported_openai_paramsz+OpenAIGPTConfig.get_supported_openai_params   sm    
8 !#((Ug-=!(():; W;;;g<<<!(( 222rH   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.
        )rf   r?   )r<   rg   rh   rN   ri   supported_openai_paramsparamrE   s           rF   _map_openai_paramsz"OpenAIGPTConfig._map_openai_params   sG    $ #'"B"B5"I.446LE5//).& 7 rH   c                 ,    | j                  ||||      S )N)rg   rh   rN   ri   )rm   )r<   rg   rh   rN   ri   s        rF   map_openai_paramsz!OpenAIGPTConfig.map_openai_params   s(     &&1+#	 ' 
 	
rH   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rJ   )
startswith).0startrr   s     rF   	<genexpr>z3OpenAIGPTConfig.contains_pdf_url.<locals>.<genexpr>   s!      
*/Gu%
s   TF)getany)r<   rp   potential_pdf_url_startsrr   s      @rF   contains_pdf_urlz OpenAIGPTConfig.contains_pdf_url   s8    #B ""9-s 
3K
 
 rH   c                     |j                         }|j                  d      }|&t        |      }||d<   d|d<   |j                  d       |S Nrr   	file_datamy_file.pdffilename)r>   rx   r   pop)r<   rp   content_copyrr   base64_datas        rF   _handle_pdf_urlzOpenAIGPTConfig._handle_pdf_url   sZ     $((*""9-/8K(3L%'4L$Y'rH   c                    K   |j                  d      }|.t        |       d {   }||d<   d|d<   |j                  d       |S 7 !wr}   )rx   r   r   )r<   rp   rr   r   s       rF   _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   rx   )r<   rp   r~   r   s       rF   _common_file_data_checkz'OpenAIGPTConfig._common_file_data_check   s?     !$$[1	##J/ X%5'4L$rH   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 )
rx   r   r   
isinstancestrdictr   r?   r   r   )r<   rp   litellm_specific_paramskvnew_image_url_objfile_objnew_file_objs           rF   $_apply_common_transform_content_itemz4OpenAIGPTConfig._apply_common_transform_content_item   sL    $,*F#{2 9<HL,{3S9<4-[)0 + L5t<$@ % %1$=$C$C$E Aq$;; 1%! ->[)  f%/ 8,GL#F+H7  !) 01 77 qD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   rx   r   r   r   r{   r   r   )r<   rp   content_item_typepotential_file_objr   content_item_typeds         rF   _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rH   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   rx   r   r   r   r{   r   r   )r<   rp   r   r   r   r   r   s          rF   _async_transform_content_itemz-OpenAIGPTConfig._async_transform_content_item3  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 rJ   r   r<   r   rN   r   s       rF   _transform_messagesz#OpenAIGPTConfig._transform_messagesE  s     	rH   c                      y rJ   r   r   s       rF   r   z#OpenAIGPTConfig._transform_messagesK  s     	rH   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roler_   )rx   r   listr   r   r    	enumerater   )messagemessage_contentmessage_rolemessage_content_typesirp   r   r<   s         rF   _async_transformz=OpenAIGPTConfig._transform_messages.<locals>._async_transform[  s     #")++i"8&{{62 F*'"?D9,0:;_-) ,55J+K<"&"D"D $%BL Q#  .a0 ,L $" O	s"   -BBBA
BBBr   r   r_   )rx   r   r   r   r   r    r   r   )r<   r   rN   r   r   r   r   r   r   r   rp   s   ``         rF   r   z#OpenAIGPTConfig._transform_messagesV  s    
	( #%%#")++i"8&{{62 F*'"?D9,0:;_-) ,5_+E<373O3O !>M4-a0 ,F $ OrH   rX   r,   c                     ddl m} ddlm} |D ]  }t	        t
         ||d            } ||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<   rN   r   rX   r   r,   r   tools           rF   1remove_cache_control_flag_from_messages_and_toolszAOpenAIGPTConfig.remove_cache_control_flag_from_messages_and_tools  sc    	
 	FG "8/"RG   +*4A 
 rH   litellm_paramsheadersc                     | j                  ||      }| j                  |||j                  dg             \  }}|t        |      dkD  r||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   rN   rX   rN   r   rX   r   rN   r   )r   r   rx   len)r<   rN   r   rh   r   r   rX   s          rF   transform_requestz!OpenAIGPTConfig.transform_request  s     ++XU+KPP(/2E2Egr2R Q 
% Ua',OG$  
 
 	
rH   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   rN   r   rX   r   r   r   )r   r   rx   r   rA   rB   r   )r<   rN   r   rh   r   r   transformed_messagesrX   s           rF   async_transform_requestz'OpenAIGPTConfig.async_transform_request  s      &*%=%=UT &> &
  
 BB-%))'26 C  	$e Ua',OG$>>((0 "  ))x.' ) 
s   BBA3Bc                 *    |j                  dd       d uS )NrX   r   )r<   rh   s     rF   _passed_in_toolsz OpenAIGPTConfig._passed_in_tools  s    ""7D1==rH   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   NrX   r   functionname	arguments)r   r   )r   )jsonr   r   rx   loadsr!   r#   	Exception)r<   r   rh   r   tool_call_namesjson_contents         rF   &_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      rF   _get_finish_reasonz"OpenAIGPTConfig._get_finish_reason  s    )))rH   choices	json_modec                    g }|D ]W  }|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       }| j                  ||d         |_        |j                  |       Z |S )Nr   r   r   )r   convert_tool_call_to_json_moder   r   r    )r   r6   	assistant)r   r   reasoning_contentthinking_blocksr   finish_reasonindex)r   r   r   rP   enhancementsr   )rx   r!   r`   r   r   r   r   r   r$   r   r   r   r"   r   r   )r<   r   r   rh   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                       rF   _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*!! /3.E.E"F?$;/+  &&'89O R #"rH   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<   rN   r   r   r   r   r   rh   r   r   r   r   completion_responseeresponse_headersraw_response_headersfinal_response_objs                    rF   transform_responsez"OpenAIGPTConfig.transform_responseM  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       rF   get_error_classzOpenAIGPTConfig.get_error_class  s%     #!0
 	
rH   api_baserV   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   rN   rh   r   rV   endpoints           rF   get_complete_urlz OpenAIGPTConfig.get_complete_url  sD     /H% ??3' xO1XJ''rH   c                 4    |d| |d<   d|vr	d|vrd|d<   |S )NBearer Authorizationzcontent-typezContent-Typezapplication/jsonr   )r<   r   rN   r   rh   r   r   r  s           rF   validate_environmentz$OpenAIGPTConfig.validate_environment  s;     )0	':GO$ (^7-J&8GN#rH   c                    |d}|t        d      }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
/v1/modelsr  r  )r   r      zFailed to get models: dataid)r   ra   module_level_clientrx   r   r   r   r   )r<   r   r  responsemodelsrN   s         rF   
get_modelszOpenAIGPTConfig.get_models  s     /H?$%56G..22*J'$y&9: 3 

 3&4X]]ODEE()/0d000s   9Bc                 h    | xs/ t         j                  xs t         j                  xs t        d      S )Nr  )ra   r   
openai_keyr   )r   s    rF   get_api_keyzOpenAIGPTConfig.get_api_key  s6      00!!0 ./		
rH   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)ra   r  r   )r  s    rF   get_api_basezOpenAIGPTConfig.get_api_base  sB      ++/0+ /0+ +	
rH   c                     | S rJ   r   )rN   s    rF   get_base_modelzOpenAIGPTConfig.get_base_model  s    rH   streaming_responsesync_streamc                     t        |||      S )N)r)  r*  r   )$OpenAIChatCompletionStreamingHandler)r<   r)  r*  r   s       rF   get_model_response_iteratorz+OpenAIGPTConfig.get_model_response_iterator  s     41#
 	
rH   )NNNNNNNNNNN)FrJ   )NN)M__name__
__module____qualname____doc__rB   r/   r
   int__annotations__r0   r   r   r   r1   r   r2   r3   r4   r5   r6   r7   r8   r9   rG   classmethodrL   rf   boolrm   ro   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  r  staticmethodr"  r&  r(  r   r   r-  __classcell__)rA   s   @rF   r.   r.   C   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]. }. "$. 
.* $ $)3 )3 )3V   	
  
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+b <@	 '( 678	
 
t$%x5N0O'PP	Q.

 '(
 	

 
 
 

6 '( 	
   
@> > >-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}   %*	

!(3-s1C]"RS

 

 D>	


 


rH   r.   c                       e Zd ZdedefdZy)r,  chunkr:   c                 b    	 t        |d   d|d   |d   |d         S # t        $ r}|d }~ww xY w)Nr  zchat.completion.chunkcreatedrN   r   )r  objectr=  rN   r   )r&   r   )r<   r;  r  s      rF   chunk_parserz1OpenAIChatCompletionStreamingHandler.chunk_parser  sL    		&;.i(Gni(   	G	s    	.).N)r.  r/  r0  r   r&   r?  r   rH   rF   r,  r,    s    
$ 
+> 
rH   r,  )<r1  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r	  ra   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,   r7  r.   r,  r   rH   rF   <module>rL     s         
 Y P = R 7    ; &XA*m

&
 m

`+D rH   