
    @'hܖ                     t   d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZ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Zd dlmc mZ d dlmZmZmZmZm Z m!Z!m"Z"m#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.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d d	l5m6Z6m7Z7 d d
l8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZDmEZE d dlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZS d dlTmUZUmVZVmWZW d dlTmXZY d dlZm[Z[m\Z\m]Z]  ej                  e_      Z`erd dlambZb dZcdedef   dedef   fdZde G d de             Zede&ddfdZf G d de9      ZXy)     N)JSONDecodeError)TYPE_CHECKINGAnyAsyncGenerator	AwaitableCallableDict	GeneratorListLiteralOptionalProtocolSequenceTypeUnioncastget_args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)FieldPrivateAttr)CallbackManager)DEFAULT_TEMPERATURE)llm_chat_callbackllm_completion_callback)FunctionCallingLLM)ToolSelectionModel)parse_partial_json)PromptTemplate)FlexibleModel)BaseOutputParserPydanticProgramMode)	O1_MODELSOpenAIToolCall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)AsyncOpenAIAzureOpenAIAsyncAzureOpenAI)OpenAI)ChatCompletionChunkChoiceDeltaChoiceDeltaToolCall)BaseToolzgpt-3.5-turbof.returnc                 h     t        j                         dt        dt        dt        f fd       }|S )NargskwargsrJ   c                     t        | dd      }|dk  r | g|i |S t        |dddd      }  |      | g|i |S )Nmax_retriesr   T<         )rO   random_exponentialstop_after_delay_secondsmin_secondsmax_seconds)getattrr6   )selfrL   rM   rO   retryrI   s        c/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/llama_index/llms/openai/base.pywrapperz$llm_retry_decorator.<locals>.wrapperb   sd    dM15!T+D+F++&##%'
 uQx.t.v..    )	functoolswrapsr   )rI   r[   s   ` rZ   llm_retry_decoratorr_   a   s:    __Q/S /C /C / / Nr\   c                   &    e Zd ZdZdedee   fdZy)	TokenizerzBTokenizers support an encode function that returns a list of ints.textrJ   c                      y N )rX   rb   s     rZ   encodezTokenizer.encodex   s    r\   N)__name__
__module____qualname____doc__strr   intrf   re   r\   rZ   ra   ra   t   s    L3 49 r\   ra   responsec                     | j                   j                  j                  dg       }t        |      dkD  r|d   g| j                   j                  d<   y y )N
tool_callsrQ   r   )messageadditional_kwargsgetlen)rm   ro   s     rZ   force_single_tool_callrt   |   sM    !!3377bIJ
:<FqM?**<8 r\   c            7       \
    e Zd ZU dZ eed      Zeed<    ee	ddd      Z
