
    |i%                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  \" \	" \5      R                  R                  S-  5        SSKJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  SSKJr  SSKJrJr  SSK J!r!  SSK"J#r#  \RH                  " \RJ                  SS9  \RL                  " S5      r'\RP                  " S\)SS9  Sr*\" SSSS9r+\	" \5      R                  S-  r,\+R[                  S\" \,S9SS9   \R\                  R_                  S\0" \	" \5      R                  R                  S-  S-  5      5        SS K1J2r2  \2" 5       r3S!\3Rh                   S"\3Rj                   S#\3Rl                   S"\3Rn                   S$\3Rp                   3
r9\" \9S%9r:S&r;\'Ry                  S'\3Rl                   S"\3Rn                   35        \" \*\#\:S+9r@SSKArB\BR                  " 5       rCSqD\'Ry                  S,\#R                   35        \+R                  S$5      S- 5       rG\+R                  S.5      S/ 5       rH\+R                  S05        SAS1\S2\0S3\0S4\JS5\JS6S4S7 jj5       rK\LS8:X  aJ  SSKMrM\N" \R                  " S9S:5      5      r7\P" S;\#R                   S<\7 S=35        \MR                  " \+S>\7S?S@9  gg! \= a)  r>\'R                  S(\> S)35        \" 5       r:S*r; Sr>C>GNSr>C>ff = f)BaO  
Genesis V2 Live Streaming Server
==================================
FastAPI + WebSocket server for ADK bidi-streaming.

Based on Google's official bidi-demo reference architecture.
Provides real-time voice interaction via Gemini Live API.

Usage:
    python genesis_live/server.py
    # Opens http://localhost:8000 with voice/text UI
    N)Path)load_dotenvz.env)FastAPI	WebSocketWebSocketDisconnect)FileResponse)StaticFiles)LiveRequestQueue)	RunConfigStreamingMode)Runner)DatabaseSessionServiceInMemorySessionService)types)
