o
    Yi                     @   s	  U d Z ddlZddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddl
mZ ddl
mZ ddlZddlZddlmZ ddlZdd	lmZ d
dlmZ ddlmZ ddlmZ ddlmZ dd	lmZ ddlmZ ddlmZ zddlZdZW n e y   dZe	! ZY nw ej"rddl#mZ$ ddl#m%Z& n*eZ$ej'e(d< eZ&ej'e(d< zddl#mZ$ ddl#m%Z& W n e y   dZ$dZ&Y nw ej)j*eddZ+ddddddddd gd!d"d#d$gZ,d%e-d&e-fd'dZ.dd(d)Z/ej0d*d+ Z1dd,d-Z2d.d/ Z3d0d1 Z4e+d2d3 Z5d4d5 Z6d6d7 Z7d8d9 Z8ej)9d:ddgej)j:d;d< Z;ej)9d:ddgej)j:d=d> Z<ej)9d:ddgej)j:d?d@ Z=ej)9d:ddgej)j:dAdB Z>ej)9d:ddgej)j:dCdD Z?ej)9d:ddgej)j:dEdF Z@ej)9d:ddgej)j:dGdH ZAej)9d:ddgej)j:dIdJ ZBej)9d:ddgej)j:dKdL ZCej)9d:ddgej)j:dMdN ZDej)9d:ddgej)j:dOdP ZEej)9d:ddgej)j:dQdR ZFej)9d:ddgej)j:dSdT ZGej)9d:ddgej)j:dUdV ZHej)9d:ddgej)j:dWdX ZIej)9d:ddgej)j:dYdZ ZJej)9d:ddgej)j:d[d\ ZKej)9d:ddgej)j:d]d^ ZLej)9d:ddgej)j:d_d` ZMej)9d:ddgej)j:dadb ZNej)9d:ddgej)j:dcdd ZOej)9d:ddgej)j:dedf ZPej)9d:ddgej)j:dgdh ZQej)9d:ddgej)j:didj ZRej)9d:ddgej)j:dkdl ZSej)j:dmdn ZTej)9d:ddgej)j:dodp ZUej)9d:ddgej)j:dqdr ZVej)9d:ddgej)j:dsdt ZWej)9d:ddgej)j:dudv ZXej)9d:ddgej)j:dwdx ZYej)9d:ddgej)j:dydz ZZej)9d:ddgej)j:d{d| Z[ej)9d:ddgej)j:d}d~ Z\ej)9d:ddgej)j:dd Z]ej)9d:ddgej)j:dd Z^ej)9d:ddgej)j:dd Z_ej)9d:ddgej)j:dd Z`ej)9d:ddgej)j:dd Zaej)9d:ddgej)j:dd Zbej)9d:dgej)j:dd Zcej)9d:ddgej)j:dd Zdej)9d:ddgej)j:dd Zeej)9d:ddgej)j:dd Zfej)9d:ddgdd Zgej)9d:ddgej)j:dd Zhej)9d:ddgdd Ziej)9d:ddgdd Zjej)9d:ddgdd Zkej)9d:ddgdd Zlej)9d:ddgdd Zmej)9d:ddgdd Znej)9d:ddgdd Zoej)9d:ddgdd Zpej)9d:ddgdd Zqej)9d:ddgdd Zrej)9d:ddgdd Zsej)j:dd Ztej)j:dd Zuej)j:dd Zvej)9d:dgej)j:dd Zwej)9d:dgej)j:dd ZxdS )zTests for live.py.    N)AnyAsyncIterator)mock)	AsyncMock)Mock)patch)Credentials)client   )pytest_helper   )_api_client)_common)Client)live)typesFT)ClientSession	mcp_typesMcpClientSessionz(aiohttp is not installed, skipping test.)reasonget_current_weather!Get the current weather in a cityOBJECTSTRING#The location to get the weather fortypedescriptionCFr   enumlocationunitr   
properties)namer   
parametersr#   r$   c                 C   s   |dkrdS dS )"Get the current weather in a city.r      ;    r"   r,   r,   [/home/kim/smarthome/.venv/lib/python3.10/site-packages/google/genai/tests/live/test_live.pyr   X   s   c                 C   s   t jtjd}| sd|_d |_d |_d |_n(d |_|r5t|t	r(t
jdi |n|}|j|_d |_d |_n	d|_d|_d |_dd |_||_t
jdi i|_| |_||_tjtjdt tjd	d
}d|i|_|S )NspecTEST_API_KEYzus-central1Ztest_projectc                   S   s   dS )NZ	test_hostr,   r,   r,   r,   r-   <lambda>t   s    z!mock_api_client.<locals>.<lambda>headersZSSL_CERT_FILEZSSL_CERT_DIR)cafilecapathsslr,   )r   	MagicMock	gl_clientBaseApiClientapi_keyr#   projectcustom_base_url
isinstancedictr   HttpOptionsbase_urlZ_hostZ_credentialsmodel_validate_http_optionsvertexair   r5   create_default_contextosenvirongetcertifiwhereZ_websocket_ssl_ctx)rB   credentialshttp_options
api_clientctxr,   r,   r-   mock_api_client]   s>   


