o
    i                     @  s   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 d dlmZ d dlmZmZmZmZmZ d dlmZ d dlZd dlZd d	lmZmZ d d
lmZmZmZ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) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlmFZFmGZGmHZHmIZImJZJmKZK ed ZL	 eMeLB ZN	 G dd deCddZOede
ddG dd deFZPdd#d$ZQG d%d& d&eZRe
G d'd( d(ZSe
G d)d* d*eHZTeUejVd+d,G d-d. d.eZWG d/d0 d0eZXG d1d2 d2eddZYG d3d" d"eddZZG d4d5 d5eZ[dd8d9Z\G d:d; d;eZ]G d<d= d=e]Z^G d>d? d?e]Z_G d@dA dAe]Z`G dBdC dCe]ZaG dDdE dEe]ZbG dFdG dGeZcG dHdI dIe]ZdddLdMZe	dddXdYZfG dZd[ d[eZgG d\d] d]eZhddbdcZiG ddde deeZjddhdiZkeee^eldjf eedeldkf B eeheldlf B ee`eldmf B eebeldnf B eeceldof B emekf ZnG dpdq dqeZoG drds dseZpG dtdu dueZqddwdxZrG dydz dzeZsdd}d~ZtG dd deZueUejVd+d,G dd deZvG dd deZwG dd deZxG dd deddZydddZzG dd deZ{G dd deZ|e}eWZ~e}evZej}eev ejVd+d,dZdddZdS )    )annotationsN)AsyncIteratorSequence)asynccontextmanager)	dataclassfield)datetime)	AnnotatedAnyLiteralProtocolcast)uuid4)USE_CLIENT_DEFAULTResponse)NotRequired	TypedDictassert_never
deprecated   )ModelHTTPErrorUnexpectedModelBehavior_utilsusage)OutputObjectDefinition)
RunContext)	UserError)BinaryContentBuiltinToolCallPartBuiltinToolReturnPart
CachePointFilePartFileUrlModelMessageModelRequestModelResponseModelResponsePartModelResponseStreamEventRetryPromptPartSystemPromptPartTextPartThinkingPartToolCallPartToolReturnPartUserPromptPartVideoUrl)ModelProfileSpec)Provider)ModelSettings)ToolDefinition   )ModelModelRequestParametersStreamedResponsecheck_allow_model_requestsdownload_itemget_user_agent)	zgemini-2.0-flashzgemini-2.0-flash-litezgemini-2.5-flashz gemini-2.5-flash-preview-09-2025zgemini-2.5-flash-litez%gemini-2.5-flash-lite-preview-09-2025zgemini-flash-latestzgemini-flash-lite-latestzgemini-2.5-proc                   @  s.   e Zd ZU dZded< 	 ded< 	 ded< dS )	GeminiModelSettingsz)Settings used for a Gemini model request.zlist[GeminiSafetySettings]gemini_safety_settingsThinkingConfiggemini_thinking_configdict[str, str]gemini_labelsN__name__
__module____qualname____doc____annotations__ rG   rG   _/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_ai/models/gemini.pyr;   E   s   
 r;   F)totalzYUse `GoogleModel` instead. See <https://ai.pydantic.dev/models/google/> for more details.)initc                      s"  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< eddZ
ded< dddddR fddZedSddZedTddZedSd d!ZdUd(d)Ze	dVdWd-d.ZdXd0d1ZdYd4d5ZedZd:d;Zd[d>d?Zd\dCdDZd]dFdGZd^dKdLZd_dPdQZ  ZS )`GeminiModela4  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)reprzhttpx.AsyncClientclientGeminiModelName_model_namezProvider[httpx.AsyncClient]	_providerzAuthProtocol | None_auth
str | None_url
google-glaN)providerprofilesettings
model_namerU   DLiteral['google-gla', 'google-vertex'] | Provider[httpx.AsyncClient]rV   ModelProfileSpec | NonerW   ModelSettings | Nonec                  st   || _ t|tr|dkrddlm} | }n	ddlm} | }|| _|j| _t| jj	| _
t j||p5|jd dS )aF  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[httpx.AsyncClient]`.
                If not provided, a new provider will be created using the other parameters.
            profile: The model profile to use. Defaults to a profile picked by the provider based on the model name.
            settings: Default model settings for this model instance.
        rT   r   )GoogleGLAProvider)GoogleVertexProvider)rW   rV   N)rO   
