o
    }!gxT                     @   s4  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 ?e@ZAeeef ZB	<		=	>dd?e3d@eCdAeeD dBeDdCeDdDeegef fdEdFZEdGe2dDe3fdHdIZFdJe2dDeCfdKdLZGdJe2dDeCfdMdNZH	<	ddOe&dPeCdJee2 dDefdQdRZI	<	ddSee& dPeCdJee2 dDee fdTdUZJdVedWee2 dDe&fdXdYZKdZedDee( fd[d\ZLd]ee dDeee(  fd^d_ZMd`ee2eDf dDee( fdadbZNdcedDeee(  fdddeZOdfee dWee2 dDee& fdgdhZPdieQdDe&fdjdkZRdleeQ dDee& fdmdnZSedodpe
e- dDee2ef fdqdrZT	ddpe
e- dsee2 dDee2ef fdtduZU			ddvee2 dwee2 dxee2 dDe	ee2 e2e2f fdydzZVddvee2 dDdfd{d|ZWdd~ee2eQf dDee2eQf fddZXdee deee  dDee fddZYdS )    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
F   <   max_retriesrandom_exponentialstop_after_delay_secondsmin_secondsmax_secondsreturnc              	   C   sh   |rt ||dntd||d}t| }|d ur|t|B }td||ttjtjtj	tj
ftttjd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)r7   r8   r9   r:   r;   wait_strategystop_strategy rO   _/mnt/skqttb/ctump_chatbot/chatbot/lib/python3.10/site-packages/llama_index/llms/openai/utils.pycreate_retry_decorator   s(   	
	rQ   	modelnamec                 C   sv   |  dr| dd } nd| v r| dd } | tv r$td|  d| tvr7td| d	d
t  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   rO   rO   rP   openai_modelname_to_contextsize   s   

r\   modelc                 C   s   | t v S N)CHAT_MODELS)r]   rO   rO   rP   is_chat_model   s   r`   c                 C   sb   |  dr| dd } n|  dr| dd } t| }d| v p$d| v }| tv }|o0| o0| S )Nzft-rT   r   rS   r?   03140301)rU   rV   r`   "O1_MODELS_WITHOUT_FUNCTION_CALLING)r]   is_chat_model_is_old
is_o1_betarO   rO   rP   is_function_calling_model  s   

rg   message	drop_nonec                 C   s  g }d}d}| j D ]}| jtjkr| jdd}|rq	t|tr/|d|j	d ||j	7 }q	t|t
rl|jrI|dt|j|jpBddd	 q	|jd
d }|d}|dd|j d| |jpeddd	 q	t|tr|jd
d }	|	d}
|d|
|jdd q	dt|j }t||dkr| jtjkrd| jv sd| jv rdn|}|r| jjd|id}n| jj| jjdv stdd | j D r|n|d}|dur|tv r|tvr|d dkrd|d< || j dd | D }|r|D ]}|| q|S ) z0Convert a ChatMessage to an OpenAI message dict.r#   Nreference_audio_idtext)typerk   	image_urlautourldetail)rl   rm   T)	as_base64zutf-8data:z;base64,input_audio)dataformat)rl   rt   z Unsupported content block type: function_call
tool_callsid)roleaudio)	assistanttoolsystemc                 s   s    | ]}t |tV  qd S r^   )
isinstancer   ).0blockrO   rO   rP   	<genexpr>n  s    z)to_openai_message_dict.<locals>.<genexpr>)rz   contentrz   r~   	developerc                 S   s   g | ]
\}}|d u r|qS r^   rO   )r   keyvaluerO   rO   rP   
<listcomp>  s    z*to_openai_message_dict.<locals>.<listcomp>)blocksrz   r   	ASSISTANTadditional_kwargsgetr   r   appendrk   r   rp   strrq   resolve_imagereaddecodeimage_mimetyper    resolve_audiorv   rl   __name__rX   r   allr)   rc   updateitemspop)rh   ri   r]   r   content_txtrj   r   	img_bytesimg_straudio_bytes	audio_strmsgmessage_dict	null_keysr   rO   rO   rP   to_openai_message_dict  s   





	




r   messagesc                    s    fdd| D S )z1Convert generic messages to OpenAI message dicts.c                    s   g | ]	}t | d qS )ri   r]   )r   r   rh   r   rO   rP   r     s    z+to_openai_message_dicts.<locals>.<listcomp>rO   )r   ri   r]   rO   r   rP   to_openai_message_dicts  s   r   openai_message
modalitiesc                 C   s   | j }d|v r| jrt| jpddg}ng }i }| jr$| j}|j|d | jr@d|v r@| jj}| jj}||d< |t	|dd t
|||d	S )
/Convert openai message dict to generic message.rk   r#   rk   )rx   r{   rj   mp3)r{   rv   )rz   r   r   )rz   r   r   rx   r   r{   ry   ru   r   r    r   )r   r   rz   r   r   rx   rj   
audio_datarO   rO   rP   from_openai_message  s   r   openai_token_logprobc                 C   s>   g }| j rzdd | j D }W |S  ty   t|   w |S )zBConvert a single openai token logprob to generic list of logprobs.c                 S   s$   g | ]}t |j|j|jpg d qS )tokenlogprobbytes)r   r   r   r   )r   elrO   rO   rP   r     s    z-from_openai_token_logprob.<locals>.<listcomp>)top_logprobs	Exceptionprint)r   resultrO   rO   rP   from_openai_token_logprob  s   r   openai_token_logprobsc                 C   s(   g }| D ]}t | }r|| q|S )z9Convert openai token logprobs to generic list of LogProb.)r   r   )r   r   token_logproblogprobsrO   rO   rP   from_openai_token_logprobs  s   
r   openai_completion_logprobc                 C   s   dd |   D S )>Convert openai completion logprobs to generic list of LogProb.c                 S   s   g | ]\}}t ||g d qS r   )r   )r   tvrO   rO   rP   r     s    z2from_openai_completion_logprob.<locals>.<listcomp>)r   )r   rO   rO   rP   from_openai_completion_logprob  s   r   openai_completion_logprobsc                 C   s   g }| j rdd | j D }|S )r   c                 S      g | ]}t |qS rO   )r   )r   completion_logprobrO   rO   rP   r     s    z3from_openai_completion_logprobs.<locals>.<listcomp>)r   )r   r   rO   rO   rP   from_openai_completion_logprobs  s   r   openai_messagesc                    s    fdd| D S )1Convert openai message dicts to generic messages.c                    s   g | ]}t | qS rO   )r   r   r   rO   rP   r     s    z(from_openai_messages.<locals>.<listcomp>rO   )r   r   rO   r   rP   from_openai_messages  s   r   r   c           
      C   s   | d }|  d}g }t|tr]|D ]H}| d}|dkr)|t| dd q|dkrR|d d }|d d }|d	rH|t||d
 q|t||d qd| }t|d}|  }	|		d |		dd t
|||	|dS )r   rz   r   rl   rk   r   rm   rp   rq   rs   )imagerq   ro   zUnsupported message type: N)rz   r   r   r   )r   r   listr   r   rU   r   rX   copyr   r   )
r   rz   r   r   elemr   imgrq   r   r   rO   rO   rP   from_openai_message_dict  s.   





r   message_dictsc                 C   s   dd | D S )r   c                 S   r   rO   )r   )r   r   rO   rO   rP   r     s    z-from_openai_message_dicts.<locals>.<listcomp>rO   )r   rO   rO   rP   from_openai_message_dicts  s   r   zFDeprecated in favor of `to_openai_tool`, which should be used instead.pydantic_classc                 C   s   t | ddS )zb
    Deprecated in favor of `to_openai_tool`.

    Convert pydantic class to OpenAI function.
    N)description)to_openai_tool)r   rO   rO   rP   to_openai_function  s   r   r   c                 C   s6   |   }|ddp|}|d ||   d}d|dS )z&Convert pydantic class to OpenAI tool.r   Ntitle)namer   
parametersfunctionrl   r   )schemar   )r   r   r   schema_descriptionr   rO   rO   rP   r     s   
r   api_keyapi_baseapi_versionc                 C   sb   t d| dd} t d|dd}t d|dd}| ptjpd}|p"tjp"t}|p)tjp)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_versionrO   rO   rP   resolve_openai_credentials*  s   r   c                 C   s"   | pt jdd}|sttd S )Nr   r#   )osenvironr   rX   MISSING_API_KEY_ERROR_MESSAGE)r   openai_api_keyrO   rO   rP   validate_openai_api_keyG  s   r   rn   tool_choicec                 C   s$   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.
    )nonern   requiredr   r   r   )r   r   )r   rO   rO   rP   resolve_tool_choiceN  s   r   rx   tool_calls_deltac                 C   s   |du r| S |d }t | dkr| | | S | d }|j|jkr(| | | S |jdus/J |jdus6J |jjdu r@d|j_|jjdu rJd|j_|jdu rRd|_|j j|jjp[d7  _|j j|jjpgd7  _| j|jpqd7  _| 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
    Nr   r#   )lenr   indexr   	argumentsr   ry   )rx   r   tc_deltar   rO   rO   rP   update_tool_callsZ  s,   


r   )FNr5   r6   )FNr^   )NNN)rn   )ZrK   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__rc   r,   r-   r.   r/   r4   rY   r_   rW   r   	getLoggerr   rJ   OpenAIToolCallboolfloatrQ   r\   r`   rg   r   r   r   r   r   r   r   r   dictr   r   r   r   r   r   r   r   rO   rO   rO   rP   <module>   s  
 ,$	 	(
		

#%
y










  



$