rM   c                  C   s,   t tjd} t  | _t dd| _t  | _| S )Nr.   ){"serverContent": {"turnComplete": true}}return_value)r   r	   ZClientConnectionsendrecvclose)	websocketr,   r,   r-   mock_websocket   s   rU   c                    s   d u ri t  t  _t dd_tdd}tdd}|d f|_tjdfdd	}td|d	tjt	d
|d	 fdd}| I d H S )N8   {
  "setupComplete": {"sessionId": "test_session_id"}
}
rO   NNZ
test_tokentokenc                   s    V  d S Nr,   uriZadditional_headerskwargs)mock_wsr,   r-   mock_connect   s   
z)get_connect_message.<locals>.mock_connectgoogle.auth.defaultnew
ws_connectc               	      sn   t  } | jd4 I d H  W d   I d H  n1 I d H s"w   Y  j  tjjd d S )Nmodelconfigr   )r   	AsyncLiveconnectrQ   assert_called_oncejsonloads	call_argslive_modulerK   rf   r^   re   r,   r-   _test_connect   s   
(
z*get_connect_message.<locals>._test_connectrZ   )
r   rQ   rR   r   rP   
contextlibasynccontextmanagerr   objectr   )rK   re   rf   mock_google_auth_default
mock_credsr_   rp   r,   ro   r-   get_connect_message   s"   



rv   c                    s   dd | 2 I d H S )Nc                    s   g | z3 d H W }|q6 S rZ   r,   ).0valuer,   r,   r-   
<listcomp>   s    z+_async_iterator_to_list.<locals>.<listcomp>r,   )Z
async_iterr,   r,   r-   _async_iterator_to_list   s   rz   c                 C   sn   d}|  d| t }|jjjjrJ |jjjj|ksJ t|jjjtj	s(J |jjjj
jd |ks5J d S )Ngoogle_api_keyGOOGLE_API_KEYx-goog-api-keysetenvr   aior   r   rB   r9   r<   rK   r8   rA   r2   monkeypatchr9   r	   r,   r,   r-   test_mldev_from_env   s   r   c                 C   s   d}d}|  dd |  d| |  d| t }|jjjjd u s#J |jjjjs+J |jjjj|ks5J t|jjjt	j
s@J d|jjjjjvsKJ d S )NZfake_project_idzfake-locationGOOGLE_GENAI_USE_VERTEXAItrueGOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATIONr}   )r   r   r   r   r   r;   rB   r:   r<   rK   r8   rA   r2   )r   Z
project_idr#   r	   r,   r,   r-   test_vertex_from_env   s   r   c                 C   s   d}|  dd |  d| |  dd |  dd t }|jjjjs%J |jjjj|ks/J t|jjjtj	s:J |jjjj
jd |ksGJ d S )	Nr{   r   r   r|   r    r   r}   r~   r   r,   r,   r-   test_vertex_api_key_from_env   s   r   c                  C   s*   d} t jdd| id}| dksJ d S )Nzhttps://test.comr{   r?   )r9   rJ   zwss://test.com)r7   r8   _websocket_base_urlr?   rK   r,   r,   r-   test_websocket_base_url   s   r   c                  C   s<   d} t jd| ddidd}d |_d |_| | ksJ d S )Nz"https://test-api-gateway-proxy.comTAuthorizationzBearer test_tokenr?   r2   rB   rJ   )r7   r8   r:   r#   r   r   r,   r,   r-   4test_websocket_base_url_no_auth_with_custom_base_url   s   	r   rB   c                    sX   t jt|d| d}|jddI d H  | j  t| jjd d }d|v s*J d S )NrB   rK   rT   testinputr   client_contentr   AsyncSessionrM   rQ   ri   rj   rk   rl   rU   rB   session	sent_datar,   r,   r-   test_async_session_send_text   s   

r   c                    sn   t jt|d| d}dddigigdd}|j|dI d H  | j  t| jjd	 d	 }d
|v s5J d S )Nr   r   partstextr   T)contentturn_completer   r   r   r   rU   rB   r   r   r   r,   r,   r-   $test_async_session_send_content_dict  s   

r   c                    sz   t jt|d| d}tjtjtjddgdgdd}|j|dI d H  | j  t	
| jjd	 d	 }d
|v s;J d S )Nr   r   r   r   )r   T)turnsr   r   r   r   )r   r   rM   r   LiveClientContentContentPartrQ   ri   rj   rk   rl   r   r,   r,   r-   test_async_session_send_content  s   

r   c                    sb   t jt|d| d}ddd}|j|dI d H  | j  t| jjd d }d|v s/J d S 	Nr   r      000000	audio/pcmdata	mime_typer   r   realtime_inputr   rU   rB   r   r   r   r,   r,   r-   test_async_session_send_bytes/  s   


r   c                    sf   t jt|d| d}tjddd}|j|dI d H  | j  t| jj	d d }d|v s1J d S r   )
r   r   rM   r   BlobrQ   ri   rj   rk   rl   r   r,   r,   r-   test_async_session_send_blob?  s   

