
    ha7                     $   U d Z ddlZddlZddlmZmZmZmZ ddlmZ ddl	m
Z
mZmZmZmZ ddlmZmZ ddlmZ dd	lmZmZmZmZ dd
lmZ  G d d          Zi Zeeef         ed<   de
defdZdedee         fdZ defdZ!dee         fdZ"dS )uO   
Gestionare conversații multi-AI
Coordonează rundele, agenții și istoricul
    N)DictListOptionalAny)datetime   )ConversationConfigConversationStateMessageStreamMessageAgent)construieste_mesajeINTREBARE_IMPLICITA)enhanced_stream_chat_response)extrage_fraze_ideisave_conversation_txtsave_conversation_docxsave_conversation_json)ConversationDBc                       e Zd ZdZdefdZd ZdedefdZ	d Z
dd
ee         fdZdded
ee         fdZd Zg dfdee         deeef         fdZdefdZdefdZd	S )ConversationManagerum   
    Manager pentru o conversație multi-AI
    Gestionează starea, rundele și comunicarea cu agenții
    configc                     || _         t          t          t          j                              |g i d          | _        g | _        d| _        |                                  d S )NF)idr   mesajeregistry_idei
is_running)	r   r
   struuiduuid4stateconversatie_history_stop_requested_create_database_entry)selfr   s     XC:\Users\bruma\Desktop\Web_Page_Asist_App (1)\page_asist\backend\conversation_manager.py__init__zConversationManager.__init__%   sh    &4:<<  
 
 

 :< $ 	##%%%%%    c           
         	 g }| j         j        D ]<}|                    |j        |j        |j        |j        |j        |j        d           =| j         j	        | j         j
        | j         j        |d}t          j        | j        j        | j         j	        | j         j
        ||           dS # t           $ r}t#          d|            Y d}~dS d}~ww xY w)u6   Creează intrarea în baza de date pentru conversație)ipportrolmodel
max_tokenstimeout)subiectnumar_rundepauza_intre_rundeagenti)conversation_idr0   r1   r3   r   zError creating database entry: N)r   r3   appendr*   r+   r,   r-   r.   r/   r0   r1   r2   r   create_conversationr!   r   	Exceptionprint)r%   agenti_dataagentconfig_dictes        r&   r$   z*ConversationManager._create_database_entry4   s   	9K+  ""(!J 9"["'"2$}$ $      ;.#{6%)[%B%	 K . $
+ K3""       	9 	9 	97A77888888888	9s   B'B+ +
C5CCmessagerundac           	          	 t          j        | j        j        ||j        |j        |j        |j        |j                   dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)u#   Salvează un mesaj în baza de date)r4   r>   	agent_url
agent_rolecontenttokensidei_noiz"Error saving message to database: N)r   add_messager!   r   r@   rA   rB   rC   rD   r7   r8   )r%   r=   r>   r<   s       r&   _save_message_to_dbz'ConversationManager._save_message_to_dbW   s    	<& $
!+"-~ )       	< 	< 	<:q::;;;;;;;;;	<s   >A 
A)A$$A)c                     	 t          j        | j        j        t	          | j        j                             dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)u=   Marchează conversația ca fiind finalizată în baza de date)r4   total_idei_unicez+Error completing conversation in database: N)r   complete_conversationr!   r   lenr   r7   r8   )r%   r<   s     r&   _complete_conversation_in_dbz0ConversationManager._complete_conversation_in_dbf   s    	E0 $
!$TZ%=!>!>       	E 	E 	ECCCDDDDDDDDD	Es   7; 
A"AA"Nwebsocket_callbackc                 v  K   d| j         _        t          j                    | j         _        d| _        	 t          d| j        j        dz             D ]}| j        r n|| j         _	        |r- |t          d|| j        j        d                     d{V  | j        j        D ]'}| j        r n|                     ||           d{V  (|r: |t          d|t          | j         j                  d	                     d{V  || j        j        k     r+| j        s$t          j        | j        j                   d{V  t          j                    | j         _        d| j         _        |                                  |rd |t          d
| j         j	        t          | j         j                  t          | j         j                  | j        d                     d{V  dS dS # t*          $ rF}d| j         _        |r2 |t          dddt-          |           i                     d{V   d}~ww xY w)u   
        Pornește conversația și o execută până la finalizare
        
        Args:
            websocket_callback: Funcție callback pentru trimitere mesaje prin WebSocket
        TFr   round_start)roundtotal_roundstypedataN	round_end)rO   total_ideasconversation_end)rP   total_messagesrU   stopped_manuallyerrorr=   u   Eroare în conversație: )r!   r   r   now
