{ "cells": [ { "cell_type": "markdown", "id": "07bb451d-2b91-425f-b8ea-6f35ced780b0", "metadata": {}, "source": [ "# AI Code Commenting Assistant \n", "\n", "## Project Summary \n", "\n", "**Purpose**: \n", "An AI-powered assistant that automatically generates **clear, concise code comments** to improve code readability and maintainability. \n", "\n", "**Key Features**: \n", "- **Language-Agnostic**: Auto-detects programming languages or allows manual specification \n", "- **Smart Commenting**: Focuses on explaining **complex logic, algorithms, and edge cases** (not obvious syntax) \n", "- **Customizable**: Optional focus areas let users prioritize specific parts (e.g., database queries, recursion) \n", "- **Efficient Workflow**: Processes code in chunks and preserves original formatting \n", "\n", "**Benefits**: \n", "✔ Saves time writing documentation \n", "✔ Helps developers understand unfamiliar code \n", "✔ Supports multiple languages (Python, JavaScript, C++, SQL, etc.) \n", "✔ Avoids redundant comments on trivial operations \n", "\n", "**Example Use Case**: \n", "```python \n", "# Before AI: \n", "def fib(n): \n", " if n <= 1: return n \n", " else: return fib(n-1) + fib(n-2) \n", "\n", "# After AI: \n", "def fib(n): \n", " # Recursively computes nth Fibonacci number (O(2^n) time) \n", " if n <= 1: return n # Base case \n", " else: return fib(n-1) + fib(n-2) # Recursive case " ] }, { "cell_type": "code", "execution_count": null, "id": "a0413ae1-0348-4884-ba95-384c4c8f841c", "metadata": {}, "outputs": [], "source": [ "!pip install --upgrade huggingface_hub" ] }, { "cell_type": "code", "execution_count": null, "id": "b22da766-042b-402f-9e05-78aa8f45ddd4", "metadata": {}, "outputs": [], "source": [ "import os\n", "import io\n", "from dotenv import load_dotenv\n", "from google import genai\n", "from google.genai import types\n", "from openai import OpenAI\n", "from anthropic import Anthropic\n", "from huggingface_hub import InferenceClient\n", "import gradio as gr" ] }, { "cell_type": "code", "execution_count": null, "id": "5af6d3de-bab6-475e-b2f3-7b788bb2e529", "metadata": {}, "outputs": [], "source": [ "# load environments\n", "load_dotenv(override=True)\n", "os.environ['ANTHROPIC_API_KEY'] = os.getenv(\"CLAUDE_API_KEY\")\n", "os.environ[\"HF_TOKEN\"] = os.getenv(\"HF_TOKEN\")\n", "gemini_api_key= os.getenv(\"GEMINI_API_KEY\")" ] }, { "cell_type": "code", "execution_count": null, "id": "cad0755e-4174-4fbc-84e6-15cc54bc609a", "metadata": {}, "outputs": [], "source": [ "#initialize remote models\n", "claude= Anthropic()\n", "gemini = genai.Client(api_key=gemini_api_key)\n", "\n", "#opensource models\n", "qwen = InferenceClient(provider=\"featherless-ai\")" ] }, { "cell_type": "code", "execution_count": null, "id": "31d75812-1cd3-4512-8446-022c3357c354", "metadata": {}, "outputs": [], "source": [ "#initialize local model\n", "llama = OpenAI(base_url=\"http://localhost:11434/v1\", api_key=\"ollama\")" ] }, { "cell_type": "code", "execution_count": null, "id": "31316379-2a56-4707-b207-ea60b490f536", "metadata": {}, "outputs": [], "source": [ "#models\n", "claude_model = \"claude-3-5-haiku-latest\"\n", "gemini_model = \"gemini-2.5-pro\"\n", "qwen_model= \"Qwen/Qwen2.5-Coder-32B-Instruct\"\n", "llama_model = \"llama3:8b\"" ] }, { "cell_type": "code", "execution_count": null, "id": "b7d9c4bf-0955-4406-8717-ffa7bdd0bec9", "metadata": {}, "outputs": [], "source": [ "system_message=\"\"\"\n", "You are an expert AI specialized in code documentation. Your task is to generate concise, meaningful comments that explain the purpose and logic of provided code. Follow these rules:\n", "\n", "1. **Infer language**: Auto-detect programming language and use appropriate comment syntax\n", "2. **Explain why, not what**: Focus on purpose, edge cases, and non-obvious logic\n", "3. **Be concise**: Maximum 1-2 sentences per comment block\n", "4. **Prioritize key sections**: Only comment complex logic, algorithms, or critical operations\n", "5. **Maintain structure**: Preserve original code formatting and indentation\n", "6. **Output format**: Return ONLY commented code with no additional text\n", "\n", "Commenting guidelines by language:\n", "- Python: `# Inline comments` and `\"\"Docstrings\"\"`\n", "- JavaScript/Java: `// Line comments` and `/* Block comments */`\n", "- C/C++: `//` and `/* */`\n", "- SQL: `-- Line comments`\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "id": "79dfe110-1523-40c7-ad90-2787ed22fd8d", "metadata": {}, "outputs": [], "source": [ "def user_prompt(code):\n", " prompt = f\"\"\"\n", " i want to document my code for better understanding. Please generate meaningful necessary comments\n", " here is my code:\n", " {code}\n", "\n", " Return ONLY commented code with no additional text\n", " \"\"\"\n", "\n", " return prompt" ] }, { "cell_type": "code", "execution_count": null, "id": "c7bcf29e-ec78-4cfd-9b41-f2dc86400435", "metadata": {}, "outputs": [], "source": [ "def conversation_template(code):\n", " messages = [\n", " {\"role\":\"system\", \"content\":system_message},\n", " {\"role\":\"user\",\"content\":user_prompt(code)}\n", " ]\n", " return messages" ] }, { "cell_type": "code", "execution_count": null, "id": "a36fec0f-7eba-4ccd-8fc4-cbf5ade76fa2", "metadata": {}, "outputs": [], "source": [ "def stream_gemini(code):\n", " message = user_prompt(code)\n", " response = gemini.models.generate_content_stream(\n", " model=gemini_model,\n", " config= types.GenerateContentConfig(\n", " system_instruction = system_message,\n", " temperature = 0.8,\n", " ),\n", " contents = [message]\n", " )\n", "\n", " result = \"\"\n", " for chunk in response:\n", " result += chunk.text or \"\"\n", " yield result" ] }, { "cell_type": "code", "execution_count": null, "id": "e5d1e0c0-dc88-43ee-8698-82ad9ce7c51b", "metadata": {}, "outputs": [], "source": [ "def stream_claude(code):\n", " messages = [{\"role\":\"user\",\"content\":user_prompt(code)}]\n", " response = claude.messages.stream(\n", " model= claude_model,\n", " temperature=0.8,\n", " messages = messages,\n", " max_tokens=5000\n", " )\n", "\n", " result = \"\"\n", " with response as stream:\n", " for text in stream.text_stream:\n", " result += text or \"\"\n", " yield result\n", " " ] }, { "cell_type": "code", "execution_count": null, "id": "903c97e5-9170-449e-8a0f-9f906351ec45", "metadata": {}, "outputs": [], "source": [ "def stream_opensource(code,model):\n", " model = model.lower()\n", " client = globals()[model]\n", " model = globals()[f\"{model}_model\"]\n", " stream = client.chat.completions.create(\n", " model = model,\n", " messages= conversation_template(code),\n", " temperature = 0.7,\n", " stream = True\n", " )\n", "\n", " result = \"\"\n", " for chunk in stream:\n", " result += chunk.choices[0].delta.content or \"\"\n", " yield result" ] }, { "cell_type": "code", "execution_count": null, "id": "ff051c22-a2f8-4153-b970-f8a466a4cf5a", "metadata": {}, "outputs": [], "source": [ "def commentor(code, model):\n", " model =model.lower()\n", " if model == \"claude\":\n", " result = stream_claude(code)\n", " elif model == \"gemini\":\n", " result = stream_gemini(code)\n", " elif model == \"qwen\" or model == \"llama\":\n", " result = stream_opensource(code, model)\n", "\n", "\n", " for code in result:\n", " yield code.replace(\"```cpp\\n\",\"\").replace(\"```python\\n\",\"\").replace(\"```javascript\\n\",\"\").replace(\"```typescript\\n\",\"\").replace(\"```\",\"\")" ] }, { "cell_type": "code", "execution_count": null, "id": "10daf070-3546-4073-a2a0-3f5f8fc156f0", "metadata": {}, "outputs": [], "source": [ "with gr.Blocks() as ui:\n", " gr.Markdown(\"# Genarate comment\")\n", " with gr.Row():\n", " raw_code = gr.Textbox(label=\"Raw Code:\", lines=10)\n", " commented_code = gr.Textbox(label=\"Commented_code\",lines=10)\n", " with gr.Row():\n", " models = gr.Dropdown([\"Gemini\",\"Claude\",\"Llama\",\"Qwen\"], value=\"Gemini\")\n", " with gr.Row():\n", " generate_comment = gr.Button(\"Generate Comment\")\n", "\n", " generate_comment.click(commentor, inputs=[raw_code, models], outputs=[commented_code])" ] }, { "cell_type": "code", "execution_count": null, "id": "afb87f32-f25e-40c5-844a-d2b7af748192", "metadata": {}, "outputs": [], "source": [ "ui.launch(inbrowser=True,debug=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "96bc48ad-10ad-4821-b58e-ea1b22cdcdc9", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.13" } }, "nbformat": 4, "nbformat_minor": 5 }