Spaces:
Sleeping
Sleeping
import gradio as gr | |
from transformers import AutoTokenizer, AutoModelForCausalLM | |
import torch | |
from huggingface_hub import login | |
import os | |
import logging | |
from datetime import datetime | |
# Configure logging | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
# Environment variables | |
HF_TOKEN = os.getenv("HUGGING_FACE_TOKEN") | |
MODEL_NAME = os.getenv("MODEL_NAME", "google/gemma-2b-it") | |
class CodeReviewer: | |
def __init__(self): | |
self.model = None | |
self.tokenizer = None | |
self.device = "cpu" | |
self.initialize_model() | |
def initialize_model(self): | |
"""Initialize the model and tokenizer.""" | |
try: | |
if HF_TOKEN: | |
login(token=HF_TOKEN) | |
logger.info("Loading tokenizer...") | |
self.tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
logger.info("Loading model...") | |
self.model = AutoModelForCausalLM.from_pretrained( | |
MODEL_NAME, | |
device_map={"": self.device}, | |
torch_dtype=torch.float32, | |
low_cpu_mem_usage=True | |
) | |
logger.info("Model loaded successfully") | |
except Exception as e: | |
logger.error(f"Error initializing model: {e}") | |
raise | |
def create_review_prompt(self, code: str, language: str) -> str: | |
"""Create a structured prompt for code review.""" | |
return f"""Review this {language} code. List specific points in these sections: | |
Issues: | |
Improvements: | |
Best Practices: | |
Security: | |
Code: | |
```{language} | |
{code} | |
```""" | |
def review_code(self, code: str, language: str) -> str: | |
"""Perform code review using the model.""" | |
try: | |
prompt = self.create_review_prompt(code, language) | |
inputs = self.tokenizer( | |
prompt, | |
return_tensors="pt", | |
truncation=True, | |
max_length=512, | |
padding=True | |
) | |
with torch.no_grad(): | |
outputs = self.model.generate( | |
**inputs, | |
max_new_tokens=512, | |
do_sample=True, | |
temperature=0.7, | |
top_p=0.95, | |
num_beams=1, | |
early_stopping=True | |
) | |
response = self.tokenizer.decode(outputs[0], skip_special_tokens=True) | |
return response[len(prompt):].strip() | |
except Exception as e: | |
logger.error(f"Error during code review: {e}") | |
return f"Error performing code review: {str(e)}" | |
# Initialize the reviewer | |
reviewer = CodeReviewer() | |
def review_code_interface(code: str, language: str) -> str: | |
"""Gradio interface function for code review.""" | |
if not code.strip(): | |
return "Please enter some code to review." | |
try: | |
result = reviewer.review_code(code, language) | |
return result | |
except Exception as e: | |
return f"Error: {str(e)}" | |
# Create Gradio interface | |
iface = gr.Interface( | |
fn=review_code_interface, | |
inputs=[ | |
gr.Textbox( | |
lines=10, | |
placeholder="Enter your code here...", | |
label="Code" | |
), | |
gr.Dropdown( | |
choices=["python", "javascript", "java", "cpp", "typescript", "go", "rust"], | |
value="python", | |
label="Language" | |
) | |
], | |
outputs=gr.Textbox( | |
label="Review Results", | |
lines=10 | |
), | |
title="Code Review Assistant", | |
description="An automated code review system powered by Gemma-2b that provides intelligent code analysis and suggestions for improvements.", | |
examples=[ | |
["""def add_numbers(a, b): | |
return a + b""", "python"], | |
["""function calculateSum(numbers) { | |
let sum = 0; | |
for(let i = 0; i < numbers.length; i++) { | |
sum += numbers[i]; | |
} | |
return sum; | |
}""", "javascript"] | |
], | |
theme=gr.themes.Soft() | |
) | |
# Launch the app | |
if __name__ == "__main__": | |
iface.launch() | |