eed	<    ed
d      Zee   ed<    edd      Zee   ed<    edddd      Zeed<    eed      Zeeef   ed<    eddd      Zeed<    eddd      Zeed<    edd       Zeeeef      ed!<    ed"d#      Zeed$<    edd%      Zeed&<    ed'(      Zeed)<    ed*(      Zeed+<    ed,d-      Zeed.<    edd/      Zeed0      ed1<    edd2      Z ee!e      ed3<    edd4      Z"eeeef      ed5<    e#       Z$ee%   ed6<    e#       Z&ee'   ed7<    e#       Z(ee)jT                     ed8<    e#       Z+ee)jX                     ed9<   ee	ddddd"dddddddddddde-j\                  dd,dddfded	edee   deeeef      deded$ed&ee   d)ee   d+ee   d:ee/   d!eeeef      d;ee)jT                     d<ee)jX                     d=ee%   d>ee'   d?ee   d@ee0e1e2   gef      dAee0egef      dBe-dCee3   d.ed1eed0      d3ee!e      d5eeeef      dDedEdf6 fdFZ4dEe%fdGZ5dEe'fdHZ6dEefdIZ7e8dEefdJ       Z9e:dEee;   fdK       Z<e:dEe=fdL       Z> e?       dMe1e2   dDedEe@fdN       ZA e?       dMe1e2   dDedEeBfdO       ZC eD       	 d|dPedQedDedEeEfdR       ZF eD       	 d|dPedQedDedEeGfdS       ZHdDeeef   dEefdTZId|dUedEeeef   fdVZJdDedEeeef   fdWZKeLdMe1e2   dDedEe@fdX       ZMeLdMe1e2   dDedEeBfdY       ZNeLdPedDedEeEfdZ       ZOeLdPedDedEeGfd[       ZPd\eeef   dPedEdfd]ZQd^edEefd_ZR e?       dMe1e2   dDedEe@fd`       ZS e?       dMe1e2   dDedEeTfda       ZU eD       	 d|dPedQedDedEeEfdb       ZV eD       	 d|dPedQedDedEeWfdc       ZXeLdMe1e2   dDedEe@fdd       ZYeLdMe1e2   dDedEeTfde       ZZeLdPedDedEeEfdf       Z[eLdPedDedEeWfdg       Z\	 	 	 	 	 	 d}dhe1di   djee]ee2f      dkee!e2      dledmedne]eef   d.ee   dDedEeeef   fdoZ^	 d|dpe@dhe1di   dmedDedEe@f
dqZ_	 d~dpdrdsedDedEe!e`   fdtZaebj                  	 dduedee   dPefdveeeef      dwedEeef
 fdx       Zgebj                  	 dduedee   dPefdveeeef      dwedEeef
 fdy       Zhebj                  	 dduedee   dPefdveeeef      dwedEeie]eeejf   ddf   f
 fdz       Zkebj                  	 dduedee   dPefdveeeef      dwedEele]eeejf   df   f
 fd{       Zm xZnS )rD   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("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       @)rv   rw   geletemperaturez)The maximum number of tokens to generate.r   )rw   gt
max_tokensz%Whether to return logprobs per token.N)rw   rv   logprobsz,The number of top token log probs to return.rR   )rw   rv   ry   rz   top_logprobsz%Additional kwargs for the OpenAI API.)default_factoryrw   rq      z"The maximum number of API retries.)rv   rw   ry   rO   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.)rw   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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_parserrM   rJ   c                 6   d|v r|d   }|d= |xs i }t        ||	|
      \  }}	}
|t        v rd}t        |   di d|d|d|d|d|d	|d
|d|
d|	d|d|d|d|d|d|d|d|d|d|d|d|| || _        || _        || _        || _        y )Nmax_new_tokens)r   r   r   g      ?rx   r{   r}   rq   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   )r=   r4   super__init__r   r   r   r   )rX   rx   r{   r}   rq   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   	__class__s                              rZ   r   zOpenAI.__init__   sS   > v% 01J'(-3)C#*
&; IK 	
	
#	
 "	
 0		

 $	
 .	
 	
 $	
 	
 	
 &	
 ,	
 (	
  2	
 "6	
  #8!	
" (#	
$ %	
& .'	
( ")	
* &-	
2 %+'"3r\   c                     | j                   st        di | j                         S | j                  t        di | j                         | _        | j                  S )Nre   )r   
SyncOpenAI_get_credential_kwargsr   rX   s    rZ   _get_clientzOpenAI._get_client@  sN      > ; ; =>><<%F(C(C(EFDL||r\   c                     | j                   st        di | j                  d      S | j                   t        di | j                  d      | _        | j                  S )NT)is_asyncre   )r   rA   r   r   r   s    rZ   _get_aclientzOpenAI._get_aclientH  sX      L!<!<d!<!KLL== 'U$*E*Et*E*TUDM}}r\   c                     | j                   }d|v r|j                  d      d   }|S |j                  d      r|j                  d      d   }|S )Nzft-:r   zft:rQ   )rx   split
startswith)rX   
model_names     rZ   _get_model_namezOpenAI._get_model_nameP  s[    ZZ
J#))#.q1J  ""5)#))#.q1Jr\   c                      y)N
openai_llmre   )clss    rZ   
class_namezOpenAI.class_nameX  s    r\   c                 H    t        j                  | j                               S )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    rZ   
_tokenizerzOpenAI._tokenizer\  s     **4+?+?+ABBr\   c           	      L   t        t        | j                               | j                  xs dt	        | j                               t        | j                               | j                  | j                  t        v rt        j                        S t        j                        S )Nrx   )context_window
num_outputr:   r;   r   system_role)r$   r<   r   r}   r:   r;   rx   r4   r%   USERSYSTEMr   s    rZ   metadatazOpenAI.metadataf  s    :4;O;O;QR,"'d.B.B.DE&?**,' zz zzY& $((
 	
 ##
 	
r\   messagesc                 z    | j                  |      r| j                  }nt        | j                        } ||fi |S rd   )_use_chat_completions_chatr   	_complete)rX   r   rM   chat_fns       rZ   chatzOpenAI.chatv  s7    %%f-jjG24>>BGx*6**r\   c                 z    | j                  |      r| j                  }nt        | j                        } ||fi |S rd   )r   _stream_chatr   _stream_complete)rX   r   rM   stream_chat_fns       rZ   stream_chatzOpenAI.stream_chat~  s=     %%f-!..N@AVAVWNh1&11r\   prompt	formattedc                     | j                   rd| j                   v rt        d      | j                  |      rt        | j                        }n| j
                  } ||fi |S Naudioz>Audio is not supported for completion. Use chat/achat instead.)r   
ValueErrorr   r   r   r   )rX   r   r   rM   complete_fns        rZ   completezOpenAI.complete  s]     ??w$//9P  %%f-6tzzBK..K6,V,,r\   c                 z    | j                  |      rt        | j                        }n| j                  } ||fi |S rd   )r   r   r   r   )rX   r   r   rM   stream_complete_fns        rZ   stream_completezOpenAI.stream_complete  s?     %%f-!DTEVEV!W!%!6!6!&3F33r\   c                 @    d|v r|d   S | j                   j                  S )Nuse_chat_completions)r   r:   )rX   rM   s     rZ   r   zOpenAI._use_chat_completions  s&    !V+011}}***r\   r   c                     | j                   | j                  | j                  | j                  | j                  |r| j
                  dS | j                  dS )N)r   base_urlrO   r   r   r   )r   r   rO   r   r   r   r   )rX   r   s     rZ   r   zOpenAI._get_credential_kwargs  sU    ||++||#336>422
 	
 EIDUDU
 	
r\   c                    | j                   | j                  d|}| j                  | j                  |d<   | j                  R| j                  du rD| j                  j
                  r| j                  |d<   | j                  |d<   n| j                  |d<   i || j                  }d|vrd|v r|d= | j                   t        v r;|j                  d      *|j                  d|d         |d<   |j                  dd        | j                   t        v r| j                  | j                  |d	<   | j                  | j                  |d
<   | j                  | j                  |d<   |S )N)rx   r{   r}   Tr~   r   streamstream_optionsmax_completion_tokensr   r   r   )rx   r{   r}   r~   r   r:   r   rq   r4   rr   popr   r   r   )rX   rM   base_kwargs
all_kwargss       rZ   _get_model_kwargsz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           
         | j                         }t        || j                        }| j                  r: |j                  j
                  j                  d|dd | j                  di |}nD|5   |j                  j
                  j                  d|dd | j                  di |}d d d        j                  d   j                  }t        || j                  xs dg      }|j                  d   j                  }d }	|r!|j                  rt        |j                        }	t        |||	| j!                  |            S # 1 sw Y   xY w	Nr   F)r   r   r   rb   )r   )rp   rawr~   rq   re   )r   r?   rx   r   r   completionscreater   choicesrp   r8   r   r~   contentr9   r   _get_response_token_counts)
rX   r   rM   clientmessage_dictsrm   openai_messagerp   openai_token_logprobsr~   s
             rZ   r   zOpenAI._chat  s\   !!#/**

 5v{{..55 & )$((262H  96;;2299 *  -d,,6v6 "))!,44%t'B6(
 !) 0 0 3 < < %:%B%B12G2O2OPH"==hG	
 	
! s   0:EEc                       j                   rd j                   v rt        d       j                         t        | j                        dt
        f fd} |       S )Nr   )Audio is not supported for chat streamingr   rJ   c            	   3   t  K   d} g }d} j                   j                  j                  d
d
i j                  d
ddi	D ]  }t	        t
        |      }t        |j                        dkD  r|j                  d   j                  }nt        t              rVt               }|c|j                  rd}|j                  xs t        j                  }|j                   xs d}| |z  } i }|rt#        ||j                        }|r||d<   t%        t'        || |      ||j)                  |      	        y w)N Fr   r   Tr   ro   roler   rq   rp   deltar   rq   re   )r   r   r   r   r   rE   rs   r   r   
isinstancerB   rF   ro   r   r%   	ASSISTANTr   r@   r   r   r   )r   ro   is_functionrm   r   r   content_deltarq   r   rM   r   rX   s           rZ   genz OpenAI._stream_chat.<locals>.gen  sP    G46JK:FKK33:: &($((??? (   3X>x''(1,$,,Q/55E!&+6  += ##"&K zz:[%:%: % 3=($&!!2:u?O?O!PJ!:D),7"'! '*;
 ( &*&E&Eh&O	 	?(s   D5D8)r   r   r   r?   rx   r    )rX   r   rM   r   r   r   s   ` ` @@rZ   r   zOpenAI._stream_chat  s`     ??w$//9HII!!#/**

