
    h                     r   d 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ZdZded	ed
edefdZdeeeef                  ded	ed
edee         deeeef                  fdZddedededee         fdZ	 ddedeeeef                  de	e         deeef         fdZddedededeeef         fdZdS )u`   
Serviciu pentru comunicare cu API-ul Ollama
Adaptare logică din v4.py la async/await cu httpx
    N)DictAnyListAsyncGeneratorOptional   )Agent   u9   Ce idei concrete, ne-repetate, poți adăuga mai departe?subiectrol
max_tokensreturnc                 r    d|  d| d}|dk    r|dz   S |dk    r|dz   S |dk    r|d	z   S |d
v r|dz   S |dz   S )uW   
    Generează prompt-ul de sistem bazat pe rolul agentului
    Adaptat din v4.py
    u   Discuți despre: u   . Răspunde concis (max u   tokeni), clar, în română.
Reguli generale:
1) Evită repetițiile. 2) Adaugă cel puțin O IDEE NOUĂ față de lista 'Idei deja menționate'. 3) Listează ideile ca bullets scurte, concrete, testabile. 4) Fii specific (cifre, condiții, costuri, pași).	generatoruO   
Rol: GENERATOR – propune idei noi, combinații neobișnuite, dar plauzibile.criticuo   
Rol: CRITIC – semnalează riscuri/limitări și oferă o îmbunătățire alternativă pentru fiecare punct.	moderatorup   
Rol: MODERATOR – impune noutatea, rezumă scurt progresul, pune o întrebare-țintă pentru runda următoare.)synthsintetizatorsynthesizeruj   
Rol: SINTETIZATOR – combină cele mai bune idei, elimină redundanța, propune o mini-foaie de parcurs.u-   
Rol: GENERAL – adaugă idei utile și noi. )r   r   r   bazas       RC:\Users\bruma\Desktop\Web_Page_Asist_App (1)\page_asist\backend\ollama_service.pysistem_role_promptr      s    	zG 	z 	zZ 	z 	z 	z 	 khhh	  I  I  	I			  J  J  	J	8	8	8  D  D  	DFFF    conversatie	idei_dejac                     t          |||          }|r dd                    |dd                   z   nd}| dt           d}d|d	g}|                    |            |                    d
|d	           |S )u}   
    Construiește lista de mesaje pentru API-ul Ollama
    Include sistemul, istoricul și instrucțiunile de unicitate
    u%   Idei deja menționate până acum:
- z
- iNu%   Nu există idei înregistrate încă.ue   
Asigură-te că fiecare punct nou este ne-repetat față de listă. După idei, încheie cu: 'NEXT: 'system)rolecontentuser)r   joinINTREBARE_IMPLICITAextendappend)	r   r   r   r   r   sistem
idei_blockinstructiunemessagess	            r   construieste_mesajer+   )   s      j99F
 	506;;y3O3OOO4   	B 	B+>	B 	B 	B  "f556HOOK   OOV==>>>Or   11434
   ipporttimeoutc                   K   d|  d| d}	 t          j        |          4 d{V }|                    |           d{V }|                                 |                                }d |                    dg           D             }d |D             cddd          d{V  S # 1 d{V swxY w Y   dS # t           j        $ r t          d	|  d|           t           j        $ r'}t          d
|j        j	         d|  d|           d}~wt          $ r*}t          d|  d| dt          |                     d}~ww xY w)u  
    Obține lista de modele disponibile de la un server Ollama
    
    Args:
        ip: Adresa IP a serverului Ollama
        port: Portul serverului Ollama
        timeout: Timeout pentru cerere în secunde
        
    Returns:
        Lista de nume de modele disponibile
    http://:z	/api/tagsr0   Nc                 :    g | ]}|                     d d          S )name )get).0models     r   
<listcomp>z(get_available_models.<locals>.<listcomp>`   s&    PPPeii++PPPr   modelsc                     g | ]}||S r   r   )r9   ms     r   r;   z(get_available_models.<locals>.<listcomp>a   s    +++!+A+++r   zTimeout la conectarea cu Eroare HTTP z de la u%   Eroare la obținerea modelelor de la : )httpxAsyncClientr8   raise_for_statusjsonTimeoutException	ExceptionHTTPStatusErrorresponsestatus_codestr)	r.   r/   r0   urlclientrH   datar<   es	            r   get_available_modelsrO   K   s<      )B
(
(
(
(
(CW$W555 	, 	, 	, 	, 	, 	, 	,#ZZ__,,,,,,H%%'''==??D QP(B9O9OPPPF++v+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, ! A A A?B????@@@  S S SQqz'=QQbQQ4QQRRR W W WUUUTUUSQRVVUUVVVWsG   B= A/B*B= *
B44B= 7B48B= =2E/"DE%EEagentr*   callbackc           
        K   d| j          d}| j        |dd| j        id}d}d}d}| j        }|t          k     r%	 t          j        |	          4 d{V }	|	                    d
