File size: 3,833 Bytes
4d9d861
 
78ec58b
 
 
4d9d861
78ec58b
 
 
4d9d861
5b13202
4d9d861
 
78ec58b
4d9d861
 
50c4096
4d9d861
 
 
 
 
 
 
78ec58b
 
 
 
 
 
 
 
 
4d9d861
 
 
 
78ec58b
 
 
 
4d9d861
 
3512a01
 
 
4d9d861
 
 
78ec58b
 
4d9d861
78ec58b
4d9d861
 
 
78ec58b
4d9d861
 
 
 
5b13202
4d9d861
50c4096
4d9d861
 
50c4096
4d9d861
 
 
 
78ec58b
5b13202
78ec58b
 
 
 
5b13202
4d9d861
 
78ec58b
4d9d861
5b13202
4d9d861
 
50c4096
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
import os
import gradio as gr
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_parse import LlamaParse
import nest_asyncio

nest_asyncio.apply()

# --- CONFIGURAÇÃO VISUAL ---
theme_css = """
body { background-color: #0b0c10; color: #c5c6c7; font-family: 'Roboto', sans-serif; }
.header-container { display: flex; align-items: center; justify-content: center; gap: 15px; padding: 20px; border-bottom: 1px solid #1f2833; margin-bottom: 20px; }
.logo-img { height: 60px; width: auto; filter: drop-shadow(0 0 10px rgba(102, 252, 241, 0.5)); }
.brand-name { font-size: 32px; font-weight: bold; color: #66fcf1; letter-spacing: 4px; font-family: 'Impact', sans-serif; }
.chatbot-area { height: 500px !important; background-color: #1f2833; border: 1px solid #45a29e; border-radius: 10px; }
"""

global_query_engine = None

def processar_pdf(files, api_key_llama, api_key_openai):
    global global_query_engine
    
    # Limpa espaços em branco acidentais
    api_key_openai = api_key_openai.strip()
    api_key_llama = api_key_llama.strip()

    if not files: return "⚠️ Envie um PDF."
    if not api_key_openai.startswith("sk-"):
        return f"⚠️ Erro: A chave digitada não parece uma chave OpenAI válida. Ela começa com: {api_key_openai[:7]}..."

    # FORÇA AS CHAVES NO AMBIENTE
    os.environ["LLAMA_CLOUD_API_KEY"] = api_key_llama
    os.environ["OPENAI_API_KEY"] = api_key_openai
    
    try:
        # CONFIGURAÇÃO DIRETA (Ignora variáveis de ambiente globais do Hugging Face)
        Settings.llm = OpenAI(model="gpt-4o", api_key=api_key_openai)
        Settings.embed_model = OpenAIEmbedding(api_key=api_key_openai)
        
        parser = LlamaParse(result_type="markdown", language="pt")
        file_extractor = {".pdf": parser}
        filepaths = [f.name if hasattr(f, 'name') else f for f in files]
        
        documents = SimpleDirectoryReader(input_files=filepaths, file_extractor=file_extractor).load_data()
        index = VectorStoreIndex.from_documents(documents)
        global_query_engine = index.as_query_engine()
        
        return f"✅ CONECTADO! Chave detectada: {api_key_openai[:7]}***"
        
    except Exception as e:
        return f"❌ Erro Técnico: {str(e)}"

def responder(message, history):
    global global_query_engine
    if global_query_engine is None: return "⚠️ Sistema Offline. Configure acima."
    try:
        response = global_query_engine.query(message)
        return str(response)
    except Exception as e:
        return f"Erro: {str(e)}"

with gr.Blocks() as demo:
    with gr.Row(elem_classes="header-container"):
        if os.path.exists("logo.png"):
            gr.Image("logo.png", elem_classes="logo-img", show_label=False, show_download_button=False)
        gr.Markdown("<div class='brand-name'>COGNILINE</div>")

    with gr.Row():
        with gr.Column(scale=1, min_width=300):
            gr.Markdown("### ⚙️ Painel")
            txt_llama = gr.Textbox(label="LlamaCloud Key", type="password")
            # Adicionado o autocomplete="off" para o navegador não interferir
            txt_openai = gr.Textbox(label="OpenAI Key (sk-...)", type="password")
            file_up = gr.File(label="PDF", file_count="multiple", file_types=[".pdf"])
            btn_start = gr.Button("ATIVAR", variant="primary")
            lbl_status = gr.Textbox(label="Status", interactive=False)

        with gr.Column(scale=3):
            gr.ChatInterface(fn=responder, chatbot=gr.Chatbot(elem_classes="chatbot-area"))

    btn_start.click(processar_pdf, inputs=[file_up, txt_llama, txt_openai], outputs=lbl_status)

if __name__ == "__main__":
    demo.launch(css=theme_css, theme=gr.themes.Soft())