§
    é˜ºhë%  ã                  óü   — 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
Zd dl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mZ d dlmZmZmZmZ d d	l m!Z! d
ddœd&d„Z"	 	 	 d'd(d„Z#d)d"„Z$d*d$„Z% G d%„ dee¦  «        Z&dS )+é    )Úannotations)ÚAnyÚCallableÚDictÚIteratorÚListÚOptionalÚUnionN)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚLanguageModelInput)ÚBaseLLMÚcreate_base_retry_decorator)Ú
GenerationÚGenerationChunkÚ	LLMResult)Ú	BaseModelÚFieldÚ	SecretStrÚroot_validator)Úget_from_dict_or_envé   ©Úmax_retriesÚrun_managerÚllmr   r   Úintr   úHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]ÚreturnúCallable[[Any], Any]c               ó   — t           j        j        j        t           j        j        j        t           j        j        j        t           j        j        j        t           j        j        j        g}t          |||¬¦  «        }|S )z1Creates a retry decorator for Vertex / Palm LLMs.)Úerror_typesr   r   )	ÚgoogleÚapi_coreÚ
exceptionsÚResourceExhaustedÚServiceUnavailableÚAbortedÚDeadlineExceededÚGoogleAPIErrorr   )r   r   r   ÚerrorsÚ	decorators        úc/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_google_genai/llms.pyÚ_create_retry_decoratorr.      sg   € õ 	ŒÔ"Ô4ÝŒÔ"Ô5ÝŒÔ"Ô*ÝŒÔ"Ô3ÝŒÔ"Ô1ð€Fõ ,Ø¨Àðñ ô €Ið Ðó    FÚGoogleGenerativeAIÚpromptr   Ú	is_geminiÚboolÚstreamú"Optional[CallbackManagerForLLMRun]Úkwargsr   c                óf   ‡ — t          ‰ ‰ j        |¬¦  «        }|dˆ fd
„¦   «         } |d|||dœ|¤ŽS )z*Use tenacity to retry the completion call.r   r1   r   r2   r3   r4   r6   r   r   c                ó–   •— |                      di ¦  «        }|r‰j                             | ||¬¦  «        S  ‰j        j        dd| i|¤ŽS )NÚgeneration_config)Úcontentsr4   r9   r1   © )ÚgetÚclientÚgenerate_contentÚgenerate_text)r1   r2   r4   r6   r9   r   s        €r-   Ú_completion_with_retryz6_completion_with_retry.<locals>._completion_with_retry6   sk   ø€ ð #ŸJšJÐ':¸BÑ?Ô?ÐØð 	Ø”:×.Ò.Ø¨ÐBSð /ñ ô ð ð (ˆsŒzÔ'Ð@Ð@¨vÐ@¸Ð@Ð@Ð@r/   )r1   r2   r4   )
r1   r   r2   r3   r4   r3   r6   r   r   r   r;   )r.   r   )r   r1   r2   r4   r   r6   Úretry_decoratorr@   s   `       r-   r@   r@   )   s‚   ø€ õ .Ø˜œ°kðñ ô €Oð ðAð Að Að Að Añ „_ðAð "Ð!ð Ø °6ðð Ø=Cðð ð r/   Ú
model_nameÚstrc                ó
   — d| v S )NÚgeminir;   ©rB   s    r-   Ú_is_gemini_modelrG   F   s   € Ø�zÐ!Ð!r/   Útextc                óž   — t          d„ |                      d¦  «        dd…         D ¦   «         ¦  «        }|r|                      dd¦  «        S | S )z°Strip erroneous leading spaces from text.

    The PaLM API will sometimes erroneously return a single leading space in all
    lines > 1. This function strips that space.
    c              3  ó4   K  — | ]}| p|d          dk    V — ŒdS )r   ú Nr;   )Ú.0Úlines     r-   ú	<genexpr>z2_strip_erroneous_leading_spaces.<locals>.<genexpr>P   s1   è è € ÐXÐX¸4 ˜HÐ6¨¨Q¬°3ªÐXÐXÐXÐXÐXÐXr/   ú
r   Nz
 )ÚallÚsplitÚreplace)rH   Úhas_leading_spaces     r-   Ú_strip_erroneous_leading_spacesrT   J   sZ   € õ ÐXÐXÀ4Ç:Â:ÈdÑCSÔCSÐTUÐTVÐTVÔCWÐXÑXÔXÑXÔXÐØð Ø�|Š|˜E 4Ñ(Ô(Ð(àˆr/   c                  óŽ  — e Zd ZU dZded<    edd¬¦  «        Zded<   	 d	Zd
ed<   dZded<   	 d	Z	ded<   	 d	Z
ded<   	 d	Zded<   	 dZded<   	 dZded<   	  ed	d¬¦  «        Zded<    ed	d¬¦  «        Zded<   ed6d!„¦   «         Zed7d#„¦   «         Z e¦   «         d8d&„¦   «         Z	 	 d9d:d/„Z	 	 d9d;d2„Zed<d3„¦   «         Zd=d5„Zd	S )>r0   zÉGoogle GenerativeAI models.

    Example:
        .. code-block:: python

            from langchain_google_genai import GoogleGenerativeAI
            llm = GoogleGenerativeAI(model="gemini-pro")
    r   r=   .z^The name of the model to use.
Supported examples:
    - gemini-pro
    - models/text-bison-001)ÚdescriptionrC   ÚmodelNzOptional[SecretStr]Úgoogle_api_keygffffffæ?ÚfloatÚtemperaturezOptional[float]Útop_pzOptional[int]Útop_kÚmax_output_tokensr   r   Úné   r   zXA dictionary of client options to pass to the Google API client, such as `api_endpoint`.zOptional[Dict]Úclient_optionsz3A string, one of: [`rest`, `grpc`, `grpc_asyncio`].zOptional[str]Ú	transportr   r3   c                ó*   — t          | j        ¦  «        S )z=Returns whether a model is belongs to a Gemini family or not.)rG   rW   ©Úselfs    r-   r2   zGoogleGenerativeAI.is_geminiˆ   s   € õ   ¤
Ñ+Ô+Ð+r/   úDict[str, str]c                ó
   — ddiS )NrX   ÚGOOGLE_API_KEYr;   rc   s    r-   Ú
lc_secretszGoogleGenerativeAI.lc_secrets�   s   € à Ð"2Ð3Ð3r/   Úvaluesr   c                ó¤  — t          |dd¦  «        }|d         }t          |t          ¦  «        r|                     ¦   «         }t	          j        ||                     d¦  «        |                     d¦  «        ¬¦  «         t          |¦  «        rt	          j        |¬¦  «        |d<   n
t          |d<   |d	         �$d|d	         cxk    rdk    sn t          d¦  «        ‚|d         �$d|d         cxk    rdk    sn t          d¦  «        ‚|d         �|d         dk    rt          d¦  «        ‚|d         �|d         dk    rt          d¦  «        ‚|S )z@Validates params and passes them to google-generativeai package.rX   rg   rW   ra   r`   )Úapi_keyra   r`   rF   r=   rZ   Nr   r   z+temperature must be in the range [0.0, 1.0]r[   z%top_p must be in the range [0.0, 1.0]r\   ztop_k must be positiver]   z+max_output_tokens must be greater than zero)
r   Ú
isinstancer   Úget_secret_valueÚgenaiÚ	configurer<   rG   ÚGenerativeModelÚ
ValueError)Úclsri   rX   rB   s       r-   Úvalidate_environmentz'GoogleGenerativeAI.validate_environment‘   s�  € õ .ØÐ$Ð&6ñ
ô 
ˆð ˜G”_ˆ
å�n¥iÑ0Ô0ð 	?Ø+×<Ò<Ñ>Ô>ˆNåŒØ"Ø—j’j Ñ-Ô-Ø!Ÿ:š:Ð&6Ñ7Ô7ð	
ñ 	
ô 	
ð 	
õ ˜JÑ'Ô'ð 	%Ý$Ô4À
ÐKÑKÔKˆF�8ÑÐå$ˆF�8Ñà�-Ô Ð,°Q¸&ÀÔ:OÐ5TÐ5TÒ5TÐ5TÐSTÒ5TÐ5TÐ5TÐ5TÝÐJÑKÔKÐKà�'Œ?Ð&¨q°F¸7´OÐ/HÐ/HÒ/HÐ/HÀqÒ/HÐ/HÐ/HÐ/HÝÐDÑEÔEÐEà�'Œ?Ð&¨6°'¬?¸aÒ+?Ð+?ÝÐ5Ñ6Ô6Ð6àÐ%Ô&Ð2°vÐ>QÔ7RÐVWÒ7WÐ7WÝÐJÑKÔKÐKàˆr/   Úpromptsú	List[str]ÚstopúOptional[List[str]]r   r5   r6   r   c           
     óô  — g }|| j         | j        | j        | j        | j        dœ}|D ]Â}| j        rFt          | |dd||¬¦  «        }d„ |j        D ¦   «         }	|                     d„ |	D ¦   «         ¦  «         ŒOt          | f| j	        |dd|dœ|¤Ž}g }
|j        D ]<}|d         }t          |¦  «        }|
                     t          |¬	¦  «        ¦  «         Œ=|                     |
¦  «         ŒÃt          |¬
¦  «        S )N)Ústop_sequencesrZ   r[   r\   r]   Úcandidate_countFT)r1   r4   r2   r   r9   c                ó`   — g | ]+}d                       d„ |j        j        D ¦   «         ¦  «        ‘Œ,S )Ú c                ó   — g | ]	}|j         ‘Œ
S r;   ©rH   )rL   Úps     r-   ú
<listcomp>z;GoogleGenerativeAI._generate.<locals>.<listcomp>.<listcomp>Ð   s   € Ð=Ð=Ð=¨˜QœVÐ=Ð=Ð=r/   )ÚjoinÚcontentÚparts©rL   Úcs     r-   r€   z0GoogleGenerativeAI._generate.<locals>.<listcomp>Ï   sD   € ð ð ð ØCD�B—G’GÐ=Ð=¨Q¬Y¬_Ð=Ñ=Ô=Ñ>Ô>ðð ð r/   c                ó.   — g | ]}t          |¬ ¦  «        ‘ŒS )r~   )r   r„   s     r-   r€   z0GoogleGenerativeAI._generate.<locals>.<listcomp>Ò   s#   € Ð#KÐ#KÐ#K¸1¥J°AÐ$6Ñ$6Ô$6Ð#KÐ#KÐ#Kr/   )rW   r1   r4   r2   r   Úoutputr~   )Úgenerations)rZ   r[   r\   r]   r^   r2   r@   Ú
candidatesÚappendrW   rT   r   r   )rd   rt   rv   r   r6   rˆ   r9   r1   Úresr‰   Úprompt_generationsÚ	candidateÚraw_textÚstripped_texts                 r-   Ú	_generatezGoogleGenerativeAI._generateµ   sq  € ð /1ˆà"ØÔ+Ø”ZØ”ZØ!%Ô!7Ø#œvð
ð 
Ðð ð 	7ð 	7ˆFØŒ~ð 7Ý,ØØ!Ø Ø"Ø +Ø&7ðñ ô �ðð ØHKÌðñ ô �
ð ×"Ò"Ð#KÐ#KÀ
Ð#KÑ#KÔ#KÑLÔLÐLÐLå,Øðàœ*Ø!Ø Ø#Ø +ðð ð (ðð �ð &(Ð"Ø!$¤ð Nð N�IØ(¨Ô2�HÝ$CÀHÑ$MÔ$M�MØ&×-Ò-­j¸mÐ.LÑ.LÔ.LÑMÔMÐMÐMØ×"Ò"Ð#5Ñ6Ô6Ð6Ð6å [Ð1Ñ1Ô1Ð1r/   r1   úIterator[GenerationChunk]c              +  óê   K  — |                      di ¦  «        }|r||d<   t          | |fdd||dœ|¤ŽD ]?}t          |j        ¬¦  «        }|V — |r"|                     |j        || j        ¬¦  «         Œ@d S )Nr9   ry   T)r4   r2   r   r9   r~   )ÚchunkÚverbose)r<   r@   r   rH   Úon_llm_new_tokenr”   )rd   r1   rv   r   r6   r9   Ústream_respr“   s           r-   Ú_streamzGoogleGenerativeAI._streamæ   sÎ   è è € ð #ŸJšJÐ':¸BÑ?Ô?ÐØð 	7Ø26ÐÐ.Ñ/Ý1ØØð
ð ØØ#Ø/ð
ð 
ð ð
ð 
ð 	ð 	ˆKõ $¨Ô)9Ð:Ñ:Ô:ˆEØˆKˆKˆKØð Ø×,Ò,ØÔ$ØØ œLð -ñ ô ð øð	ð 	r/   c                ó   — dS )zReturn type of llm.Úgoogle_palmr;   rc   s    r-   Ú	_llm_typezGoogleGenerativeAI._llm_type  s	   € ð ˆ}r/   rH   c                ó€   — | j         rt          d¦  «        ‚| j                             | j        |¬¦  «        }|d         S )a  Get the number of tokens present in the text.

        Useful for checking if an input will fit in a model's context window.

        Args:
            text: The string input to tokenize.

        Returns:
            The integer number of tokens in the text.
        z%Counting tokens is not yet supported!)rW   r1   Útoken_count)r2   rq   r=   Úcount_text_tokensrW   )rd   rH   Úresults      r-   Úget_num_tokensz!GoogleGenerativeAI.get_num_tokens  sE   € ð Œ>ð 	FÝÐDÑEÔEÐEØ”×.Ò.°T´ZÈÐ.ÑMÔMˆØ�mÔ$Ð$r/   )r   r3   )r   re   )ri   r   r   r   )NN)
