
    IiC                        d dl Z d dlZd dlZd dlZd dlZd dlmZ  e        d dlmZ d dl	m	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.  e%de/      Z0e0jc                  ddg      d        Z2e0jc                  ddg      ed               Z3e0jc                  d      ed               Z4e0jc                  d      ed               Z5e0jc                  d      ed               Z6e0jc                  d      ed               Z7e0jc                  ddg      ed                Z8e0jc                  d!dg      ed"               Z9e0jc                  d#dg      ed$               Z:e0jc                  d%dg      ed&               Z;e0jc                  d'd(g      ed)               Z<e0jc                  d*      ed+               Z=e0jc                  d,      ed-               Z>d. Ze0jc                  d/dg      ed0               Z?e0jc                  d1dg      ed2               Z@e0jc                  d3      d4        ZAe0jc                  d5dg      d6        ZBe0jc                  d7      ed8               ZCe0jc                  d9      ed:               ZDe0jc                  d;      ed<               ZEy)=    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                     	 	 t         j                  j                  t        d             d} t        j                  d      }t        j                  d      }d}	 t        j                  | dd	
      }|j                  rd}| dk(  rd}d}n|dk(  rd}d}nd}d}t        ||| t!        j"                         j%                         d      |fS # t        $ r7}t
        j                  j                  dt        |              d} Y d}~d}~ww xY w# t        j                  $ rH 	 t        j                  | dd	
      }|j                  rd}n# t        j                  $ r d}Y nw xY wY w xY w# t        $ ro}t
        j                  j                  dt        |              t        dt        |      t!        j"                         j%                         d      dfcY d}~S d}~ww xY w)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	            5/srv/www/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- E*#(EE*E$!E*#E$$E*'E- )E**E- -	G%6A$G G% G%z/chatPOSTc                  :   	 t        d       t        j                  j                  dd      j	                         } t        j
                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        d|  d| d	|        t        d
|D cg c]  }|j                   c}        | s|st        ddi      dfS |st        ddi      dfS t        d|        t        j                  j                  |      }|st        d|        t        ddi      dfS t        dt        |dd              t        j                  d      }t        |dd       xr d|j                  j                         v xs t        |dd      j                         dk(  }|r|rt        j                   d| t        j"                        rd|  d}d}	dd|dgd d!d"d#d$}
	 t%        j&                  |	|
