
    h;                        d 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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mZmZmZmZ ddlmZmZ ddlmZm Z m!Z! ddl"m#Z# ddl$m%Z%  eddd          Z& ee'          j(        Z)e)dz  Z*e)dz  Z+e)dz  Z,e&-                    d e e.e*                    d            e
 e.e+                    Z/e&0                    d          defd            Z1e&0                    d          d             Z2e&0                    de           ed d!"           ed#d$"          fd%e.d&e.fd'            Z3e&4                    d(          dCd%e.d&e.fd)            Z5e&0                    d*          d+             Z6e&0                    d,           ed-d./          fd0e.d1e.fd2            Z7e&0                    d3          d0e.fd4            Z8e&9                    d5          d0e.fd6            Z: G d7 d8          Z; e;            Z<e&=                    d9          d:ed;e.fd<            Z>e?d=k    rddl@Z@ e@jA        d>d?d@dAB           dS dS )DuH   
Page Asist - Aplicație FastAPI pentru conversații multi-AI cu Ollama
    )FastAPI	WebSocketWebSocketDisconnectHTTPExceptionQuery)StaticFiles)Jinja2Templates)FileResponseJSONResponse)Request)PathN)Optional)ConversationConfigModelListResponseConversationHistoryItemStreamMessage)enhanced_get_available_modelsenhanced_test_ollama_connection)create_conversationget_conversationremove_conversation)load_conversation_metadata)ConversationDB
Page AsistuD   Aplicație web pentru gestionarea conversațiilor multi-AI cu Ollamaz1.0.0)titledescriptionversionstatic	templatesconversationsz/static)	directory)name/requestc                 @   K   t                               dd| i          S )u   Pagina principalăz
index.htmlr$   )r   TemplateResponse)r$   s    @C:\Users\bruma\Desktop\Web_Page_Asist_App (1)\page_asist\main.pyhomer(   1   s#       %%lY4HIII    z/api/healthc                     K   dddS )zHealth check endpointokr   )statusservice r.   r)   r'   health_checkr/   7   s       |444r)   z/api/models)response_model.zAdresa IP a serverului Ollama)r   11434zPort server Ollamaipportc                    K   	 t          | |d           d{V }t          d|          S # t          $ r)}t          dg t          |                    cY d}~S d}~ww xY w)uD   
    Obține lista de modele disponibile de la un server Ollama
    
   )timeoutNT)successmodelsF)r7   r8   error)r   r   	Exceptionstr)r2   r3   r8   es       r'   
get_modelsr=   =   s      
4RrJJJJJJJJJ 
 
 
 	
  
 
 
 a&&
 
 
 	
 	
 	
 	
 	
 	

s   (- 
A AA A z/api/test-connectionc                 6   K   t          | |           d{V }|S )u2   
    Testează conexiunea cu un server Ollama
    N)r   )r2   r3   results      r'   test_connectionr@   S   s.      
 32t<<<<<<<<FMr)   z/api/historyc                     K   	 t                      } d| dS # t          $ r}dt          |          g dcY d}~S d}~ww xY w)u/   
    Obține lista de conversații salvate
    T)r7   r    F)r7   r9   r    N)r   r:   r;   )r    r<   s     r'   get_historyrB   \   s      

244*
 
 	
  
 
 
VV
 
 	
 	
 	
 	
 	
 	

s    
>9>>z'/api/history/{conversation_id}/downloadtxtz^(txt|docx)$)patternconversation_idformatc                    K   t           |  d| z  }|                                st          dd          |dk    rdnd}t          t	          |          ||  d|           S )	uC   
    Descarcă o conversație salvată în format TXT sau DOCX
    .     Conversație negăsităstatus_codedetailrC   z
text/plainzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.document)path
media_typefilename)CONVERSATIONS_DIRexistsr   r
   r;   )rE   rF   	file_pathrO   s       r'   download_conversationrT   o   s       "$A$A$A$AAI O4MNNNN!'56J^^#..f..   r)   z&/api/history/{conversation_id}/previewc                   K   	 t          j        |           }|sut          |  dz  }|                                st	          dd          t          |dd          5 }t          j        |          }ddd           n# 1 swxY w Y   d	|d
S g }|j        D ]:}|	                    |j
         d|j         |j        |j        |j        d           ;g }d}t          |          }	t!          dt          |j                  |	          D ]}
