
    wOvh&&                        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m	Z	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mZ dd	lmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(Z(dd
l(m)Z)m*Z*m+Z+ ddl,Z,ddlm-Z- ddl.m/Z/ ddl0Z0 e        dZ1dZ2dZ3e0jh                  jk                  dd      Z6dZ7dZ8 G d de      Z9 e       Z:e:jw                  e9       e:jw                  edgdgdg       e:jy                  d edd      d       ejz                  e>d<   e?e>d<    G d d      Z@d ZAe:j                  d       d!        ZCe:j                  d"      d#        ZDd$e+fd%ZEe:j                  d&       eeE      fd'e	d(e+fd)       ZG ej                  d*+      ZId,ZJd- ZKe:j                  d       d.        ZLe:j                  d/      d0        ZNe:j                  d1       e-d2      fd3ePfd4       ZQe:j                  d5      d6        ZRy)7a  


https://synap.si/gemini/static/index.html


conda activate avatar
cd /home/cirillo/Desktop/GEMINI/GEMINI_RETAIL24
uvicorn main:app --reload --host 0.0.0.0 --port 9115




APRI LA PAGINA index.html ed imposta la porta identica a quella che vedi qui
http://localhost:9115/static/index.html


GOOGLE SHEET
ID implementazione
AKfycbzFsHcVfZztV3zq4guPqAs_Gz-R2jYYVv0RfB4SsOjmsyCQFZxZTyegbAOKIWrdfmdyng
URL
https://script.google.com/macros/s/AKfycbzFsHcVfZztV3zq4guPqAs_Gz-R2jYYVv0RfB4SsOjmsyCQFZxZTyegbAOKIWrdfmdyng/exec



SYNAP.SI SERVER

A2HOSTING
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH
ssh -p 7822 root@68.66.251.32
synap.si77
sudo systemctl restart fastapi-gemini
journalctl -u fastapi-gemini -f


conda activate gemini
cd  


    N)FastAPIDepends	WebSocketWebSocketDisconnectResponse)CORSMiddleware)StaticFiles)BaseHTTPMiddleware)load_dotenv)genai)LiveConnectConfigPrebuiltVoiceConfigSpeechConfigVoiceConfigAudioTranscriptionConfigToolFunctionResponseFunctionDeclarationStartSensitivityEndSensitivityCreateCachedContentConfigSafetySettingThinkingConfigPartSchemaContentType)connect_geminiactive_handlersGeminiHandler)Body)FileResponse'AIzaSyCfh6w4ksAPbS1eKzxRyhK1SW6rwtYRdqkz#gemini-2.5-flash-lite-preview-06-17z>https://eu-texttospeech.googleapis.com/v1beta1/text:synthesizestaticz6807f02bde708f2517e6f47a.glbT c                       e Zd Zd Zy)NoCacheMiddlewarec                    K    ||       d {   }|j                   j                  j                  d      r-d|j                  d<   d|j                  d<   d|j                  d<   |S 7 Xw)N/staticz#no-cache, no-store, must-revalidatezCache-Controlzno-cachePragma0Expires)urlpath
startswithheaders)selfrequest	call_nextresponses       4/home/cirillo/Desktop/GEMINI/GEMINI_RETAIL24/main.pydispatchzNoCacheMiddleware.dispatchb   se     "7++;;&&y10UH_-)3HX&*-HY' ,s   A)A'AA)N)__name__
__module____qualname__r6        r5   r'   r'   a   s    r;   r'   *)allow_originsallow_methodsallow_headersr)   )	directoryhtml)namegenai_clientstructured_cache_namec                   X    e Zd Zd Zd Zd Zej                  j                         Zd Z	y)DummyGeminiHandlerc                      y Nr:   )r1   	client_idwss      r5   register_wszDummyGeminiHandler.register_ws|       r;   c                      y rH   r:   )r1   rI   s     r5   unregister_wsz DummyGeminiHandler.unregister_ws}   rL   r;   c                    K   y wrH   r:   )r1   datas     r5   receivezDummyGeminiHandler.receive~           c                    K   y wrH   r:   )r1   s    r5   aclosezDummyGeminiHandler.aclose   rR   rS   N)
r7   r8   r9   rK   rN   rQ   datetimeutcnow	last_seenrU   r:   r;   r5   rF   rF   {   s"    .,'!!((*I r;   rF   c           	      \   t        | d      5 }t        j                  |      }d d d        g }j                         D ]=  \  }}|j	                  dd      j                         }|j                  d| d| d       ? dg}|j                         D ]6  \  }}|j	                  d	g       }	|	D ]  }
|j                  d
|
 d| d        8 dj                  |      dj                  |      z   }t        j                  |      j                  |d       t        d|        y # 1 sw Y   xY w)Nzutf-8)encodingdescrizioner%   z# 
z