d%&      }|j)                         }|j                  di       j                  d'd(      }d)d l}|j+                  |      }|j                  d+      d,k(  rt1        |-      }|j3                  d./      }t        d0|       |j                  d1g       }|sd2}nKg }|D ]0  }|j                  d3      rd4nd5}|j5                  | d6|d7           2 d8d9j7                  |      z   }|rt9        j:                  ||d        t        ||d:      S |j                  d+      d;k(  r|j                  d<      r|d<   }|t        d=<   t1        |-      }	 |j3                  |d./      }|j                  d1g       }g }|d d> D ]0  }|j                  d3      rd4nd5}|j5                  | d6|d7           2 |rd?| d@d9j7                  |      z   }ndA| dB}dC| dDt=        dE      j7                  |       dF}dd|ddG| dgd t?        |j@                  xs dH      t?        |jB                  xs dI      tE        |jF                  xs dJ      d$}
t%        jH                         }tK        dKdLg dMN      }tM        |O      }|jO                  dP|       |jO                  dQ|       d}		 |j'                  |	|
d%&      }|jP                  dRk(  r:|j)                         }|j                  di       j                  d'd      }|dS| z  }|rt9        j:                  ||d        t        ||d:      S |j                  d+      dck(  rq|j                  d<      r_|d<   }t1        |-      }	 |jY                  |d./      }|r|j3                  |d./      }|j                  d1g       }g }|d d> D ]0  }|j                  d3      rd4nd5}|j5                  | d6|d7           2 |rd?| d@d9j7                  |      z   }ndA| dB}dC| dDt=        dE      j7                  |       dF}dd|ddG| dgd t?        |j@                  xs dH      t?        |jB                  xs dI      tE        |jF                  xs dJ      d$}
t%        jH                         }tK        dKdLg dMN      }tM        |O      }|jO                  dP|       |jO                  dQ|       d}		 |j'                  |	|
d%&      }|jP                  dRk(  r:|j)                         }|j                  di       j                  d'd      }|dS| z  }nd	 |j]                  |d./      \  }!}"|!rE|j[                  |!d./      } d[|! d\d9j7                  |       z   }|"r|d]d^j7                  |"       z  }nd_| de}|rt9        j:                  ||d        t        ||d:      S |j                  d+      dfk(  r|j                  dg      r|dg   }#t        j                  d=      }t1        |-      }|r|j3                  |d./      }|j                  d1g       D cg c]  }|d7   	 }$}|#|$v r[| dh|# }%|j_                  |%d./      }&di|# dj| dk|&d dJ  }|rt9        j:                  ||d        dl|# dm| dn|&d do  dp}dd|ddG| dgd t?        |j@                  xs dH      t?        |jB                  xs dI      tE        |jF                  xs dJ      d$}
t%        jH                         }tK        dKdLg dMN      }tM        |O      }|jO                  dP|       |jO                  dQ|       d}		 |j'                  |	|
d%&      }|jP                  dRk(  r:|j)                         }|j                  di       j                  d'd      }|dq| z  }ndi|# ds| dt}ndu}|rt9        j:                  ||d        t        ||d:      S t        |dd       xr dv|j                  j                         v }'|'rd)d l0}(d)d l1})|r|d)   ry|d)   j                  ri|d)   }*|)je                  d dwx      5 }+|*jg                  |+jh                         tk        |+jh                  dy      5 }|jm                         },|(jo                  |,      jq                  dz      }-d d d        d d d        dvdG| -gd{gd t?        |j@                  xs dH      t?        |jB                  xs dI      tE        |jF                  xs dJ      d$}
d}	t%        j&                  |	|
d|&      }|j)                         }|j                  di       j                  d'd      }.|r.t9        j:                  |d}d~       t9        j:                  ||.d        t        |.|d:      S | j                         js                  d      s| j                         js                  d      r| ju                  dd      ju                  dd      j	                         }/dv|/dd t?        |j@                  xs dH      t?        |jB                  xs dI      tE        |jF                  xs dJ      d}
d}	t%        j&                  |	|
d|&      }|j)                         }|j                  dd       }0|0r'|rt9        j:                  |dd        t        |0|d      S t        ddi      dfS g }1|D ]  }|s|j                  stw        |j                        s)d)d l1})|)je                  d       5 }+|jg                  |+jh                         ty        |+jh                  |j                        }2|2r?|2js                  d      s.|1j5                  d|j                   d9|2 d|j                          d d d         |sSt9        jz                  |      \  }3}4|4s|3st        d|4        t        ddi      dfS |3j|                  }t        d|        t        d|        t9        j~                  |      }3|3rt        |3dd       t        j|                  k7  rt        d|        t        ddi      dfS t        dt        |3dd              t        d       t9        j:                  t        |3dd       | d~      \  }5}4|4rt        d|4        t        d|4i      dfS |r`|D ][  }|s|j                  st        dt        j|                  d|d|j                   dt        |dd       dt        j                         ] t        d       g }6|3rt        |3dd       r	 t        |3j                  t              r|3j                  ng }7t        |7d       dd  }8|8D 9cg c]!  }9t        |9dd       rdGndt        |9dd      d# }6}9t        dt        |6       d       t        dt)        j                  |6d             t        d       g }:|j                  r|j                  D ]  };	 t        j                  j7                  dt/        |j|                        |;j                        }%t        d|%        ty        |%|;j                        }<|:j5                  d|;j                   d9|< d|;j                           |j                  xs d}|:r|dd9j7                  |:      z   z  }|1r|dd9j7                  |1      z   z  }|dz  }t        d       t        d|j                          |j                  r@d|j                  j                         v r#d)dlNmO}= d9j7                  |6D 9cg c]  }9|9d   j                          d|9d'     c}9      }>|>r|> d|  n| }?t        d|d dR  d       t        d|?        |=j                  |?|t?        |j@                  xs dH      tE        |jF                  xs dJ      t?        |jB                  xs dI      |j                        }@t        |@t              r	dV@v r@dV   n@}.t9        j:                  |3j|                  |.d        t        |.|3j|                  d:      S |j                  xs dd|dg|6dG| dd t?        |j@                  xs dH      t?        |jB                  xs dI      tE        |jF                  xs dJ      d$}
t        dt)        j                  |
d             t%        jH                         }tK        dKdLg dMN      }tM        |O      }|jO                  dP|       |jO                  dQ|       d}Ad}B|A|Bg}Ct        |C      D ]  \  }D}		 t        dDdLz    d|	        t        j                  j                  d|DdLz    d|	        t        j                  j                  dt)        j                  |
d              d |
d<   |Dd)k(  rdEnd}EDd)k(  rdnd}F|j'                  |	|
E|Ff&      }t        d|jP                          t        j                  j                  d|jP                          t        dt        |j                                t        j                  j                  dt        |j                                |jP                  dRk7  rtdDdLz    d|j                   }Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  rt        dΫ       t        ddi      dfc S 	 |j)                         }d|vsd'|d   vr]dDdLz    dѝ}Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  r-t        ddi      dfc S |d   d'   }.|.s]dDdLz    dѝ}Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  rt        ddi      dfc S t        dDdLz           t        d֫       t9        j:                  |3j|                  |.d       \  }H}4|4rt        d|4        t        d|4i      dfc S t        |.|3j|                  d:      c S  y c c}w # t,        $ r$}t        d*t/        |              i }Y d }~d }~ww xY w# t,        $ r}|dTt/        |       dUz  }Y d }~d }~ww xY w# t$        jR                  $ r}tU        |dV      r|jV                  |jV                  jP                  dk(  r}	 |jY                  |d./      }nP# t,        $ rD}dWt/        |       }|rt9        j:                  ||d        t        ||d:      cY d }~cY d }~S d }~ww xY w|r5|j[                  |d./      } | rdX| dYd9j7                  |       z   }ndA| dB}n	 |j]                  |d./      \  }!}"nP# t,        $ rD}dZt/        |       }|rt9        j:                  ||d        t        ||d:      cY d }~cY d }~S d }~ww xY w|!rE|j[                  |!d./      } d[|! d\d9j7                  |       z   }|"r|d]d^j7                  |"       z  }nd_| d`}|rt9        j:                  ||d        t        ||d:      cY d }~S dat/        |       }|rt9        j:                  ||d        t        ||d:      cY d }~S d }~wt,        $ r?}dbt/        |       }|rt9        j:                  ||d        t        ||d:      cY d }~S d }~ww xY w# t,        $ r?}ddt/        |       }|rt9        j:                  ||d        t        ||d:      cY d }~S d }~ww xY w# t,        $ r}|dTt/        |       dUz  }Y d }~d }~ww xY w# t,        $ r?}dZt/        |       }|rt9        j:                  ||d        t        ||d:      cY d }~S d }~ww xY wc c}w # t,        $ r}|drt/        |       dUz  }Y d }~'d }~ww xY w# 1 sw Y   @xY w# 1 sw Y   ExY w# 1 sw Y   ?xY w# t,        $ r$}t        dt/        |              g }8Y d }~
d }~ww xY wc c}9w # t,        $ r/}t        d|;j                   dt/        |              Y d }~
d }~ww xY wc c}9w # t(        j                  $ rv}dDdLz    dt/        |       }Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  rY d }~t        ddi      dfcY d }~c S d }~ww xY w# t$        j                  $ r}dDdLz    dt/        |       }Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  rt        dDdLz    dܝ       Y d }~bt        ddi      dfcY d }~c S d }~wt$        j                  $ r}dDdLz    dt/        |       }Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  rt        dDdLz    dܝ       Y d }~t        ddi      dfcY d }~c S d }~wt$        j                  $ r}dDdLz    dt/        |       }Gt        d|G        t        j                  j                  d|G        |Dt        C      dLz
  k  rt        dDdLz    dܝ       Y d }~	t        ddi      dfcY d }~c S d }~ww xY w# t,        $ r}t        dt/        |              t        j                  j                  dt/        |              t        j                  st        j                  d   rt        ddi      dfcY d }~S d)dlamb}Imc}J  |I |Jd            cY d }~S d }~ww xY w)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                 ^    t        | dd       xs t        d      j                  j                  S )N
