Spaces:
Sleeping
Sleeping
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()) |