o
    i                     @   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)9d:ddge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gej)j:dd Zbej)9d:d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dd Zfej)9d:ddgej)j:dd Zgej)9d:ddg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)j:dd Zsej)j:dd Ztej)j:dd Zuej)9d:dgej)j:dd Zvej)9d:dgej)j:dd Zwd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/ubuntu/transcripts/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                   s    V  d S Nr,   uri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connectrY   assert_called_oncejsonloads	call_argslive_modulerR   rp   rh   ro   r,   r-   _test_connect   s   
(
z*get_connect_message.<locals>._test_connectrc   )
r   rY   rZ   r   rW   
contextlibasynccontextmanagerr   objectr   )rR   ro   rp   mock_google_auth_default
mock_credsri   rz   r,   ry   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 rc   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   rs   rt   ru   rv   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   rs   rt   ru   rv   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   rs   rt   ru   rv   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   rs   rt   ru   rv   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   rs   rt   ru   rv   )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[   rs   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ro   setupOprojects/test_project/locations/us-central1/publishers/google/models/test_modelro   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)ro   r  proactivitysystemInstructionr  ro   r  r  r  )voiceConfiglanguageCoder&  	   )
speech_configenable_affective_dialogr2  r   top_ptop_kmax_output_tokensr,  system_instructionmedia_resolutionr   r  rn   )r   rg   )r  )r  )r-  )
r7  r8  r2  r   r9  r:  r;  r=  r,  r<  )r   rT   r   LiveClientMessage_from_responseLiveConnectConfigSpeechConfigVoiceConfigPrebuiltVoiceConfigProactivityConfigMediaResolutionr$  )rH   r   config_dictr  rp   r,   r,   r-   $test_bidi_setup_to_api_speech_config  s   

rG  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"  r6  r#  r%  r.  r$  )r7  r   r9  r:  r;  r,  r<  r=  z.*multi_speaker_voice_config.*matchr   r  rn   )r   r   r   r   rT   rH   rF  r  r,   r,   r-   2test_bidi_setup_error_if_multispeaker_voice_config"  s:   "rR  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  rn   r  explicitVadSignal)r   exception_if_mldevrT   r   r   rQ  r,   r,   r-   test_explicit_vadJ  s   
rV  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   rS  Tr  rn   r  rT  )rT   r   rU  r   r   )rH   rR   rF  r  r,   r,   r-   test_explicit_vad_configZ  s   
rW  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/  r0  r  r  )ro   r3  r  ro   r  r  r  r  r   rn   r,   r   r@  r   rT   rH   rF  rp   r   r  r,   r,   r-   >test_bidi_setup_to_api_with_system_instruction_as_content_typel  s8   	rZ  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/  r0  googleSearchr  r3  r`  r  ro   r  r   r  rn   r,   rX  rY  r,   r,   r-   6test_bidi_setup_to_api_with_config_tools_google_search  s<   rd  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  ra  r   r/  r0  rb  rc  r  ro   r  r   rk   McpToolc                    s   t t dd| dI d H S )Nr   r  rn   r   rT   )rp   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   r}   r   )rH   rF  rp   r   rg  r  r,   r   r-   4test_bidi_setup_to_api_with_config_tools_with_no_mcp  s6   rh  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/  r0  i  r#  )target_tokens)trigger_tokenssliding_window)r_  r^  r<  context_window_compressionr  ra  r   ri  )r  r3  contextWindowCompressionr  ro   r  r   r  rn   )	r   r@  GenerationConfigr   r   ContextWindowCompressionConfigSlidingWindowr   rT   )rH   rp   r   r  r,   r,   r-   6test_bidi_setup_to_api_with_context_window_compression  s@   

rq  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   ro   r`  r   rn   r`  r   r   r,   )rr  r   r@  r   rT   rY  r,   r,   r-   =test_bidi_setup_to_api_with_config_tools_function_declaration  sV   rw  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!  rs  r  r  rt  r   r   r   r   r   r   r    r"   r%   r   r)   ru  rv  r   rn   r`  r   r   r,   )r   r   r@  r   rT   rY  r,   r,   r-   :test_bidi_setup_to_api_with_config_tools_function_directlyT  sV   rx  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!  rr  rs  r  rn   r  r`  r   rt  behaviorNON_BLOCKINGr,   )rT   r   FunctionDeclarationfrom_callabler   Behaviorr{  rz  r@  r   exception_if_vertexr   r   )rH   rR   declarationrF  rp   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  rt  r   r#   r   r   r%   get_weatherGet the weather in a city.ru  rv  r  r  r  r  ro   r`  r   r  r`  r}   stringr'   r   inputSchemarn   )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 rc   )_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  )r`  )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  rt  r   r#   r   r   r%   r  r  ru  rv  r  r  r  r  r   r  r`  rn   )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 )Nr`  code_executionr  r  codeExecutionrv  r   rn   r   r,   rX  rY  r,   r,   r-   7test_bidi_setup_to_api_with_config_tools_code_executionQ  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  )ro   realtimeInputConfigr   rn   r  r,   rX  rY  r,   r,   r-   1test_bidi_setup_to_api_with_realtime_input_configj  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  )ro   inputAudioTranscriptionr   rn   r  r,   rX  rY  r,   r,   r-   /test_bidi_setup_to_api_with_input_transcription  s   

