
    gIp              	         d dl mZ d dlZd dl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mZmZmZ d dlZd dlZd d	lmZ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*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl$m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? ed   Z@	  ed       G d de:             ZA G d de      ZBe G d d             ZC ed       G d de8             ZDe G d de<             ZEe G d d e;             ZF ej                   ej                  d!"             G d# d$e!             ZI G d% d&e!d'      ZJ G d( d)e!      ZKdYd*ZL G d+ d,e!      ZM G d- d.e!      ZNdZd/ZOd[d\d0ZP G d1 d2e!      ZQ G d3 d4e!      ZRd]d5ZS G d6 d7e!      ZTd^d8ZUeeeeM ej                  d9      f   eeN ej                  d:      f   eeR ej                  d;      f   f    ej                  eU      f   ZX G d< d=e!      ZY G d> d?e!      ZZ G d@ dAe!      Z[d_dBZ\ G dC dDe!      Z]d`dEZ^ G dF dGe!      Z_ ej                   ej                  d!"             G dH dIe!             Z`	 	 	 	 dadJZadbdKZbdcdLZc G dM dNe!      Zd G dO dPe!d'      ZedddQZf G dR dSe!      Zg G dT dUe!      Zh ej                  eI      Zj ej                  e`      Zk ej                  ele`    ej                  d!"      V      Zm G dW dX      Zny)e    )annotationsN)AsyncIteratorIterableSequence)asynccontextmanager)deepcopy)	dataclassfield)datetime)	AnnotatedAnyLiteralProtocolUnion)USE_CLIENT_DEFAULTAsyncClientResponse)NotRequired	TypedDict	TypeGuardassert_never   )UnexpectedModelBehavior_utils
exceptionsresult)
ModelMessageModelRequestModelResponseModelResponsePartRetryPromptPartSystemPromptPartTextPartToolCallPartToolReturnPartUserPromptPart)ModelSettings)ToolDefinition   )
AgentModelEitherStreamedResponseModelStreamStructuredResponseStreamTextResponsecached_async_http_clientcheck_allow_model_requestsget_user_agent)zgemini-1.5-flashzgemini-1.5-flash-8bzgemini-1.5-prozgemini-1.0-prozgemini-2.0-flash-expF)initc                  z    e Zd ZU dZded<   ded<   ded<   ded	<   d
d
dd	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddZy
)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.
    GeminiModelName
model_nameAuthProtocolauthAsyncHTTPClienthttp_clientstrurlNz@https://generativelanguage.googleapis.com/v1beta/models/{model}:)api_keyr:   url_templatec                   || _         |/t        j                  d      x}r|}nt        j                  d      t        |      | _        |xs
 t               | _        |j                  |      | _
        y)a  Initialize a Gemini model.

        Args:
            model_name: The name of the model to use.
            api_key: The API key to use for authentication, if not provided, the `GEMINI_API_KEY` environment variable
                will be used if available.
            http_client: An existing `httpx.AsyncClient` to use for making HTTP requests.
            url_template: The URL template to use for making requests, you shouldn't need to change this,
                docs [here](https://ai.google.dev/gemini-api/docs/quickstart?lang=rest#make-first-request),
                `model` is substituted with the model name, and `function` is added to the end of the URL.
        NGEMINI_API_KEYzJAPI key must be provided or set in the GEMINI_API_KEY environment variable)model)r6   osgetenvr   	UserError
ApiKeyAuthr8   r/   r:   formatr<   )selfr6   r=   r:   r>   env_api_keys         N/var/www/openai/venv/lib/python3.12/site-packages/pydantic_ai/models/gemini.py__init__zGeminiModel.__init__C   sn    & %? ii(899{9% **+wxxw'	&D*B*D&&Z&8    c          	     ~   K   t        | j                  | j                  | j                  | j                  |||      S w)N)r:   r6   r8   r<   function_toolsallow_text_resultresult_tools)GeminiAgentModelr:   r6   r8   r<   )rG   rM   rN   rO   s       rI   agent_modelzGeminiModel.agent_model`   s<       (()/%
 	
s   ;=c                     d| j                    S )Nzgoogle-gla:)r6   rG   s    rI   namezGeminiModel.nameq   s    T__-..rK   )r6   r5   r=   z
str | Noner:   zAsyncHTTPClient | Noner>   r;   )rM   list[ToolDefinition]rN   boolrO   rU   returnrP   )rW   r;   )__name__
__module____qualname____doc____annotations__rJ   rQ   rT    rK   rI   r4   r4   4   s      
  	H #.2^9#9 	9
 ,9 9:
 -
  	

 +
 