-	_ -	 -	^ ur\   c                    | j                         } | j                  di |}| j                  ||       | j                  r  |j                  j
                  d|dd|}n*|5   |j                  j
                  d|dd|}d d d        j                  d   j                  }|j                  d   j                  }d }|rt        |      }t        |||| j                  |            S # 1 sw Y   hxY wNF)r   r   r   )rb   r   r~   rq   re   )r   r   _update_max_tokensr   r   r   r   rb   r~   r7   r!   r   )	rX   r   rM   r   r   rm   rb   openai_completion_logprobsr~   s	            rZ   r   zOpenAI._complete7  s   !!#+T++5f5

F30v))00  H  46--44 !  ! "''%-%5%5a%8%A%A"%67QRH!"==hG	
 	
 s   # C**C3c                       j                           j                  dddi| j                         dt        f fd} |       S )Nr   TrJ   c            	   3     K   d}  j                   j                  ddiD ]_  }t        |j                        dkD  r|j                  d   j                  }|d}nd}| |z  } t        || |j                  |             a y wNr   r   r   )r   rb   r   rq   re   r   r   rs   r   rb   r!   r   )rb   rm   r   r   r   r   rX   s      rZ   r   z$OpenAI._stream_complete.<locals>.gen^  s     D5F..55   x''(1,$,,Q/44E} "E( &*&E&Eh&O	 s   BBre   )r   r   r   r#   )rX   r   rM   r   r   r   s   ``  @@rZ   r   zOpenAI._stream_completeX  sV    !!#+T++B4B6B

