
    h2                       d dl Z d dl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 d dlm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 d dlmZ d dlmZ d dlZd d	lmZ d d
lmZ d dl m!Z! d dl"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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7 ddl8 ddl9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@  e<       ZA G d d      ZB G d de*      ZC G d de(      ZD G d  d!e:e>      ZE G d" d#e:      ZF G d$ d%e:      ZG G d& d'e:      ZHy)(    N)AnyAsyncIteratorCallable	CoroutineIterableIteratorListLiteralOptionalUnioncast)urlparse)AsyncOpenAIOpenAI)AssistantDeleted)FileDeleted)	BaseModel)overload)LlmProviders)verbose_logger)DEFAULT_MAX_RETRIES)Logging)track_llm_api_timing)BaseModelResponseIterator)
BaseConfigBaseLLMException)MockResponseIterator)EmbeddingResponseImageResponseLiteLLMBatchModelResponseModelResponseStream)CustomStreamWrapperProviderConfigManager convert_to_model_response_object   )*   )BaseLLM   )OpenAIOSeriesConfig)BaseOpenAILLMOpenAIError+drop_params_from_unprocessable_entity_errorc                   B    e Zd ZdZ	 	 d	dZed        Zd ZdedefdZ	y)
MistralEmbeddingConfigzK
    Reference: https://docs.mistral.ai/api/#operation/createEmbedding
    Nc                     t               j                         }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y Nselflocalscopyitemssetattr	__class__)r3   locals_keyvalues       V/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/openai/openai.py__init__zMistralEmbeddingConfig.__init__A   sA     (--/!--/JCf}!2U3 *    c                     | j                   j                         D ci c]O  \  }}|j                  d      s9t        |t        j
                  t        j                  t        t        f      s|||Q c}}S c c}}w )N__)	__dict__r7   
startswith
isinstancetypesFunctionTypeBuiltinFunctionTypeclassmethodstaticmethod)clskvs      r=   
get_configz!MistralEmbeddingConfig.get_configI   st     **,
1<<%&&-- 	  qD
 	
 
s   AA6c                     dgS Nencoding_format r3   s    r=   get_supported_openai_paramsz2MistralEmbeddingConfig.get_supported_openai_params[   s    
 	
r?   non_default_paramsoptional_paramsc                 L    |j                         D ]  \  }}|dk(  s||d<    |S rO   )r7   )r3   rT   rU   paramr<   s        r=   map_openai_paramsz(MistralEmbeddingConfig.map_openai_params`   s5    .446LE5))5: 12 7 r?   returnN)
__name__
__module____qualname____doc__r>   rH   rM   rS   dictrX   rQ   r?   r=   r0   r0   <   s@    4	4 
 
"

D 4 r?   r0   c                       e Zd ZU 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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.d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   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fdZdee   de
dee   fdZdedede
dedef
dZ de
dede	ee!jD                  f   de#fdZ$de
dee   dedededefd Z%	 	 d/de
d!e!jL                  d"e'd#e(d$edee   deded%e)d&ee
   d'ee   de'fd(Z*	 	 d/dede
dee   deded&ee
   d)ee
   defd*Z+	 d0d+e	e,e
   e-e
   e'f   d,ed'ee   de)fd-Z. xZ/S )1OpenAIConfiga?  
    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. OpenAI has now deprecated in favor of max_completion_tokens, and is not compatible with o1 series models.

    - `max_completion_tokens` (integer or null): An upper bound for the number of tokens that can be generated for a completion, including visible output tokens and reasoning tokens.

    - `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.
    Nfrequency_penaltyfunction_call	functions
logit_biasmax_completion_tokens
max_tokensnpresence_penaltystoptemperaturetop_presponse_formatrZ   c                     t               j                         }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y r2   r4   )r3   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   r:   r;   r<   s                   r=   r>   zOpenAIConfig.__init__   sA     (--/!--/JCf}!2U3 *r?   c                      t         |          S N)superrM   )rJ   r9   s    r=   rM   zOpenAIConfig.get_config   s    w!##r?   modelc                    t         j                  |      rt         j                  |      S t        j                  j                  |      r t        j                  j                  |      S t        j                  j                  |      S )a  
        This function returns the list
        of supported openai parameters for a given OpenAI Model

        - If O1 model, returns O1 supported params
        - If gpt-audio model, returns gpt-audio supported params
        - Else, returns gpt supported params

        Args:
            model (str): OpenAI model

        Returns:
            list: List of supported openai parameters
        rr   )openaiOSeriesConfigis_model_o_series_modelrS   litellmopenAIGPTAudioConfigis_model_gpt_audio_modelopenAIGPTConfig)r3   rr   s     r=   rS   z(OpenAIConfig.get_supported_openai_params   su     66U6C&BBBOO))BBBO//KKRWKXX**FFUFSSr?   rT   rU   c                 l    | j                  |      }|j                         D ]  \  }}||v s|||<    |S rp   )rS   r7   )r3   rT   rU   rr   supported_openai_paramsrW   r<   s          r=   _map_openai_paramszOpenAIConfig._map_openai_params   sG     #'"B"B5"I.446LE5//).& 7 r?   messagesc                     |S rp   rQ   )r3   r~   rr   s      r=   _transform_messagesz OpenAIConfig._transform_messages   s	     r?   drop_paramsc                 ,   t         j                  |      rt         j                  ||||      S t        j                  j                  |      r#t        j                  j                  ||||      S t        j                  j                  ||||      S ) rt   )rT   rU   rr   r   )ru   rv   rX   rw   rx   ry   rz   )r3   rT   rU   rr   r   s        r=   rX   zOpenAIConfig.map_openai_params   s     66U6C&88#5 /'	 9   ))BBBO//AA#5 /'	 B   &&881+#	 9 
 	
r?   error_messagestatus_codeheadersc                     t        |||      S )Nr   messager   )r-   )r3   r   r   r   s       r=   get_error_classzOpenAIConfig.get_error_class   s     #!
 	
r?   litellm_paramsc                 6    | j                  ||      }||d|S )N)r~   rr   )rr   r~   )r   )r3   rr   r~   rU   r   r   s         r=   transform_requestzOpenAIConfig.transform_request   s)     ++XU+KHHHHr?   raw_responsemodel_responselogging_objrequest_dataencodingapi_key	json_modec                    |j                  |j                         |j                  |j                  d<   t	        t
        t        |j                         |d|j                  it        |j                                    }|S )N)original_responseresponse_headersr   response_objectmodel_response_objecthidden_params_response_headers)		post_calltextr   model_call_detailsr   r!   r%   jsonr_   )r3   rr   r   r   r   r   r~   rU   r   r   r   r   final_response_objs                r=   transform_responsezOpenAIConfig.transform_response   s{     	0A0AB=I=Q=Q&&'9:!, , 1 1 3&4(,*>*>?"&|';';"<	
 "!r?   api_basec                     dd| i|S )NAuthorizationBearer rQ   )r3   r   rr   r~   rU   r   r   r   s           r=   validate_environmentz!OpenAIConfig.validate_environment  s"     wwi0

 	
r?   streaming_responsesync_streamc                     t        |||      S )N)r   r   r   )$OpenAIChatCompletionResponseIterator)r3   r   r   r   s       r=   get_model_response_iteratorz(OpenAIConfig.get_model_response_iterator*  s     41#
 	
r?   )NNNNNNNNNNNNNN)F)0r[   r\   r]   r^   rb   r   int__annotations__rc   r   strr_   rd   listre   rf   rg   rh   ri   rj   rk   rl   rm   r>   rH   rM   rS   r}   r	   AllMessageValuesr   boolrX   httpxHeadersr   r   r   Responser!   LiteLLMLoggingObjr   r   r   r   r   r   __classcell__r9   s   @r=   ra   ra   g   s,   8 (,x}+04M8E#t),-4 $Ix~$!%J%+/8C=/ $J$Ax}&*hsm*'+D(5d#
$+!%K#%E8C=&*OXd^* ,048$(%)/3$(*.+/%)#*.4#C=4  c4i 014 D>	4
 TN4  (}4 SM4 C=4 #3-4 uS$Y'(4 c]4 }4 "$4 
