
    Rfvh&&                        % 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JrJr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  SSKJr  SS	KJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'  SSK(r(SS
K(J)r)J*r*J+r+  SSK,r,SSKJ-r-  SSK.J/r/  SSK0r0\" 5         Sr1Sr2Sr3\0Rh                  Rk                  SS5      r6Sr7Sr8 " S S\5      r9\" 5       r:\:Rw                  \95        \:Rw                  \S/S/S/S9  \:Ry                  S\" SSS9SS9  \Rz                  \>S'   \?\>S'    " S S5      r@S rA\:R                  S 5      S! 5       rC\:R                  S"5      S# 5       rDS$\+4S% jrE\:R                  S&5      \" \E5      4S'\	S(\+4S) jj5       rG\R                  " S*S+9rIS,rJS- rK\:R                  S 5      S. 5       rL\:R                  S/5      S0 5       rN\:R                  S15      \-" S25      4S3\P4S4 jj5       rQ\:R                  S55      S6 5       rRg)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                       \ rS rSrS rSrg)NoCacheMiddlewarea   c                    #    U" U5      I S h  vN nUR                   R                  R                  S5      (       a-  SUR                  S'   SUR                  S'   SUR                  S'   U$  N]7f)N/staticz#no-cache, no-store, must-revalidatezCache-Controlzno-cachePragma0Expires)urlpath
startswithheaders)selfrequest	call_nextresponses       /var/www/html/gemini/main.pydispatchNoCacheMiddleware.dispatchb   sg     "7++;;&&y110UH_-)3HX&*-HY' ,s   A.A,AA. N)__name__
__module____qualname____firstlineno__r7   __static_attributes__r9       r6   r'   r'   a   s    r?   r'   *)allow_originsallow_methodsallow_headersr*   )	directoryhtml)namegenai_clientstructured_cache_namec                   `    \ rS rSrS rS rS r\R                  R                  5       r	S r
Srg)DummyGeminiHandler{   c                     g Nr9   )r2   	client_idwss      r6   register_wsDummyGeminiHandler.register_ws|   s    $r?   c                     g rM   r9   )r2   rN   s     r6   unregister_ws DummyGeminiHandler.unregister_ws}   s    r?   c                    #    g 7frM   r9   )r2   datas     r6   receiveDummyGeminiHandler.receive~   s     4   c                    #    g 7frM   r9   )r2   s    r6   acloseDummyGeminiHandler.aclose   s     DrY   r9   N)r:   r;   r<   r=   rP   rS   rW   datetimeutcnow	last_seenr[   r>   r9   r?   r6   rJ   rJ   {   s"    .,'!!((*I r?   rJ   c           	      h   [        U SS9 n[        R                  " U5      nS S S 5        / nWR                  5        H=  u  pVUR	                  SS5      R                  5       nUR                  SU SU S35        M?     S/nUR                  5        H8  u  pVUR	                  S	/ 5      n	U	 H  n
UR                  S
U
 SU S35        M     M:     SR                  U5      SR                  U5      -   n[        R                  " U5      R                  USS9  [        SU 35        g ! , (       d  f       GN= f)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datirb   esempird   domandafull_prompts               r6   genera_file_contestor{      s   	i'	*aIIaL	 
+ E!)hh}b1779r&K=56 *
 F!)((9b)GMM*7)3I&QUV  * ''%.2776?2KLL%%kG%D	)(
45) 
+	*s   D""
D1startupc            
        #    [         (       a  [        R                  " [        SS0S9q[        SS5        [        R                  " S5      n [        R                  R                  U S9n[        R                  R                  [        [        S[        R                  " SS	9U/S
