
    Ii[-                         d dl mZ d dl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Zd dlZd dlmZ d dlmZ h d	Zd
 Z G d d      Zy)    )db)AgenteAgenteTreinoChatMessage)current_user)func)datetimeN)secure_filename)current_app>   mdcsvpdftxtjsonxlsxc                 `    d| v xr) | j                  dd      d   j                         t        v S )N.   )rsplitlowerALLOWED_EXTENSIONS_SERVICE)filenames    9/srv/www/ollama/chat-ollama/src/services/agent_service.py_allowed_file_servicer      s0    (?_xsA6q9??AE___    c                       e Zd Zed        Zed        Zed        Zed        Zed        Zed        Zed        Z	ed        Z
y	)
AgentServicec                 	   t        d       t        d|         t        dt        |       dt        |t              rt	        |      nd        t        |t              rKt        |      D ]=  \  }}t        d| dt        |dd       d	t        |d
d       dt        |dd              ? 	 t        | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      	      }	 t        t        d      r| j                  d      |_
        t        t        d      r| j                  d      |_        t        j                  j!                  |       t        j                  j#                          t        d|j$                          t&        j(                  j                  dd      }t*        j,                  j/                  |t        |j$                              }t        d|        t+        j0                  |d        t        d!       t        d"t        |t              rt	        |      nd d#       t        |t              r|D ]  }t        d$t        |dd              |r|j2                  rt5        |j2                        rt7        |j2                        }	t*        j,                  j/                  ||	      }
t        d%|	 d&|
        |j9                  |
       t        d|	 d'       t;        |j$                  |	(      }t        j                  j!                  |       t        d)|	 d*       t        d+t        |dd               nt        d,       t        d-       t        j                  j=                          t        d.       t        d/       |dfS # t        $ r"}t        dt        |              Y d}~d}~ww xY w# t        $ rH}t        j                  j?                          d0t        |       }t        d1|        d|fcY d}~S d}~ww xY w)2u	  
        Cria um novo agente com seus dados e salva os arquivos de treino.
        agent_data: Dicionário com os dados do agente (nome, descricao, model_identifier, etc.)
        files_list: Lista de objetos de arquivo de request.files.getlist('arquivos')
        u8   [DEBUG SERVICE] Início create_agent_with_training_filesz%[DEBUG SERVICE] agent_data recebido: z,[DEBUG SERVICE] files_list recebido (tipo): z, (quantidade): N/A[DEBUG SERVICE] Arquivo z: Nome=r   z, Tipo=content_typez
, Tamanho=content_lengthuser_idnome	descricaomodel_identifiersystem_promptexamples_jsonwelcome_messagetemperature
max_tokens)	r$   r%   r&   r'   r(   example_promptr*   r+   r,   top_pfrequency_penaltyu@   [DEBUG SERVICE] Aviso: Campos novos não disponíveis no banco: Nz6[DEBUG SERVICE] Novo agente criado e flushado com ID: UPLOAD_FOLDERuploads/agentesz5[DEBUG SERVICE] Verificando/Criando pasta de upload: T)exist_okz2[DEBUG SERVICE] Pasta de upload verificada/criada.u7   [DEBUG SERVICE] Iniciando iteração sobre files_list (z arquivos).z%[DEBUG SERVICE] Processando arquivo: z"[DEBUG SERVICE] Salvando arquivo: z em z salvo com sucesso.)	agente_idarquivoz"[DEBUG SERVICE] AgenteTreino para u    adicionado à sessão.u5   [DEBUG SERVICE] Arquivo inválido ou não permitido: uP   [DEBUG SERVICE] files_list não é uma lista ou está vazia de forma inesperada.z2[DEBUG SERVICE] Tentando commit no banco de dados.z-[DEBUG SERVICE] Commit realizado com sucesso.z?[DEBUG SERVICE] Fim create_agent_with_training_files (Sucesso).z&Erro no AgentService ao criar agente: [DEBUG SERVICE] ) printtype
isinstancelistlen	enumerategetattrr   gethasattrr.   r/   	Exceptionstrr   sessionaddflushidr   configospathjoinmakedirsr   r   r   saver   commitrollback)
agent_data
files_listifnovo_agenteeupload_folder_baseagent_specific_upload_folderr4   r   caminho_completonovo_treinoerror_messages                r    create_agent_with_training_filesz-AgentService.create_agent_with_training_files   s_    	HJ5j\BC<T*=M<NN^r|  ~H  JN  sO_bcm_n  UZ  _[  \  	]j$'!*- u10771jRW;X:YY`ahijlz  }B  bC  aD  DN  OV  WX  Zj  lq  Or  Ns  t  uu@	' "y1^^F+$..5!+0B!C(nn_=)~~o> */@ A&NN=9%>>,7
Kc67+(2w(?K%6#674>NNCV4WK1 JJNN;'JJJ;>>JZ[\!,!3!3!7!7IZ![+-77<<8JCP[P^P^L_+`(IJfIghiKK4tDFHK_ijtvz_{CPZO  BG  LH  HS  T  U*d+) ~GA''S]_dBeAfgh7#3#38MgN^N^8_#273C3C#D+-77<<8TV^+_( B8*DQaPbcd%56 8
BUVW&2&1nn$,' 

{3 B8*Lcde!VW^_fhrtyWzV{|}!~$ hjFHJJACSU$$S  cXY\]^Y_X`abbcT  	'JJ!DSVHMM$]O45&&		'sK   +BP- AO? I+P- ?	P*P%P- %P**P- -	Q>6=Q93Q>9Q>c                     	 t        t        d      rbt        j                  dk(  rOt        j                  j                  t              j                  t        j                        j                         } n|t        j                  j                  t              j                  t        j                  t        j                  k(        j                  t        j                        j                         } g }| D ]  }t        j                  j                  t        j                  t        j                              j                  t        j                   |j                  k(  t        j                  t        j                  k(        j#                         xs d}t        j                  j                  t        j                  t$        j                              j'                  t        t        j                  t$        j(                  k(        j                  t        j                   |j                  k(  t        j                  t        j                  k(        j#                         xs d}d}|j                  rKdj'                  |j                  j+                         d d D cg c]  }|d   	 c}      j-                         nd}t        |d      r|j.                  r|j.                  nd	}|j0                  r|j0                  nd
}	t        |d      r8|j2                  r,t        |j2                  d      r|j2                  j4                  nd}
|j                  |j                  xs d|||	|
|j6                  |||dd}|j9                  |        |d fS c c}w # t:        $ r.}t=        dt?        |              g t?        |      fcY d }~S d }~ww xY w)Nrole
superadminr   r        AGr'   u   Não Definidou   Sem descrição.userusername-zAgente Sem Nome)conversationsmessagestokens)rD   nameinitialsmodeldescriptioncreator_usernamepublic_tokenstatsz1Erro em AgentService.get_user_agents_with_stats: ) r>   r   rZ   r   rA   queryr   order_byr%   allfilterr$   rD   r	   countr   agent_idscalarr   rH   chat_idsplitupperr'   r&   r_   r`   rj   appendr?   r6   r@   )user_agentsagents_list_with_statsagentconversation_countmessage_counttokens_usedwordrf   model_displaydescription_textri   
agent_dictrR   s                r   get_user_agents_with_statsz'AgentService.get_user_agents_with_statsa   s   .	|V,1B1Bl1R jj..v6??LPPR jj..v6==fnnP\P_P_>_`iijpjujuvzz|%'"$ ":%'ZZ%5%5djj6I%JVDMMUXX5t|||7VWVX&#!" # !#

 0 0GJJ1G HT$7?? :;VDMMUXX5t|||7VWVX!# "# 
 $\a\f\f277

8H8H8J2A8N#ODG#OPVVXlp:A%I[:\afawaw 6 6  ~M6;oo5??K] :A%:PUZU_U_dklqlvlv  yC  eD5::#6#6  JM   ((!JJ;*; (*#3(8$)$6$6);$1"-
 '--j9E":H *4//1 $P2  	Ec!fXNOs1v:	s1   JN N
'C%N N 	O	#O>O	O	c           	         	 t         j                  j                  t              j	                  | t
        j                        j                         }|r>t         j                  j                  |       t         j                  j                          yy# t        $ rO}t         j                  j                          t        d|  dt        |              dt        |      fcY d }~S d }~ww xY w)NrD   r$   TN)F(   Agente não encontrado ou acesso negado.zErro ao excluir agente : F)r   rA   rl   r   	filter_byr   rD   firstdeleterK   r?   rL   r6   r@   )rq   agenterR   s      r   delete_agentzAgentService.delete_agent   s    
	!ZZ%%f-778\__7]cceF