F3	* 	 	( ur\   r   c                    | j                   | j                  yt        | j                  j                  |            }| j                  j
                  |z
  }|dk  r&t        d| d| j                  j
                   d      ||d<   y)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   rs   rf   r   r   r   )rX   r   r   
num_tokensr}   s        rZ   r   zOpenAI._update_max_tokenst  s    ??&$//*A//78
]]11J>
?!* .MM001; 
 $.
< r\   raw_responsec                    t        |d      rD	 |j                  j                  }|j                  j                  }|j                  j                  }n_t        |t              rM|j                  di       }|i S |j                  dd      }|j                  dd      }|j                  dd      }ni S |||dS # t
        $ r i cY S w xY w)z-Get the token usage reported by the response.usageprompt_tokensr   completion_tokenstotal_tokens)r
  r  r  )	hasattrr	  r
  r  r  AttributeErrorr   dictrr   )rX   r  r
  r  r  r	  s         rZ   r   z!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B6 6CCc                    K   | j                  |      r| j                  }nt        | j                        } ||fi | d {   S 7 wrd   )r   _achatr   
_acomplete)rX   r   rM   achat_fns       rZ   achatzOpenAI.achat  sC      %%f-{{H4T__EHh1&1111   A A	AA	c                    K   | j                  |      r| j                  }nt        | j                        } ||fi | d {   S 7 wrd   )r   _astream_chatr   _astream_complete)rX   r   rM   astream_chat_fns       rZ   astream_chatzOpenAI.astream_chat  sL      %%f-"00OB&&O %X88888r  c                    K   | j                   rd| j                   v rt        d      | j                  |      rt        | j                        }n| j
                  } ||fi | d {   S 7 wr   )r   r   r   r   r  r  )rX   r   r   rM   acomplete_fns        rZ   	acompletezOpenAI.acomplete  sg      ??w$//9P  %%f-8EL??L!&3F3333s   A%A.'A,(A.c                    K   | j                  |      rt        | j                        }n| j                  } ||fi | d {   S 7 wrd   )r   r   r  r  )rX   r   r   rM   astream_complete_fns        rZ   astream_completezOpenAI.astream_complete  sN      %%f-"F""# #'"8"8(:6::::r  c           
        K   | j                         }t        || j                        }| j                  rB |j                  j
                  j                  d|dd | j                  di | d {   }n\|4 d {     |j                  j
                  j                  d|dd | j                  di | d {   }d d d       d {    j                  d   j                  }t        || j                  xs dg      }|j                  d   j                  }d }	|r!|j                  rt        |j                        }	t        |||	| j!                  |            S 7 7 7 7 # 1 d {  7  sw Y   xY wwr   )r   r?   rx   r   r   r   r   r   r   rp   r8   r   r~   r   r9   r   r   )
