§
    ÚŽ’j#Q  ã                   ó  — d Z ddlZddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZmZ ddlmZmZ dd	l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 ddlmZmZm Z m!Z! ddl"m#Z# erddl$m%Z% neZ%dedefd„Z& G d„ de¦  «        Z'dS )z,The Google Gemini chat model implementation.é    N)Údatetime)ÚLiteralÚAnyÚAsyncGeneratorÚTYPE_CHECKINGÚListÚType)Ú	BaseModelÚFieldé   )Ú_generate_idÚ_flatten_json_schemaé   )ÚChatModelBaseÚ_TOOL_CHOICE_LITERAL_MODES)ÚChatResponse)Ú	ChatUsage)ÚGeminiCredential)ÚFormatterBaseÚGeminiChatFormatter)ÚMsgÚThinkingBlockÚToolCallBlockÚ	TextBlock)Ú
ToolChoice)ÚGenerateContentResponseÚschemaÚreturnc                 óP  — t          | t          ¦  «        s#t          | t          ¦  «        rd„ | D ¦   «         S | S t          | ¦  «        } |                      d¦  «        dk    rd| d<   |                      dd¦  «         d| v r,|                      d¦  «        }|                      d|g¦  «         d	| v rÑt          | d	         t          ¦  «        r¶| d	         }d
„ |D ¦   «         }t          |¦  «        t          |¦  «        k     r‚t          |¦  «        dk    rZt          t          |d         ¦  «        ¦  «        }|                      ¦   «         D ]!\  }}|d	k    r|                     ||¦  «         Œ"|S |rd„ |D ¦   «         | d	<   n| d	= dD ]H}|| v rBt          | |         t          ¦  «        r'd„ | |                              ¦   «         D ¦   «         | |<   ŒIdD ]}|| v rt          | |         ¦  «        | |<   ŒdD ]6}|| v r0t          | |         t          ¦  «        rd„ | |         D ¦   «         | |<   Œ7| S )a  Sanitize a JSON schema to be compatible with the Gemini API.

    Gemini API does not support certain JSON Schema constructs. This
    function removes or rewrites the following:

    - ``additionalProperties``: removed entirely.
    - ``const``: converted to an equivalent single-value ``enum``,
      since Gemini's ``Schema`` model does not support ``const``.
    - ``anyOf`` containing a ``{"type": "null"}`` entry: simplified to
      the single non-null type. If there is exactly one non-null
      alternative it is inlined directly; otherwise the ``anyOf`` is
      kept but the null entry is dropped.
    - All nested sub-schemas (``properties``, ``items``, ``$defs``,
      etc.) are processed recursively.

    Args:
        schema (`Any`):
            The JSON schema to sanitize. Non-dict values are returned
            unchanged; lists are recursively sanitized element-wise.

    Returns:
        `Any`:
            A sanitized copy of the schema, or the original value if it
            is not a dict or list.
    c                 ó,   — g | ]}t          |¦  «        ‘ŒS © ©Ú_sanitize_schema_for_gemini©Ú.0Úvs     úMC:\Projects\DSCons\.venv\Lib\site-packages\agentscope\model\_gemini\_model.pyú