"/rK   r4   c                      e Zd ZdZddZy)r7   z.Abstract definition for Gemini authentication.c                   K   y wNr]   rS   s    rI   headerszAuthProtocol.headersx   s     ss   NrW   zdict[str, str])rX   rY   rZ   r[   ra   r]   rK   rI   r7   r7   u   s    82rK   r7   c                  $    e Zd ZU dZded<   ddZy)rE   z@Authentication using an API key for the `X-Goog-Api-Key` header.r;   r=   c                &   K   d| j                   iS w)NzX-Goog-Api-Key)r=   rS   s    rI   ra   zApiKeyAuth.headers   s      $,,//s   Nrb   )rX   rY   rZ   r[   r\   ra   r]   rK   rI   rE   rE   {   s    JL0rK   rE   c                     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dZ	 	 	 	 	 	 ddZe	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 dd       Z	e
dd       Ze
dd       Ze	 	 	 	 dd       Zy)rP   z1Implementation of `AgentModel` for Gemini models.r9   r:   r5   r6   r7   r8   z_GeminiTools | Nonetoolsz_GeminiToolConfig | Nonetool_configr;   r<   c                T   t                |D cg c]  }t        |       }	}|r|	|D cg c]  }t        |       c}z  }	|rd }
nt        |	D cg c]  }|d   	 c}      }
|| _        || _        || _        |	rt        |	      nd | _        |
| _        || _	        y c c}w c c}w c c}w )NrT   )function_declarations)
r0   _function_from_abstract_tool_tool_configr:   r6   r8   _GeminiToolsrf   rg   r<   )rG   r:   r6   r8   r<   rM   rN   rO   trf   rg   s              rI   rJ   zGeminiAgentModel.__init__   s     	#$:HI.Q-a0.I|L|!215|LLEK&5'A5a&	5'ABK&$	BG\>T
& JL
 (Bs   BB B%c                &  K   | j                  |d|      4 d {   }t        j                  |j                          d {         }d d d       d {    | j	                        t        |      fS 7 [7 67 $# 1 d {  7  sw Y   4xY ww)NF)_make_request_gemini_response_tavalidate_jsonaread_process_response_metadata_as_usage)rG   messagesmodel_settingshttp_responseresponses        rI   requestzGeminiAgentModel.request   s{      %%h~FF-*88}?R?R?T9TUH GF%%h/1CH1MMM G9T GFFFsV   BA6B#A<A8
A<
BA:!B8A<:B<BBB
Bc                  K   | j                  |d|      4 d {   }| j                  |       d {    d d d       d {    y 7 17 7 	# 1 d {  7  sw Y   y xY ww)NT)ro   _process_streamed_response)rG   ru   rv   rw   s       rI   request_streamzGeminiAgentModel.request_stream   sT      %%hnEE77FFF FEEF FEEEsS   A'AA'AAAA'AA'AA'A$AA$ A'c           
      K   | j                  |      \  }}t        |      }|rt        d|      |d<   | j                  | j                  |d<   | j                  | j                  |d<   i }|rH|j                  d      x}||d<   |j                  d	      x}	|	|d	<   |j                  d
      x}