rX   r   rM   aclientr   rm   r   rp   r   r~   s
             rZ   r  zOpenAI._achat  s     ##%/**

 <W\\55<< &u8N8N8N8XQW8X H   !@!9!9!@!@ "* " -d,,6v6"   "))!,44%t'B6(
 !) 0 0 3 < < %:%B%B12G2O2OPH"==hG	
 	
)   sm   A0F2E%3F>E'?F=E-?E) E-FE+BF'F)E-+F-E?3E64E?;Fc                     K    j                   rd j                   v rt        d       j                         t        | j                        dt
        f fd} |       S w)Nr   r   r   rJ   c            	     >  K   d} g }d}d} 	j                   j                  j                  d
di j                  d
ddi
 d {   2 3 d {   }t	        t
        |      }t        |j                        dkD  re|rI|j                  d   j                  j                  &|j                  d   j                  j                  d}||j                  d   j                  }nt        	t              rt               }d}||j                  rd}|j                  xs t        j                   }|j                  xs d}| |z  } i }|rt#        ||j                        }|r||d<   t%        t'        || |      ||j)                  |      	       G7 L7 F6 y w)Nr   FTr   r   r   ro   r   r   re   )r   r   r   r   r   rE   rs   r   r   r   ro   r   rC   rF   r   r%   r   r@   r   r   r   )r   ro   r   first_chat_chunkrm   r   r   r   rq   r"  rM   r   rX   s            rZ   r   z!OpenAI._astream_chat.<locals>.gen	  s    G46JK#(G(@(@(G(G )&)($((???) # 2 2h   3X>x''(1, )$,,Q/55==E$,,Q/55@@H+0( $,,Q/55E!'+;<  +#( = ##"&K zz:[%:%: % 3=($&!!2:u?O?O!PJ!:D),7"'! '*;
 ( &*&E&Eh&O	 	S# 2 #s7   AF	F
FFFFE FFF)r   r   r   r?   rx   r   )rX   r   rM   r   r"  r   s   ` ` @@rZ   r  zOpenAI._astream_chat  se      ??w$//9HII##%/**

