o
    if
                    @   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 Zxej)9d:ddgej)j:dd Zyej)9d:dgej)j:dd Zzd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,   Y/home/livre-enfant/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-central1test_projectc                   S   s   dS )N	test_hostr,   r,   r,   r,   r-   <lambda>t   s    z!mock_api_client.<locals>.<lambda>headersSSL_CERT_FILESSL_CERT_DIR)cafilecapathsslr,   )r   	MagicMock	gl_clientBaseApiClientapi_keyr#   projectcustom_base_url
isinstancedictr   HttpOptionsbase_url_host_credentialsmodel_validate_http_optionsvertexair   r9   create_default_contextosenvirongetcertifiwhere_websocket_ssl_ctx)rH   credentialshttp_options
api_clientctxr,   r,   r-   mock_api_client]   s>   


rT   c                  C   s,   t tjd} t  | _t dd| _t  | _| S )Nr.   ){"serverContent": {"turnComplete": true}}return_value)r   r	   ClientConnectionsendrecvclose)	websocketr,   r,   r-   mock_websocket   s   r]   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"}
}
rV   NN
test_tokentokenc                       V  d S Nr,   uriadditional_headerskwargsmock_wsr,   r-   mock_connect      
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connectrY   assert_called_oncejsonloads	call_argslive_modulerR   rs   rj   rr   r,   r-   _test_connect   s   
(
z*get_connect_message.<locals>._test_connectrd   )
r   rY   rZ   r   rW   
contextlibasynccontextmanagerr   objectr   )rR   rr   rs   mock_google_auth_default
mock_credsrk   r}   r,   r|   r-   get_connect_message   s"   



r   c                    s   dd | 2 I d H S )Nc                    s   g | z3 d H W }|q6 S rd   r,   ).0valuer,   r,   r-   
<listcomp>   s    z+_async_iterator_to_list.<locals>.<listcomp>r,   )
async_iterr,   r,   r-   _async_iterator_to_list   s   r   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   rH   r=   r@   rR   r<   rG   r4   monkeypatchr=   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 )Nfake_project_idzfake-locationGOOGLE_GENAI_USE_VERTEXAItrueGOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATIONr   )r   r   r   r   r   r?   rH   r>   r@   rR   r<   rG   r4   )r   
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   rC   )r=   rQ   zwss://test.com)r;   r<   _websocket_base_urlrC   rR   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rC   r4   rH   rQ   )r;   r<   r>   r#   r   r   r,   r,   r-   4test_websocket_base_url_no_auth_with_custom_base_url   s   	r   rH   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rH   rR   r\   testinputr   client_contentr   AsyncSessionrT   rY   rv   rw   rx   ry   r]   rH   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   r]   rH   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   rT   r   LiveClientContentContentPartrY   rv   rw   rx   ry   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   r]   rH   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   rT   r   BlobrY   rv   rw   rx   ry   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   MDAwMDAwr   r   media_chunksr   r   r   )r   r   rT   r   LiveClientRealtimeInputr   rY   rv   rw   rx   ry   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   rT   r   LiveClientToolResponseFunctionResponserY   rv   rw   rx   ry   )r]   rH   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   invalid_keyinvalid_valuer   )r   r   rT   pytestraises
ValueErrorrY   r]   rH   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   rT   receiver   r@   r   LiveServerMessage)r]   rH   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 jsonrV   r   r   )
r   rZ   r   r   rT   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"}]}}}rU   side_effectr   r   r   r      T)r   rZ   r   r   rT   r   r   r@   r   r   server_content
model_turnr   r   r   r]   rH   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" }}]}}}rU   r   r   r   r   r   r   )r   rZ   r   r   rT   r   r   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"}}]}}rU   r   r   r   r   r   r#   zSan Franciscor$   r   )r   rZ   r   r   rT   r   r   r@   r   r   	tool_call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}}}rU   r   r   r   r   
test_inputTr   test_outputF)r   rZ   r   r   rT   r   r   r@   r   r   r   input_transcriptionr   finished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"}}rU   r   10s)	time_left)go_awayr   r   r   )r   rZ   r   r   LiveServerGoAwayr   r   rT   r   r   r@   r]   rH   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"
                }
          }rU   r   test_handleTi[)
