
    <80i                     x   S SK r S SKrS SKrS SKrS SKrS SKJr  \" 5         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  S SKJr  S S	KJr  S S
KJr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 J!r!J"r"J#r#  S SK$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.  \%" S\/5      r0\0Rc                  SS/S9S 5       r2\0Rc                  SS/S9\S 5       5       r3\0Rc                  S5      \S 5       5       r4\0Rc                  S5      \S 5       5       r5\0Rc                  S5      \S 5       5       r6\0Rc                  S5      \S 5       5       r7\0Rc                  SS/S9\S  5       5       r8\0Rc                  S!S/S9\S" 5       5       r9\0Rc                  S#S/S9\S$ 5       5       r:\0Rc                  S%S/S9\S& 5       5       r;\0Rc                  S'S(/S9\S) 5       5       r<\0Rc                  S*5      \S+ 5       5       r=\0Rc                  S,5      \S- 5       5       r>S. r\0Rc                  S/S/S9\S0 5       5       r?\0Rc                  S1S/S9\S2 5       5       r@\0Rc                  S35      S4 5       rA\0Rc                  S5S/S9S6 5       rB\0Rc                  S75      \S8 5       5       rC\0Rc                  S95      \S: 5       5       rD\0Rc                  S;5      \S< 5       5       rEg)=    N)load_dotenv)text)datetimedb)Retry)HTTPAdapter)secure_filenameChatService)login_requiredcurrent_user)read_document_contentallowed_file)SharePointClientsend_discord_audit_log)AgenteChatAgenteTreinoMessageChatFile)
	Blueprintrender_templaterequestredirecturl_forflashjsonifysessioncurrent_appsend_from_directorychatz/healthGET)methodsc                       [         R                  R                  [        S5      5        Sn [        R                  " S5      n[        R                  " S5      nSn [        R                  " U S3S	S
9nUR                  (       a  SnU S:X  a  SnSnOUS:X  a  SnSnOSnSn[        UUU [         R"                  " 5       R%                  5       S.5      U4$ ! [         a7  n[
        R                  R                  S[        U5       35        Sn  SnANSnAff = f! [        R                   aL     [        R                  " U S3S	S
9nUR                  (       a  Sn N! [        R                   a    Sn  Nf = ff = f! [         ap  n[
        R                  R                  S[        U5       35        [        S[        U5      [         R"                  " 5       R%                  5       S.5      S4s SnA$ SnAff = f)u,   Endpoint para verificar a saúde do servidorzSELECT 1	connectedzDatabase health check failed: disconnectedN
ollama_url
backup_urlz/api/health   )timeoutzconnected (backup)	unhealthy  degraded  healthy   )statusollamadatabase	timestampzHealth check failed: )r3   errorr6   )r   r    executer   	Exceptionr!   loggerr7   strosgetenvrequestsgetokRequestExceptionr   r   now	isoformat)		db_statusdb_errorr)   r*   ollama_statusresponser3   status_codees	            WC:\Users\fernando.barreto\Documents\GitLab\ollama\chat-ollama\src\routes\chat_routes.pyhealth_checkrK      s   /	'JJtJ/0#I
 YY|,
YY|,
&
	/||zl+$>JH{{ + & FKn,FKFK#!!113	
 
  	=  	'$$'Ec(m_%UV&I	' (( 	//#<<:,k(BAN;;$8M,, / ./	/2    #8Q!AB!V!113
  	 	s   *C .E; +D AE; 
D-DE; DE; E8-+EE; E40E81E; 3E44E88E; ;
G5A%G0*G50G5z/chatPOSTc                  >    [        S5        [        R                  R                  SS5      R	                  5       n [        R
                  R                  S5      n[        R                  R                  S5      n[        R                  R                  S5      n[        SU  SU S	U 35        [        S
U Vs/ s H  oDR                  PM     sn 35        U (       d  U(       d  [        SS05      S4$ U(       d  [        SS05      S4$ [        SU 35        [        R                  R                  U5      nU(       d  [        SU 35        [        SS05      S4$ [        S[        USS5       35        [        R                  " S5      n[        USS 5      =(       a    SUR                  R                  5       ;   =(       d    [        USS5      R                  5       S:H  nU(       Ga  U(       Gaw  [        R                   " SU [        R"                  5      (       GaK  SU  S3nSn	SSUS./S S!S"S#S$.n
 [$        R&                  " XS%S&9nUR)                  5       nUR                  S0 5      R                  S'S(5      nS)S KnUR+                  U5      nUR                  S+5      S,:X  a  [1        US-9nUR3                  S.S/9n[        S0U5        UR                  S1/ 5      nU(       d  S2nOR/ nU H6  nUR                  S35      (       a  S4OS5nUR5                  U S6US7    35        M8     S8S9R7                  U5      -   nU(       a  [8        R:                  " UUS 5        [        UUS:.5      $ UR                  S+5      S;:X  Ga  UR                  S<5      (       Ga   US<   nU[        S='   [1        US-9n UR3                  US.S/9nUR                  S1/ 5      n/ nUS S>  H6  nUR                  S35      (       a  S4OS5nUR5                  U S6US7    35        M8     U(       a  S?U S@3S9R7                  U5      -   nOSAU SB3nSCU SD[=        SE5      R7                  U5       SF3nSSUS.SGU S./S [?        UR@                  =(       d    SH5      [?        URB                  =(       d    SI5      [E        URF                  =(       d    SJ5      S$.n
[$        RH                  " 5       n[K        SKSL/ SMQSN9n[M        USO9nURO                  SPU5        URO                  SQU5        Sn	 UR'                  XS%S&9nURP                  SR:X  a:  UR)                  5       nUR                  S0 5      R                  S'S5      nUSSU 3-  nU(       a  [8        R:                  " UUS 5        [        UUS:.5      $ UR                  S+5      Sc:X  Ga  UR                  S<5      (       Gax  US<   n[1        US-9n URY                  US.S/9nU(       Ga  UR3                  US.S/9nUR                  S1/ 5      n/ nUS S>  H6  nUR                  S35      (       a  S4OS5nUR5                  U S6US7    35        M8     U(       a  S?U S@3S9R7                  U5      -   nOSAU SB3nSCU SD[=        SE5      R7                  U5       SF3nSSUS.SGU S./S [?        UR@                  =(       d    SH5      [?        URB                  =(       d    SI5      [E        URF                  =(       d    SJ5      S$.n
[$        RH                  " 5       n[K        SKSL/ SMQSN9n[M        USO9nURO                  SPU5        URO                  SQU5        Sn	 UR'                  XS%S&9nURP                  SR:X  a:  UR)                  5       nUR                  S0 5      R                  S'S5      nUSSU 3-  nOh UR]                  US.S/9u  n!n"U!(       aG  UR[                  U!S.S/9n S[U! S\3S9R7                  U 5      -   nU"(       a  US]S^R7                  U"5       3-  nOS_U Se3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      $ UR                  S+5      Sf:X  Ga  UR                  Sg5      (       Ga  USg   n#[        R                  " S=5      n[1        US-9nU(       Ga  UR3                  US.S/9nUR                  S1/ 5       Vs/ s H  nUS7   PM
     n$nU#U$;   Gae  U ShU# 3n%UR_                  U%S.S/9n&SiU# SjU SkU&S SJ  3nU(       a  [8        R:                  " UUS 5        SlU# SmU SnU&S So  Sp3nSSUS.SGU S./S [?        UR@                  =(       d    SH5      [?        URB                  =(       d    SI5      [E        URF                  =(       d    SJ5      S$.n
[$        RH                  " 5       n[K        SKSL/ SMQSN9n[M        USO9nURO                  SPU5        URO                  SQU5        Sn	 UR'                  XS%S&9nURP                  SR:X  a:  UR)                  5       nUR                  S0 5      R                  S'S5      nUSqU 3-  nOSiU# SsU St3nOSunU(       a  [8        R:                  " UUS 5        [        UUS:.5      $ [        USS 5      =(       a    SvUR                  R                  5       ;   n'U'(       Ga  S)S K0n(S)S K1n)U(       Ga  US)   (       Ga  US)   R                  (       Gay  US)   n*U)Re                  S SwSx9 n+U*Rg                  U+Rh                  5        [k        U+Rh                  Sy5       nURm                  5       n,U(Ro                  U,5      Rq                  Sz5      n-S S S 5        S S S 5        SvSGU W-/S{./S [?        UR@                  =(       d    SH5      [?        URB                  =(       d    SI5      [E        URF                  =(       d    SJ5      S$.n
Sn	[$        R&                  " XS|S&9nUR)                  5       nUR                  S0 5      R                  S'S5      n.U(       a0  [8        R:                  " US}S~5        [8        R:                  " UU.S 5        [        U.US:.5      $ U R                  5       Rs                  S5      (       d%  U R                  5       Rs                  S5      (       Ga
  U Ru                  SS5      Ru                  SS5      R	                  5       n/SvU/SS [?        UR@                  =(       d    SH5      [?        URB                  =(       d    SI5      [E        URF                  =(       d    SJ5      S.n
Sn	[$        R&                  " XS|S&9nUR)                  5       nUR                  SS 5      n0U0(       a-  U(       a  [8        R:                  " USS 5        [        U0US.5      $ [        SS05      S4$ / n1U H  nU(       d  M  UR                  (       d  M  [w        UR                  5      (       d  M;  S)S K1n)U)Re                  S S9 n+URg                  U+Rh                  5        [y        U+Rh                  UR                  5      n2U2(       aD  U2Rs                  S5      (       d.  U1R5                  SUR                   S9U2 SUR                   35        S S S 5        M     U(       d^  [8        Rz                  " U5      u  n3n4U4(       d  U3(       d  [        SU4 35        [        SS05      S4$ U3R|                  n[        SU 35        [        SU 35        [8        R~                  " U5      n3U3(       a  [        U3SS 5      [        R|                  :w  a  [        SU 35        [        SS05      S4$ [        S[        U3SS5       35        [        S5        [8        R:                  " [        U3SS 5      U S~5      u  n5n4U4(       a  [        SU4 35        [        SU405      S4$ U(       ak  U He  nU(       d  M  UR                  (       d  M  [        S[        R|                  SUSUR                   S[        USS5       S3[        R                  S9  Mg     [        S5        / n6U3(       a  [        U3SS 5      (       a   [        U3R                  [        5      (       a  U3R                  O/ n7[        U7S S9SS  n8U8 V9s/ s H'  n9[        U9SS 5      (       a  SGOS[        U9SS5      S.PM)     n6n9[        S[        U65       S35        [        S[(        R                  " U6SS95        [        S5        / n:UR                  (       a  UR                   H  n; [        R                  R7                  S[/        UR|                  5      U;R                  5      n%[        SU% 35        [y        U%U;R                  5      n<U:R5                  SU;R                   S9U< SU;R                   35        M     UR                  =(       d    SnU:(       a  USS9R7                  U:5      -   -  nU1(       a  USS9R7                  U15      -   -  nUS-  n[        S5        [        SUR                   35        UR                  (       Ga^  SUR                  R                  5       ;   Ga?  S)SKNJOn=  S9R7                  U6 V9s/ s H  n9U9S   R                  5        SU9S'    3PM      sn95      n>U>(       a  U> SU  3OU n?[        SUS SR  S35        [        SU? 35        U=R                  U?U[?        UR@                  =(       d    SH5      [E        URF                  =(       d    SJ5      [?        URB                  =(       d    SI5      UR                  S9n@[        U@[        5      (       a  SVW@;   a  W@SV   OW@n.[8        R:                  " U3R|                  U.S 5        [        U.U3R|                  S:.5      $ UR                  =(       d    SSUS./U6QSGU S.PS [?        UR@                  =(       d    SH5      [?        URB                  =(       d    SI5      [E        URF                  =(       d    SJ5      S$.n
[        S[(        R                  " U
SS95        [$        RH                  " 5       n[K        SKSL/ SMQSN9n[M        USO9nURO                  SPU5        URO                  SQU5        SnASnBUAUB/nC[        UC5       GH0  u  nDn	 [        SUDSL-    SU	 35        [        R                  R                  SUDSL-    SU	 35        [        R                  R                  S[(        R                  " U
SS9 35        S U
S'   UDS):X  a  SEOSnEWDS):X  a  SOSnFUR'                  U	U
WEUF4S&9n[        SURP                   35        [        R                  R                  SURP                   35        [        S[        UR                  5       35        [        R                  R                  S[        UR                  5       35        URP                  SR:w  av  SWDSL-    SUR                   3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a  [        S5        GM  [        SS05      S4s  $  UR)                  5       nSU;  d	  S'US   ;  a_  SWDSL-    S3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a  GM3  [        SS05      S4s  $ US   S'   n.U.(       d_  SWDSL-    S3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a  GM  [        SS05      S4s  $ [        SWDSL-    35        [        S5        [8        R:                  " U3R|                  U.S 5      u  nHn4U4(       a  [        SU4 35        [        SU405      S4s  $ [        U.U3R|                  S:.5      s  $    g s  snf ! [,         a$  n[        S*[/        U5       35        0 n S nAGNwS nAff = f! [,         a  nUST[/        U5       SU3-  n S nAGNS nAff = f! [$        RR                   Ga  n[U        USV5      (       Ga  URV                  Gb  URV                  RP                  S:X  Ga   URY                  US.S/9nOW! [,         aJ  nSW[/        U5       3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nAs S nA$ S nAff = fU(       a7  UR[                  US.S/9n U (       a  SXU SY3S9R7                  U 5      -   nOSAU SB3nO UR]                  US.S/9u  n!n"OW! [,         aJ  nSZ[/        U5       3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nAs S nA$ S nAff = fU!(       aG  UR[                  U!S.S/9n S[U! S\3S9R7                  U 5      -   nU"(       a  US]S^R7                  U"5       3-  nOS_U S`3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nA$ Sa[/        U5       3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nA$ S nAf[,         aE  nSb[/        U5       3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nA$ S nAff = f! [,         aE  nSd[/        U5       3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nA$ S nAff = f! [,         a  nUST[/        U5       SU3-  n S nAGN"S nAff = f! [,         aE  nSZ[/        U5       3nU(       a  [8        R:                  " UUS 5        [        UUS:.5      s S nA$ S nAff = fs  snf ! [,         a  nUSr[/        U5       SU3-  n S nAGNpS nAff = f! , (       d  f       GNq= f! , (       d  f       GN{= f! , (       d  f       GMF  = f! [,         a$  n[        S[/        U5       35        / n8 S nAGNS nAff = fs  sn9f ! [,         a0  n[        SU;R                   S[/        U5       35         S nAGM0  S nAff = fs  sn9f ! [(        R                   ax  nSWDSL-    S[/        U5       3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a   S nAGM1  [        SS05      S4s S nAs  $ S nAff = f! [$        R                   a  nSWDSL-    S[/        U5       3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a  [        SWDSL-    S35         S nAGM  [        SS05      S4s S nAs  $ S nAf[$        R                   a  nSWDSL-    S[/        U5       3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a  [        SWDSL-    S35         S nAG	Mn  [        SS05      S4s S nAs  $ S nAf[$        R                   a  nSWDSL-    S[/        U5       3nG[        SUG 35        [        R                  R                  SUG 35        UD[        WC5      SL-
  :  a  [        SWDSL-    S35         S nAG
M
  [        SS05      S4s S nAs  $ S nAff = f! [,         a  n[        S[/        U5       35        [        R                  R                  S[/        U5       35        [        R                  (       d  [        R                  S   (       a  [        SS05      S4s S nA$ S)SKaJbnIJcnJ  UI" UJ" S5      5      s S nA$ S nAff = f)Nz.[DEBUG] Iniciando processamento de mensagem...message fileschat_idagent_idz![DEBUG] Dados recebidos: message=z
, chat_id=z, agent_id=z[DEBUG] Arquivos recebidos: r7   u#   Mensagem ou arquivo é obrigatório  u   ID do agente é obrigatórioz [DEBUG] Buscando agente com ID: u    [ERROR] Agente não encontrado: u   Agente não encontrado  z[DEBUG] Agente encontrado: nomezN/Aaccess_tokenmodel_identifierllamaz\bsharepoint\buh  
Você é um assistente que interpreta comandos de SharePoint. Dada a mensagem do usuário, responda apenas em JSON, indicando a intenção e o nome da pasta (se houver):
Exemplos:
Usuário: "quais pastas tem no sharepoint?"
Resposta: {"intent": "listar_pastas", "pasta": null}
Usuário: "me mostre a pasta Sao Paulo"
Resposta: {"intent": "buscar_pasta", "pasta": "Sao Paulo"}
Usuário: "ela não está na raiz"
Resposta: {"intent": "buscar_em_subpastas", "pasta": "Sao Paulo"}
Usuário: "quero ver o arquivo relatório.pdf"
Resposta: {"intent": "buscar_arquivo", "arquivo": "relatório.pdf"}
Mensagem do usuário: "u-   "
Responda apenas o JSON, sem explicações.
z(http://dns.auditto.com.br:11434/api/chatzllama3:latestsystem)rolecontentFg        g      ?   )modelmessagesstreamtemperaturetop_pnum_predict)r+      )jsonr,   r[   z{}r   u/   [ERROR] Erro ao interpretar intenção com IA: intentlistar_pastas)rV   Arquivos)
drive_namez)[DEBUG] JSON bruto da raiz do SharePoint:valueuF   A raiz da biblioteca está vazia. Nenhuma pasta ou arquivo encontrado.folderu   📁u   📄 nameu*   Itens disponíveis na raiz do SharePoint:

)rG   rQ   buscar_pastapastalast_sharepoint_folderrc   u   Conteúdo real da pasta z do SharePoint:
zA pasta u    está vazia.uK   Você é um assistente. O usuário pediu para listar o conteúdo da pasta 'z%' do SharePoint.

Itens encontrados:

   u,   

Responda de forma útil sobre esses itens.userffffff?g?        )r.   i  r0     )totalbackoff_factorstatus_forcelist)max_retrieszhttp://zhttps://r2   u$   

Resposta da IA sobre o conteúdo:
u,   
[Erro ao consultar a IA sobre o conteúdo: ]rG   zErro ao buscar a pasta: u   Conteúdo da pasta u    do SharePoint (em árvore):
z#Erro ao buscar pastas semelhantes: uD   Pasta não encontrada exatamente, mas encontrei uma pasta parecida: u   

Conteúdo:
u    
Sugestões de nomes parecidos: , z	A pasta "u   " não foi encontrada no SharePoint. Pastas disponíveis na raiz podem ser muitas ou a busca foi interrompida por limite de pastas visitadas. Tente um nome mais específico ou navegue por níveis.z)Erro inesperado ao acessar o SharePoint: z!Erro inesperado ao buscar pasta: buscar_em_subpastaszErro ao buscar subpastas: u   " não foi encontrada em subpastas. A busca pode ter sido interrompida por limite de pastas visitadas. Tente um nome mais específico ou navegue por níveis.buscar_arquivoarquivo/z	Arquivo "z" encontrado na pasta u   .

Conteúdo do arquivo:
uB   Você é um assistente. O usuário pediu para analisar o arquivo 'z' da pasta 'u(   ' do SharePoint.

Conteúdo do arquivo:
i  u/   

Responda de forma útil sobre esse conteúdo.z"

Resposta da IA sobre o arquivo:
z*
[Erro ao consultar a IA sobre o arquivo: u   " não encontrado na pasta .z7Por favor, acesse uma pasta antes de buscar um arquivo.z
gemma3:27bz.png)deletesuffixrbzutf-8)rZ   r[   images)rq   <   z[imagem enviada]Tz/imgzgerar imagem:image)r]   promptformatr_   r`   ra   rb   z,http://dns.auditto.com.br:11434/api/generatez[imagem gerada])image_base64rQ   zFalha ao gerar imagemr.   )r   z[ERROu   
### Conteúdo do anexo: z
### Fim do anexo: z[ERROR] Erro ao criar chat: zErro ao criar chatz[DEBUG] Novo chat criado: z![DEBUG] Buscando chat existente: user_idu/   [ERROR] Chat não encontrado ou acesso negado: %   Chat não encontrado ou acesso negadoz[DEBUG] Chat ID: idu%   [DEBUG] Salvando mensagem do usuáriou-   [ERROR] Erro ao salvar mensagem do usuário: Upload de arquivoArquivo de ChatArquivo enviado:  (content_length bytes)actionr   object_type	object_iddetails
ip_addressu#   [DEBUG] Buscando histórico do chatr^   c                 h    [        U SS 5      =(       d    [        S5      R                  R                  $ )N
created_atr   )getattr
__import__r   minms    rJ   <lambda>chat.<locals>.<lambda>  s&    '!\4"@"gJzDZDcDcDgDg"g    keyiz%[WARNING] Erro ao ordenar mensagens: is_user	assistantu   [DEBUG] Histórico carregado: z
 mensagensu   [DEBUG] Histórico:   )indentz#[DEBUG] Buscando arquivos de treinouploads/agentesz![DEBUG] Lendo arquivo de treino: z
### Arquivo de Treino: z
### Fim do Arquivo de Treino: z([WARNING] Erro ao ler arquivo de treino : u)   Você é um assistente útil e amigável.z

u   
IMPORTANTE:
- Mantenha o contexto da conversa e responda de forma coerente com as mensagens anteriores.
- Seja específico e detalhado em suas respostas.
- Mantenha um tom profissional e amigável.
z[DEBUG] System prompt preparadoz [DEBUG] agent.model_identifier: gemini)gemini_servicerZ   z

USER: z[DEBUG GEMINI] system_prompt: ...z[DEBUG GEMINI] full_message: )rN   system_promptr`   
max_tokensra   r]   z[DEBUG] Payload para Ollama:z#http://192.168.8.250:11434/api/chatz[DEBUG] Tentativa u'   : Enviando requisição para Ollama em u%   : Enviando requisição para Ollama: z[DEBUG] Payload: r_      -   r   z%[DEBUG] Resposta do Ollama - Status: z&[DEBUG] Resposta do Ollama - Headers: z&Erro na resposta do Ollama (tentativa z): z[ERROR] u+   [INFO] Tentando próximo servidor Ollama...z1Erro ao processar mensagem em todos os servidoresu3   Formato de resposta inválido do Ollama (tentativa )u$   Resposta inválida do servidor da IAz,Resposta vazia do servidor da IA (tentativa z Resposta vazia do servidor da IAz0[DEBUG] Resposta obtida com sucesso do servidor z [DEBUG] Salvando resposta do botz([ERROR] Erro ao salvar resposta do bot: z-Erro ao decodificar resposta JSON (tentativa z&Erro ao processar resposta do servidoru/   Timeout na requisição para Ollama (tentativa z[INFO] Timeout no servidor u   , tentando próximo servidor...z1Timeout ao conectar com todos os servidores da IArw   u'   Erro de conexão com Ollama (tentativa u$   [INFO] Erro de conexão no servidor u.   Erro de conexão com todos os servidores da IAr0   u,   Erro na requisição para Ollama (tentativa u(   [INFO] Erro de requisição no servidor z.Erro ao conectar com todos os servidores da IAu   [ERROR] Erro não tratado: zapplication/jsonzErro interno do servidor)r   r   z
auth.login)dprintr   formr?   striprP   getlistfilenamer   r   queryr   r    rW   lowerresearch
IGNORECASEr>   postrd   loadsr9   r;   r   
list_filesappendjoinr   add_messagechrfloatr`   ra   intr   Sessionr   r	   mountrH   	HTTPErrorhasattrrG   find_folder_recursive	list_treefind_folder_fuzzyget_file_contentbase64tempfileNamedTemporaryFilesaverl   openread	b64encodedecode
startswithreplacer   r   create_chatr   get_chatr   r   remote_addr
isinstancer^   listsortedlendumpstreinosr<   pathr   r   src.services.gemini_servicer   uppergenerate_responsedict	enumerater!   r:   infodebugheadersr   r7   JSONDecodeErrorTimeoutConnectionErrorrA   is_jsonaccept_mimetypesflaskr   r   )KrN   rP   rQ   rR   fagentrV   is_llamaintent_promptr)   payloadrG   response_dataintent_json_jsonre   rI   	sp_clientraizitensrespostanomesitemtiporo   arquivosr   http_sessionretry_strategyadapteria_respostacaminho_real
tree_lines
fuzzy_pathfuzzy_sugestoesr   nomes_arquivos	file_pathconteudois_gemmar   r   img_filetmp	img_bytesimg_b64response_textr   	image_b64anexos_textotextor#   r7   user_messagechat_historymessages_iterrecent_messagesmsgtraining_files_contenttreinor[   r   history_contextfull_messagegemini_resultprimary_ollama_urlbackup_ollama_urlollama_urlsitimeout_connecttimeout_read	error_msgbot_messager   r   sK                                                                              rJ   r#   r#   M   s   J	3>?,,""9b1779%%g.,,""9-<<##J/1'*WI[YaXbcd,%-H%Qjj%-H,IJKuG%JKLcQQG%CDEsJJ0
;<  *4XJ?@G%=>?DD+GE65,I+JKL{{>2E#5t<jELbLbLhLhLjAj  _pwx}  @F  HJ  qK  qQ  qQ  qS  W^  q^H3Dgr}})])]!  y !M DJ(%-@  ""	G#==7S (+//	2>BB9dS$[1 zz(#6,,G	 ++z+BA4H"-gHE %)-(););vvQtF|n%=> !& "MPTPYPYZ_P``H++GXuEHIJJH%7FJJw<O<Ow4901,,G	OO(33Ej3QH$LL"5EE %cr
)-(););vvQtF|n%=> !+ %=eWDU#VY]YbYbchYi#i%-eWM#B&qrwqx  ya  be  fh  bi  bn  bn  ot  bu  av  vd  %eM!0%--H%+@% #(',U->->-E#'F!&u{{'9c!:'*5+;+;+Ct'D
G $,#3#3#5L%*1Wk%lN)nEG &&y': &&z7;!KJ^#/#4#4ZW^#4#_#//36,4MMOM*7*;*;Ir*J*N*NyZ\*]K$*QR]Q^(__H\ ++GXuEHIJJH%)>>6::gCVCVw,,G	O#,#B#B5U_#B#`L  (33LZ3XH$LL"5EE %cr
)-(););vvQtF|n%=> !+ %=l^K\#]`d`i`ijo`p#p%-l^=#I&qr~q  @h  il  mo  ip  iu  iu  v{  i|  h}  }k  %lM!0%--H%+@% #(',U->->-E#'F!&u{{'9c!:'*5+;+;+Ct'D
G $,#3#3#5L%*1Wk%lN)nEG &&y': &&z7;!KJ^#/#4#4ZW^#4#_#//36,4MMOM*7*;*;Ir*J*N*NyZ\*]K$*QR]Q^(__HS6?6Q6QRWdn6Q6o3
O "%.%8%8PZ%8%[
%ijtiu  vF  $G  JN  JS  JS  T^  J_  $_*$*KDIIVeLfKg(hhH%.ug  6S  $T++GXuEHIJJH%)99fjj>S>S +$<=,,G	(33Ej3QH?G||GUW?X%Y?Xtd6l?XN%Y.0',gQwi$8	#,#=#=iT^#=#_%.wi7MeWTpqyz{  rA  qB  $C"'33GXuM*lmtlu  vB  CH  BI  It  u}  ~C  C  uD  tE  Ev  )w%4)1m L)/G D) ',+01B1B1Ic+J%*5;;+=#%>+.u/?/?/G4+H
# (0'7'7'9).Qq[o)p"-."I$**9g>$**:w?%O
`'3'8'8[b'8'cH'33s:08.;.?.?	2.N.R.RS\^`.a (.ST_S`,a a &/wi7RSXRYYZ#[XH++GXuEHIJJE#5t<oQVQgQgQmQmQoAoqeAh&7&7&7 800f0MQTMM#((+chh-$%FFH	"("2"29"="D"DW"M . N *!'GyQ! $#():):)Ac#B"5;;#5#6#&u'7'7'?4#@	 H
#==8T ( - 1 1)R @ D DYPR S++G5GN++G]EJMgNOO}}))&11W]]_5O5OP_5`5` 4<<_bQWWY)$%##():):)Ac#B"5;;#5#6#&u'7'7'?4#@ L
#==8T ()--gt<	#//9JER"I'#RSS"G-D#EFKKAqQZZZL$<$<000>#FF388$1#((AJJGEU%5%5g%>%>$++.HTVW\V]]qrsr|r|q},~	 ?>  %11(;KD%D4UG<=)=>?DDggG.wi891';<##G,wtY5HCG9MNG%LMNPSSS!'$e"<!=>?56)55gdD$6OQXZ^_eA%IJGU+,c111*2 ,$5")"3AJJ<r'!M]_dBeAffm n#*#6#6  	34GD*d33%1;DMM41P1PVX"(!g# $# +
 +C '.c9e&D&DF+&sIr: +   23|3D2EZPQ'L)KL34!#==--a "->EHHv~~ ^I=i[IJ3Iv~~NG*114MfnnM]]_`g_h  iI  JP  JX  JX  IY  3Z  [ ( ++Z/Z!Vdii0F&GGGMVdii&===M  	 	/001G1G0HIJ!!!h%2H2H2N2N2P&PB"ii_k(l_kX[CK,=,=,?+@3y>BR)S_k(lmOFUo.j	B[bL2=#3F2GsKL1,@A*<<$+!%"3"3":s;u//748EKK.3/,, = M :DMSW9X9X]gkx]xM*5  LM##DGG]EB$''JKK++>!m<  G4
  !2!2!9c:5;;-#.u//748
 	,djj.KL'')1

 .99g.:w/BF)+<=&{3MAzme*1Q3%/VWaVbcd""''*<QqSEAfgqfr(st""((+<TZZXY=Z<[)\]$)!()Q"B%&!Vr',, ,l; -  =h>R>R=STU""''*OPXPdPdOe(fg>tHDTDT?U>VWX""((+QRVW_WgWgRhQi)jk''3."H1SQYQ^Q^P_ `IHYK01&&,,x	{-CD3{+a// KM &1d'efhkkk,a$,MMOM 5-XaJb9b&YZ[\]Z]Y^^_$`	45#**008I;1GHs;/!33$#*G5[+\#]_b#bb$1)$<Y$GM(&RSTUVSVRWWX$Y	45#**008I;1GHs;/!33$#*G5W+X#Y[^#^^LQqSERS<=)4)@)@-Y^)_&K HPQ&'78#=="$1#'77$  A 4Y .I`  GAxPQt % ^ &STWXYTZS[[\$]]^)) %Sq*--!**2HQZZMcMcgjMjW+4+J+J5]g+J+hL( W)A#a&'JH& + 7 75 Q#*W+U#VVV	W
 ()2)<)<\V`)<)aJ)-@Nl+mptpypy  {E  qF  ,F-5l^=+Q[>G>Y>YZ_lv>Y>w ;
O#, [-PQTUVQWPX+Y#*$/$;$;GXu$U'.HQX/Y'Z Z Z	[
  *-6-@-@Xb-@-c
-qr|q}  ~N  ,O  RV  R[  R[  \f  Rg  ,g#2$,2STXT]T]^mTnSo0p$pH-6ug  >B  ,C"'33GXuM&H'QRR%NsSTvh#W"'33GXuM&H'QRR  O!B3q6(KH#//5I"W#MNN	O ! O!;CF8DH#//5I"W#MNN	OP % ^ &STWXYTZS[[\$]]^
 % S%HQ#Q"'33GXuM&H'QRR	S* &Z>  ) `$*UVYZ[V\U]]^(__H`" .- NMb ?>b  %=c!fXFG"$%& ! aDV^^DTTVWZ[\W]V^_``a, )mh ++ a"OPQRSPSuTWX[\]X^W_ `IHYK01&&,,x	{-CD3{+a// &1Y'Z[]```a ## 	hMaPQcURUVYZ[V\U]^	,-""((8I;)?@s;'!++7!u<[\]"G-`#abdggg++ 	eEacU#cRSfXV	,-""((8I;)?@s;'!++@1Edef"G-]#^_addd,, 	eJ1Q3%sSVWXSYRZ[	,-""((8I;)?@s;'!++DQqSEIhij"G-]#^_addd	e  3+CF845  #>s1vh!GH??g667IJG%?@A3FF/GL1223s  B4A{ 6A_
%A{ 1A{ AA{ CA{ /AA_ CA{ AA{ $E A`4 AA`
 ,A{ ;A{ Aj2 E(A{ AAl A{ Al. 0B A{ 1A=A{ .An =DA{ AAn *9A{ $A>A{ "2Ao1An/AoC8A{ EA{ 
A{ A{ )A{ <A{ A{ +BAo2AA{ 	B A{ 
A-A{ 8A{ A{  A0A{ A;Ao& BA{ B.ApB>A&A{ D%BApF5CA{ I8%AqJDA{ N"DA{ R&F)As-YA{ YAs-Y A{ Y$A*Aq[A{ [Aq[A{ ["AAq\<A{ \?Aq]A{ ]A$Aq^4A{ ^7Aq_A{ _A{ _A{ _
A`_#A`_<A{ `A``A{ `

A`1`A`,`&A`4 `*A{ `,A`1`1A`4 `4Aj/a	;AibAbbAib
Ac*b :Ac%cAc*cAicAj/c A{ c%Ac*c*AAid,Ae d?Aie 
Afe
:AffAffAif	Aj/f
A{ fAffBAihAj/hA{ h:AiiAj/iA{ iAj/i*:Aj*j$Aj/j%A{ j*Aj/j/A{ j2
Alj<:Ak<k6Alk7A{ k<AllA{ l
Al+lAl&l A{ l&Al+l+A{ l.
Am=l8:Am8m2Am=m3A{ m8Am=m=A{ n
An,nAn'n!A{ n'An,n,A{ n/
An>	n9Aoo
AooA{ o
Ao#	o	A{ o&
Apo0App	A{ pAppA{ p
Aqp&$Aqq
A{ qAqqA{ qAs*q2AAs%sAs-sA{ sAs%sAs*sAs-s"A{ s%As*s*As-s-A{tA(Avu)A{ u0Avu>A{u?A{ vA{vA(Ax"xA{ xAx"xA{xA{ x"A{x9A(Az>z!A{ z(Az>z6A{z7A{ z>A{{A{ {
A}3{A=A}.}A}3}A}.}(A}3}.A}3c            
         ^ [        [        S5      (       aP  [        R                  S:X  a<  [        R                  R                  [        R                  5      R                  5       n O9[        R                  R                  [        R                  S9R                  5       n [        R                  R                  S[        S9nS mU(       a  [        [        S5      (       a@  [        R                  S:X  a,  [        R                  R                  US9R                  5       mO:[        R                  R                  U[        R                  S9R                  5       mT(       d  U (       a  U S   m[        R                   " 5       nS nT(       a  U(       a  [#        U4S	 jU 5       5      (       d  [        R$                  " TR                  5      u  p4U(       a  ['        S
U-   S5        [)        STXS S TS9$ U(       a;  UR*                  (       a*  UR*                  R-                  5       R/                  SS5      OSU(       a  UR                  OS 3n[1        [3        SU(       a  UR                  OSUS95      $ [)        STXX3TS9$ )NrZ   
superadminr   rR   typer   r   r   r   c              3   T   >#    U  H  oR                   TR                  :H  v   M     g 7fNrR   r   .0cr   s     rJ   	<genexpr> chat_redirect.<locals>.<genexpr>       &Mu!zzUXX'=u   %(Erro ao criar chat: dangerchat/chat.htmlr   agenteschatsr#   current_chatcurrent_agentrk   -chat-rO   chat.view_chatrQ   title)r   r   rZ   r   r   order_byrU   all	filter_byr   r   argsr?   r   firstr   get_user_chatsanyr   r   r   rE  r   r   r   r   )r=  rR   r>  r#   r7   
title_slugr   s         @rJ   chat_redirectrN    s    |V$$):):l)J,,''488:,,(((AEEG||
5HE<((\->->,-NLL**h*7==?ELL**h*PVVXEW
&&(EDe3&Mu&M#M#M!--ehh7(50(;"#35'eix|  MR  S  S=AdjjTZZ%%'//S9X]im^b^e^esu]vVw
 0T$''qXbcdd+5']a  EJ  K  Kr   z /chat/<int:chat_id>/<path:title>c           
         [        SU  SU 35        [        R                  " U 5      nU(       a  UR                  [        R
                  :w  a   [        SS5        [        [        S5      5      $ UR                  U:w  a$  Xl	        [        R                  R                  5         UR                  n[        [        S5      (       aP  [        R                  S:X  a<  [         R"                  R%                  [         R&                  5      R)                  5       nO9[         R"                  R+                  [        R
                  S9R)                  5       n[        R,                  " 5       n[/        S	X4X%X#S
9$ )Nz[DEBUG] Acessando /chat/r   &   Chat não encontrado ou acesso negado.r:  chat.conversation_history_pagerZ   r)  r*  r;  )r   r=  r#   r>  r?  r@  )r   r   r   r   r   r   r   r   r   rE  r   r    commitr   r   rZ   r   r   rF  rU   rG  rH  rK  r   )rQ   rE  r#   r   r=  r>  s         rJ   	view_chatrS    s	    
$WIQug
67(D4<<<??26A @ABBzzU



JJE|V$$):):l)J,,''488:,,(((AEEG&&(E+5PTpt  K  Kr   z/chat/<int:chat_id>c                 ^   [         R                  " U 5      nU(       a  UR                  [        R                  :w  a   [        SS5        [        [        S5      5      $ UR                  (       a*  UR                  R                  5       R                  SS5      OSU  3n[        [        SXS95      $ )	NrP  r:  rQ  rk   rA  rB  rC  rD  )r   r   r   r   r   r   r   r   rE  r   r   )rQ   r#   rM  s      rJ   view_chat_legacyrU    s     (D4<<<??26A @ABB9=!!#++C55QXPYIZJG,gPQQr   z!/chat/instructions/<int:agent_id>c                     [         R                  R                  U [        R                  S9R                  5       nU(       d   [        SS5        [        [        S5      5      $ [        SUS9$ )Nr.  (   Agente não encontrado ou acesso negado.r:  zchat.chat_redirectzchat/instructions.html)r   )
r   r   rH  r   r   rJ  r   r   r   r   )rR   r   s     rJ   instructionsrX    sW     LL""h"HNNPE8(C 456635AAr   z&/chat/instructions/<int:agent_id>/savec                     [         R                  R                  U [        R                  S9R                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nUR                  SS5      Ul
        UR                  SS5      Ul        [        UR                  S	S
5      5      Ul        [        UR                  SS5      5      Ul        [         R"                  R%                  5         [        SS05      $ ! [&         aA  n[         R"                  R)                  5         [        S[+        U5      S.5      S4s S nA$ S nAff = f)Nr.  FrW  successr7   rT   r   rO   example_promptr`   rs   r   rt   r[  Tr.   )r   r   rH  r   r   rJ  r   r   get_jsonr?   r   r\  r   r`   r   r   r   r    rR  r9   rollbackr;   )rR   r   datarI   s       rJ   save_instructionsr`    s   A&&(LOO&LRRTu7abcehhh!"hh;#xx(8"=!$((=#">?txxd;<


	4()) A


53q6:;S@@As%   AD B-D 
E6EEEz/chat/retrainc            
          [         R                  R                  S5      n U (       d  [        SSS.5      S4$ [        R
                  R                  U [        R                  S9R                  5       nU(       d  [        SSS.5      S4$ [         R                  R                  S	5      nU(       d  [        SS
S.5      S4$ U GH!  nU(       d  M  UR                  (       d  M   [        UR                  5      n[        R                  R!                  S[#        UR                  5      5      n[        R$                  " USS9  [        R                  R!                  XT5      nUR'                  U5        [)        UR                  US9n[*        R,                  R/                  U5        [1        S[        R                  SUR                  SUR                   3[         R2                  S9  GM$     [*        R,                  R5                  5         [        SS05      $ ! [6         aA  n[*        R,                  R9                  5         [        S[#        U5      S.5      S4s S nA$ S nAff = f)NrR   Fu   ID do agente não fornecidorZ  rS   r.  u'   Agente não encontrado ou acesso negadorT   r  Nenhum arquivo enviador   Texist_ok)	agente_idr   zUpload de arquivo de treinozArquivo de TreinozArquivo de treino enviado: r   r[  r.   )r   r   r?   r   r   r   rH  r   r   rJ  rP   r   r   r
   r<   r   r   r;   makedirsr   r   r   r    addr   r   rR  r9   r^  )	rR   r   r  r   r   ro   caminhor  rI   s	            rJ   retrain_agentri    s   (A<<##J/u7TUVX[[[&&(LOO&LRRTu7`abdggg==((4u7OPQSVVVGw7+++*7+;+;<%6EHHFED1'',,u7W%%#hh$ 

v&&8(OO 3#hh9':J:J9KL&22  , 	

	4()) A


53q6:;S@@As<   5H AH 	5H ?H H !D0H 
I6IIIz/api/history/conversationsc                      [         R                  R                  S[        S9n [        R
                  " U S9u  pU(       a  [        SU05      S4$ [        U5      $ ! [         aZ  nSSKn[        S[        U5       35        [        S	UR                  5        35        [        S
[        U5      S.5      S4s SnA$ SnAff = f)u`   
Endpoint da API para buscar o histórico de conversas do usuário logado e agente específico.
rR   r+  )rR   r7   r.   r   Nu0   [ERROR] Erro ao buscar histórico de conversas: z[ERROR] Traceback: u&   Erro ao buscar histórico de conversas)r7   r   )r   rI  r?   r   r   get_conversation_historyr   r9   	tracebackr   r;   
format_exc)rR   history_listr7   rI   rl  s        rJ   api_get_conversation_historyro  #  s    
d<<##JS#9)BBHUGU+,c11|$$ d@QIJ#I$8$8$:#;<=!IVYZ[V\]^`ccc	ds%   AA 
A 
B?%AB:4B?:B?z/api/chat/history/<int:chat_id>c                    [        SU  35         [        R                  " U 5      nU(       d9  [        S[        R
                  SU S[        R                  S9  [        SS05      S4$ [        R                  R                  S	[        S
9nU(       aY  UR                  U:w  aI  [        S[        R
                  SU SU SUR                   3[        R                  S9  [        SS05      S4$ [        UR                  S S9 Vs/ s HH  nUR                  UR                   UR"                  (       a  UR"                  R%                  5       OS S.PMJ     nn[        S['        U5       SU  35        [)        U5       H:  u  pSUS   (       a  SOSn[        SUS-    SU S[+        US   S S 5       S35        M<     [        U5      $ s  snf ! [,         a?  n[        SU  S[/        U5       35        [        SS[/        U5       305      S 4s S nA$ S nAff = f)!Nz$[DEBUG] Acessando /api/chat/history/u   Acesso não autorizador   u8   Tentativa de acesso ao histórico de chat sem permissãor   r7   zAcesso negado.i  rR   r+  zAcesso negado por agent_idz7Tentativa de acesso ao chat de outro agente. Esperado: z, encontrado: u!   Chat não pertence a este agente.c                     U R                   $ r0  )r   r   s    rJ   r   )api_get_chat_history_v2.<locals>.<lambda>V  s    r   r   )rN   r   r   z[DEBUG] Retornando z mensagens para o chat r   USERAGENTz[DEBUG] Mensagem rv   r   z - rN   d   r   u)   [ERROR] Erro ao obter histórico do chat u   Erro ao carregar histórico: r.   )r   r   r   r   r   r   r   r   r   rI  r?   r   rR   r   r^   rN   r   r   rC   r   r   reprr9   r;   )rQ   r#   rR   r  r^   r#  	user_typerI   s           rJ   api_get_chat_history_v2rx  5  s    
0	
:;&Q##G,"/$"!R".. G%567<<<<##JS#91"3$"!QRZQ[[ijnjwjwixy".. G%HIJCOO DMM/EF	H Gc {{{{8;#..224D
 G	 	 H 	#CM?2I'ST)FA"%i.gI%acU"YKs4ItPS@T;U:VVYZ[ * x  H  Q9'"SVHMN#@Q!IJKSPPQs?   AG &BG (G ?AF>A/G >G 
H4HHHz/chat/delete/<int:chat_id>DELETEc           	      t    [         R                  R                  U [        R                  S9R                  5       nU(       d  [        SS05      S4$ [        R                  R                  U S9R                  5         [         R                  R                  U S9R                  5         [        S[        R                  SU S	[        R                  S
9  [        SS05      $ ! [         aN  n[        R                  R                  5         [!        S[#        U5       35        [        SS05      S4s SnA$ SnAff = f)z:
Endpoint para excluir um chat e todas as suas mensagens.
r.  r7   r   rT   rQ   r-  u   Exclusão de chatr   u   Chat e mensagens excluídosr   rN   u   Chat excluído com sucessozErro ao excluir chat: zErro ao excluir chatr.   N)r   r   rH  r   r   rJ  r   r   r   r   r   r   r9   r   r    r^  r   r;   )rQ   r#   rI   s      rJ   delete_chatr|  a  s   ?zz##w#HNNPG%LMNPSSS0779

(//1& OO1**	
 	#?@AA ?


&s1vh/0!7893>>?s&   AC BC 
D7)AD2,D72D7z/historyc                      [        S5      $ )u}   
Renderiza a página de histórico de conversas.
O JavaScript nesta página fará a chamada para /api/history/conversations.
zhistory.html)r    r   rJ   conversation_history_pager  |  s     >**r   z/chatlogc                  @    [         R                  " 5       n [        SU S9$ )Nzchat/chatlog.htmlr>  )r   rK  r   r  s    rJ   chat_logr    s      &&(E.e<<r   c                     SU ;   =(       a7    U R                  SS5      S   R                  5       [        R                  S   ;   $ )Nr   rv   ALLOWED_EXTENSIONS)rsplitr   r!   config)r   s    rJ   r   r     sB    (? Z??3"1%++-1C1CDX1YYZr   z/api/chat/uploadc                      S[         R                  ;  a/  [        R                  R	                  S5        [        SSS.5      S4$ [         R                  S   n U R                  (       d/  [        R                  R	                  S5        [        SSS.5      S4$ [        U R                  5      (       d_  [        R                  R	                  SU R                   35        [        SS	S
R                  [        R                  S   5       3S.5      S4$ [         R                  [        R                  S   :  aY  [        R                  R	                  S[         R                   S35        [        SS[        R                  S   S-   S3S.5      S4$ [        R                  R                  [        R                  S   S5      n [        R                  " USS9  [!        U R                  5      n[        R                  R                  X5      n U R#                  U5        SSKJn  U" XC5      n[         R(                  R+                  S5      nUb  US:X  a/  [        R                  R	                  S5        [        SS S.5      S4$ [-        [/        U5      UUU R0                  [        R                  R3                  U5      S!9n[4        R6                  R9                  U5        [4        R6                  R;                  5         [=        S"[>        R@                  S#US$U S%[        R                  R3                  U5       S&3[         RB                  S'9  [        R                  RE                  S(U 35        [        SUUUS).5      $ ! [         aE  n[        R                  R	                  S[        U5       35        [        SSS.5      S4s S nA$ S nAff = f! [         aE  n[        R                  R	                  S[        U5       35        [        SSS.5      S4s S nA$ S nAff = f! [         aQ  n[        R                  R	                  S*[        U5       35        [        SS+[        U5       3S.5      S4s S nA$ S nAff = f),Nfileu&   Nenhum arquivo enviado na requisiçãoFrb  rZ  rS   u   Nome do arquivo não fornecidou    Tipo de arquivo não permitido: u2   Tipo de arquivo não permitido. Tipos permitidos: r}   r  MAX_CONTENT_LENGTHzArquivo muito grande: z bytesu1   Arquivo muito grande. Tamanho máximo permitido: i   MBUPLOAD_FOLDERr#   Trc  u%   Erro ao criar diretório de uploads: u#   Erro ao criar diretório de uploadsr.   zErro ao salvar arquivo: zErro ao salvar arquivor   )r   rQ   rO   u-   chat_id não fornecido para upload de arquivo   chat_id não fornecidorQ   r   r  	file_type	file_sizer   r   r   r   r   r   zArquivo enviado com sucesso: )r[  r   r  extracted_textz&Erro inesperado no upload de arquivo: zErro ao processar arquivo: )#r   rP   r!   r:   r7   r   r   r   r   r  r   r<   r   rf  r9   r;   r
   r   	src.utilsr   r   r?   r   r   content_typegetsizer   r    rg  rR  r   r   r   r   r   )	r  
upload_dirrI   r   r  r   r  chat_id_value	chat_files	            rJ   upload_chat_filer    s   Ha&$$%MNu7OPQSVVV}}V$}}$$%EFu7WXY[^^^DMM**$$'G%WX MdiiXcXjXjk  YA  OB  NC  D   
 !!K$6$67K$LL$$'=g>T>T=UU[%\] L[M_M_`tMu  zC  ND  ME  EG  H   
 WW\\+"4"4_"EvN
	dKK
T2
 #4==1GGLL6		WIIi  	4.yC((3 MR$7$$%TUu7OPQSVVV&''ggooi0
	 	

y!


& OO)#'zBGGOOI4N3OwW**	
 	"?z JK ",	
  	I  	d$$'LSQRVH%UVu7\]^`ccc	d  	W$$'?Ax%HIu7OPQSVVV	WF  a  #I#a&!RS55PQTUVQWPX3YZ[]```as   AP AP A8P A=P 1P M; 4P O A$P C9P ;
O
:O?O
 P O

P 
P:PPP PP 
Q:)AQ5/Q:5Q:z/api/chat/audioc                      S[         R                  ;  a  [        SSS.5      S4$ [         R                  S   n [         R                  R	                  S5      nU(       d  [        SSS.5      S4$ [
        R                  R	                  U5      nU(       a  UR                  [        R                  :w  a  [        SSS.5      S	4$ [        R                  R                  [        R                  S
   [        U5      S5      n[        R                   " USS9  S[#        [$        R$                  " 5       5       S3n[        R                  R                  X45      nU R'                  U5        SnUb  US:X  a/  [        R(                  R+                  S5        [        SSS.5      S4$ [-        [#        U5      UUS[        R                  R/                  U5      S9n[0        R2                  R5                  U5        [0        R2                  R7                  5         [9        S[        R                  SUSU S[        R                  R/                  U5       S3[         R:                  S9  [        SUS.5      $ ! [<         ac  n[0        R2                  R?                  5         [        R(                  R+                  S[        U5       35        [        SSS.5      S4s SnA$ SnAff = f) u)   API endpoint para processamento de áudioaudioFu    Nenhum arquivo de áudio enviadorZ  rS   rQ   u   ID do chat não fornecidor   rT   r  Trc  audio_z.wavu   Transcrição do áudioNrO   u,   chat_id não fornecido para upload de áudior  z	audio/wavr  u   Upload de áudiou   Áudiou   Áudio enviado: r   r   r   )r[  transcriptionu!   Erro no processamento de áudio: u   Erro ao processar áudior.   ) r   rP   r   r   r?   r   r   r   r   r   r<   r   r   r!   r  r;   rf  r   timer   r:   r7   r   r  r   r    rg  rR  r   r   r9   r^  )	
audio_filerQ   r#   	audio_dirr   r  r  audio_recordrI   s	            rJ   api_process_audior    sL   4U'--'u7YZ[]```]]7+
,,""9-u7RSTVYYYzz~~g&t|||6u7^_`beeeGGLL!3!3O!Dc'lT[\	
I-C		,-T2GGLL5		"1?gm$$%STu7OPQSVVVL!ggooi0
 	

|$


% OO &xj277??93M2NgV**	
 *
  	
  U


  #DSVH!MN53MNOQTTTUs9   #I+ AI+ /AI+ CI+ CI+ +
K5AKKKz/public-chat/<public_token>c                    SSK JnJn  SSKJn  SS KnUR                  R                  U S9R                  5       nU(       d  [        SSS9S4$ U" S	S S
UR                  SU  S[        R                   SUR
                  R                  5       R                  5        S3[        R                  S9  UR                  (       at  UR                  R                  UR                  S   R                  S9R!                  UR"                  R%                  5       5      R'                  S5      R)                  5       O/ n[        SXVS S9$ )Nr   )r   r   r   public_tokenzchat/public_chat.html   Agente não encontrado.)r7   rT   u   Acesso público via tokenr   zToken utilizado: z | IP: u    | Horário: rk   r   r{     )agenter^   r7   )
src.modelsr   r   src.discord.discord_webhookr   r   r   rH  rJ  r   r   r   r   utcnowrC   r>  rF  r   asclimitrG  )r  r   r   r   r   r  r^   s          rJ   public_chat_iframer    s-   *B\\###>DDFF6>WXZ]]]*))#L>9L9L8M][c[l[l[s[s[u[[  \B  [C  CD  E&& z@  zF  zFw}}&&v||A/A/A&BKKGL^L^LbLbLdekklnossu  LNH26\`aar   z /public-chat/<public_token>/sendc                 z   SSK JnJnJn  SSKJn  SSKJnJn  SS K	nUR                  R                  U S9R                  5       nU(       d  U" SS05      S4$ UR                  " 5       n	U	R                  S	S
5      R                  5       n
U
(       d  U" SS05      S4$ UR                  R                  UR                   S S9R                  5       nU(       ds  U" UR                   S SUR"                   3UR                  R%                  5       S9nSSKJn  UR*                  R-                  U5        UR*                  R/                  5         SSKJn  U" UR                   SXR                  R%                  5       S9nUR*                  R-                  U5        UR*                  R/                  5         UR0                  " XU5      u  pU(       a  U" SU05      S4$ U" UR                   SXR                  R%                  5       S9nUR*                  R-                  U5        UR*                  R/                  5         U" SU05      $ )Nr   )r   r   r   r   )r   r   r  r7   r  rT   rN   rO   zMensagem vazia.rS   )rR   r   u   Chat Público )rR   r   rE  r   r   T)rQ   r   rN   r   r.   FrG   )r  r   r   r   src.services.chat_servicer   r   r   r   r   r   rH  rJ  r]  r?   r   r   rU   r  src.extensionsr   r    rg  rR  generate_agent_response)r  r   r   r   r   r   r   r   r  r_  r  r#   r   msg_userrG   r7   msg_bots                    rJ   public_chat_sendr  )  s   005&\\###>DDFF!:;<cAAD88Ir*002L!234c99::DAGGIDVYYnV[[M<Zgogxgxgg  hB  C%


t


!twwlWhWhWoWoWqrHJJNN8JJ!99&PTUOH'(#--dgguhSdSdSkSkSmnGJJNN7JJJ)**r   z	/chat-newc            
        ^ [        [        S5      (       aP  [        R                  S:X  a<  [        R                  R                  [        R                  5      R                  5       n O9[        R                  R                  [        R                  S9R                  5       n [        R                  R                  S[        S9nSmU(       a  [        [        S5      (       a@  [        R                  S:X  a,  [        R                  R                  US9R                  5       mO:[        R                  R                  U[        R                  S9R                  5       mT(       d  U (       a  U S	   m[        R                   " 5       nSnT(       aY  U(       a  [#        U4S
 jU 5       5      (       d8  [        R$                  " TR                  5      u  p4U(       a  ['        SU-   S5        [)        STXX3TS9$ )z4Nova interface de chat usando TypeScript do ditto-airZ   r)  r*  rR   r+  Nr-  r.  r   c              3   T   >#    U  H  oR                   TR                  :H  v   M     g 7fr0  r1  r2  s     rJ   r5  chat_new.<locals>.<genexpr>^  r7  r8  r9  r:  zchat/chat_new.htmlr<  )r   r   rZ   r   r   rF  rU   rG  rH  r   r   rI  r?   r   rJ  r   rK  rL  r   r   r   )r=  rR   r>  r#   r7   r   s        @rJ   chat_newr  H  sd    |V$$):):l)J,,''488:,,(((AEEG||
5HE<((\->->,-NLL**h*7==?ELL**h*PVVXEW
&&(EDe3&Mu&M#M#M!--ehh7(50(;/ugae  IN  O  Or   z/ditto-ai/<path:filename>c                     [         R                  R                  [         R                  R                  [        5      SSSS5      n[        X5      $ )u%   Serve arquivos estáticos do ditto-ai..ditto-aidistr<   r   r   dirname__file__r"   )r   ditto_ai_paths     rJ   serve_ditto_air  e  s7     GGLL!:D$
TZ[M}77r   z
/ditto-ai/c                      [         R                  R                  [         R                  R                  [        5      SSSS5      n [        U S5      $ )zServe o index.html do ditto-air  r  r  z
index.htmlr  )r  s    rJ   serve_ditto_ai_indexr  l  s9     GGLL!:D$
TZ[M}l;;r   )Fr<   r   r  rd   r>   dotenvr   
sqlalchemyr   r   r  r   urllib3.util.retryr   requests.adaptersr	   werkzeug.utilsr
   r  r   flask_loginr   r   r  r   r   src.services.sharepoint_clientr   r  r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   __name__chat_bprouterK   r#   rN  rS  rU  rX  r`  ri  ro  rx  r|  r  r  r  r  r  r  r  r  r  r~  r   rJ   <module>r     s   	 	         $ ) * 1 4 9 ; > D D D  D  D
FH
%y5'*1 +1f 	w)K	3  *K	3Z 	wK  K2 	12K  3K& 	$%R  &R 	23B  4B 	7&JA  KA( 	1)A  2)AV 	+eW=d  >d  	05'B(Q  C(QT 	+hZ@?  A?2 	z+  + 	z=  =Z 	!F84Ia  5IaV 	 6(36U  46Up 	,-b .b$ 	1F8D+ E+< 	{O  O6 	*+8  ,8
 	|<  <r   