
    i                     ~   S SK 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JrJrJrJrJrJr  S SKrS SKrS SKJs  Jr  S SKJrJrJrJrJrJ r J!r!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-J.r.  S SK/J0r0J1r1  S SK2J3r3  S SK4J5r5  S S	K6J7r7J8r8  S S
K9J:r:  S SK;J<r<J=r=  S SK>J?r?  S SK@JArA  S SKBJCrC  S SKDJErEJFrF  S SKGJHrHJIrIJJrJJKrKJLrLJMrMJNrNJOrOJPrPJQrQJRrRJSrSJTrT  S SKUJVrV  S SKUJWrX  S SKYJZrZJ[r[J\r\  \R                  " \^5      r_\(       a  S SK`Jara  SrbS\S\4   S\S\4   4S jrc\ " S S\5      5       rdS\%SS4S jre " S S\:5      rWg)     N)JSONDecodeError)TYPE_CHECKINGAnyAsyncGenerator	AwaitableCallableDict	GeneratorListLiteralOptionalProtocolSequenceTypeUnioncastruntime_checkable)achat_to_completion_decoratoracompletion_to_chat_decorator$astream_chat_to_completion_decorator$astream_completion_to_chat_decoratorchat_to_completion_decoratorcompletion_to_chat_decorator#stream_chat_to_completion_decorator#stream_completion_to_chat_decorator)ChatMessageChatResponseChatResponseAsyncGenChatResponseGenCompletionResponseCompletionResponseAsyncGenCompletionResponseGenLLMMetadataMessageRoleToolCallBlock	TextBlock)FieldPrivateAttr)CallbackManager)DEFAULT_TEMPERATURE)llm_chat_callbackllm_completion_callback)FunctionCallingLLM)ToolSelectionModel)parse_partial_json)PromptTemplate)FlexibleModel)BaseOutputParserPydanticProgramMode)	O1_MODELScreate_retry_decoratorfrom_openai_completion_logprobsfrom_openai_messagefrom_openai_token_logprobsis_chat_modelis_function_calling_modelopenai_modelname_to_contextsizeresolve_openai_credentialsresolve_tool_choiceto_openai_message_dictsupdate_tool_callsis_json_schema_supported)AsyncOpenAI)OpenAI)ChatCompletionChunkChoiceDeltaChoiceDeltaToolCall)BaseToolzgpt-3.5-turbof.returnc                 n   ^  [         R                  " T 5      S[        S[        S[        4U 4S jj5       nU$ )NargskwargsrI   c                    > [        U SS5      nUS::  a  T" U /UQ70 UD6$ [        USSSSS9nU" T5      " U /UQ70 UD6$ )Nmax_retriesr   T<         )rN   random_exponentialstop_after_delay_secondsmin_secondsmax_seconds)getattrr6   )selfrK   rL   rN   retryrH   s        V/home/james-whalen/.local/lib/python3.13/site-packages/llama_index/llms/openai/base.pywrapper$llm_retry_decorator.<locals>.wrapperc   sb    dM15!T+D+F++&##%'
 Qx.t.v..    )	functoolswrapsr   )rH   rZ   s   ` rY   llm_retry_decoratorr_   b   s:    __Q/S /C /C / / Nr\   c                   0    \ rS rSrSrS\S\\   4S jrSr	g)	Tokenizeru   zBTokenizers support an encode function that returns a list of ints.textrI   c                     g N )rW   rc   s     rY   encodeTokenizer.encodey   s    r\   rf   N)
__name__
__module____qualname____firstlineno____doc__strr   intrg   __static_attributes__rf   r\   rY   ra   ra   u   s    L3 49 r\   ra   responsec                 Z   U R                   R                   Vs/ s H  n[        U[        5      (       d  M  UPM     nn[	        U5      S:  aU  U R                   R                   Vs/ s H  n[        U[        5      (       a  M  UPM     snUS   /-   U R                   l        g g s  snf s  snf )NrP   r   )messageblocks
isinstancer%   len)rq   block
tool_callss      rY   force_single_tool_callry   }   s    #++222%j6V2   : "))00#
0e]3 0#
 ]O	# #
s   B#B#%B(B(c            7         ^  \ rS rSr% Sr\" \SS9r\\	S'   \" \
SSSS	9r\\	S
'   \" SSSS9r\\   \	S'   \" SSS9r\\   \	S'   \" SSSSS9r\\	S'   \" \SS9r\\\4   \	S'   \" SSSS9r\\	S'   \" SSSS9r\\	S '   \" SS!S9r\\\\4      \	S"'   \" S#S$S9r\\	S%'   \" SS&S9r\\   \	S''   \" SS(S9r\\   \	S)'   \" SS*S9r\\   \	S+'   \" S,S-S9r\\	S.'   \" SS/S9r\\ S0      \	S1'   \" SS2S9r!\\"\      \	S3'   \" SS4S9r#\\\\4      \	S5'   \$" 5       r%\\&   \	S6'   \$" 5       r'\\(   \	S7'   \$" 5       r)\\*RV                     \	S8'   \$" 5       r,\\*RZ                     \	S9'   \\
SSSSS#SSSSSSSSSSSS\.R^                  SS,SSS4S\S
\S\\   S\\\\4      S\S \S%\S'\\   S)\\   S+\\   S:\\0   S"\\\\4      S;\\*RV                     S<\\*RZ                     S=\\&   S>\\(   S?\\   S@\\1\2\3   /\4      SA\\1\/\4      SB\.SC\\4   S.\S1\\ SD      S3\\"\      S5\\\\4      SE\SFS46U 4SG jjjr5SF\&4SH jr6SF\(4SI jr7SF\4SJ jr8\9SF\4SK j5       r:\;SF\\<   4SL j5       r=\;SF\>4SM j5       r?\@" 5       SN\2\3   SE\SF\A4SO j5       rB\@" 5       SN\2\3   SE\SF\C4SP j5       rD\E" 5        SSQ\SR\SE\SF\F4SS jj5       rG\E" 5        SSQ\SR\SE\SF\H4ST jj5       rISE\\\4   SF\4SU jrJSSV\SF\\\4   4SW jjrKSE\SF\\\4   4SX jrL\MSN\2\3   SE\SF\A4SY j5       rN\MSN\2\3   SE\SF\C4SZ j5       rO\MSQ\SE\SF\F4S[ j5       rP\MSQ\SE\SF\H4S\ j5       rQS]\\\4   SQ\SFS4S^ jrRS_\SF\4S` jrS\@" 5       SN\2\3   SE\SF\A4Sa j5       rT\@" 5       SN\2\3   SE\SF\U4Sb j5       rV\E" 5        SSQ\SR\SE\SF\F4Sc jj5       rW\E" 5        SSQ\SR\SE\SF\X4Sd jj5       rY\MSN\2\3   SE\SF\A4Se j5       rZ\MSN\2\3   SE\SF\U4Sf j5       r[\MSQ\SE\SF\F4Sg j5       r\\MSQ\SE\SF\X4Sh j5       r]       SSi\2Sj   Sk\\^\\34      Sl\\"\3      Sm\Sn\So\Sp\\^\\4      S.\\   SE\SF\\\4   4Sq jjr_ SSr\ASi\2Sj   Sn\SE\SF\A4
Ss jjr` SSrStSu\SE\SF\"\a   4Sv jjrbSw\\\\4      Sx\c\d   SF\\\4   4Sy jreSF\4Sz jrf\gR                   SSx\c\d   SQ\iSw\\\\4      S{\SF\d4
U 4S| jjj5       rj\gR                   SSx\c\d   SQ\iSw\\\\4      S{\SF\d4
U 4S} jjj5       rk SSx\c\d   SQ\iSw\\\\4      S{\SF\l\^\d\"\d   S~\"S~   4   SS4   4
U 4S jjjrm SSx\c\d   SQ\iSw\\\\4      S{\SF\n\^\d\"\d   S~\"S~   4   S4   4
U 4S jjjro\gR                   SSx\c\d   SQ\iSw\\\\4      S{\SF\l\^\d\p4   SS4   4
U 4S jjj5       rq\gR                   SSx\c\d   SQ\iSw\\\\4      S{\SF\n\^\d\p4   S4   4
U 4S jjj5       rrSrsU =rt$ )rC      a  
OpenAI LLM.

Args:
    model: name of the OpenAI model to use.
    temperature: a float from 0 to 1 controlling randomness in generation; higher will lead to more creative, less deterministic responses.
    max_tokens: the maximum number of tokens to generate.
    additional_kwargs: Add additional parameters to OpenAI request body.
    max_retries: How many times to retry the API call if it fails.
    timeout: How long to wait, in seconds, for an API call before failing.
    reuse_client: Reuse the OpenAI client between requests. When doing anything with large volumes of async API calls, setting this to false can improve stability.
    api_key: Your OpenAI api key
    api_base: The base URL of the API to call
    api_version: the version of the API to call
    callback_manager: the callback manager is used for observability.
    default_headers: override the default headers for API requests.
    http_client: pass in your own httpx.Client instance.
    async_http_client: pass in your own httpx.AsyncClient instance.

Examples:
    `pip install llama-index-llms-openai`

    ```python
    import os
    import openai

    os.environ["OPENAI_API_KEY"] = "sk-..."
    openai.api_key = os.environ["OPENAI_API_KEY"]

    from llama_index.llms.openai import OpenAI

    llm = OpenAI(model="gpt-3.5-turbo")

    stream = llm.stream_complete("Hi, write a short story")

    for r in stream:
        print(r.delta, end="")
    ```
zThe OpenAI model to use.)defaultdescriptionmodelz)The temperature to use during generation.g        g       @)r|   r}   geletemperaturez)The maximum number of tokens to generate.Nr   )r}   r|   gt
max_tokensz%Whether to return logprobs per token.)r}   r|   logprobsz,The number of top token log probs to return.rQ   )r}   r|   r   r   top_logprobsz%Additional kwargs for the OpenAI API.)default_factoryr}   additional_kwargs   z"The maximum number of API retries.)r|   r}   r   rN   g      N@z*The timeout, in seconds, for API requests.timeoutz%The default headers for API requests.default_headersTzReuse the OpenAI client between requests. When doing anything with large volumes of async API calls, setting this to false can improve stability.reuse_clientzThe OpenAI API key.api_keyzThe base URL for OpenAI API.api_basezThe API version for OpenAI API.api_versionFz<Whether to use strict mode for invoking tools/using schemas.strictz'The effort to use for reasoning models.)lowmediumhighminimalreasoning_effortz+The output modalities to use for the model.
modalitiesz-The audio configuration to use for the model.audio_config_client_aclient_http_client_async_http_clientcallback_managerhttp_clientasync_http_clientopenai_clientasync_openai_clientsystem_promptmessages_to_promptcompletion_to_promptpydantic_program_modeoutput_parser)r   r   r   rL   rI   c                 <  > SU;   a  US   nUS	 U=(       d    0 n[        UU	U
S9u  pn
U[        ;   a  Sn[        TU ]  " S0 SU_SU_SU_SU_SU_S	U_S
U_SU
_SU	_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_UD6  Xl        UU l        Xl        Xl        g )Nmax_new_tokens)r   r   r   g      ?r~   r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rf   )r=   r5   super__init__r   r   r   r   )rW   r~   r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rL   	__class__s                              rY   r   OpenAI.__init__   sK   > v% 01J'(-3)C#*
&; IK 	
	
#	
 "	
 0		

 $	
 .	
 	
 $	
 	
 	
 &	
 ,	
 (	
  2	
 "6	
  #8!	
" (#	
$ %	
& .'	
( ")	
* &-	
2 %+'"3r\   c                     U R                   (       d  [        S0 U R                  5       D6$ U R                  c  [        S0 U R                  5       D6U l        U R                  $ )Nrf   )r   
SyncOpenAI_get_credential_kwargsr   rW   s    rY   _get_clientOpenAI._get_clientL  sN      > ; ; =>><<%F(C(C(EFDL||r\   c                     U R                   (       d  [        S0 U R                  SS9D6$ U R                  c  [        S0 U R                  SS9D6U l        U R                  $ )NT)is_asyncrf   )r   rB   r   r   r   s    rY   _get_aclientOpenAI._get_aclientT  sX      L!<!<d!<!KLL== 'U$*E*Et*E*TUDM}}r\   c                     U R                   nSU;   a  UR                  S5      S   nU$ UR                  S5      (       a  UR                  S5      S   nU$ )Nzft-:r   zft:rP   )r~   split
startswith)rW   
model_names     rY   _get_model_nameOpenAI._get_model_name\  s^    ZZ
J#))#.q1J  ""5))#))#.q1Jr\   c                     g)N
openai_llmrf   )clss    rY   
class_nameOpenAI.class_named  s    r\   c                 J    [         R                  " U R                  5       5      $ )z
Get a tokenizer for this model, or None if a tokenizing method is unknown.

OpenAI can do this using the tiktoken package, subclasses may not have
this convenience.
)tiktokenencoding_for_modelr   r   s    rY   
_tokenizerOpenAI._tokenizerh  s     **4+?+?+ABBr\   c           	      B   [        [        U R                  5       5      U R                  =(       d    S[	        U R                  5       S9[        U R                  5       S9U R                  U R                  [        ;   a  [        R                  S9$ [        R                  S9$ )Nr~   )context_window
num_outputr:   r;   r   system_role)r#   r<   r   r   r:   r;   r~   r5   r$   USERSYSTEMr   s    rY   metadataOpenAI.metadatar  s    :4;O;O;QR,"'d.B.B.DE&?**,' zz zzY& $((
 	
 ##
 	
r\   messagesc                     U R                  U5      (       a  U R                  nO[        U R                  5      nU" U40 UD6$ re   )_use_chat_completions_chatr   	_complete)rW   r   rL   chat_fns       rY   chatOpenAI.chat  s:    %%f--jjG24>>BGx*6**r\   c                     U R                  U5      (       a  U R                  nO[        U R                  5      nU" U40 UD6$ re   )r   _stream_chatr   _stream_complete)rW   r   rL   stream_chat_fns       rY   stream_chatOpenAI.stream_chat  s@     %%f--!..N@AVAVWNh1&11r\   prompt	formattedc                     U R                   (       a  SU R                   ;   a  [        S5      eU R                  U5      (       a  [        U R                  5      nOU R
                  nU" U40 UD6$ Naudioz>Audio is not supported for completion. Use chat/achat instead.)r   
ValueErrorr   r   r   r   )rW   r   r   rL   complete_fns        rY   completeOpenAI.complete  s`     ??w$//9P  %%f--6tzzBK..K6,V,,r\   c                     U R                  U5      (       a  [        U R                  5      nOU R                  nU" U40 UD6$ re   )r   r   r   r   )rW   r   r   rL   stream_complete_fns        rY   stream_completeOpenAI.stream_complete  sB     %%f--!DTEVEV!W!%!6!6!&3F33r\   c                 D    SU;   a  US   $ U R                   R                  $ )Nuse_chat_completions)r   r:   )rW   rL   s     rY   r   OpenAI._use_chat_completions  s&    !V+011}}***r\   r   c                     U R                   U R                  U R                  U R                  U R                  U(       a  U R
                  S.$ U R                  S.$ )N)r   base_urlrN   r   r   r   )r   r   rN   r   r   r   r   )rW   r   s     rY   r   OpenAI._get_credential_kwargs  sU    ||++||#336>422
 	
 EIDUDU
 	
