o
    i[                     @  sR  U d dl mZ d dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZmZmZ d dlmZ d d	lm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!m"Z"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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d
dl;m<Z< d
dl=m>Z>m?Z? d
dl@mAZA d
dlBmCZC ddlmDZDmEZEmFZFmGZGmHZHmIZI zLd dlJmKZK d dlLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUm-ZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZl W n emy Zn zemdendZn[nww ed Zo	 epeoB Zq	 eVjrdeVjsdeVjtdeVjudeVjvdeVjwdeVjxdeVjydeVjzdeVj{deVj|deVj}deVj~deVjdeVjdiZded < G d!d" d"eAd#d$Ze
d#d%G d&d' d'eDZe
G d(d) d)eFZd^d0d1Z		d_d`d@dAZdadEdFZdbdJdKZdcdNdOZdddTdUZdedYdZZdfd\d]ZdS )g    )annotationsN)AsyncIterator	Awaitable)asynccontextmanager)	dataclassfieldreplace)datetime)AnyLiteralcastoverload)uuid4)assert_never   )UnexpectedModelBehavior_utilsusage)OutputObjectDefinition)
RunContext)CodeExecutionToolImageGenerationToolUrlContextToolWebSearchTool)	UserError)BinaryContentBuiltinToolCallPartBuiltinToolReturnPart
CachePointFilePartFileUrlFinishReasonModelMessageModelRequestModelResponseModelResponsePartModelResponseStreamEventRetryPromptPartSystemPromptPartTextPartThinkingPartToolCallPartToolReturnPartUserPromptPartVideoUrl)ModelProfileSpec)Providerinfer_provider)ModelSettings)ToolDefinition   )ModelModelRequestParametersStreamedResponsecheck_allow_model_requestsdownload_itemget_user_agent)Client) BlobDictCodeExecutionResultCodeExecutionResultDictContentDictContentUnionDictCountTokensConfigDictExecutableCodeExecutableCodeDictFileDataDictr!   FunctionCallDictFunctionCallingConfigDictFunctionCallingConfigModeFunctionDeclarationDictGenerateContentConfigDictGenerateContentResponseGenerationConfigDictGoogleSearchDictGroundingMetadataHttpOptionsDictMediaResolutionModalityPartPartDictSafetySettingDictThinkingConfigDictToolCodeExecutionDictToolConfigDictToolDictToolListUnionDictUrlContextDictVideoMetadataDictu   Please install `google-genai` to use the Google model, you can use the `google` optional group — `pip install "pydantic-ai-slim[google]"`)	zgemini-2.0-flashzgemini-2.0-flash-litezgemini-2.5-flashz gemini-2.5-flash-preview-09-2025zgemini-flash-latestzgemini-2.5-flash-litez%gemini-2.5-flash-lite-preview-09-2025zgemini-flash-lite-latestzgemini-2.5-prostoplengthcontent_filtererrorz-dict[GoogleFinishReason, FinishReason | None]_FINISH_REASON_MAPc                   @  sB   e Zd ZU dZded< 	 ded< 	 ded< 	 ded	< 	 d
ed< dS )GoogleModelSettingsz)Settings used for a Gemini model request.zlist[SafetySettingDict]google_safety_settingsrT   google_thinking_configzdict[str, str]google_labelsrO   google_video_resolutionstrgoogle_cached_contentN)__name__
__module____qualname____doc____annotations__ rl   rl   _/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_ai/models/google.pyr`      s   
 r`   F)total)initc                      sJ  e Zd ZU dZeddZded< eddZded< eddZded	< eddZ	d
ed< ddddd] fddZ
ed^ddZed_ddZed^ddZd` fd$d%Zdad)d*Zdbd,d-Ze	dcddd1d2Zded4d5Zdfd8d9Zedgd>d?ZedhdBd?ZdidEd?ZdjdGdHZdkdJdKZdldNdOZdmdQdRZdndVdWZdod[d\Z  ZS )pGoogleModela4  A model that uses Gemini via `generativelanguage.googleapis.com` API.

    This is implemented from scratch rather than using a dedicated SDK, good API documentation is
    available [here](https://ai.google.dev/api).

    Apart from `__init__`, all methods are private or match those of the base class.
    F)reprr;   clientGoogleModelName_model_namezProvider[Client]	_provider