|
|d
<   |r||d<   | j                  |rdndz   }dt               d| j                  j                          d {   }t        j                  |d      }| j                  j                  d||||xs i j                  dt                    4 d {   }|j                  dk7  rE|j!                          d {    t#        j$                  d|j                   |j&                        | d d d       d {    y 7 7 p7 K7 # 1 d {  7  sw Y   y xY ww)N)contentsuserrolepartssystem_instructionrf   rg   
max_tokensmax_output_tokenstemperaturetop_pgeneration_configstreamGenerateContentgenerateContentzapplication/json)zContent-Typez
User-AgentT)by_aliasPOSTtimeout)contentra   r      z Unexpected response from gemini )_message_to_gemini_content_GeminiRequest_GeminiTextContentrf   rg   getr<   r1   r8   ra   _gemini_request_ta	dump_jsonr:   streamr   status_coderr   r   r   text)rG   ru   streamedrv   sys_prompt_partsr~   request_datar   r   r   r   r<   ra   request_jsonrs                  rI   ro   zGeminiAgentModel._make_request   s     &*%D%DX%N"(%x81CWg1hL-.::!$(JJL!'*.*:*:L'57,00>>
K9C!"56-11-@@M3>!-0'++G44A-2!'*0AL,-hhX1CTU /(*
 II%%''
 *33L43P##** #)r..y:LM + 
 
 }}#ggi 88;[\]\i\i[j9kmnmsmsttG
 
 
 (

  
 
 
 
sm   C8G:G;AGGG#G
:G;6G
1G<G=GGG
G
GGGGc                l    t        | d         dk7  rt        d      | d   d   d   d   }t        |      S )N
candidatesr)   1Expected exactly one candidate in Gemini responser   r   r   )lenr   _process_response_from_partsrx   r   s     rI   rs   z"GeminiAgentModel._process_response   sD    x%&!+)*]^^&q))4W=+E22rK   c                p  K   | j                         }d}t               }|2 3 d{   }|j                  |       t        j	                  |d      }|s4|d   }|d   s?|d   d   d   d   sN|} |t        d	      t        |      j                         rt        ||
      S t        ||      S 7 6 Dw)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)_content_stream)_json_contentr   )
aiter_bytes	bytearrayextend_gemini_streamed_response_tarq   r   _extract_response_partsis_leftGeminiStreamStructuredResponseGeminiStreamTextResponse)rw   r   start_responser   chunk	responseslasts          rI   r{   z+GeminiAgentModel._process_streamed_response   s      $//115+& 
	%NN5!4BB+= C I  }%$|*<Q*?	*J7*S%)N!)*abb #>2::<17KXX+';WW'
	;s8   B6B4B2B4+B6
B6 B6/AB62B44B6c           	        g }g }|D ]  }t        |t              rqg }|j                  D ]=  }t        |t              r&|j	                  t        |j                               :t        |t              r&|j	                  t        |j                               pt        |t              r4|j	                  t        |j                  |j                                      t        |t              ro|j                  *|j	                  t        |j                                      d|j                         i}|j	                  t        |j                  |             3t        |       @ |sh|j	                  t        d|             t        |t               r|j	                  t#        |             t        |        ||fS )Nr   
call_errorr   r   )
isinstancer   r   r"   append_GeminiTextPartr   r&   r%   _response_part_from_response	tool_namemodel_response_objectr!   model_responser   _GeminiContentr   _content_model_response)clsru   r   r~   mmessage_partspartrx   s           rI   r   z+GeminiAgentModel._message_to_gemini_content  sU    35)+A!\*8:GGD!$(89(//T\\0RS#D.9%,,_$,,-OP#D.9%,,-I$..Z^ZtZtZv-wx#D/:>>1)00dFYFYF[1\](4d6I6I6K'LH)001Mdnn^f1gh$T* $  !OONm$TUA}- 7 :;Q3 6  ))rK   N)r:   r9   r6   r5   r8   r7   r<   r;   rM   rU   rN   rV   rO   rU   )ru   list[ModelMessage]rv   ModelSettings | NonerW   z"tuple[ModelResponse, result.Usage])ru   r   rv   r   rW   z%AsyncIterator[EitherStreamedResponse])ru   r   r   rV   rv   r   rW   zAsyncIterator[HTTPResponse])rx   _GeminiResponserW   r   )rw   HTTPResponserW   r+   )ru   r   rW   z2tuple[list[_GeminiTextPart], list[_GeminiContent]])rX   rY   rZ   r[   r\   rJ   ry   r   r|   ro   staticmethodrs   r{   classmethodr   r]   rK   rI   rP   rP      sF   ;  
))	H$ $ 	
  -   +6N*N<PN	+N G*G<PG	.G G ,*,6:,L`,	$, ,\ 3 3 X X6  *) *	; *  *rK   rP   c                      e Zd ZU dZded<   ded<   dZded<    eej                  d	
      Z	ded<    ee
j                  d	
      Zded<   ddZd	dddZddZddZy)r   z<Implementation of `StreamTextResponse` for the Gemini model.r   r   AsyncIterator[bytes]r   r   int	_positionFdefault_factoryr2   r   
_timestampresult.Usage_usagec                   K   | j                   j                          d {   }| j                  j                  |       y 7  wr`   )r   	__anext__r   r   rG   r   s     rI   r   z"GeminiStreamTextResponse.__anext__:  s4     ll,,..!!%( /   AA!Afinalc             #    K   |rTt        j                  | j                        }|| j                  d  }t	        |      | _        t
        j                  |      }nZt        j                  | j                  d      }|| j                  d }t	        |      dz
  | _        t
        j                  |d      }|D ]R  }| xj                  t        |      z  c_        |d   d   d	   d
   }t        |      r|D ]	  }|d     It        d       y w)NT)allow_partialr   r)   r   r   r   r   r   r   r   zHStreamed response with unexpected content, expected all parts to be text)pydantic_core	from_jsonr   r   r   r   validate_pythonr   rt   _all_text_partsr   )rG   r   	all_items	new_itemsnew_responsesr   r   r   s           rI   r   zGeminiStreamTextResponse.get>  s    %//0B0BCI!$.."23I ^DN8HHSM%//0B0BRVWI!$..26I ^a/DN8HH6H I M AKK-a00KlOA&y1':Eu%!Dv,& " .^  s   D	Dc                    | j                   S r`   r   rS   s    rI   usagezGeminiStreamTextResponse.usageV      {{rK   c                    | j                   S r`   r   rS   s    rI   	timestampz"GeminiStreamTextResponse.timestampY      rK   NrW   None)r   rV   rW   zIterable[str]rW   r   rW   r   )rX   rY   rZ   r[   r\   r   r
   r   now_utcr   r   Usager   r   r   r   r   r]   rK   rI   r   r   0  s^    F!!Is eLJL EJFLJ) $) 0rK   r   c                      e Zd ZU dZded<   ded<    eej                  d      Zded	<    ee	j                  d      Zd