root_agentz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatgenesis_liveignorepydantic)categorymodulezgenesis-livezGenesis V2 Live Streamingz*Enterprise voice agent with bidi-streamingz2.1.0)titledescriptionversionstaticz/static)	directory)namedatazgenesis-memory)PostgresConfigzpostgresql+asyncpg://:@/)db_urlzelestio-postgresqlz*Session persistence: Elestio PostgreSQL @ z Elestio PostgreSQL unavailable (z), falling back to InMemoryzin-memory (fallback))app_nameagentsession_servicez,Genesis Live server initialized with model: c                  .   #    [        [        S-  5      $ 7f)z"Serve the Genesis Live web client.z
index.html)r   
static_dir     (E:\genesis-system\genesis_live\server.pyrootr-   a   s      
\122s   z/healthc                     #    SSK n [        U R                  5       [        -
  5      nS[        R                  [
        [        [        R                  " S5      5      [        U[        S.$ 7f)zHHealth check endpoint with uptime, session info, and persistence status.r   NokGOOGLE_API_KEY)statusmodelr%   api_key_setsession_persistenceuptime_secondsactive_connections)timeint_server_startr   r2   APP_NAMEboolosgetenvSESSION_PERSISTENCE_active_connections)_tuptime_ss     r,   healthrB   g   sS      2779},-H!!BII&6782"1 s   A&A(z/ws/{user_id}/{session_id}	websocketuser_id
session_idproactivityaffective_dialogreturnc           
        ^ ^^^^#    [         R                  ST ST SU SU 35        T R                  5       I Sh  vN   [        S-  q[        R
                  nSUR                  5       ;   nU(       a  [        [        R                  S/[        R                  " 5       [        R                  " 5       U(       a  [        R                  " S	S
9OSU(       a  UOSS9m[         R                  SU S35        O2[        [        R                  S/S9m[         R                  SU S35        [        R                  [        TTS9I Sh  vN nU(       d!  [        R!                  [        TTS9I Sh  vN   [#        5       mSUU 4S jjnSUUUUU 4S jjn	 [$        R&                  " U" 5       U	" 5       5      I Sh  vN   TR/                  5         [        S-  qg GN N Nl N%! [(         a    [         R                  ST 35         NG[*         a!  n
[         R-                  SU
 3S	S9   Sn
A
NlSn
A
ff = f! TR/                  5         [        S-  qf = f7f)a-  WebSocket endpoint for bidirectional voice streaming.

Args:
    websocket: WebSocket connection
    user_id: User identifier
    session_id: Session identifier
    proactivity: Enable proactive audio (native audio models only)
    affective_dialog: Enable affective dialog (native audio models only)
zWebSocket connection: user=z
, session=z, proactivity=z, affective_dialog=N   znative-audioAUDIOT)proactive_audio)streaming_moderesponse_modalitiesinput_audio_transcriptionoutput_audio_transcriptionrF   enable_affective_dialogzNative audio model: u    → AUDIO modalityTEXT)rM   rN   zText model: u    → TEXT modality)r%   rD   rE   c                  \  >#     T
R                  5       I Sh  vN n SU ;   a,  U S   n[        R                  " SUS9nT	R                  U5        OSU ;   a  U S   n[        R
                  " U5      nUR                  S5      S:X  a<  [        R                  " [        R                  " US   S9/S9nT	R                  U5        OeUR                  S5      S	:X  aP  [        R                  " US
   5      nUR                  SS5      n[        R                  " XvS9nT	R                  U5        GM$   GN7f)u6   Receives from WebSocket → sends to LiveRequestQueue.Nbyteszaudio/pcm;rate=16000)	mime_typer   texttype)rV   )partsimager   mimeTypez
image/jpeg)receiver   Blobsend_realtimejsonloadsgetContentPartsend_contentbase64	b64decode)message
audio_data
audio_blob	text_datajson_messagecontent
image_datarU   
image_bloblive_request_queuerC   s            r,   upstream_task)websocket_endpoint.<locals>.upstream_task   s    %--//G '!$W-
"ZZ4:
 #00< 7"#FO	#zz)4##F+v5#mm$zz|F/CDEG '33G<!%%f-8!'!1!1,v2F!GJ , 0 0\ JI!&"+"J '44Z@9 /s   D,D)DD,c                    >#    [         R                  TTTTS9  Sh  vN n SnSnU R                  (       a`  U R                  R                  (       aE  U R                  R                   H+  nUR                  (       a  SnUR
                  (       d  M)  SnM-     U(       d  U(       a  [        R                  SU SU 35        U R                  SSS9nT	R                  U5      I Sh  vN   M   N N
 g7f)u7   Receives Events from run_live() → sends to WebSocket.)rD   rE   rn   
run_configNFTzEvent: audio=z, text=)exclude_noneby_alias)
runnerrun_liverk   rX   inline_datarV   loggerinfomodel_dump_json	send_text)
event	has_audiohas_textpart
event_jsonrn   rr   rE   rD   rC   s
        r,   downstream_task+websocket_endpoint.<locals>.downstream_task   s     !??!1!	 + 
 	2% IH}}!4!4!MM//D''$(	yyy#'	 0
 HmI;ghZHI..!D / J %%j111+	2* 2+
s?   C2C0C,C0A,C2AC2%C.&C2,C0.C20C2zClient disconnected: user=zStreaming error: )exc_info)rH   N)rx   ry   acceptr?   r   r2   lowerr   r   BIDIr   AudioTranscriptionConfigProactivityConfigr'   get_sessionr:   create_sessionr
   asynciogatherr   	Exceptionerrorclose)rC   rD   rE   rF   rG   
model_nameis_native_audiosessionro   r   ern   rr   s   ```        @@r,   websocket_endpointr   z   s/    " KK
%gYj E"m#67G6H	J 


1 !!J$
(8(8(::O(--!(	&+&D&D&F','E'E'G  ''=8H$4d

 	*:,6IJK(--!'

 	l:,.@AB $//7z 0  G ,,w: - 
 	
 	
 *+A A@2 24!nn]_o.?@@@ 	  "q W <	
D 	A <0	:; =(,t<= 	  "q s   5IGDIG'I+G,#I$G 4G5G 9IIIG "H*>H-  	H*	H% H- %H**H- -II__main__GENESIS_PORT8000z
   ______                     _     
  / ____/___   ____   ___   _____(_)_____
 / / __ / _ \ / __ \ / _ \ / ___// // ___/
/ /_/ //  __// / / //  __/(__  )/ /(__  ) 
\____/ \___//_/ /_/ \___//____//_//____/  

    GENESIS V2 LIVE STREAMING
    Model: z
    URL:   http://localhost:z
    z0.0.0.0ry   )hostport	log_level)FF)R__doc__r   rd   r^   loggingr<   syswarningspathlibr   dotenvr   __file__parentfastapir   r   r   fastapi.responsesr   fastapi.staticfilesr	   $google.adk.agents.live_request_queuer
   google.adk.agents.run_configr   r   google.adk.runnersr   google.adk.sessionsr   r   google.genair   genesis_live.agentr   basicConfigINFO	getLoggerrx   filterwarningsUserWarningr:   appr)   mountpathinsertstrelestio_configr    pguserpasswordr   r   databaser$   r'   r>   ry   r   r   warningru   r7   _timer9   r?   r2   r`   r-   rB   rC   r;   r   __name__uvicornr8   r=   printrunr*   r+   r,   <module>r      s-       	 
    DN!!((61 2 ; ; * + A A % N  *   
,,A 
		>	* 	  ;z J
 
%< (^""X-
 		)[:6X	 F1HHOOAs4>0077&@CSSTU-		B$RWWIQr{{m1RWWIQrwwiqQSQ\Q\P]^F,F;O.
KK<RWWIQrwwiPQ 

#
 

  ::;K;K:LM N 3 3
  $ +,
 "!!! ! 	!
 ! 
! -!J z ryy01D	   !F #
 
	 KK	' k  1
NN5aS8STU,.O01s   CJ, ,K2KK