str | None_url
google-glaN)providerprofilesettings
model_namery   DLiteral['google-gla', 'google-vertex', 'gateway'] | Provider[Client]rz   ModelProfileSpec | Noner{   ModelSettings | Nonec                  sL   || _ t|trt|dkrdn|}|| _|j| _t j||p!|jd dS )a  Initialize a Gemini model.

        Args:
            model_name: The name of the model to use.
            provider: The provider to use for authentication and API access. Can be either the string
                'google-gla' or 'google-vertex' or an instance of `Provider[google.genai.AsyncClient]`.
                Defaults to 'google-gla'.
            profile: The model profile to use. Defaults to a profile picked by the provider based on the model name.
            settings: The model settings to use. Defaults to None.
        gatewayzgateway/google-vertex)r{   rz   N)	rt   
isinstancere   r1   ru   rr   super__init__model_profile)selfr|   ry   rz   r{   	__class__rl   rm   r      s   
zGoogleModel.__init__returnre   c                 C     | j jS N)ru   base_urlr   rl   rl   rm   r      s   zGoogleModel.base_urlc                 C     | j S )zThe model name.rt   r   rl   rl   rm   r|         zGoogleModel.model_namec                 C  r   )zThe model provider.)ru   namer   rl   rl   rm   system   s   zGoogleModel.systemmodel_settingsmodel_request_parametersr6   3tuple[ModelSettings | None, ModelRequestParameters]c                   s:   |j r|jr|jdkrt|dd}ntdt ||S )Nautoprompted)output_modezxGoogle does not support output tools and built-in tools at the same time. Use `output_type=PromptedOutput(...)` instead.)builtin_toolsoutput_toolsr   r   r   r   prepare_request)r   r   r   r   rl   rm   r      s   
zGoogleModel.prepare_requestmessageslist[ModelMessage]r$   c                   sF   t   | ||\}}tt|pi }| |d||I d H }| |S )NF)r8   r   r   r`   _generate_content_process_response)r   r   r   r   responserl   rl   rm   request   s   
zGoogleModel.requestusage.RequestUsagec                   s2  t   | ||\}}tt|pi }| |||I d H \}}ttttf |}t|	dd}| j
jdkrw|j|	dttt |	dt|	d|	d|	d|	d	|	d
|	d|	d|	d|	d|	d|	ddd | jjjj| j||dI d H }|jd u rtdt|tj|jdS )Nhttp_options)r   rx   system_instructiontoolstemperaturetop_pmax_output_tokensstop_sequencespresence_penaltyfrequency_penaltyseedthinking_configmedia_resolutionresponse_mime_typeresponse_schema)r   r   r   r   r   r   r   r   r   r   r   )r   r   generation_configmodelcontentsconfigz)Total tokens missing from Gemini response)input_tokens)r8   r   r   r`   _build_content_and_configdictre   r
   rA   getru   r   updatelistrW   rK   rr   aiomodelscount_tokensrt   total_tokensr   r   RequestUsage)r   r   r   r   r   r   r   r   rl   rl   rm   r      sX   