created_atr   )getattr
__import__r   minms    rJ   <lambda>zchat.<locals>.<lambda>  s%    '!\4"@"gJzDZDcDcDgDg     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,%-HQajj-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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#4ZgW^#4#_#//36,4MMOM*7*;*;Ir*J*N*NyZ\*]K$*QR]Q^(__H\ ++GXuEHIJJH%)>>6::gCV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#4ZgW^#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 +$<=,,G	(33Ej3QH?G||GUW?X%Ytd6l%YN%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 800f0M NQTMM#((+chh- N$%FFH	"("2"29"="D"DW"MN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}}))&1W]]_5O5OP_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QZZL$<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 	*2 ,$5")"3AJJ<r'!M]_dBeAffm n#*#6#6	 	34GD*d3%1;DMM41PVX"(!g# $# +
  '.c9e&DF+&sIr:L  23|3D2EZPQ'L)KL34!#==-- aa "->EHHv~~ ^I=i[IJ3Iv~~NG*114MfnnM]]_`g_h  iI  JP  JX  JX  IY  3Z  [a ++Z/Z!Vdii0F&GGGMVdii&===M  	 	/001G1G0HIJ!!h%2H2H2N2N2P&PB"ii_k(lX[CK,=,=,?+@3y>BR)S(lmOFUo.j	B[bL2=#3F2GsKL1,@A*<<$+!%"3"3":s;u//748EKK.3/,, = M :DMSW9X]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)+<=&{3 n	eMAz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n	eY .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 NN Nb@ @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  B4As 6AY
	As %As 6AAs B:As =AAY
 CAs #AAs %EAZ# 3AAY: &As 78As 0Ac0 EAs AAd; 1As 3Ae$ 	A3As =A7As 4Af/ DAs AAf4 !3As A'As <2Ag*.1AgAg*'C%As D!As /As >	As As As +As A=Ag7>AAs A9As =A'As %	As /As <A'As $9Ah As !&Ah4A#As +BAh9A;B+As D&"Ai4EC+As H4C6As L+F*AlSAs SAlS%As S)A%Ai9UAs UAi9UAs U!AAi9V5As V7Ai9WAs WAAi9X&As X)Ai9Y As YAs YAs Y
	AY7YAY2Y,As Y2AY7Y7As Y:	AZ ZAZZAZ# ZAZ Z AZ# Z#Ac-Z74Ab"[,A\ [?Ab"\ 	A]\	4A]\=A]\>Ab"]Ac-]As ]A]]:Ab"^A^^Ab"^	A_,^(4A_'_A_,_Ab"_!Ac-_"As _'A_,_,A6Ab"a"Ac-a#As a(4Ab"bAc-bAs b"Ac-b.4Ac(c"Ac-c#As c(Ac-c-As c0	Ad8c94Ad3d-Ad8d.As d3Ad8d8As d;	Ae!eAeeAs eAe!e!As e$	Af,e-4Af'f!Af,f"As f'Af,f,As f4	Agf=AggAs gAggAs gAg'	g"Ag*g*Ag4g/As g7Ah	g<As h	Ah1hAh,h&As h,Ah1h1As h9	Ai1i$Ai,i&As i,Ai1i1As i9AljAAk=k!Alk%As k'Ak=k5Alk6Alk:As k=AllAllAslA'Anm?As nAnnAsnAs nAsn1A'Ap4pAs pAp4p,Asp-As p4Asq
