
    vh                     h   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dl	m
Z
 d dlmZmZ  ee      j                         j                   Z e
edz  d        e j$                  d	      Z e j$                  d
      Z e j$                  d      Z e j$                  d      Z e j$                  dd      Zerer	de de dndZ ej2                  ej4                  d        ej6                  d      Z e       Z ed       Zd Zde de fdZ!de de de fdZ"ejG                  d      defd       Z$y)     N)Path)defaultdictdeque)load_dotenv)FastAPIRequestz.envT)dotenv_pathoverrideZAPI_INSTANCE_IDZAPI_INSTANCE_TOKENZAPI_CLIENT_TOKENOPENAI_API_KEYOPENAI_MODELzgpt-3.5-turbozhttps://api.z-api.io/instances/z/token/z
/send-textz"%(levelname)s:%(name)s:%(message)s)levelformatmainc                      t        d      S )N
   )maxlen)r        /var/www/html/luna/main.py<lambda>r   $   s    R 0 r   c                      	 t         dz  j                  d      } t        j                  d|        | S # t        $ r }t        j                  d|       Y d }~yd }~ww xY w)Nz
regras.txtzutf-8)encodingu   📜 Regras carregadas:
%szErro ao ler regras.txt: %su&   Não consegui acessar as regras agora.)BASE_DIR	read_textloggerinfo	Exceptionerror)regrases     r   
ler_regrasr$   )   sU    8\)44g4F16: 811578s   03 	AAAphonetextoc                   K   t         st        d      | |d}t        j                         4 d {   }|j	                  t         t
        dd|d       d {   }|j                  dk(  r#d|j                  v rt        j                  d	       |j                          d d d       d {    y 7 7 Y7 	# 1 d {  7  sw Y   y xY ww)
Nu   SEND_ENDPOINT não configurado)r%   messagezapplication/json)zClient-TokenzContent-Type   headersjsontimeouti  zInstance not founduI   ❗ Z-API: instância não existe ou está inativa. Verifique ID e TOKEN.)SEND_ENDPOINTRuntimeErrorhttpxAsyncClientpostSECURITY_TKstatus_codetextr   r!   raise_for_status)r%   r&   payloadclirs        r   enviar_whatsr:   2   s     ;<<%0G  "  c(( + 2   
 
 ==C$8AFF$BLLde	  
   sW   /CB1C$B7B3AB7 C+B5,C3B75C7C	=C >C	Cmensagemreturnc           	        K   t               }d}d|dg}|j                  t        |           |j                  d|j	                         d       t
        j                  d       t        j                         4 d {   }|j                  dddt         it        |d	d
d       d {   }|j                          |j                         d   d   d   d   j	                         }t        |    j                  d|j	                         d       t        |    j                  d|d       |cd d d       d {    S 7 7 7 	# 1 d {  7  sw Y   y xY ww)Nu  Você é Luna, uma assistente virtual da Lumix.
Seu papel é atender os clientes com simpatia, clareza e agilidade.
Use as regras abaixo como orientação, mas responda com naturalidade, adaptando-se à mensagem do cliente:

- Sempre cumprimente o cliente de forma simpática.
- Após a primeira saudação, pergunte qual tipo de atendimento ele precisa.
- Se a opção for 'Orçamento', solicite os seguintes dados e informe que irá encaminhá-lo a um especialista:
  - Nome:
  - Telefone ou e-mail:
- Se não tiver certeza sobre a resposta, diga que seu conhecimento é limitado às informações da empresa.
- Se houver múltiplas perguntas, responda uma por uma.
- Recuse-se a contar piadas.
- Se não souber a resposta, peça que o cliente entre em contato com o SAC.
- Informe sempre que todos os produtos são originais e com garantia.
- Evite repetir as mesmas frases em todas as mensagens. Varie a linguagem mantendo o mesmo tom simpático e profissional.
system)rolecontentuseru6   📤 Enviando prompt ao GPT com regras e histórico...z*https://api.openai.com/v1/chat/completionsAuthorizationzBearer g      ?)modelmessagestemperaturer)   r*   choicesr   r(   r@   	assistant)r$   extend	conversasappendstripr   r   r0   r1   r2   
OPENAI_KEYr   r6   r,   )r%   r;   r"   system_promptrD   r8   r9   respostas           r   gpt_respostarO   E   sO    \F	F " "m<=HOOIe$%OOV0@AB
KKHI  "  c((8$
|&<=%$"
   	
 	
 	
668I&q))4Y?EEG 	%HNN<L MN% JK%  	
   s[   A:E<E =E *E*E+BE.E:E;EEEEEEEz/webhookreqc                   K   | j                   j                  }| j                  }t        | j                        }| j                          d {   }|r|j                         dk(  rt        j                  d       ddiS t        j                  d||       t        j                  dt        j                  |d             t        j                  d	|       	 | j                          d {   }|j                  d
      du s|j                  d      du rt        j                  d       ddiS |j                  d      dk7  r)t        j                  d|j                  d             ddiS |j                  d      }|j                  di       j                  d      }|r|st        j                  d|       ddiS t        j                  d||       t        ||       d {   }t        j                  d|       t        ||       d {    d|dS 7 7 .7 97 # t         $ r.}	t        j#                  d|	       dt%        |	      dcY d }	~	S d }	~	ww xY ww)Nr   u2   🔁 Ignorado: corpo vazio (provável ping HTTP/2)statusignoradou   📥 Nova requisição: %s %su   📄 Headers: %s   )indentu   📦 Body (raw): %sfromMeTfromApiu.   🔁 Ignorado: mensagem enviada por mim mesmo.typeReceivedCallbacku5   ⚠️ Ignorado: tipo não é 'ReceivedCallback' (%s)r%   r5   r(   u   ⚠️ Payload incompleto: %su   📩 [%s] %su   ✅ GPT: %sok)rR   r;   u   ❌ Erro no webhook: %serro)rR   detalhe)clienthostmethoddictr+   bodyrK   r   debugr   r,   dumpsgetwarningrO   r:   r    	exceptionstr)
rP   client_hostr_   r+   raw_bodydatar%   msgrN   r#   s
             r   webhookrl   v   s    **//KZZF3;;GXXZHx~~'3.IJ*%%
KK/E
KK"DJJwq$AB
KK%x05XXZ 88H%))<)DKKHIj)) 88F11KKOQUQYQYZ`Qabj))!hhvr"&&y1CNN:DAj))NE3/%eS11M8,5(+++H55G    * 2 	,  52A6 SV445s   AIHB
IH! ,H-AH! /I0<H! ,I-AH! <I=&H! #H$)H! HH! IH! H! H! !	I*#IIIII)%osr,   loggingpathlibr   collectionsr   r   r0   dotenvr   fastapir   r   __file__resolveparentr   getenvINST_ID
INST_TOKENr3   rL   r   r.   basicConfigINFO	getLoggerr   apprI   r$   rg   r:   rO   r2   rl   r   r   r   <module>r}      sU   	    *   $
 >!!#** 6)D 9ryy+,ryy./
ryy,-ryy)*
ryy9 : &gYgj\L#' 
   ',,/S T			6	"i
 01	
8c # &,c ,S ,S ,b *,5w ,5 ,5r   