
    'Gge                        U 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 d dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZm Z  d d
l!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- dZ.dZ/dZ0ddddddddddd
Z1ee2e3f   e4d<   h dZ5i ddddddddddddddddd dd!dd"dd#dd$dd%dd&dd'dd(dddddddddddd)
Z6ee2e3f   e4d*<   ddd+d,d+d+d,d+d-Z7ee2e3f   e4d.<   d+d+d+d+d,d+d,d/Z8ee2e3f   e4d0<   d1d1d,d2Z9ee2e3f   e4d3<   d4d5d4d4d4d4d4d6Z:ee2e3f   e4d7<   i e1e6e8e9e:e7Z;i e1e6e8e7Z<d8d8d9d9d:Z=d;Z> e j~                  e@      ZAeeef   ZB	 	 	 	 dod<e3d=eCd>eeD   d?eDd@eDdAeegef   fdBZEdCe2dAe3fdDZFdEe2dAeCfdFZGdEe2dAeCfdGZH	 	 dpdHe&dIeCdEee2   dAefdJZI	 	 dpdHe&dIeCdEee2   dAeee2ef   eee2ef      f   fdKZJ	 	 	 dqdLee&   dIeCdEee2   dMeCdAee   f
dNZKdOedPee2   dAe&fdQZLdRedAee(   fdSZMdTee   dAeee(      fdUZNdVee2eDf   dAee(   fdWZOdXedAeee(      fdYZPdZee   dPee2   dAee&   fd[ZQd\eRdAe&fd]ZSd^eeR   dAee&   fd_ZT ed`      dae
e-   dAee2ef   fdb       ZU	 drdae
e-   dcee2   dAee2ef   fddZV	 	 	 dsdeee2   dfee2   dgee2   dAe	ee2   e2e2f   fdhZWdrdeee2   dAdfdiZXdtdjee2eRf   dAee2eRf   fdkZYdlee   dmeee      dAee   fdnZZy)u    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)	BaseModelopen_aizhttps://api.openai.com/v1 i@ i  )
o1zo1-2024-12-17zo1-prozo1-pro-2025-03-19
o1-previewo1-preview-2024-09-12o1-minio1-mini-2024-09-12zo3-minizo3-mini-2025-01-31	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-06)
z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GPT4_MODELSi @  i   )r+   r,   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-001zNo 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_secondsreturnc                 T   |rt        ||      nt        d||      }t        |       }||t        |      z  }t	        d||t        t        j                  t        j                  t        j                  t        j                  f      t        t        t        j                              S )N)minmax   )
multiplierr=   r>   T)reraisestopwaitr   before_sleep)r   r   r   r   r   r   openaiAPIConnectionErrorAPITimeoutErrorRateLimitErrorInternalServerErrorr   loggerloggingWARNING)r6   r7   r8   r9   r:   wait_strategystop_strategys          z/home/kushmeetdev/apache_webroot/langgraph_flaskproject/venv/lib/python3.12/site-packages/llama_index/llms/openai/utils.pycreate_retry_decoratorrP      s      	 K[AM   2+>M+%(89Q(RR#--**))..	 &fgoo>     	modelnamec           	      2   | j                  d      r| j                  d      d   } nd| v r| j                  d      d   } | t        v rt        d|  d      | t        vr2t        d| d	d
j                  t        j                                      t        |    S )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, )
startswithsplitDISCONTINUED_MODELS
ValueErrorALL_AVAILABLE_MODELSjoinkeys)rR   s    rO   openai_modelname_to_contextsizer]      s    & E"OOC(+		9	OOC(+	''I; '+ +
 	
 ,,YM *		.335679
 	
  	**rQ   modelc                     | t         v S N)CHAT_MODELS)r^   s    rO   is_chat_modelrb      s    KrQ   c                     | j                  d      r| j                  d      d   } n%| j                  d      r| j                  d      d   } t        |       }d| v xs d| v }| t        v }|xr | xr | S )Nzft-rU   r   rT   r?   03140301)rV   rW   rb   "O1_MODELS_WITHOUT_FUNCTION_CALLING)r^   is_chat_model_is_old
is_o1_betas       rO   is_function_calling_modelrj     s     C #			%	 C #"5)Nu_/%F<<J;&j;^;rQ   message	drop_nonec                    g }d}d}| j                   D ]  }| j                  t        j                  k(  r| j                  j                  dd      }|r@t        |t              r.|j                  d|j                  d       ||j                  z  }~t        |t              r|j                  r9|j                  dt        |j                        |j                  xs ddd	       |j                  d
      j                         }|j!                  d      }|j                  dd|j"                   d| |j                  xs ddd	       ;t        |t$              rT|j'                  d
      j                         }	|	j!                  d      }
|j                  d|
|j(                  dd       dt+        |      j,                   }t/        |       |dk(  r;| j                  t        j                  k(  rd| j                  v sd| j                  v rdn|}|r| j                  j0                  d|id}nO| j                  j0                  | j                  j0                  dv st3        d | j                   D              r|n|d}||t4        v r|t6        vr|d   dk(  rd|d<   |j9                  | j                         |j;                         D cg c]
  \  }}|	| }}}|r|D ]  }|j=                  |        |S c c}}w )0Convert a ChatMessage to an OpenAI message dict.r$   Nreference_audio_idtexttyperp   	image_urlautourldetail)rr   rs   T	as_base64utf-8data:;base64,input_audio)dataformat)rr   r}    Unsupported content block type: function_call
tool_callsid)roleaudio)	assistanttoolsystemc              3   <   K   | ]  }t        |t                y wr`   
isinstancer    .0blocks     rO   	<genexpr>z)to_openai_message_dict.<locals>.<genexpr>n       Pz%3P   r   contentr   r   	developer)blocksr   r   	ASSISTANTadditional_kwargsgetr   r    appendrp   r   rv   strrw   resolve_imagereaddecodeimage_mimetyper!   resolve_audior   rr   __name__rY   valueallr*   rf   updateitemspop)rk   rl   r^   r   content_txtro   r   	img_bytesimg_straudio_bytes	audio_strmsgmessage_dictkeyr   	null_keyss                   rO   to_openai_message_dictr     s    GK 1"<<;000!(!:!:!>!>$d" "eY'NNFEJJ?@5::%Kz*yy +#&uyy>&+ll&<f& "//$/?DDF	#**73 +%*5+?+?*@	#R&+ll&<f& z*---=BBDK#**73INN) )"',,$ 5T%[5I5I4JKCS/!c1"p "LLK111w888w888 	   LL&&./
 LL&& <<%%)HHPPP  
 	Y;;8+#.L 
 112'3'9'9';Meu}MIM 	"CS!	"  Ns   
