from flask import Flask, render_template, request from transformers import pipeline import os from pypdf import PdfReader # ========================= # ENVIRONMENT VARIABLES # ========================= hf_token = os.environ.get("HF_TOKEN") # ========================= # FLASK APP # ========================= app = Flask(__name__) # ========================= # AI MODELS INITIALIZATION # ========================= model_id = "google/gemma-2b-it" generator = pipeline( "text-generation", model=model_id, device_map="auto", token=hf_token ) # ========================= # AI RESPONSE GENERATION # ========================= def generate_ai_response(email_text, category): if category == "Improdutivo": return "Agradecemos o seu contato. No momento, não é necessária nenhuma ação adicional." prompt = f"""user Extraia apenas o assunto do e-mail de forma ultra resumida (máximo 4 palavras), **focando na natureza do problema ou solicitação**, e não apenas números ou identificadores. Não escreva frases completas. Não explique. Apenas o assunto. Exemplo 1: "Preciso trocar minha senha" -> troca de senha Exemplo 2: "Erro no acesso ao portal financeiro" -> acesso ao portal Exemplo 3: "Solicito o relatório de vendas" -> relatório de vendas Exemplo 4: "Estou com problemas para conciliar lançamentos bancários" -> conciliação bancária Exemplo 5: "Erro ao gerar relatório de vendas" -> erro relatório de vendas Exemplo 6: "Não consigo acessar o sistema de faturamento" -> dificuldade acesso ao sistema Email: "{email_text}" model """ output_assunto = generator( prompt, max_new_tokens=15, do_sample=False, repetition_penalty=1.5 ) raw_assunto = output_assunto[0]["generated_text"].split("model")[-1].strip() assunto_limpo = raw_assunto.lower().replace("o assunto é", "").replace("assunto:", "").strip() assunto_limpo = assunto_limpo.replace('"', '').replace('.', '') resposta_final = ( f"Olá, recebemos sua mensagem. Informamos que sua solicitação de **{assunto_limpo}** " "foi encaminhada ao setor responsável para análise. " "Atenciosamente, Equipe de Suporte." ) return resposta_final # ========================= # EMAIL CLASSIFICATION # ========================= PRODUTIVO_KEYWORDS = [ # Ações "solicito", "verificar", "status", "atualização", "envio", "encaminho", "anexo", "pendência", "análise", "validar", "retorno", "prazo","preciso", "necessito", "requerimento", "demanda", "suporte", "assistência", "ajuda", "resolução", "correção", "alteração", "modificação", "configuração", "instalação", "implementação", "configurar", "ajustar", "corrigir", "resolver", "atender", "fornecer", "disponibilizar", "consultar", "informar", "notificar", "solução", "procedimento", "documentação", "manual", "tutorial", # Objetos do Setor "chamado", "ticket", "protocolo", "relatório", "extrato", "faturamento", "acesso", "sistema", "token", "senha", "autenticação", "planilha", "dados", "consolidação", "fatura", "pagamento", "comprovante", ] IMPRODUTIVO_KEYWORDS = [ "feliz", "natal", "aniversário", "parabéns", "bom dia", "boa tarde", "boa noite", "obrigado", "agradeço", "tchau", "abs", "abraço", "confraternização", "feriado", "reunião de condomínio", "evento social", "churrasco", "festa", "encontro", "happy hour", "café", "almoço", "jantar", "convite", "saudação", "cumprimento", "despedida", "mensagem pessoal","promoção", "oferta", "desconto", "brinde", "sorteio", "concurso", ] def classify_email(text): text_lower = text.lower() is_social = any(word in text_lower for word in IMPRODUTIVO_KEYWORDS) is_action = any(word in text_lower for word in PRODUTIVO_KEYWORDS) # Se tem palavra de ação, é PRODUTIVO. if is_action: category = "Produtivo" else: category = "Improdutivo" # response = generate_ai_response(text, category) return category, response # ========================= # ROUTES # ========================= @app.route("/", methods=["GET", "POST"]) def index(): category = None response = None email_text = "" if request.method == "POST": email_text = request.form.get("email_text", "").strip() uploaded_file = request.files.get("email_file") if uploaded_file and uploaded_file.filename != "": if uploaded_file.filename.endswith(".txt"): email_text = uploaded_file.read().decode("utf-8") elif uploaded_file.filename.endswith(".pdf"): try: reader = PdfReader(uploaded_file) pdf_text = "" for page in reader.pages: pdf_text += page.extract_text() email_text = pdf_text except Exception as e: email_text = f"Erro ao ler PDF: {str(e)}" if email_text and not email_text.startswith("Erro ao ler"): category, response = classify_email(email_text) return render_template( "index.html", category=category, response=response, email_text=email_text ) # ========================= # MAIN # ========================= if __name__ == "__main__": port = int(os.environ.get("PORT", 7860)) app.run(host="0.0.0.0", port=port)