
    iv~                         d Z ddl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 ddlmZ ddlmZ 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mZ dd	lmZ dd
lm Z  ddl!m"Z"  G d de      Z#y)Gemini provider implementation.    N)AnyDictListOptionalSequenceTuple)genai)types)GenerateContentResponse)AttachmentRefFunctionCallOutputEventMessageMessageBlockMessageBlockTypeMessageRoleToolCallPayload)ToolSpec)ModelProvider)ModelResponse)
TokenUsagec            	          e Zd ZdZdZdZd Z	 dIdee   dee	   de
ee      d	efd
Zde	d	efdZdee	   d	eeej$                     e
e   f   fdZdee	   de	d	dfdZded	ej$                  fdZded	ej$                  fdZded	efdZded	e
e   fdZdeej<                     d	eej>                     fdZ ded	ej<                  fdZ!de	d	efdZ"ded	ee#ee	f   eej>                     f   fdZ$de	d	efdZ%ded	eej<                     fdZ&ded	e
e   fdZ'de
e(   d	e
e   fd Z)ded	e
ej<                     fd!Z*d"e
e+e	      d	eej>                     fd#Z,d$e	d	ee   fd%Z-d&e	d	e
e   fd'Z.ded	e
e(   fd(Z/d)ed	e
e(   fd*Z0ded	efd+Z1d,e2d	efd-Z3d.e
e   de
ee      d/e#ee	f   d	ejh                  fd0Z5d1ed	e
ejl                     fd2Z7d3e	d	e	fd4Z8dee   d	eejr                     fd5Z:d$e	d	ejv                  fd6Z<d$e	d	ejz                  fd7Z>d$e	d	e	fd8Z?de	d	efd9Z@de	d	e	fd:ZAde+e	   d	eee   eeB   f   fd;ZCdd<d=e	d>e	d	eBfd?ZDd@e	d	efdAZEdBe	d	efdCZFdDed	eGfdEZHdDedFe(d	efdGZIde	d	dfdHZJy)JGeminiProviderr   i@ i  0 c                     i }| j                   r| j                   |d<   | j                  xs dj                         }| j                  |      }|r||d<   t	        j
                  di |S )z6
        Create and return the Gemini client.
        api_key http_options )r   base_urlstrip_build_http_optionsr
   Client)selfclient_kwargsr   r   s       Y/Users/bowang/.openclaw/workspace/ChatDev/runtime/node/agent/providers/gemini_provider.pycreate_clientzGeminiProvider.create_client#   sd     )+<<'+||M)$MM'R..0//9,8M.)||,m,,    Nconversationtimeline
tool_specsreturnc                 "   | j                  |      \  }}| j                  |||      }|j                  j                  | j                  ||      }	| j                  |	       | j                  ||	       | j                  |	      }
t        |
|	      S )zP
        Call the Gemini model using the unified conversation timeline.
        )modelcontentsconfig)messageraw_response)	_build_contents_build_generation_configmodelsgenerate_content
model_name_track_token_usage_append_response_contents_deserialize_responser   )r#   clientr(   r)   r*   kwargsr.   system_instructionr/   responser0   s              r%   
call_modelzGeminiProvider.call_model2   s     (,';';H'E$$../A:vV -3MM,J,J// -K -
 	)&&x:,,X6W8DDr'   r=   c                     t        |dd      }|s
t               S t        |dd      xs d}t        |dd      xs d}t        |dd      }t        |dd      }||d}|||d<   |||d<   t        |||xs ||z   |	      S )
z/Extract token usage from Gemini usage metadata.usage_metadataNprompt_token_countr   candidates_token_counttotal_token_countcached_content_token_count)rA   rB   )input_tokensoutput_tokenstotal_tokensmetadata)getattrr   )r#   r=   r@   prompt_tokenscandidate_tokensrG   cached_tokensrH   s           r%   extract_token_usagez"GeminiProvider.extract_token_usageO   s     +;TB<0DdKPq">3KTRWVW~/BDI0LdS #0&6
 #,8H()$5BH12&*%K-:J*J	
 	