rt   ru   rv   rw   r   r5   r6   r   r   r   )
r1   rC   rv   rw   r   r5   r6   r   r   r‘   )r   rC   )rH   rC   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   rW   rX   rZ   r[   r\   r]   r^   r   r`   ra   Úpropertyr2   rh   r   rs   r�   r—   rš   rŸ   r;   r/   r-   r0   r0   W   s9  € € € € € € ðð ð €K€K�KØ�Øððñ ô €Eð ð ð ñ ð Ø*.€NÐ.Ð.Ð.Ñ.Ø€KÐÐÐÑðà!€EÐ!Ð!Ð!Ñ!ðXà€EÐÐÐÑðà'+ÐÐ+Ð+Ð+Ñ+ð(à€A€J€J€J�JðIà€KÐÐÐÑØ@Ø%* UØð&ð&ñ &ô &€Nð ð ð ñ ð  %˜uØØIð ñ  ô  €Ið ð ð ñ ð
 ð,ð ,ð ,ñ „Xð,ð ð4ð 4ð 4ñ „Xð4ð €^ÑÔð!ð !ð !ñ Ôð!ðL %)Ø:>ð	/2ð /2ð /2ð /2ð /2ðh %)Ø:>ð	ð ð ð ð ð8 ðð ð ñ „Xðð%ð %ð %ð %ð %ð %r/   )r   r   r   r   r   r   r   r    )FFN)r   r0   r1   r   r2   r3   r4   r3   r   r5   r6   r   r   r   )rB   rC   r   r3   )rH   rC   r   rC   )'Ú
__future__r   Útypingr   r   r   r   r   r	   r
   Úgoogle.api_corer#   Úgoogle.generativeaiÚgenerativeairn   Úlangchain_core.callbacksr   r   Úlangchain_core.language_modelsr   Ú#langchain_core.language_models.llmsr   r   Úlangchain_core.outputsr   r   r   Úlangchain_core.pydantic_v1r   r   r   r   Úlangchain_core.utilsr   r.   r@   rG   rT   r0   r;   r/   r-   ú<module>r±      sÇ  ðØ "Ð "Ð "Ð "Ð "Ð "à GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ Gà Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ 5Ð 5Ð 5Ð 5Ð 5Ð 5ð ð 	ðð ð ð ð ð ð4 ØØ6:ðð ð ð ð ð:"ð "ð "ð "ð
ð 
ð 
ð 
ð~%ð ~%ð ~%ð ~%ð ~%˜ )ñ ~%ô ~%ð ~%ð ~%ð ~%r/   