r   c                    sp   t jt|d| d}tjtjdddgd}|j|dI d H  | j  t	| jj
d d }d	|v s6J d S )
Nr   r   ZMDAwMDAwr   r   media_chunksr   r   r   )r   r   rM   r   LiveClientRealtimeInputr   rQ   ri   rj   rk   rl   r   r,   r,   r-   &test_async_session_send_realtime_inputO  s   

r   c                    s   t jt|d| d}|rtjtjdddddgd}ntjtjddddd	d
gd}|j|dI d H  | j  t	| jj
d d }d|v sLJ d S )Nr   r   r   g      -@r   )temperaturer$   )r'   responsefunction_responseszsome-id)r'   r   idr   r   tool_response)r   r   rM   r   LiveClientToolResponseFunctionResponserQ   ri   rj   rk   rl   )rU   rB   r   r   r   r,   r,   r-   %test_async_session_send_tool_response`  s0   
		
r   c                    sh   t jt|d| d}|jd dI d H  | j  t| jjd d }d|v s*J |d d s2J d S )Nr   r   r   r   r   r   r   r   r,   r,   r-   "test_async_session_send_input_none  s   

r   c                    s   t jt|d| d}tt |jddigdI d H  W d    n1 s'w   Y  tt |jddidI d H  W d    d S 1 sHw   Y  d S )Nr   r   Zinvalid_keyZinvalid_valuer   )r   r   rM   pytestraises
ValueErrorrQ   rU   rB   r   r,   r,   r-   test_async_session_send_error  s   
"r   c                    sD   t jt|d| d}| }t|I d H }t|d tjs J d S )Nr   r   r   )r   r   rM   receiverz   r<   r   LiveServerMessage)rU   rB   r   	responsesr,   r,   r-   test_async_session_receive  s   
r   c                    sd   t dd| _tjt|d| d}tt | 	 I d H  W d    d S 1 s+w   Y  d S )Nzinvalid jsonrO   r   r   )
r   rR   r   r   rM   r   r   r   r   	__anext__r   r,   r,   r-    test_async_session_receive_error  s   
"r   c                    s   t ddgd| _tjt|d| d}| }t|I d H }t|d tj	s(J |d j
jjd jdks6J |d j
jd	ks@J d S )
Nz>{"serverContent": {"modelTurn": {"parts":[{"text": "test"}]}}}rN   Zside_effectr   r   r   r      T)r   rR   r   r   rM   r   rz   r<   r   r   server_content
model_turnr   r   r   rU   rB   r   messagesr,   r,   r-   test_async_session_receive_text  s   
r   c                    s   t ddgd| _tjt|d| d}| }t|I d H }t|d tj	s(J |d j
jjd jjdks7J |d j
jjd jjdksFJ tt t| I d H  W d    d S 1 s`w   Y  d S )	Nzl{"serverContent": {"modelTurn": {"parts":[{"inlineData": {"data": "MDAwMDAw", "mimeType": "audio/pcm" }}]}}}rN   r   r   r   r   r   r   )r   rR   r   r   rM   r   rz   r<   r   r   r   r   r   inline_datar   r   r   r   RuntimeErrorr   r,   r,   r-    test_async_session_receive_audio  s*   	
"r   c                    s   t ddgd| _tjt|d| d}| }t|I d H }t|d tj	s(J |d j
jd jdks5J |d j
jd jd d	ksDJ |d j
jd jd
 dksSJ tt t| I d H  W d    d S 1 smw   Y  d S )Nzv{"toolCall": {"functionCalls": [{"name": "get_current_weather", "args": {"location": "San Francisco", "unit": "C"}}]}}rN   r   r   r   r   r   r#   zSan Franciscor$   r   )r   rR   r   r   rM   r   rz   r<   r   r   Z	tool_callZfunction_callsr'   argsr   r   r   r   r,   r,   r-   $test_async_session_receive_tool_call  s(   

"r   c                    s   t g dd| _tjt|d| d}| }t|I d H }t|d tj	s(J |d j
jjdks3J |d j
jjdks>J t|d tj	sHJ |d j
jjd	ksSJ |d j
jjd
ks^J d S )N)zS{"serverContent": {"inputTranscription": {"text": "test_input", "finished": true}}}zV{"serverContent": {"outputTranscription": {"text": "test_output", "finished": false}}}rN   r   r   r   r   Z
test_inputTr   Ztest_outputF)r   rR   r   r   rM   r   rz   r<   r   r   r   Zinput_transcriptionr   finishedZoutput_transcriptionr   r,   r,   r-   (test_async_session_receive_transcription  s   
r   c                    sx   t ddgd| _tjtjddd}tjt|d| d}| }t	|I d H }|d	 }t
|tjs4J ||ks:J d S )
Nz{"goAway": {"timeLeft": "10s"}}rN   r   Z10s)Z	time_left)Zgo_awayr   r   r   )r   rR   r   r   ZLiveServerGoAwayr   r   rM   r   rz   r<   rU   rB   expected_resultr   r   messager,   r,   r-   test_async_go_away(  s"   

r   c                    s|   t ddgd| _tjtjddddd}tjt|d	| d
}| }t	|I d H }|d }t
|tjs6J ||ks<J d S )Nz{
                "sessionResumptionUpdate": {
                    "newHandle": "test_handle",
                    "resumable": "true",
                    "lastConsumedClientMessageIndex": "123456789"
                }
          }rN   r   test_handleTi[)Z