isinstancestr pydantic_ai.providers.google_glar\   #pydantic_ai.providers.google_vertexr]   rP   rM   base_urlrS   super__init__model_profile)selfrX   rU   rV   rW   r\   r]   	__class__rG   rH   rd   r   s   
zGeminiModel.__init__returnr_   c                 C  s   | j d us	J d| j S )NzURL not initialized)rS   rf   rG   rG   rH   rb      s   zGeminiModel.base_urlc                 C     | j S )zThe model name.rO   rj   rG   rG   rH   rX         zGeminiModel.model_namec                 C  s   | j jS )zThe model provider.)rP   namerj   rG   rG   rH   system   s   zGeminiModel.systemmessageslist[ModelMessage]model_settingsmodel_request_parametersr6   r%   c              	     s   t   | ||\}}| |dtt|pi |4 I d H }| I d H }t|}W d   I d H  n1 I d H s:w   Y  | |S )NF)	r8   prepare_request_make_requestr   r;   aread_gemini_response_tavalidate_json_process_response)rf   rp   rr   rs   http_responsedataresponserG   rG   rH   request   s   (
zGeminiModel.requestrun_contextRunContext[Any] | NoneAsyncIterator[StreamedResponse]c              	   C s   t   | ||\}}| |dtt|pi |4 I d H }| ||I d H V  W d   I d H  d S 1 I d H s9w   Y  d S )NT)r8   rt   ru   r   r;   _process_streamed_response)rf   rp   rr   rs   r~   rz   rG   rG   rH   request_stream   s   .zGeminiModel.request_stream_GeminiTools | Nonec                 C  s&   dd |j  D }|rt|dS d S )Nc                 S  s   g | ]}t |qS rG   )_function_from_abstract_tool.0trG   rG   rH   
<listcomp>       z*GeminiModel._get_tools.<locals>.<listcomp>)function_declarations)	tool_defsvalues_GeminiToolsrf   rs   toolsrG   rG   rH   
_get_tools   s   zGeminiModel._get_toolsr   _GeminiToolConfig | Nonec                 C  s$   |j s|rtdd |d D S d S )Nc                 S  s   g | ]}|d  qS )rn   rG   r   rG   rG   rH   r      r   z0GeminiModel._get_tool_config.<locals>.<listcomp>r   )allow_text_output_tool_configr   rG   rG   rH   _get_tool_config   s   
zGeminiModel._get_tool_configstreamedboolr;   AsyncIterator[HTTPResponse]c              	   C s  |  |}| ||}| ||I d H \}}t|d}	|r&td|d|	d< |d ur.||	d< |d ur6||	d< t|}
|jdkrZ|rEtdd	|
d
< |j}|d usRJ | 	||
d< n|jdkre|sed	|
d
< |
rk|
|	d< |
d }rv||	d< |
d }r| jjdkr||	d< d	t d}d| j d|rdnd }tj|	dd}| jjd||||
dtd4 I d H 3}|j }dkr| I d H  |dkrt|| j|jdtd | |j|V  W d   I d H  d S 1 I d H sw   Y  d S )!N)contentsuserrolepartssystemInstructionr   
toolConfignativezmGemini does not support `NativeOutput` and tools at the same time. Use `output_type=ToolOutput(...)` instead.zapplication/jsonresponse_mime_typeresponse_schemapromptedgenerationConfigr<   safetySettingsr@   zgoogle-vertexlabels)zContent-Typez
User-Agent/:streamGenerateContentgenerateContentT)by_aliasPOSTtimeout)contentheadersr      i  )status_coderX   bodyz Unexpected response from gemini )r   r   _message_to_gemini_content_GeminiRequest_GeminiTextContent_settings_to_generation_configoutput_moder   output_object_map_response_schemagetrP   rn   r:   rO   _gemini_request_ta	dump_jsonrM   streamr   r   rv   r   rX   textr   )rf   rp   r   rr   rs   r   tool_configsys_prompt_partsr   request_datageneration_configr   r<   r@   r   urlrequest_jsonrr   rG   rG   rH   ru      sd   



