o
    !gN                     @   s  d Z ddlZddlZ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mZmZ ddlmZ ddlm  m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# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ dd	l,m-Z-m.Z. dd
l/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z> e?e@ZAdZBerddlCmDZD ejddG dd de0ZEdS )zGoogle's hosted Gemini API.    N)TYPE_CHECKINGAnyAsyncGeneratorDict	GeneratorListOptionalSequenceTypeUnioncast)generation_types)	ChatMessageChatResponseChatResponseAsyncGenChatResponseGenCompletionResponseCompletionResponseAsyncGenCompletionResponseGenLLMMetadataMessageRole)FieldPrivateAttr)CallbackManager)DEFAULT_NUM_OUTPUTSDEFAULT_TEMPERATURE)llm_chat_callbackllm_completion_callback)FunctionCallingLLM)ToolSelectionModel)PromptTemplate)FlexibleModel)$merge_neighboring_same_role_messages   )chat_from_gemini_responsechat_message_to_geminicompletion_from_gemini_responseis_function_calling_model)	zmodels/gemini-2.0-flashz models/gemini-2.0-flash-thinkingz*models/gemini-2.0-flash-thinking-exp-01-21zmodels/gemini-2.0-flash-litez*models/gemini-2.0-flash-lite-preview-02-05zmodels/gemini-2.0-pro-exp-02-05zmodels/gemini-1.5-flashzmodels/gemini-1.5-flash-8bzmodels/gemini-1.0-pro)BaseToolzShould use `llama-index-llms-google-genai` instead, using Google's latest unified SDK. See: https://docs.llamaindex.ai/en/stable/examples/llm/google_genai/)reasonc                       s  e Zd ZU dZeed ddZeed< ee	dddd	Z
eed
< eedddZeed< eeddZeed< e Zejed< e Zejjed< e Zeejj ed< ded e	dddddddddfdee ded
edee deejj deejj dee dee dee dee deeeef  deejj def fddZ e!d efd!d"Z"e#d e$fd#d$Z%e& 	%dUd&ed'e'd(ed e(fd)d*Z)e& 	%dUd&ed'e'd(ed e(fd+d,Z*e& 	%dUd&ed'e'd(ed e+fd-d.Z,e& 	%dUd&ed'e'd(ed e-fd/d0Z.e/ d1e0e1 d(ed e2fd2d3Z3e/ d1e0e1 d(ed e2fd4d5Z4e/ d1e0e1 d(ed e5fd6d7Z6e/ d1e0e1 d(ed e7fd8d9Z8			%	%	:	dVd;e0d< d=ee9ee1f  d>ee:e1  d?e'd@e'dAe9eef dBee' d(ed eeef fdCdDZ;	EdWdFe2dGe'd(ed e:e< fdHdIZ=e>j?	dXdJe@e d&eAdKeeeef  dLed ef
 fdMdNZBe>j?	dXdJe@e d&eAdKeeeef  dLed ef
 fdOdPZCe>j?	dXdJe@e d&eAdKeeeef  dLed eDe9eeEf ddf f
 fdQdRZFe>j?	dXdJe@e d&eAdKeeeef  dLed eGe9eeEf df f
 fdSdTZH  ZIS )YGeminiaF  
    Gemini LLM.

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

        ```python
        from llama_index.llms.gemini import Gemini

        llm = Gemini(model="models/gemini-ultra", api_key="YOUR_API_KEY")
        resp = llm.complete("Write a poem about a magic backpack")
        print(resp)
        ```
    r   zThe Gemini model to use.)defaultdescriptionmodelz)The temperature to use during generation.g        g       @)r,   r-   geletemperaturez!The number of tokens to generate.)r,   r-   gt