L L c                    g }d}| j                   D ]  }t        |t              r.|j                  d|j                  d       ||j                  z  }Bt        |t
              r|j                  r7|j                  dt        |j                        |j                  xs dd       |j                  d      j                         }|j                  d	      }|j                  dd
|j                   d| |j                  xs dd       dt        |      j                   }t        |       |dk(  r;| j                   t"        j$                  k(  rd| j&                  v sd| j&                  v rdn|}| j                   j(                  dk(  rJ| j&                  j+                  d| j&                  j+                  d            }	|	t        d      d||	d}
|
S d| j&                  v r>| j&                  d   D cg c]$  }t        |t,              r|n|j/                         & }}|S | j                   j(                  | j                   j(                  dv st1        d | j                   D              r|n|d}
||t2        v r|t4        vr|
d   dk(  rd|
d<   |
j7                         D cg c]
  \  }}|	| }}}|r|D ]  }|
j9                  |        |
S c c}w c c}}w )rn   r$   
input_textrq   input_imagert   )rr   rs   rw   Trx   rz   r{   r|   r   r   r   Nr   tool_call_idcall_idzJtool_call_id or call_id is required in additional_kwargs for tool messagesfunction_call_output)rr   outputr   )r   r   r   c              3   <   K   | ]  }t        |t                y wr`   r   r   s     rO   r   z3to_openai_responses_message_dict.<locals>.<genexpr>  r   r   r   r   r   r   )r   r   r    r   rp   r   rv   r   rw   r   r   r   r   rr   r   rY   r   r   r   r   r   r   dict
model_dumpr   r*   rf   r   r   )rk   rl   r^   r   r   r   r   r   r   r   r   	tool_callmessage_dictsr   r   r   s                   rO    to_openai_responses_message_dictr     s    GK "eY'NNL%**EF5::%Kz*yy -%(^"',,"8& "//$/?DDF	#**73 -',U-A-A,B(7)%T"',,"8& 5T%[5I5I4JKCS/!3"@ "LLK111w888w888 	   ||V#++//G5599)D
 ?\ 
 +!
 	22	2 %66|D
 $It4I):N:N:PP
 

  LL&& <<%%)MMPPP  
 	Y;;8+#.L '3'9'9';Meu}MIM 	"CS!	" A
4 Ns   3)K!
K,Kmessagesis_responses_apic                     |rLg }| D ]C  }t        |||      }t        |t              r|j                  |       3|j	                  |       E |S | D cg c]  }t        |||       c}S c c}w )z1Convert generic messages to OpenAI message dicts.)rl   r^   )r   r   listextendr   r   )r   rl   r^   r   final_message_dictsrk   r   s          rO   to_openai_message_dictsr     s       		:G<#M
 -.#**=9#**=9		: #" $
  ##
 	
 
s   A+openai_message
modalitiesc                    | j                   }d|v r(| j                  rt        | j                  xs d      g}ng }i }| j                  r| j                  }|j	                  |       | j
                  rQd|v rM| j
                  j                  }| j
                  j                  }||d<   |j                  t        |d             t        |||	      S )
/Convert openai message dict to generic message.rp   r$   rp   )r   r   ro   mp3)r   r   )r   r   r   )r   r   r    r   r   r   r   r~   r   r!   r   )r   r   r   r   r   r   ro   
audio_datas           rO   from_openai_messager     s     D 6 6!7!7!=2>?(*  :H:S:S
  J 7: 5+1144#))..
2D./jz%@ADCTUUrQ   openai_token_logprobc           	          g }| j                   rJ	 | j                   D cg c]2  }t        |j                  |j                  |j                  xs g       4 }}|S |S c c}w # t
        $ r t        |         w xY w)zBConvert a single openai token logprob to generic list of logprobs.tokenlogprobbytes)top_logprobsr   r   r   r   	Exceptionprint)r   resultels      rO   from_openai_token_logprobr   -  s     F((	 /;; bhh

"((.bQF  M6M  	&'	s   A  7AA  A   A6openai_token_logprobsc                 V    g }| D ]!  }t        |      x}s|j                  |       # |S )z9Convert openai token logprobs to generic list of LogProb.)r   r   )r   r   token_logproblogprobss       rO   from_openai_token_logprobsr   >  s;     F. $0??8?MM(#$ MrQ   openai_completion_logprobc           	      l    | j                         D cg c]  \  }}t        ||g        c}}S c c}}w )>Convert openai completion logprobs to generic list of LogProb.r   )r   r   )r   tvs      rO   from_openai_completion_logprobr   I  s:     .335Aq 	a"-  s   0openai_completion_logprobsc                 p    g }| j                   r"| j                   D cg c]  }t        |       }}|S c c}w )r   )r   r   )r   r   completion_logprobs      rO   from_openai_completion_logprobsr   S  sJ     F!.. 'A&M&M
" ++=>
 
 M	
s   3openai_messagesc                 @    | D cg c]  }t        ||       c}S c c}w z1Convert openai message dicts to generic messages.)r   )r   r   rk   s      rO   from_openai_messagesr   `  s"     ETT4TTTs   r   c                 H   | d   }| j                  d      }g }t        |t              r|D ]  }|j                  d      }|dk(  r+|j                  t	        |j                  d                   D|dk(  r[|d   d   }|d   d   }|j                  d	      r|j                  t        ||
             |j                  t        ||             d| }t        |       d}| j                         }	|	j                  d       |	j                  dd       t        |||	|      S )r   r   r   rr   rp   r   rs   rv   rw   r{   )imagerw   ru   zUnsupported message type: N)r   r   r   r   )r   r   r   r   r    rV   r   rY   copyr   r   )