r'   c                 |   g }g }|D ]  }t        |t              ro|j                  t        j                  u r2|j                         j                         }|r|j                  |       a|j                  | j                  |             t        |t              r!|j                  | j                  |             t        |t        j                        s|j                  |        |s;|j                  t        j                  dt        j                  d      g             |rdj                  |      nd }||fS )Nuserr   textrolepartsz

)
isinstancer   rS   r   SYSTEMtext_contentr    append_message_to_contentr   !_function_output_event_to_contentgenai_typesContentPartjoin)r#   r)   r.   system_promptsitemrQ   r<   s          r%   r2   zGeminiProvider._build_contentsn   s    /1$&D$(99 2 22,,.446D&--d3 8 8 >?$ 78 F Ft LM$ 3 34% " OO##&++45 =KV[[8PT+++r'   c                 t    t        |dd       }|sy |D ]#  }t        |dd       }|s|j                  |       % y )N
candidatescontent)rI   rX   )r#   r)   r=   rb   	candidaterc   s         r%   r8   z(GeminiProvider._append_response_contents   s=    X|T:
#IiD9G( $r'   r0   c                    | j                  |j                        }|j                  t        j                  u r)| j	                  |      }t        j                  d|g      S g }|j                         D ]"  }|j                  | j                  |             $ |s5|j                         }|j                  t        j                  |             t        j                  ||      S )NrO   rR   rP   )	_map_rolerS   r   TOOL_build_tool_response_partr[   r\   blocksextend_block_to_partsrW   rX   r]   )r#   r0   rS   partrT   blockrQ   s          r%   rY   z"GeminiProvider._message_to_content   s    ~~gll+<<;+++11':D&&F4&AA(*^^%ELL--e45 &'')DLL))t45""E::r'   eventc                 
   |j                   xs |j                  xs d}i }g }g }|j                  r|j                  D ]  }| j                  |      }|r|j	                  |       | j                  |      s9| j                  |      rI| j                  |j                        }|r+|j	                  d|j                  j                   d|        | j                  |      }	|j                  | j                  |	              n'|j                  r|j	                  |j                         dj                  |      |d<   t        j                   j#                  ||xs ddi|xs d       }
|
g}t        j$                  d|	      S )
Ntoolz
[Attachment Content: z]

resultr   namer=   rT   rO   rR   )function_namecall_idoutput_blocks_describe_blockrX   _block_has_attachment!_should_inline_attachment_as_text_read_attachment_text
attachmentrt   rk   rj   )_general_parts_to_function_response_partsoutput_textr^   r[   r]   from_function_responser\   )r#   rn   ru   payloadfunction_result_partsresult_textsrm   descrW   general_partsfunction_partrT   s               r%   rZ   z0GeminiProvider._function_output_event_to_content   sx    ++Fu}}F"$HJ"$,,++E2 ''---e4==eD'+'A'A%BRBR'S'(//2I%JZJZJ_J_I``cdpcq0rs  %)$8$8$?M)001_1_`m1no! -$   ##E$5$56 IIl3#((??.2'/4 @ 
 *7""e<<r'   rm   c                     |j                   sy|j                   j                  xs dj                         }|j                  d      xs+ |dk(  xs$ |j	                  d      xs |j	                  d      S )NFr   ztext/zapplication/jsonz+jsonz+xml)r|   	mime_typelower
startswithendswith)r#   rm   mimes      r%   rz   z0GeminiProvider._should_inline_attachment_as_text   sp      **0b779OOG$ "&&"MM'"" MM&!		
r'   r|   c                 F    | j                  |      }| j                  |      S N)_read_attachment_bytes_bytes_to_text)r#   r|   
data_bytess      r%   r{   z$GeminiProvider._read_attachment_text   s#    00<
"":..r'   rT   c                    g }|D ]  }|j                   r\|j                  t        j                  j	                  |j                   j
                  |j                   j                  xs d             |j                  sx|j                  t        j                  j                  |j                  j                  |j                  j                  xs d              |S )Napplication/octet-stream)datar   file_urir   )
