Joash commited on
Commit
98edac6
·
1 Parent(s): a77dc20

Add history and metrics tabs to Gradio interface

Browse files
Files changed (1) hide show
  1. app.py +149 -27
app.py CHANGED
@@ -5,6 +5,8 @@ from huggingface_hub import login
5
  import os
6
  import logging
7
  from datetime import datetime
 
 
8
 
9
  # Configure logging
10
  logging.basicConfig(level=logging.INFO)
@@ -14,11 +16,25 @@ logger = logging.getLogger(__name__)
14
  HF_TOKEN = os.getenv("HUGGING_FACE_TOKEN")
15
  MODEL_NAME = os.getenv("MODEL_NAME", "google/gemma-2b-it")
16
 
 
 
 
 
 
 
 
 
17
  class CodeReviewer:
18
  def __init__(self):
19
  self.model = None
20
  self.tokenizer = None
21
  self.device = "cpu"
 
 
 
 
 
 
22
  self.initialize_model()
23
 
24
  def initialize_model(self):
@@ -58,6 +74,7 @@ Code:
58
  def review_code(self, code: str, language: str) -> str:
59
  """Perform code review using the model."""
60
  try:
 
61
  prompt = self.create_review_prompt(code, language)
62
 
63
  inputs = self.tokenizer(
@@ -80,12 +97,60 @@ Code:
80
  )
81
 
82
  response = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
83
- return response[len(prompt):].strip()
 
 
 
 
 
 
 
 
 
 
 
84
 
85
  except Exception as e:
86
  logger.error(f"Error during code review: {e}")
87
  return f"Error performing code review: {str(e)}"
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  # Initialize the reviewer
90
  reviewer = CodeReviewer()
91
 
@@ -100,40 +165,97 @@ def review_code_interface(code: str, language: str) -> str:
100
  except Exception as e:
101
  return f"Error: {str(e)}"
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  # Create Gradio interface
104
- iface = gr.Interface(
105
- fn=review_code_interface,
106
- inputs=[
107
- gr.Textbox(
108
- lines=10,
109
- placeholder="Enter your code here...",
110
- label="Code"
111
- ),
112
- gr.Dropdown(
113
- choices=["python", "javascript", "java", "cpp", "typescript", "go", "rust"],
114
- value="python",
115
- label="Language"
116
- )
117
- ],
118
- outputs=gr.Textbox(
119
- label="Review Results",
120
- lines=10
121
- ),
122
- title="Code Review Assistant",
123
- description="An automated code review system powered by Gemma-2b that provides intelligent code analysis and suggestions for improvements.",
124
- examples=[
125
- ["""def add_numbers(a, b):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  return a + b""", "python"],
127
- ["""function calculateSum(numbers) {
128
  let sum = 0;
129
  for(let i = 0; i < numbers.length; i++) {
130
  sum += numbers[i];
131
  }
132
  return sum;
133
  }""", "javascript"]
134
- ],
135
- theme=gr.themes.Soft()
136
- )
137
 
138
  # Launch the app
139
  if __name__ == "__main__":
 
5
  import os
6
  import logging
7
  from datetime import datetime
8
+ import json
9
+ from typing import List, Dict
10
 
11
  # Configure logging
12
  logging.basicConfig(level=logging.INFO)
 
16
  HF_TOKEN = os.getenv("HUGGING_FACE_TOKEN")
17
  MODEL_NAME = os.getenv("MODEL_NAME", "google/gemma-2b-it")
18
 
19
+ class Review:
20
+ def __init__(self, code: str, language: str, suggestions: str):
21
+ self.code = code
22
+ self.language = language
23
+ self.suggestions = suggestions
24
+ self.timestamp = datetime.now().isoformat()
25
+ self.response_time = 0.0
26
+
27
  class CodeReviewer:
28
  def __init__(self):
29
  self.model = None
30
  self.tokenizer = None
31
  self.device = "cpu"
32
+ self.review_history: List[Review] = []
33
+ self.metrics = {
34
+ 'total_reviews': 0,
35
+ 'avg_response_time': 0.0,
36
+ 'reviews_today': 0
37
+ }
38
  self.initialize_model()
39
 
40
  def initialize_model(self):
 
74
  def review_code(self, code: str, language: str) -> str:
75
  """Perform code review using the model."""
76
  try:
77
+ start_time = datetime.now()
78
  prompt = self.create_review_prompt(code, language)
79
 
80
  inputs = self.tokenizer(
 
97
  )
98
 
99
  response = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
100
+ suggestions = response[len(prompt):].strip()
101
+
102
+ # Create review and update metrics
103
+ end_time = datetime.now()
104
+ review = Review(code, language, suggestions)
105
+ review.response_time = (end_time - start_time).total_seconds()
106
+ self.review_history.append(review)
107
+
108
+ # Update metrics
109
+ self.update_metrics(review)
110
+
111
+ return suggestions
112
 
113
  except Exception as e:
114
  logger.error(f"Error during code review: {e}")