new_handleZ	resumableZ"last_consumed_client_message_index)Zsession_resumption_updater   r   r   )r   rR   r   r   Z!LiveServerSessionResumptionUpdater   r   rM   r   rz   r<   r   r,   r,   r-   $test_async_session_resumption_updateA  s*   
r   c                    sP   t t|d| }dd }|j| dd2 z3 d H W }t|tjs$J q6 d S )Nr   c                   S  s   dV  dV  d S )Ns   data1s   data2r,   r,   r,   r,   r-   mock_streamp  s   
z4test_async_session_start_stream.<locals>.mock_streamr   )streamr   )r   r   rM   Zstart_streamr<   r   r   )rU   rB   r   r   r   r,   r,   r-   test_async_session_start_streamf  s   
r   c                    s   t jddgd| _tjt|d| d}t| I d H }t|dks%J |d }t	|t
js1J |jd us8J |jjt
jjksBJ |d jjdu sLJ d S )	NzJ{"voiceActivityDetectionSignal": {"vadSignalType": "VAD_SIGNAL_TYPE_SOS"}}rN   r   r   r   r   T)r   r   rR   r   r   rM   rz   r   lenr<   r   r   Zvoice_activity_detection_signalZvad_signal_typeZVadSignalTypeZVAD_SIGNAL_TYPE_SOSr   r   )rU   rB   r   r   Zvad_messager,   r,   r-   %test_async_session_receive_vad_signalz  s$   
r   c                    s0   t t|d| }| I d H  | j  d S )Nr   )r   r   rM   rS   ri   r   r,   r,   r-   test_async_session_close  s   
r   c                    s   t   t d tt| dddI d H }W d    n1 s!w   Y  di i}| rBd|d d< i |d d< d	g|d d d
< nd|d d< ||ksNJ d S )Nerrorr   
test_modelre   setupOprojects/test_project/locations/us-central1/publishers/google/models/test_modelre   generationConfigAUDIOresponseModalitiesmodels/test_model)warningscatch_warningssimplefilterrv   rM   )rB   resultr   r,   r,   r-    test_bidi_setup_to_api_no_config  s   

r   c                    s  dddddiidddd	d
dddddddiddigdddi}| rCd|d d< dg|d d d< dddiidd|d d d< nd|d d< dddiidddddid	d
dddddd
}t t| dd |d!I d H }tjj|d d"tjj|d d"ks~J tjtjtjtjdd#d$dddtj	dd%d	d
ddtj
jddd&
}t t| dd |d!I d H }tjj|d d"tjj|d d"ksJ d S )'Nr   r   prebuilt_voice_config
voice_namez
en-defaultzen-US)voice_configZlanguage_codeTffffff?皙?g      "@
   MEDIA_RESOLUTION_MEDIUM   )speechConfigZenableAffectiveDialogr   ZtopPZtopKZmaxOutputTokensmediaResolutionseedproactive_audior   test instructionuserr   role)re   r   proactivitysystemInstructionr   re   r   r   r   )ZvoiceConfigZlanguageCoder   	   )
speech_configenable_affective_dialogr  r   top_ptop_kmax_output_tokensr  system_instructionmedia_resolutionr   r   rd   )r   r]   )r   )r   )r  )
r
  r  r  r   r  r  r  r  r  r  )rv   rM   r   LiveClientMessageZ_from_responseLiveConnectConfigZSpeechConfigZVoiceConfigZPrebuiltVoiceConfigZProactivityConfigZMediaResolutionr   )rB   r   config_dictr   rf   r,   r,   r-   $test_bidi_setup_to_api_speech_config  s   

r  c              	      s   ddddddiiddddd	iidgiid
ddddddd}t jtdd tt| dd|dI d H }W d    d S 1 s@w   Y  d S )NZmulti_speaker_voice_configZspeaker_voice_configsZAlicer   r   Zleda)speakerr   ZBobZkorer   r   r	  r   r   r  r   )r
  r   r  r  r  r  r  r  z.*multi_speaker_voice_config.*matchr   r   rd   )r   r   r   rv   rM   rB   r  r   r,   r,   r-   2test_bidi_setup_error_if_multispeaker_voice_config"  s:   "r  c                    sv   ddi}t t| dt tt| dd|dI d H }W d    n1 s&w   Y  | s/d S |d d dks9J d S )Nexplicit_vad_signalTr   r   rd   r   explicitVadSignal)r   exception_if_mldevrM   r   rv   r  r,   r,   r-   test_explicit_vadJ  s   