|	                    d|d           t!          |	          D ]{}|
|z   t          |j                  k     r^|j        |
|z            }|	                    d|j                            d          |j        |j        |j        |j        |j        d           ||dz  }|j        |j        |j        r|j                                        nd|j        r|j                                        nd|j        |||j        |j         d	}d	|d
S # tB          $ r&}t	          ddtE          |                     d}~ww xY w)uG   
    Obține preview-ul unei conversații salvate din baza de date
    z.jsonrI   rJ   rK   rzutf-8)encodingNT)r7   data:)urlrolmodel
max_tokens   r   round_start)typeroundmessagez%Y-%m-%d %H:%M:%S)r`   	timestamp	agent_url
agent_rolecontenttokensidei_noi)	idsubiect
start_timeend_timenumar_rundeagentimesajetotal_mesajetotal_idei_unicei  zEroare la citire: )#r   get_conversation_with_messagesrQ   rR   r   openjsonloadagentsappendr2   r3   r[   r\   r]   lenrangemessagesrc   strftimerd   re   rf   rg   rh   ri   rj   rk   	isoformatrl   rm   rp   rq   r:   r;   )rE   conversation	json_pathfrX   agenti_dataagentmessages_with_roundscurrent_roundmessages_per_roundijmsgr<   s                 r'   preview_conversationr      s2     
HS%D_UU 	),E,E,EEI##%% W#<UVVVViw777 $1y||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $     !( 	 	E(11UZ11y#.	         " -- q#l3446HII 	 	A ''%&) )   
 -..  q53|45555&/A6C(// )%(]%;%;<O%P%P%(]&)n#&;"%*$'L1 1    QMM /#+AMAXb,1;;===^b=I=R\-77999X\'3!*(5 , =

 

 
 
 	

  S S S4QQ4Q4QRRRRSsC   AH A?3H ?BH BH FH 
I(!I		Iz/api/history/{conversation_id}c           
      h  K   g }g }	 t          j        |           }|sd}dD ]}t          |  d| z  }|                                rqd}	 |                                 |                    |  d|            W# t          $ r2}|                    d| dt          |                      Y d}~d}~ww xY w|st          dd	
          ndD ]}t          |  d| z  }|                                ro	 |                                 |                    |  d|            U# t          $ r2}|                    d| dt          |                      Y d}~d}~ww xY wt          |          dk    |||dS # t          $ r  t          $ r!}d|dt          |           gdcY d}~S d}~ww xY w)uG   
    Șterge o conversație salvată din baza de date și fișiere
    F)rt   rC   docxrH   Tu   Eroare la ștergere z: NrI   rJ   rK   r   )r7   deleted_fileserrorsdeleted_from_dbu   Eroare generală: )r7   r   r   )
r   delete_conversationrQ   rR   unlinkrw   r:   r;   r   rx   )rE   r   r   
db_deletedfound_filesextrS   r<   s           r'   r   r      s     
 MF,
#7HH
 	NK. N N-?0J0JS0J0JJ	##%% N"&KN!((***%,,-G-G#-G-GHHHH$ N N N&LS&L&LCFF&L&LMMMMMMMMNN  W#<UVVVVW / N N-?0J0JS0J0JJ	##%% NN!((***%,,-G-G#-G-GHHHH$ N N N&LS&L&LCFF&L&LMMMMMMMMN	N 6{{a'*)	
 
 	
     
 
 
*4CFF445
 
 	
 	
 	
 	
 	
 	

sr   AE< 
.A98E< 9
B5(B0+E< 0B55?E< 5.D$#E< $
E .(EE< E  E< <F1F,&F1,F1c                   D    e Zd ZdZd ZdedefdZdefdZde	defdZ
d	S )
ConnectionManagerz"Manager pentru conexiuni WebSocketc                     i | _         d S Nactive_connections)selfs    r'   __init__zConnectionManager.__init__  s    8:r)   	websocket	client_idc                 R   K   |                                  d {V  || j        |<   d S r   )acceptr   )r   r   r   s      r'   connectzConnectionManager.connect  s=               -6	***r)   c                 ,    || j         v r
| j         |= d S d S r   r   )r   r   s     r'   
disconnectzConnectionManager.disconnect  s)    ///'	222 0/r)   rb   c                 l   K   || j         v r(| j         |                             |           d {V  d S d S r   )r   	send_json)r   rb   r   s      r'   send_messagezConnectionManager.send_message  sP      ///))4>>wGGGGGGGGGGG 0/r)   N)__name__
__module____qualname____doc__r   r   r;   r   r   dictr   r.   r)   r'   r   r     s        ,,; ; ;7y 7S 7 7 7 73C 3 3 3 3H$ H3 H H H H H Hr)   r   z/ws/{client_id}r   r   c           	        K   t                               |            d{V  d}	 	 |                                  d{V }|                    d          }|dk    r;	 |                    d          }t	          di |}t          |          }dt          ffd}t                               d|j        j	        d	d
d           d{V  |
                    |           d{V  |                                }t                               d|j        j	        |ddd           d{V  t          |j        j	                   d}nl# t          $ rA}	t                               dddt          |	           id           d{V  Y d}	~	n&d}	~	ww xY w|dk    r|r|                                 	 |                                }t                               d|j        j	        |ddd           d{V  nM# t          $ r@}	t                               dddt          |	           id           d{V  Y d}	~	nd}	~	ww xY wt          |j        j	                   d}nQt                               dddid           d{V  n*|dk    r$t                               di d           d{V  # t           $ rP t                                          |r0|                                 t          |j        j	                   Y dS Y dS t          $ rl}	t%          d|	            t                                          |r3|                                 t          |j        j	                   Y d}	~	dS Y d}	~	dS d}	~	ww xY w)uE   
    WebSocket endpoint pentru streaming live al conversațiilor
    NTactionstartconfig
stream_msgc                 h   K   t                               | j        | j        d           d {V  d S )Nr`   rX   )managerr   r`   rX   )r   r   s    r'   ws_callbackz'websocket_endpoint.<locals>.ws_callback<  s`      %22(2(2  &          r)   startedu   Conversație pornită cu succes)rE   rb   r   savedu   Conversație salvată cu succes)rE   filesrb   r9   rb   u    Eroare la pornire conversație: stopstoppedu!   Conversație oprită și salvatăzEroare la salvare: u   Nu există conversație activăpingpongzEroare WebSocket: r.   )r   r   receive_jsongetr   r   r   r   stateri   r   saver   r:   r;   r   r   r   print)
r   r   conversation_managerrX   r   config_datar   r   saved_filesr<   s
    `        r'   websocket_endpointr   $  s     
 //)Y
/
////////G?x	"//11111111DXXh''F  ="&((8"4"4K/>>+>>F ,?v+F+F(m       "..$-3G3M3P+L% %  "	 	 	 	 	 	 	 	 	 /44[AAAAAAAAA #7";";"="=K "..$+3G3M3P)4+L% %  "
 
 
 
 
 
 
 
 
 ((<(B(EFFF+/((  	 	 	!..$+ )+VcRSff+V+V%  "             	 6!!' )(--///&:&?&?&A&A%22(17K7Q7T-8/R)" )"  &
 
 
 
 
 
 
 
 
 
 % 	 	 	%22(/$-/MSVV/M/M)"  &             	 ((<(B(EFFF+/((!..$+ )+L%  "          6!!**#R00        kx	t  ? ? ?9%%% 	? %%''' 4 : =>>>>>>	? 	? 	?  ? ? ?&1&&'''9%%% 	? %%''' 4 : =>>>>>>>>>	? 	? 	? 	? 	? 	??sv   7J:  C*E 
J: 
F6FJ: FJ: 7AG> =J: >
I6I>J: IA2J: :AN	NANN__main__zmain:appz0.0.0.0iB  T)hostr3   reload)r1   )Br   fastapir   r   r   r   r   fastapi.staticfilesr   fastapi.templatingr	   fastapi.responsesr
   r   fastapi.requestsr   pathlibr   asynciort   typingr   backend.modelsr   r   r   r   backend.mock_ollamar   r   backend.conversation_managerr   r   r   backend.utilsr   backend.databaser   app__file__parentBASE_DIR
STATIC_DIRTEMPLATES_DIRrQ   mountr;   r   r   r(   r/   r=   postr@   rB   rT   r   deleter   r   r   r   r   r   uvicornrunr.   r)   r'   <module>r      s    R Q Q Q Q Q Q Q Q Q Q Q Q Q + + + + + + . . . . . . 8 8 8 8 8 8 8 8 $ $ $ $ $ $                          _ ^ ^ ^ ^ ^ ^ ^         
 5 4 4 4 4 4 + + + + + + g
V   4>>  
;&.  		)[[33z??;;;(	 K K KOcc-&8&8999	
 J J J J J
 5 5 5
 '899eC%DEEEg+?@@@
 



 
 
 :9
* 
 !! c     "! 
 
 
$ 	233 %~666    43* 	122LS LS LS LS 32LS^ ,--3
s 3
 3
 3
 .-3
pH H H H H H H H& 


  !!N?	 N?c N? N? N? "!N?b zNNNGK	      r)   