
    Z)iOI                        S SK r S SK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  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJrJrJrJrJrJrJr  \" S\SS9rSr1 Skr S r!\RE                  SSS/S9\S 5       5       r#\RE                  S5      \S 5       5       r$\RE                  SSS/S9\S 5       5       r%\RE                  SS/S9\S 5       5       r&\RE                  S5      \S 5       5       r'\RE                  SS/S9\S  5       5       r(\RE                  S!S/S9\S" 5       5       r)\RE                  S#5      \S$ 5       5       r*\RE                  S%S/S9\S& 5       5       r+\RE                  S'S(/S9\S) 5       5       r,\RE                  S*S/S9\S+ 5       5       r-\RE                  S,5      \S- 5       5       r.\RE                  S.SS/S9\S/ 5       5       r/\RE                  S0S/S9S1 5       r0g)2    N)db)datetime)User)secure_filename)AgenteAgenteTreino)AgentUserShare)AgentService)login_requiredcurrent_usersend_discord_audit_log)	Blueprintrequestjsonifyflashredirecturl_forrender_templateagentz../templates)template_folderzuploads/agentes>   csvpdftxtxlsxc                 n    SU ;   =(       a*    U R                  SS5      S   R                  5       [        ;   $ )N.   )rsplitlowerALLOWED_EXTENSIONS)filenames    RC:\Users\fernando.barreto\Documents\GitLab\ollama\chat-ollama\src\routes\agente.pyallowed_filer$      s0    (?WxsA6q9??AEWWW    z/novoGETPOST)methodsc                     [        S5        [        R                  S:X  Ga  [        S5        [        R                  R	                  S5      n [        R                  R	                  S5      n[        R
                  R                  S5      n[        R                  R	                  S5      n[        R                  R	                  SS	5      n[        R                  R	                  S
S5      n[        R                  R	                  SS5      n[        R                  R	                  SS5      n[        R                  R	                  S5      n[        R                  R	                  S5      n	[        R                  R	                  SS5      n
U (       dO  [        R                  (       d  S[        R                  ;   a  [        SS05      S4$ [        SS5        [        S5      $  [        U5      S-  n[        U5      n[        U5      S-  n[        U5      S-  n[        R                  U UUUUUUUU	U
S.n[        S5        [         R"                  " X5      u  nn[        S5        U(       aa  [        SU 35        [        R                  (       d  S[        R                  ;   a  [        USS .5      S!4$ [        S"U 3S5        [        S5      $ [%        S#[        R&                  S$UR                  S%UR(                   3[        R*                  S&9  [        R                  (       d  S[        R                  ;   a}  UR,                  nU(       d  [.        R0                  " 5       n[        S'S(UR                  UR(                  UR2                  U(       a  UR5                  5       OS S).[7        S*5      S+.5      S,4$ [        S-S.5        [9        [7        S*5      5      $ [        S5      $ ! [:         a  n[<        R>                  RA                  5         S/[C        U5       3n[        S0U 35        [        R                  (       d  S[        R                  ;   a  [        USS .5      S!4s S nA$ [        US5        [        S5      s S nA$ S nAff = f)1Nz"[DEBUG ROUTE] Rota /novo acessada.r'   u$   [DEBUG ROUTE] Método POST recebido.nome	descricaoarquivosmodel_identifiertemperature70
max_tokens2048top_p90frequency_penalty0system_promptexamples_jsonwelcome_message    Olá! Como posso te ajudar hoje?application/jsonerroru   Nome do agente é obrigatório  dangerzagent/novo_agente.html      Y@)user_idr*   r-   r+   r.   r0   r2   r4   r6   r7   r8   zD[DEBUG ROUTE] Chamando AgentService.create_agent_with_training_fileszE[DEBUG ROUTE] AgentService.create_agent_with_training_files retornou.z[ERRO SERVICE] F)r;   success  zErro ao criar agente: u   Criação de agenter   zAgente criado: actionr?   object_type	object_iddetails
ip_addressTzAgente criado com sucesso!)idr*   r+   
created_atagent.list_agents_page_dinamica)r@   messager   redirect_url   zAgente cadastrado com sucesso!r@   u*   Erro inesperado ao processar formulário: z[ERRO GERAL] )"printr   methodformgetfilesgetlistis_jsonaccept_mimetypesr   r   r   floatintr   rH   r
    create_agent_with_training_filesr   emailr*   remote_addrrI   r   utcnowr+   	isoformatr   r   	Exceptionr   sessionrollbackstr)r*   r+   r,   r-   temperature_strmax_tokens_str	top_p_strfrequency_penalty_strr6   examples_json_strr8   r.   r0   r2   r4   
agent_datanovo_agente_objr;   rI   eerror_messages                        r#   novo_agenterj      s    

./~~45||'LL$$[1	==((4"<<++,>?!,,**=$? )),?LL$$Wd3	 ' 0 01Dc J((9#LL,,_=!,,**+<>`a"48P8P"P)IJKSPP2H="#;<<C	=058K^,J)$u,E %&; <u D (??$4&*(%6!.!2#2J XY%1%R%RS]%h"OUYZw/0??&8G<T<T&T"Uu#EFKK.ug6A&'?@@",$**$),,)/*>*>)?@".. "48P8P"P,77
!!)!2J#;-00 / 4 4%4%>%>@Jj&:&:&<PT	 %,,M$N
  
 
 
 2I>G$EFGG 344  		=JJ!HQQMM-12"48P8P"P5IJCOO-*"#;<<		=s?   CO +O C&O ,O 
Q:!A2Q5Q:Q5/Q:5Q:z/listac                      [         R                  R                  [        5      R	                  [
        R                  S9R                  5       n [        SX (       a  U S   S9$ S S9$ )Nr?   zagent/lista_agentes.htmlr   )agentescurrent_agent)	r   r^   queryr   	filter_byr   rH   allr   )rm   s    r#   lista_agentesrr   w   sV     jjv&000IMMOG5wdkV]^_V`vvquvvr%   z/editar/<int:agente_id>c           	         [        [        S5      (       aS  [        R                  S:X  a?  [        R                  R                  [        5      R                  U S9R                  5       nOM[        R                  R                  [        5      R                  U [        R                  S9R                  5       n[        R                  S:X  Ga  [        R                  R                  SUR                  5      Ul        [        R                  R                  SUR                  5      Ul        [        R                  R                  SUR                   5      Ul         [#        [        R                  R                  S	UR$                  S
-  5      5      S-  Ul         [)        [        R                  R                  SUR*                  5      5      Ul         [#        [        R                  R                  SUR,                  S
-  5      5      S-  Ul         [#        [        R                  R                  SUR.                  S
-  5      5      S-  Ul        [        R                  R                  SUR0                  5      Ul        [        R                  R                  SUR2                  =(       d    S5      Ul        [        R                  R                  S5      n[5        SU 35        U(       a  X!l        O`[        R                  R                  S5      nU(       a  X1l        O3SR9                  [        R                  R;                  S5      5      Ul        [        R<                  R;                  S5      n[>        R@                  R9                  [B        [E        UR                  5      5      n[>        RF                  " USS9  U GH  nU(       d  M  URH                  (       d  M   [K        URH                  5      (       d  M<  [M        URH                  5      n[>        R@                  R9                  XW5      nURO                  U5        [        R                  R                  [P        5      R                  UR                  US9RS                  5       n	U	(       a  M  [Q        UR                  US9n
[        R                  RU                  U
5        GM	      [5        SUR6                   35        [        R                  RW                  5         [Y        S[        R                  SUR                  SUR                   3[        RZ                  S9  [        R\                  (       d  S[        R^                  ;   a  [a        SS [c        S!5      S".5      $ [e        S S#5        [i        [c        S!5      5      $ / nUR6                  (       a!   [j        Rl                  " UR6                  5      n[o        S)XUS*9$ ! [&         a     GNVf = f! [&         a     GN.f = f! [&         a     GN f = f! [&         a     GNf = f! [&         a  n[        R                  Rg                  5         [        R\                  (       d  S[        R^                  ;   a  [a        S$[E        U5      S%.5      S&4s S nA$ [e        S'[E        U5       3S(5         S nAGN$S nAff = f! [&         a    / n Nf = f)+Nrole
superadmin)rH   )rH   r?   r'   r*   r+   r-   r.   d   r>   r0   r2   r4   r6   r8   r9   r7   z)[DEBUG] Valor recebido de examples_json: example_promptz||r,   T)exist_ok)	agente_idarquivoz1[DEBUG] Valor de example_prompt antes do commit: u   Edição de agenter   zAgente editado: rB   r:   zAgente atualizado com sucesso!rJ   )r@   rK   rL   r@   Fr@   r;   rA   zErro ao atualizar agente: r=   zagent/editar_agente.html)agentern   examples_list)8hasattrr   rt   r   r^   ro   r   rp   first_or_404rH   r   rO   rP   rQ   r*   r+   r-   rV   r.   r]   rW   r0   r2   r4   r6   r8   rN   rw   joinrS   rR   ospathUPLOAD_FOLDERr`   makedirsr"   r$   r   saver   firstaddcommitr   rZ   rT   rU   r   r   r   r_   r   jsonloadsr   )ry   r|   r7   example_prompt_fallbackr,   agent_upload_folderrz   r"   caminhoexiste_treinotreinorh   r}   s                r#   editar_agenter   }   s    |V$$):):l)J!!&)33y3ANNP!!&)33y,//3Zggi~~ll&&vv{{;"<<++K9I9IJ"),,"2"23EvG^G^"_	!&w||'7'7vGYGY\_G_'`!adi!iF	 #GLL$4$4\6CTCT$U VF	 !1!1'6<<#;M!NORWWFL	',W\\-=-=>QSYSkSknqSq-r'sv{'{F$  '||//AUAUV!(!1!12CVE[E[  FB  `B  "C((99-IJ$1!&-ll&6&67G&H#&(?%(,		',,2F2FGW2X(Y%==((4 ggll=#fii.I
'$7Gw7+++W=M=M0N0N*7+;+;<'',,':EW% "

 0 0 > H HSYS\S\fn H o u u w$})FIIxPFJJNN6*  	CEfF[F[E\]^JJ"+$$ ))*6;;-8".. "48P8P"P#?$+,M$N   
 2I>  ABCCM	 JJv'<'<=M 5fjwxxS  		  		  		  		`  	CJJ!"48P8P"P53q6BCSHH.s1vh7BB		C  	M	s   >W  8W1 >X >X 	B7X$ X$ 5 Z9  
W.-W.1
W?>W?
XX
X! X!$
Z6.AZ1Z6Z11Z69[[z/delete/<int:agente_id>c           	         [         R                  " U 5      u  p[        R                  (       d  S[        R                  ;   aX  U(       a8  [        S[        R                  SU S[        R                  S9  [        SSS.5      $ [        S	U=(       d    S
S.5      S4$ U(       a7  [        S[        R                  SU S[        R                  S9  [        SS5        O[        U=(       d    S
S5        [        [        S5      5      $ )Nr:   u   Exclusão de agenter   u   Agente excluído com sucessorB   Tu   Agente excluído com sucesso.)r@   rK   FzErro ao excluir agente.r{   r<   u   Agente excluído com sucesso!r@   r=   rJ   )r
   delete_agentr   rT   rU   r   r   rH   rZ   r   r   r   r   )ry   r@   r;   s      r#   delete_agenter      s     "..y9NG,0H0HH",$$#6".. t8WXYYuu7Y@YZ[]```( OO 2**	
 	-y9e00(;G=>??r%   z/agentsc                      [        S5      $ )Nzagents.html)r    r%   r#   list_agents_page_dinamicar      s     =))r%   z/api/agentsc                      [         R                  " 5       u  pU(       a  [        SU 35        [        SUS.5      S4$ [        U 5      $ )u|   
Endpoint da API para buscar a lista de agentes do usuário logado com estatísticas,
usado pelo JavaScript em agents.html.
zAPI Error em /api/agents: z!Falha ao buscar lista de agentes.)r;   rF   rA   )r
   get_user_agents_with_statsrN   r   )agents_datar;   s     r#   api_get_user_agents_dinamicosr      sK     &@@BK*5'23!DQVWXZ]]];r%   z!/api/agent/<int:agent_id>/welcomec           	           [        SU  S[        R                   35        [        R                  R                  [        U 5      nU(       d  [        SU  S35        [        SS05      S4$ [        SUR                   35        [        S	[        UR                  5       35        [        UR                  UR                  UR                  S
.5      $ ! [         a3  n[        SU  S[        U5       35        [        SS05      S4s SnA$ SnAff = f)u:   Retorna a mensagem de boas-vindas de um agente específicoz([DEBUG] API welcome chamada para agente u    por usuário z[DEBUG] Agente u    não encontrador;   u   Agente não encontrado  z[DEBUG] Agente encontrado: z[DEBUG] Welcome message: )agent_id
agent_namer8   z9[ERROR] Erro ao buscar mensagem de boas-vindas do agente z: zErro interno do servidorrA   N)rN   r   rH   r   r^   rQ   r   r   r*   reprr8   r]   r`   )r   r|   rh   s      r#   get_agent_welcome_messager     s   C8
.Q]Q`Q`Pabc1OH:-=>?G%=>?DD+FKK=9:)$v/E/E*F)GHI		 ++%55
  	  CI(SUVYZ[V\U]^_!;<=sBBCs%   A'C *A%C 
D(DDDz/agent/<int:agent_id>/chatc                 F   [         R                  R                  [        U 5      nU(       aD  [	        US5      (       aS  UR
                  [        R                  :w  a5  [        [        SS5      S:w  a   [        SS5        [        [        S5      5      $ [        [        SU S	95      $ )
Nr?   rt    ru   u(   Agente não encontrado ou acesso negado.r=   rJ   zchat.chat_redirect)r   )r   r^   rQ   r   r~   r?   r   rH   getattrr   r   r   )r   r|   s     r#   start_agent_chat_router   %  s     ZZ^^FH-Fgfi00V^^|5V[bcoqwy{[|  AM  \M8(C ABCCG08DEEr%   z#/agente/<int:agent_id>/compartilharc                    [         R                  " 5       nUR                  S5      nUR                  SS5      n[        R                  R                  US9R                  5       nU(       d  [        SS05      S4$ [        R                  R                  U 5      nU(       a  UR                  [        R                  :w  a  [        SS05      S	4$ [        R                  R                  XR                  S
9R                  5       nU(       a  [        SS05      S4$ [        XR                  US9n[        R                  R                  U5        [        R                  R!                  5         [#        S[        R                  SU SUR$                   SUR&                   SU S3[         R(                  S9  [        SS05      S4$ )NrY   
permissionviewrY   r;   u   Usuário não encontrador   Acesso negado  r   r?   rK   u   Já compartilhado   )r   r?   r   zCompartilhamento de agenter   Agente z compartilhado com z (perm: )rB   z Agente compartilhado com sucessorM   )r   get_jsonrQ   r   ro   rp   r   r   r   r?   r   rH   r	   r   r^   r   r   r   r*   rY   rZ   )r   data
user_emailr   userr|   existingshares           r#   compartilhar_agenter   .  sn    D'"J,/J::j1779D!;<=sBB\\h'FV^^|612C77##--x-QWWYH	#678#==Hgg*UEJJNN5JJ+&++&9$**Xj\YZ[&& IABCSHHr%   z1/agente/<int:agent_id>/compartilhar/<int:user_id>DELETEc           
      J   [         R                  R                  U 5      nU(       a  UR                  [        R
                  :w  a  [        SS05      S4$ [        R                  R                  XS9R                  5       nU(       d  [        SS05      S4$ [        R                  R                  U5        [        R                  R                  5         [        S[        R
                  SU S	UR                   S
UR                   3[         R"                  S9  [        SS05      S4$ )Nr;   r   r   r   u    Compartilhamento não encontrador   zDescompartilhamento de agenter   r   z descompartilhado de rB   rK   zCompartilhamento removidor   )r   ro   rQ   r?   r   rH   r   r	   rp   r   r   r^   deleter   r   r*   r   rZ   )r   r?   r|   r   s       r#   descompartilhar_agenter   J  s     \\h'FV^^|612C77  **H*NTTVE!CDEsJJJJeJJ.&++&;EMM?K&& I:;<cAAr%   z/agentes/compartilhadosc                  F   [         R                  R                  [        R                  S9R                  5       n / nU  HT  n[        R                  R                  UR                  5      nU(       d  M5  UR                  UR                  5       5        MV     [        SU05      $ )Nrl   rm   )r	   ro   rp   r   rH   rq   r   rQ   r   appendto_dictr   )sharesrm   r   r|   s       r#   listar_agentes_compartilhadosr   _  s{     !!++LOO+DHHJFG!!%..16NN6>>+,  Iw'((r%   z/api/users/searchc                     [         R                  R                  SS5      R                  5       R	                  5       n U (       a  [        U 5      S:  a  [        / 5      $ [        R                  R                  [        R                  R                  SU  S35      [        R                  R                  SU  S35      -  5      R                  S5      R                  5       nU Vs/ s HF  o"R                  [         R                  :w  d  M"  UR                  UR                  UR                  S.PMH     nn[        U5      $ s  snf )Nqr      %
   )rH   rY   username)r   argsrQ   stripr    lenr   r   ro   filterrY   iliker   limitrq   rH   r   )r   usersuresultss       r#   search_usersr   j  s     	b!'')//1AA
r{JJtzz//!A3a9dmm>Q>QTUVWUXXYRZ>[\]ccdfgkkmE A$$,//1 	?qttagg1::>   7	s   #!D=(D=z/admin/create_userc                     [        [        S5      (       a  [        R                  S:w  a  [        SSS9S4$ [        R
                  S:X  Ga  [        R                  R                  S5      n [        R                  R                  S	5      n[        R                  R                  S
5      nU (       a  U(       a  U(       d
  [        SSS9$ [        R                  R                  U S9R                  5       (       d0  [        R                  R                  US9R                  5       (       a
  [        SSS9$ [        XS9nUR                  U5        [        R                  R                  U5        [        R                  R!                  5         [#        S[        R$                  SUR$                  SU  SU S3[        R&                  S9  [        SSS9$ [        S5      $ )Nrt   ru   z
error.htmlr   )r;   r   r'   r   rY   passwordzadmin/create_user.htmlu"   Todos os campos são obrigatórios)r   r   u   Usuário ou e-mail já existe)r   rY   u   Criação de usuário adminu   Usuáriou   Usuário admin criado: z (r   rB   u   Usuário criado com sucesso!)r@   )r~   r   rt   r   r   rO   rP   rQ   r   ro   rp   r   set_passwordr   r^   r   r   r   rH   rZ   )r   rY   r   r   s       r#   admin_create_userr   w  sk    <((L,=,=,M|?CSHH~~<<##J/  )<<##J/uH"#;Cghh::288::djj>R>RY^>R>_>e>e>g>g"#;CbccX3(#


t


0 OO"gg-hZr%B**	
 7A_``344r%   z!/api/agents/<public_token>/copiedc                 T   SSK Jn  SSKJn  SS KnUR
                  R                  U S9R                  5       nU(       d  SS0S4$ U" SS S	UR                  S
U  S[        R                   SUR                  R                  5       R                  5        S3[        R                  S9  SS0$ )Nr   )r   r   )public_tokenr;   u   Token não encontrador   zToken de agente copiador   zToken copiado: z | IP: u    | Horário:  rB   r@   T)
src.modelsr   src.discord.discord_webhookr   r   ro   rp   r   rH   r   rZ   r[   r\   )r   r   r   r   r|   s        r#   notify_public_token_copiedr     s    !B\\###>DDFF01366())!,ww7J7J6K=YaYjYjYqYqYsY}Y}Y  YA  AB  C&& tr%   )1r   r   src.extensionsr   r   src.models.userr   werkzeug.utilsr   r   r   r   src.models.agenter	   src.services.agent_servicer
   flask_loginr   r   r   r   flaskr   r   r   r   r   r   r   __name__agent_bpr   r!   r$   routerj   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r#   <module>r      s   	      * + , 3 4 > X X XWhG!2 X 
%1\5  2\5| 
w  w 
)E6?CUy  DUyn 
)F8<@  =@@ 
	*  * 
w/   0  
3eWEC  FC. 
,-F  .F 
5xHI  II4 
ChZXB  YB& 
)E7;)  <) 
#$	  %	 
$ufo>5  ?54 
3fXF Gr%   