max_tokenszKwargs for generation.)default_factoryr-   generate_kwargs_model_model_meta_request_optionsNapi_keygeneration_configsafety_settingscallback_managerapi_base	transport
model_namedefault_headersrequest_optionsc                    s2  |
durt dt |
}d|ptdi}|rd|i|d< |	r#|	|d< |r;g }| D ]\}}|||f q+||d< tjdi | |rG|ni }t	t
jd	|i|}t|}tj|||d
}|j}d|vrrtd| d| d|sx|j}nt||j}t j|||||d || _|| _|| _t|| _dS )z%Creates a new Gemini model interface.Nz2model_name is deprecated, please use model insteadr9   GOOGLE_API_KEYapi_endpointclient_optionsr>   default_metadatar1   )r?   r:   r;   generateContentzModel z+ does not support content generation, only .)r.   r1   r3   r5   r<    )warningswarnDeprecationWarningosgetenvitemsappendgenai	configurer   r   GenerationConfigDict	get_modelGenerativeModelsupported_generation_methods
ValueErroroutput_token_limitminsuper__init__r7   r6   r8   r(   _is_function_call_model)selfr9   r.   r1   r3   r:   r;   r<   r=   r>   r?   r@   rA   r5   config_paramsrE   keyvaluebase_gen_configfinal_gen_config
model_metagenai_modelsupported_methods	__class__rH   ^/mnt/skqttb/ctump_chatbot/chatbot/lib/python3.10/site-packages/llama_index/llms/gemini/base.pyrZ   p   sd   

