File size: 4,443 Bytes
41ac869 a312056 42f7785 41ac869 848d61f a312056 dbf157f a312056 42f7785 41ac869 848d61f 41ac869 848d61f 41ac869 7740f19 848d61f 42f7785 848d61f 7740f19 41ac869 848d61f a312056 848d61f 42f7785 a312056 42f7785 41ac869 94b75d8 41ac869 848d61f 7740f19 848d61f 7740f19 94b75d8 848d61f 41ac869 848d61f 41ac869 848d61f 41ac869 7740f19 41ac869 |
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 |
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()
|