Team Ai
Apppublic

Doggo619/Intelligent_Code_Review_And_Bug_Detection_Agent

sourceHugging Faceapache-2.0updated 11mo agoView on Hugging Face
0likes
agent.py184 linesDownload Raw Back to root
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."