r\   c                    U R                   U R                  S.UEnU R                  b  U R                  US'   U R                  bX  U R                  SL aI  U R                  R
                  (       a  U R                  US'   U R                  US'   OU R                  US'   0 UEU R                  EnSU;  a	  SU;   a  US	 U R                   [        ;   a<  UR                  S5      b*  UR                  SUS   5      US'   UR                  SS 5        U R                   [        ;   a  U R                  b  U R                  US	'   U R                  b  U R                  US
'   U R                  b  U R                  US'   U$ )N)r~   r   r   Tr   r   streamstream_optionsmax_completion_tokensr   r   r   )r~   r   r   r   r   r:   r   r   r5   getpopr   r   r   )rW   rL   base_kwargs
all_kwargss       rY   _get_model_kwargsOpenAI._get_model_kwargs  s_    $

4;K;KVvV??& )-K%==$$)>}}***.--J'.2.?.?N+*.*;*;J' ?>t'='=>
:%*:j*H+,::"{|'D'P2<..'L)A3J./ NN<.::"t'<'<'H-1-B-BJ)*??&'+J|$("&"3"3Jwr\   c           
         U R                  5       n[        UU R                  S9nU R                  (       a:  UR                  R
                  R                  " SUSS.U R                  " S0 UD6D6nODU   UR                  R
                  R                  " SUSS.U R                  " S0 UD6D6nS S S 5        WR                  S   R                  n[        X`R                  =(       d    S/S9nUR                  S   R                  nS n	U(       a&  UR                  (       a  [        UR                  5      n	[        UUU	U R!                  U5      S9$ ! , (       d  f       N= f	Nr   F)r   r   r   rc   )r   )rs   rawr   r   rf   )r   r?   r~   r   r   completionscreater   choicesrs   r8   r   r   contentr9   r   _get_response_token_counts)
rW   r   rL   clientmessage_dictsrq   openai_messagers   openai_token_logprobsr   s
             rY   r   OpenAI._chat  sJ   !!#/**

 {{..55 & ((262H !;;2299 *  ,,6v6  "))!,44%'B6(
 !) 0 0 3 < < %:%B%B12G2O2OPH"==hG	
 	
! s   2:E
Ec                    ^ ^^^ T R                   (       a  ST R                   ;   a  [        S5      eT R                  5       m[        UT R                  S9mS[
        4UUUU 4S jjnU" 5       $ )Nr   )Audio is not supported for chat streamingr   rI   c            
   3     >#    Sn / nSnT
R                   R                  R                  " SST0TR                  " SSS0TD6D6 GH  n/ n[	        [
        U5      n[        UR                  5      S:  a  UR                  S   R                  nO
[        5       nUc  MX  UR                  (       a  SnUR                  =(       d    [        R                  nUR                  =(       d    SnX-  n UR                  [!        U S95        0 nU(       a  [#        XR                  5      nU(       a~  XS'   U Ht  n	U	R$                  (       d  M  UR                  ['        U	R(                  U	R$                  R*                  =(       d    0 U	R$                  R,                  =(       d    SS	95        Mv     [/        [1        UUUS
9UUTR3                  U5      S9v   GM     g 7f)N Fr   r   Tr   rc   rx   tool_call_idtool_kwargs	tool_namerolert   r   rs   deltar   r   rf   )r   r   r   r   r   rD   rv   r   r  rE   rx   r  r$   	ASSISTANTr  appendr&   r@   functionr%   id	argumentsnamer   r   r  )r  rx   is_functionrq   rt   r  r  content_deltar   	tool_callr  rL   r  rW   s             rY   gen OpenAI._stream_chat.<locals>.gen  s    G46JK"KK33:: &((???  3X>x''(1,$,,Q/55E'ME= ##"&K zz:[%:%: % 3(iW56$&!!2:?O?O!PJ!:D,7)3I(111 &$15>\\4=4F4F4P4P4VTV2;2D2D2I2I2OR%&!" *4 #'!%*;
 ( &*&E&Eh&O	 	Os   D=GBG)r   r   r   r?   r~   r   )rW   r   rL   r  r  r  s   ` ` @@rY   r   OpenAI._stream_chat  s`     ??w$//9HII!!#/**

5	_ 5	 5	n ur\   c                    U R                  5       nU R                  " S0 UD6nU R                  XA5        U R                  (       a   UR                  R
                  " SUSS.UD6nO*U   UR                  R
                  " SUSS.UD6nS S S 5        WR                  S   R                  nUR                  S   R                  nS nU(       a  [        U5      n[        UUUU R                  U5      S9$ ! , (       d  f       No= fNF)r   r   r   )rc   r   r   r   rf   )r   r   _update_max_tokensr   r   r   r   rc   r   r7   r    r  )	rW   r   rL   r  r   rq   rc   openai_completion_logprobsr   s	            rY   r   OpenAI._completeK  s   !!#++5f5

3))00  H !--44 !  !  "''%-%5%5a%8%A%A"%67QRH!"==hG	
 	
 s   ' C00
C>c                    ^ ^^^ T R                  5       mT R                  " SSS0UD6mT R                  TT5        S[        4UUUU 4S jjnU" 5       $ )Nr   TrI   c            	   3     >#    Sn TR                   R                  " SST0TD6 H^  n[        UR                  5      S:  a  UR                  S   R                  nUc  SnOSnX-  n [        UU UTR                  U5      S9v   M`     g 7fNr  r   r   )r  rc   r   r   rf   r   r   rv   r   rc   r    r  )rc   rq   r  r   r  r   rW   s      rY   r  $OpenAI._stream_complete.<locals>.genr  s     D"..55  x''(1,$,,Q/44E} "E( &*&E&Eh&O	 s   BBrf   )r   r   r#  r"   )rW   r   rL   r  r   r  s   ``  @@rY   r   OpenAI._stream_completel  sT    !!#++B4B6B

F3	* 	 	( ur\   r   c                    U R                   c  U R                  c  g[        U R                  R                  U5      5      nU R                  R
                  U-
  nUS::  a&  [        SU SU R                  R
                   S35      eXAS'   g)z.Infer max_tokens for the payload, if possible.Nr   zThe prompt has zO tokens, which is too long for the model. Please use a prompt that fits within z tokens.r   )r   r   rv   rg   r   r   r   )rW   r   r   
num_tokensr   s        rY   r#  OpenAI._update_max_tokens  s    ??&$//*A//78
]]11J>
?!* .MM001; 
 $.< r\   raw_responsec                    [        US5      (       aD   UR                  R                  nUR                  R                  nUR                  R                  nOe[        U[        5      (       aN  UR                  S0 5      nUc  0 $ UR                  SS5      nUR                  SS5      nUR                  SS5      nO0 $ UUUS.$ ! [
         a    0 s $ f = f)z-Get the token usage reported by the response.usageprompt_tokensr   completion_tokenstotal_tokens)r2  r3  r4  )	hasattrr1  r2  r3  r4  AttributeErrorru   dictr   )rW   r/  r2  r3  r4  r1  s         rY   r  !OpenAI._get_response_token_counts  s    <)) , 2 2 @ @$0$6$6$H$H!+11>> d++ $$Wb1E}	!IIoq9M %		*=q A 99^Q7LI +!2(
 	
 " 	s   AC CCc                    #    U R                  U5      (       a  U R                  nO[        U R                  5      nU" U40 UD6I S h  vN $  N7fre   )r   _achatr   
_acomplete)rW   r   rL   achat_fns       rY   achatOpenAI.achat  sE      %%f--{{H4T__EHh1&1111   AAAAc                    #    U R                  U5      (       a  U R                  nO[        U R                  5      nU" U40 UD6I S h  vN $  N7fre   )r   _astream_chatr   _astream_complete)rW   r   rL   astream_chat_fns       rY   astream_chatOpenAI.astream_chat  sN      %%f--"00OB&&O %X88888r?  c                    #    U R                   (       a  SU R                   ;   a  [        S5      eU R                  U5      (       a  [        U R                  5      nOU R
                  nU" U40 UD6I S h  vN $  N7fr   )r   r   r   r   r:  r;  )rW   r   r   rL   acomplete_fns        rY   	acompleteOpenAI.acomplete  si      ??w$//9P  %%f--8EL??L!&3F3333s   A1A:3A84A:c                    #    U R                  U5      (       a  [        U R                  5      nOU R                  nU" U40 UD6I S h  vN $  N7fre   )r   r   rA  rB  )rW   r   r   rL   astream_complete_fns        rY   astream_completeOpenAI.astream_complete  sP      %%f--"F""# #'"8"8(:6::::r?  c           
      &  #    U R                  5       n[        UU R                  S9nU R                  (       aB  UR                  R
                  R                  " SUSS.U R                  " S0 UD6D6I S h  vN nO\U IS h  vN   UR                  R
                  R                  " SUSS.U R                  " S0 UD6D6I S h  vN nS S S 5      IS h  vN   WR                  S   R                  n[        X`R                  =(       d    S/S9nUR                  S   R                  nS n	U(       a&  UR                  (       a  [        UR                  5      n	[        UUU	U R!                  U5      S9$  N N N N! , IS h  vN  (       d  f       N= f7fr   )r   r?   r~   r   r   r   r   r   r   rs   r8   r   r   r  r9   r   r  )
rW   r   rL   aclientr  rq   r  rs   r  r   s
             rY   r:  OpenAI._achat  sm     ##%/**

 $\\55<< &u8<8N8N8XQW8X H w!(!9!9!@!@ "* " ,,6v6"  w "))!,44%'B6(
 !) 0 0 3 < < %:%B%B12G2O2OPH"==hG	
 	
)  wwwsm   A2F4E/5F E1F=E7E3E7FE5BF1F3E75F7F=F >F
Fc                    ^ ^^^#    T R                   (       a  ST R                   ;   a  [        S5      eT R                  5       m[        UT R                  S9mS[
        4UUUU 4S jjnU" 5       $ 7f)Nr   r	  r   rI   c            
     |  >#    Sn / nSnSnTR                   R                  R                  " SST0TR                  " SSS0TD6D6I S h  vN   S h  vN n/ n[	        [
        U5      n[        UR                  5      S:  am  U(       aL  UR                  S   R                  R                  c(  UR                  S   R                  R                  c  SnM  UR                  S   R                  nO
[        5       nSnUc  M  UR                  (       a  SnUR                  =(       d    [        R                  nUR                  =(       d    SnX-  n UR                  [!        U S95        0 n	U(       a  [#        XR                  5      nU(       a~  XS'   U Ht  n
U
R$                  (       d  M  UR                  ['        U
R(                  U
R$                  R*                  =(       d    0 U
R$                  R,                  =(       d    SS	95        Mv     [/        [1        UUU	S
9UUTR3                  U5      S97v   GM   GN GN
 g 7f)Nr  FTr   r   r   r  rx   r  r  r  rf   )r   r   r   r   r   rD   rv   r   r  r  rx   rE   r  r$   r  r  r&   r@   r  r%   r  r  r  r   r   r  )r  rx   r  first_chat_chunkrq   rt   r  r  r  r   r  rO  rL   r  rW   s              rY   r  !OpenAI._astream_chat.<locals>.gen  s    G46JK#(/(@(@(G(G )&)((???) # # :h  3X>x''(1, )$,,Q/55==E$,,Q/55@@H+0( $,,Q/55E'ME#( = ##"&K zz:[%:%: % 3(iW56$&!!2:?O?O!PJ!:D,7)3I(111 &$15>\\4=4F4F4P4P4VTV2;2D2D2I2I2OR%&!" *4 #'!%*;
 ( &*&E&Eh&O	 	c# : #s>   AH<	H4
H<H:H7H:EH<(BH<7H::H<)r   r   r   r?   r~   r   )rW   r   rL   r  rO  r  s   ` ` @@rY   rA  OpenAI._astream_chat  sg      ??w$//9HII##%/**

@	/ @	 @	D us   A)A/c                 l  #    U R                  5       nU R                  " S0 UD6nU R                  XA5        U R                  (       a(  UR                  R
                  " SUSS.UD6I S h  vN nOBU IS h  vN   UR                  R
                  " SUSS.UD6I S h  vN nS S S 5      IS h  vN   WR                  S   R                  nUR                  S   R                  nS nU(       a  [        U5      n[        UUUU R                  U5      S9$  N N Ny Nk! , IS h  vN  (       d  f       N= f7fr"  )r   r   r#  r   r   r   r   rc   r   r7   r    r  )	rW   r   rL   rO  r   rq   rc   r$  r   s	            rY   r;  OpenAI._acompletea  s+    ##%++5f5

3$0077   H w!(!4!4!;!; "! " !"  w "''%-%5%5a%8%A%A"%67QRH!"==hG	
 	
'  wwwsm   A'D4)D*D45D6D49#DDD!D4,D-A&D4D4DD4D1 D#!D1-D4c                    ^ ^^^#    T R                  5       mT R                  " SSS0UD6mT R                  TT5        S[        4UUUU 4S jjnU" 5       $ 7f)Nr   TrI   c            	     6  >#    Sn TR                   R                  " SST0TD6I S h  vN   S h  vN n[        UR                  5      S:  a  UR                  S   R                  nUc  SnOSnX-  n [        UU UTR                  U5      S97v   Mg   Nk Nd
 g 7fr(  r)  )rc   rq   r  rO  r   r   rW   s      rY   r  %OpenAI._astream_complete.<locals>.gen  s     D(/(;(;(B(B ))) # # h x''(1,$,,Q/44E} "E( &*&E&Eh&O	 #  #s0   $BBBBBBA BBBrf   )r   r   r#  r!   )rW   r   rL   r  rO  r   s   ``  @@rY   rB  OpenAI._astream_complete  sY      ##%++B4B6B

F3	5 	 	( us   AAtoolsrG   user_msgchat_historyverboseallow_parallel_tool_callstool_requiredtool_choicec	                    U V
s/ s H  oR                   R                  SS9PM     nn
Ub  UnOU R                  nU R                   R                  (       a&  U H   nUS   S:X  d  M  XS   S'   SUS   S   S	'   M"     [	        U[
        5      (       a  [        [        R                  US
9nU=(       d    / nU(       a  UR                  U5        UU=(       d    SU(       a  [        Xv5      OSS.U	E$ s  sn
f )Predict and call the tool.T)skip_length_checkNtyper  r   F
parametersadditionalProperties)r  r  )r   r\  rb  )r   to_openai_toolr   r;   ru   rn   r   r$   r   r  r>   )rW   r\  r]  r^  r_  r`  ra  rb  r   rL   tool
tool_specs	tool_specr   s                 rY   _prepare_chat_with_toolsOpenAI._prepare_chat_with_tools  s     NS
MRTMM((4(@U 	 

 F[[F==22'	V$
26<j)(3RWIj),78NO	 ( h$$"(8(8(KH%2OOH% !'4 /{J
 
 	
1
s   "C/rq   c                 *    U(       d  [        U5        U$ )z+Validate the response from chat_with_tools.)ry   )rW   rq   r\  r`  rL   s        rY   "_validate_chat_with_tools_response)OpenAI._validate_chat_with_tools_response  s     )"8,r\   r   error_on_no_tool_callc           	      $   UR                   R                   Vs/ s H  n[        U[        5      (       d  M  UPM     nnU(       a  [	        U5      S:  a!  U(       a  [        S[	        U5       S35      e/ $ / nU H}  n [        UR                  [        5      (       a  [        UR                  5      nOUR                  n UR                  [        UR                  =(       d    SUR                  US95        M     U$ UR                   R                  R!                  S/ 5      n[	        U5      S:  a!  U(       a  [        S[	        U5       S35      e/ $ / nU Hv  nUR"                  S:w  a  [        S5      e [        UR$                  R&                  5      nUR                  [        UR(                  UR$                  R*                  US95        Mx     U$ s  snf ! [
        [        [        4 a    0 n GN2f = f! [
        [        [        4 a    0 n Nzf = f)	rd  rP   z)Expected at least one tool call, but got z tool calls.r  )tool_idr  r  rx   r  z,Invalid tool type. Unsupported by OpenAI llm)rs   rt   ru   r%   rv   r   r  rn   r0   	TypeErrorr   r  r.   r  r  r   r   rf  r  r  r  r  )	rW   rq   rr  rL   rw   rx   tool_selectionsr  argument_dicts	            rY   get_tool_calls_from_response#OpenAI.get_tool_calls_from_response  s    "))00
0%/ 0 	 

 :"($CC
OCTT`a  I O'	'!)"7"7==(:9;P;P(Q(1(=(=  &&! ) 6 6 <""+"5"5$1 ($ #"!));;??bQJ:"($CC
OCTT`a  I O'	>>Z/$%STT'$6y7I7I7S7S$TM  &&! )"+"4"4"9"9$1 ($ #"A
, #I? '$&M'> #I? '$&M's4   GG=4G2G5G5G21G25HH
llm_kwargs
output_clsc                 P    SSK Jn  U=(       d    0 nU" U5      US'   SU;   a  US	 U$ )Nr   )_type_to_response_formatresponse_formatrb  )-openai.resources.chat.completions.completionsr}  )rW   rz  r{  r}  s       rY   _prepare_schemaOpenAI._prepare_schema#  s9    	
  %2
(@(L
$%J&=)r\   c                 t    U R                   [        R                  :H  =(       a    [        U R                  5      $ re   )r   r4   DEFAULTrA   r~   r   s    rY   _should_use_structure_outputs$OpenAI._should_use_structure_outputs0  s-    &&*=*E*EE 5(4	
r\   prompt_argsc                 p  > U=(       d    0 nU R                  5       (       as  U R                  UR                  " S0 UD65      nU R                  X15      nU R                  " U40 UD6nUR                  [        UR                  R                  5      5      $ SU;  a  SOUS   US'   [        TU ](  " X4SU0UD6$ )Structured predict.rb  requiredrz  rf   )r  _extend_messagesformat_messagesr  r   model_validate_jsonrn   rs   r  r   structured_predictrW   r{  r   rz  r  r   rq   r   s          rY   r  OpenAI.structured_predict6  s      %2
--//,,V-C-C-Rk-RSH--jEJyy8Z8H11#h6F6F6N6N2OPP
 (z9Jz-?X 	=! w)
+5
9D
 	
r\   c                   >#    U=(       d    0 nU R                  5       (       a{  U R                  UR                  " S0 UD65      nU R                  X15      nU R                  " U40 UD6I Sh  vN nUR                  [        UR                  R                  5      5      $ SU;  a  SOUS   US'   [        TU ](  " X4SU0UD6I Sh  vN $  N] N7f)r  Nrb  r  rz  rf   )r  r  r  r  r=  r  rn   rs   r  r   astructured_predictr  s          rY   r  OpenAI.astructured_predictP  s       %2
--//,,V-C-C-Rk-RSH--jEJ!ZZ?J??H11#h6F6F6N6N2OPP
 (z9Jz-?X 	=! W0
+5
9D
 
 	
 @
s%   A)C,C
-ACCCCr2   c              +   T  >#    U R                  5       (       ab  SSKJn  U R                  UR                  " S0 UD65      nU R                  X15      nS nU R                  " U40 UD6 H  nU" XU5      nUv   M     g SU;  a  SOUS   US'   [        T	U ]   " XU40 UD6 S h  vN   g  N7f)Nr   %process_streaming_content_incrementalrb  r  rf   )	r  (llama_index.core.program.streaming_utilsr  r  r  r  r   r   _structured_stream_call)
rW   r{  r   rz  r  r  r   currrq   r   s
            rY   r  OpenAI._structured_stream_callj  s      --// ,,V-C-C-Rk-RSH--jEJD ,,XDD<XSWX
 E !
2 . }%
 w6J2=  s   BB( B&!B(c           	      *  >^ ^^^#    T R                  5       (       aI  U4S[        [        [        [        [           [
        [        [
           4   S 4   4UUUU 4S jjjnU" 5       $ SU;  a  SOUS   US'   [        TT ]  " TTU40 TD6I S h  vN $  N7f)NrI   c                   >#    SSK Jn  TR                  TR                  " S0 TD65      nTR	                  U T5      n S nTR
                  " U40 U D6I S h  vN   S h  vN nU" UTU5      nU7v   M   N N
 g 7f)Nr   r  rf   )r  r  r  r  r  rD  )	rz  r  r   r  rq   r{  r   r  rW   s	        rY   r  ,OpenAI._structured_astream_call.<locals>.gen  s     
  001G1G1V+1VW!11*jI
,0,=,=h,U*,U&U&U (@ *dD J	 'V &Us6   AA:A4A:A8A6A8"A:6A88A:rb  r  )r  r   r   r/   r   r2   r   _structured_astream_call)rW   r{  r   rz  r  r  r   s   ``` ` rY   r  OpenAI._structured_astream_call  s      --// &eT%[-m9LLMtS $ 5L !
2 . }%
 9FJ2=   s   BBBBc                 @   > U=(       d    0 n[         TU ]  " X4SU0UD6$ )Stream structured predict.rz  )r   stream_structured_predictrW   r{  r   rz  r  r   s        rY   r   OpenAI.stream_structured_predict  s4      %2
w0
+5
9D
 	
r\   c                 \   >#    U=(       d    0 n[         TU ]  " X4SU0UD6I Sh  vN $  N7f)r  rz  N)r   astream_structured_predictr  s        rY   r  !OpenAI.astream_structured_predict  sA       %2
W7
+5
9D
 
 	
 
s   ",*,)r   r   r   r   )F)NNFFFNN)Tre   )uri   rj   rk   rl   rm   r'   DEFAULT_OPENAI_MODELr~   rn   __annotations__r*   r   floatr   r   ro   r   boolr   r7  r   r	   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r(   r   r   r   rB   r   httpxClientr   AsyncClientr4   r  r)   r   r   r   r3   r   r   r   r   classmethodr   propertyra   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   rD  rH  r!   rL  r:  rA  r;  rB  r   rm  rp  r.   rx  r   r/   r  r  
dispatcherspanr1   r  r  r
   r  r   r  r2   r  r  rp   __classcell__)r   s   @rY   rC   rC      s   &P $2LE3  #?	K  !&?!J 
  %; Hhtn  B	L#  ).*Q)tCH~  8K 
 @GU 
 16"I1OXd38n-  WL$  #4=RSGXc]S#"@Hhsm  "'"C"K#  RFD  OT=Ohw'IJK  ',A'Jc#  .3C.L(4S>* 
 %0MGXj!1&1mHh{#3+6=L(5<<(86Am!2!23C *0$(6:!!%"&%)6:48.29=.259'+OS?C5H5P5P48GK*.157K4K4 K4 SM	K4
 $DcN3K4 K4 K4 K4 #K4 3-K4 c]K4 #?3K4 "$sCx.1K4 ell+K4 $E$5$56K4   
+!K4" &k2#K4&  }'K4( %Xx/D.Es.J%KL)K4* 'xs
';<+K4,  3-K4.   01/K40 1K42 #7+B#CD3K44 T#Y'5K46 tCH~.7K48 9K4: 
;K4 K4ZZ k   3   CHY/ C C 
+ 
 
 +Xk2 +c +l + + 2 -29<2	2 2 -2--&*->A-	- - -244&*4>A4	4 4+DcN +t +

t 
S#X 
!# !$sCx. !F #
h{3 #
s #
| #
 #
J C -C9<C	C CJ 
 
s 
7I 
 
@ s c >S  6.T#s(^ .S .T .
s 
t 
8 
2;'
2 
2 
	
2 
2 9;'9 9 
	9 9 -244&*4>A4	4 4 -2	;	;&*	;>A	;	#	; 	; #
 -#
9<#
	#
 #
J N -N9<N	N N` 
s 
c 
>P 
 
@ %(	# @ 7;48*/#26!%,

#,
 5k!123,
 tK01	,

 ,
 $(,
 ,
 eCI./,
 ,
 ,
 
c3h,
d +0	

 
#
 $(	

 
 

 '+G# G#  $G# 	G#
 
m	G#R"4S>2@DU	c3h
t 
 __
 04	
K
 
 T#s(^,	

 
 

 
2 __
 04	
K
 
 T#s(^,	

 
 

 
: 04	K  T#s(^,	
  
eT%[/43HHI4QUU
 D 04	&K& & T#s(^,	&
 & 
eT%[/43HHI4O
& &P __
 04	
K
 
 T#s(^,	

 
 
5-.d:	;
 
 __
 04	
K
 
 T#s(^,	

 
 
e]23T9	:
 
r\   rC   )fr]   json.decoderr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r  r    llama_index.core.instrumentationcoreinstrumentation
instrument(llama_index.core.base.llms.generic_utilsr   r   r   r   r   r   r   r    llama_index.core.base.llms.typesr   r   r   r   r    r!   r"   r#   r$   r%   r&    llama_index.core.bridge.pydanticr'   r(   llama_index.core.callbacksr)   llama_index.core.constantsr*   llama_index.core.llms.callbacksr+   r,   &llama_index.core.llms.function_callingr-   llama_index.core.llms.llmr.   r/   llama_index.core.llms.utilsr0   llama_index.core.promptsr1   llama_index.core.program.utilsr2   llama_index.core.typesr3   r4   llama_index.llms.openai.utilsr5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   openairB   rC   r   'openai.types.chat.chat_completion_chunkrD   rE   rF   get_dispatcherri   r  llama_index.core.tools.typesrG   r  r_   ra   ry   rf   r\   rY   <module>r     s$    (    &   5 5	 	 	    7 F : : 3 8 H     '  &&x0
5& 8CH- (382D &   	\ 	d 	B
 B
r\   