File size: 3,218 Bytes
6b29104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
"""
Configurações e utilitários para o AgentPDF.

Este módulo contém configurações globais, carregamento de variáveis
de ambiente e funções utilitárias para o projeto.
"""

import os
from dotenv import load_dotenv
from typing import Optional

# Carrega variáveis de ambiente
load_dotenv()


class Config:
    """Classe de configuração centralizada."""
    
    # API Keys
    OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "")
    LANGCHAIN_API_KEY: str = os.getenv("LANGCHAIN_API_KEY", "")
    
    # Configurações do LangChain
    LANGCHAIN_TRACING_V2: bool = os.getenv("LANGCHAIN_TRACING_V2", "false").lower() == "true"
    LANGCHAIN_PROJECT: str = os.getenv("LANGCHAIN_PROJECT", "agentpdf")
    
    # Configurações do modelo
    DEFAULT_MODEL: str = "gpt-4o-mini"
    DEFAULT_TEMPERATURE: float = 0.1
    MAX_TOKENS: int = 2000
    
    # Configurações de processamento de texto
    CHUNK_SIZE: int = 1000
    CHUNK_OVERLAP: int = 200
    
    # Configurações de recuperação
    TOP_K_DOCUMENTS: int = 5
    SIMILARITY_THRESHOLD: float = 0.7
    
    # Configurações da interface
    GRADIO_PORT: int = 7860
    GRADIO_SHARE: bool = False
    
    # Diretórios
    UPLOAD_DIR: str = "uploaded_data"
    TEMP_DIR: str = "temp"
    
    @classmethod
    def validate_config(cls) -> bool:
        """
        Valida se as configurações essenciais estão presentes.
        
        Returns:
            bool: True se a configuração é válida, False caso contrário.
        """
        if not cls.OPENAI_API_KEY:
            print("⚠️  AVISO: OPENAI_API_KEY não configurada!")
            return False
        return True
    
    @classmethod
    def get_model_config(cls) -> dict:
        """
        Retorna configurações do modelo LLM.
        
        Returns:
            dict: Configurações do modelo.
        """
        return {
            "model": cls.DEFAULT_MODEL,
            "temperature": cls.DEFAULT_TEMPERATURE,
            "max_tokens": cls.MAX_TOKENS,
        }
    
    @classmethod
    def get_text_splitter_config(cls) -> dict:
        """
        Retorna configurações do divisor de texto.
        
        Returns:
            dict: Configurações do text splitter.
        """
        return {
            "chunk_size": cls.CHUNK_SIZE,
            "chunk_overlap": cls.CHUNK_OVERLAP,
        }
    
    @classmethod
    def get_retrieval_config(cls) -> dict:
        """
        Retorna configurações de recuperação.
        
        Returns:
            dict: Configurações de recuperação.
        """
        return {
            "k": cls.TOP_K_DOCUMENTS,
            "score_threshold": cls.SIMILARITY_THRESHOLD,
        }


def ensure_directories():
    """Garante que os diretórios necessários existam."""
    directories = [Config.UPLOAD_DIR, Config.TEMP_DIR]
    for directory in directories:
        os.makedirs(directory, exist_ok=True)


def get_openai_api_key() -> Optional[str]:
    """
    Retorna a chave da API OpenAI.
    
    Returns:
        Optional[str]: Chave da API ou None se não configurada.
    """
    return Config.OPENAI_API_KEY if Config.OPENAI_API_KEY else None


# Inicialização
ensure_directories()