.zGeminiModel._make_requestr|   _GeminiResponsec                 C  s   d }t |d dkrtdd|d d vr/|d d ddkr(tdt|td	t||d d d d
 }|dd }|d d d}|rNd|i}t|}t||d| j|||dS )N
candidatesr4   z1Expected exactly one candidate in Gemini responser   r   finish_reasonSAFETYzSafety settings triggeredz*Content field missing from Gemini responser   	vendor_idmodel_version)r   vendor_details)lenr   r   r_   _metadata_as_usage_process_response_from_partsrO   )rf   r|   r   r   r   r   r   rG   rG   rH   ry     s,   zGeminiModel._process_responserz   HTTPResponser7   c           	        s   |  }d}t }|2 z/3 dH W }|| tjt|dd}|r;|d }|d r;|d d di dr;|} nq6 |du rEtd	t|| j	||| j
jd
S )zHProcess a streamed response, and prepare a streaming response to return.Ntrailing-stringsexperimental_allow_partialr   r   r   r   z5Streamed response ended without content or tool calls)rs   rO   _content_stream_provider_name)aiter_bytes	bytearrayextend_gemini_streamed_response_tarx   _ensure_decodeabler   r   GeminiStreamedResponserO   rP   rn   )	rf   rz   rs   r   start_responser   chunk	responseslastrG   rG   rH   r   /  s4   
"z&GeminiModel._process_streamed_response2tuple[list[_GeminiTextPart], list[_GeminiContent]]c           
        sF  g }g }|D ]}t |tr|g }|jD ]\}t |tr$|t|jd qt |tr5|| 	|I d H  qt |t
rF|t|j|  qt |trk|jd u r[|t| d qd| i}|t|j| qt| q|r{|td|d qt |tr|t| qt| q| || }	r|dt|	d ||fS )Nr   
call_errorr   r   r   )r^   r$   r   r)   append_GeminiTextPartr   r.   r   _map_user_promptr-   _response_part_from_response	tool_namemodel_response_objectr(   model_responser   _GeminiContentr%   _content_model_response_get_instructionsinsert)
rf   rp   rs   r   r   mmessage_partspartr|   instructionsrG   rG   rH   r   N  s8   









z&GeminiModel._message_to_gemini_contentr   r.   list[_GeminiPartUnion]c                   s2  t |jtrd|jigS g }|jD ]}t |tr!|d|i qt |tr<t|jd}|t	||j
dd qt |trT|jrTt|j|j
dd}|| qt |tr| jdksa|jr|t|dd	I d H }t	|d
 |d dd}|| qt|j|j
dd}|| qt |trqt| q|S )Nr   zutf-8)r{   	mime_type)inline_data)file_urir   )	file_datarT   base64)data_formatr{   	data_type)r^   r   r_   r   r   r   	b64encoder{   decode_GeminiInlineDataPart
media_typer/   
is_youtube_GeminiFileDataPartr   r"   ro   force_downloadr9   r    r   )rf   r   r   itembase64_encodedr   downloaded_itemr   rG   rG   rH   r   q  s8   





zGeminiModel._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copyrn   r  )rf   r  r   rG   rG   rH   r     s   