A'Asr1As r7AssAssAs sAssAs s	Au7sA3Au2uAu7uAu2u,Au7u2Au7c            	         t        t        d      rOt        j                  dk(  r<t        j                  j                  t        j                        j                         } n<t        j                  j                  t        j                        j                         } t        j                  j                  dt              }d |rt        t        d      rBt        j                  dk(  r/t        j                  j                  |      j                         n=t        j                  j                  |t        j                        j                         s| r| d   t        j                          }d }r|rt#        fd	|D              st        j$                  j                        \  }}|r!t'        d
|z   d       t)        d| |d d       S |r6|j*                  r*|j*                  j-                         j/                  dd      nd|r|j                  nd }t1        t3        d|r|j                  nd|            S t)        d| |||      S )NrZ   
superadminr   rR   typer   r   r   r   c              3   P   K   | ]  }|j                   j                  k(    y wNrR   r   .0cr   s     rJ   	<genexpr>z chat_redirect.<locals>.<genexpr>       &M!qzzUXX'=&M   #&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   rC  r   r   r   r   )r;  rR   r<  r#   r7   
title_slugr   s         @rJ   chat_redirectrL    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!--ehh7e(50(;"#35'Y^eix|  MR  S  S=AdjjTZZ%%'//S9X]im^b^e^esu]vVw
 0T$''qXbcdd+5'QV]apt  EJ  K  Kr   z /chat/<int:chat_id>/<path:title>c           	         t        d|  d|        t        j                  |       }|r|j                  t        j
                  k7  r t        dd       t        t        d            S |j                  |k7  r%||_	        t        j                  j                          |j                  }t        t        d      rOt        j                  dk(  r<t         j"                  j%                  t         j&                        j)                         }n<t         j"                  j+                  t        j
                        j)                         }t        j,                         }t/        d	||||||
      S )Nz[DEBUG] Acessando /chat/r   &   Chat não encontrado ou acesso negado.r8  chat.conversation_history_pagerZ   r(  r)  r9  )r   r;  r#   r<  r=  r>  )r   r   r   r   r   r   r   r   r   rC  r   r    commitr   r   rZ   r   r   rD  rU   rE  rF  rI  r   )rQ   rC  r#   r   r;  r<  s         rJ   	view_chatrQ    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+5'PT\apt  EJ  K  Kr   z/chat/<int:chat_id>c                 N   t        j                  |       }|r|j                  t        j                  k7  r t        dd       t        t        d            S |j                  r*|j                  j                         j                  dd      nd|  }t        t        d| |            S )	NrN  r8  rO  rk   r?  r@  rA  rB  )r   r   r   r   r   r   r   r   rC  r   r   )rQ   r#   rK  s      rJ   view_chat_legacyrS    s     (D4<<<??26A @ABB9=!!#++C55QXPYIZJG,gZPQQr   z!/chat/instructions/<int:agent_id>c                     t         j                  j                  | t        j                        j                         }|s t        dd       t        t        d            S t        d|      S )Nr-  (   Agente não encontrado ou acesso negado.r8  zchat.chat_redirectzchat/instructions.html)r   )