115
  return f"Error performing code review: {str(e)}"
116
 
117
+ def update_metrics(self, review: Review):
118
+ """Update metrics with new review."""
119
+ self.metrics['total_reviews'] += 1
120
+
121
+ # Update average response time
122
+ total_time = self.metrics['avg_response_time'] * (self.metrics['total_reviews'] - 1)
123
+ total_time += review.response_time
124
+ self.metrics['avg_response_time'] = total_time / self.metrics['total_reviews']
125
+
126
+ # Update reviews today
127
+ today = datetime.now().date()
128
+ self.metrics['reviews_today'] = sum(
129
+ 1 for r in self.review_history
130
+ if datetime.fromisoformat(r.timestamp).date() == today
131
+ )
132
+
133
+ def get_history(self) -> List[Dict]:
134
+ """Get formatted review history."""
135
+ return [
136
+ {
137
+ 'timestamp': r.timestamp,
138
+ 'language': r.language,
139
+ 'code': r.code,
140
+ 'suggestions': r.suggestions,
141
+ 'response_time': f"{r.response_time:.2f}s"
142
+ }
143
+ for r in reversed(self.review_history[-10:]) # Last 10 reviews
144
+ ]
145
+
146
+ def get_metrics(self) -> Dict:
147
+ """Get current metrics."""
148
+ return {
149
+ 'Total Reviews': self.metrics['total_reviews'],
150
+ 'Average Response Time': f"{self.metrics['avg_response_time']:.2f}s",
151
+ 'Reviews Today': self.metrics['reviews_today']
152
+ }
153
+
154
  # Initialize the reviewer
155
  reviewer = CodeReviewer()
156
 
 
165
  except Exception as e:
166
  return f"Error: {str(e)}"
167
 
168
+ def get_history_interface() -> str:
169
+ """Format history for display."""
170
+ history = reviewer.get_history()
171
+ if not history:
172
+ return "No reviews yet."
173
+
174
+ result = ""
175
+ for review in history:
176
+ result += f"Time: {review['timestamp']}\n"
177
+ result += f"Language: {review['language']}\n"
178
+ result += f"Response Time: {review['response_time']}\n"
179
+ result += "Code:\n```\n" + review['code'] + "\n```\n"
180
+ result += "Suggestions:\n" + review['suggestions'] + "\n"
181
+ result += "-" * 80 + "\n\n"
182
+ return result
183
+
184
+ def get_metrics_interface() -> Dict:
185
+ """Get metrics for display."""
186
+ return reviewer.get_metrics()
187
+
188
  # Create Gradio interface
189
+ with gr.Blocks(theme=gr.themes.Soft()) as iface:
190
+ gr.Markdown("# Code Review Assistant")
191
+ gr.Markdown("An automated code review system powered by Gemma-2b")
192
+
193
+ with gr.Tabs():
194
+ with gr.Tab("Review Code"):
195
+ with gr.Row():
196
+ with gr.Column():
197
+ code_input = gr.Textbox(
198
+ lines=10,
199
+ placeholder="Enter your code here...",
200
+ label="Code"
201
+ )
202
+ language_input = gr.Dropdown(
203
+ choices=["python", "javascript", "java", "cpp", "typescript", "go", "rust"],
204
+ value="python",
205
+ label="Language"
206
+ )
207
+ submit_btn = gr.Button("Submit for Review")
208
+ with gr.Column():
209
+ output = gr.Textbox(
210
+ label="Review Results",
211
+ lines=10
212
+ )
213
+
214
+ with gr.Tab("History"):
215
+ refresh_history = gr.Button("Refresh History")
216
+ history_output = gr.Textbox(
217
+ label="Review History",
218
+ lines=20,
219
+ value=get_history_interface()
220
+ )
221
+
222
+ with gr.Tab("Metrics"):
223
+ refresh_metrics = gr.Button("Refresh Metrics")
224
+ metrics_output = gr.JSON(
225
+ label="Performance Metrics",
226
+ value=get_metrics_interface()
227
+ )
228
+
229
+ # Set up event handlers
230
+ submit_btn.click(
231
+ review_code_interface,
232
+ inputs=[code_input, language_input],
233
+ outputs=output
234
+ )
235
+ refresh_history.click(
236
+ get_history_interface,
237
+ outputs=history_output
238
+ )
239
+ refresh_metrics.click(
240
+ get_metrics_interface,
241
+ outputs=metrics_output
242
+ )
243
+
244
+ # Add example inputs
245
+ gr.Examples(
246
+ examples=[
247
+ ["""def add_numbers(a, b):
248
  return a + b""", "python"],
249
+ ["""function calculateSum(numbers) {
250
  let sum = 0;
251
  for(let i = 0; i < numbers.length; i++) {
252
  sum += numbers[i];
253
  }
254
  return sum;
255
  }""", "javascript"]
256
+ ],
257
+ inputs=[code_input, language_input]
258
+ )
259
 
260
  # Launch the app
261
  if __name__ == "__main__":