
    @'hi                     <   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+m,Z, d dl-m.Z. dZ/dZ0dZ1dddddddddddddddZ2ee3e4f   e5d<   h dZ6i 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i d)dd*dd+dd,dd-dd.dd/dd0dd1dd2dd3d4d5d4d6d4d7d4d8d4d9d4Z7ee3e4f   e5d:<   ddd;d<d;d;d<d;d=Z8ee3e4f   e5d><   d;d;d;d;d<d;d<d?Z9ee3e4f   e5d@<   dAdAd<dBZ:ee3e4f   e5dC<   dDdEdDdDdDdDdDdFZ;ee3e4f   e5dG<   i e2e7e9e:e;e8Z<i e2e7e9e8Z=dHdHdIdIdJZ>dKZ? e j                  eA      ZBeeef   ZC	 	 	 	 ddLe4dMeDdNeeE   dOeEdPeEdQeegef   fdRZFdSe3dQe4fdTZGdUe3dQeDfdVZHdUe3dQeDfdWZI	 	 ddXe&dYeDdUee3   dQefdZZJ	 	 ddXe&dYeDdUee3   dQeee3ef   eee3ef      f   fd[ZK	 	 	 dd\ee&   dYeDdUee3   d]eDdQee   f
d^ZLd_ed`ee3   dQe&fdaZMdbedQee(   fdcZNddee   dQeee(      fdeZOdfee3eEf   dQee(   fdgZPdhedQeee(      fdiZQdjee   d`ee3   dQee&   fdkZRdleSdQe&fdmZTdneeS   dQee&   fdoZU edp      dqe
e.   dQee3ef   fdr       ZV	 ddqe
e.   dsee3   dQee3ef   fdtZW	 	 	 dduee3   dvee3   dwee3   dQe	ee3   e3e3f   fdxZXdduee3   dQdfdyZYddzee3eSf   dQee3eSf   fd{ZZd|ee   d}eee      dQee   fd~Z[y)    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)	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-12o3-minizo3-mini-2025-01-31o3zo3-2025-04-16zo4-minizo4-mini-2025-04-16	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-0314z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-14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@   rA   T)reraisestopwaitr   before_sleep)r   r   r   r   r   r   openaiAPIConnectionErrorAPITimeoutErrorRateLimitErrorInternalServerErrorr   loggerloggingWARNING)r9   r:   r;   r<   r=   wait_strategystop_strategys          d/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/llama_index/llms/openai/utils.pycreate_retry_decoratorrS      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::rB   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)rU   s    rR   openai_modelname_to_contextsizer`      s    & E"OOC(+		9	OOC(+	''I; '+ +
 	
 ,,YM *		.335679
 	
  	**rT   modelc                     | t         v S N)CHAT_MODELS)ra   s    rR   is_chat_modelre     s    KrT   c                     | t         vry| 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 )	NTzft-rX   r   rW   rB   03140301)r]   rY   rZ   re   "O1_MODELS_WITHOUT_FUNCTION_CALLING)ra   is_chat_model_is_old
is_o1_betas       rR   is_function_calling_modelrm     s    ((
 C #			%	 C #"5)Nu_/%F<<J;&j;^;rT   message	drop_nonec           	      D   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                  s#|j                         }|j                  |      }n|j                  j                  d      }|j                  |j                  nd}	|j                  d	|j                   d
|	 d| d       t        |t"              r|j$                  r:|j                  dt'        |j$                        |j(                  xs ddd       o|j+                  d      j-                         }
|
j                  d      }|j                  dd
|j.                   d| |j(                  xs ddd       t        |t0              rT|j3                  d      j-                         }|j                  d      }|j                  d||j4                  dd       ;dt7        |      j8                   }t;        |       |dk(  r;| j                  t        j                  k(  rd| j                  v sd| j                  v rdn|}|r| j                  j<                  d|id}nO| j                  j<                  | j                  j<                  dv st?        d | j                   D              r|n|d}||t@        v r|tB        vr|d   dk(  rd |d<   |jE                  | j                         |jG                         D cg c]
  \  }}|	| }}}|r|D ]  }|jI                  |        |S c c}}w )!0Convert a ChatMessage to an OpenAI message dict.r%   Nreference_audio_idtexttypers   )data_bufferutf-8zapplication/pdf
input_filedata:;base64,)ru   filename	file_data	image_urlautourldetail)ru   r}   T	as_base64input_audio)dataformat)ru   r    Unsupported content block type: function_call
tool_callsid)roleaudio)	assistanttoolsystemc              3   <   K   | ]  }t        |t                y wrc   
isinstancer    .0blocks     rR   	<genexpr>z)to_openai_message_dict.<locals>.<genexpr>       Pz%3P   r   contentr   r   	developer)%blocksr   r   	ASSISTANTadditional_kwargsgetr   r    appendrs   r"   r   resolve_document_get_b64_stringdecodedocument_mimetypetitler   r   strr   resolve_imagereadimage_mimetyper!   resolve_audior   ru   __name__r\   valueallr-   ri   updateitemspop)rn   ro   ra   r   content_txtrr   r   file_buffer
b64_stringmimetype	img_bytesimg_straudio_bytes	audio_strmsgmessage_dictkeyr   	null_keyss                      rR   to_openai_message_dictr   #  s    GK 9"<<;000!(!:!:!>!>$d" "eY'NNFEJJ?@5::%K}-::#446"22{2K
"ZZ..w7
272I2I2Uu..[lHNNLekkZ_`h_iiqr|q}X~  A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/!s9"@ "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   .
N9N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 )rq   r%   
input_textrt   input_imager~   )ru   r}   r   Tr   rw   ry   rz   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)ru   outputr   )r   r   c              3   <   K   | ]  }t        |t                y wrc   r   r   s     rR   r   z3to_openai_responses_message_dict.<locals>.<genexpr>  r   r   r   r   r   r   )r   r   r    r   rs   r   r   r   r   r   r   r   r   ru   r   r\   r   r   r   r   r   r   dict
model_dumpr   r-   ri   r   r   )rn   ro   ra   r   r   r   r   r   r   r   r   	tool_callmessage_dictsr   r   r   s                   rR    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&& <<%%)@@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        ||d      }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.r+   )ro   ra   )r   r   listextendr   r   )r   ro   ra   r   final_message_dictsrn   r   s          rR   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.rs   r%   rs   )r   r   rr   mp3)r   r   )r   r   r   )r   r   r    r   r   r   r   r   r   r!   r   )r   r   r   r   r   r   rr   
audio_datas           rR   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UrT   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      rR   from_openai_token_logprobr   E  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       rR   from_openai_token_logprobsr   V  s;     F. $0??8?MM(#$ MrT   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      rR   from_openai_completion_logprobr   a  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      rR   from_openai_completion_logprobsr   k  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   rn   s      rR   from_openai_messagesr   x  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   ru   rs   r   r}   r   r   ry   )imager   r   zUnsupported message type: N)r   r   r   r   )r   r   r   r   r    rY   r   r\   copyr   r   )
r   r   r   r   elemr   imgr   r   r   s
             rR   from_openai_message_dictr     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 rT   r   c                 >    | D cg c]  }t        |       c}S c c}w r   )r   )r   r   s     rR   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    rR   to_openai_functionr    s     .d;;rT   r  c                     | j                         }|j                  dd      xs |}|d   || j                         d}d|dS )z&Convert pydantic class to OpenAI tool.r  Nr   )namer  