inline_datarX   r[   FunctionResponsePart
from_bytesr   r   	file_datafrom_urir   )r#   rT   function_response_partsrl   s       r%   r}   z8GeminiProvider._general_parts_to_function_response_parts   s    JLD'..44??TEUEUEZEZfjfvfv  gA  gA  g_  E_?  ` ~~'..44==t~~G^G^jnjxjx  kC  kC  ka  Ga=  b  '&r'   c                     t        |j                  t              r|j                  j                  d      nd }|xs |j                  xs d}| j                  |      \  }}t        j                  t        j                  |||xs d             S )N	tool_namerp   rs   )function_response)	rU   rH   dictgettool_call_id_serialize_tool_message_payloadr[   r]   FunctionResponse)r#   r0   r   r   block_partss        r%   rh   z(GeminiProvider._build_tool_response_part   s    9CGDTDTVZ9[G$$((5ae	?!5!5?	#CCGL):: !)T
 	
r'   c                 B    t        |t              xr |j                  d uS r   )rU   r   r|   r#   rm   s     r%   ry   z$GeminiProvider._block_has_attachment   s    %.O53C3C43OOr'   c                    |j                   }g }t        |t              r4|j                         }|r	 t	        j
                  |      }|g fS ddi}|g fS t        |t              rg }|D ]  }t        |t              r1|j                  |j                                |j                  |       Dt        |t              sU|j                  |       	 |j                  t        j                  |              | j                  |      }||j                         d|fS | j                  |      }d|j                         i|fS # t        j                  $ r
 d|i}Y |g fS w xY w# t        $ r Y w xY w)Nrr   r   )ri   rr   )rc   rU   strr    jsonloadsJSONDecodeErrorlistr   rX   to_dictr   	from_dict	Exception_blocks_to_function_partsrW   )	r#   r0   rc   ri   strippedr   blocks_payloadrm   rT   s	            r%   r   z.GeminiProvider._serialize_tool_message_payload   sh   //%'gs#}}H3"jj2G
 B; $R.B;gt$N e\2"))%--/:MM%(t,"))%0!l&<&<U&CD ! 226:E,8L8L8NOQVVV..v6'..01588- ++ 3'2G B;	3  % ! !s#   D? $E?EE	E,+E,c                     t        |t              r|j                         S t        |t              r|j	                  d      }|rt        |      S t        |      S )NrQ   )rU   r   describer   r   r   )r#   rm   rQ   s      r%   rx   zGeminiProvider._describe_block  sH    e\*>>##eT"99V$D4y 5zr'   c                    |j                   t        j                  u r%t        j                  |j
                  xs d      gS |j                   t        j                  u r*| j                  |      }|t        j                  |      gS |j                   t        j                  t        j                  t        j                  t        j                  fv r| j                  |      }|r|gS g S |j                   t        j                  u rL|j                  xs i }|j
                  xs t        j                  |d      }t        j                  |      gS g S )Nr   rP   Fensure_ascii)typer   TEXTr[   r]   rQ   FILE_maybe_inline_large_csvIMAGEAUDIOVIDEO_attachment_block_to_partDATAr   r   dumps)r#   rm   csv_text
media_partdata_payloadrQ   s         r%   rk   zGeminiProvider._block_to_parts'  s   ::)...$$%***:;<<::)...33E:H##((h788::""""""!!	
 
 77>J#-J<525::)... ::+L::MLu!MD$$$/00	r'   c                    |j                   }|sy|j                  xs dj                         }|j                  xs dj                         }d|vr|j	                  d      sy|j
                  ryt        | d| j                        }|j                  }d}|| j                  |      }|yt        |      }|||k  ry|| j                  |      }|y| j                  |      }|yt        | d| j                        }	d}
t        |      |	kD  r|d|	 }d}
|j                  xs |j                  xs d	}|
rd
|	 dnd}d| d| | S )zPConvert large CSV attachments to inline text to avoid Gemini upload size limits.Nr   ztext/csvz.csvcsv_inline_size_threshold_bytescsv_inline_char_limitFTzattachment.csvz

[truncated after z characters]z
CSV file 'z ' (converted from >3MB upload):
)r|   r   r   rt   r   remote_file_idrI   CSV_INLINE_SIZE_THRESHOLD_BYTESsizer   lenr   CSV_INLINE_CHAR_LIMITattachment_id)r#   rm   r|   r   rt   	threshold
size_bytesr   rQ   
char_limit	truncateddisplay_namesuffixs                r%   r   z&GeminiProvider._maybe_inline_large_csv@  s~    %%
$$*113%2,,.T!$--*?$$-00
	  __
