
    :j                         d Z ddlZddlZddlZddlmZ  ed      Zddlm	Z	m
Z
mZ ddlm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 ddlmZ  G d de      Z ede       y)z(
Google Gemini provider implementation.
    N)
get_loggerprovider)DictListOptional)DEFAULT_QUESTION)ErrorReason)CheckResult	Condition)trim   )chathttp_get   )AIBaseProvider)register_providerc                        e Zd ZdZdee   f fdZddedee	   dee	   fdZ
ded	edef fd
Zddededededef
dZddedededee   fdZ xZS )GeminiProviderz&Google Gemini provider implementation.
conditionsc           	      ~    | j                  |dddddd      }t        |   |d   |d   |d   |d	   |d
   |fi | y )Ngeminiz)https://generativelanguage.googleapis.comz/v1beta/modelszgemini-2.5-pro)namebase_urlcompletion_path
model_pathdefault_modelr   r   r   r   r   )extractsuper__init__)selfr   kwargsconfig	__class__s       =/root/.openclaw/workspace/harvester/search/provider/gemini.pyr   zGeminiProvider.__init__   sl     G#3.!1	
 	6N:$%< ?#	
 	
    token
additionalreturnc                 0    ddd}| j                  ||      S )z$Get headers for Gemini API requests.zapplication/json)acceptzcontent-type)_merge_headers)r    r&   r'   headerss       r$   _get_headerszGeminiProvider._get_headers4   s     /AST""7J77r%   codemessagec                    |dk(  rt        j                         S t        |      }|dk(  rt        j                  d|t        j
                        r#t        j                  t        j                        S t        j                  d|t        j
                        rt        j                  t        j                        S |dk(  rIt        j                  d|t        j
                        rqt        j                  t        j                        S |dk(  rIt        j                  d	|t        j
                        r#t        j                  t        j                        S t        | 1  ||      S )
zJudge Gemini API response.   i  zAPI_KEY_INVALID|API key expired)flagsFAILED_PRECONDITIONi  z5PERMISSION_DENIED|Your API key was reported as leakedi  z2RESOURCE_EXHAUSTED|Quota exceeded for quota metric)r
   successr   refindallIfailr	   INVALID_KEY	NO_ACCESSNO_QUOTAr   _judge)r    r.   r/   r#   s      r$   r<   zGeminiProvider._judge9   s    3;&&((w-3;zz<gRTTR"''(?(?@@2G244H"''(=(=>>S[zzRT[cecgcgh"''(?(?@@S[zzOQX`b`d`de"''(<(<==w~dG,,r%   addressendpointmodelc           	         t        |      }|s#t        j                  t        j                        S t        |      xs | j
                  }t        j                  j                  | j                  | j                         d| d| }dddt        igdgi}t        || j                  |      || j                  d	      | j                  d
	            \  }}| j!                  ||      S )zCheck Gemini token validity./z:generateContent?key=contentsusertext)rolepartsr&   r   )default
   )urlr,   paramsretriestimeout)r.   r/   )r   r
   r8   r	   r9   _default_modelurllibparseurljoin	_base_urlr   r   r   r-   _get_retries_get_timeoutr<   )	r    r&   r=   r>   r?   rJ   rK   r.   r/   s	            r$   checkzGeminiProvider.checkM   s    U##K$;$;<<U2t22%%dnnd6J6JKLAeWTijoipq6CS:T9UVWX%%E%2%%a%0%%b%1
g {{g{66r%   c                    t        |      }|sg S t        j                  j                  | j                  | j
                        d| z   }t        || j                  |      d      }|sg S 	 t        j                  |      }|j                  dg       }|D cg c]#  }|j                  dd      j                  d      % c}S c c}w #  t        j                  d	|        g cY S xY w)
zList available Gemini models.z?key=rG   r   )rJ   r,   intervalmodelsr    zmodels/z&Failed to parse models from response: )r   rO   rP   rQ   rR   r   r   r-   jsonloadsgetremoveprefixloggererror)	r    r&   r=   r>   rJ   contentdatarX   xs	            r$   inspectzGeminiProvider.inspect`   s    UIll""4>>4??CeWoUsD,=,=E,=,JUVWI	::g&DXXh+FGMN!AEE&"%229=NNN	LLA'KLIs   -+C (C C C C&)N)rY   rY   rY   )rY   rY   )__name__
__module____qualname____doc__r   r   r   strr   r   r-   intr
   r<   rU   rc   __classcell__)r#   s   @r$   r   r      s    0
4	? 
.8# 88D> 8XVZ^ 8
-3 - - -(73 7 7S 7c 7[f 7&S 3 s DQTI r%   r   r   )rg   rZ   r5   urllib.parserO   tools.loggerr   r^   typingr   r   r   constant.systemr   
core.enumsr	   core.modelsr
   r   tools.utilsr   clientr   r   baser   registryr   r    r%   r$   <module>rv      sX     	  #	J	 ' ' , " .  #   'W^ Wt (N +r%   