r  c                    sz   t | d}ddi}t|t tt | dd|dI d H }W d    n1 s(w   Y  | s1d S |d d dks;J d S )Nr   r  Tr   rd   r   r  )rM   r   r  r   rv   )rB   rK   r  r   r,   r,   r-   test_explicit_vad_configZ  s   
r  c                     sD   dddii} t tddd| dI d H }|d d	 ddiks J d S )
NZhistory_configZ!initial_history_in_client_contentTFr   r   rd   r   ZhistoryConfigrv   rM   )r  r   r,   r,   r-   test_history_configl  s   
r   c                    s   dddigddi}t jdi |}ddddigdddi}| r8d	|d d
< i |d d< dg|d d d< nd|d d
< tt| dd|dI d H }||ksQJ d S )Nr  r   r  r  r  r   r   )re   r  r   re   r   r   r   r   r   rd   r,   r   r  rv   rM   rB   r  rf   r   r   r,   r,   r-   >test_bidi_setup_to_api_with_system_instruction_as_content_typey  s8   	r#  c                    s   dgdddidi igd}t jdi |}dddgdd	digd
ddi igdi}| r4d|d d< nd|d d< tt| dd|dI d H }||ksMJ tt| dd|dI d H }||ks`J d S )NTEXTr  r   r   google_searchresponse_modalitiesr  generation_configtoolsr   r   r   r   r  r  googleSearchr   r  r)  r   re   r   r   r   rd   r,   r!  r"  r,   r,   r-   6test_bidi_setup_to_api_with_config_tools_google_search  s<   r-  c                    s   dgdddidi igd}t jdi |}dddgdd	digd
ddi igdi} r4d|d d< nd|d d< tjtdd dtjtdd d fdd}||I d H }||ks]J ||I d H }||ksjJ d S )Nr$  r  r   r   r%  r&  r   r*  r   r  r  r+  r,  r   re   r   r   ra   ZMcpToolc                    s   t t dd| dI d H S )Nr   r   rd   r  )rf   r   r,   r-   get_connect_message_no_mcp  s
   zXtest_bidi_setup_to_api_with_config_tools_with_no_mcp.<locals>.get_connect_message_no_mcpr,   )r   r  r   rs   r   )rB   r  rf   r   r.  r   r,   r   r-   4test_bidi_setup_to_api_with_config_tools_with_no_mcp  s6   r/  c              	      s   t jt jdddgt jt jddgddt jdt jd	d
dd}dddgdddigddddd	iddi}| rBd|d d< nd|d d< tt| dd|dI d H }||ks[J d S )Nr   )r   r$  r  r   r  r  i  r   )target_tokens)Ztrigger_tokensZsliding_window)r(  r'  r  Zcontext_window_compressionr   r*  r   r0  )r   r  ZcontextWindowCompressionr   re   r   r   r   rd   )	r   r  ZGenerationConfigr   r   ZContextWindowCompressionConfigZSlidingWindowrv   rM   )rB   rf   r   r   r,   r,   r-   6test_bidi_setup_to_api_with_context_window_compression  s@   

r1  c                    s  ddidt igd}tjdi |}ddddd	d
dd	ddgddddddgigdi}tt| dd|dI d H }|d d d d d d |d d d d d d ks[J tt| dd|dI d H }|d d d d d d |d d d d d d ksJ d S )Nr   r   function_declarationsr(  r)  r   r   functionDeclarationsr   r   r   r   r   r   r    r"   r%   r   r   r(   r'   r   re   r)  r   rd   r)  r   r   r,   )r2  r   r  rv   rM   r"  r,   r,   r-   =test_bidi_setup_to_api_with_config_tools_function_declaration%  sV   r7  c                    s  ddit gd}tjdi |}dddddd	d
dddgddddddgigdi}tt| dd|dI d H }|d d d d d d |d d d d d d ksYJ tt| dd|dI d H }|d d d d d d |d d d d d d ksJ d S )Nr   r   r3  r   r   r4  r   r   r   r   r   r   r    r"   r%   r   r)   r5  r6  r   rd   r)  r   r   r,   )r   r   r  rv   rM   r"  r,   r,   r-   :test_bidi_setup_to_api_with_config_tools_function_directlya  sV   r8  c                    s   t | d}tjj|td}tjj|_ddid|gigd}tjdi |}t	
|t tt | dd|dI d H }W d    n1 sDw   Y  | rMd S |d	 d
 d d d d dks_J d S )Nr   )r	   callabler   r   r2  r3  r   rd   r   r)  r   r4  behaviorNON_BLOCKINGr,   )rM   r   ZFunctionDeclarationfrom_callabler   ZBehaviorr;  r:  r  r   Zexception_if_vertexr   rv   )rB   rK   Zdeclarationr  rf   r   r,   r,   r-   3test_bidi_setup_to_api_with_tools_function_behavior  s(   


r=  c                    s   t d u rd S dddddddiidd	d
dgigdi}dddgiddddddiidd	d
dgigdi}tt| dddt jd	d
ddddiiddgidI d H }| r\||ksbJ |s`J d S d S )Nr   r   r4  r   r#   r   r   r%   get_weatherGet the weather in a city.r5  r6  r   r   r   r   re   r)  r   r   r)  rs   stringr'   r   ZinputSchemard   )r   rv   rM   Tool)rB   expected_result_googleaiexpected_result_vertexair   r,   r,   r-   ,test_bidi_setup_to_api_with_config_mcp_tools  sp   
rF  c                    s   t d u rd S G dd dt}ddddddd	iid
dddgigdi}dddgidddddd	iid
dddgigdi}tt| ddd| gidI d H }| rX||ks^J |s\J d S d S )Nc                   @   s   e Zd Zdd Zdd ZdS )zLtest_bidi_setup_to_api_with_config_mcp_session.<locals>.MockMcpClientSessionc                 S   s   d | _ d | _d S rZ   )Z_read_streamZ_write_streamselfr,   r,   r-   __init__  s   
zUtest_bidi_setup_to_api_with_config_mcp_session.<locals>.MockMcpClientSession.__init__c                    s*   t jt jddddddiiddgd	S )
Nr>  r?  rs   r#   r   rA  r%   rB  )r)  )r   ZListToolsResultrC  rG  r,   r,   r-   
list_tools  s   
zWtest_bidi_setup_to_api_with_config_mcp_session.<locals>.MockMcpClientSession.list_toolsN)__name__
__module____qualname__rI  rJ  r,   r,   r,   r-   MockMcpClientSession  s    rN  r   r   r4  r   r#   r   r   r%   r>  r?  r5  r6  r   r   r   r@  r   r   r)  rd   )r   r   rv   rM   )rB   rN  rD  rE  r   r,   r,   r-   .test_bidi_setup_to_api_with_config_mcp_session  sb   
rO  c                    sv   ddi igi}t jd
i |}dddi igdi}tt| dd|dI d H }|d d d	 |d d d	 ks9J d S )Nr)  Zcode_executionr   r   ZcodeExecutionr6  r   rd   r   r,   r!  r"  r,   r,   r-   7test_bidi_setup_to_api_with_config_tools_code_execution^  s   
(rP  c                    sz   ddddddddd	d
i}t jdi |}dd|d di}tt| dd|dI d H }|d d |d d ks;J d S )NZrealtime_input_configTZSTART_SENSITIVITY_HIGHZEND_SENSITIVITY_HIGH   d   )disabledZstart_of_speech_sensitivityZend_of_speech_sensitivityZprefix_padding_msZsilence_duration_msZNO_INTERRUPTIONZTURN_INCLUDES_ALL_INPUT)Zautomatic_activity_detectionZactivity_handlingZturn_coverager   r   )re   realtimeInputConfigr   rd   rT  r,   r!  r"  r,   r,   r-   1test_bidi_setup_to_api_with_realtime_input_configw  s2   