r   r   rF  r   r   rH  r   r   r   r   )rR   r   s     rJ   instructionsrV    sW     LL""h"HNNPE8(C 456635AAr   z&/chat/instructions/<int:agent_id>/savec                    	 t         j                  j                  | t        j                        j                         }|st        ddd      dfS t        j                         }|j                  dd      |_
        |j                  dd      |_        t        |j                  d	d
            |_        t        |j                  dd            |_        t         j"                  j%                          t        ddi      S # t&        $ rA}t         j"                  j)                          t        dt+        |      d      dfcY d }~S d }~ww xY w)Nr-  FrU  successr7   rT   r   rO   example_promptr`   rs   r   rt   rY  Tr.   )r   r   rF  r   r   rH  r   r   get_jsonr?   r   rZ  r   r`   r   r   r   r    rP  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C> B,C> >	E6E=EEz/chat/retrainc            	         	 t         j                  j                  d      } | st        ddd      dfS t        j
                  j                  | t        j                        j                         }|st        ddd      dfS t         j                  j                  d	      }|st        dd
d      dfS |D ]  }|s|j                  st        |j                        }t        j                  j!                  dt#        |j                              }t        j$                  |d       t        j                  j!                  ||      }|j'                  |       t)        |j                  |      }t*        j,                  j/                  |       t1        dt        j                  d|j                  d|j                   t         j2                           t*        j,                  j5                          t        ddi      S # t6        $ rA}t*        j,                  j9                          t        dt#        |      d      dfcY d }~S d }~ww xY w)NrR   Fu   ID do agente não fornecidorX  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   rY  r.   )r   r   r?   r   r   r   rF  r   r   rH  rP   r   r   r
   r<   r   r   r;   makedirsr   r   r   r    addr   r   rP  r9   r\  )	rR   r   r   r   r   ro   caminhor  rI   s	            rJ   retrain_agentrg    s   (A<<##J/u7TUVX[[[&&(LOO&LRRTu7`abdggg==((4u7OPQSVVV 	G7++*7+;+;<%6EHHFED1'',,uh7W%%#hh$ 

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

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


53q6:;S@@As<   0H AH 0H 3H <H 	D7H 	I
6I IIz/api/history/conversationsc                     	 t         j                  j                  dt              } t	        j
                  |       \  }}|rt        d|i      dfS t        |      S # t        $ rZ}ddl}t        dt        |              t        d	|j                                 t        d