ed<   ddZddddZddZddZy)r   zBImplementation of `StreamStructuredResponse` for the Gemini model.r   r   r   r   Fr   r   r   r   r   c                   K   | j                   j                          d {   }| j                  j                  |       y 7  wr`   )r   r   r   r   r   s     rI   r   z(GeminiStreamStructuredResponse.__anext__f  s2     ll,,..U# /r   r   c               8   t         j                  | j                  |rdnd      }g }t        j                         | _        |D ]?  }| xj
                  t        |      z  c_        |d   d   }|j                  |d   d          A t        || j                        S )	am  Get the `ModelResponse` at this point.

        NOTE: It's not clear how the stream of responses should be combined because Gemini seems to always
        reply with a single response, when returning a structured data.

        I'm therefore assuming that each part contains a complete tool call, and not trying to combine data from
        separate parts.
        offr   r   r   r   r   r   r   )
r   rq   r   r   r   r   rt   r   r   r   )rG   r   r   combined_partsr   	candidates         rI   r   z"GeminiStreamStructuredResponse.getj  s     1>>MM05u;M ? 
	 24llnAKK-a00K,*I!!)I"6w"?@  ,NdooVVrK   c                    | j                   S r`   r   rS   s    rI   r   z$GeminiStreamStructuredResponse.usage  r   rK   c                    | j                   S r`   r   rS   s    rI   r   z(GeminiStreamStructuredResponse.timestamp  r   rK   Nr   )r   rV   rW   r   r   r   )rX   rY   rZ   r[   r\   r
   r   r   r   r   r   r   r   r   r   r   r]   rK   rI   r   r   ]  sU    L!! eLJL EJFLJ$ $) W*rK   r   T)defer_buildc                  F    e Zd ZU dZded<   ded<   ded<   ded	<   	 d
ed<   y)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]rf   zNotRequired[_GeminiToolConfig]rg   zNotRequired[_GeminiTextContent]r   z$NotRequired[_GeminiGenerationConfig]r   NrX   rY   rZ   r[   r\   r]   rK   rI   r   r     s.    
 #"$$//77 <;rK   r   c                  0    e Zd ZU dZded<   ded<   ded<   y)_GeminiGenerationConfigzSchema 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.
    r   r   floatr   r   Nr   r]   rK   rI   r  r    s     LrK   r  )totalc                  "    e Zd ZU ded<   ded<   y)r   Literal['user', 'model']r   list[_GeminiPartUnion]r   NrX   rY   rZ   r\   r]   rK   rI   r   r     s    
""!!rK   r   c                4   g }| j                   D ]{  }t        |t              r|j                  t	        |             .t        |t
              r3|j                  sK|j                  t        |j                               qt        |       } t        d|      S )Nr   rA   r   )
r   r   r$   r   _function_call_part_from_callr#   r   r   r   r   )r   r   items      rI   r   r     sn    $&EdL)LL6t<=h'||_$,,?@  we44rK   c                      e Zd ZU ded<   y)r   r;   r   Nr  r]   rK   rI   r   r     s    
IrK   r   c                      e Zd ZU ded<   y)_GeminiFunctionCallPartzDAnnotated[_GeminiFunctionCall, pydantic.Field(alias='functionCall')]function_callNr  r]   rK   rI   r  r    s    WWrK   r  c                `    t        t        | j                  | j                                     S )N)rT   args)r  )r  _GeminiFunctionCallr   args_as_dict)tools    rI   r	  r	    s#    "1D$.._c_p_p_r1sttrK   c                B   g }| D ]v  }d|v r|j                  t        |d                %d|v r2|j                  t        j                  |d   d   |d   d                [d|v s`t	        j
                  d|       t        ||xs t        j                               S )Nr   r  rT   r  function_responseXUnsupported response from Gemini, expected all parts to be function calls or text, got: r   )	r   r#   r$   from_raw_argsr   r   r   r   r   )r   r   itemsr   s       rI   r   r     s    %'ET>LL$v,/0$LL33D4I&4QSWXgShioSpqr D(44jkojrs   )*Gv~~7GHHrK   c                  &    e Zd ZU dZded<   ded<   y)r  z5See <https://ai.google.dev/api/caching#FunctionCall>.r;   rT   dict[str, Any]r  Nr   r]   rK   rI   r  r    s    ?