z GeminiModel._map_response_schema)rX   rN   rU   rY   rV   rZ   rW   r[   ri   r_   ri   rN   )rp   rq   rr   r[   rs   r6   ri   r%   N)
rp   rq   rr   r[   rs   r6   r~   r   ri   r   )rs   r6   ri   r   )rs   r6   r   r   ri   r   )
rp   rq   r   r   rr   r;   rs   r6   ri   r   )r|   r   ri   r%   )rz   r   rs   r6   ri   r7   )rp   rq   rs   r6   ri   r   )r   r.   ri   r   )r  r   ri   r  )rB   rC   rD   rE   r   rM   rF   rO   rP   rQ   rS   rd   propertyrb   rX   ro   r}   r   r   r   r   ru   ry   r   r   r   r   __classcell__rG   rG   rg   rH   rK   `   s<   
 #



@


#!rK   rr   ri   _GeminiGenerationConfigc           	      C  s   i }|  d }d ur||d< |  d }d ur||d< |  d }d ur)||d< |  d }d ur6||d< |  d }d urC||d< |  d }d urP||d< |  d }d ur]||d	< |S )
N
max_tokensmax_output_tokensstop_sequencestemperaturetop_ppresence_penaltyfrequency_penaltyr>   thinking_config)r   )	rr   configr  r  r  r  r  r  thinkingConfigrG   rG   rH   r     s    r   c                   @  s   e Zd ZdZdddZdS )AuthProtocolz.Abstract definition for Gemini authentication.ri   r?   c                   s   d S r  rG   rj   rG   rG   rH   r     s    zAuthProtocol.headersNri   r?   )rB   rC   rD   rE   r   rG   rG   rG   rH   r    s    r  c                   @  s$   e Zd ZU dZded< d	ddZdS )

ApiKeyAuthz@Authentication using an API key for the `X-Goog-Api-Key` header.r_   api_keyri   r?   c                   s   d| j iS )NzX-Goog-Api-Key)r  rj   rG   rG   rH   r     s   
zApiKeyAuth.headersNr  )rB   rC   rD   rE   rF   r   rG   rG   rG   rH   r    s   
 r  c                   @  s   e Zd ZU dZded< ded< ded< ded	< eejd
dZded< dddZ	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.rN   rO   r   r   zAsyncIterator[bytes]r   r_   r   F)default_factoryrJ   r   
_timestampri   'AsyncIterator[ModelResponseStreamEvent]c                  s   |   2 zd3 d H W }|d d }d|vrtd|d d D ]I d v r7| jjd  d d}|d ur6|V  qd v rV| jjt  d d	  d d
 d d}|d urU|V  qt fdddD shtd  qq6 d S )Nr   r   r   z&Streamed response has no content fieldr   r   )vendor_part_idr   function_callrn   args)r"  r   r$  tool_call_idc                   s   g | ]}| v qS rG   rG   )r   keygemini_partrG   rH   r     r   z>GeminiStreamedResponse._get_event_iterator.<locals>.<listcomp>)function_responsethoughtzUnexpected part: )_get_gemini_responsesr   _parts_managerhandle_text_deltahandle_tool_call_deltar   anyAssertionError)rf   gemini_response	candidatemaybe_eventrG   r'  rH   _get_event_iterator  s8   

z*GeminiStreamedResponse._get_event_iteratorAsyncIterator[_GeminiResponse]c                 C s   g }d}| j 2 z,3 d H W }| j| tjt| jdd}|d d }||d  D ]	}|d7 }|V  q*q6 |rF|d }t|| _|V  d S d S )Nr   r   r   r   r4   )r   r   r   r   rx   r   r   _usage)rf   gemini_responsescurrent_gemini_response_indexr   responses_to_yieldr   rG   rG   rH   r+    s(   

z,GeminiStreamedResponse._get_gemini_responsesc                 C  rk   )z#Get the model name of the response.rl   rj   rG   rG   rH   rX   	  rm   z!GeminiStreamedResponse.model_namec                 C  rk   )zGet the provider name.)r   rj   rG   rG   rH   provider_name  rm   z$GeminiStreamedResponse.provider_namec                 C  rk   )z"Get the timestamp of the response.)r   rj   rG   rG   rH   	timestamp  rm   z GeminiStreamedResponse.timestampN)ri   r!  )ri   r5  r  r  )ri   r   )rB   rC   rD   rE   rF   r   r   now_utcr   r4  r+  r  rX   r:  r;  rG   rG   rG   rH   r     s   
 

!r   T)defer_buildc                   @  sL   e Zd ZU dZded< ded< ded< ded	< d
ed< 	 ded< ded< dS )r   zSchema for an API request to the Gemini API.

    See <https://ai.google.dev/api/generate-content#request-body> for API docs.
    zlist[_GeminiContent]r   zNotRequired[_GeminiTools]r   zNotRequired[_GeminiToolConfig]r   z'NotRequired[list[GeminiSafetySettings]]r   zNotRequired[_GeminiTextContent]r   z$NotRequired[_GeminiGenerationConfig]r   zNotRequired[dict[str, str]]r   NrA   rG   rG   rG   rH   r     s   
 r   c                   @  $   e Zd ZU dZded< 	 ded< dS )GeminiSafetySettingsa&  Safety settings options for Gemini model request.

    See [Gemini API docs](https://ai.google.dev/gemini-api/docs/safety-settings) for safety category and threshold descriptions.
    For an example on how to use `GeminiSafetySettings`, see [here](../../agents.md#model-specific-settings).
    zLiteral['HARM_CATEGORY_UNSPECIFIED', 'HARM_CATEGORY_HARASSMENT', 'HARM_CATEGORY_HATE_SPEECH', 'HARM_CATEGORY_SEXUALLY_EXPLICIT', 'HARM_CATEGORY_DANGEROUS_CONTENT', 'HARM_CATEGORY_CIVIC_INTEGRITY']categoryzLiteral['HARM_BLOCK_THRESHOLD_UNSPECIFIED', 'BLOCK_LOW_AND_ABOVE', 'BLOCK_MEDIUM_AND_ABOVE', 'BLOCK_ONLY_HIGH', 'BLOCK_NONE', 'OFF']	thresholdNrA   rG   rG   rG   rH   r?  5  s   
 r?  c                   @  r>  )r=   z$The thinking features configuration.z8Annotated[bool, pydantic.Field(alias='includeThoughts')]include_thoughtsz6Annotated[int, pydantic.Field(alias='thinkingBudget')]thinking_budgetNrA   rG   rG   rG   rH   r=   U  s   
 r=   c                   @  sZ   e Zd ZU dZded< ded< ded< ded< ded< d	ed
< ded< ded< ded< dS )r  zSchema for an API request to the Gemini API.

    Note there are many additional fields available that have not been added yet.

    See <https://ai.google.dev/api/generate-content#generationconfig> for API docs.
    intr  floatr  r  r  r  	list[str]r  r=   r  r_   r   r  r   NrA   rG   rG   rG   rH   r  _  s   
 c                   @     e Zd ZU ded< ded< dS )r   Literal['user', 'model']r   r   r   NrB   rC   rD   rF   rG   rG   rG   rH   r   r     
 r   r   r%   c                 C  s   g }| j D ]9}t|tr|t| qt|trqt|tr,|jr+|t|jd qt|t	t
B r4qt|tr:qt| qtd|dS )Nr   modelr   )r   r^   r,   r   _function_call_part_from_callr+   r*   r   r   r   r   r!   r   r   )r   r   r  rG   rG   rH   r   w  s    





r   c                   @     e Zd ZU ded< dS )	_BasePartNotRequired[bool]r*  NrI  rG   rG   rG   rH   rN    s   
 rN  c                   @  rM  )r   r_   r   NrI  rG   rG   rG   rH   r        
 r   c                   @  rG  )_GeminiInlineDatar_   r{   0Annotated[str, pydantic.Field(alias='mimeType')]r   NrI  rG   rG   rG   rH   rQ    rJ  rQ  c                   @  s   e Zd ZU dZded< dS )r   z-See <https://ai.google.dev/api/caching#Blob>.z@Annotated[_GeminiInlineData, pydantic.Field(alias='inlineData')]r   NrA   rG   rG   rG   rH   r     s   
 r   c                   @  "   e Zd ZU dZded< ded< dS )_GeminiFileDataz1See <https://ai.google.dev/api/caching#FileData>.z/Annotated[str, pydantic.Field(alias='fileUri')]r   rR  r   NrA   rG   rG   rG   rH   rT       
 rT  c                   @  rM  )r   z<Annotated[_GeminiFileData, pydantic.Field(alias='fileData')]r   NrI  rG   rG   rG   rH   r     rP  r   c                   @  rG  )_GeminiThoughtPartr   r*  z8Annotated[str, pydantic.Field(alias='thoughtSignature')]thought_signatureNrI  rG   rG   rG   rH   rV    rJ  rV  c                   @  rM  )_GeminiFunctionCallPartzDAnnotated[_GeminiFunctionCall, pydantic.Field(alias='functionCall')]r#  NrI  rG   rG   rG   rH   rX    rP  rX  toolr,   c                 C  s   t t| j|  ddS )N)rn   r$  )r#  )rX  _GeminiFunctionCallr   args_as_dict)rY  rG   rG   rH   rL    s   rL  r   Sequence[_GeminiPartUnion]rX   rN   r   usage.RequestUsager   rR   r   dict[str, Any] | Nonec                 C  s   g }| D ]B}d|v r%| dr|t|d d q|t|d d qd|v r;|t|d d |d d d qd|v rFtd	|qt|||||d
S )Nr   r*  )r   r#  rn   r$  )r   r$  r)  zXUnsupported response from Gemini, expected all parts to be function calls or text, got: )r   r   rX   provider_response_idprovider_details)r   r   r+   r*   r,   r   r%   )r   rX   r   r   r   itemsr   rG   rG   rH   r     s    
$
r   c                   @  rS  )rZ  z5See <https://ai.google.dev/api/caching#FunctionCall>.r_   rn   r  r$  NrA   rG   rG   rG   rH   rZ    rU  rZ  c                   @  rM  )_GeminiFunctionResponsePartzLAnnotated[_GeminiFunctionResponse, pydantic.Field(alias='functionResponse')]r)  NrI  rG   rG   rG   rH   rb    rP  rb  rn   r_   r|   r  c                 C  s   t t| |ddS )Nrn   r|   )r)  )rb  _GeminiFunctionResponserc  rG   rG   rH   r     s   r   c                   @  rS  )rd  z9See <https://ai.google.dev/api/caching#FunctionResponse>.r_   rn   r  r|   NrA   rG   rG   rG   rH   rd    rU  rd  vr
   c                 C  sf   t | tr1d| v rdS d| v rdS d| v rdS d| v rdS d| v s%d| v r'dS d	| v s/d
| v r1d
S dS )Nr   
inlineDatar   fileDatar   r*  functionCallr#  functionResponser)  )r^   dict)re  rG   rG   rH   _part_discriminator  s   
rk  r   r#  r)  r   r   r*  c                   @  rG  )r   rH  r   zlist[_GeminiTextPart]r   NrI  rG   rG   rG   rH   r   
  rJ  r   c                   @  rM  )r   zNAnnotated[list[_GeminiFunction], pydantic.Field(alias='functionDeclarations')]r   NrI  rG   rG   rG   rH   r     rP  r   c                   @  s&   e Zd ZU ded< ded< ded< dS )_GeminiFunctionr_   rn   r  zNotRequired[dict[str, Any]]
parametersNrI  rG   rG   rG   rH   rl    s
   
 rl  r3   c                 C  s    | j }t| j| jp
d|d}|S )N )rn   r  rm  )parameters_json_schemarl  rn   r  )rY  r	  frG   rG   rH   r     s   r   c                   @  rM  )_GeminiToolConfig_GeminiFunctionCallingConfigfunction_calling_configNrI  rG   rG   rG   rH   rq  %  rP  rq  function_namesrF  c                 C  s   t td| ddS )NANY)modeallowed_function_names)rs  )rq  rr  )rt  rG   rG   rH   r   )  s   
r   c                   @  rG  )rr  zLiteral['ANY', 'AUTO']rv  rF  rw  NrI  rG   rG   rG   rH   rr  /  rJ  rr  c                   @  s:   e Zd ZU dZded< ded< ded< ded	< d
ed< dS )r   zSchema for the response from the Gemini API.

    See <https://ai.google.dev/api/generate-content#v1beta.GenerateContentResponse>
    and <https://cloud.google.com/vertex-ai/docs/reference/rest/v1/GenerateContentResponse>
    zlist[_GeminiCandidates]r   zSNotRequired[Annotated[_GeminiUsageMetaData, pydantic.Field(alias='usageMetadata')]]usage_metadatazUNotRequired[Annotated[_GeminiPromptFeedback, pydantic.Field(alias='promptFeedback')]]prompt_feedbackzANotRequired[Annotated[str, pydantic.Field(alias='modelVersion')]]r   z?NotRequired[Annotated[str, pydantic.Field(alias='responseId')]]r   NrA   rG   rG   rG   rH   r   4  s   
 r   c                   @  s<   e Zd ZU dZded< ded< 	 ded< ded	< d
ed< dS )_GeminiCandidateszBSee <https://ai.google.dev/api/generate-content#v1beta.Candidate>.zNotRequired[_GeminiContent]r   zeNotRequired[Annotated[Literal['STOP', 'MAX_TOKENS', 'SAFETY'], pydantic.Field(alias='finishReason')]]r   zBNotRequired[Annotated[float, pydantic.Field(alias='avgLogProbs')]]avg_log_probszNotRequired[int]indexzXNotRequired[Annotated[list[_GeminiSafetyRating], pydantic.Field(alias='safetyRatings')]]safety_ratingsNrA   rG   rG   rG   rH   rz  D  s   
 rz  c                   @  rS  )_GeminiModalityTokenCountzDSee <https://ai.google.dev/api/generate-content#modalitytokencount>.z{Annotated[Literal['MODALITY_UNSPECIFIED', 'TEXT', 'IMAGE', 'VIDEO', 'AUDIO', 'DOCUMENT'], pydantic.Field(alias='modality')]modalityz=Annotated[int, pydantic.Field(alias='tokenCount', default=0)]token_countNrA   rG   rG   rG   rH   r~  R  s   
 r~  c                   @  sb   e Zd ZU dZded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< dS )_GeminiUsageMetaDatazSee <https://ai.google.dev/api/generate-content#UsageMetadata>.

    The docs suggest all fields are required, but some are actually not required, so we assume they are all optional.
    z8Annotated[int, pydantic.Field(alias='promptTokenCount')]prompt_token_countzINotRequired[Annotated[int, pydantic.Field(alias='candidatesTokenCount')]]candidates_token_countz7Annotated[int, pydantic.Field(alias='totalTokenCount')]total_token_countzLNotRequired[Annotated[int, pydantic.Field(alias='cachedContentTokenCount')]]cached_content_token_countzGNotRequired[Annotated[int, pydantic.Field(alias='thoughtsTokenCount')]]thoughts_token_countzLNotRequired[Annotated[int, pydantic.Field(alias='toolUsePromptTokenCount')]]tool_use_prompt_token_countzdNotRequired[Annotated[list[_GeminiModalityTokenCount], pydantic.Field(alias='promptTokensDetails')]]prompt_tokens_detailszcNotRequired[Annotated[list[_GeminiModalityTokenCount], pydantic.Field(alias='cacheTokensDetails')]]cache_tokens_detailszhNotRequired[Annotated[list[_GeminiModalityTokenCount], pydantic.Field(alias='candidatesTokensDetails')]]candidates_tokens_detailszkNotRequired[Annotated[list[_GeminiModalityTokenCount], pydantic.Field(alias='toolUsePromptTokensDetails')]]tool_use_prompt_tokens_detailsNrA   rG   rG   rG   rH   r  [  s   
 r  c              	   C  s>  |  d}|d u rt S i }| dd }r||d< | dd }r'||d< | dd }r3||d< d}d}d}| D ]K\}	}
|	d	r|
rttt |
}
|	d	}|
D ]1}|d
 }| dd ||	  d| < }|r|dkr|	dkrz|}qV|	dkr|}qV|	dkr|}qVq=tj| dd| dd| |||||dS )Nrx  r  r   cached_content_tokensr  thoughts_tokensr  tool_use_prompt_tokens_detailsr  r  _AUDIOr  r  r  r  r  )input_tokensoutput_tokenscache_read_tokensinput_audio_tokensoutput_audio_tokenscache_audio_read_tokensdetails)
r   r   RequestUsagera  endswithr   listr~  removesuffixlower)r|   metadatar  r  r  r  r  r  r  r&  metadata_detailssuffixdetailr  valuerG   rG   rH   r   u  sJ   

"
r   c                   @  s*   e Zd ZU dZded< ded< ded< dS )	_GeminiSafetyRatingzKSee <https://ai.google.dev/gemini-api/docs/safety-settings#safety-filters>.zLiteral['HARM_CATEGORY_HARASSMENT', 'HARM_CATEGORY_HATE_SPEECH', 'HARM_CATEGORY_SEXUALLY_EXPLICIT', 'HARM_CATEGORY_DANGEROUS_CONTENT', 'HARM_CATEGORY_CIVIC_INTEGRITY']r@  z.Literal['NEGLIGIBLE', 'LOW', 'MEDIUM', 'HIGH']probabilityrO  blockedNrA   rG   rG   rG   rH   r    s
   
 r  c                   @  rS  )_GeminiPromptFeedbackzPSee <https://ai.google.dev/api/generate-content#v1beta.GenerateContentResponse>.z3Annotated[str, pydantic.Field(alias='blockReason')]block_reasonzKAnnotated[list[_GeminiSafetyRating], pydantic.Field(alias='safetyRatings')]r}  NrA   rG   rG   rG   rH   r    rU  r  )r  r   r   c              
   C  sB   z|    W | S  ty  } z| d|j W  Y d}~S d}~ww )zTrim any invalid unicode point bytes off the end of a bytearray.

    This is necessary before attempting to parse streaming JSON bytes.

    This is a temporary workaround until https://github.com/pydantic/pydantic-core/issues/1633 is resolved
    N)r   UnicodeDecodeErrorstart)r   erG   rG   rH   r     s   
r   )rr   r;   ri   r  )r   r%   ri   r   )rY  r,   ri   rX  r  )r   r\  rX   rN   r   r]  r   rR   r   r^  ri   r%   )rn   r_   r|   r  ri   rb  )re  r
   ri   r_   )rY  r3   ri   rl  )rt  rF  ri   rq  )r|   r   ri   r]  )r   r   ri   r   )
__future__r   _annotationsr   collections.abcr   r   
contextlibr   dataclassesr   r   r   typingr	   r
   r   r   r   uuidr   httpxpydanticr   r   r   typing_extensionsr   r   r   r   rn  r   r   r   r   _outputr   _run_contextr   
exceptionsr   rp   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   profilesr0   	providersr1   rW   r2   r   r3   r5   r6   r7   r8   r9   r:   LatestGeminiModelNamesr_   rN   r;   rK   r   r  r  r   with_config
ConfigDictr   r?  r=   r  r   r   rN  r   rQ  r   rT  r   rV  rX  rL  r   rZ  rb  r   rd  rk  TagDiscriminator_GeminiPartUnionr   r   rl  r   rq  r   rr  r   rz  r~  r  r   r  r  TypeAdapterr   rw   r  r   r   rG   rG   rG   rH   <module>   s    T   
<
] 


	



	
+