parametersfunctionru   r	  )schemar   )r  r  r  schema_descriptionr	  s        rR   r  r    sR     ""$FM48GKw)$++-H
 H55rT   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   rH   r  base_urlDEFAULT_OPENAI_API_BASEr  DEFAULT_OPENAI_API_VERSIONr   )r  r  r  final_api_keyfinal_api_basefinal_api_versions         rR   resolve_openai_credentialsr    s     $Iw8H"MG$Z;LbQH'{$8"K
 3v~~3MKK4KN#Wv'9'9W=W#n-/@@@rT   c                 n    | xs  t         j                  j                  dd      }|st        t              y )Nr  r%   )osenvironr   r\   MISSING_API_KEY_ERROR_MESSAGE)r  openai_api_keys     rR   validate_openai_api_keyr     s0    D

/? DN677 rT   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.
    )noner~   requiredr	  r  r
  )r   r   )r!  s    rR   resolve_tool_choicer%    s,     +s#;W(W"0EFFrT   r   tool_calls_deltac                    |t        |      dk(  r| 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       rR   update_tool_callsr-    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rT   )FN   <   )FN)FNFrc   )NNN)r~   )\rN   r  typingr   r   r   r   r   r   r	   r
   r   rH   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"    llama_index.core.bridge.pydanticr#   DEFAULT_OPENAI_API_TYPEr  r  r-   r   int__annotations__ri   r0   r1   r2   r3   r8   r]   rd   r[   r  	getLoggerr   rM   OpenAIToolCallboolfloatrS   r`   re   rm   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r%  r-   rT   rR   <module>rC     sr    	 T T T  ! W G K V 3   $ J   7# 5   #  
 	4S> "& ", 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,T#s(^ ,^ "& DcN "   #! d38n ( "	!tCH~  T#s(^   	
     	 	 !  
		8	$46IIJ
  %04    'uo  	 
   seSj F"+s "+s "+J     <S <T <, ||| C=|  	|B 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rT   