Doggo619/Intelligent_Code_Review_And_Bug_Detection_Agent
0
1import os2import re3import ast4import json5 6from uuid import uuid47from typing import Dict, Any, Optional8 9from google.genai import types10from google.adk.agents import LlmAgent11from google.adk.runners import InMemoryRunner12from google.adk.models.google_llm import Gemini13 14print("โ
Imports loaded.")15 16retry_config = types.HttpRetryOptions(17 attempts=5, # Maximum retry attempts18 exp_base=7, # Delay multiplier19 initial_delay=1,20 http_status_codes=[429, 500, 503, 504], # Retry on these HTTP errors21)22 23 24# ================================================================25# 3. Tools (Kaggle-compatible)26# ================================================================27 28def detect_language(code: str):29 """30 Let the LLM determine the language.31 """32 return {33 "request": f"Detect the programming language of the following code snippet:\n\n{code}"34 }35 36def check_documentation_quality(code: str, language: str="python"):37 issues = []38 try:39 tree = ast.parse(code)40 for node in ast.walk(tree):41 if isinstance(node, ast.FunctionDef) and not ast.get_docstring(node):42 issues.append(f"Missing docstring in {node.name}")43 except:44 issues.append("Syntax error during parsing")45 46 return {47 "status": "success",48 "issues": issues,49 "summary": f"{len(issues)} documentation issues found."50 }51 52def analyze_code_complexity(code: str, language: Optional[str] = None):53 blocks = len(re.findall(r"\b(if|for|while|switch|try|catch)\b", code))54 nesting = code.count("{") if "{" in code else code.count(" ")55 complexity_score = blocks + (nesting // 2)56 57 level = "Low"58 if complexity_score >= 10:59 level = "High"60 elif complexity_score >= 5:61 level = "Medium"62 63 return {64 "status": "success",65 "language": language or "auto",66 "complexity_score": complexity_score,67 "complexity_level": level,68 "summary": f"Estimated complexity: {level} ({complexity_score})."69 }70 71 72def detect_code_patterns(code: str, language: Optional[str] = None):73 issues = []74 75 if "catch(Exception" in code and "{}" in code:76 issues.append("Java: Empty catch block")77 if "Runtime.getRuntime().exec" in code:78 issues.append("Java: Dangerous exec() call")79 80 if "except:" in code:81 issues.append("Python: Bare except detected")82 if "eval(" in code:83 issues.append("Python/JS: eval() is dangerous")84 85 if "document.querySelector" in code and "innerHTML" in code:86 issues.append("JS: Potential XSS")87 88 if re.search(r"map\([^)]*\)\s*<", code) and "key=" not in code:89 issues.append("React: Missing key in list rendering")90 91 if "<script>" in code:92 issues.append("HTML: Inline script detected")93 94 if "!!" in code:95 issues.append("Kotlin: Risky non-null assertion (!!)")96 97 return {98 "status": "success",99 "language": language or "auto",100 "issues": issues,101 "summary": f"{len(issues)} issue(s) detected."102 }103 104 105def run_static_analysis(code: str, language: Optional[str] = None):106 issues = []107 108 if code.count("{") != code.count("}"):109 issues.append("Unmatched { } braces")110 if code.count("(") != code.count(")"):111 issues.append("Unmatched ( ) parentheses")112 if "<" in code and code.count("<") != code.count(">"):113 issues.append("Unmatched HTML/XML tags")114 115 if "return" in code and code.strip().split("return")[-1].strip():116 issues.append("Possible unreachable code after return")117 118 if language in ["java", "kotlin"] and ";" not in code:119 issues.append("Possible missing semicolons")120 121 return {122 "status": "success",123 "language": language or "auto",124 "issues": issues,125 "summary": f"{len(issues)} static issue(s) detected."126 }127 128 129def full_analysis(code: str) -> dict:130 return {131 "language": detect_language(code),132 "complexity": analyze_code_complexity(code),133 "patterns": detect_code_patterns(code),134 "static": run_static_analysis(code),135 "docs": check_documentation_quality(code)136 }137 138 139print("๐ Tools ready.")140 141 142# ------------------------------143# Create the Agent Object144# ------------------------------145root_agent = LlmAgent(146 name="CodeReviewAgent",147 model=Gemini(model="gemini-2.5-flash-lite", retry_options=retry_config),148 instruction="""149You are a senior code reviewer.150 151Call ONLY the tool `full_analysis`.152Call it exactly once.153After the tool output, produce ONE final response.154Never repeat your analysis. Never duplicate any section.155 156Your output must contain:157 158Bugs:159Security issues:160Code smells:161Bad practices:162Documentation issues:163Performance issues:164Suggestions:165Improved Code:166""",167 tools=[full_analysis]168)169 170runner = InMemoryRunner(root_agent)171 172 173async def review_code(code: str):174 events = await runner.run_debug(code)175 176 for event in events:177 if event.is_final_response():178 content = getattr(event, "content", None)179 if content and content.parts:180 for part in content.parts:181 if getattr(part, "text", None):182 return part.text183 184 return "No final response found."