testeappb / app.py
nsv2042's picture
Update app.py
a312056 verified
import gradio as gr
import shutil
import os
from zipfile import ZipFile
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# Diretório temporário para os uploads
UPLOAD_DIR = "uploaded_files"
# Variável global para armazenar o código dos arquivos .java
java_files_content = {}
# Carregar o modelo e o tokenizador do CodeBERT
tokenizer = AutoTokenizer.from_pretrained("microsoft/codebert-base")
model = AutoModelForCausalLM.from_pretrained("microsoft/codebert-base")
# Função para processar a pasta enviada
def process_uploaded_folder(zip_path):
# Descompactar o arquivo ZIP
folder_path = os.path.join(UPLOAD_DIR, "source_code")
with ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(folder_path)
# Ler os arquivos Java e armazenar seu conteúdo
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith(".java"):
file_path = os.path.join(root, file)
with open(file_path, 'r', encoding='utf-8') as f:
java_files_content[file] = f.read() # Armazenar conteúdo dos arquivos .java
shutil.rmtree(folder_path) # Limpar arquivos temporários
# Função para responder ao chat
def chat_with_codebert(chat_history, user_input):
try:
# Se o usuário pedir para buscar algo no código
if "mostrar" in user_input or "variável" in user_input or "função" in user_input:
# Pesquisar no código armazenado
search_term = user_input.split("mostrar")[-1].strip() # Exemplo de como pegar o termo a ser buscado
response = search_in_code(search_term)
else:
# Caso contrário, apenas gerar uma resposta genérica com o histórico de chat
chat_prompt = f"Histórico do chat:\n{chat_history}\nUsuário: {user_input}\nIA:"
response = generate_codebert_response(chat_prompt)
return response
except Exception as e:
return f"Erro ao processar a resposta da IA: {e}"
# Função para procurar por termos no código Java
def search_in_code(search_term):
results = []
for filename, content in java_files_content.items():
if search_term.lower() in content.lower():
# Adiciona o nome do arquivo e um trecho do código onde foi encontrado
results.append(f"Arquivo: {filename}\n{content[:300]}...") # Exibe os primeiros 300 caracteres do código
if not results:
return "Não encontrei nada relacionado ao seu pedido no código."
return "\n\n".join(results)
# Função para gerar respostas do modelo CodeBERT
def generate_codebert_response(prompt):
# Tokenize the input
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, padding=True, max_length=512)
with torch.no_grad():
outputs = model.generate(**inputs, max_length=512, num_return_sequences=1)
# Decodificar a resposta gerada
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
return response
# Interface de upload
def upload_and_analyze(zip_file_path):
# Salvar o arquivo ZIP enviado
if not os.path.exists(UPLOAD_DIR):
os.makedirs(UPLOAD_DIR)
# Processar o ZIP para extrair os arquivos Java
try:
process_uploaded_folder(zip_file_path)
finally:
if os.path.exists(zip_file_path):
os.remove(zip_file_path) # Remover o arquivo ZIP após processamento
return "Código Java carregado com sucesso. Pergunte-me sobre o código!"
# Interface gráfica com Gradio
with gr.Blocks() as demo:
gr.Markdown("# Analisador de Código Java com CodeBERT 🚀")
with gr.Tab("Upload e Análise"):
upload_input = gr.File(label="Envie um arquivo ZIP com o código Java", type="filepath")
analysis_output = gr.Textbox(label="Resultado da Análise", lines=5)
analyze_button = gr.Button("Analisar")
analyze_button.click(upload_and_analyze, inputs=upload_input, outputs=analysis_output)
with gr.Tab("Chat com a IA"):
chat_history = gr.State(value="")
chat_input = gr.Textbox(label="Digite sua mensagem")
chat_output = gr.Textbox(label="Resposta da IA")
chat_button = gr.Button("Enviar")
chat_button.click(chat_with_codebert, inputs=[chat_history, chat_input], outputs=chat_output)
# Executar a aplicação
if __name__ == "__main__":
demo.launch()