4( $ $T T T,"&9=FI	-.7:		

 
 
 	

 
 

<
 
/2
=B4CV=W
	
	I	I '(	I 		I
 	I 	I 
	I, "&$("" nn" &	"
 '" " '(" " " " #" D>" 
"F "&"&

 
 '(	

 
 
 #
 3-
 

& %*	

!(3-s1C]"RS

 

 D>	


 


r?   ra   c                       e Zd ZdedefdZy)r   chunkrZ   c                 @    	 t        di |S # t        $ r}|d}~ww xY w)a  
        {'choices': [{'delta': {'content': '', 'role': 'assistant'}, 'finish_reason': None, 'index': 0, 'logprobs': None}], 'created': 1735763082, 'id': 'a83a2b0fbfaf4aab9c2c93cb8ba346d7', 'model': 'mistral-large', 'object': 'chat.completion.chunk'}
        NrQ   )r"   	Exception)r3   r   es      r=   chunk_parserz1OpenAIChatCompletionResponseIterator.chunk_parser8  s*    	&/// 	G	s   
 	N)r[   r\   r]   r_   r"   r   rQ   r?   r=   r   r   7  s    $ +> r?   r   c            (           e Zd Zd9 fdZ	 	 d:deeef   dee   dee	   fdZ
ddd ej                  d      eddfded	ee   d
ee   dee   deeej                  f   dee	   dee   deeeef      deeeef      fdZ e       dededeeej                  f   dedeeef   f
d       Z e       dededeeej                  f   dedeeef   f
d       Z	 d;dedededee   def
dZdddddddddddi ddddfdedeeej                  f   dedededee   dee   dee   d	ee   d
ee   dee   dee   dee   d ed!ee   d"edee   d#ee   d$ee   f& fd%Z	 	 	 	 	 	 	 	 	 	 d<dededed&ededededeeej                  f   d	ee   d
ee   dee   dee   d$ee   dee   d'efd(Z 	 	 	 	 	 	 	 	 d=deeej                  f   deded	ee   d
ee   dee   dee   dee   fd)Z!	 	 	 	 	 	 	 	 	 d>deeej                  f   dededed&ededed	ee   d
ee   dee   dee   d$ee   dee   fd*Z"dee   d
ee   defd+Z# e       dededeeej                  f   defd,       Z$ e       dededeeej                  f   defd-       Z%	 	 	 	 d?d.edede&deded	ee   d
ee   dee   fd/Z'	 	 	 	 	 d@ded.edede&ded	ee   d
ee   dee	   de&f fd0Z(	 	 	 	 d?d1ededededed	ee   d
ee   fd2Z)	 	 	 	 	 d@dee   d1edededed	ee   d
ee   dee*   de*fd3Z+	 	 d:ded.ed4eded	ee   d
ee   dee   d5ee   de	deeej                  f   d6ee   de,fd7Z-	 d;ded.ed4eded	ee   d
ee   dee   d5ee   de	deeej                  f   de,fd8Z. xZ/S )AOpenAIChatCompletionrZ   Nc                 "    t         |           y rp   rq   r>   r3   r9   s    r=   r>   zOpenAIChatCompletion.__init__C      r?   clientorganizationmax_retriesc                 *    |||_         |||_        y y rp   )r   r   )r3   r   r   r   s       r=   _set_dynamic_params_on_clientz2OpenAIChatCompletion._set_dynamic_params_on_clientF  s%     #".F"!,F #r?   is_asyncr   r   api_versiontimeoutc	                    t               }	|t        |t              st        ddj	                  |            | j                  |	d      }
|
r"t        |
t              st        |
t              r|
S |r$t        ||t        j                         |||      }n#t        ||t        j                         |||      }| j                  ||	d       |S | j                  |||       |S )	N  z/max retries must be an int. Passed in value: {}r   r   openai)client_initialization_paramsclient_type)r   base_urlhttp_clientr   r   r   )openai_clientr   r   )r   r   r   )r5   rD   r   r-   formatget_cached_openai_clientr   r   r   _get_async_http_client_get_sync_http_clientset_cached_openai_clientr   )r3   r   r   r   r   r   r   r   r   r   cached_client_new_clients               r=   _get_openai_clientz'OpenAIChatCompletion._get_openai_clientQ  s    .4X$>k3/! #MTT#  !99-I$ : M
 mV4
!;9 )(:E#% 4 K K M# +!-; %#% 4 J J L# +!- )))-I$ * 
  ..)' / 
 Mr?   openai_aclientdatar   c                   K   t        j                          }	  |j                  j                  j                  j                  di |d|i d{   }t        j                          }t        |d      rt        |j                        }ni }|j                         }	||	fS 7 P# t        j                  $ rF}
t        j                          }t        ||z
  d      }|
xj                  d| d| dz  c_        |
d}
~
wt        $ r}
|
d}
~
ww xY ww)	
        Helper to:
        - call chat.completions.create.with_raw_response when litellm.return_response_headers is True
        - call chat.completions.create by default
        r   Nr   r(   z - timeout value=z, time taken=z secondsrQ   )timechatcompletionswith_raw_responsecreatehasattrr_   r   parser   APITimeoutErrorroundr   r   )r3   r   r   r   r   
start_timer   end_timer   responser   
time_deltas               r=   #make_openai_chat_completion_requestz8OpenAIChatCompletion.make_openai_chat_completion_request  s     YY[
	Nn))55GGNN $+  
 yy{H|Y/|334#))+HH$$ %% 	yy{Hx*4a8JII,WI]:,hWWIG 	G	sH   D7B" B AB" D B" "D	5AC66D	DD		Dr   c           
      T   d}	  |j                   j                  j                  j                  di |d|i}t	        |d      rt        |j                        }ni }|j                         }||fS # t        $ r.}|%t        dj                  ||t        |                  |d}~ww xY w)r   Nr   r   z9error - {}, Received response - {}, Type of response - {}rQ   )r   r   r   r   r   r_   r   r   r   r   type	r3   r   r   r   r   r   r   r   r   s	            r=   (make_sync_openai_chat_completion_requestz=OpenAIChatCompletion.make_sync_openai_chat_completion_request  s     	R=--99KKRR  'L |Y/|334#))+HH$$ 	'OVV<l);  	s   A+A0 0	B'9)B""B'r   rr   stream_optionsc                 >    t        |      }t        ||d||      }|S )N)r   r   )completion_streamrr   custom_llm_providerr   r   )r   r#   )r3   r   r   rr   r   r   r   s          r=   mock_streamingz#OpenAIChatCompletion.mock_streaming  s1     1I0/ (#)
 "!r?   Fr   rU   r   r~   print_verbosedynamic_paramsazure_ad_tokenacompletionr   custom_prompt_dictr   r   c                 :	   t         *|           	 d}|j                         }|j                  dd       }|j                  dd      }d }|"| t	        j
                  |t        |            }|
t               }|r|j                  |||      }|r||d<   ||t        dd	      t        |t              s't        |t        j                        st        dd
	      ||dk7  r| d| |_        t        d      D ]  }	 |j                  dd      }|du rO|du r'|du r#| j!                  ||||||||
|	|||||||      c S | j#                  |||||||||
|	|||||||      c S |j%                  |||||xs i       }|du r#|du r| j'                  |||||
|	||||||      c S t        |t(              st        dd	      | j+                  d|	|
|||||      }|j-                  ||j.                  ||j0                  j2                  ||d       | j5                  ||||      \  }}||j6                  d<   |j9                         } |j;                  ||	| d|i       t=        | ||      }!|du r%| j?                  tA        tB        |!      |||      c S |!c S  y # tD        jF                  $ r0}"tH        jJ                  du s|du rtM        |"|      }n|"Y d }"~"d }"~"wtN        $ r'}"| |dtQ        |"              dtQ        |"      v sd tQ        |"      v r|| |d!       g }#t        tS        |      d"z
        D ]_  }$|#jU                  ||$          ||$   d#   ||$d"z      d#   k(  s,||$   d#   d$k(  r|#jU                  d%d&d'       L|#jU                  d$d&d'       a |#jU                  |d(          |#}nNd)tQ        |"      v r||}#|#jU                  d$d&d'       |#}n&d*tQ        |"      v rtI        jV                  |+       n|"Y d }"~"d }"~"ww xY w# t        $ r}"|"d }"~"wtN        $ ro}"tY        |"d,d-      }%tY        |"d.d       }&tY        |"d/tQ        |"            }'tY        |"d0d       }(tY        |"d1d       })|&|(rtY        |(d.d       }&t        |%|'|&|)2      d }"~"ww xY w)3NFr   stream)rr   provider)rr   r   r   extra_headersr   zMissing model or messagesr   z,Timeout needs to be a float or httpx.Timeoutr   /r(   r   T)r   r   r~   rU   r   provider_configrr   r   r   r   r   r   r   r   r   r   )r~   rU   r   r  r   rr   r   r   r   r   r   r   r   r   r   r   fake_streamrr   r~   rU   r   r   )r   r   r   rr   r   r   r   r   r   r   r   r   max retries must be an intr   r   r   r   r   r   r   r   r   r   r   complete_input_dictinputr   additional_argsr   r   r   r   r   r
  r  r   r   r  )r   r   r   r   r   rr   r   z#openai.py: Received openai error - z0Conversation roles must alternate user/assistantz.user and assistant roles should be alternatingz!openai.py: REFORMATS THE MESSAGE!r*   roleuser	assistant )r  contentz"Last message must have role `user`z3unknown field: parameter index is not a valid field)r~   r     r   r   r   bodyr   r   r   r  )-rq   