!!&)

!!#!D 	!JJ!+H:RAx@A#a&= 	!s   BB 	C+AC& C+&C+c                  z    t         j                  j                  t        j                        j                         S )N)r$   )r   rl   r   r   rD   rn    r   r   get_user_agentszAgentService.get_user_agents   s'    ||%%loo%>BBDDr   c                 |    t         j                  j                  | t        j                        j                         S )Nr   )r   rl   r   r   rD   r   )rq   s    r   	get_agentzAgentService.get_agent   s)    ||%%<??%KQQSSr   c                 b   	 t         j                  j                  | t        j                        j                         }|r|j                  D ]a  }t        j                  j                  d|j                        }t        j                  j                  |      sMt        j                  |       c t        j                  j                  |       t        j                  j!                          yy# t"        $ r5}t        j                  j%                          dt'        |      fcY d }~S d }~ww xY w)Nr   uploadsr   )Fu   Agente não encontradoF)r   rl   r   r   rD   r   treinosrF   rG   rH   r4   existsremover   rA   r   rK   r?   rL   r@   )rq   r   treino	file_pathrR   s        r   r   zAgentService.delete_agent   s    	!\\++x+QWWYF$nn -F "Y GIww~~i0		),-
 

!!&)

!!#!2 	!JJ!#a&= 	!s%   BC0 AC0 0	D.9*D)#D.)D.c                 &   	 t         j                  j                  t              j	                  | t
        j                        j                         }|sy|d fS # t        $ r.}t        dt        |              d t        |      fcY d }~S d }~ww xY w)Nr   )Nr   z&Erro em AgentService.get_agent_by_id: )r   rA   rl   r   r   r   rD   r   r?   r6   r@   )rq   ry   rR   s      r   get_agent_by_idzAgentService.get_agent_by_id   sz    	 JJ$$V,66(LOO6\bbdEG$; 	 :3q6(CDQ<	 s$   AA A 	B"#BBBc           
      0   t        d|         g }	 t        j                  j                  t              j                  |       j                         }t        dt        |       d       |st        d       g dfS t        j                  j                  dd      }|D ]  }|j                  }t        j                  j                  |t        |             }t        j                  j                  ||      }t        d	|        t        j                  j!                  |      rW	 t#        |d