&*
44Z@J!ZJy!844Z@J!"":.<T#:D<V<VW
	t9z!$DI!V**B*BVFVEN(LATVL>)J4&QWPXYYr'   r   c                 p    |y 	 |j                  d      S # t        $ r |j                  dd      cY S w xY w)Nutf-8replace)errors)decodeUnicodeDecodeError)r#   r   s     r%   r   zGeminiProvider._bytes_to_textr  sI    	@$$W--! 	@$$WY$??	@s    55c                    |j                   }|sy |j                  xs i }|j                  d      xs |j                  }|j                  xs | j                  |      }|r+t        j                  t        j                  ||            S | j                  |      }|y t        j                  t        j                  |xs d|            S )Ngemini_file_urir   r   r   )r   r   r   )r|   rH   r   r   r   _guess_mime_from_blockr[   r]   FileDatar   Blob)r#   rm   r|   rH   r   r   	blob_datas          r%   r   z(GeminiProvider._attachment_block_to_partz  s    %%
&&,"",,'89VZ=V=V((ND,G,G,N	##%..,'  //
;	#((#A'A
 	
r'   ri   c           
         |sg S g }|D ];  }t        |t              s(t        |t              r	 t        j                  |      }n<|j
                  }|sK|j                  xs | j                  |      }|j                  xs i j                  d      xs |j                  }|rF|j                  t        j                  t        j                  |||j                                     | j!                  |      }|s|j                  t        j                  t        j"                  |xs d||j                                     > |S # t        $ r Y Mw xY w)Nr   )r   r   r   r   r   )r   r   r   r   )rU   r   r   r   r   r|   r   r   rH   r   r   rX   r[   r   FunctionResponseFileDatart   r   FunctionResponseBlob)r#   ri   rT   rm   r|   r   r   r   s           r%   r   z(GeminiProvider._blocks_to_function_parts  sG    I8:Ee\2eT*! , 6 6u = ))J",,R0K0KE0RI"++1r667HIfZMfMfH44"-"F"F%-&/)3# 44Z@JLL00 + @ @"+"I/I'%/__!9 J A % ! !s   E

	EEr   c                 @   t        |t              rt        |t        t        t        f      rg S g }|D ]Z  }t        |t
              r|j                  |       %t        |t              s6	 |j                  t        j                  |             \ |S # t        $ r Y jw xY wr   )
rU   r   r   bytes	bytearrayr   rX   r   r   r   )r#   r   ri   r`   s       r%   _coerce_message_blocksz%GeminiProvider._coerce_message_blocks  s    '8,
7S%QZD[0\I%'D$-d#D$'MM,"8"8">?   ! s   )$B	BBvaluec                     |y t        |t              r$t        j                  |      j	                  d      S 	 t        |      S # t        $ r Y y w xY w)Nascii)rU   r   base64	b64encoder   r   r   )r#   r   s     r%   _encode_thought_signaturez(GeminiProvider._encode_thought_signature  sQ    =eU###E*11'::	u: 		s   
A 	AAc                 \   |j                   r| j                  |j                         }||S |j                  rZt        j                  j                  |j                        r1	 t        |j                  d      5 }|j                         cd d d        S y # 1 sw Y   y xY w# t        $ r Y y w xY w)Nrb)	data_uri_decode_data_uri
local_pathospathexistsopenreadOSError)r#   r|   decodedhandles       r%   r   z%GeminiProvider._read_attachment_bytes  s    ++J,?,?@G"  RWW^^J4I4I%J*//6&!;;= 76 	 7   s0   "B 8B	B BB B 	B+*B+r   c                     |j                  d      sy |j                  d      \  }}}|sy d|v r	 t        j                  |      S |j                  d      S # t        t
        j                  f$ r Y y w xY w)Ndata:,z;base64r   )r   	partitionr   	b64decode