start_timer#   ranger   r1   runda_curentar   r3   _process_agent_responserJ   r   asynciosleepr2   end_timerK   r   r7   r   )r%   rL   r>   r:   r<   s        r&   startzConversationManager.startp   s6      !%
 (
$=	q$+"9A"=>> !G !G' E+0
( & ,,]*',dk>UVV. . .          "[/ R RE+  66u>PQQQQQQQQQQ & ,,](%*+.tz/G+H+H . . .          4;2224;O2!-(EFFFFFFFFF #+,..DJ$)DJ! --///! 	((+(,
(@*-dj.?*@*@'*4:+C'D'D,0,@	 * * *           	 	  	 	 	$)DJ!! (( #%IQ%I%IJ* * *          	s   F0G( (
H82AH33H8r:   c                 Z  K   t          | j        j                                                  }t	          | j        | j        j        j        j	        |          }g dt          ffd}t          ||           d{V }|d         r|d         S|                    dd          }r9 t          ddj         d	| j        j        d
                     d{V  dS |d         }|d         }	t          |          }
d}|
D ]$}|| j        j        vrd| j        j        |<   |dz  }%t!          d|t#          j                    j        j        |	|          }| j        j                            |           |                     || j        j                   | j                            d|d           | j                            dt.          d           rJ t          d|j        j        |	||j                                        d                     d{V  dS dS )u3   
        Procesează răspunsul unui agent
        tokenc           	         K                        |            r0 t          d| j        j        d                     d{V  dS dS )z$Callback pentru fiecare token primitrd   )rd   r@   rA   rQ   N)r5   r   urlr,   )rd   r:   token_bufferrL   s    r&   token_callbackzCConversationManager._process_agent_response.<locals>.token_callback   s      &&& " (( !&%*Y&+i * * *            r(   NsuccesstextrY   u   Eroare necunoscutăzEroare de la z: )r=   r@   rA   rQ   rC   r   Tr   	assistant)r,   rB   	timestampr@   rA   rC   rD   )rolerB   userr=   )rB   r@   rA   rC   rD   rl   )listr!   r   keysr   r"   r   r0   r,   r.   r   r   getr   rf   r   r   r   rZ   r   r5   rF   r]   r   rl   	isoformat)r%   r:   rL   	idei_listr   rh   rezultat	error_msgrj   rC   frazeidei_noi_countfrazar=   rg   s    ``           @r&   r^   z+ConversationManager._process_agent_response   s     
 1668899	$$KI
 
 	 	 	 	 	 	 	 	 	  7ufnUUUUUUUU	" 	hv&6&> W.CDDI! (( #K59#K#K	#K#K%*Y&+i * * *          F(# #4(( 	$ 	$EDJ44426