r   r   r   r   elemr   imgrw   r   r   s
             rO   from_openai_message_dictr   g  s#   Dy)GF'4  	&D AF{iTXXf-=>?k!;'.k*84>>'*MM*3v"FGMM*V"DE21#6 o%	& $))+&!)T*76GPV rQ   r   c                 >    | D cg c]  }t        |       c}S c c}w r   )r   )r   r   s     rO   from_openai_message_dictsr     s    GTU|$\2UUUs   zFDeprecated in favor of `to_openai_tool`, which should be used instead.pydantic_classc                     t        | d      S )zb
    Deprecated in favor of `to_openai_tool`.

    Convert pydantic class to OpenAI function.
    N)description)to_openai_tool)r   s    rO   to_openai_functionr     s     .d;;rQ   r   c                     | j                         }|j                  dd      xs |}|d   || j                         d}d|dS )z&Convert pydantic class to OpenAI tool.r   Ntitle)namer   
parametersfunctionrr   r   )schemar   )r   r   r   schema_descriptionr   s        rO   r   r     sR     ""$FM48GKw)$++-H
 H55rQ   api_keyapi_baseapi_versionc                    t        d| dd      } t        d|dd      }t        d|dd      }| xs t        j                  xs d}|xs t        j                  xs t        }|xs t        j
                  xs t        }|t        |      |fS )z
    "Resolve OpenAI credentials.

    The order of precedence is:
    1. param
    2. env
    3. openai module
    4. default
    r   OPENAI_API_KEYr$   r  OPENAI_API_BASEr  OPENAI_API_VERSION)r   rE   r   base_urlDEFAULT_OPENAI_API_BASEr  DEFAULT_OPENAI_API_VERSIONr   )r   r  r  final_api_keyfinal_api_basefinal_api_versions         rO   resolve_openai_credentialsr    s     $Iw8H"MG$Z;LbQH'{$8"K
 3v~~3MKK4KN#Wv'9'9W=W#n-/@@@rQ   c                 n    | xs  t         j                  j                  dd      }|st        t              y )Nr  r$   )osenvironr   rY   MISSING_API_KEY_ERROR_MESSAGE)r   openai_api_keys     rO   validate_openai_api_keyr    s0    D