ValueErrorbinasciiErrorencode)r#   r   header_r   s        r%   r   zGeminiProvider._decode_data_uri  s{    ""7+",,S14''-- {{7## / s   A A21A2c                 "   |j                   r,|j                   j                  r|j                   j                  S |j                  t        j                  u ry|j                  t        j
                  u ry|j                  t        j                  u ryy)Nz	image/pngz
audio/mpegz	video/mp4r   )r|   r   r   r   r   r   r   r   s     r%   r   z%GeminiProvider._guess_mime_from_block  sp     0 0 : :##---::)///::)///::)///)r'   rS   c                 v    |t         j                  u ry|t         j                  u ry|t         j                  u ryy)NrO   r-   rp   )r   USER	ASSISTANTrg   )r#   rS   s     r%   rf   zGeminiProvider._map_role  s8    ;###;(((;###r'   r<   call_paramsc                    t        | j                  xs i       }|j                  |       i }|r||d<   dD ]  }||v s|j                  |      ||<    |j                  dd       }|r||d<   |j                  dd       }|j                  dd       }	|	r\|d|	i}nUt	        |t               rt        |      }|j                  d|	       n't	        |t        j                        r		 |	|_        nd|	i}|r| j                  |      |d<   |j                  dd       }
|
r|
|d<   |j                  dd       }|r||d<   | j                  |xs g       }|r||d<   |j                  d	d       }|j                  d
d       }|r|xs i }||d
<   |r| j                  |      |d	<   |j                  dd       }|r| j                  |      |d<   t        j                  di |S # t        $ r d|	i}Y w xY w)Nr<   )
temperaturetop_ptop_kcandidate_countmax_output_tokensresponse_modalitiesstop_sequencesseedpresence_penaltyfrequency_penaltysafety_settingsimage_configaspect_ratioaudio_configvideo_configtoolstool_configfunction_calling_configautomatic_function_callingr   )r   paramsupdatepoprU   
setdefaultr[   ImageConfigr  r   _coerce_image_config_build_tools_coerce_tool_config"_coerce_automatic_function_callingGenerateContentConfig)r#   r<   r*   r  r   config_kwargskeyr  r  r  r  r  r  tool_config_payloadfunction_calling_payloadautomatic_fn_callings                   r%   r3   z'GeminiProvider._build_generation_config  s+    dkk'R(k"(*2DM./
C f}%+ZZ_c"
 !**%6=/>M+,zz.$7zz.$7# .=L$/#L1''EL+*A*ABB0<L- !/=,0,E,El,SM.)zz.$7,8M.)zz.$7,8M.)!!*"23%*M'"$jj=#)::.G#N #"5";=U 9:+/+C+CDW+XM-(%zz*FM:>:a:a$;M67 00A=AAE ! B$2L#ALBs   #G G'&G'r   c                 V    |sy 	 t        j                  |d      S # t        $ r Y y w xY w)Ni )r   timeout)r[   HttpOptionsr   )r#   r   s     r%   r!   z"GeminiProvider._build_http_options_  s2    	**HmTT 		s    	((r  c                     t        |t        j                        r|S t        |t              r	 t        j                  di |S |S # t        $ r |cY S w xY w)Nr   )rU   r[   r$  r   r   )r#   r  s     r%   r%  z#GeminiProvider._coerce_image_configg  sZ    lK$;$;<lD)$"..>>>   $##$s   A AAc           	         |sg S g }|D ]  }|j                         }|j                  d      xs di d}d|v r|j                  d       |j                  di       j                         D ]/  \  }}t	        |t
              sd|v s|j                  d      |d<   1 |j                  t        j                  |j                  dd      |j                  d      xs d|	              t        j                  |
      gS )N