rU  c                    b   di i}t jdi |}ddi di}tt| dd|dI d H }|d d |d d ks/J d S )	NZinput_audio_transcriptionr   r   )re   inputAudioTranscriptionr   rd   rW  r,   r!  r"  r,   r,   r-   /test_bidi_setup_to_api_with_input_transcription  s   

rX  c                    rV  )	NZoutput_audio_transcriptionr   r   )re   outputAudioTranscriptionr   rd   rY  r,   r!  r"  r,   r,   r-   0test_bidi_setup_to_api_with_output_transcription  s    

rZ  c                    sn   ddi}t jd
i |}ddddidi}tt| dd|dI d H }|d d	 d |d d	 d ks5J d S )Nr  ZMEDIA_RESOLUTION_LOWr   r   r   )re   r   r   rd   r   r,   r!  r"  r,   r,   r-   ,test_bidi_setup_to_api_with_media_resolution  s    r[  c                    s>   dddgiddi}t t| dddI d H }||ksJ d S )	Nr   r   r   r   )r   re   r   z#publishers/google/models/test_modelr   r  )rB   r   r   r,   r,   r-   test_bidi_setup_publishers  s   
r\  c                    sn   t jtdd tt| dddddiidI d H }W d    n1 s$w   Y  |d	 d
 d dks5J d S )Nz;Setting `LiveConnectConfig.generation_config` is deprecatedr  r   r   r(  r   r   rd   r   r   )r   ZwarnsDeprecationWarningrv   rM   )rB   r   r,   r,   r-   )test_bidi_setup_generation_config_warning  s   
	r^  c                    s   dddii}t jdi |}tt| dd|dI d H }ddddiii}| r6d	d