zGoogleModel.count_tokensrun_contextRunContext[Any] | NoneAsyncIterator[StreamedResponse]c                 C sT   t   | ||\}}tt|pi }| |d||I d H }| ||I d H V  d S )NT)r8   r   r   r`   r   _process_streamed_response)r   r   r   r   r   r   rl   rl   rm   request_stream8  s   zGoogleModel.request_streamlist[ToolDict] | Nonec                 C  s   dd |j  D }|jr^|jrtd|jD ]F}t|tr(|tt	 d qt|t
r7|tt d qt|trF|tt d qt|trT| jjsStdqtd|jj d	|pad S )
Nc                 S  s   g | ]
}t t|gd qS ))function_declarations)rW   _function_declaration_from_tool).0trl   rl   rm   
<listcomp>J  s    z*GoogleModel._get_tools.<locals>.<listcomp>zKGoogle does not support function tools and built-in tools at the same time.)google_search)url_context)code_executionzc`ImageGenerationTool` is not supported by this model. Use a model with 'image' in the name instead.`zK` is not supported by `GoogleModel`. If it should be, please file an issue.)	tool_defsvaluesr   function_toolsr   r   r   appendrW   rL   r   rY   r   rU   r   rz   supports_image_outputr   rg   )r   r   r   toolrl   rl   rm   
_get_toolsI  s.   




zGoogleModel._get_toolsr   ToolConfigDict | Nonec                 C  sP   |j s&|r&g }|D ]}|dpg D ]}|d }r || qq	t|S d S )Nr   r   )allow_text_outputr   r   _tool_config)r   r   r   namesr   function_declarationr   rl   rl   rm   _get_tool_confige  s   

zGoogleModel._get_tool_configstreamLiteral[False]r`   rJ   c                      d S r   rl   r   r   r   r   r   rl   rl   rm   r   r     zGoogleModel._generate_contentLiteral[True]1Awaitable[AsyncIterator[GenerateContentResponse]]c                   r   r   rl   r   rl   rl   rm   r   {  r   boolKGenerateContentResponse | Awaitable[AsyncIterator[GenerateContentResponse]]c                   sL   |  |||I d H \}}|r| jjjjn| jjjj}|| j||dI d H S )Nr   )r   rr   r   r   generate_content_streamgenerate_contentrt   )r   r   r   r   r   r   r   funcrl   rl   rm   r     s   8tuple[list[ContentUnionDict], GenerateContentConfigDict]c                   s  |  |}|r| jjstdd }d }|jdkr0|rtdd}|j}|d us*J | |}n|jdkrA|sA| jjs?tdd}| ||}| 	||I d H \}	}
t
jjg}| jjrb|t
jj ddt di}|d	 }rt|ttB rtd
| |d	< ntdtd%i d|d|	d|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd|dd tt|d!|d"|d#|d$|}|
|fS )&Nz&Tools are not supported by this model.nativezmGoogle does not support `NativeOutput` and tools at the same time. Use `output_type=ToolOutput(...)` instead.zapplication/jsonr   z+JSON output is not supported by this model.headers)zContent-Typez
User-Agenttimeouti  zHGoogle does not support setting ModelSettings.timeout to a httpx.Timeoutr   r   r   r   r   
max_tokensr   r   r   r   safety_settingsra   r   rb   labelsrc   r   rd   cached_contentrf   r   tool_configr   r   response_modalitiesrl   )r   rz   supports_toolsr   r   output_object_map_response_schemasupports_json_object_outputr   _map_messagesrP   TEXTvaluer   r   IMAGEr:   r   r   intfloatrI   r   rX   )r   r   r   r   r   r   r   r   r   r   r   
modalitiesr   r   r   rl   rl   rm   r     s   









	






z%GoogleModel._build_content_and_configr   c           	   
   C  s   |j std|j d }|j}d }d }|j}|r"d|ji}t|}|jd u s-|jjd u rB|dkr?|r?td|jd|	 g }n|jjpGg }t
|}t||j|jpU| j| jj||||dS )Nz2Expected at least one candidate in Gemini responser   finish_reasonr]   Content filter 
 triggered)	vendor_idvendor_detailsr   )
candidatesr   response_idr   r   r_   r   contentpartsmodel_dump_json_metadata_as_usage_process_response_from_partsgrounding_metadatamodel_versionrt   ru   r   )	r   r   	candidater   r  r   raw_finish_reasonr  r   rl   rl   rm   r     s8   



zGoogleModel._process_response&AsyncIterator[GenerateContentResponse]r7   c                   sV   t |}| I dH }t|t jrtdt||jp| j||j	p%t 
 | jjdS )zHProcess a streamed response, and prepare a streaming response to return.Nz5Streamed response ended without content or tool calls)r   rt   	_response
