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": "", "resposta_sugerida": "" }