/? DN677 rQ   tool_choicec                 <    t        | t              r| dvrdd| idS | S )zj
    Resolve tool choice.

    If tool_choice is a function name string, return the appropriate dict.
    )nonert   requiredr   r   r   )r   r   )r  s    rO   resolve_tool_choicer    s,     +s#;W(W"0EFFrQ   r   tool_calls_deltac                    || S |d   }t        |       dk(  r| j                  |       | S | d   }|j                  |j                  k7  r| j                  |       | S |j                  J |j                  J |j                  j                  d|j                  _        |j                  j
                  d|j                  _        |j                  d|_        |j                  xj                  |j                  j                  xs dz  c_        |j                  xj
                  |j                  j
                  xs dz  c_        |xj                  |j                  xs dz  c_        | S )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$   )lenr   indexr   	argumentsr   r   )r   r  tc_deltar   s       rO   update_tool_callsr     s@     "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rQ   )FN   <   )FN)FNFr`   )NNN)rt   )[rK   r  typingr   r   r   r   r   r   r	   r
   r   rE   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!    llama_index.core.bridge.pydanticr"   DEFAULT_OPENAI_API_TYPEr  r	  r*   r   int__annotations__rf   r-   r.   r/   r0   r5   rZ   ra   rX   r  	getLoggerr   rJ   OpenAIToolCallboolfloatrP   r]   rb   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r    rQ   rO   <module>r6     s    	 T T T  ! W G K V 3   $ J  7# 5   #  	4S> & "% T	%
 % &% &% 6% F%  % f% 6% f%  F!%" &v#%$ &v%%&  '%( +F)%* +%, -%.  "($ I%T#s(^ %P "& DcN "   #! d38n ( "	!tCH~  T#s(^   	
     	 	 !  
		8	$46IIJ
  %04    'uo  	 
   seSj F"+s "+s "+J     <S <T <$ ttt C=t  	tr ggg C=g 4S>4S#X//0	gX "	
{#

 C=
 	

 

$%
@V)V7;CyVV24	']"#$>?	$w-#CJ/	']
 (
	$w-
U34UBFs)U	+U4 K @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	U39%5 	5dCS 	5()5t$7895 

5rQ   