completionr6   popr$   get_provider_chat_configr   ra   should_fake_streamr-   rD   floatr   Timeoutrr   rangeasync_streamingr   r   	streamingr   r   pre_callr   	_base_url_uri_referencer   r   
model_dumpr   r%   r   r   r!   r   UnprocessableEntityErrorrw   r   r.   r   r   lenappendremove_index_from_tool_callsgetattr)+r3   r   r   rU   r   r   rr   r~   r   r   r   r   r   r   r   	logger_fnr   r   r   r   r   r   r  inference_paramsr   r   r  _r   r   r   r   stringified_responser   r   new_messagesir   error_headers
error_texterror_response
error_bodyr9   s+                                             r=   r  zOpenAIChatCompletion.completion  s   0 	a	 %K.335-=-A-A $.N &6%9%9(E%JF48O".53D"7"P"P,7J*K# &"..-@@5HQW A  4; 1} 0!c;VWWgu-j7 " #J 
 #.3F(3R*=)>aw'G$h "2"6"6}a"HK"d*!T>kU.B#'#7#7,7(/)10@/=0?&+)1(/,7(/'-,7-9,7/=! $8 $ & $(#3#3)10@/=0?(/&+,7/=)1(/,7(/'-,7-9,7,7# $4 $ ( +<<#!)(8'5 '2 = D ~+*>#~~(3$+!%"'%-$+(3$+#)(3)5+9  .     *+s;"-,/9U#  150G0G%*$+%-(3$+(3)5#) 1H 	1 $,,"*$1$9$9+2,9,C,C,R,R/:7;	- - 	 !II*7!%$+(3	 J #$ NU667IJ/7/B/B/D,#--"*$+.B-BD,I	 .  .N,@2@.5.*
 '$.#'#6#6)-m=O)P,7&+/=	 $7 $   21AB 66  **d2kT6I+V/,(  	 ) ! ! $0%(KCPQF8&TUJcRSfTKsSTvU".(4)*MN')!&s8}q'8!9A(//<'{62hq1uof6MM#+A;v#6&#@$0$7$71<(L%& %1$7$7TV8W$X ": %++HRL9#/<AF".'/$++V,KL#/NRUS   <<hOC! D  	G 	!!]C8K#Ay$7M FCF3J$Q
D9N FD1J$ '	4 H'"%	 	s   C/P >J?P !J#P &>J$P 'C/JP JP P P2%KP P*B P+BPP PP 	RPR+A*RRr  r  c                   K   d }|j                  |||||xs i        d {   }t        d      D ]  }	 | j                  d|	|
|||||      }|j                  |d   |j                  dd|j                   i|j
                  j                  d|d	       | j                  ||||
       d {   \  }}|j                         }|j                  |d   |	|d|i       ||j                  d<   t        ||d|i|      }|du r%| j                  t        t        |      |||      c S |c S  y 7 7 # t        j                   $ r0}t"        j$                  du s|du rt'        ||      }n|Y d }~Bd }~wt(        $ ro}t+        |dd       }t+        |dd      }t+        |dd       }t+        |dd       }||rt+        |dd       }t+        |dt-        |            }t/        ||||      d }~ww xY ww)Nr  r(   Tr  r~   r   r   r	  r  r   r   r   r   r
  r  r   r   r   r  r   r   r  r  r   r  )async_transform_requestr   r   r#  r   r$  r%  r   r&  r   r   r%   r   r   r!   r   r'  rw   r   r.   r   r+  r   r-   )r3   r~   rU   r   r  rr   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r.  r   r/  r   r   exception_responser   exception_bodyr2  r   s                                  r=   r   z OpenAIChatCompletion.acompletion  s    * $<<+)Mr = 
 
 
AN.2.E.E!#% +# +!-! /F 	/ $$z**22 ,w~7M7M6N-O$ %3$<$<$K$K'+/3% %  +/*R*R#1# +	 +S + %! (0':':'<$%%z*#&:%:D$A	 &  FM../AB%E$8*8#,g"6&-	&" $&..!%m5G!H$/#'5	 /   *)w

H%> 22 &&$.+2EFq$ODG   %,Q
D%A"%a<!(FD!9 '9d ; (-?$+,>	4$PM!!YA7! +#)'	 se    G2D1G2A:D60D41A7D6(G2+D6,G24D66G/	%E4.G24G/ A*G**G//G2c           
         d|d<   |j                  | j                  ||             | j                  d|||||
||	      }|j                  |d   |dd|j                   i|j
                  j                  d|d	
       | j                  ||||      \  }}||j                  d<   t        ||d||j                  dd       |      }|S )NTr   r   r   Fr  r~   r   r   r	  r  r  r   r   r   r   rr   r   r   r   r   )updateget_stream_optionsr   r#  r   r$  r%  r   r   r#   get)r3   r   r   r   rr   r   r   r   r   r   r   r   r   r   r   streamwrappers                   r=   r"  zOpenAIChatCompletion.streamingW  s    X##>H#U	
 !% 7 7##% !8 	!
 	z"+w}7L7L6M-NO)33BB$'+	 	 		
 !II'#	 J 
 >E&&'9:+& (#88$4d;%
 r?   c                   K   d }|j                  |||||xs i       }d|d<   |j                  | j                  ||	             t        d      D ]  }	 | j	                  d||	|
||||      }|j                  |d   |||	d|d	       | j                  ||||
       d {   \  }}||j                  d<   t        ||d||j                  dd       |      }|c S  y 7 =# t        j                  $ r/}t        j                  du s|du rt        ||      }n|Y d }~d }~wt        $ r}t!        |t"              r|t%        |dd       }t%        |dd      }t%        |dd       }t%        |dd       }||rt%        |dd       }|3t'        |d      r't#        |t)        |       d|j*                   ||      t-        |      j.                  dk(  r#t#        dt-        |      j.                   ||      t'        |d      r#t#        t%        |dd      t)        |      ||      t#        dt)        |       ||      d }~ww xY ww)Nr  Tr   r<  r(   r  r~   r	  r  r7  r   r   r   r=  r   r   r  r   r  r   z

Original Response: r  ReadTimeouti  )r   r>  r?  r   r   r#  r   r   r#   r@  r   r'  rw   r   r.   r   rD   r-   r+  r   r   r   r   r[   )r3   r   r~   rU   r   r  rr   r   r   r   r   r   r   r   r   r   r   r   r   r.  r   rA  r   r2  r   r4  r:  s                              r=   r!  z$OpenAIChatCompletion.async_streaming  s    & 00+)Mr 1 
 X##>H#U	
 qAU.2.E.E!#% +# +!-! /F 	/ $$z*##*$,'+/3	% % 	 +/*R*R#1# +	 +S + %! FM../AB 3&.(0 +#'88,<d#C&-! %$O 0%  22 &&$.+2EFq$ODG  ( a-G '9d ;%a<!(J!=!(FD!9 (^$+NIt$LM'GHf,E%$/#&q6(*A(-- Q -+	  Aw''=8)(+'+Aw'7'7&8$1!/	  !M2)(/=#(F$'F$1!/	  *(+'*1vh$1!/	 G(sP   AIAC""C #8C"I C""I 5%DII ,DH;;I  Ic                 R    |d|iS |t        |      j                  dk(  rdddiiS i S )zL
        Pass `stream_options` to the data dict for OpenAI requests
        r   zapi.openai.cominclude_usageT)r   hostname)r3   r   r   s      r=   r?  z'OpenAIChatCompletion.get_stream_options	  sE     %$n55 8H#5#>#>BR#R(?D*ABB	r?   c                    K   	  |j                   j                  j                  di |d|i d{   }t        |j                        }|j                         }||fS 7 -# t        $ r}|d}~ww xY wwz
        Helper to:
        - call embeddings.create.with_raw_response when litellm.return_response_headers is True
        - call embeddings.create by default
        r   NrQ   
