Spaces:
Running
Running
import gradio as gr | |
import os | |
import torch | |
from langchain.document_loaders import PyPDFLoader | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain.vectorstores import Chroma | |
from langchain.chains import ConversationalRetrievalChain | |
from langchain.embeddings import HuggingFaceEmbeddings | |
from langchain_huggingface import HuggingFacePipeline | |
from langchain.memory import ConversationBufferMemory | |
from transformers import AutoTokenizer, pipeline | |
# =================================================================== | |
# CONFIGURAÇÃO DE COMBATE | |
# =================================================================== | |
DEVICE = "cuda" if torch.cuda.is_available() else "cpu" | |
TORCH_DTYPE = torch.bfloat16 if DEVICE == "cuda" else torch.float32 | |
LLM_MODELS = { | |
"TinyLlama-1.1B-Chat": "TinyLlama/TinyLlama-1.1B-Chat-v1.0", | |
"Phi-2": "microsoft/phi-2", | |
"Mistral-7B-Instruct": "mistralai/Mistral-7B-Instruct-v0.2", | |
"Zephyr-7B-Beta": "HuggingFaceH4/zephyr-7b-beta" | |
} | |
# =================================================================== | |
# NÚCLEO DE OPERAÇÕES ESPECIAIS | |
# =================================================================== | |
class TacticalDocumentProcessor: | |
def neutralize_documents(files, chunk_size=512, chunk_overlap=64): | |
"""Operação de desmantelamento de documentos hostis""" | |
if not files: | |
raise ValueError("ALVO NÃO IDENTIFICADO") | |
try: | |
loaders = [PyPDFLoader(file.name) for file in files] | |
splitter = RecursiveCharacterTextSplitter( | |
chunk_size=chunk_size, | |
chunk_overlap=chunk_overlap, | |
separators=["\n\n", "\n", "\. ", " ", ""] | |
) | |
return [page for loader in loaders for page in loader.load_and_split(splitter)] | |
except Exception as e: | |
raise RuntimeError(f"FALHA NA OPERAÇÃO: {str(e)}") | |
class VectorStrikeSystem: | |
def deploy_vector_db(splits): | |
"""Implante imediato de sistema de vetorização""" | |
if not splits: | |
raise ValueError("NENHUMA INTELECÇÃO DISPONÍVEL") | |
return Chroma.from_documents( | |
documents=splits, | |
embedding=HuggingFaceEmbeddings(), | |
persist_directory="./combat_db" | |
) | |
class LLMWeaponsSystem: | |
def activate_weapon(model_name, temp=0.7, max_tokens=512): | |
"""Ativação de armamento cognitivo""" | |
try: | |
tokenizer = AutoTokenizer.from_pretrained(LLM_MODELS[model_name]) | |
pipe = pipeline( | |
"text-generation", | |
model=LLM_MODELS[model_name], | |
tokenizer=tokenizer, | |
device=DEVICE, | |
torch_dtype=TORCH_DTYPE, | |
max_new_tokens=max_tokens, | |
do_sample=True, | |
top_k=50, | |
temperature=temp, | |
model_kwargs={"load_in_4bit": True} if "cuda" in DEVICE else {} | |
) | |
return HuggingFacePipeline(pipeline=pipe) | |
except KeyError: | |
raise ValueError("ARMA NÃO CATALOGADA") | |
except Exception as e: | |
raise RuntimeError(f"FALHA NO SISTEMA DE ARMAMENTO: {str(e)}") | |
# =================================================================== | |
# INTERFACE DE COMBATE | |
# =================================================================== | |
def deploy_combat_interface(): | |
with gr.Blocks(theme=gr.themes.Soft(), title="🔥 WARBOT v2.0") as interface: | |
state = gr.State({ | |
"db": None, | |
"llm": None, | |
"doc_status": False, | |
"model_status": False | |
}) | |
# Zona de Controle Tático | |
with gr.Row(variant="panel"): | |
with gr.Column(scale=1): | |
file_upload = gr.Files(label="CARREGAMENTO DE ALVOS", file_types=[".pdf"]) | |
process_btn = gr.Button("INICIAR PROCESSAMENTO", variant="stop") | |
process_log = gr.Textbox(label="RELATÓRIO DE PROCESSAMENTO", interactive=False) | |
with gr.Column(scale=1): | |
model_selector = gr.Dropdown(list(LLM_MODELS.keys()), label="SELECIONE O ARMAMENTO", value="TinyLlama-1.1B-Chat") | |
temp_slider = gr.Slider(0, 1, 0.7, label="NÍVEL DE AGRESSIVIDADE") | |
deploy_btn = gr.Button("ATIVAR ARMAMENTO", variant="primary") | |
deploy_log = gr.Textbox(label="STATUS DO ARMAMENTO", interactive=False) | |
# Campo de Batalha Principal | |
chatbot = gr.Chatbot(height=650, label="ZONA DE ENGENHARIA COGNITIVA") | |
msg_input = gr.Textbox(label="INSIRA COMANDO DE ATAQUE", placeholder="Aguardando ordens...") | |
clear_btn = gr.Button("LIMPAR CAMPO DE BATALHA") | |
# ===== OPERAÇÕES TÁTICAS ===== | |
def execute_processing(files): | |
try: | |
splits = TacticalDocumentProcessor.neutralize_documents(files) | |
db = VectorStrikeSystem.deploy_vector_db(splits) | |
return { | |
"db": db, | |
"llm": None, | |
"doc_status": True, | |
"model_status": False | |
}, "✅ ALVOS PROCESSADOS COM SUCESSO" | |
except Exception as e: | |
return state.value, f"☠️ FALHA CRÍTICA: {str(e)}" | |
def deploy_weapon(model, temp, current_state): | |
try: | |
if not current_state["doc_status"]: | |
raise RuntimeError("ALVOS NÃO PROCESSADOS! EXECUTE A FASE 1") | |
llm = LLMWeaponsSystem.activate_weapon(model, temp) | |
current_state["llm"] = ConversationalRetrievalChain.from_llm( | |
llm=llm, | |
retriever=current_state["db"].as_retriever(search_kwargs={"k": 3}), | |
memory=ConversationBufferMemory(memory_key="chat_history", return_messages=True), | |
return_source_documents=True | |
) | |
current_state["model_status"] = True | |
return current_state, f"🚀 {model} PRONTO PARA ENGAGEMENT" | |
except Exception as e: | |
return current_state, f"💥 FALHA NO ARMAMENTO: {str(e)}" | |
def execute_engagement(command, history, state): | |
if not state["model_status"]: | |
return command, history + [(command, "⚠️ ARMAMENTO NÃO ATIVADO")] | |
try: | |
result = state["llm"]({"question": command, "chat_history": history}) | |
intel_report = "\n".join( | |
f"🔍 Pg {doc.metadata['page']+1}: {doc.page_content[:100]}..." | |
for doc in result["source_documents"][:3] | |
) | |
return "", history + [ | |
(command, f"🎯 RESPOSTA:\n{result['answer']}\n\n📡 INTELIGÊNCIA:\n{intel_report}") | |
] | |
except Exception as e: | |
return command, history + [(command, f"☢️ FALHA OPERACIONAL: {str(e)}")] | |
def clear_battlefield(): | |
return [] | |
return interface | |
# =================================================================== | |
# INICIALIZAÇÃO DO SISTEMA | |
# =================================================================== | |
if __name__ == "__main__": | |
combat_system = deploy_combat_interface() | |
combat_system.launch( | |
server_name="0.0.0.0", | |
server_port=7860, | |
auth=("commander", "tactical123"), | |
share=True | |
) |