File size: 1,756 Bytes
e804d56
2c583db
e804d56
2c583db
 
 
 
 
e804d56
6f42ff1
2c583db
e804d56
 
 
19dc357
 
 
 
 
 
e804d56
 
 
 
aa6ef3b
2c583db
 
 
e804d56
 
 
 
 
 
2c583db
915bcb7
e804d56
 
ab430b6
e804d56
 
 
 
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
import gradio as gr
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM

def load_model():
    model_name = "Salesforce/codet5-small"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
    return pipeline("summarization", model=model, tokenizer=tokenizer)

def explain_code(files):
    explainer = load_model()
    explanations = []
    for file in files:
        filename = file.name if hasattr(file, 'name') else 'Uploaded File'
        if isinstance(file, bytes):
            code = file.decode('utf-8')
        elif hasattr(file, 'read'):
            code = file.read().decode('utf-8')
        else:
            code = str(file)
        lines = code.splitlines()
        line_explanations = []
        for idx, line in enumerate(lines):
            if not line.strip():
                continue
            input_length = len(line.split())
            max_length = max(1, input_length // 2)
            result = explainer(line, max_length=max_length, do_sample=False)[0].get('summary_text', '')
            line_explanations.append(f"Line {idx+1}: {line}\nExplanation: {result.strip()}\n")
        explanations.append(f"## {filename}\n" + "\n".join(line_explanations))
    return "\n\n".join(explanations)

def main():
    with gr.Blocks() as demo:
        gr.Markdown("# CodeExplainerBot (Local CodeT5-small)")
        code_input = gr.File(label="Upload code files", file_count="multiple", type="binary")
        output = gr.Textbox(label="Line-by-line Explanation", lines=20)
        explain_btn = gr.Button("Explain Code")
        explain_btn.click(fn=explain_code, inputs=[code_input], outputs=output)
    demo.launch()

if __name__ == "__main__":
    main()