embeddingsr   r   r_   r   r   r   )	r3   r   r   r   r   r   r   r   r   s	            r=   make_openai_embedding_requestz2OpenAIChatCompletion.make_openai_embedding_request  s     	!S!:!:!L!L!S!S "" '" L <//0G#))+HH$$  	G	s8   A4-A! A,A! A4A! !	A1*A,,A11A4c                     	  |j                   j                  j                  di |d|i}t        |j                        }|j                         }||fS # t        $ r}|d}~ww xY wrH  rI  r   s	            r=   "make_sync_openai_embedding_requestz7OpenAIChatCompletion.make_sync_openai_embedding_request/  su    		L=33EELL  'L <//0G#))+HH$$ 	G	s   AA 	A%A  A%r  c
           	        K   	 | j                  d||||	|      }
| j                  |
|||       d {   \  }}||j                  d<   |j                         }|j	                  ||d|i|       t        ||d|      }|S 7 N# t        $ r'}|j	                  ||d|it        |             |d }~wt        $ r}|j	                  ||d|it        |             t        |d	d
      }t        |dd       }t        |dt        |            }t        |dd       }||rt        |dd       }t        |||      d }~ww xY ww)NTr   r   r   r   r   r   r7  r   r
  r  r   r  r   	embedding)r   r   response_typer   r   r  r   r   r   r   )
r   rK  r   r&  r   r%   r-   r   r   r+  )r3   r  r   r   r   r   r   r   r   r   r   r   r   r/  returned_responser   r   r2  r3  r4  s                       r=   
aembeddingzOpenAIChatCompletion.aembeddingG  s    8	*.*A*A!' +B +N '+&H&H-'	 'I ' !GX BIK**+=>#+#6#6#8 !!!6 ="6	 "  4T 4&4)")	4 %$+!,  	!!!6 ="%a&	 "  G 	!!!6 ="%a&	 "  "!]C8K#Ay$7M FCF3J$Q
D9N$ '	4 H'] 	sF   D?/B BAB D?B 	D<"B//D<;A<D77D<<D?c                    t         |           	 |}||d|}|xs t        j                  }t	        |t
              st        dd      |j                  ||||d       |
du r| j                  ||||||||	|	      S | j                  d	|||||	
      }d }| j                  ||||      \  }}||j                  d<   |j                  ||d|i|       t        |j                         ||d      }|S # t        $ r}|d }~wt        $ ra}t!        |dd      }t!        |dd       }t!        |dt#        |            }t!        |dd       }||rt!        |dd       }t        |||      d }~ww xY w)N)rr   r  r   r  r   )r
  r   r  T)	r   r  r   r   r   r   r   r   r   FrO  r  r   r
  rP  rQ  )r   r   r   rR  r   r  r   r   r   r   )rq   rQ  rw   r   rD   r   r-   r#  rT  r   rM  r   r   r%   r&  r   r+  r   )r3   rr   r  r   r   r   rU   r   r   r   rT  r   r   r   r   sync_embedding_responser   r   r   r2  r3  r4  r9   s                         r=   rQ  zOpenAIChatCompletion.embedding  s    	F	E"UFoFD%D)D)DKk3/!c;WXX  8<( S !  T! +#1%##! + ' 
 
 %)$;$;!' %< %M '+G/3/V/V+'	 0W 0,G, BIK**+=>!!!6 ="9	 "  +K 7 B B D&4"))	+H O 	G 		!!]C8K#Ay$7M FCF3J$Q
D9N$ '	4 H'] 		s,   A.C6  A5C6 6	E.?DE.AE))E.promptc
                 \  K   d }
	 | j                  d||||	|      } |j                  j                  d	i |d|i d {   }
|
j                         }|j	                  ||d|i|       t        ||d      S 7 9# t        $ r$}|j	                  ||t        |             |d }~ww xY ww)
NTrO  r   r
  rP  image_generationr   r   rR  )r  r   r   rQ   )r   imagesgenerater&  r   r%   r   r   )r3   rW  r   r   r   r   r   r   r   r   r   r   r/  r   s                 r=   aimage_generationz&OpenAIChatCompletion.aimage_generation  s      	!44!' 5 N <^22;;TdTGTTH#+#6#6#8 !!!6 ="6	 "  4DXp~  Oa  b  b U  	!!"%a& " 
 G	s:   B,:A<  A:8A< 9B,:A< <	B)B$$B))B,c                 \   i }	 |}||d|}|j                  dd      }t        |t              st        dd      |
du r| j	                  ||||||||	|	      S | j                  d	|||||	
      }|j                  ||j                  dd|j                   i|j                  j                  d|d        |j                  j                  di |d|i}|j                         }|j                  ||d|i|       t        ||d      S # t        $ r'}|j                  ||d|it        |             |d }~wt         $ rh}|j                  ||d|it        |             t#        |d      r!t        t%        |dd      t        |            t        dt        |            d }~ww xY w)N)rr   rW  r   r(   r   r  r   T)	r   rW  r   r   r   r   r   r   r   FrO  r   r   r	  r  r   r
  rP  rY  rZ  r   r  rQ   )r  rD   r   r-   r]  r   r#  r   r$  r%  r[  r\  r&  r   r%   r   r   r   r+  )r3   rr   rW  r   rU   r   r   r   r   r   aimg_generationr   r   r   	_responser   r   s                    r=   rY  z%OpenAIChatCompletion.image_generation  s2    A	CE"fHHD((=!4Kk3/!c;WXX$&--4T_p~  JR  \c  mt  }C  Q\-  ]  ]$($;$;!' %< %M   %-- /7=;P;P:Q1RS - 7 7 F F#'+/	! ! 	 6,,55NNgNI ++-H!!!6 ="*	 "  4Hdr  CU  V  V 	!!!6 ="%a&	 "  G 	C!!!6 ="%a&	 "  q-(! '=# >A  "c3q6BB	Cs,   AD B1D 	F+"D77F+A#F&&F+voiceprojectaspeechc                    | |du r| j                  |||||||||	|
|      S | j                  d|||
|	|      } t        t        |      j                  j
                  j                  d|||d|}t        |j                        S )NT)rr   r  ra  rU   r   r   r   rb  r   r   r   FrO  rr   ra  r  r   rQ   )	async_audio_speechr   r   r   audiospeechr   HttpxBinaryResponseContentr   )r3   rr   r  ra  rU   r   r   r   rb  r   r   rc  r   r   r   s                  r=   audio_speechz!OpenAIChatCompletion.audio_speech_  s     7d?** /!)' +   //# 0 
 C4.44;;BB 

 	
 *83D3DEEr?   c                    K   t        t        | j                  d|||
|	|            } |j                  j                  j
                  d|||d| d {   }t        |j                        S 7 w)NTrO  re  rf  rQ   )r   r   r   rh  ri  r   rj  r   )r3   rr   r  ra  rU   r   r   r   rb  r   r   r   r   r   s                 r=   rg  z'OpenAIChatCompletion.async_audio_speech  s      ##!' $ 

 ;,,33:: 

 	
 
 *83D3DEE
