
    +#h                         d dl Z d dlmZ d dlmZmZ d dlZd dlmZ 	 d dl	m
Z d dlmZ eZd Zd Zdd	d
dd	d
dd	d
dd	d
gZ G d de      Zy# e$ r eZY -w xY w)    N)Iterable)AnyOptional)LM)GoogleAPICallErrorc                 :    t         dj                  di |        y)z.Handler from https://pypi.org/project/backoff/zbBacking off {wait:0.1f} seconds after {tries} tries calling function {target} with kwargs {kwargs}N )printformatdetailss    O/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dsp/modules/google.pybackoff_hdlrr      s&    		 	6	%#	%    c                 "    d| j                   v ryy)z6wrapper function that decides when to give up on retryzrate limitsFT)messager   s    r   giveup_hdlrr      s    'r   HARM_CATEGORY_HARASSMENTBLOCK_ONLY_HIGH)category	thresholdHARM_CATEGORY_HATE_SPEECHHARM_CATEGORY_SEXUALLY_EXPLICITHARM_CATEGORY_DANGEROUS_CONTENTc                        e Zd ZdZddefdedee   dee   f fdZdefd	Z	 e
j                  e
j                  ed
dee      defd       Z	 	 ddededefdZ xZS )Googlez[Wrapper around Google's API.

    Currently supported models include `gemini-pro-1.0`.
    zmodels/gemini-1.0-proNmodelapi_keysafety_settingsc                    t         |   |       |t        j                  j	                  d      n|}t        j                  |       |j                  d|j                  dd            }d| _        dd|vrd	n|d   d
ddd|}t        j                  di || _
        t        j                  || j                  |      | _        d|i|| _        g | _        y)a  
        Parameters
        ----------
        model : str
            Which pre-trained model from Google to use?
            Choices are [`gemini-pro-1.0`]
        api_key : str
            The API key for Google.
            It can be obtained from https://cloud.google.com/generative-ai-studio
        **kwargs: dict
            Additional arguments to pass to the API provider.
        NGOOGLE_API_KEY)r   nnum_generations   googletemperature        i   )candidate_countr&   max_output_tokenstop_ptop_k)
model_namegeneration_configr   r	   )super__init__osenvirongetgenai	configurepopproviderGenerationConfigconfigGenerativeModelllmkwargshistory)selfr   r   r   r;   r#   	__class__s         r   r/   zGoogle.__init__<   s    & 	6=o"**..!127( !**S&**5F*JK  "/v"=36-CX!%
 
 ,,6v6((E;?;;9HJ
 


 .0r   promptc                     |}i | j                   |}|j                  dd       }||dkD  r|d   dk(  rd|d<   | j                  j                  ||      }||g||d}| j                  j                  |       |S )Nr"   r$   r&   r'   gffffff?)r-   )r?   responser;   
raw_kwargs)r;   r5   r:   generate_contentr<   append)r=   r?   r;   rB   r"   rA   r<   s          r   basic_requestzGoogle.basic_requestm   s    

kk

 JJsD!=QUvm'<'C$'F=!88,,Vv,N !
$	
 	G$r   i     )max_time	max_tries
on_backoffgiveupc                 (     | j                   |fi |S )zGHandles retrieval of completions from Google whilst handling API errors)rE   )r=   r?   r;   s      r   requestzGoogle.request   s     "t!!&3F33r   only_completedreturn_sortedc                     |sJ d       |du sJ d       |j                  dd      }g }t        |      D ]=  } | j                  |fi |}|j                  |j                  d   j
                         ? |S )Nzfor nowFr"   r$   r   )r5   rangerL   rD   partstext)	r=   r?   rM   rN   r;   r"   completionsirA   s	            r   __call__zGoogle.__call__   s     (y(~%0y0%JJsAq 	7A#t||F5f5Hx~~a0556	7 r   )TF)__name__
__module____qualname____doc__r   strr   r   r/   rE   backoffon_exceptionexpogoogle_api_errorr   r   rL   boolrU   __classcell__)r>   s   @r   r   r   6   s     -!%.=	/0/0 #/0 "(+	/0bC 0 W	4c 44  $#	  	r   r   )r0   collections.abcr   typingr   r   r[   dsp.modules.lmr   google.generativeaigenerativeair3   google.api_core.exceptionsr   r^   ImportError	Exceptionr   r   r   r   r	   r   r   <module>ri      s    	 $    !'=) +"
 ,"
 2"
 2"(lR lS  ! !s   A AA