_timestamp_provider_name)r   PeekableAsyncStreampeekr   Unsetr   GeminiStreamedResponser
  rt   create_timenow_utcru   r   )r   r   r   peekable_responsefirst_chunkrl   rl   rm   r     s   

z&GoogleModel._process_streamed_response1tuple[ContentDict | None, list[ContentUnionDict]]c           
   	     sl  g }g }|D ]}t |trg }|jD ]`}t |tr#|d|ji qt |tr4|| |I d H  qt |t	rI|d|j
| |jdi qt |tro|j
d u r]|d| i q|d|j
d| i|jdi qt| q|s{ddig}|d|d qt |tr|t|| j qt| q| || }r|dd|i |rtd|dnd }	|	|fS )	Ntextfunction_response)r   r   id
call_error userroler  r   )r   r#   r  r(   r   r  r-   extend_map_user_promptr,   	tool_namemodel_response_objecttool_call_idr'   model_responser   r$   _content_model_responser   _get_instructionsinsertr?   )
r   r   r   r   system_partsmmessage_partspartinstructionsr   rl   rl   rm   r     sT   





	






zGoogleModel._map_messagesr.  r-   list[PartDict]c           	        s^  t |jtrd|jigS g }|jD ]}t |tr!|d|i qt |trB|j|jd}d|i}|jr<tt	|j|d< || qt |t
rf|jrf|j|jd}d|i}|jr`tt	|j|d< || qt |tr|jsy| jdkr|jdst|d	d
I d H }|d |d d}|d|i q|j|jd}|d|i qt |trqt| q|S )Nr  data	mime_typeinline_datavideo_metadata)file_urir3  	file_datarx   z6https://generativelanguage.googleapis.com/v1beta/filesbytes)data_formatr2  	data_type)r   r  re   r   r   r2  
media_typevendor_metadatar   rZ   r.   
is_youtubeurlr    force_downloadr   
startswithr9   r   r   )	r   r.  r  iteminline_data_dict	part_dictfile_data_dictdownloaded_itemr4  rl   rl   rm   r#  :  sF   







zGoogleModel._map_user_promptor   dict[str, Any]c                 C  s.   |j  }|jr|j|d< |jr|j|d< |S )Ntitledescription)json_schemacopyr   rI  )r   rF  r   rl   rl   rm   r   e  s   


z GoogleModel._map_response_schema)r|   rs   ry   r}   rz   r~   r{   r   r   re   r   rs   )r   r   r   r6   r   r   )r   r   r   r   r   r6   r   r$   )r   r   r   r   r   r6   r   r   r   )
r   r   r   r   r   r6   r   r   r   r   )r   r6   r   r   )r   r6   r   r   r   r   )
r   r   r   r   r   r`   r   r6   r   rJ   )
r   r   r   r   r   r`   r   r6   r   r   )
r   r   r   r   r   r`   r   r6   r   r   )r   r   r   r`   r   r6   r   r   )r   rJ   r   r$   )r   r  r   r6   r   r7   )r   r   r   r6   r   r  )r.  r-   r   r0  )rF  r   r   rG  )rg   rh   ri   rj   r   rr   rk   rt   ru   rw   r   propertyr   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  r   __classcell__rl   rl   r   rm   rp      sF   
 

9




A
#