s   AA2A0A2rY   r   rp   )
NNNNNNNNNF)NNNNNNNN)	NNNNNNNNN)NNNN)NNNNN)0r[   r\   r]   r>   r   r   r   r   r   r   r   r   r  r   r   r  r   r   r_   r   Tupler   r   r   r!   r#   r   r   r   r   r  r   r   r"  r!  r?  rK  rM  r   rT  rQ  r]  r   rY  rj  rk  rg  r   r   s   @r=   r   r   B  s	    '+%)		-fk)*	- sm	- c]		- "&"&%)/<u}}T/B%8&*7;?? #? 3-	?
 c]? uemm+,? c]? sm? v{234? 
%+,	-?B !#! ! uemm+,	!
 '! 
tY	! !F      uemm+,	 
 '  
tY	   N *."" '" 	"
 !" 
"2  $#',0!%"&%))-(,!"&#%&*-1&*-z%z uemm+,z 	z
 z z }z 4.z  )z #z 3-z c]z !z !z z" $#z$ !%z( sm)z* &c]+z, d^-zL "&"&%)&*&*)-!'nn n 	n
 $n n &n 'n uemm+,n #n 3-n c]n smn" d^#n$ !%n& 'nl "&"&%)&*)-9 uemm+,9 	9
 9 #9 3-9 c]9 sm9 !9H "&"&%)&*&*)-#uuemm+,u u 	u
 u $u u 'u #u 3-u c]u smu  d^!u" !#un&tn8@	 #  uemm+,	
 ' ,   uemm+,	
 ' < "&"&(,DD D *	D
 D 'D #D 3-D %D\ "&"&%)UU U 	U *U U #U 3-U c]U 
U| "&"&(( ( &	(
 ( ( #( 3-(b "&"&26OC}OC OC 	OC
 OC OC #OC 3-OC !/OC 
OCz #'-F-F -F 	-F
 -F #-F 3--F sm-F #-F -F uemm+,-F $-F 
$-Fv !F!F !F 	!F
 !F #!F 3-!F sm!F #!F !F uemm+,!F 
$!Fr?   r   c                   j    e Zd ZdZd fdZ	 	 ddee   dee   deee	j                  f   dee   dee   d	eeeef      d
edeeeef      fdZdededefdZ	 dd
edededee   deee	j                  f   dee   dee   d	eeeef      deeeeeef   f   fdZdededefdZ	 dd
edededee   deee	j                  f   dee   dee   d	eeeef      deeeeeef   f   fdZdededefdZ	 dd
edededee   deee	j                  f   dee   dee   d	eeeef      fdZdededefdZ	 dd
edededee   deee	j                  f   dee   dee   d	eeeef      fdZ	 ddedee   fdZ 	 	 dd
ededee   deee	j                  f   dee   dee   dee   d	eeeef      fdZ! xZ"S )OpenAIFilesAPIz
    OpenAI methods to support for batches
    - create_file()
    - retrieve_file()
    - list_files()
    - delete_file()
    - file_content()
    - update_file()
    rZ   c                 "    t         |           y rp   r   r   s    r=   r>   zOpenAIFilesAPI.__init__  r   r?   r   r   r   r   r   r   	_is_asyncc                     t               }d }	|]i }
|j                         D ]*  \  }}|dk(  s
|dk(  s|dk(  r|dk(  r|||
d<   #|&||
|<   , |du rt        di |
}	|	S t        di |
}	|	S |}	|	S Nr3   r   rq  r   r   TrQ   r5   r7   r   r   r3   r   r   r   r   r   r   rq  received_argsr   r   rK   rL   s                r=   get_openai_clientz OpenAIFilesAPI.get_openai_client       >B>D%++-1;!x-13C*_'(D$]DG . D  + 3d 3 	 !'  #Mr?   create_file_datar   c                    K    |j                   j                  di | d {   }t        di |j                         S 7 wNrQ   )filesr   OpenAIFileObjectr&  )r3   ry  r   r   s       r=   acreate_filezOpenAIFilesAPI.acreate_file  sD     
 4,,33G6FGG8("5"5"788 H    AA Ac	           	      6   | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S  t        t        |	      j                  j                  di |}
t        di |
j                         S )Nr   r   r   r   r   r   rq  jOpenAI client is not initialized. Make sure api_key is passed or OPENAI_API_KEY is set in the environment.T\OpenAI client is not an instance of AsyncOpenAI. Make sure you passed an AsyncOpenAI client.)ry  r   rQ   )rw  
ValueErrorrD   r   r~  r   r   r|  r   r}  r&  )r3   rq  ry  r   r   r   r   r   r   r   r   s              r=   create_filezOpenAIFilesAPI.create_file  s     ?C>T>T#% ?U ?
  |  m[9 r  $$!1 %   <4.44;;O>NO8("5"5"788r?   file_content_requestc                    K    |j                   j                  di | d {   }t        |j                        S 7 w)Nrf  rQ   )r|  r  rj  r   )r3   r  r   r   s       r=   afile_contentzOpenAIFilesAPI.afile_content
  s>     
 5,,44L7KLL)83D3DEE Ms    ?=?c	           	      0   | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S  t        t        |	      j                  j                  di |}
t        |
j                        S )Nr  r  Tr  )r  r   rf  rQ   )rw  r  rD   r   r  r   r   r|  r  rj  r   )r3   rq  r  r   r   r   r   r   r   r   r   s              r=   file_contentzOpenAIFilesAPI.file_content  s     ?C>T>T#% ?U ?
  |  m[9 r  %%%9+ &   =4.44<<T?ST)83D3DEEr?   file_idc                 Z   K   |j                   j                  |       d {   }|S 7 wNr  )r|  retriever3   r  r   r   s       r=   aretrieve_filezOpenAIFilesAPI.aretrieve_file:  s/     
 ',,55g5FF G    +)+c	           	          | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S |	j
                  j                  |      }
|
S Nr  r  Tr  )r  r   r  )rw  r  rD   r   r  r|  r  r3   rq  r  r   r   r   r   r   r   r   r   s              r=   retrieve_filezOpenAIFilesAPI.retrieve_fileB  s     ?C>T>T#% ?U ?
  |  m[9 r  &&+ '   !&&///@r?   c                 Z   K   |j                   j                  |       d {   }|S 7 wr  )r|  deleter  s       r=   adelete_filezOpenAIFilesAPI.adelete_fileh  s/     
 ',,33G3DD Er  c	           	          | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S |	j
                  j                  |      }
|
S r  )rw  r  rD   r   r  r|  r  r  s              r=   delete_filezOpenAIFilesAPI.delete_filep  s     ?C>T>T#% ?U ?
  |  m[9 r  $$+ %   !&&--g->r?   purposec                    K   t        |t              r&|j                  j                  |       d {   }|S |j                  j                          d {   }|S 7 *7 w)Nr  )rD   r   r|  r   )r3   r   r  r   s       r=   alist_fileszOpenAIFilesAPI.alist_files  s]     
 gs#*0055g5FFH  +005577H G7s!   0A!A#A!AA!A!c	           	      D   | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S t        |t
              r|	j                  j                  |      }
|
S |	j                  j                         }
|
S )Nr  r  Tr  )r  r   r  )rw  r  rD   r   r  r   r|  r   )r3   rq  r   r   r   r   r   r  r   r   r   s              r=   
list_fileszOpenAIFilesAPI.list_files  s     ?C>T>T#% ?U ?
  |  m[9 r  ##+ $  
 gs#$**///@H  %**//1Hr?   rY   NFrp   r   )#r[   r\   r]   r^   r>   r   r   r   r  r   r  r   r   r   r   rw  CreateFileRequestr}  r~  r   r   r  FileContentRequestrj  r  r  
FileObjectr  r  r   r  r  r  r  r   r   s   @r=   ro  ro    s,    8<# 3- uemm+,	
 c] sm v{234  
%+,	-<9+9 #9 
	9" 8<"9"9 ,"9 	"9
 #"9 uemm+,"9 c]"9 sm"9 v{234"9 
35E+E!FF	G"9HF0F #F 
$	F" 8<&F&F 1&F 	&F
 #&F uemm+,&F c]&F sm&F v{234&F 
"Ic38R.R$SS
&FP # 
	" 8<$$ $ 	$
 #$ uemm+,$ c]$ sm$ v{234$L # 
	" 8<$$ $ 	$
 #$ uemm+,$ c]$ sm$ v{234$R "&	"	 #	& "&7;(( ( #	(
 uemm+,( c]( sm( #( v{234(r?   ro  c                       e Zd ZdZd fdZ	 	 ddee   dee   deee	j                  f   dee   dee   d	eeeef      d
edeeeef      fdZdededefdZ	 dd
ededee   dee   deee	j                  f   dee   dee   d	eeeef      deeeeeef   f   fdZdededefdZ	 dd
ededee   dee   deee	j                  f   dee   dee   d	ee   fdZdededefdZ	 dd
ededee   dee   deee	j                  f   dee   dee   d	ee   fdZ	 	 ddedee   dee   fdZ	 	 	 dd
edee   dee   deee	j                  f   dee   dee   dee   dee   d	ee   fdZ xZS )OpenAIBatchesAPIz
    OpenAI methods to support for batches
    - create_batch()
    - retrieve_batch()
    - cancel_batch()
    - list_batch()
    rZ   c                 "    t         |           y rp   r   r   s    r=   r>   zOpenAIBatchesAPI.__init__  r   r?   r   r   r   r   r   r   rq  c                     t               }d }	|]i }
|j                         D ]*  \  }}|dk(  s
|dk(  s|dk(  r|dk(  r|||
d<   #|&||
|<   , |du rt        di |
}	|	S t        di |
}	|	S |}	|	S rs  rt  ru  s                r=   rw  z"OpenAIBatchesAPI.get_openai_client  rx  r?   create_batch_datar   c                    K    |j                   j                  di | d {   }t        di |j                         S 7 wr{  )batchesr   r    r&  )r3   r  r   r   s       r=   acreate_batchzOpenAIBatchesAPI.acreate_batch  sD     
 6..55J8IJJ4h11344 Kr  c	           	      6   | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S  t        t        |	      j                  j                  di |}