new_handle	resumable"last_consumed_client_message_index)session_resumption_updater   r   r   )r   rZ   r   r   !LiveServerSessionResumptionUpdater   r   rT   r   r   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   rT   start_streamr@   r   r   )r]   rH   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"}}rU   r   r   r   r   T)r   r   rZ   r   r   rT   r   r   lenr@   r   r   voice_activity_detection_signalvad_signal_typeVadSignalTypeVAD_SIGNAL_TYPE_SOSr   r   )r]   rH   r   r   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   rT   r[   rv   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rr   setupOprojects/test_project/locations/us-central1/publishers/google/models/test_modelrr   generationConfigAUDIOresponseModalitiesmodels/test_model)warningscatch_warningssimplefilterr   rT   )rH   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_configlanguage_codeTffffff?皙?g      "@
   MEDIA_RESOLUTION_MEDIUM   )speechConfigenableAffectiveDialogr   topPtopKmaxOutputTokensmediaResolutionseedproactive_audior   test instructionuserr   role)rr   r  proactivitysystemInstructionr  rr   r  r  r  )voiceConfiglanguageCoder)  	   )
speech_configenable_affective_dialogr5  r   top_ptop_kmax_output_tokensr/  system_instructionmedia_resolutionr   r  rq   )r   rh   )r!  )r   )r0  )
r:  r;  r5  r   r<  r=  r>  r@  r/  r?  )r   rT   r   LiveClientMessage_from_responseLiveConnectConfigSpeechConfigVoiceConfigPrebuiltVoiceConfigProactivityConfigMediaResolutionr'  )rH   r   config_dictr  rs   r,   r,   r-   $test_bidi_setup_to_api_speech_config  s   