gi|d d< d|d d< nd|d d< ||ksBJ d S )Nsession_resumptionhandler   r   r   rd   r   sessionResumptionr   r   r   r   re   r   r,   r!  )rB   r  rf   r   r   r,   r,   r-   .test_bidi_setup_to_api_with_session_resumption  s.   rb  c                    s   t | d}ddddi}tjdi |}t|t tt | dd|dI d H }W d    n1 s3w   Y  dd	dddii}| rSd
dgi|d d< d|d d< nd S ||ks[J d S )Nr   r_  r   T)r`  transparentr   rd   r   ra  r   r   r   r   re   r,   )rM   r   r  r   r  r   rv   )rB   rK   r  rf   r   r   r,   r,   r-   :test_bidi_setup_to_api_with_transparent_session_resumption+  s6   

rd  c                 C   sf   t jt|d| d}|d}d|v sJ |dddddigdgd	iks'J tjd
i |s1J d S )Nr   r   r   r   Fr  r   r  r   r   r   r,   )r   r   rM   _parse_client_messager   r  rU   rB   r   r   r,   r,   r-   test_parse_client_message_strP  s   


ri  c                    s   ddddi}ddddi}| rdg|d< dd	|ii}| r%d
|d d< nd|d d< t t| dd|dI d H }t|}t|}||ksHJ d S )NZthinking_configTi   )Zinclude_thoughtsZthinking_budgetZthinkingConfigr   r   r   r   r   re   r   r   r   rd   )rv   rM   r   Zcamel_to_snake_all_keys)rB   r  Zexpected_gen_configr   r   r,   r,   r-   +test_bidi_setup_to_api_with_thinking_configb  s:   


rj  c                 C   s\   t jt|d| d}|tjtg ddd}d|v sJ |ddddd	giiks,J d S 
Nr   r   r   r   r   
text/plainr   r   r   AAAAr   r   )r   r   rM   rg  r   r   bytesrh  r,   r,   r-   test_parse_client_message_blob  s   
rq  c                 C   sh   t jt|d| d}tjtg ddd}| }||}d|v s$J |ddddd	giiks2J d S rk  )r   r   rM   r   r   rp  
model_dumprg  )rU   rB   r   ZblobZ	blob_dictr   r,   r,   r-   #test_parse_client_message_blob_dict  s   

rs  c                 C   sr   t jt|d| d}|tjdtjtjddgddgd}d	|v s%J |d	ddd
digdgdiks7J d S )Nr   r   Fr   r   r  r  rf  r   r   re  )r   r   rM   rg  r   r   r   r   rh  r,   r,   r-   (test_parse_client_message_client_content  s    
rt  c                 C   s   t jt|d| d}tjdtjtjtjtg ddddgdd	gd
}|	|}d|v s0J t
|d d d d d d d tksFJ |dddddddigdgd
iks[J d S )Nr   r   Frl  rm  r   r   r  r  rf  r   r   r   r   r   r   rn  ro  re  )r   r   rM   r   r   r   r   r   rp  rg  r   strrU   rB   r   r   r   r,   r,   r-   -test_parse_client_message_client_content_blob  sD   

rx  c                 C   s   t jt|d| d}tjdtjtjtjtg ddddgdd	gd
}|	|j
ddd}d|v s5J t|d d d d d d d tksKJ |dddddddigdgd
iks`J d S )Nr   r   Frl  rm  r   ru  r  r  rf  rj   TmodeZexclude_noner   r   r   r   r   r   rn  ro  re  )r   r   rM   r   r   r   r   r   rp  rg  rr  r   rv  rw  r,   r,   r-   -test_parse_client_message_client_content_dict  sH   
r{  c                 C   sj   t jt|d| d}tjtjtg dddgd}||}d|v s%J |dddd	d
giiks3J d S )Nr   r   rl  rm  r   r   r   r   rn  ro  )r   r   rM   r   r   r   rp  rg  rU   rB   r   r   r   r,   r,   r-   (test_parse_client_message_realtime_input   s   

r}  c                 C   st   t jt|d| d}tjtjtg dddgd}||jddd	}d
|v s*J |d
ddddgiiks8J d S )Nr   r   rl  rm  r   r   rj   Try  r   r   rn  ro  )	r   r   rM   r   r   r   rp  rg  rr  r|  r,   r,   r-   -test_parse_client_message_realtime_input_dict3  s   
r~  c                 C   sn   t jt|d| d}tjtjddddidgd}||}d	|v s$J |d	d
ddddidgiiks5J d S )Nr   r   test_id	test_namer   test_responser   r'   r   r   r   r   )r   r   rM   r   r   r   rg  r|  r,   r,   r-   'test_parse_client_message_tool_responseH  s0   

	r  c              	   C   sl   t jt|d| d}tjddddddd	}||}d