t        di |
j                         S )Nr  r  Tr  )r  r   rQ   )rw  r  rD   r   r  r   r   r  r   r    r&  )r3   rq  r  r   r   r   r   r   r   r   r   s              r=   create_batchzOpenAIBatchesAPI.create_batch  s     ?C>T>T#% ?U ?
  |  m[9 r  %%"3= &   >4.66==R@QR4h11344r?   retrieve_batch_datac                    K   t        j                  d|        |j                  j                  di | d {   }t	        di |j                         S 7 w)Nzretrieving batch, args= %srQ   )r   debugr  r  r    r&  )r3   r  r   r   s       r=   aretrieve_batchz OpenAIBatchesAPI.aretrieve_batch#  sV     
 	9;NO7..77N:MNN4h11344 Os   6AAAc	           	      6   | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S  t        t        |	      j                  j                  di |}
t        di |
j                         S )Nr  r  Tr  )r  r   rQ   )rw  r  rD   r   r  r   r   r  r  r    r&  )r3   rq  r  r   r   r   r   r   r   r   r   s              r=   retrieve_batchzOpenAIBatchesAPI.retrieve_batch,  s     ?C>T>T#% ?U ?
  |  m[9 r  ''$7} (   @4.66??VBUV4h11344r?   cancel_batch_datac                    K   t        j                  d|        |j                  j                  di | d {   }|S 7 w)Nz async cancelling batch, args= %srQ   )r   r  r  cancel)r3   r  r   r   s       r=   acancel_batchzOpenAIBatchesAPI.acancel_batchP  sD     
 	?ARS5..55J8IJJ Ks   6A?Ac	           	          | j                  |||||||      }	|	t        d      |du r.t        |	t              st        d      | j	                  ||	      S  |	j
                  j                  di |}
|
S )Nr  r  Tr  )r  r   rQ   )rw  r  rD   r   r  r  r  )r3   rq  r  r   r   r   r   r   r   r   r   s              r=   cancel_batchzOpenAIBatchesAPI.cancel_batchY  s     ?C>T>T#% ?U ?
  |  m[9 r  %%"3= &   0=((//D2CDr?   afterlimitc                    K   t        j                  d||       |j                  j                  ||       d {   }|S 7 w)Nz%listing batches, after= %s, limit= %sr  r  )r   r  r  r   )r3   r   r  r  r   s        r=   alist_batcheszOpenAIBatchesAPI.alist_batches~  sD      	DeUS&..33%u3MM Ns   8AAAc
           	          | j                  ||||||	|      }
|
t        d      |du r/t        |
t              st        d      | j	                  |
||      S |
j
                  j                  ||      }|S )Nr  r  Tr  )r   r  r  r  )rw  r  rD   r   r  r  r   )r3   rq  r   r   r   r   r   r  r  r   r   r   s               r=   list_batcheszOpenAIBatchesAPI.list_batches  s     ?C>T>T#% ?U ?
  |  m[9 r  %%+5 &   !((--E-Gr?   rY   r  rp   r   NNN) r[   r\   r]   r^   r>   r   r   r   r  r   r  r   r   r   r   rw  CreateBatchRequestr    r  r   r   r  RetrieveBatchRequestr  r  CancelBatchRequestBatchr  r  r  r  r   r   s   @r=   r  r    si    8<# 3- uemm+,	
 c] sm v{234  
%+,	-<5-5 #5 
	5" 8<#5#5 .#5 #	#5
 3-#5 uemm+,#5 c]#5 sm#5 v{234#5 
|YsC'=>>	?#5J515 #5 
	5$ $("5"5 2"5 #	"5
 3-"5 uemm+,"5 c]"5 sm"5  "5H- # 
	$ $(## .# #	#
 3-# uemm+,# c]# sm#  #P  $#	" } }	$  $##'## ## 3-	#
 uemm+,# c]# sm# }# }#  #r?   r  c            $           e Zd ZdC fdZ	 dDdee   dee   deeej                  f   dee
   dee   d	ee   defd
Z	 dDdee   dee   deeej                  f   dee
   dee   d	ee   defdZ	 	 	 	 dEdee   dee   deeej                  f   dee
   dee   d	ee   dee   dee
   dee   dee   dee   fdZedee   dee   deeej                  f   dee
   dee   d	ee   ded   deddee   f   fd       Zedee   dee   deeej                  f   dee
   dee   d	ee   deed      dee   fd       Z	 	 	 	 	 	 dFdee   dee   deeej                  f   dee
   dee   dee   dee
   dee   dee   fdZdee   dee   deeej                  f   dee
   dee   d	ee   dedefdZ	 	 dGdee   dee   deeej                  f   dee
   dee   defdZdee   dee   deeej                  f   dee
   dee   d	ee   dedefdZ	 	 dGdee   dee   deeej                  f   dee
   dee   defdZ	 dDdededee   dee   deeej                  f   dee
   dee   d	ee   defdZedededee   dee   deeej                  f   dee
   dee   d	ee   d ed   deddef   fd!       Zedededee   dee   deeej                  f   dee
   dee   d	ee   d eed      defd"       Z	 	 dGdededee   dee   deeej                  f   dee
   dee   d ee    fd#Z	 dDdedee   dee   deeej                  f   dee
   dee   d	ee   dee   fd$Z!ededee   dee   deeej                  f   dee
   dee   d	ee   d%ed   deddee   f   fd&       Z"ededee   dee   deeej                  f   dee
   dee   d	ee   d%eed      dee   fd'       Z"	 	 dGdedee   dee   deeej                  f   dee
   dee   fd(Z"d)ee   dee   dee   deeej                  f   dee
   dee   d	ee   d*ee#e$      de%fd+Z&ed)ee   dee   dee   deeej                  f   dee
   dee   d*ee#e$      d	ee   d,ed   dedde%f   fd-       Z'ed)ee   dee   dee   deeej                  f   dee
   dee   d*ee#e$      d	ee   d,eed      de%fd.       Z'	 	 dGd)ee   dee   dee   deeej                  f   dee
   dee   d*ee#e$      fd/Z'dedee   dee   deeej                  f   dee
   dee   d	ee   de%fd0Z(ededee   dee   deeej                  f   dee
   dee   d	ee   d1ed   dedde%f   fd2       Z)ededee   dee   deeej                  f   dee
   dee   d	ee   d1eed      de%fd3       Z)	 	 dGdedee   dee   deeej                  f   dee
   dee   fd4Z)d5 Z*deded6ee   d7ee   d)ee+   d8ee   d9ee    d:ee#e,      dee   dee   deeej                  f   dee
   dee   d	ee   de-fd;Z.d	ededed6ee   d7ee   d)ee+   d8ee   d:ee#e,      d<ee/   de0e1   fd=Z2d	ededed6ee   d7ee   d)ee+   d8ee   d:ee#e,      d<ee/   de3e/   fd>Z4ededed6ee   d7ee   d)ee+   d8ee   d9ee    d:ee#e,      dee   dee   deeej                  f   dee
   dee   d?ed   d<ee/   dedde-f   f d@       Z5ededed6ee   d7ee   d)ee+   d8ee   d9ee    d:ee#e,      dee   dee   deeej                  f   dee
   dee   d?eed      d<ee/   de-f dA       Z5	 	 	 dHdeded6ee   d7ee   d)ee+   d8ee   d9ee    d:ee#e,      dee   dee   deeej                  f   dee
   dee   d<ee/   fdBZ5 xZ6S )IOpenAIAssistantsAPIrZ   Nc                 "    t         |           y rp   r   r   s    r=   r>   zOpenAIAssistantsAPI.__init__  r   r?   r   r   r   r   r   r   c                     t               }|Gi }|j                         D ]%  \  }	}