t        |      d      dfcY d}~S d}~ww xY w)uh   
    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   rG  r?   r   r   get_conversation_historyr   r9   	tracebackr   r;   
format_exc)rR   history_listr7   rI   rj  s        rJ   api_get_conversation_historyrm  #  s    
d<<##JS#9)BBHUe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                     t        d|         	 t        j                  |       }|s<t        dt        j
                  d| dt        j                         t        ddi      dfS t        j                  j                  d	t        
      }|r[|j                  |k7  rLt        dt        j
                  d| d| d|j                   t        j                         t        ddi      dfS t        |j                  d       D cg c]B  }|j                  |j                   |j"                  r|j"                  j%                         nd dD }}t        dt'        |       d|         t)        |      D ]5  \  }}|d   rdnd}t        d|dz    d| dt+        |d   d d        d       7 t        |      S c c}w # t,        $ r?}t        d|  dt/        |              t        ddt/        |       i      d fcY d }~S d }~ww xY w)!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                     | j                   S r/  )r   r   s    rJ   r   z)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   rG  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_v2ru  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  {{{{8;#..224D
 H H 	#CM?2I'ST) 	\FAs"%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F5 #BF5 %F5 ?AF0A)F5 0F5 5	G=>4G82G=8G=z/chat/delete/<int:chat_id>DELETEc                    	 t         j                  j                  | t        j                        j                         }|st        ddi      dfS t        j                  j                  |       j                          t         j                  j                  |       j                          t        dt        j                  d| d	t        j                  
       t        ddi      S # t        $ rN}t        j                  j                          t!        dt#        |              t        ddi      dfcY d}~S d}~ww xY w)zB
    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   rF  r   r   rH  r   r   r   r   r   r   r9   r   r    r\  r   r;   )rQ   r#   rI   s      rJ   delete_chatry  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& &	D=/AD82D=8D=z/historyc                      t        d      S )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                  D    t        j                         } t        d|       S )Nzchat/chatlog.htmlr<  )r   rI  r   r~  s    rJ   chat_logr    s      &&(E.e<<r   c                 z    d| v xr6 | j                  dd      d   j                         t        j                  d   v 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                     	 dt         j                  vr/t        j                  j	                  d       t        ddd      dfS t         j                  d   } | j                  s/t        j                  j	                  d       t        ddd      dfS t        | j                        s_t        j                  j	                  d| j                          t        dd	d
j                  t        j                  d          d      dfS t         j                  t        j                  d   kD  rYt        j                  j	                  dt         j                   d       t        ddt        j                  d   dz   dd      dfS t        j                  j                  t        j                  d   d      }	 t        j                  |d       t!        | j                        }t        j                  j                  ||      }	 | j#                  |       ddlm}  |||      }t         j(                  j+                  d      }||dk(  r/t        j                  j	                  d       t        dd d      dfS t-        t/        |      ||| j0                  t        j                  j3                  |      !      }t4        j6                  j9                  |       t4        j6                  j;                          t=        d"t>        j@                  d#|d$| d%t        j                  j3                  |       d&t         jB                  '       t        j                  jE                  d(|        t        d|||d)      S # t        $ rE}t        j                  j	                  dt        |              t        ddd      dfcY d }~S d }~ww xY w# t        $ rE}t        j                  j	                  dt        |              t        ddd      dfcY d }~S d }~ww xY w# t        $ rQ}t        j                  j	                  d*t        |              t        dd+t        |       d      dfcY d }~S d }~ww xY w),Nfileu&   Nenhum arquivo enviado na requisiçãoFr`  rX  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#   Tra  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: )rY  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   rd  r9   r;   r
   r   	src.utilsr   r   r?   r   r   content_typegetsizer   r    re  rP  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X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 A3P A<P 1P 4M6 5P O A#P 6C?P 6	O?:N?9O:P ?OP 	P:P