rJ  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 )Nmulti_speaker_voice_configspeaker_voice_configsAlicer   r!  leda)speakerr"  Bobkorer$  r%  r9  r&  r(  r1  r'  )r:  r   r<  r=  r>  r/  r?  r@  z.*multi_speaker_voice_config.*matchr   r  rq   )r   r   r   r   rT   rH   rI  r  r,   r,   r-   2test_bidi_setup_error_if_multispeaker_voice_config"  s:   "rU  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  rq   r  explicitVadSignal)r   exception_if_mldevrT   r   r   rT  r,   r,   r-   test_explicit_vadJ  s   
rY  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   rV  Tr  rq   r  rW  )rT   r   rX  r   r   )rH   rR   rI  r  r,   r,   r-   test_explicit_vad_configZ  s   
rZ  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 )
Nhistory_config!initial_history_in_client_contentTFr   r  rq   r  historyConfigr   rT   )rI  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   r1  r2  r3  r  r  )rr   r6  r  rr   r  r  r  r  r   rq   r,   r   rC  r   rT   rH   rI  rs   r   r  r,   r,   r-   >test_bidi_setup_to_api_with_system_instruction_as_content_typey  s8   	rb  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TEXTr1  r   r$  google_searchresponse_modalitiesr?  generation_configtoolsr  r   r  r   r2  r3  googleSearchr  r6  rh  r  rr   r  r   r  rq   r,   r`  ra  r,   r,   r-   6test_bidi_setup_to_api_with_config_tools_google_search  s<   rl  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 )Nrc  r1  r   r$  rd  re  r  ri  r   r2  r3  rj  rk  r  rr   r  r   rn   McpToolc                    s   t t dd| dI d H S )Nr   r  rq   r^  )rs   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   rC  r   r   r   )rH   rI  rs   r   rn  r  r,   r   r-   4test_bidi_setup_to_api_with_config_tools_with_no_mcp  s6   ro  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   rc  r1  r   r2  r3  i  r&  )target_tokens)trigger_tokenssliding_window)rg  rf  r?  context_window_compressionr  ri  r   rp  )r  r6  contextWindowCompressionr  rr   r  r   r  rq   )	r   rC  GenerationConfigr   r   ContextWindowCompressionConfigSlidingWindowr   rT   )rH   rs   r   r  r,   r,   r-   6test_bidi_setup_to_api_with_context_window_compression  s@   

rx  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rg  rh  r  r  functionDeclarationsr   r   r   r   r   r   r    r"   r%   r   r   r(   r'   r   rr   rh  r   rq   rh  r   r   r,   )ry  r   rC  r   rT   ra  r,   r,   r-   =test_bidi_setup_to_api_with_config_tools_function_declaration%  sV   r~  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$  rz  r  r  r{  r   r   r   r   r   r   r    r"   r%   r   r)   r|  r}  r   rq   rh  r   r   r,   )r   r   rC  r   rT   ra  r,   r,   r-   :test_bidi_setup_to_api_with_config_tools_function_directlya  sV   r  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$  ry  rz  r  rq   r  rh  r   r{  behaviorNON_BLOCKINGr,   )rT   r   FunctionDeclarationfrom_callabler   Behaviorr  r  rC  r   exception_if_vertexr   r   )rH   rR   declarationrI  rs   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  r{  r   r#   r   r   r%   get_weatherGet the weather in a city.r|  r}  r  r  r  r  rr   rh  r   r  rh  r   stringr'   r   inputSchemarq   )r   r   rT   Tool)rH   expected_result_googleaiexpected_result_vertexair  r,   r,   r-   ,test_bidi_setup_to_api_with_config_mcp_tools  sp   
r  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 rd   )_read_stream_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  r   r#   r   r  r%   r  )rh  )r   ListToolsResultr  r  r,   r,   r-   
list_tools  s   
zWtest_bidi_setup_to_api_with_config_mcp_session.<locals>.MockMcpClientSession.list_toolsN)__name__
__module____qualname__r  r  r,   r,   r,   r-   MockMcpClientSession  s    r  r  r  r{  r   r#   r   r   r%   r  r  r|  r}  r  r  r  r  r   r  rh  rq   )r   r   r   rT   )rH   r  r  r  r  r,   r,   r-   .test_bidi_setup_to_api_with_config_mcp_session  sb   
r  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 )Nrh  code_executionr  r  codeExecutionr}  r   rq   r   r,   r`  ra  r,   r,   r-   7test_bidi_setup_to_api_with_config_tools_code_execution^  s   
(r  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 )Nrealtime_input_configTSTART_SENSITIVITY_HIGHEND_SENSITIVITY_HIGH   d   )disabledstart_of_speech_sensitivityend_of_speech_sensitivityprefix_padding_mssilence_duration_msNO_INTERRUPTIONTURN_INCLUDES_ALL_INPUT)automatic_activity_detectionactivity_handlingturn_coverager  r  )rr   realtimeInputConfigr   rq   r  r,   r`  ra  r,   r,   r-   1test_bidi_setup_to_api_with_realtime_input_configw  s2   

r  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 )	Ninput_audio_transcriptionr  r  )rr   inputAudioTranscriptionr   rq   r  r,   r`  ra  r,   r,   r-   /test_bidi_setup_to_api_with_input_transcription  s   