|	dk(  s|	dk(  r|	dk(  r|
|
|d<   |
!|
||	<   ' t        di |}|S |}|S Nr3   r   r   r   rQ   )r5   r7   r   r3   r   r   r   r   r   r   rv  r   rK   rL   r   s               r=   rw  z%OpenAIAssistantsAPI.get_openai_client  s     >D%++-1;!x-*_'(D$]DG . #NTNM  #Mr?   c                     t               }|Gi }|j                         D ]%  \  }	}
|	dk(  s|	dk(  r|	dk(  r|
|
|d<   |
!|
||	<   ' t        di |}|S |}|S r  )r5   r7   r   r  s               r=   async_get_openai_clientz+OpenAIAssistantsAPI.async_get_openai_client  s     >D%++-1;!x-*_'(D$]DG . (/$/M  #Mr?   orderr  beforer  c                    K   | j                  ||||||      }||d}|	r|	|d<   |
r|
|d<    |j                  j                  j                  di | d {   }|S 7 w)Nr   r   r   r   r   r   r  r  r  r  rQ   )r  beta
assistantsr   )r3   r   r   r   r   r   r   r  r  r  r  r   request_paramsr   s                 r=   async_get_assistantsz(OpenAIAssistantsAPI.async_get_assistants  s      44#% 5 
 
 '-N8$&+N7#;++66;;MnMM Ns   AAAAaget_assistantsTc                      y rp   rQ   r3   r   r   r   r   r   r   r  s           r=   get_assistantsz"OpenAIAssistantsAPI.get_assistants
       	r?   Fc                      y rp   rQ   r  s           r=   r  z"OpenAIAssistantsAPI.get_assistants  r  r?   c                     ||du r| j                  ||||||      S | j                  ||||||      }||	d}|
r|
|d<   |r||d<    |j                  j                  j                  di |}|S )NTr  r  r  r  rQ   )r  rw  r  r  r   )r3   r   r   r   r   r   r   r  r  r  r  r  r   r  r   s                  r=   r  z"OpenAIAssistantsAPI.get_assistants&  s     &?d+B,,!') -   ..#% / 
 

 '-N8$&+N7#5=%%0055GGr?   create_assistant_datac                    K   | j                  ||||||      } |j                  j                  j                  di | d {   }	|	S 7 w)Nr  rQ   )r  r  r  r   )
r3   r   r   r   r   r   r   r  r   r   s
             r=   async_create_assistantsz+OpenAIAssistantsAPI.async_create_assistantsU  sa      44#% 5 
 >++66==V@UVV W   AAA
Ac	           	          ||du r| j                  |||||||      S | j                  ||||||      }	 |	j                  j                  j                  di |}
|
S )NT)r   r   r   r   r   r   r  r  rQ   )r  rw  r  r  r   )r3   r   r   r   r   r   r  r   r  r   r   s              r=   create_assistantsz%OpenAIAssistantsAPI.create_assistantsl  s     #.3Jd3R//!')&; 0   ..#% / 
 8=%%0077P:OPr?   assistant_idc                    K   | j                  ||||||      }|j                  j                  j                  |       d {   }	|	S 7 w)Nr  r  )r  r  r  r  )
r3   r   r   r   r   r   r   r  r   r   s
             r=   async_delete_assistantz*OpenAIAssistantsAPI.async_delete_assistant  s^      44#% 5 
 '++66==<=XX Yr  c	           	          ||du r| j                  |||||||      S | j                  ||||||      }	|	j                  j                  j	                  |      }
|
S )NT)r   r   r   r   r   r   r  r  r  )r  rw  r  r  r  )r3   r   r   r   r   r   r  r   async_delete_assistantsr   r   s              r=   delete_assistantz$OpenAIAssistantsAPI.delete_assistant  s     #.3Jd3R..!')) /   ..#% / 
 !%%0077\7Rr?   	thread_idmessage_datac	                 F  K   | j                  ||||||      }	 |	j                  j                  j                  j                  |fi | d {   }
d }t        |
dd       "d|
_        t        di |
j                         }|S t        di |
j                         }|S 7 Pw)Nr  status	completedrQ   )	r  r  threadsr~   r   r+  r  OpenAIMessager_   )r3   r  r  r   r   r   r   r   r   r   thread_messageresponse_objs               r=   a_add_messagez!OpenAIAssistantsAPI.a_add_message  s      44#% 5 
 /Ym.@.@.H.H.Q.Q.X.X/
%/
 )
 15>8T2:$/N!(A>+>+>+@AL  )A>+>+>+@AL)
s   AB!BAB!r  c
                      y rp   rQ   
r3   r  r  r   r   r   r   r   r   r  s
             r=   add_messagezOpenAIAssistantsAPI.add_message       	r?   c
                      y rp   rQ   r  s
             r=   r  zOpenAIAssistantsAPI.add_message  r  r?   c
           
      h   |	|	du r| j                  ||||||||      S | j                  ||||||      }
 |
j                  j                  j                  j
                  |fi |}d }t        |dd       "d|_        t        di |j                         }|S t        di |j                         }|S )NT)r  r  r   r   r   r   r   r   r  r  r  rQ   )
r  rw  r  r  r~   r   r+  r  r  r_   )r3   r  r  r   r   r   r   r   r   r  r   r  r  s                r=   r  zOpenAIAssistantsAPI.add_message
	  s     $$)>%%#)!') & 	 	 ..#% / 
 )S(:(:(B(B(K(K(R(R)
%)
 15>8T2:$/N!(A>+>+>+@AL  )A>+>+>+@ALr?   c                    K   | j                  ||||||      }|j                  j                  j                  j	                  |       d {   }	|	S 7 w)Nr  r  )r  r  r  r~   r   
r3   r  r   r   r   r   r   r   r   r   s
             r=   async_get_messagesz&OpenAIAssistantsAPI.async_get_messages6	  sd      44#% 5 
 '++33<<AAIAVV Ws   AAAAaget_messagesc	                      y rp   rQ   	r3   r  r   r   r   r   r   r   r  s	            r=   get_messagesz OpenAIAssistantsAPI.get_messagesO	       	r?   c	                      y rp   rQ   r  s	            r=   r  z OpenAIAssistantsAPI.get_messages]	  r  r?   c	           	          ||du r| j                  |||||||      S | j                  ||||||      }	|	j                  j                  j                  j                  |      }
|
S )NTr  r   r   r   r   r   r   r  r  )r   rw  r  r  r~   r   )r3   r  r   r   r   r   r   r   r  r   r   s              r=   r  z OpenAIAssistantsAPI.get_messagesm	  s     $$)>**#!') +   ..#% / 
 !%%--66;;i;Pr?   metadatar~   c	                    K   | j                  ||||||      }	i }
|||
d<   |||
d<    |	j                  j                  j                  di |
 d {   }t	        di |j                         S 7 w)Nr  r~   r	  rQ   )r  r  r  r   Threadr_   )r3   r	  r   r   r   r   r   r   r~   r   r   message_threads               r=   async_create_threadz'OpenAIAssistantsAPI.async_create_thread	  s      44#% 5 
 'D'D@}1199@@H4HH.++-.. Is   AA3A1A3acreate_threadc
                      y rp   rQ   
r3   r	  r   r   r   r   r   r~   r   r  s
             r=   create_threadz!OpenAIAssistantsAPI.create_thread	  r  r?   c
                      y rp   rQ   r  s
             r=   r  z!OpenAIAssistantsAPI.create_thread	  r  r?   c
           
         |	|	du r| j                  ||||||||      S | j                  ||||||      }
