app.services.ai_service
Módulo responsável por interagir com a API da OpenAI para classificar emails e sugerir respostas automáticas.
Ele constrói um prompt com o texto já pré-processado, envia ao modelo GPT-3.5-turbo e espera como retorno um JSON com a classificação ("Produtivo" ou "Improdutivo") e uma resposta sugerida.
Caso o JSON não possa ser decodificado ou ocorra algum erro, o módulo trata o caso retornando informações padronizadas.
1""" 2Módulo responsável por interagir com a API da OpenAI para classificar emails 3e sugerir respostas automáticas. 4 5Ele constrói um prompt com o texto já pré-processado, envia ao modelo GPT-3.5-turbo 6e espera como retorno um JSON com a classificação ("Produtivo" ou "Improdutivo") 7e uma resposta sugerida. 8 9Caso o JSON não possa ser decodificado ou ocorra algum erro, o módulo trata o caso 10retornando informações padronizadas. 11""" 12 13import os 14import json 15import logging 16from openai import OpenAI 17from app.prompts import classification_prompt 18 19logging.basicConfig(level=logging.INFO) 20 21def classify_and_suggest(cleaned_text): 22 """ 23 Envia o texto limpo para o GPT-3.5 com um prompt de classificação, 24 solicitando a categoria do email e uma resposta curta. 25 26 Args: 27 cleaned_text (str): O texto do email já pré-processado. 28 29 Returns: 30 dict: Um dicionário no formato: 31 { 32 "categoria": "<Produtivo | Improdutivo | Desconhecido | Erro>", 33 "resposta_sugerida": "<resposta curta>" 34 } 35 """ 36 client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY")) 37 prompt = classification_prompt(cleaned_text) 38 39 logging.info("Enviando prompt ao GPT-3.5...") 40 logging.debug(f"Prompt enviado: {prompt}") 41 42 try: 43 response = client.chat.completions.create( 44 model="gpt-3.5-turbo", 45 messages=[{"role": "user", "content": prompt}] 46 ) 47 return json.loads(response.choices[0].message.content) 48 except json.JSONDecodeError: 49 logging.error("Resposta do GPT não pôde ser decodificada como JSON.", exc_info=True) 50 return { 51 "categoria": "Desconhecido", 52 "resposta_sugerida": response.choices[0].message.content.strip() 53 } 54 except Exception as e: 55 logging.error("Erro ao consultar o GPT-3.5.", exc_info=True) 56 return { 57 "categoria": "Erro", 58 "resposta_sugerida": f"Não foi possível gerar uma resposta automática: {str(e)}" 59 }
def
classify_and_suggest(cleaned_text):
22def classify_and_suggest(cleaned_text): 23 """ 24 Envia o texto limpo para o GPT-3.5 com um prompt de classificação, 25 solicitando a categoria do email e uma resposta curta. 26 27 Args: 28 cleaned_text (str): O texto do email já pré-processado. 29 30 Returns: 31 dict: Um dicionário no formato: 32 { 33 "categoria": "<Produtivo | Improdutivo | Desconhecido | Erro>", 34 "resposta_sugerida": "<resposta curta>" 35 } 36 """ 37 client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY")) 38 prompt = classification_prompt(cleaned_text) 39 40 logging.info("Enviando prompt ao GPT-3.5...") 41 logging.debug(f"Prompt enviado: {prompt}") 42 43 try: 44 response = client.chat.completions.create( 45 model="gpt-3.5-turbo", 46 messages=[{"role": "user", "content": prompt}] 47 ) 48 return json.loads(response.choices[0].message.content) 49 except json.JSONDecodeError: 50 logging.error("Resposta do GPT não pôde ser decodificada como JSON.", exc_info=True) 51 return { 52 "categoria": "Desconhecido", 53 "resposta_sugerida": response.choices[0].message.content.strip() 54 } 55 except Exception as e: 56 logging.error("Erro ao consultar o GPT-3.5.", exc_info=True) 57 return { 58 "categoria": "Erro", 59 "resposta_sugerida": f"Não foi possível gerar uma resposta automática: {str(e)}" 60 }
Envia o texto limpo para o GPT-3.5 com um prompt de classificação, solicitando a categoria do email e uma resposta curta.
Args: cleaned_text (str): O texto do email já pré-processado.
Returns:
dict: Um dicionário no formato:
{
"categoria": "