z---
Esempi:
domandezConversazione:
Utente: z
Categoria corretta: zFile di contesto scritto in: )openjsonloaditemsgetstripappendjoinpathlibPath
write_textprint)	json_pathout_pathf	categoriecorpochiavedatir[   esempir]   domandafull_prompts               r5   genera_file_contestort      s0   	i'	* !aIIaL	! E!) 7hh}b1779r&K=567
 F!) ((9b) 	GMM*7)3I&QUV	 ''%.2776?2KLL%%kG%D	)(
45)! !s   D""D+startupc            	        K   t         rt        j                  t        ddi      at        dd       t        j                  d      } t        j                  j                  |       }t        j                  j                  t        t        dt        j                  d	      |gd
            }|j                   t"        _        y t'        d       y w)Napi_versionv1beta)api_keyhttp_optionszCONTESTO/categorie.jsonzcontext.txt)filestructured_contextu   
                Riceverai una parte della conversazione tra utente e agente. 
                Rispondi solo con la chiave della categoria più adatta all'ULTIMA domanda fatta dall'utente, tenendo conto del contesto della conversazione.)text3600s)display_namesystem_instructioncontentsttl)modelconfigz51 - Connessione Google BLOCCATA per questa sessione. )ENABLE_GOOGLE_CONNECTIONr   ClientGEMINI_API_KEYrC   rt   rf   rg   filesuploadcachescreateGEMINI_modelr   r   	from_textrB   gemini_modulerD   ri   )context_pathcontext_filecaches      r5   init_genai_clientr      s     ||"'2
 	6F ||M2#))00l0C ##**,1#'>> 8a $ ' + 
* /4jj+ 	EFs   CCshutdownc                  H   K   t         j                          d {    y 7 wrH   )rC   rU   r:   r;   r5   close_genai_clientr      s     



s   " "returnc                   K   t         rMt        t        j                               } t	        t
        |       4 d {   }| d d d       d {    y t        d       t                y 7 37  # 1 d {  7  sw Y   y xY ww)N)
session_idz52 - Connessione Google BLOCCATA per questa sessione. )r   struuiduuid4r   rC   ri   rF   )r   handlers     r5   get_gemini_handlerr      sr     &
!,:F 	 	'M	 	 	 	EF ""	 	 	 	 	sD   9BA/BA3BA1B1B3B9A<:BBz/client-audiorJ   r   c                 B  K   | j                          d {    t        t        j                               }|j	                  ||        	 	 | j                          d {   }|t        j                         v r#t        j                  j                         |_
        |j                  d|f       d {    m7 7 [7 	# t        $ rT |j                  |       t        t        j                               D ]   \  }}||u st        j                   |d        " Y y w xY ww)Ni>  )acceptr   r   r   rK   receive_bytesr   valuesrV   rW   rX   rQ   r   rN   listra   pop)rJ   r   rI   rP   sidhs         r5   ws_audior      s     
))+DJJL!I	2&))++D/0022$,$5$5$<$<$>!//5$-000   , 1 i(?0023 	/FCG|##C.	/ 	s_   DB93DB? B; AB? 3B=4B? 9D;B? =B? ?ADDDDDx   )seconds   c                    K   	 t         j                   j                         } t        t        j                               D ]K  \  }}| |j
                  z
  t        kD  s	 |j                          d {    t        j                  |d        M t        j                  t               d {    7 ># t        $ r Y Gw xY w7 wrH   )rV   rW   r   r   ra   rX   JANITOR_TTLrU   	Exceptionr   asynciosleepJANITOR_SLEEP)nowr   r   s      r5   session_janitorr     s     
&&( !6!6!89 	/LCg''';6!..***  ##C.	/ mmM*** 
 +   	+sH   ACB10B/1B154C)C *C/B11	B=:C<B==Cc                  j   K   t         rt        j                  t                      y t	        d       y w)Nz53 - Connessione Google BLOCCATA per questa sessione. )r   r   create_taskr   ri   r:   r;   r5   start_janitorr     s#     O-.EFs   13z/statusc                     K   ddiS w)NstatusOKr:   r:   r;   r5   
get_statusr     s     ds   z/api/tts.payloadc                 v  K   t        d       t        d       dt        i}t        j                         4 d{   }|j	                  t
        | |       d{   }ddd      d{    t        j                  |j                  j                  d            S 7 d7 F7 8# 1 d{  7  sw Y   HxY ww)z
    Riceve la richiesta TTS dal client,
    la inoltra a Google usando la chiave sul server,
    e rimanda il risultato audio.
    z(- ERROR 2: API TTS INVOCATA DAL CLIENT -z"- ERROR 2: NON DOVREBBE ACCADERE -zX-Goog-Api-KeyN)r_   r0   zcontent-type)content
media_type)
ri   r   httpxAsyncClientpostGOOGLE_TTS_URLr   r   r0   rb   )r   r0   clientresps       r5   	proxy_ttsr   "  s      

45	
./0G  " P Pf[[gw[OOP PDLLT\\5E5En5UVVPOP P P PsV   7B9BB9B$B B$B9)B"*5B9 B$"B9$B6*B-+B62B9z/api/avatar-modelc                  ,   K   t        t        d      S w)z8
    Serve il file .glb da un endpoint controllato.
    zmodel/gltf-binary)r   )r"   AVATAR_MODELr:   r;   r5   avatar_modelr   5  s     
 1DEEs   )S__doc__r_   rf   r   rV   r   fastapir   r   r   r   r   fastapi.middleware.corsr   fastapi.staticfilesr	   starlette.middleware.baser
   dotenvr   googler   google.genai.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   fastapi.responsesr"   osr   r   r   r.   re   r   r   CONTEXTr'   appadd_middlewaremountr   __annotations__r   rF   rt   on_eventr   r   r   	websocketr   	timedeltar   r   r   r   rb   r   r   dictr   r   r:   r;   r5   <module>r      sG  'T      N N 2 + 8  
 
 
 
 
$  H H   * 	 :2 R ww||H&DE 
*  i   $ %   %%%	   		)[8$?h	 O ll  ! !64 i2G 2Gn j   
	#- 	# ;BCU;V y =   . !h  -
+ iG G   *$(I WT W W$ 	F Fr;   