8	/ 8	 8	t us   A#A)c                 V  K   | j                         } | j                  di |}| j                  ||       | j                  r( |j                  j
                  d|dd| d {   }nB|4 d {     |j                  j
                  d|dd| d {   }d d d       d {    j                  d   j                  }|j                  d   j                  }d }|rt        |      }t        |||| j                  |            S 7 7 7 w7 i# 1 d {  7  sw Y   yxY wwr   )r   r   r   r   r   r   r   rb   r~   r7   r!   r   )	rX   r   rM   r"  r   rm   rb   r   r~   s	            rZ   r  zOpenAI._acompleteE  sL    ##%+T++5f5

F37W0077   H   !;!4!4!;!; "! " !"   "''%-%5%5a%8%A%A"%67QRH!"==hG	
 	
'   sm   A#D)%D&D)1D2D)5#DDDD)(D)A$D)D)DD)D&DD&"D)c                     K    j                           j                  dddi| j                         dt        f fd} |       S w)Nr   TrJ   c            	     8  K   d}  j                   j                  ddi d {   2 3 d {   }t        |j                        dkD  r|j                  d   j                  }|d}nd}| |z  } t        || |j                  |             h7 l7 e6 y wr  r  )rb   rm   r   r"  r   r   rX   s      rZ   r   z%OpenAI._astream_complete.<locals>.genn  s     D(B(;(;(B(B ))) #  h x''(1,$,,Q/44E} "E( &*&E&Eh&O	 #  #s0   $BBBBBBA!BBBre   )r   r   r   r"   )rX   r   rM   r   r"  r   s   ``  @@rZ   r  zOpenAI._astream_completef  s\      ##%+T++B4B6B

F3	5 	 	( us   AAtoolsrH   user_msgchat_historyverboseallow_parallel_tool_callstool_choicec                    |D 	cg c]  }	|	j                   j                          }
}	||}n| j                  }| j                   j                  r#|
D ]  }|d   dk(  s||d   d<   d|d   d   d<     t	        |t
              rt        t        j                  |      }|xs g }|r|j                  |       ||
xs d|
rt        |      ndd	|S c c}	w )
Predict and call the tool.Ntypefunctionr   F
parametersadditionalProperties)r   r   )r   r)  r.  )r   to_openai_toolr   r;   r   rk   r   r%   r   appendr>   )rX   r)  r*  r+  r,  r-  r.  r   rM   tool
tool_specs	tool_specr   s                rZ   _prepare_chat_with_toolszOpenAI._prepare_chat_with_tools  s     BGGdmm224G
G F[[F==22' X	V$
26<Ij)(3RWIj),78NO	X h$"(8(8(KH%2OOH% !'4?I.{;t
 	
 	
- Hs   !Crm   c                      |st        |       |S )z+Validate the response from chat_with_tools.)rt   )rX   rm   r)  r-  rM   s        rZ   "_validate_chat_with_tools_responsez)OpenAI._validate_chat_with_tools_response  s     )"8,r\   r   error_on_no_tool_callc                 "   |j                   j                  j                  dg       }t        |      dk  r|rt	        dt        |       d      g S g }|D ]  }t        |t        t                    st	        d      |j                  dk7  rt	        d      	 t        |j                  j                        }|j                  t        |j                   |j                  j"                  |              |S # t        t        t        f$ r i }Y Ww xY w)	r0  ro   rQ   z)Expected at least one tool call, but got z tool calls.zInvalid tool_call objectr2  z(Invalid tool type. Unsupported by OpenAI)tool_id	tool_nametool_kwargs)rp   rq   rr   rs   r   r   r   r5   r1  r/   r2  	arguments	TypeErrorr   r6  r-   idname)rX   rm   r=  rM   ro   tool_selections	tool_callargument_dicts           rZ   get_tool_calls_from_responsez#OpenAI.get_tool_calls_from_response  s    %%77;;L"M
z?Q$ ?J?PP\]  	# 	Ii.)AB !;<<~~+ !KLL# 293E3E3O3O P ""%LL'0055 -	(  	?; # "#s   C55DD
output_cls
llm_kwargsprompt_argsc                 R    |xs i }d|vrdn|d   |d<   t        |   ||fd|i|S )Structured predict.r.  requiredrK  )r   structured_predictrX   rJ  r   rK  rL  r   s        rZ   rP  zOpenAI.structured_predict  sU      %2
 (z9Jz-?X 	=!
 w)