i }|||d<   |||d<    |
j                  j                  j                  di |}t        di |j                         S )a-  
        Here's an example:
        ```
        from litellm.llms.openai.openai import OpenAIAssistantsAPI, MessageData

        # create thread
        message: MessageData = {"role": "user", "content": "Hey, how's it going?"}
        openai_api.create_thread(messages=[message])
        ```
        T)r	  r   r   r   r   r   r   r~   r  r~   r	  rQ   )r  rw  r  r  r   r  r_   )r3   r	  r   r   r   r   r   r~   r   r  r   r   r  s                r=   r  z!OpenAIAssistantsAPI.create_thread	  s    , %.D*@++!!')! , 	 	 ..#% / 
 'D'D:++33::BTB.++-..r?   c                    K   | j                  ||||||      }|j                  j                  j                  |       d {   }	t	        di |	j                         S 7 w)Nr  r  rQ   )r  r  r  r  r  r_   r  s
             r=   async_get_threadz$OpenAIAssistantsAPI.async_get_thread
  sm      44#% 5 
 '++33<<y<QQ((( Rs   AA#A!A#aget_threadc	                      y rp   rQ   	r3   r  r   r   r   r   r   r   r  s	            r=   
get_threadzOpenAIAssistantsAPI.get_thread
  r  r?   c	                      y rp   rQ   r  s	            r=   r  zOpenAIAssistantsAPI.get_thread,
  r  r?   c	           	          ||du r| j                  |||||||      S | j                  ||||||      }	|	j                  j                  j	                  |      }
t        di |
j                         S )NTr  r  r  rQ   )r  rw  r  r  r  r  r_   )r3   r  r   r   r   r   r   r   r  r   r   s              r=   r  zOpenAIAssistantsAPI.get_thread<
  s     "{d':((#!') )   ..#% / 
 !%%--666K(((r?   c                      y rp   rQ   rR   s    r=   delete_threadz!OpenAIAssistantsAPI.delete_thread^
  s    r?   additional_instructionsinstructionsrr   r   toolsc           	         K   | j                  |	|
||||      }|j                  j                  j                  j	                  |||||||       d {   }|S 7 w)Nr  r  r  r  r  r	  rr   r   )r  r  r  runscreate_and_poll)r3   r  r  r  r  r	  rr   r   r   r   r   r   r   r   r   r   r   s                    r=   arun_threadzOpenAIAssistantsAPI.arun_threadc
  s     " 44#% 5 
 '++3388HH%$;% I 
 
 
s   AAAAevent_handlerc
                     |||||||d}
|	|	|
d<    |j                   j                  j                  j                  di |
S Nr"  r&  rQ   r  r  r#  r   r3   r   r  r  r  r  r	  rr   r   r&  r   s              r=   async_run_thread_streamz+OpenAIAssistantsAPI.async_run_thread_stream
  X     #('>(  
 $$1D!.v{{""''..666r?   c
                     |||||||d}
|	|	|
d<    |j                   j                  j                  j                  di |
S r(  r)  r*  s              r=   run_thread_streamz%OpenAIAssistantsAPI.run_thread_stream
  r,  r?   r%  c                      y rp   rQ   r3   r  r  r  r  r	  rr   r   r   r   r   r   r   r   r   r%  r&  s                    r=   
run_threadzOpenAIAssistantsAPI.run_thread
      ( 	r?   c                      y rp   rQ   r0  s                    r=   r1  zOpenAIAssistantsAPI.run_thread
  r2  r?   c                    |Z|du rV|5|du r1| j                  |	|
||||      }| j                  |||||||||	      S | j                  |||||||||	|
||||      S | j                  |	|
||||      }||du r| j	                  |||||||||	      S |j
                  j                  j                  j                  |||||||      }|S )NTr  )	r   r  r  r  r  r	  rr   r   r&  )r  r  r  r  r	  rr   r   r   r   r   r   r   r   r   r"  )	r  r+  r%  rw  r.  r  r  r#  r$  )r3   r  r  r  r  r	  rr   r   r   r   r   r   r   r   r   r%  r&  _clientr   r   s                       r=   r1  zOpenAIAssistantsAPI.run_thread
  sm   & "{d':!fn66#%# +!-! 7  33"'!-,C!-%"/ 4 
 
 ###)(?)!!') $    ..#% / 
 &D.))$#)(?)!+ * 
 
 !%%--22BB%$;% C 
 r?   rY   rp   )desc   NN)NNr6  r7  NNr   r  )7r[   r\   r]   r>   r   r   r   r  r   r  r   r   rw  r   r  AsyncCursorPage	Assistantr  r   r
   r   r  SyncCursorPager_   r  r  r   r  r  r  r  r  r   r   r  r   OpenAICreateThreadParamsMessager  r  r  r  r  r  DictAssistantToolParamRunr%  AssistantEventHandlerAsyncAssistantStreamManagerAsyncAssistantEventHandlerr+  AssistantStreamManagerr.  r1  r   r   s   @r=   r  r    s    $(# 3- uemm+,	
 c] sm   
@ )-# 3- uemm+,	
 c] sm % 
F  &! $# #  3-  uemm+,	 
 c]  sm  %  }  }    }  
	# H 
#
 3-
 uemm+,	

 c]
 sm
 %
 !
 
4y99	:
 
 
#
 3-
 uemm+,	

 c]
 sm
  
 "'%.1
 
		"
 
* %! $#,#, 3-, uemm+,	,
 c], sm, }, }, , },^# 3- uemm+,	
 c] sm %  $ 
>  $# 3- uemm+,	
 c] sm  $D# 3- uemm+,	
 c] sm %  
>  $# 3- uemm+,	
 c] sm X )-  #	
 3- uemm+, c] sm % 
D   #	
 3- uemm+, c] sm % t} 
4},	-    #	
 3- uemm+, c] sm    / 
 2 (,** * #	*
 3-* uemm+,* c]* sm*  ~*h )- # 3-	
 uemm+, c] sm % 
	'2  # 3-	
 uemm+, c] sm % t} 
4}==	>   # 3-	
 uemm+, c] sm    / 
	& .    #  3-	 
 uemm+,  c]  sm H/4./ #/ 3-	/
 uemm+,/ c]/ sm/ %/ 8$CDE/ 
/@ 4. # 3-	
 uemm+, c] sm 8$CDE %   
4v%	&  4. # 3-	
 uemm+, c] sm 8$CDE   !0 
 2 2/4.2/ #2/ 3-	2/
 uemm+,2/ c]2/ sm2/ 8$CDE2/h)) #) 3-	)
 uemm+,) c]) sm) %) 
)2  # 3-	
 uemm+, c] sm % T] 
4v%	&   # 3-	
 uemm+, c] sm   gen- 
 .  ) ) # ) 3-	 )
 uemm+, ) c] ) sm )D
$$ $ "*#	$
 sm$ 4.$ }$ $ !345$ #$ 3-$ uemm+,$ c]$ sm$ %$  
!$L77 7 	7
 "*#7 sm7 4.7 }7 !3457   567 
%%?	@7277 7 	7
 "*#7 sm7 4.7 }7 !3457   567 
  5	676   "*#	
 sm 4. }  !345 # 3- uemm+, c] sm  T]!"   56#$ 
4s?	#% *   "*#	
 sm 4. }  !345 # 3- uemm+, c] sm  gen-!"   56#$ 
% L 9=#XX X "*#	X
 smX 4.X }X X !345X #X 3-X uemm+,X c]X smX"   56#Xr?   r  )Ir   rE   typingr   r   r   r   r   r   r	   r
   r   r   r   urllib.parser   r   r   r   r   #openai.types.beta.assistant_deletedr   openai.types.file_deletedr   pydanticr   typing_extensionsr   rw   r   litellm._loggingr   litellm.constantsr   *litellm.litellm_core_utils.litellm_loggingr   r   (litellm.litellm_core_utils.logging_utilsr   )litellm.llms.base_llm.base_model_iteratorr   )litellm.llms.base_llm.chat.transformationr   r   (litellm.llms.bedrock.chat.invoke_handlerr   litellm.types.utilsr   r   r    r!   r"   litellm.utilsr#   r$   r%   types.llms.openaibaser)   chat.o_series_transformationr+   common_utilsr,   r-   r.   ru   r0   ra   r   r   ro  r  r  rQ   r?   r=   <module>rV     s         "   & @ 1  &    + 1 S I O R I   #  =  *+ ( (VM
: M
`+D mF7M mF`#WW Wt_w _DU' Ur?   