
    i                        % S SK r S SKrS SKJrJrJrJrJrJrJ	r	J
r
Jr  S SKrS SKJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJrJrJrJ r   S S
K!J"r"  S SK#J$r$  S SK%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/  S SK0J1r1  Sr2Sr3Sr40 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S_S!S_S"S_S#S$_S$S$S$S$S$S$S$S%.Er5\\6\74   \8S&'   1 S'kr90 S(S)_S*S+_S,S_S-S_S.S_S/S_S0S_S1S_S2S_S3S_S4S_S5S_S6S_S7S_S8S_S9S_S:S_0 S;S_S<S_S=S_S>S_S?S_S@S_SAS)_SBS+_SCS)_SDS+_SESF_SGSF_SHSF_SISF_SJSF_SKSF_SLS_Er:\\6\74   \8SM'   SSSNSOSNSNSOSNSP.r;\\6\74   \8SQ'   SNSNSNSNSOSNSOSR.r<\\6\74   \8SS'   STSTSOSU.r=\\6\74   \8SV'   SWSXSWSWSWSWSWSY.r>\\6\74   \8SZ'   0 \5E\:E\<E\=E\>E\;Er?0 \5E\:E\<E\;Er@S[S[S\S\S].rA/ S^QrBS_\6S`\C4Sa jrDSbrE\ R                  " \G5      rH\\\4   rI    SSc\7Sd\CSe\\J   Sf\JSg\JS`\\/\4   4Sh jjrKSi\6S`\74Sj jrLS_\6S`\C4Sk jrMS_\6S`\C4Sl jrN  SSm\&Sn\CS_\\6   S`\4So jjrO  SSm\&Sn\CS_\\6   S`\\6\\6\4   \\\6\4      4   4Sp jjrP   SSq\\&   Sn\CS_\\6   Sr\CS`\\\   \64   4
Ss jjrQSt\Su\\6   S`\&4Sv jrRSw\S`\\(   4Sx jrSSy\\   S`\\\(      4Sz jrTS{\\6\J4   S`\\(   4S| jrUS}\S`\\\(      4S~ jrVS\\   Su\\6   S`\\&   4S jrWS\XS`\&4S jrYS\\X   S`\\&   4S jrZ\" S5      S\
\1   S`\\6\4   4S j5       r[ SS\
\1   S\\6   S`\\6\4   4S jjr\   SS\\6   S\\6   S\\6   S`\	\\6   \6\64   4S jjr]SS\\6   S`S4S jjr^ SS\\\6\X4      S\CS`\\6\X4   4S jjr_S\\   S\\\      S`\\   4S jr`g)    N)	AnyCallableDictListOptionalSequenceTupleTypeUnion)
deprecated)ChatCompletionMessageParamChatCompletionMessageToolCall)ChoiceDeltaToolCall)ChatCompletionMessage)ChatCompletionTokenLogprob)Logprobs)before_sleep_logretryretry_if_exception_typestop_after_attemptstop_after_delaywait_exponentialwait_random_exponential)	stop_base)get_from_param_or_env)
ChatMessage
ImageBlockLogProbMessageRole	TextBlock
AudioBlockDocumentBlockThinkingBlockToolCallBlockContentBlock)	BaseModelopen_aizhttps://api.openai.com/v1 o1i@ zo1-2024-12-17o1-prozo1-pro-2025-03-19
o1-previewi  o1-preview-2024-09-12o1-minio1-mini-2024-09-12o3-minizo3-mini-2025-01-31o3zo3-2025-04-16zo3-prozo3-pro-2025-06-10o4-minizo4-mini-2025-04-16gpt-5i )zgpt-5-2025-08-07z
gpt-5-minizgpt-5-mini-2025-08-07z
gpt-5-nanozgpt-5-nano-2025-08-07z	gpt-5-prozgpt-5-pro-2025-10-06	O1_MODELS>   r-   r+   r.   r,   zgpt-4i    z	gpt-4-32ki   zgpt-4-1106-previewzgpt-4-0125-previewzgpt-4-turbo-previewzgpt-4-vision-previewzgpt-4-1106-vision-previewzgpt-4-turbo-2024-04-09zgpt-4-turbogpt-4ozgpt-4o-audio-previewzgpt-4o-audio-preview-2024-12-17zgpt-4o-audio-preview-2024-10-01zgpt-4o-mini-audio-previewz$gpt-4o-mini-audio-preview-2024-12-17zgpt-4o-2024-05-13zgpt-4o-2024-08-06zgpt-4o-2024-11-20zgpt-4.5-previewzgpt-4.5-preview-2025-02-27zchatgpt-4o-latestgpt-4o-minizgpt-4o-mini-2024-07-18z
gpt-4-0613zgpt-4-32k-0613z
gpt-4-0314zgpt-4-32k-0314gpt-4.1i zgpt-4.1-minizgpt-4.1-nanozgpt-4.1-2025-04-14zgpt-4.1-mini-2025-04-14zgpt-4.1-nano-2025-04-14zgpt-5-chat-latestGPT4_MODELSi @  i   )r4   r5   zgpt-35-turbo-16kzgpt-35-turbozgpt-35-turbo-0125zgpt-35-turbo-1106zgpt-35-turbo-0613zgpt-35-turbo-16k-0613AZURE_TURBO_MODELS)zgpt-3.5-turbozgpt-3.5-turbo-16kzgpt-3.5-turbo-0125zgpt-3.5-turbo-1106zgpt-3.5-turbo-0613zgpt-3.5-turbo-16k-0613zgpt-3.5-turbo-0301TURBO_MODELSi  )ztext-davinci-003ztext-davinci-002zgpt-3.5-turbo-instructGPT3_5_MODELSi  i  )ztext-ada-001ztext-babbage-001ztext-curie-001adababbagecuriedavinciGPT3_MODELSiA  i   )zcode-davinci-002zcode-davinci-001zcode-cushman-002zcode-cushman-001)r1   r)   r*   r0   r/   r4   r6   r2   modelreturnc                    ^   SSK Jn  [        US5      (       d  gT R                  S5      (       + =(       a    [	        U 4S j[
         5       5      $ ! [         a     gf = f)Nr   )completions_type_to_response_formatFr-   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fN)
startswith).0mr@   s     W/home/james-whalen/.local/lib/python3.13/site-packages/llama_index/llms/openai/utils.py	<genexpr>+is_json_schema_supported.<locals>.<genexpr>   s#      7
);AEQ);s   !)!openai.resources.chat.completionsrC   hasattrrG   anyJSON_SCHEMA_MODELSImportError)r@   rC   s   ` rJ   is_json_schema_supportedrR      s_    
A{$>??##I.. 
3 7
);7
 4
 	
  s   A 5A 
AAzNo API key found for OpenAI.
Please set either the OPENAI_API_KEY environment variable or openai.api_key prior to initialization.
API keys can be found or created at https://platform.openai.com/account/api-keys
max_retriesrandom_exponentialstop_after_delay_secondsmin_secondsmax_secondsc                 J   U(       a	  [        X4S9O	[        SX4S9n[        U 5      nUb  U[        U5      -  n[	        SUU[        [        R                  [        R                  [        R                  [        R                  45      [        [        [        R                  5      S9$ )N)minmax   )
multiplierrY   rZ   T)reraisestopwaitr   before_sleep)r   r   r   r   r   r   openaiAPIConnectionErrorAPITimeoutErrorRateLimitErrorInternalServerErrorr   loggerloggingWARNING)rS   rT   rU   rV   rW   wait_strategystop_strategys          rJ   create_retry_decoratorrk      s      	 KAM   2+>M+%(89Q(RR#--**))..	 &fgoo>     	modelnamec           	      J   U R                  S5      (       a  U R                  S5      S   n OSU ;   a  U R                  S5      S   n U [        ;   a  [        SU  S35      eU [        ;  a3  [        SU < S	S
R                  [        R                  5       5       35      e[        U    $ )a  
Calculate the maximum number of tokens possible to generate for a model.

Args:
    modelname: The modelname we want to know the context size for.

Returns:
    The maximum context size

Example:
    .. code-block:: python

        max_tokens = openai.modelname_to_contextsize("text-davinci-003")

Modified from:
    https://github.com/hwchase17/langchain/blob/master/langchain/llms/openai.py
ft::r[   z:ft-r   zOpenAI model z4 has been discontinued. Please choose another model.zUnknown model z/. Please provide a valid OpenAI model name in: z, )rG   splitDISCONTINUED_MODELS
ValueErrorALL_AVAILABLE_MODELSjoinkeys)rm   s    rJ   openai_modelname_to_contextsizerw     s    & E""OOC(+		9	OOC(+	''I; '+ +
 	
 ,,YM *		.335679
 	
  	**rl   c                     U [         ;   $ rF   )CHAT_MODELS)r@   s    rJ   is_chat_modelrz   5  s    Krl   c                 H   U [         ;  a  gU R                  S5      (       a  U R                  S5      S   n O*U R                  S5      (       a  U R                  S5      S   n [        U 5      nSU ;   =(       d    SU ;   nU [        ;   nU=(       a    U(       + =(       a    U(       + $ )	NTzft-rp   r   ro   r[   03140301)rt   rG   rq   rz   "O1_MODELS_WITHOUT_FUNCTION_CALLING)r@   is_chat_model_is_old
is_o1_betas       rJ   is_function_calling_modelr   9  s    ((
 C #			%	 	 C #"5)Nu_/%F<<J;&j;^;rl   message	drop_nonec           	      R   / nSnSnU R                    GHT  nU R                  [        R                  :X  a%  U R                  R                  SS5      nU(       a  MG  [        U[        5      (       a.  UR                  SUR                  S.5        XFR                  -  nM  [        U[        5      (       a  UR                  (       d2  UR                  5       nUR                  U5      nUR                  5       n	O+UR                  R                  S5      nUR                  5       n	UR                  SUR                   SU	 S	U 3S
.5        GM5  [        U["        5      (       a  UR$                  (       a@  UR                  S['        UR$                  5      UR(                  =(       d    SS.S.5        GM  UR+                  SS9R-                  5       n
U
R                  S5      nUR                  SSUR.                   S	U 3UR(                  =(       d    SS.S.5        GM  [        U[0        5      (       aR  UR3                  SS9R-                  5       nUR                  S5      nUR                  SUUR4                  S.S.5        GMm  [        U[6        5      (       a   SUR8                  UR:                  S.UR<                  S.n[?        U5      S:X  d  US   S   S:w  a  UR                  SSU/S.5        GM  US   S   S:X  a#  SUS   ;   a  US   S   R                  U5        GM  US   S   S:X  a  SUS   ;  a  U/US   S'   GM.  GM1  GM4  S[G        U5      RH                   3n[K        U5      e   [M        S  U R                    5       5      nUS:X  aG  U R                  [        R                  :X  a)  S!U R                  ;   d  SU R                  ;   d  U(       a  SOUnU(       a  U R                  RN                  S"U0S#.nOU R                  RN                  U R                  RN                  S$;   d!  [Q        S% U R                    5       5      (       a  UOUS&.nU(       a8  / nU H$  nURS                  UR                  S/ 5      5        M&     U(       a  UUS'   Ub"  U[T        ;   a  U[V        ;  a  US'   S(:X  a  S)US''   SU R                  ;   d  S!U R                  ;   a"  U(       d  URY                  U R                  5        S*U R                  ;   a  U R                  S*   US*'   UR[                  5        VVs/ s H  u  nnUb  M  UPM     nnnU(       a  U H  nUR]                  U5        M     U$ ! [@         a1    [B        RE                  SUR<                  =(       d    S S35         GM  f = fs  snnf )+0Convert a ChatMessage to an OpenAI message dict.r(   Nreference_audio_idtexttyper   utf-8filedata:;base64,r   filename	file_data	image_urlautourldetail)r   r   T	as_base64input_audio)dataformat)r   r   function)name	arguments)r   r   idr   r   )r   r   
tool_callsr   z:It was not possible to convert ToolCallBlock with call id z`no call id`z  to a valid message, skipping... Unsupported content block type: c              3   B   #    U  H  n[        U[        5      v   M     g 7frF   )
isinstancer$   rH   blocks     rJ   rK   )to_openai_message_dict.<locals>.<genexpr>  s      !6DU
5-((n   function_callr   )roleaudio)	assistanttoolsystemc              3   B   #    U  H  n[        U[        5      v   M     g 7frF   r   r    r   s     rJ   rK   r          Pz%33r   r   contentr   r   	developertool_call_id)/blocksr   r   	ASSISTANTadditional_kwargsgetr   r    appendr   r"   r   resolve_document_get_b64_string_guess_mimetypedecodetitler   r   strr   resolve_imagereadimage_mimetyper!   resolve_audior   r$   	tool_nametool_kwargsr   len	Exceptionrf   warningr   __name__rs   rO   valueallextendr3   r~   updateitemspop)r   r   r@   r   content_txtr   r   file_buffer
b64_stringmimetype	img_bytesimg_straudio_bytes	audio_strfunction_dictmsgalready_has_tool_callsmessage_dictexisting_tool_callsckeyr   	null_keyss                          rJ   to_openai_message_dictr   M  sQ    GK<<;000!(!:!:!>!>$d" "eY''NNFEJJ?@::%K}--::#446"22;?
 002"ZZ..w7
 002NN" %#(
(:,!G z**yy +#&uyy>&+ll&<f& "//$/?DDF	#**73 +%*5+?+?*@	#R&+ll&<f& z**---=BBDK#**73INN) )"',,$ }--& %%*%6%6!  ,,! w<1$F(;v(ENN!'M?S R[(F2|wr{7RBK-44]CR[(F2|7SU;7V1>GBK- 8W2 5T%[5I5I4JKCS/!q  z ! !6=nn! 
 "LLK111w888w888% 	   LL&&./
 LL&& <<%%)HHPPPP  
 ""$#**155r+BC  #-@\* 	Y;;8+#.L  	111g777$G556222'.'@'@'P^$'3'9'9';M';eu';IMCS!  a  PQVQcQcQuguPv  wW  X 	T Ns+   AU%1,U% U%+
V#9V#%6V V c           	      
   / nSn/ n/ nU R                    GH  n[        U[        5      (       ag  U R                  R                  S:X  a  UR                  SUR                  S.5        OUR                  SUR                  S.5        XGR                  -  nM  [        U[        5      (       a  UR                  (       d2  UR                  5       nUR                  U5      n	UR                  5       n
O+UR                  R                  S5      n	UR                  5       n
UR                  SUR                  SU
 S	U	 3S
.5        GM+  [        U[        5      (       a  UR                  (       a>  UR                  S[!        UR                  5      UR"                  =(       d    SS.5        GM  UR%                  SS9R'                  5       nUR                  S5      nUR                  SSUR(                   S	U 3UR"                  =(       d    SS.5        GM  [        U[*        5      (       ac  UR,                  (       aO  SUR.                  ;   a<  UR                  SUR.                  S   SUR,                  =(       d    SS./S.5        GMj  GMm  GMp  [        U[0        5      (       a8  UR3                  SUR4                  UR6                  UR8                  S./5        GM  S[;        U5      R<                   3n[?        U5      e   SU R@                  ;   aJ  U R@                  S    Vs/ s H*  n[        U[B        5      (       a  UOURE                  5       PM,     nn/ UQUQ$ U(       a  / UQUQ$ US:X  a@  U R                  [F        RH                  :X  a"  SU R@                  ;   d  SU R@                  ;   a  SOUnU R                  R                  S:X  aK  U R@                  RK                  SU R@                  RK                  S5      5      nUc  [?        S5      eSUUS.nU$ [        U[         5      (       aB  [M        U5      S:w  a3  [O        S  U 5       5      (       a  U R                  R                  S:X  a  U$ U R                  R                  U R                  R                  S!;   d!  [O        S" U R                    5       5      (       a  UOUS#.nUb"  U[P        ;   a  U[R        ;  a  US$   S%:X  a  S&US$'   URU                  5        VVs/ s H  u  nnUb  M  UPM     nnnU(       a  U H  nURW                  U5        M     U(       a  / UQUP$ U$ s  snf s  snnf )'r   r(   user
input_textr   output_textr   
input_filer   r   r   input_imager   )r   r   r   Tr   r   	reasoningsummary_text)r   r   summaryr   )r   r   call_idr   r   r   Nr   r   r   zJtool_call_id or call_id is required in additional_kwargs for tool messagesfunction_call_output)r   outputr   r   c              3   0   #    U  H  oS    S:H  v   M     g7f)r   r   N )rH   items     rJ   rK   3to_openai_responses_message_dict.<locals>.<genexpr>z  s     AV,s   )r   r   c              3   B   #    U  H  n[        U[        5      v   M     g 7frF   r   r   s     rJ   rK   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#   r   additional_informationr$   r   r   r   r   r   r   rs   r   dict
model_dumpr   r   r   r   r   r3   r~   r   r   )r   r   r@   r   r   r   r   r   r   r   r   r   r   r   	tool_callmessage_dictsr   r   r   r   r   s                        rJ    to_openai_responses_message_dictr     s    GKJIeY''||!!V+ejjIJuzzJK::%K}--::#446"22;?
 002"ZZ..w7
 002NN( %#(
(:,!G z**yy -%(^"',,"8& "//$/?DDF	#**73 -',U-A-A,B(7)%T"',,"8& }--}})E)E!E   +#::4@%3U]]=PbQ$ "F} }-- !0%*%6%6#(#5#5 %		 5T%[5I5I4JKCS/!C  F w000 %66|D
D	 $It44I):N:N:PPD 	 

 ,+]++	((Z(( "LLK111w888w888 	   ||V#++//G5599)D
 ?\ 
 +!
 
 	;$$!AAAALL&( LL&& <<%%)@@PPPP  
 	Y;;8+#.L '3'9'9';M';eu';IMCS!  ))L))e
R Ns   1T70
T<>T<messagesis_responses_apic           	         U(       a  / nU  Hr  n[        UUSS9n[        U[        5      (       a  UR                  U5        M6  [        U[        5      (       a  UR                  SUS.5        Ma  UR                  U5        Mt     [        U5      S:X  a/  US   S   S:X  a#  [        US   S   [        5      (       a  US   S   $ U$ U  Vs/ s H  n[        UUUS9PM     sn$ s  snf )	z1Convert generic messages to OpenAI message dicts.r/   )r   r@   r   r   r[   r   r   r   )r   r   listr   r   r   r   r   )r   r   r@   r   final_message_dictsr   r   s          rJ   to_openai_message_dictsr     s      G<#M
 -..#**=9M3//#**F}+UV#**=9   #$)#A&v.&8.q1)<cBB&q))44"" $
 $ ##
 $
 	
 
s   Copenai_message
modalitiesc           	         U R                   nSU;   a/  U R                  (       a  [        U R                  =(       d    SS9/nO/ n0 nU R                  (       a  U R                  nU Ht  nUR                  (       d  M  UR                  [        UR                  UR                  R                  =(       d    SUR                  R                  =(       d    0 S95        Mv     UR                  US9  U R                  (       aO  SU;   aI  U R                  R                  nU R                  R                  nXtS'   UR                  [        USS	95        [        X#US
9$ )/Convert openai message dict to generic message.r   r(   r   r   r   r   )r   r   r   mp3)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   
audio_datas	            rJ   from_openai_messager    s    D 6 6&/^5K5K5Qr&R%S%'(*  :H:S:S
#I!!!!%.\\"+"4"4"9"9"?R$-$6$6$@$@$FB $ 	  J 7: 5+1144#))..
2D./jz%@ADCTUUrl   openai_token_logprobc           	         / nU R                   (       aO   U R                    Vs/ s H5  n[        UR                  UR                  UR                  =(       d    / S9PM7     nnU$ U$ s  snf ! [
         a    [        U 5        e f = f)zBConvert a single openai token logprob to generic list of logprobs.tokenlogprobbytes)top_logprobsr   r  r  r  r   print)r  resultels      rJ   from_openai_token_logprobr    s     F((	 /;;;B bhh

"((.bQ;   M6M  	&'	s   A* <A%A* %A* *Bopenai_token_logprobsc                 f    / nU  H(  n[        U5      =n(       d  M  UR                  U5        M*     U$ )z9Convert openai token logprobs to generic list of LogProb.)r  r   )r  r  token_logproblogprobss       rJ   from_openai_token_logprobsr    s6     F.0??8?MM(# / Mrl   openai_completion_logprobc           
      h    U R                  5        VVs/ s H  u  p[        X/ S9PM     snn$ s  snnf )>Convert openai completion logprobs to generic list of LogProb.r
  )r   r   )r  tvs      rJ   from_openai_completion_logprobr    s;     .3355DA 	a"-5  s   .openai_completion_logprobsc                     / nU R                   (       a%  U R                    Vs/ s H  n[        U5      PM     nnU$ s  snf )r  )r  r  )r  r  completion_logprobs      rJ   from_openai_completion_logprobsr!    sN     F!.. 'A&M&M
&M" ++=>&M 	 
 M	
s   ;openai_messagesc                 D    U  Vs/ s H  n[        X!5      PM     sn$ s  snf z1Convert openai message dicts to generic messages.)r  )r"  r   r   s      rJ   from_openai_messagesr%    s$     ETTO4OTTT   r   c                    U S   nU R                  S5      n/ n[        U[        5      (       Ga  U GH  nUR                  S5      nUS:X  a)  UR                  [	        UR                  S5      S95        MD  US:X  aZ  US   S   nUS   S   nUR                  S	5      (       a  UR                  [        XgS
95        M  UR                  [        XgS95        M  US:X  aK  UR                  [        UR                  S5      UR                  SS5      UR                  S0 5      S95        M  SU 3n[        U5      e   SnU R                  5       n	U	R                  S5        U	R                  SS5        [        XXS9$ )r  r   r   r   r   r  r   r   r   r   )imager   r   r   r   r   r(   r   r  zUnsupported message type: N)r   r   r   r   )r   r   r   r   r    rG   r   r$   rs   copyr   r   )
r   r   r   r   elemr  imgr   r   r   s
             rJ   from_openai_message_dictr,  $  sa   Dy)GF'4  D AF{iTXXf-=>?k!;'.k*84>>'**MM*3"FGMM*"DEo%!%)XXi%8"&((62"6$(HH["$= 31#6 o%+ , $))+&!)T*6G rl   r   c                 D    U  Vs/ s H  n[        U5      PM     sn$ s  snf r$  )r,  )r   r   s     rJ   from_openai_message_dictsr.  L  s     GTU}|$\2}UUUr&  zFDeprecated in favor of `to_openai_tool`, which should be used instead.pydantic_classc                     [        U SS9$ )zV
Deprecated in favor of `to_openai_tool`.

Convert pydantic class to OpenAI function.
N)description)to_openai_tool)r/  s    rJ   to_openai_functionr3  Q  s     .d;;rl   r1  c                     U R                  5       nUR                  SS5      =(       d    UnUS   UU R                  5       S.nSUS.$ )z&Convert pydantic class to OpenAI tool.r1  Nr   )r   r1  
parametersr   r   r   )schemar   )r/  r1  r7  schema_descriptionr   s        rJ   r2  r2  [  sR     ""$FM48GKw)$++-H
 H55rl   api_keyapi_baseapi_versionc                 N   [        SU SS5      n [        SUSS5      n[        SUSS5      nU =(       d    [        R                  =(       d    SnU=(       d    [        R                  =(       d    [        nU=(       d    [        R
                  =(       d    [        nU[        U5      U4$ )zg
"Resolve OpenAI credentials.

The order of precedence is:
1. param
2. env
3. openai module
4. default
r9  OPENAI_API_KEYr(   r:  OPENAI_API_BASEr;  OPENAI_API_VERSION)r   ra   r9  base_urlDEFAULT_OPENAI_API_BASEr;  DEFAULT_OPENAI_API_VERSIONr   )r9  r:  r;  final_api_keyfinal_api_basefinal_api_versions         rJ   resolve_openai_credentialsrF  i  s     $Iw8H"MG$Z;LbQH'{$8"K
 3v~~3MKK4KN#Wv'9'9W=W#n-/@@@rl   c                     U =(       d     [         R                  R                  SS5      nU(       d  [        [        5      eg )Nr=  r(   )osenvironr   rs   MISSING_API_KEY_ERROR_MESSAGE)r9  openai_api_keys     rJ   validate_openai_api_keyrL    s0    D

/? DN677 rl   tool_choicetool_requiredc                 j    U c  U(       a  SOSn [        U [        5      (       a  U $ U S;  a  SSU 0S.$ U $ )z^
Resolve tool choice.

If tool_choice is a function name string, return the appropriate dict.
requiredr   )noner   rP  r   r   r6  )r   r   )rM  rN  s     rJ   resolve_tool_choicerR    sE     $1jv+t$$66"0EFFrl   r   tool_calls_deltac                 $   Ub  [        U5      S:X  a  U $ US   n[        U 5      S:X  a  U R                  U5        U $ U S   nUR                  UR                  :w  a  U R                  U5        U $ UR                  c   eUR                  c   eUR                  R                  c  SUR                  l        UR                  R
                  c  SUR                  l        UR                  c  SUl        UR                  =R                  UR                  R                  =(       d    S-  sl        UR                  =R
                  UR                  R
                  =(       d    S-  sl        U=R                  UR                  =(       d    S-  sl        U $ )aC  
Use the tool_calls_delta objects received from openai stream chunks
to update the running tool_calls object.

Args:
    tool_calls (List[ChoiceDeltaToolCall]): the list of tool calls
    tool_calls_delta (ChoiceDeltaToolCall): the delta to update tool_calls

Returns:
    List[ChoiceDeltaToolCall]: the updated tool calls
r   r   r(   )r   r   indexr   r   r   r   )r   rS  tc_deltar  s       rJ   update_tool_callsrW    sM     3'7#8A#="H
:!(#> 5 rN77hnn$h'. % ::)))$$000 zz##+')

$zz&"$

tt| JJ  H$5$5$?$?$E2E JJOOx0055;;ODDHKK%2%Drl   )FN   <   )FN)FNFrF   )NNN)F)arg   rH  typingr   r   r   r   r   r   r	   r
   r   ra   r   openai.types.chatr   r   'openai.types.chat.chat_completion_chunkr   )openai.types.chat.chat_completion_messager   /openai.types.chat.chat_completion_token_logprobr   openai.types.completion_choicer   tenacityr   r   r   r   r   r   r   tenacity.stopr   (llama_index.core.base.llms.generic_utilsr    llama_index.core.base.llms.typesr   r   r   r   r    r!   r"   r#   r$   r%    llama_index.core.bridge.pydanticr&   DEFAULT_OPENAI_API_TYPErA  rB  r3   r   int__annotations__r~   r7   r8   r9   r:   r?   rt   ry   rr   rP   boolrR   rJ  	getLoggerr   rf   OpenAIToolCallfloatrk   rw   rz   r   r   r   r   r  r  r  r  r!  r%  r   r,  r.  r3  r2  rF  rL  rR  rW  r   rl   rJ   <module>rl     st    	 T T T  ! W G K V 3   $ J   7# 5  &V f 	
 & V v & v & 	& V f  v  &!$ V%& ##"3	4S> 8& ". T	.
 . &. &. 6. F.  . f. 6. f.  F!." &v#.$ &v%.&  '.( +F).* +., -.. /.0 v1.2 !&3.6 7.8 69.: f;.@ $A.B eC.F $G.H eI.L wM.N GO.P GQ.R 'S.T wU.V wW.Z [.T#s(^ .b "& DcN "   #! d38n ( "	!tCH~  T#s(^   	
     	 	 	 C D !  
		8	$46IIJ
  %04    'uo  	 
   seSj F"+s "+s "+J     <S <T <, jjj C=j  	j^ aaa C=a 3S#XT#s(^ 445	aL "	'
{#'
'
 C='
 	'

 4*+S01'
TV)V7;CyVVD4	']"#$>?	$w-#CJ/	']
 (
	$w-
U34UBFs)U	+U%4 %K %PVXd^ V[@Q V
 TU<tI <4S> < V< CG6O62:3-6	#s(^6 ""!%Ac]AsmA #A 8C=#s"#	A:8Xc] 8d 8 DI%T	*+<@
39$5()5t$7895 

5rl   