I
rK   r  c                      e Zd ZU ded<   y)_GeminiFunctionResponsePartzLAnnotated[_GeminiFunctionResponse, pydantic.Field(alias='functionResponse')]r  Nr  r]   rK   rI   r  r    s    ccrK   r  c                0    t        t        | |            S )NrT   rx   )r  )r  _GeminiFunctionResponser  s     rI   r   r     s    &9PVZem9noorK   c                  &    e Zd ZU dZded<   ded<   y)r  z9See <https://ai.google.dev/api/caching#FunctionResponse>.r;   rT   r  rx   Nr   r]   rK   rI   r  r    s    C
IrK   r  c                R    t        | t              rd| v ryd| v sd| v ryd| v sd| v ryy)Nr   functionCallr  functionResponser  )r   dict)vs    rI   _part_discriminatorr&    s>    !TQ;q Oq$8"1$(;q(@&rK   r   r  r  c                  "    e Zd ZU ded<   ded<   y)r   r  r   zlist[_GeminiTextPart]r   Nr  r]   rK   rI   r   r     s    
""  rK   r   c                      e Zd ZU ded<   y)rl   zNlist[Annotated[_GeminiFunction, pydantic.Field(alias='functionDeclarations')]]ri   Nr  r]   rK   rI   rl   rl   
  s    iirK   rl   c                  ,    e Zd ZU ded<   ded<   ded<   y)_GeminiFunctionr;   rT   descriptionzNotRequired[dict[str, Any]]
parametersNr  r]   rK   rI   r*  r*    s    
I++rK   r*  c                    t        | j                        j                         }t        | j                  | j
                        }|j                  d      r||d<   |S )N)rT   r+  
propertiesr,  )_GeminiJsonSchemaparameters_json_schemasimplifyr*  rT   r+  r   )r  json_schemafs      rI   rj   rj     sQ    #D$?$?@IIKKYY$$	A |$%,HrK   c                      e Zd ZU ded<   y)_GeminiToolConfig_GeminiFunctionCallingConfigfunction_calling_configNr  r]   rK   rI   r5  r5  %  s    99rK   r5  c                0    t        t        d|             S )NANY)modeallowed_function_names)r7  )r5  r6  )function_namess    rI   rk   rk   )  s     <%`n o rK   c                  "    e Zd ZU ded<   ded<   y)r6  zLiteral['ANY', 'AUTO']r:  	list[str]r;  Nr  r]   rK   rI   r6  r6  /  s    
  %%rK   r6  c                  0    e Zd ZU dZded<   ded<   ded<   y)	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_feedbackNr   r]   rK   rI   r   r   4  s     ('ggjjrK   r   c                
   t        | d         dk7  rt        d      | d   d   d   d   }t        |      rt        j                  |      S t        |      rt        j                  |      S t        j                  d	|      )