r  c                    r  )	Noutput_audio_transcriptionr  r  )rr   outputAudioTranscriptionr   rq   r  r,   r`  ra  r,   r,   r-   0test_bidi_setup_to_api_with_output_transcription  s    

r  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@  MEDIA_RESOLUTION_LOWr  r  r.  )rr   r  r   rq   r  r,   r`  ra  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  rr   r   z#publishers/google/models/test_modelr  r^  )rH   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 deprecatedrR  r   r  rg  r   r$  rq   r  r  )r   warnsDeprecationWarningr   rT   )rH   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  rq   r  sessionResumptionr  r  r  r  rr   r  r,   r`  )rH   rI  rs   r  r   r,   r,   r-   .test_bidi_setup_to_api_with_session_resumption  s.   r  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  rq   r  r  r  r  r  r  rr   r,   )rT   r   rC  r   rX  r   r   )rH   rR   rI  rs   r  r   r,   r,   r-   :test_bidi_setup_to_api_with_transparent_session_resumption+  s6   

r  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   Fr2  r   r4  r   r   r   r,   )r   r   rT   _parse_client_messager   rA  r]   rH   r   r  r,   r,   r-   test_parse_client_message_strP  s   


r  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 )Nthinking_configTi   )include_thoughtsthinking_budgetthinkingConfigr  r  r  r  r  rr   r  r   r  rq   )r   rT   r   camel_to_snake_all_keys)rH   rI  expected_gen_configr   r  r,   r,   r-   +test_bidi_setup_to_api_with_thinking_configb  s:   


r  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   rT   r  r   r   bytesr  r,   r,   r-   test_parse_client_message_blob  s   
r  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 r  )r   r   rT   r   r   r  
model_dumpr  )r]   rH   r   blob	blob_dictr  r,   r,   r-   #test_parse_client_message_blob_dict  s   

r  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   r2  r3  r  r   r   r  )r   r   rT   r  r   r   r   r   r  r,   r,   r-   (test_parse_client_message_client_content  s    
r  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   Fr  r  r   r   r2  r3  r  r   r   r   r   r   r   r  r  r  )r   r   rT   r   r   r   r   r   r  r  r   strr]   rH   r   r   r  r,   r,   r-   -test_parse_client_message_client_content_blob  sD   

r  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   Fr  r  r   r  r2  r3  r  rw   Tmodeexclude_noner   r   r   r   r   r   r  r  r  )r   r   rT   r   r   r   r   r   r  r  r  r   r  r  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   r  r  r   r   r   r   r  r  )r   r   rT   r   r   r   r  r  r]   rH   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   r  r  r   r   rw   Tr  r   r   r  r  )	r   r   rT   r   r   r   r  r  r  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   rT   r   r   r   r  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  test_user_nametest_user_email)r  	user_name	userEmailr  r   r   )r   r   rT   r   r   r  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   rT   r  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   rw   Tr  r   r   )r   r   rT   r   r   r   r  r  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 )Nprovided_fake_tokenra   TrH   rP   c                      | d< V  d S Nr4   r,   re   capturer]   r,   r-   rk        
z<test_connect_with_provided_credentials.<locals>.mock_connectrp   rn   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   r4   zBearer provided_fake_tokenr   rt   ru   rz   r  r	   r,   r-   r}     s   
(z=test_connect_with_provided_credentials.<locals>._test_connectrd   )r   rT   r~   r   r   r   r   )r]   rP   rk   r}   r,   r  r	   r]   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  r_   rV   default_test_tokenra   c                   r  r  r,   re   r  r,   r-   rk     r  z;test_connect_with_default_credentials.<locals>.mock_connectrm   rn   rp   c               	      r  )Nr  r  r   r4   zBearer default_test_tokenr  rz   r  r,   r-   r}     s   
(z<test_connect_with_default_credentials.<locals>._test_connectrd   )rT   r   rW   r~   r   r   r   r   )r]   r   r   rk   r}   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 Nrf   r4   r,   re   r  r,   r-   rk        
z7test_connect_with_custom_base_url.<locals>.mock_connectrp   rn   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   r4   r  rf   r  r  rz   r  r,   r-   r}     s   
(z8test_connect_with_custom_base_url.<locals>._test_connectrd   )r;   r<   r~   r   r   r   r   )r]   rk   r}   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  r^   rV   c                   r  r  r,   re   r  rj   r,   r-   rk   4  r  z=test_bidi_setup_to_api_with_auth_tokens.<locals>.mock_connectrp   rn   r   r4   z)Authorization key is missing from headersz!Token auth_tokens/TEST_AUTH_TOKENBidiGenerateContentConstrainedrf   rd   )rT   r=   r   r   rY   rZ   r~   r   r   r   r   rt   ru   r]   rH   api_client_mockr  rk   r{   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   r4   r   r0   r  r  r^   rV   c                   r  r  r,   re   r
  r,   r-   rk   \  r  z9test_bidi_setup_to_api_with_api_key.<locals>.mock_connectrp   rn   z&x-goog-api-key is missing from headersBidiGenerateContentrf   rd   )rT   r   rB   rF   rG   r   r   rY   rZ   r~   r   r   r   r   rt   ru   r  r,   r
  r-   #test_bidi_setup_to_api_with_api_keyJ  s4   