d      5 }|j%                         }	ddd       t        d| dt        	       d       |j'                  ||	f       t        d|         t        dt        |              |dfS # 1 sw Y   cxY w# t(        $ r%}
t        d| dt        |
              Y d}
~
<d}
~
ww xY w# t(        $ r*}dt        |       }t        d|        d|fcY d}~S d}~ww xY w)u   
        Recupera e lê o conteúdo dos arquivos de treino para um dado agente.
        Retorna uma lista de tuplas (filename, content).
        zE[DEBUG SERVICE] Iniciando get_training_files_content para agente_id: )r3   z[DEBUG SERVICE] Encontrados z registros de treino.zE[DEBUG SERVICE] Nenhum arquivo de treino encontrado para este agente.Nr0   r1   z&[DEBUG SERVICE] Tentando ler arquivo: rzutf-8)encodingr!   z lido com sucesso. Tamanho: z bytesz$[DEBUG SERVICE] Erro ao ler arquivo r   u4   [DEBUG SERVICE] Arquivo não encontrado no caminho: zS[DEBUG SERVICE] Fim get_training_files_content (Sucesso). Total de arquivos lidos: u@   Erro no AgentService ao obter conteúdo dos arquivos de treino: r5   )r6   r   rA   rl   r   r   rn   r:   r   rE   r=   r4   rF   rG   rH   r@   r   openreadrv   r?   )rq   training_files_contentr   rS   r   r   rT   r   rP   contentfile_read_errorrR   rW   s                r   get_training_files_contentz'AgentService.get_training_files_content   s#    	UV^U_`a!#"	'jj&&|4>>>RVVXG0W>STU]^4x!,!3!3!7!7IZ![! ^!>>/1ww||<NPST\P]/^,GGLL)ExP	>ykJK77>>),!)S7C /q&'ffhG/ 8
B^_bcj_k^llrst.55x6IJ
 PQZP[\]!^$ ghk  mC  iD  hE  F  G)4/// / %  DXJbQTUdQePfgh  	'^_bcd_e^fgM$]O45&&	'sg   A)G" <B'G" $F12F%6F19+G" %F.	*F11	G:GG" GG" "	H+H
HHN)__name__
__module____qualname__staticmethodrX   r   r   r   r   r   r   r   r   r   r   r      s    M' M'^ / /b ! ! E E T T ! !"     )' )'r   r   )srcr   
src.modelsr   r   r   r   flask_loginr   
sqlalchemyr	   r
   rF   r   werkzeug.utilsr   flaskr   r   r   r   r   r   r   <module>r      s;     : : $   	  * H ``' `'r   