S9S9nUR                   ["        l        g ['        S5        g 7f)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_KEYrG   r{   rm   rn   filesuploadcachescreateGEMINI_modelr   r   	from_textrF   gemini_modulerH   rp   )context_pathcontext_filecaches      r6   init_genai_clientr      s     ||"'2
 	6F ||M2#))00l0C ##**,1#'>> 8a $ ' + 
* /4jj+ 	EFs   CC	shutdownc                  H   #    [         R                  5       I S h  vN   g  N7frM   )rG   r[   r9   r?   r6   close_genai_clientr      s     



s   " "returnc                 $  #    [         (       aK  [        [        R                  " 5       5      n [	        [
        U S9 IS h  vN nU7v   S S S 5      IS h  vN   g [        S5        [        5       7v   g  N3 N ! , IS h  vN  (       d  f       g = f7f)N)
session_idz52 - Connessione Google BLOCCATA per questa sessione. )r   struuiduuid4r   rG   rp   rJ   )r   handlers     r6   get_gemini_handlerr      s^     &
!,:FF'M GFF 	EF "" GFFFsE   <BA2BA6BA4B4B6B<A?=B	Bz/client-audiorO   r   c                 T  #    U R                  5       I S h  vN   [        [        R                  " 5       5      nUR	                  X 5          U R                  5       I S h  vN nU[        R                  " 5       ;   a#  [        R                  R                  5       Ul
        UR                  SU45      I S h  vN   Mq   N N_ N
! [         aX    UR                  U5        [        [        R                  " 5       5       H"  u  pEXQL d  M  [        R                   " US 5        M$      g f = f7f)Ni>  )acceptr   r   r   rP   receive_bytesr   valuesr]   r^   r_   rW   r   rS   listrh   pop)rO   r   rN   rV   sidhs         r6   ws_audior      s     
))+DJJL!I	&))++D/0022$,$5$5$<$<$>!//5$-000   , 1 i(?0023FC|##C. 4 	s_   D(B=3D(C B? AC 6C7C =D(?C C A D%D%"D($D%%D(x   )seconds   c                    #     [         R                   R                  5       n [        [        R                  " 5       5       HM  u  pXR
                  -
  [        :  d  M   UR                  5       I S h  vN   [        R                  " US 5        MO     [        R                  " [        5      I S h  vN   M   NC! [         a     NMf = f N7frM   )r]   r^   r   r   rh   r_   JANITOR_TTLr[   	Exceptionr   asynciosleepJANITOR_SLEEP)nowr   r   s      r6   session_janitorr     s     
&&( !6!6!89LC''';6!..***  ##C. : mmM*** 
 +   	+sH   AC	B71B52B768C	.C/C	5B77
CC	CC	c                  v   #    [         (       a  [        R                  " [        5       5        g [	        S5        g 7f)Nz53 - Connessione Google BLOCCATA per questa sessione. )r   r   create_taskr   rp   r9   r?   r6   start_janitorr     s%     O-.EFs   79z/statusc                     #    SS0$ 7f)NstatusOKr9   r9   r?   r6   
get_statusr     s     ds   z/api/tts.payloadc                 t  #    [        S5        [        S5        S[        0n[        R                  " 5        ISh  vN nUR	                  [
        XS9I Sh  vN nSSS5      ISh  vN   [        WR                  UR                  R                  S5      S9$  N] NC N5! , ISh  vN  (       d  f       NJ= f7f)zt
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)rf   r1   zcontent-type)content
media_type)
rp   r   httpxAsyncClientpostGOOGLE_TTS_URLr   r   r1   ri   )r   r1   clientresps       r6   	proxy_ttsr   "  s      

45	
./0G  ""f[[g[OO #"DLLT\\5E5En5UVV #O #"""sV   8B8BB8BBBB8&B'2B8BB8B5$B'%B51B8z/api/avatar-modelc                  &   #    [        [        SS9$ 7f)z0
Serve il file .glb da un endpoint controllato.
zmodel/gltf-binary)r   )r"   AVATAR_MODELr9   r?   r6   avatar_modelr   5  s     
 1DEEs   )S__doc__rf   rm   r   r]   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/   rl   r   r   CONTEXTr'   appadd_middlewaremountr   __annotations__r   rJ   r{   on_eventr   r   r   	websocketr   	timedeltar   r   r   r   ri   r   r   dictr   r   r9   r?   r6   <module>r      sE  '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 =   .   -
+ iG G   *$(I WT W W$ 	F Fr?   