(r  c                    s   t   t   _t dd _t   _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  d S )Nsn   {"setupComplete": {"sessionId": "test_session_id", "voiceConsentSignature": {"signature": "test_sig_abc123"}}}rV   r_   r`   ra   c                   rc   rd   r,   re   ri   r,   r-   rk     rl   zTtest_async_session_setup_complete_with_voice_consent_signature.<locals>.mock_connectrm   rn   rp   c               	      s   t t d} | jdd4 I d H ,}|jd usJ |jjdks#J |jjd us+J |jjjdks4J W d   I d H  d S 1 I d H sEw   Y  d S )Nr   r  r  test_session_idtest_sig_abc123)r   rt   rT   ru   setup_complete
session_idvoice_consent_signature	signature)r{   r   r   r,   r-   r}     s   
.zUtest_async_session_setup_complete_with_voice_consent_signature.<locals>._test_connectrd   )r   rY   rZ   r[   r   rW   r~   r   r   r   r   )rH   r   r   rk   r}   r,   )rj   rH   r-   >test_async_session_setup_complete_with_voice_consent_signaturen  s    



r  c              
      s  t jdgt jt jt jddddddd}tt| d	d
|dI d H }|di }|di }|di }|di }|di }|ddksKJ |dd usTJ |dd us]J t jdgt jt jt jddt jdddddd}tt| d	d
|dI d H }	|	di }
|
di }|di }|di }|di }|ddksJ |dd usJ |dd usJ |d ddksJ d S )Nr  z	audio/wavs   fake_audio_datas   fake_consent_data)r   voice_sample_audioconsent_audio)replicated_voice_config)r"  )rf  r:  r   r  rq   r  r  r)  r"  r  r   r  r  r  )r  )r   r  r  r  r  )	r   rC  rD  rE  ReplicatedVoiceConfigr   rT   rL   VoiceConsentSignature)rH   rs   r  r  
gen_configr:  r"  
replicatedconfig_with_sigresult_with_sig	setup_siggen_config_sigspeech_config_sigvoice_config_sigreplicated_sigr,   r,   r-   4test_bidi_setup_replicated_voice_config_with_consent  sl   r&  )FNNrd   ){__doc__r~   rw   rJ   r9   typingr   r   unittestr   unittest.mockr   r   r   r  rM   google.oauth2.credentialsr   r   
websocketsr	   r   r   r   rR   r   r   r;   r   r   aiohttpAIOHTTP_NOT_INSTALLEDImportErrorr:   TYPE_CHECKINGmcpr   r   r   Type__annotations__markskipifrequires_aiohttpry  r  r   rT   fixturer]   r   r   r   r   r   r   r   parametrizeasyncior   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  rJ  rU  rY  rZ  r_  rb  rl  ro  rx  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  r  r	  r  r  r  r&  r,   r,   r,   r-   <module>   s  
&


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