<listcomp>z/_sanitize_schema_for_gemini.<locals>.<listcomp>5   s!   € ÐCÐCÐC°qÕ/°Ñ2Ô2ÐCÐCÐCó    ÚtypeÚnullÚobjectÚadditionalPropertiesNÚconstÚenumÚanyOfc                 ó"   — g | ]}|d dik    ¯
|‘ŒS )r*   r+   r!   r$   s     r'   r(   z/_sanitize_schema_for_gemini.<locals>.<listcomp>M   s'   € Ð?Ð?Ð?˜!¨¨v°vÐ.>Ò)>Ð)>�AÐ)>Ð)>Ð)>r)   é   r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r!   r"   r$   s     r'   r(   z/_sanitize_schema_for_gemini.<locals>.<listcomp>W   s.   € ð #ð #ð #Ø78Õ/°Ñ2Ô2ð#ð #ð #r)   )Ú
propertiesÚpatternPropertiesz$defsc                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r!   r"   )r%   Úkr&   s      r'   ú
<dictcomp>z/_sanitize_schema_for_gemini.<locals>.<dictcomp>`   s7   € ð ð ð á�A�qð Õ.¨qÑ1Ô1ðð ð r)   )ÚitemsÚnotÚifÚthenÚelse)ÚallOfÚoneOfr0   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r!   r"   r$   s     r'   r(   z/_sanitize_schema_for_gemini.<locals>.<listcomp>k   s!   € ÐOÐOÐO¸aÕ6°qÑ9Ô9ÐOÐOÐOr)   )	Ú
isinstanceÚdictÚlistÚgetÚpopÚ
setdefaultÚlenr#   r9   )r   Úconst_valueÚany_ofÚnon_nullÚmergedr7   r&   Úkeys           r'   r#   r#      s�  € õ4 �f�dÑ#Ô#ð Ý�f�dÑ#Ô#ð 	DØCÐC¸FÐCÑCÔCÐCØˆå�&‰\Œ\€Fð ‡z‚z�&ÑÔ˜VÒ#Ð#Ø!ˆˆv‰ð ‡J‚JÐ% tÑ,Ô,Ð,ð �&ÐÐØ—j’j Ñ)Ô)ˆØ×Ò˜& ; -Ñ0Ô0Ð0ð �&ÐÐ�Z¨¨w¬½Ñ>Ô>ÐØ˜”ˆØ?Ð?˜vÐ?Ñ?Ô?ˆÝˆx‰=Œ=�3˜v™;œ;Ò&Ð&Ý�8‰}Œ} Ò!Ð!åÕ9¸(À1¼+ÑFÔFÑGÔG�Ø"ŸLšL™NœNð 0ð 0‘D�A�qØ˜G’|�|Ø×)Ò)¨!¨QÑ/Ô/Ð/øØ�Øð $ð#ð #Ø<Dð#ñ #ô #��w‘�ð ˜7�Oð <ð ð ˆØ�&ˆ=ˆ=�Z¨¨s¬µTÑ:Ô:ˆ=ðð à" 3œK×-Ò-Ñ/Ô/ðñ ô ˆF�3‰Køð
 6ð Cð CˆØ�&ˆ=ˆ=Ý5°f¸S´kÑBÔBˆF�3‰Køà*ð Pð PˆØ�&ˆ=ˆ=�Z¨¨s¬µTÑ:Ô:ˆ=ØOÐOÀ6È#Ä;ÐOÑOÔOˆF�3‰Køà€Mr)   c                   óð  ‡ — e Zd ZU dZ G d„ de¦  «        ZdZed         ed<   	 	 	 	 	 	 	 	 d&de	de
dddedededededz  dee
ef         dz  ddfˆ fd„Zedeee         df         fd„¦   «         Z	 	 d'de
dee         dee         dz  dedz  dedeeedf         z  fd„Zded edeedf         fd!„Zded edefd"„Z d#edede!dz  fd$„Z"dee         dz  dedz  deee         dz  edz  f         fd%„Z#ˆ xZ$S )(ÚGeminiChatModelzThe Google Gemini chat model.c                   óö   — e Zd ZU dZ edddd¬¦  «        Zedz  ed<    edd	d
¬¦  «        Ze	ed<    edddd¬¦  «        Z
edz  ed<    eddddd¬¦  «        Zedz  ed<    eddddd¬¦  «        Zedz  ed<   dS )úGeminiChatModel.Parametersz)The parameters for the Gemini chat model.Nz
Max Tokensz0The maximum number of tokens for the LLM output.r   )ÚdefaultÚtitleÚdescriptionÚgtÚ
max_tokensFÚThinkingz"Whether to enable thinking output.)rQ   rR   rS   Úthinking_enablezThinking BudgetzThe thinking budget in tokens.Úthinking_budgetÚTemperaturez#The temperature for the LLM output.r   )rQ   rR   rS   ÚgeÚleÚtemperaturezTop Pz#The top P value for the LLM output.r2   )rQ   rR   rS   rT   r[   Útop_p)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rU   ÚintÚ__annotations__rW   ÚboolrX   r\   Úfloatr]   r!   r)   r'   Ú
ParametersrP   s   s6  € € € € € € Ø7Ð7à!& ØØØJØð	"
ñ "
ô "
ˆ
�C˜$‘Jð 	
ð 	
ñ 	
ð !& ØØØ<ð!
ñ !
ô !
ˆ˜ð 	
ð 	
ñ 	
ð ', eØØ#Ø8Øð	'
ñ '
ô '
ˆ˜˜t™ð 	
ð 	
ñ 	
ð %* EØØØ=ØØð%
ñ %
ô %
ˆ�U˜T‘\ð 	
ð 	
ñ 	
ð $˜eØØØ=ØØð
ñ 
ô 
ˆˆu�t‰|ð 	
ð 	
ñ 	
ð 	
ð 	
r)   rf   Úgemini_chatr*   NTr   ç      ð?é   Ú
credentialÚmodelÚ
parametersz!GeminiChatModel.Parameters | NoneÚstreamÚmax_retriesÚretry_delayÚcontext_sizeÚ	formatterÚclient_kwargsr   c
           	      ó2  •— t          ¦   «                              |||p|                      ¦   «         ||||¬¦  «         |pt          ¦   «         | _        |	pi | _        ddlm}
  |
j        dd| j	        j
                             ¦   «         i| j        ¤Ž| _        dS )aº  Initialize the Gemini chat model.

        Args:
            credential (`GeminiCredential`):
                The Google Gemini credential used to authenticate API calls.
            model (`str`):
                The Gemini model name, e.g. ``gemini-2.0-flash-exp``.
            parameters (`GeminiChatModel.Parameters | None`, defaults to             `None`):
                The Gemini API parameters. When ``None``, the default
                parameters will be used.
            stream (`bool`, defaults to `True`):
                Whether to enable streaming output.
            max_retries (`int`, defaults to `3`):
                The maximum number of retries for the Gemini API.
            retry_delay (`float`, defaults to `1.0`):
                Seconds to sleep between retry attempts.
            context_size (`int`, defaults to `1048576`):
                The model context size used for context compression.
            formatter (`FormatterBase | None`, defaults to `None`):
                The formatter that converts ``Msg`` objects to the format
                required by the Gemini API. When ``None``, a
                ``GeminiChatFormatter`` instance will be used.
            client_kwargs (`dict[str, Any] | None`, defaults to `None`):
                Extra keyword arguments forwarded to ``google.genai.Client``
                (e.g. ``vertexai``, ``project``, ``location``,
                ``credentials``, ``http_options``).
        )rj   rk   rl   rm   rn   ro   rp   r   )ÚgenaiÚapi_keyNr!   )ÚsuperÚ__init__rf   r   rq   rr   Úgooglert   ÚClientrj   ru   Úget_secret_valueÚclient)Úselfrj   rk   rl   rm   rn   ro   rp   rq   rr   rt   Ú	__class__s              €r'   rw   zGeminiChatModel.__init__�   sÁ   ø€ õP 	‰Œ×ÒØ!ØØ!Ð6 T§_¢_Ñ%6Ô%6ØØ#Ø#Ø%ð 	ñ 	
ô 	
ð 	
ð #Ð;Õ&9Ñ&;Ô&;ˆŒØ*Ð0¨bˆÔà Ð Ð Ð Ð Ð à$0 E¤Lð %
ð %
Ø”OÔ+×<Ò<Ñ>Ô>ð%
àÔ ð%
ð %
ˆŒˆˆr)   .c                 ó   — ddl m} |j        fS )Nr   )Úerrors)Úgoogle.genair   ÚAPIError)Úclsr   s     r'   Ú_get_retryable_exceptionsz)GeminiChatModel._get_retryable_exceptionsØ   s!   € à'Ð'Ð'Ð'Ð'Ð'ð ”Ð!Ð!r)   Ú
model_nameÚmessagesÚtoolsÚtool_choiceÚconfig_kwargsc              ‹   ó°  K  — | j                              |¦  «        ƒ d{V —†}i |¥}| j        j        �| j        j        |d<   | j        j        �| j        j        |d<   | j        j        �| j        j        |d<   | j        j        rd| j        j        pddœ|d<   nd	d
dœ|d<   |                      ||¦  «        \  }}	|�||d<   |	�|	|d<   |||dœ}
t          j
        ¦   «         }| j        r8 | j        j        j        j        di |
¤Žƒ d{V —†}|                      ||¦  «        S  | j        j        j        j        di |
¤Žƒ d{V —†}|                      ||¦  «        S )a  Call the Gemini chat API.

        Args:
            model_name (`str`):
                The model name to use for this call.
            messages (`list`):
                A list of message objects for Gemini API.
            tools (`list[dict]`, default `None`):
                The tools JSON schemas.
            tool_choice (`ToolChoice | None`, optional):
                Controls which (if any) tool is called by the model.
            **config_kwargs (`Any`):
                Extra keyword arguments for the Gemini config.

        Returns:
            `ChatResponse | AsyncGenerator[ChatResponse, None]`:
                A ``ChatResponse`` when streaming is disabled, or an async
                generator of ``ChatResponse`` objects when streaming is
                enabled.
        NÚmax_output_tokensr\   r]   Ti   )Úinclude_thoughtsrX   Úthinking_configFr   r†   Útool_config)rk   ÚcontentsÚconfigr!   )rq   Úformatrl   rU   r\   r]   rW   rX   Ú_format_toolsr   Únowrm   r{   ÚaioÚmodelsÚgenerate_content_streamÚ_parse_stream_responseÚgenerate_contentÚ_parse_completion_response)r|   r„   r…   r†   r‡   rˆ   Úformatted_messagesr�   Ú	fmt_toolsÚfmt_tool_choiceÚkwargsÚstart_datetimeÚresponses                r'   Ú	_call_apizGeminiChatModel._call_apiã   sí  è è € ð8 $(¤>×#8Ò#8¸Ñ#BÔ#BÐBÐBÐBÐBÐBÐBÐà!2 MÐ!2ˆàŒ?Ô%Ð1Ø*.¬/Ô*DˆFÐ&Ñ'àŒ?Ô&Ð2Ø$(¤OÔ$?ˆF�=Ñ!àŒ?Ô Ð,Ø"œoÔ3ˆF�7‰OàŒ?Ô*ð 		à$(Ø#'¤?Ô#BÐ#JÀdð)ð )ˆFÐ$Ñ%Ð%ð %*Ø#$ð)ð )ˆFÐ$Ñ%ð
 &*×%7Ò%7¸¸{Ñ%KÔ%KÑ"ˆ	�?àÐ Ø'ˆF�7‰OàÐ&Ø$3ˆF�=Ñ!ð  Ø*Øð"
ð "
ˆõ "œ™œˆàŒ;ð 	ØK˜Tœ[œ_Ô3ÔKð ð Øðð ð ð ð ð ð ð ˆHð ×.Ò.ØØñô ð ð
 A˜œœÔ/Ô@ÐJÐJÀ6ÐJÐJÐJÐJÐJÐJÐJÐJˆØ×.Ò.¨~¸xÑHÔHÐHr)   r�   rž   c           
     ó‚  K  — t          ¦   «         }t          ¦   «         }t          ¦   «         }|2 3 d{V —†}t          g d|¬¦  «        }t          |dd¦  «        p|}||_        |j        �r"|j        d         j        �r|j        d         j        j        rø|j        d         j        j        D ]à}|j        r@|j        r| 	                    ||j        ¬¦  «         n| 
                    ||j        ¬¦  «         |j        r�|j        r-t          j        |j        ¦  «                             d¦  «        }	n|j        j        pt          ¦   «         }	|                     |	|j        j        t%          j        |j        j        pi d¬	¦  «        ¬
¦  «         Œá|                      |j        |¦  «        }
|j        s|
r|
|_        |W V — �Œ�6 dS )aí  Parse the Gemini streaming response.

        Args:
            start_datetime (`datetime`):
                The start datetime of the response generation.
            response (`Any`):
                The Gemini async stream object from
                ``client.aio.models.generate_content_stream``.

        Yields:
            `ChatResponse`:
                Incremental ``ChatResponse`` objects with ``is_last=False``
                followed by a final one with ``is_last=True``.
        NF)ÚcontentÚis_lastÚidÚresponse_idr   )Úblock_idÚthinking)r¥   Útextúutf-8©Úensure_ascii)r¥   ÚnameÚinput)r   r   Úgetattrr£   Ú
candidatesr¡   Úpartsr§   ÚthoughtÚappend_thinkingÚappend_textÚfunction_callÚthought_signatureÚbase64Ú	b64encodeÚdecodeÚappend_tool_callr«   ÚjsonÚdumpsÚargsÚ_extract_usageÚusage_metadataÚusage)r|   r�   rž   r¤   Útext_idÚthinking_idÚchunkÚ	delta_resÚpartÚcall_idr¾   s              r'   r–   z&GeminiChatModel._parse_stream_response3  s2  è è € õ( (™>œ>ˆÝ#‘~”~ˆÝ'™>œ>ˆà#ð 7	 ð 7	 ð 7	 ð 7	 ð 7	 ð 7	 ð 7	 �%å$ØØØðñ ô ˆIõ " %¨¸Ñ=Ô=ÐLÀˆKØ&ˆIŒLð Ô ñ%àÔ$ QÔ'Ô/ñ%ð Ô$ QÔ'Ô/Ô5ð%ð
 "Ô,¨QÔ/Ô7Ô=ð  ð  �DØ”yð àœ<ð Ø%×5Ò5Ø)4Ø)-¬ð 6ñ ô ð ð ð &×1Ò1Ø)0Ø%)¤Yð 2ñ ô ð ð Ô)ð ØÔ1ð NÝ&,Ô&6Ø $Ô 6ñ'ô 'ç$šf W™oœoð $˜Gð '+Ô&8Ô&;Ð&M½|¹~¼~˜Gà!×2Ò2Ø%,Ø!%Ô!3Ô!8Ý"&¤*Ø $Ô 2Ô 7Ð =¸2Ø-2ð#ñ #ô #ð 3ñ ô ð øð ×'Ò'¨Ô(<¸nÑMÔMˆEàÔ ð   Eð  Ø"'�	”Ø����ùðo $˜8˜8s   ¯F>c                 óD  — g }|j         �rL|j         d         j        �r9|j         d         j        j        �r!|j         d         j        j        D �]}|j        rX|j        r)|                     t          |j        ¬¦  «        ¦  «         n(|                     t          |j        ¬¦  «        ¦  «         |j        rŸ|j        j	        pi }|j
        r-t          j        |j
        ¦  «                             d¦  «        }n|j        j        pt          ¦   «         }|                     t!          ||j        j        t%          j        |d¬¦  «        ¬¦  «        ¦  «         �Œ
|                      |j        |¦  «        }t-          t/          |dd	¦  «        pt          ¦   «         |d
|¬¦  «        S )a†  Parse the Gemini non-streaming response.

        Args:
            start_datetime (`datetime`):
                The start datetime of the response generation.
            response (`GenerateContentResponse`):
                The Gemini generate content response object.

        Returns:
            `ChatResponse`:
                A single ``ChatResponse`` with ``is_last=True``.
        r   )r¦   )r§   r¨   Fr©   )r£   r«   r¬   r¤   NT)r£   r¡   r¢   r¾   )r®   r¡   r¯   r§   r°   Úappendr   r   r³   r»   r´   rµ   r¶   r·   r£   r   r   r«   r¹   rº   r¼   r½   r   r­   )r|   r�   rž   Úcontent_blocksrÃ   Úkeyword_argsrÄ   r¾   s           r'   r˜   z*GeminiChatModel._parse_completion_response„  sÈ  € ð" KMˆð Ôñ	àÔ# AÔ&Ô.ñ	ð Ô# AÔ&Ô.Ô4ñ	ð
 !Ô+¨AÔ.Ô6Ô<ð ñ �Ø”9ð IØ”|ð IØ&×-Ò-Ý)°4´9Ð=Ñ=Ô=ñô ð ð ð '×-Ò-­i¸T¼YÐ.GÑ.GÔ.GÑHÔHÐHàÔ%ð Ø#'Ô#5Ô#:Ð#@¸b�LØÔ-ð JÝ"(Ô"2Ø Ô2ñ#ô #ç š& ™/œ/ð  ˜ð #'Ô"4Ô"7Ð"I½<¹>¼>˜Ø"×)Ò)Ý%Ø&Ø!%Ô!3Ô!8Ý"&¤*¨\ÈÐ"NÑ"NÔ"Nðñ ô ñô ð ùð ×#Ò# HÔ$;¸^ÑLÔLˆåÝ�x °Ñ5Ô5ÐG½¹¼Ø"ØØð	
ñ 
ô 
ð 	
r)   r½   c           
      óÈ   — |sdS |j         }|j        }|�M|�Kt          |||z
  t          j        ¦   «         |z
                       ¦   «         t          |dd¦  «        ¬¦  «        S dS )a¥  Extract ChatUsage from usage_metadata.

        Args:
            usage_metadata (`Any`):
                The usage metadata object from a Gemini response.
            start_datetime (`datetime`):
                The start datetime of the response generation.

        Returns:
            `ChatUsage | None`:
                A ``ChatUsage`` object if usage data is available, otherwise
                ``None``.
        NÚcached_content_token_countr   )Úinput_tokensÚoutput_tokensÚtimeÚcache_input_tokens)Úprompt_token_countÚtotal_token_countr   r   r’   Útotal_secondsr­   )r|   r½   r�   Úprompt_tokensÚtotal_tokenss        r'   r¼   zGeminiChatModel._extract_usage¾  s…   € ð$ ð 	Ø�4Ø&Ô9ˆØ%Ô7ˆØÐ$¨Ð)AÝØ*Ø*¨]Ñ:Ý”l‘n”n ~Ñ5×DÒDÑFÔFÝ#*Ø"Ø0Øñ$ô $ð		ñ 	ô 	ð 	ð ˆtr)   c                 óÔ  ‡
— |rA|r?|                       ||¦  «         |j        r"t          |j        ¦  «        Š
ˆ
fd„|D ¦   «         }d}|rig }|D ]_}d|vrŒ|d                              ¦   «         }d|v r%t	          t          |d         ¦  «        ¦  «        |d<   |                     |¦  «         Œ`d|ig}|s|dfS |j        }|t          vrdd|gdœi}||fS d	d
ddœ}	dd|	|         ii}||fS )a“  Validate and format tools and tool_choice for Gemini.

        Converts tool schemas to Gemini's ``function_declarations``
        format (resolving ``$ref`` references) and maps tool_choice
        modes to Gemini's ``function_calling_config``. When
        ``tool_choice.tools`` is specified the schemas list is filtered
        to only those tools. When ``tool_choice.mode`` is a specific
        tool name (str) the model is restricted via
        ``allowed_function_names`` without needing to filter the list,
        preserving prompt-cache efficiency.

        Args:
            tools (`list[dict] | None`, optional):
                The raw tool schemas.
            tool_choice (`ToolChoice | None`, optional):
                The tool choice configuration.

        Returns:
            `tuple[list[dict] | None, dict | None]`:
                A tuple of (formatted_tools, formatted_tool_config).
        c                 ó4   •— g | ]}|d          d         ‰v ¯|‘ŒS )Úfunctionr«   r!   )r%   ÚtÚalloweds     €r'   r(   z1GeminiChatModel._format_tools.<locals>.<listcomp>ÿ  s,   ø€ ÐNÐNÐN˜q¨Q¨z¬]¸6Ô-BÀgÐ-MÐ-M˜Ð-MÐ-MÐ-Mr)   NrÖ   rl   Úfunction_declarationsÚfunction_calling_configÚANY)ÚmodeÚallowed_function_namesÚAUTOÚNONE)ÚautoÚnoneÚrequiredrÜ   )	Ú_validate_tool_choicer†   ÚsetÚcopyr#   r   rÆ   rÜ   r   )r|   r†   r‡   rš   rÙ   r   ÚfuncrÜ   Ú