parametersobject)r   
propertiestitler6  descriptionrt   r   )rt   r8  r4  )function_declarations)
to_gemini_functionr   r"  itemsrU   r   rX   r[   FunctionDeclarationTool)r#   r*   declarationsspec
fn_payloadr4  	prop_name
prop_values           r%   r&  zGeminiProvider._build_toolsq  s    ID002J#5](Z\9]J*$w')3b)I)O)O)Q%	:j$/Gz4I0:w0GJ}- *R //#3 *} = C)     |DEEr'   c                     t        |t        j                        r|S i }t        |t              r'|j	                  d      }|r| j                  |      |d<   t        j                  di |S )Nr  r   )rU   r[   
ToolConfigr   r   _coerce_function_calling_config)r#   r   r;   r@  s       r%   r'  z"GeminiProvider._coerce_tool_config  sc    g{556N!#gt$ %>?J484X4XYc4d01%%///r'   c                     t        |t        j                        r|S t        |t              rt        j                  |      S t        |t              rt        j                  di |S t        d      )N)modez.Invalid function calling configuration payloadr   )rU   r[   FunctionCallingConfigr   r   r  )r#   r   s     r%   rE  z.GeminiProvider._coerce_function_calling_config  s\    g{@@ANgs#44'BBgt$44?w??IJJr'   c                     t        t        dd       }|t        d      t        ||      r|S t        |t              r |di |S t        d      )NAutomaticFunctionCallingConfigzFAutomatic function calling config not supported in current SDK versionz1Invalid automatic function calling config payloadr   )rI   r[   r  rU   r   )r#   r   
config_clss      r%   r(  z1GeminiProvider._coerce_automatic_function_calling  sV    [*JDQ
effgz*Ngt$(((LMMr'   c                    | j                  |      }|st        t        j                  d      S t	        |dd       }|s8t        t        j                  t        |d      r|j                        S d      S | j                  t	        |dg       xs g       \  }}|s1t	        |dd       xs d}|rt        t        j                  |      gng }t        t        j                  |xs d|      S )Nr   )rS   rc   rc   rQ   rT   rP   )rS   rc   
tool_calls)_select_primary_candidater   r   r
  rI   hasattrrQ   _parse_candidate_partsr   r   r   )r#   r=   rd   rc   ri   rM  fallbacks          r%   r9   z$GeminiProvider._deserialize_response  s    228<	 5 5rBB)Y5 5 5PWX`bhPix}}rroqrr!88'SU9V9\Z\]
x6<"HMUl#3#8#8xHI[]F&&Lb!
 	
r'   c                 4    t        |dd       xs g }|sy |d   S )Nrb   r   )rI   )r#   r=   rb   s      r%   rN  z(GeminiProvider._select_primary_candidate  s%    X|T:@b
!}r'   c                    g }g }|D ]j  }t        |d      rA|j                  5|j                  t        t        j
                  |j                               Qt        |dd       }|r0t        |dd       }|j                  | j                  ||             t        |dd       }|r!|j                  | j                  |             t        |dd       }|r!|j                  | j                  |             t        |dd       }	|	s|j                  t        t        j                  t        j                  |	j                  xs i d	
      t        |	dd      |	j                  xs i d             m ||fS )NrQ   rP   function_callthought_signaturerU  r   r   r   Fr   rt   r   )ru   r=   )r   rQ   r   )rO  rQ   rX   r   r   r   rI   _build_tool_call_payload_build_inline_block_build_file_blockr   r   r   r=   )
r#   rT   ri   rM  rl   rT  rU  r   r   r   s
             r%   rP  z%GeminiProvider._parse_candidate_parts  sj    &(,.
DtV$)>l+;+@+@tyyQR#D/4@M$+D2Et$L!!!11-Sd1e !$t<Kd66{CDk48Id44Y?@ '.A4 H  -22!ZZ(9(B(B(HbW\]-45FPR-S(9(B(B(Hb	 G J z!!r'   rV  fn_callrU  c                `   t        |dd      xs t        j                         j                  }t        |di       xs i }	 t	        j
                  |d      }i }| j                  |      }|r||d<   t        |t        |dd      xs ||d|      S # t        t        f$ r t        |      }Y Uw xY w)	Nrt   r   argsFr   gemini_thought_signature_b64function)idru   	argumentsr   rH   )rI   uuiduuid4hexr   r   	TypeErrorr  r   r   r   )r#   rZ  rU  rv   r`  arg_strrH   encoded_signatures           r%   rW  z'GeminiProvider._build_tool_call_payload  s    '62.B$**,2B2BGVR06B		%jj?G $& ::;LM7HH34!'626A'
 	
 :& 	%)nG	%s    B B-,B-blobc           
          t        |dd      xs d}t        |dd       xs d}| j                  ||      }| j                  |      }t        |t	        t        j                         j                  ||ddi      	      S )