6+rp   c                   @  sf   e Zd ZU dZded< ded< ded< ded	< dddZedddZedddZedddZ	dS )r  z:Implementation of `StreamedResponse` for the Gemini model.rs   rt   r  r  r	   r  re   r  r   'AsyncIterator[ModelResponseStreamEvent]c                 C sd  d }| j 2 z'3 d H W }t|| _|jsq|jd }|jr"|j| _|j}|r3d|ji| _t	
|| _|jd u s>|jjd u rR| jdkrQ|rQtd|jd| q|jj}|sYq|D ]}|jrtt|jd}| jjd|| jdV  |jd urt|jdkr|jr| jjd|jd	V  q[| jjd
|jd	}|d ur|V  q[|jr| jjt |jj|jj|jjd}|d ur|V  q[|j d ur|j j!}	|j j"}
|	r|
sJ dt#|	|
d}| jj$t t%t#&|ddV  q[|j'd urt() }| jj$t t*|j'| j|dV  q[|j+d ur |d usJ | jj$t t,|j+| j|dV  q[|j-d us-J d| q[q6 d S )Nr   r   r]   r   r   utf-8thinking)vendor_part_id	signatureprovider_name)rS  r  r  )rS  r$  argsr&  (Inline data must have data and mime typer2  r;  r  )rS  r.  zUnexpected part: ).r  r  _usager  r  provider_response_idr   r   provider_detailsr_   r   r  r  r   r  thought_signaturebase64	b64encodedecode_parts_managerhandle_thinking_deltarU  r  lenthoughthandle_text_deltafunction_callhandle_tool_call_deltar   r   rV  r  r4  r2  r3  r   handle_partr   narrow_typeexecutable_coder   generate_tool_call_id_map_executable_codecode_execution_result_map_code_execution_resultr  )r   code_execution_tool_call_idchunkr  r  r  r.  rT  maybe_eventr2  r3  r  rl   rl   rm   _get_event_iteratorx  s   









z*GeminiStreamedResponse._get_event_iteratorc                 C  r   )z#Get the model name of the response.r   r   rl   rl   rm   r|     r   z!GeminiStreamedResponse.model_namec                 C  r   )zGet the provider name.)r  r   rl   rl   rm   rU    r   z$GeminiStreamedResponse.provider_namec                 C  r   )z"Get the timestamp of the response.)r  r   rl   rl   rm   	timestamp  r   z GeminiStreamedResponse.timestampN)r   rP  rM  rL  )r   r	   )
rg   rh   ri   rj   rk   rr  rN  r|   rU  rs  rl   rl   rl   rm   r  o  s   
 
er  r,  r$   rU  re   r   r?   c           	      C  s  g }d }| j D ]}i }|r||d< d }t|tr(t|j| |jd}||d< nt|tr3|j|d< nt|t	rS|j
|krF|jrFt|j}|jrR|j|d< d|d< nat|tru|j
|krt|jtjkrmtt| |d< nG|jtjkrt	 n?t|tr|j
|kr|jtjkrt|jtrtt|j|d< n |jtjkr	 nt|tr|j}|j|jd	}||d
< nt| |r|| qtd|dS )Nr]  )r   rV  r  rf  r  Trd  rj  rm  r1  r4  r   r   )r  r   r+   rE   r$  args_as_dictr&  r)   r  r*   rU  rT  r^  	b64decoder   r   kindr   rC   r   r   r   r>   r   r2  r;  r   r   r?   )	r,  rU  r  r]  rA  r.  rf  r  rB  rl   rl   rm   r(    sT   












r(  r  
list[Part]r	  GroundingMetadata | Noner|   rs   r   r   r   rv   r  dict[str, Any] | Noner   FinishReason | Nonec              	   C  s  g }t ||\}	}
|	r|
r||	 ||
 d }d }| D ]}|jr@t|jd}t|ts:tdd}|| ||_||_	|j