||          4 d{V }
|
                                 |
	                                2 3 d{V }|s
	 t          j        |          }d|v r0d|d         v r&|d         d         }||z  }|r ||           d{V  |                    dd          r|                    dd          } n# t          j        $ r Y w xY w6 ||ddcddd          d{V  cddd          d{V  S # 1 d{V swxY w Y   	 ddd          d{V  n# 1 d{V swxY w Y   n# t
          j        $ rG |dz  }|dz  }|t          k    rddddt           d| ddcY S t          j        d           d{V  Y nht
          j        $ r.}dddd|j        j         dt)          |           dcY d}~S d}~wt*          $ r!}ddddt)          |           dcY d}~S d}~ww xY w|t          k     %dddddS )uf  
    Trimite o cerere de chat către API-ul Ollama și procesează răspunsul în streaming
    
    Args:
        agent: Configurarea agentului AI
        messages: Lista de mesaje pentru conversație
        callback: Funcție callback opțională pentru fiecare token primit
        
    Returns:
        Dict cu textul complet și numărul de tokeni
    r2   z	/api/chatTnum_predict)r:   r*   streamoptionsr7   Nr   r4   POST)rD   messager!   doneF
eval_count)texttokenssuccessr      u   Timeout depășit după u    încercări (ultima: zs))rZ   r[   r\   errorr?   r@   u   Eroare neașteptată: u   Nu s-a putut obține răspuns)rK   r:   r   r0   	MAX_RETRYrA   rB   rT   rC   aiter_linesrD   loadsr8   JSONDecodeErrorrE   asynciosleeprG   rH   rI   rJ   rF   )rP   r*   rQ   rK   payloadraspuns_complettokens_evalretry_countcurrent_timeoutrL   rH   linechunktokenrN   s                  r   stream_chat_responserm   k   s        )EI
(
(
(C5+
	 G OKKmO
	
!
!@	(AAA              V!==7=CC       x--///&.&:&:&<&< % % % % % % %d# %$%$(Jt$4$4E  )E11i5CS6S6S(-i(8(C /5 8 $, !:*2(5//$9$9$9$9$9$9$9  %yy77 &.3iid.K.K %&  $3 % % %$H%+ '=2 !0"-#' 7                                                                                                          D % 	# 	# 	#1Kq Oi'' "$l	llYhlll	     -"""""""""""$ 	 	 	 J
(>JJ#a&&JJ	         	 	 	 :#a&&::	       	w 	
!
!H 0	  s   F F5)E D5$E )A4D E  D2	/E 1D2	2	E ;FF  
E*	*F-E*	.F2F 
FF FF 7II+I9#H"I"I/III   c                    K   	 t          | ||           d{V }ddt          |           d|dS # t          $ r}dt          |          dcY d}~S d}~ww xY w)u   
    Testează conexiunea cu un server Ollama
    
    Returns:
        Dict cu 'success' (bool) și 'message' sau 'error'
    NTu   Conexiune reușită. z modele disponibile.)r\   rW   r<   F)r\   r^   )rO   lenrF   rJ   )r.   r/   r0   r<   rN   s        r   test_ollama_connectionrq      s      
+Bg>>>>>>>>Ps6{{PPP
 
 	

  
 
 
VV
 
 	
 	
 	
 	
 	
 	

s   -2 
AAAA)r,   r-   )N)r,   rn   )__doc__rA   rD   rc   typingr   r   r   r   r   r<   r	   r_   r$   rJ   intr   r+   rO   callablerm   rq   r   r   r   <module>rv      s       < < < < < < < < < < < < < <       	Q G G# G3 G3 G G G G0d38n% 
 	
 Cy 
$sCx.   DW W3 Wc Wc WSWX[S\ W W W WF $(g gg4S>"g x g 
#s(^	g g g gT
 
S 
 
 
TXY\^aYaTb 
 
 
 
 
 
r   