zExtract the parts of the response from the Gemini API.

    Returns Either a list of function calls (Either.left) or a list of text parts (Either.right).
    r   r)   r   r   r   r   )left)rightr  )r   r   _all_function_call_partsr   Eitherr   r   r   s     rI   r   r   C  s     8L!"a'%&YZZ\"1%i09E&}}%((		}}5))00fglfop
 	
rK   c                &    t        d | D              S )Nc              3  $   K   | ]  }d |v  
 yw)r  Nr]   .0r   s     rI   	<genexpr>z+_all_function_call_parts.<locals>.<genexpr>X  s     954$&5   allr   s    rI   rE  rE  W  s    95999rK   c                &    t        d | D              S )Nc              3  $   K   | ]  }d |v  
 yw)r   Nr]   rI  s     rI   rK  z"_all_text_parts.<locals>.<genexpr>\  s     0%$v~%rL  rM  rO  s    rI   r   r   [  s    0%000rK   c                  F    e Zd ZU dZded<   ded<   	 ded<   ded	<   d
ed<   y)_GeminiCandidateszBSee <https://ai.google.dev/api/generate-content#v1beta.Candidate>.r   r   z[NotRequired[Annotated[Literal['STOP', 'MAX_TOKENS'], pydantic.Field(alias='finishReason')]]finish_reasonzBNotRequired[Annotated[float, pydantic.Field(alias='avgLogProbs')]]avg_log_probszNotRequired[int]indexzXNotRequired[Annotated[list[_GeminiSafetyRating], pydantic.Field(alias='safetyRatings')]]safety_ratingsNr   r]   rK   rI   rS  rS  _  s+    Lnn VUllrK   rS  c                  :    e Zd ZU dZded<   ded<   ded<   ded	<   y
)_GeminiUsageMetaDatazSee <https://ai.google.dev/api/generate-content#FinishReason>.

    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_countNr   r]   rK   rI   rY  rY  m  s"    
 QPeeNN llrK   rY  c                   | j                  d      }|t        j                         S i }|j                  d      x}r||d<   t        j                  |j                  dd      |j                  dd      |j                  dd      |      S )Nr@  r]  rZ  r   r[  r\  )request_tokensresponse_tokenstotal_tokensdetails)r   r   r   )rx   metadatarb  r]  s       rI   rt   rt   y  s    ||,-H||~ G%-\\2N%OO!O0J,-<<||$8!< %=qA\\"5q9	 rK   c                  &    e Zd ZU dZded<   ded<   y)_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']categoryz.Literal['NEGLIGIBLE', 'LOW', 'MEDIUM', 'HIGH']probabilityNr   r]   rK   rI   re  re    s    U  @?rK   re  c                  &    e Zd ZU dZded<   ded<   y)_GeminiPromptFeedbackzPSee <https://ai.google.dev/api/generate-content#v1beta.GenerateContentResponse>.z3Annotated[str, pydantic.Field(alias='blockReason')]block_reasonzKAnnotated[list[_GeminiSafetyRating], pydantic.Field(alias='safetyRatings')]rW  Nr   r]   rK   rI   ri  ri    s    ZEE__rK   ri  )configc                  8    e Zd ZdZddZd	dZd
dZd
dZd
dZy)r/  uw  Transforms the JSON Schema from Pydantic to be suitable for Gemini.

    Gemini which [supports](https://ai.google.dev/gemini-api/docs/function-calling#function_declarations)
    a subset of OpenAPI v3.0.3.

    Specifically:
    * gemini doesn't allow the `title` keyword to be set
    * gemini doesn't allow `$defs` — we need to inline the definitions where possible
    c                f    t        |      | _        | j                  j                  di       | _        y )Nz$defs)r   schemapopdefs)rG   rn  s     rI   rJ   z_GeminiJsonSchema.__init__  s$    v&KKOOGR0	rK   c                T    | j                  | j                  d       | j                  S )Nr]   )