r  c                    r  )	Noutput_audio_transcriptionr  r  )ro   outputAudioTranscriptionr   rn   r  r,   rX  rY  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+  )ro   r  r   rn   r  r,   rX  rY  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  ro   r   z#publishers/google/models/test_modelr  rf  )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 deprecatedrO  r   r  r_  r   r!  rn   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  rn   r  sessionResumptionr  r  r  r  ro   r  r,   rX  )rH   rF  rp   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  rn   r  r  r  r  r  r  ro   r,   )rT   r   r@  r   rU  r   r   )rH   rR   rF  rp   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   Fr/  r   r1  r   r   r   r,   )r   r   rT   _parse_client_messager   r>  r]   rH   r   r  r,   r,   r-   test_parse_client_message_strC  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  ro   r  r   r  rn   )r   rT   r   camel_to_snake_all_keys)rH   rF  expected_gen_configr   r  r,   r,   r-   +test_bidi_setup_to_api_with_thinking_configU  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   r/  r0  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   r/  r0  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  r/  r0  r  rt   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   rt   Tr  r   r   r  r  )	r   r   rT   r   r   r   r  r  r  r  r,   r,   r-   -test_parse_client_message_realtime_input_dict&  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_response;  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_response\  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   rt   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,   rd   capturer]   r,   r-   ri        
z<test_connect_with_provided_credentials.<locals>.mock_connectrm   rk   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   rq   rr   rw   r  r	   r,   r-   rz     s   
(z=test_connect_with_provided_credentials.<locals>._test_connectrc   )r   rT   r{   r|   r   r}   r   )r]   rP   ri   rz   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,   rd   r  r,   r-   ri     r  z;test_connect_with_default_credentials.<locals>.mock_connectrj   rk   rm   c               	      r  )Nr  r  r   r4   zBearer default_test_tokenr  rw   r  r,   r-   rz     s   
(z<test_connect_with_default_credentials.<locals>._test_connectrc   )rT   r   rW   r{   r|   r   r}   r   )r]   r~   r   ri   rz   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 Nre   r4   r,   rd   r  r,   r-   ri        
z7test_connect_with_custom_base_url.<locals>.mock_connectrm   rk   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  re   r  r  rw   r  r,   r-   rz   
  s   
(z8test_connect_with_custom_base_url.<locals>._test_connectrc   )r;   r<   r{   r|   r   r}   r   )r]   ri   rz   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,   rd   r  rh   r,   r-   ri   '  r  z=test_bidi_setup_to_api_with_auth_tokens.<locals>.mock_connectrm   rk   r   r4   z)Authorization key is missing from headersz!Token auth_tokens/TEST_AUTH_TOKENBidiGenerateContentConstrainedre   rc   )rT   r=   r   r   rY   rZ   r{   r|   r   r}   r   rq   rr   r]   rH   api_client_mockr  ri   rx   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,   rd   r  r,   r-   ri   O  r  z9test_bidi_setup_to_api_with_api_key.<locals>.mock_connectrm   rk   z&x-goog-api-key is missing from headersBidiGenerateContentre   rc   )rT   r   rB   rF   rG   r   r   rY   rZ   r{   r|   r   r}   r   rq   rr   r  r,   r  r-   #test_bidi_setup_to_api_with_api_key=  s4   


(r	  )FNNrc   )x__doc__r{   rt   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_aiohttprr  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  rG  rR  rV  rW  rZ  rd  rh  rq  rw  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-   <module>   s  
&


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