|v s!J |d
dddddddd	giiks4J d S )Nr   r   r  r  r  Ztest_user_nameZtest_user_email)r   Z	user_nameZ	userEmailr  r   r   )r   r   rM   r   r   rg  r|  r,   r,   r-   +test_parse_client_message_function_responsei  s4   

	r  c                 C   s`   t jt|d| d}ddddid}||}d|v sJ |dd	ddddidgiiks.J d S )
Nr   r   r  r  r   r  r  r   r   )r   r   rM   rg  r|  r,   r,   r-   ?test_parse_client_message_tool_response_dict_with_only_response  s*   

r  c                 C   sx   t jt|d| d}tjtjddddidgd}||jd	d
d}d|v s)J |ddddddidgiiks:J d S )Nr   r   r  r  r   r  r  r   rj   Try  r   r   )r   r   rM   r   r   r   rg  rr  r|  r,   r,   r-   0test_parse_client_message_realtime_tool_response  s4   

r  c                    s`   t dd}td|di  tjd fdd	}tjtd|d fd	d
}| I d H  d S )NZprovided_fake_tokenrX   TrB   rI   c                      | d< V  d S Nr2   r,   r[   capturerU   r,   r-   r_        
z<test_connect_with_provided_credentials.<locals>.mock_connectrc   ra   c               	      t   t } | jdd4 I d H  W d   I d H  n1 I d H s!w   Y  d d v s.J  d d dks8J d S )N
test-modelr   r   r2   zBearer provided_fake_tokenr   rg   rh   rm   r  r	   r,   r-   rp     s   
(z=test_connect_with_provided_credentials.<locals>._test_connectrZ   )r   rM   rq   rr   r   rs   r   )rU   rI   r_   rp   r,   r  r	   rU   r-   &test_connect_with_provided_credentials  s   
r  c                    s   t dd dtdd}tdd}|d f|_i  tjd fdd	}td	|d
tjtd|d
 fdd}| I d H  d S )NTr  rW   rO   Zdefault_test_tokenrX   c                   r  r  r,   r[   r  r,   r-   r_     r  z;test_connect_with_default_credentials.<locals>.mock_connectr`   ra   rc   c               	      r  )Nr  r   r   r2   zBearer default_test_tokenr  rm   r  r,   r-   rp     s   
(z<test_connect_with_default_credentials.<locals>._test_connectrZ   )rM   r   rP   rq   rr   r   rs   r   )rU   rt   ru   r_   rp   r,   r  r-   %test_connect_with_default_credentials  s   



r  c                    sb   t jddddiddi  tjd fdd	}tjtd	|d
 fdd}| I d H  d S )NThttps://custom-base-url.comr   Bearer custom_test_tokenr   r   c                      |  d< | d< V  d S Nr\   r2   r,   r[   r  r,   r-   r_        
z7test_connect_with_custom_base_url.<locals>.mock_connectrc   ra   c               	      s   t } | jdd4 I d H  W d   I d H  n1 I d H s!w   Y  d d v s.J  d d dks8J  d dks@J d S )Nr  r   r   r2   r  r\   r  r  rm   r  r,   r-   rp     s   
(z8test_connect_with_custom_base_url.<locals>._test_connectrZ   )r7   r8   rq   rr   r   rs   r   )rU   r_   rp   r,   r  r-   !test_connect_with_custom_base_url  s   	r  c              
      s  t |d}d|_t|ddI d H }t t _tdd_i  tjd fdd	}tj	t
d	|d
- t
|}|jdd4 I d H  W d   I d H  n1 I d H sUw   Y  W d    n1 sdw   Y  d d v ssJ d d d dks}J d d v sJ d S )Nr   zauth_tokens/TEST_AUTH_TOKENr   r   rV   rO   c                   r  r  r,   r[   r  r^   r,   r-   r_   4  r  z=test_bidi_setup_to_api_with_auth_tokens.<locals>.mock_connectrc   ra   r   r2   z)Authorization key is missing from headersz!Token auth_tokens/TEST_AUTH_TOKENZBidiGenerateContentConstrainedr\   rZ   )rM   r9   rv   r   rQ   rR   rq   rr   r   rs   r   rg   rh   rU   rB   Zapi_client_mockr   r_   rn   r,   r  r-   'test_bidi_setup_to_api_with_auth_tokens$  s4   

(r  c              
      s  t |d}tjdddii|_t|ddI d H }t t _tdd_i  t	j
d fd	d
	}tjtd|d- t|}|jdd4 I d H  W d   I d H  n1 I d H s]w   Y  W d    n1 slw   Y  d d v s{J d d d dksJ d d v sJ d S )Nr   r2   r}   r0   r   r   rV   rO   c                   r  r  r,   r[   r  r,   r-   r_   \  r  z9test_bidi_setup_to_api_with_api_key.<locals>.mock_connectrc   ra   z&x-goog-api-key is missing from headersZBidiGenerateContentr\   rZ   )rM   r   r>   r@   rA   rv   r   rQ   rR   rq   rr   r   rs   r   rg   rh   r  r,   r  r-   #test_bidi_setup_to_api_with_api_keyJ  s4   


(r  )FNNrZ   )y__doc__rq   rj   rD   r5   typingr   r   Zunittestr   Zunittest.mockr   r   r   r   rG   Zgoogle.oauth2.credentialsr   r   Z
websocketsr	   r   r   r   rK   r   r   r7   r   r   ZaiohttpZAIOHTTP_NOT_INSTALLEDImportErrorr6   TYPE_CHECKINGZmcpr   r   r   Type__annotations__markZskipifZrequires_aiohttpr2  rv  r   rM   ZfixturerU   rv   rz   r   r   r   r   r   ZparametrizeZasyncior   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r#  r-  r/  r1  r7  r8  r=  rF  rO  rP  rU  rX  rZ  r[  r\  r^  rb  rd  ri  rj  rq  rs  rt  rx  r{  r}  r~  r  r  r  r  r  r  r  r  r  r,   r,   r,   r-   <module>   s  
&


#
	
 	#i&
%+**::KV"#
'



,
.


 
"

#


$