(/!# lnniy#
 
 
 	
  ))) 	  $**BCCC 	 ''(N(NOOO ''DW(X(XYYY  	$$]#!&"')$ .!(!2!<!<!>!> 
& 
& 
& 
 
 
 
 
 
 
 
 
 
 
	 	r(   c                     d| _         d| j        _        t          j                    | j        _        |                                  dS )u   Oprește conversațiaTFN)r#   r!   r   r   rZ   ra   rK   r%   s    r&   stopzConversationManager.stop  s>    # %
&lnn
 	))+++++r(   )txtdocxjsonformatsreturnc                     |                                  }i }d}d|v rt          ||          |d<   d|v rt          ||          |d<   d|v rt          ||          |d<   |S )u   
        Salvează conversația în formatele specificate
        
        Args:
            formats: Lista de formate (txt, docx, json)
            
        Returns:
            Dict cu căile fișierelor salvate pentru fiecare format
        Nr~   r|   r}   )_prepare_conversation_datar   r   r   )r%   r   conversation_datasaved_filesfilenames        r&   savezConversationManager.save$  s     !;;==W"89JH"U"UKG!67H(!S!SKW"89JH"U"UKr(   c                 v   g }d}t          | j        j                  }t          dt          | j        j                  |          D ]}|                    d|d           t          |          D ]}||z   t          | j        j                  k     rc| j        j        ||z            }|                    d|j                            d          |j	        |j
        |j        |j        |j        d           |dz  }| j        j        | j        j        | j        j        r| j        j                                        nd| j        j        r| j        j                                        nd| j        j        d	 | j        j        D             |t          | j        j                  t          | j        j                  d
	S )uB   
        Pregătește datele conversației pentru salvare
        r   r   rN   )rR   rO   r=   z%Y-%m-%d %H:%M:%S)rR   rl   r@   rA   rB   rC   rD   Nc                 D    g | ]}|j         |j        |j        |j        d S )rf   r,   r-   r.   r   ).0r:   s     r&   
<listcomp>zBConversationManager._prepare_conversation_data.<locals>.<listcomp>b  sF         !9 9"["'"2	   r(   )	r   r0   r[   ra   r1   r3   r   total_mesajerH   )rJ   r   r3   r\   r!   r   r5   rl   strftimer@   rA   rB   rC   rD   r   r0   r[   rr   ra   r1   r   )r%   messages_with_roundscurrent_roundmessages_per_roundijmsgs          r&   r   z.ConversationManager._prepare_conversation_data>  s   
  " !344q#dj/002DEE 	 	A ''%&) )   
 -..  q53tz01111*+AE2C(// )%(]%;%;<O%P%P%(]&)n#&;"%*$'L1 1    QMM *-{*?Cz?T^$*/99;;;Z^;?:;NX
+55777TX;2  "[/   +
 122 #DJ$< = =#
 
 	
r(   c                     | j         S )u+   Returnează starea curentă a conversației)r!   rz   s    r&   	get_statezConversationManager.get_statep  s
    zr(   )N)__name__
__module____qualname____doc__r	   r'   r$   r   intrF   rK   r   callablerb   r   r^   r{   r   r   r   r   dictr   r
   r    r(   r&   r   r      se        
&1 & & & &!9 !9 !9F<7 <3 < < < <E E EH Hhx.@ H H H HT_ _5 _hW_N` _ _ _ _B, , , )@(?(?  DI DcN    40
D 0
 0
 0
 0
d,      r(   r   _active_conversationsr   r   c                 L    t          |           }|t          |j        j        <   |S )u1   Creează și înregistrează o conversație nouă)r   r   r!   r   )r   managers     r&   r6   r6   y  s$    !&))G.5'-*+Nr(   r4   c                 6    t                               |           S )u+   Obține un manager de conversație după ID)r   rq   r4   s    r&   get_conversationr     s     $$_555r(   c                 ,    | t           v r
t           | = dS dS )u.   Elimină un manager de conversație din listăN)r   r   s    r&   remove_conversationr     s$    ///!/222 0/r(   c                  N    t          t                                                    S )u'   Returnează toate conversațiile active)ro   r   valuesr   r(   r&   get_all_conversationsr     s    %,,..///r(   )#r   r_   r   typingr   r   r   r   r   modelsr	   r
   r   r   r   ollama_servicer   r   mock_ollamar   utilsr   r   r   r   databaser   r   r   r   __annotations__r6   r   r   r   r   r(   r&   <module>r      s       , , , , , , , , , , , ,                           7 6 6 6 6 6            % $ $ $ $ $S S S S S S S Sn
 9; tC!445 : : : 2 7J    6c 6h7J.K 6 6 6 6
3 3 3 3 30t$78 0 0 0 0 0 0r(   