zGemini.__init__returnc                 C   s   dS )N
Gemini_LLMrH   )clsrH   rH   rg   
class_name   s   zGemini.class_namec                 C   s&   | j j| j }t|| j| jd| jdS )NT)context_window
num_outputr?   is_chat_modelr(   )r7   input_token_limitr3   r   r.   r[   )r\   total_tokensrH   rH   rg   metadata   s   zGemini.metadataFprompt	formattedkwargsc                 K   s2   | j p|dd }| jj|fd|i|}t|S NrA   )r8   popr6   generate_contentr'   r\   rr   rs   rt   rA   resultrH   rH   rg   complete   s   zGemini.completec                    s:   | j p	|dd }| jj|fd|i|I d H }t|S ru   )r8   rv   r6   generate_content_asyncr'   rx   rH   rH   rg   	acomplete   s   zGemini.acompletec                    *   j p dd  fdd}| S )NrA   c                  3   sP    d} j jfdd }|D ]}|jpd}| |7 } t|| |dV  qd S N TstreamrA   )textdelta)r6   rw   r   r'   r   itrr   rt   rr   rA   r\   rH   rg   gen   s   
z#Gemini.stream_complete.<locals>.genr8   rv   r\   rr   rs   rt   r   rH   r   rg   stream_complete      
zGemini.stream_completec                    r}   )NrA   c                    s`   d} j jfdd I d H }|2 z3 d H W }|jpd}| |7 } t|| |dV  q6 d S r~   )r6   r{   r   r'   r   r   rH   rg   r      s   
z$Gemini.astream_complete.<locals>.genr   r   rH   r   rg   astream_complete   r   zGemini.astream_completemessagesc           	      K   sV   | j p|dd }t|}tt|^ }}| jj|d}|j|fd|i|}t|S NrA   history)	r8   rv   r#   mapr&   r6   
start_chatsend_messager%   	r\   r   rt   rA   merged_messagesr   next_msgchatresponserH   rH   rg   r     s   zGemini.chatc           	         s^   | j p	|dd }t|}tt|^ }}| jj|d}|j|fd|i|I d H }t|S r   )	r8   rv   r#   r   r&   r6   r   send_message_asyncr%   r   rH   rH   rg   achat  s   zGemini.achatc           	         sh   | j p|dd }t|}tt|^ }}| jj|d}|j|fd|d| dtf fdd}| S )NrA   r   Tr   rh   c                  3   sv    d} g } D ]1}|j d }|jjd j}| |7 } t|}||jjdg  ||_	| |j_||jjd< |V  qd S Nr   r   
tool_calls

candidatescontentpartsr   r%   extendmessageadditional_kwargsgetr   r   existing_tool_callsr   top_candidatecontent_delta
llama_respr   rH   rg   r   2  s    
zGemini.stream_chat.<locals>.gen)	r8   rv   r#   r   r&   r6   r   r   r   	r\   r   rt   rA   r   r   r   r   r   rH   r   rg   stream_chat&  s   zGemini.stream_chatc           	         sp   | j p	|dd }t|}tt|^ }}| jj|d}|j|fd|d|I d H  dtf fdd}| S )NrA   r   Tr   rh   c                    s   d} g } 2 z53 d H W }|j d }|jjd j}| |7 } t|}||jjdg  ||_	| |j_||jjd< |V  q6 d S r   r   r   r   rH   rg   r   P  s    
z Gemini.astream_chat.<locals>.gen)	r8   rv   r#   r   r&   r6   r   r   r   r   rH   r   rg   astream_chatD  s   zGemini.astream_chatautotoolsr)   user_msgchat_historyverboseallow_parallel_tool_callstool_choicestrictc                 K   sP  ddl m}	m}
 ddlm} |dkr|j}n|dkr|j}n|j}dd|ii}|dvrMt|t	r4t
d	d
d |D }||vrF||d d< n|g|d d< g }|D ]0}i }|j d  D ]\}}|dd}|rn|||< q^|jj|jj_||	|jj| qQt|trttj|d}|pg }|r|| ||r|
|dnd|d|S )Predict and call the tool.r   )FunctionDeclarationToolDict)FunctionCallingModer   nonefunction_calling_configmode)r   r   z-Gemini does not support tool_choice as a dictc                 S   s   g | ]}|j jqS rH   )rq   name).0toolrH   rH   rg   
<listcomp>  s    z3Gemini._prepare_chat_with_tools.<locals>.<listcomp>allowed_function_names
propertiesr-   N)roler   )function_declarations)r   r   tool_config)google.generativeai.typesr   r   'google.generativeai.types.content_typesr   AUTONONEANY
isinstancedictrV   rq   get_parameters_dictrN   r   r-   	fn_schema__doc__rO   from_functionstrr   r   USER)r\   r   r   r   r   r   r   r   rt   r   r   r   	tool_moder   
tool_namestool_declarationsr   descriptions
param_nameparam_schemaparam_descriptionr   rH   rH   rg   _prepare_chat_with_toolsb  sf   



zGemini._prepare_chat_with_toolsTr   error_on_no_tool_callc                 K   s   |j jdg }t|dk r|rtdt| dg S g }|D ]}t|tjjs-td|	t
tt |jt|jd q |S )r   r   r$   z)Expected at least one tool call, but got z tool calls.zInvalid tool_call object)tool_id	tool_nametool_kwargs)r   r   r   lenrV   r   rP   protosFunctionCallrO   r   r   uuiduuid4r   r   args)r\   r   r   rt   r   tool_selections	tool_callrH   rH   rg   get_tool_calls_from_response  s&   
z#Gemini.get_tool_calls_from_response
output_cls
llm_kwargsprompt_argsc                    @   |pi }| j rd|vrdn|d |d< t j||fd|i|S )Structured predict.r   requiredr   )r[   rY   structured_predictr\   r   rr   r   r   re   rH   rg   r        	zGemini.structured_predictc                    H   |pi }| j rd|vrdn|d |d< t j||fd|i|I dH S )r   r   r   r   N)r[   rY   astructured_predictr   re   rH   rg   r        	zGemini.astructured_predictc                    r   )Stream structured predict.r   r   r   )r[   rY   stream_structured_predictr   re   rH   rg   r     r   z Gemini.stream_structured_predictc                    r   )r   r   r   r   N)r[   rY   astream_structured_predictr   re   rH   rg   r     r   z!Gemini.astream_structured_predict)F)NNFFr   N)T)N)J__name__
__module____qualname__r   r   GEMINI_MODELSr.   r   __annotations__r   r1   floatr   r3   intr   r5   r   r6   rP   rT   r7   typesr    r8   r   RequestOptionsrR   SafetySettingDictr   r   r   rZ   classmethodrk   propertyr   rq   r   boolr   rz   r|   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   
dispatcherspanr
   r!   r   r   r   r"   r   r   r   __classcell__rH   rH   re   rg   r+   F   s  
 

	

T		 

	


Q
 r+   )Fr   
deprecatedrL   r   rI   typingr   r   r   r   r   r   r   r	   r
   r   r   google.generativeaigenerativeairP    llama_index.core.instrumentationcoreinstrumentation
instrumentr   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   r   llama_index.core.llms.callbacksr   r   &llama_index.core.llms.function_callingr   llama_index.core.llms.llmr   r    llama_index.core.promptsr!   llama_index.core.program.utilsr"   'llama_index.core.utilities.gemini_utilsr#   utilsr%   r&   r'   r(   get_dispatcherr   r  r   llama_index.core.tools.typesr)   r+   rH   rH   rH   rg   <module>   s8    4,