Nr   r   r   r   r'   sourcegemini_inline)r   r   r   rH   r   r|   )rI   _encode_data_uri_block_type_from_mimer   r   ra  rb  rc  )r#   rg  r   r   r   
block_types         r%   rX  z"GeminiProvider._build_inline_block  s    D+r2P6P	T6407C
((J?//	:
$"jjl..#!"O4	
 	
r'   r   c                     t        |dd       }t        |dd       xs t        |dd       }| j                  |xs d      }t        |t        t	        j
                         j                  |||dd            S )	Nr   r   filer   gemini_file)r   ri  )r   r   r   rH   rk  )rI   rm  r   r   ra  rb  rc  )r#   r   r   r   rn  s        r%   rY  z GeminiProvider._build_file_block  sv    I{D9	9j$7[79fVZ;[//	R@
$"jjl..#'-5O	
 	
r'   r   c                     |j                  d      rt        j                  S |j                  d      rt        j                  S |j                  d      rt        j                  S t        j
                  S )Nzimage/zaudio/zvideo/)r   r   r   r   r   r   )r#   r   s     r%   rm  z$GeminiProvider._block_type_from_mime!  s\    )#))))#))))#)))$$$r'   r   c                 Z    t        j                  |      j                  d      }d| d| S )Nr   r   z;base64,)r   r   r   )r#   r   r   encodeds       r%   rl  zGeminiProvider._encode_data_uri*  s0    ""4(//8yk'33r'   c                 |   t        | j                  dd       }|sy | j                  |      }|j                  dk(  r|j                  dk(  r|j
                  sy t        | j                  dd      }||_        | j                  |_        |j                  |_        d|_	        |j                  || j                  |d       y )Ntoken_trackerr   node_idALLgemini)provider)rI   r/   rM   rE   rF   rH   rw  r6   workflow_idrz  record_usage)r#   r=   rv  usagerw  s        r%   r7   z!GeminiProvider._track_token_usage2  s    _dC((2"u':':a'?$++y%8??)55!""7DOOUX"Vr'   r   )K__name__
__module____qualname____doc__r   r   r&   r   r   r   r   r   r   r>   r   rM   r	   r[   r\   r   r2   r8   rY   r   rZ   r   boolrz   r   r{   r]   r   r}   rh   ry   r   r   rx   rk   r   r   r   r   r   r   r   r   r   r   r   r   rf   r)  r3   r1  r!   r%  r=  r&  rD  r'  rH  rE  r(  r9   rN  r   rP  rW  rX  rY  r   rm  rl  r7   r   r'   r%   r   r      s   )#&5#-( 04E 7mE s)	E
 T(^,E 
E:
C 
J 
>!,s)!, 
tK''((3-7	8!,F)$s) )s )t );7 ;{7J7J ;(=&(= 
		(=T	
| 	
 	
/ /(3- /'tKDTDT?U 'Z^_j__  [A '

 

[=M=M 

P3 P4 P9w 95cSVhY]^i^~^~YI  DA 9@S S \ d;;K;K6L 20Z\ 0Zhsm 0Zd@% @Xc] @
| 
IYIY@Z 
<,#', 
k..	/,\c d<6H s x}  8E? $ $% $	*L 	*S 	*k c MB$SMMB T(^,MB #s(^	MB
 
	*	*MB^C H[=T=T4U   FtH~ F${?O?O:P F.03 0;3I3I 0Ks K{?`?` KN# N# N
c 
g 
(# # ,"}," 
tL!4#88	9,"\ RV 
 
3 
Zi 
&
 
 

3 
< 
%s %7G %4# 4U 4s 4W3 W4 Wr'   r   )$r  r   r  r   r   ra  typingr   r   r   r   r   r	   googler
   google.genair   r[   google.genai.typesr   entity.messagesr   r   r   r   r   r   r   entity.tool_specr   runtime.node.agentr   r   utils.token_trackerr   r   r   r'   r%   <module>r     sS    %    	  = =  - 6   & , , *dW] dWr'   