refs_stack)	_simplifyrn  rS   s    rI   r1  z_GeminiJsonSchema.simplify  s     t{{r2{{rK   c                6   |j                  dd        |j                  dd        |j                  dd       x}rit        j                  dd|      }||v rt        j                  d      ||fz  }| j
                  |   }| j                  ||       |j                  |       y |j                  d      x}rc|D ]  }| j                  ||        t        |      dk(  r<d	d
i|v r6|D ]1  }|d	d
ik7  s|j                          |j                  |       d|d<    y  |j                  d	      }|dk(  r| j                  ||       y |dk(  r| j                  ||      S |dk(  r=|j                  dd       x}	r(|j                  d      }
|
r|
 d|	 d|d<   y d|	 |d<   y y y )Ntitledefaultz$refz
^#/\$defs/ z<Recursive `$ref`s in JSON Schema are not supported by GeminianyOfr   typenullTnullableobjectarraystringrF   r+  z
 (format: )zFormat: )ro  resubr   rD   rp  rs  updater   r   clear_object_array)rG   rn  rr  refkey
schema_defany_ofitem_schematype_fmtr+  s              rI   rs  z_GeminiJsonSchema._simplify  s   

7D!

9d#**VT**3*&&C0Cj  **+ijj3& J3JNN:z2MM*%ZZ((6(%{J7  &6{aVV$4$>#)K"vv&66k2-1z* $* 

6"HLL,g;;vz22h6::h+E$EC$E **]3K+6-z#a(H}%*23%(8}% %FrK   c                    |j                  dd       }|rt        j                  d      |j                  d      x}r(|j	                         D ]  }| j                  ||        y y )NadditionalPropertiesz@Additional properties in JSON Schema are not supported by Geminir.  )ro  r   rD   r   valuesrs  )rG   rn  rr  ad_propsr.  values         rI   r  z_GeminiJsonSchema._object  sb    ::4d;&&'ijjL11:1#**,uj1 - 2rK   c                    |j                  d      x}r|D ]  }| j                  ||        |j                  d      x}r| j                  ||       y y )NprefixItemsr  )r   rs  )rG   rn  rr  prefix_itemsprefix_itemitems_schemas         rI   r  z_GeminiJsonSchema._array  sW    !::m44<4+{J7  , "::g..<.NN<4 /rK   N)rn  z_utils.ObjectJsonSchema)rW   r  )rn  r  rr  ztuple[str, ...]rW   r   )	rX   rY   rZ   r[   rJ   r1  rs  r  r  r]   rK   rI   r/  r/    s!    1$9L25rK   r/  )r   r   rW   r   )r  r$   rW   r  r`   )r   zSequence[_GeminiPartUnion]r   zdatetime | NonerW   r   )rT   r;   rx   r  rW   r  )r%  r   rW   r;   )r  r(   rW   r*  )r<  r>  rW   r5  )rx   r   rW   zC_utils.Either[list[_GeminiFunctionCallPart], list[_GeminiTextPart]])r   r  rW   z(TypeGuard[list[_GeminiFunctionCallPart]])r   r  rW   z TypeGuard[list[_GeminiTextPart]])rx   r   rW   r   )o
__future__r   _annotationsrB   r  collections.abcr   r   r   
contextlibr   copyr   dataclassesr	   r
   r   typingr   r   r   r   r   pydanticr   httpxr   r   r9   r   r   typing_extensionsr   r   r   r   rw  r   r   r   r   ru   r   r   r   r    r!   r"   r#   r$   r%   r&   settingsr'   rf   r(   r*   r+   r,   r-   r.   r/   r0   r1   r5   r4   r7   rE   rP   r   r   with_config
ConfigDictr   r  r   r   r   r  r	  r   r  r  r   r  r&  TagDiscriminator_GeminiPartUnionr   rl   r*  rj   r5  rk   r6  r   r   rE  r   rS  rY  rt   re  ri  TypeAdapterr   rp   listr   r/  r]   rK   rI   <module>r     s   2 	 	 = = *  (  ; ;   ^ ^ M M B B   % "	 	 	 i =/% =/ =/@38 3 0 0 0 f*z f* f*R )1 ) )X %%= % %Z )h))d;<<Y < =<$
iu 
"Y "

5i Xi XuI) d) dpi  	/<8<<#778)<8<<+HHI-|x||<O/PPQ	S
 H./1 ! !
j9 j	i 	:	 :&9 &
 )h))d;<
ki 
k =
k

H
(:1m	 m	m9E 	m
@) 
@`I ` *X)).9 *h**?;   4x33D4IReRZReRervRwx I5 I5rK   