d urQt }t|j
||}n{|jd urd|d us\J t|j||}nh|jd urt|jdkrqq|jr{t|jd}nQt|jd}nJ|jr|jjd usJ t|jj|jjd}|jjd ur|jj|_n)|j }r|j}|j}|r|sJ dt||d}tt|d}nt d||| qt!|||||||d	S )
NrQ  r  rY  r   )r$  rV  rW  rX  z"Unsupported response from Gemini: )r  r|   r   r[  r\  rU  r   )"_map_grounding_metadatar   r]  r^  r_  r`  r   r*   rT  rU  rj  r   rk  rl  rm  rn  r  rc  rd  r)   rf  r   r+   rV  r  r&  r4  r2  r3  r   r   ri  r   r$   )r  r	  r|   rU  r   r   r  r   itemsweb_search_callweb_search_returnrA  ro  r.  rT  r4  r2  r3  r  rl   rl   rm   r    sd   










r  r   r3   rH   c                 C  s    | j }t| j| jp
d|d}|S )Nr  )r   rI  
parameters)parameters_json_schemarH   r   rI  )r   rJ  frl   rl   rm   r   d  s   r   function_names	list[str]rV   c                 C  s   t j}t|| d}t|dS )N)modeallowed_function_names)function_calling_config)rG   ANYrF   rV   )r  r  r  rl   rl   rm   r   n  s   
r   r   rJ   c              	   C  sL  | j }|d u rt S i }|j }r||d< |jpd }r!||d< |j }r*||d< d}d}d}d|jfd|jfd|jfd|j	ffD ]M\}	}
t
||	 d	|
u sRJ |
sUqB|
D ]7}|jr_|js`qW|j||j  d
|	 d< |jdkrtqW|
|ju r}|j}qW|
|ju r|j}qW|
|ju r|j}qWqBtj|jpd|jpd| |pd||||dS )Ncached_content_tokensr   thoughts_tokenstool_use_prompt_tokenspromptcacher  tool_use_prompt_tokens_details__tokensAUDIO)r   output_tokenscache_read_tokensinput_audio_tokensoutput_audio_tokenscache_audio_read_tokensdetails)usage_metadatar   r   cached_content_token_countthoughts_token_counttool_use_prompt_token_countprompt_tokens_detailscache_tokens_detailscandidates_tokens_detailstool_use_prompt_tokens_detailsgetattrmodalitytoken_countlowerprompt_token_countcandidates_token_count)r   metadatar  r  r  r  r  r  r  prefixmetadata_detailsdetailrl   rl   rm   r  t  sX   





r  rj  rB   r&  r   c                 C     t |tj| jdd|dS )Njsonr  )rU  r$  rV  r&  )r   r   rv  
model_dump)rj  rU  r&  rl   rl   rm   rl    s   
rl  rm  r=   r   c                 C  r  )Nr  r  )rU  r$  r  r&  )r   r   rv  r  )rm  rU  r&  rl   rl   rm   rn    s   
rn  Etuple[BuiltinToolCallPart, BuiltinToolReturnPart] | tuple[None, None]c                 C  s`   | r.| j  }r.t }t|tj|d|idt|tj|| j }r)dd |D dfS d dfS dS )Nqueries)rU  r$  r&  rV  c                 S  s    g | ]}|j r|j jd dqS )r  r  )webr  )r   rp  rl   rl   rm   r     s     z+_map_grounding_metadata.<locals>.<listcomp>)rU  r$  r&  r  NN)web_search_queriesr   rk  r   r   rv  r   grounding_chunks)r	  rU  r  r&  r  rl   rl   rm   r{    s(   r{  )r,  r$   rU  re   r   r?   r  )r  rw  r	  rx  r|   rs   rU  re   r   r   r   rv   r  ry  r   rz  r   r$   )r   r3   r   rH   )r  r  r   rV   )r   rJ   r   r   )rj  rB   rU  re   r&  re   r   r   )rm  r=   rU  re   r&  re   r   r   )r	  rx  rU  re   r   r  )
__future__r   _annotationsr^  collections.abcr   r   
contextlibr   dataclassesr   r   r   r	   typingr
   r   r   r   uuidr   typing_extensionsr   r  r   r   r   _outputr   _run_contextr   r   r   r   r   r   
exceptionsr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   profilesr/   	providersr0   r1   r{   r2   r   r3   r5   r6   r7   r8   r9   r:   google.genair;   google.genai.typesr<   r=   r>   r?   r@   rA   rB   rC   rD   GoogleFinishReasonrE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   ImportError_import_errorLatestGoogleModelNamesre   rs   FINISH_REASON_UNSPECIFIEDSTOP
MAX_TOKENSSAFETY
RECITATIONLANGUAGEOTHER	BLOCKLISTPROHIBITED_CONTENTSPIIMALFORMED_FUNCTION_CALLIMAGE_SAFETYUNEXPECTED_TOOL_CALLIMAGE_PROHIBITED_CONTENTNO_IMAGEr_   rk   r`   rp   r  r(  r  r   r   r  rl  rn  r{  rl   rl   rl   rm   <module>   s    X 	"$   F
}7
G



2
	