+5
9D
 	
r\   c                 n   K   |xs i }d|vrdn|d   |d<   t        |   ||fd|i| d{   S 7 w)rN  r.  rO  rK  N)r   astructured_predictrQ  s        rZ   rS  zOpenAI.astructured_predict  sc       %2
 (z9Jz-?X 	=!
 W0
+5
9D
 
 	
 
   +535c                 R    |xs i }d|vrdn|d   |d<   t        |   ||fd|i|S )Stream structured predict.r.  rO  rK  )r   stream_structured_predictrQ  s        rZ   rW  z OpenAI.stream_structured_predict	  sU      %2
 (z9Jz-?X 	=!
 w0
+5
9D
 	
r\   c                 n   K   |xs i }d|vrdn|d   |d<   t        |   ||fd|i| d{   S 7 w)rV  r.  rO  rK  N)r   astream_structured_predictrQ  s        rZ   rY  z!OpenAI.astream_structured_predict  sc       %2
 (z9Jz-?X 	=!
 W7
+5
9D
 
 	
 
rT  )F)NNFFautoN)Trd   )org   rh   ri   rj   r&   DEFAULT_OPENAI_MODELrx   rk   __annotations__r)   r{   floatr}   r   rl   r~   boolr   r  rq   r	   r   rO   r   r   r   r   r   r   r   r   r   r   r   r   r'   r   r   r   rA   r   httpxClientr   AsyncClientr3   DEFAULTr(   r   r   r   r2   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   r  r  r"   r   r  r  r  r  r   r:  r<  r-   rI  
dispatcherspanr   r.   r0   rP  rS  r
   r1   rW  r   rY  __classcell__)r   s   @rZ   rD   rD      sV   &P $2LE3  #?	K  !&?!J   %; Hhtn  B	L#  ).*Q)tCH~  8K 
 @GU 
 16"I1OXd38n-  WL$  3HIGSI&DEHcE)JKKKRFD  DI=Dhw'>?@  ',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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 ; -;9<;	; ;z 
 
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 F -F9<F	F FP 
s 
c 
>P 
 
@ %(	# @ 7;48*/(.!%'

#'
 5k!123'
 tK01	'

 '
 $('
 39%'
 '
 '
 
c3h'
Z +0	

 
#
 $(	

 
 

 '+& &  $& 	&
 
m	&P __
 04	
K
 
 T#s(^,	

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

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

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

 
 
e]23T9	:
 
r\   rD   )gr]   json.decoderr   typingr   r   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%    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.utilsr/   llama_index.core.promptsr0   llama_index.core.program.utilsr1   llama_index.core.typesr2   r3   llama_index.llms.openai.utilsr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   openairA   rB   rC   rD   r   'openai.types.chat.chat_completion_chunkrE   rF   rG   get_dispatcherrg   re  llama_index.core.tools.typesrH   r[  r_   ra   rt   re   r\   rZ   <module>r     s'    (    (   5 5	 	 	
 
 
 7 F : : 3 8 H    > = '  'Z&&x0
5& 8CH- (382D &   K\ Kd Km
 m
r\   