PP PP 	Q2!AQ-'Q2-Q2z/api/chat/audioc                     	 dt         j                  vrt        ddd      dfS t         j                  d   } t         j                  j	                  d      }|st        ddd      dfS t
        j                  j	                  |      }|r|j                  t        j                  k7  rt        ddd      d	fS t        j                  j                  t        j                  d
   t        |      d      }t        j                   |d       dt#        t%        j$                                d}t        j                  j                  ||      }| j'                  |       d}||dk(  r/t        j(                  j+                  d       t        ddd      dfS t-        t#        |      ||dt        j                  j/                  |            }t0        j2                  j5                  |       t0        j2                  j7                          t9        dt        j                  d|d| dt        j                  j/                  |       dt         j:                         t        d|d      S # t<        $ rc}t0        j2                  j?                          t        j(                  j+                  dt        |              t        ddd      dfcY d}~S d}~ww xY w) u)   API endpoint para processamento de áudioaudioFu    Nenhum arquivo de áudio enviadorX  rS   rQ   u   ID do chat não fornecidor   rT   r  Tra  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   )rY  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;   rd  r   timer   r:   r7   r   r  r   r    re  rP  r   r   r9   r\  )	
audio_filerQ   r#   	audio_dirr   r
  r  audio_recordrI   s	            rJ   api_process_audior    sN   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H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$ 6CI$ CI$ $	K-AKKKz/public-chat/<public_token>c                    ddl m}m} ddlm} dd l}|j                  j                  |       j                         }|st        dd      dfS  |d	d d
|j                  d|  dt        j                   d|j
                  j                         j                          dt        j                         |j                  rw|j                  j                  |j                  d   j                        j!                  |j"                  j%                               j'                  d      j)                         ng }t        d||d       S )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   rx     )agenter^   r7   )
src.modelsr   r   src.discord.discord_webhookr   r   r   rF  rH  r   r   r   r   utcnowrC   r<  rD  r   asclimitrE  )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26H\`aar   z /public-chat/<public_token>/sendc                 x   ddl m}m}m} ddlm} ddlm}m} dd l	}|j                  j                  |       j                         }|s |ddi      dfS  |j                         }	|	j                  d	d
      j                         }
|
s |ddi      dfS |j                  j                  |j                   d       j                         }|sv ||j                   d d|j"                   |j                  j%                               }ddlm} |j*                  j-                  |       |j*                  j/                          ddlm}  ||j                   d|
|j                  j%                               }|j*                  j-                  |       |j*                  j/                           |j0                  ||
|      \  }}|r |d|i      dfS  ||j                   d||j                  j%                               }|j*                  j-                  |       |j*                  j/                           |d|i      S )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   rC  r   r   T)rQ   r   rN   r   r.   FrG   )r  r   r   r   src.services.chat_servicer   r   r   r   r   r   rF  rH  r[  r?   r   r   rU   r  src.extensionsr   r    re  rP  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7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lW_WhWhWoWoWqrHJJNN8JJ9k99&,PTUOHe'(#--dgguhS[SdSdSkSkSmnGJJNN7JJJ)**r   z	/chat-newc            	         t        t        d      rOt        j                  dk(  r<t        j                  j                  t        j                        j                         } n<t        j                  j                  t        j                        j                         } t        j                  j                  dt              }d|rt        t        d      rBt        j                  dk(  r/t        j                  j                  |      j                         n=t        j                  j                  |t        j                        j                         s| r| d	   t        j                          }d}rI|rt#        fd
|D              s3t        j$                  j                        \  }}|rt'        d|z   d       t)        d| |||      S )z4Nova interface de chat usando TypeScript do ditto-airZ   r(  r)  rR   r*  Nr,  r-  r   c              3   P   K   | ]  }|j                   j                  k(    y wr/  r0  r1  s     rJ   r4  zchat_new.<locals>.<genexpr>^  r5  r6  r7  r8  zchat/chat_new.htmlr:  )r   r   rZ   r   r   rD  rU   rE  rF  r   r   rG  r?   r   rH  r   rI  rJ  r   r   r   )r;  rR   r<  r#   r7   r   s        @rJ   chat_newr  H  sc    |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!--ehh7e(50(;/ugUZaetx  IN  O  Or   z/ditto-ai/<path:filename>c                     t         j                  j                  t         j                  j                  t              dddd      }t        ||       S )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  s9     GGLL!:D$
TZ[M}h77r   z
/ditto-ai/c                      t         j                  j                  t         j                  j                  t              dddd      } t        | d      S )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#   rL  rQ  rS  rV  r^  rg  rm  ru  ry  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   