fmt_choiceÚmode_mappingrØ   s             @r'   r‘   zGeminiChatModel._format_toolsá  s‹  ø€ ð4 ð 	O˜5ð 	OØ×&Ò& {°EÑ:Ô:Ð:ØÔ ð OÝ˜kÔ/Ñ0Ô0�ØNÐNÐNÐN EÐNÑNÔN�àˆ	Øð 	KØ$&Ð!Øð 3ð 3�Ø VÐ+Ð+ØØ˜jÔ)×.Ò.Ñ0Ô0�Ø 4Ð'Ð'Ý)DÝ,¨T°,Ô-?Ñ@Ô@ñ*ô *�D˜Ñ&ð &×,Ò,¨TÑ2Ô2Ð2Ð2Ø1Ð3HÐIÐJˆIàð 	#Ø˜d�?Ð"àÔˆàÕ1Ð1Ð1ð *Ø!Ø/3¨fð,ð ,ð ˆJð ˜jÐ(Ð(ð ØØð
ð 
ˆð &¨°¸TÔ0BÐ'Cð
ˆ
ð ˜*Ð$Ð$r)   )NTr   rh   ri   NN)NN)%r^   r_   r`   ra   r
   rf   r*   r   rc   r   Ústrrd   rb   re   r   rB   r   rw   ÚclassmethodÚtupler	   Ú	Exceptionrƒ   rC   r   r   r   r   rŸ   r   r–   r   r˜   r   r¼   r‘   Ú__classcell__)r}   s   @r'   rN   rN   p   sì  ø€ € € € € € Ø'Ð'ð%
ð %
ð %
ð %
ð %
�Yñ %
ô %
ð %
ðN $1€Dˆ'�-Ô
 Ð0Ð0Ñ0Ø%ð ;?ØØØ Ø#Ø*.Ø/3ð9
ð 9
à$ð9
ð ð9
ð 8ð	9
ð
 ð9
ð ð9
ð ð9
ð ð9
ð ! 4Ñ'ð9
ð ˜C ˜H”~¨Ñ,ð9
ð 
ð9
ð 9
ð 9
ð 9
ð 9
ð 9
ðv ð"¨%°°Y´ÀÐ0DÔ*Eð "ð "ð "ñ „[ð"ð $(Ø)-ðNIð NIàðNIð �s”)ðNIð �DŒz˜DÑ ð	NIð
   $Ñ&ðNIð ðNIð 
˜ |°TÐ'9Ô:Ñ	:ðNIð NIð NIð NIð`O à ðO ð ðO ð 
˜ dÐ*Ô	+ð	O ð O ð O ð O ðb8
à ð8
ð *ð8
ð 
ð	8
ð 8
ð 8
ð 8
ðt!àð!ð !ð!ð 
�TÑ	ð	!ð !ð !ð !ðFE%à�DŒz˜DÑ ðE%ð   $Ñ&ðE%ð 
ˆt�DŒz˜DÑ  $¨¡+Ð-Ô	.ð	E%ð E%ð E%ð E%ð E%ð E%ð E%ð E%r)   rN   )(ra   rµ   r¹   r   Útypingr   r   r   r   r   r	   Úpydanticr
   r   Ú_utils._commonr   r   Ú_baser   r   Ú_model_responser   Ú_model_usager   rj   r   rq   r   r   Úmessager   r   r   r   Útoolr   Úgoogle.genai.typesr   r#   rN   r!   r)   r'   ú<module>r÷      sµ  ðà 2Ð 2Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø *Ð *Ð *Ð *Ð *Ð *Ø $Ð $Ð $Ð $Ð $Ð $Ø *Ð *Ð *Ð *Ð *Ð *Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ Ð Ð Ð Ð Ð àð "Ø:Ð:Ð:Ð:Ð:Ð:Ð:à!ÐðT¨ð T°ð Tð Tð Tð Tðnv%ð v%ð v%ð v%ð v%�mñ v%ô v%ð v%ð v%ð v%r)   