From 835e0070230a00e728c5a1173e04cbd3cc3f54d2 Mon Sep 17 00:00:00 2001 From: haddybhaiya Date: Wed, 25 Mar 2026 10:08:11 +0530 Subject: [PATCH 1/8] add : embedder.py for sentence func/fix req.txt --- agent/indexing/embedder.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 agent/indexing/embedder.py diff --git a/agent/indexing/embedder.py b/agent/indexing/embedder.py new file mode 100644 index 0000000..ca3a614 --- /dev/null +++ b/agent/indexing/embedder.py @@ -0,0 +1,4 @@ +from senetence_transformers import SentenceTransformer +model = SentenceTransformer('all-MiniLM-L6-v2') +def get_embeddings(chunks): + return model.encode(chunks) \ No newline at end of file From 334640c94b504288ae098df538cec570f1187ea8 Mon Sep 17 00:00:00 2001 From: haddybhaiya Date: Wed, 25 Mar 2026 10:09:50 +0530 Subject: [PATCH 2/8] fix : redundant calls --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2e86364..7a46841 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,5 +7,3 @@ chromadb tree-sitter sentence-transformers groq -PyGithub -chromadb \ No newline at end of file From 10cdc498620c7906cc18fc71786f80e491e1f57c Mon Sep 17 00:00:00 2001 From: haddybhaiya Date: Wed, 25 Mar 2026 15:53:36 +0530 Subject: [PATCH 3/8] check : branch working with test comment --- agent/llm/groq_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/llm/groq_client.py b/agent/llm/groq_client.py index 3c33699..73da9d6 100644 --- a/agent/llm/groq_client.py +++ b/agent/llm/groq_client.py @@ -28,6 +28,7 @@ def generate_review(diff: str) -> str: except Exception as e: return f"Error generating review: {str(e)}" +#local test for generate review function if __name__ == "__main__": test_diff = """ diff --git a/app.py b/app.py From 77698a62e341722a85a9d56df5f7f1f0abe03ce1 Mon Sep 17 00:00:00 2001 From: haddybhaiya Date: Wed, 25 Mar 2026 16:07:07 +0530 Subject: [PATCH 4/8] update : included context param in generate_review func for insights --- agent/llm/groq_client.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/agent/llm/groq_client.py b/agent/llm/groq_client.py index 73da9d6..a2faced 100644 --- a/agent/llm/groq_client.py +++ b/agent/llm/groq_client.py @@ -7,17 +7,31 @@ client = Groq(api_key=os.getenv("GROQ_API_KEY")) model = MODEL -def generate_review(diff: str) -> str: +def generate_review(diff: str,context : list = None) -> str: from agent.llm.prompts import REVIEW_PROMPT if not diff.strip(): return "No changes found to review." - prompt = REVIEW_PROMPT.format(diff=diff[:8000]) + # prompt = REVIEW_PROMPT.format(diff=diff[:8000]) + '''preparing context''' + context_text = "" + if context: + context_text = "\n\n".join(context[:5]) # Include up to 5 context items(limitting) + prompt = f""" + You are an AI code reviewer. Use the provided repository context (if available) to give better insights. + + ---CONTEXT--- + {context_text} + ---DIFF--- + {diff[:8000]} # Limiting the diff to the first 8000 characters for better performance. + ---TASK--- + {REVIEW_PROMPT} + """ try: response = client.chat.completions.create( - model="llama-3.3-70b-versatile", + model=model, messages=[ {"role": "user", "content": prompt} ], @@ -32,9 +46,14 @@ def generate_review(diff: str) -> str: if __name__ == "__main__": test_diff = """ diff --git a/app.py b/app.py -+ def add(a, b): -+ return a + b ++ def divide(a, b): ++ return a / b """ - result = generate_review(test_diff) - print(result) + test_context = [ + "def safe_divide(a, b): return a / b if b != 0 else 0", + "Utility functions for math operations" + ] + + result = generate_review(test_diff, context=test_context) #added conetxt parameter (kindly see @pleasingsunlight) + print(result) \ No newline at end of file From 666d61128231cdf1e0238770db6751092512c7b8 Mon Sep 17 00:00:00 2001 From: haddybhaiya Date: Wed, 25 Mar 2026 16:23:41 +0530 Subject: [PATCH 5/8] refactor : context handling and revised prompt.py --- agent/llm/groq_client.py | 10 ++++++++-- agent/llm/prompts.py | 21 ++++++++++----------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/agent/llm/groq_client.py b/agent/llm/groq_client.py index a2faced..9868b8f 100644 --- a/agent/llm/groq_client.py +++ b/agent/llm/groq_client.py @@ -14,19 +14,25 @@ def generate_review(diff: str,context : list = None) -> str: return "No changes found to review." # prompt = REVIEW_PROMPT.format(diff=diff[:8000]) + MAX_CONTEXT_CHARS = 5000 + '''preparing context''' context_text = "" if context: - context_text = "\n\n".join(context[:5]) # Include up to 5 context items(limitting) + combined = "\n\n".join(context) # Include up to 5 context items(limitting) + context_text = combined[:MAX_CONTEXT_CHARS] prompt = f""" You are an AI code reviewer. Use the provided repository context (if available) to give better insights. ---CONTEXT--- {context_text} + ---DIFF--- - {diff[:8000]} # Limiting the diff to the first 8000 characters for better performance. + {diff[:8000]} + ---TASK--- {REVIEW_PROMPT} + """ try: diff --git a/agent/llm/prompts.py b/agent/llm/prompts.py index c7a2115..1365eff 100644 --- a/agent/llm/prompts.py +++ b/agent/llm/prompts.py @@ -1,6 +1,7 @@ -REVIEW_PROMPT = """ -You are a senior code reviewer. -Analyze the following git diff and respond STRICTLY in this format: +REVIEW_PROMPT = """ +Analyze the code changes using the provided DIFF and CONTEXT. + +Return output STRICTLY in this format: ### Bugs - List any bugs (or write "None") @@ -9,13 +10,11 @@ - Code quality improvements ### Suggestions -- Better practices or optimizations - -If everything looks good, say: "Code looks good ✅" -format output clearly using bullet points. - -Keep it concise. +- Best practices or optimizations -Diff: -{diff} +Rules: +- Be concise +- Do NOT repeat the diff +- Use context if helpful +- If everything looks good, say: "Code looks good ✅" """ \ No newline at end of file From a4adb056ededa99c19ac81faec88fceb95973428 Mon Sep 17 00:00:00 2001 From: Priyanshu Kumar Date: Thu, 26 Mar 2026 13:13:40 +0530 Subject: [PATCH 6/8] Phase 2: integrate RAG pipeline with context-aware review --- agent/indexing/chunker.py | 5 +++ agent/indexing/parser.py | 9 +++++ agent/main.py | 71 +++++++++++++++++++++++++++++++++------ requirements.txt | 2 +- 4 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 agent/indexing/chunker.py create mode 100644 agent/indexing/parser.py diff --git a/agent/indexing/chunker.py b/agent/indexing/chunker.py new file mode 100644 index 0000000..b0f1050 --- /dev/null +++ b/agent/indexing/chunker.py @@ -0,0 +1,5 @@ +def chunk_code(code: str, chunk_size=300): + chunks = [] + for i in range(0, len(code), chunk_size): + chunks.append(code[i:i+chunk_size]) + return chunks \ No newline at end of file diff --git a/agent/indexing/parser.py b/agent/indexing/parser.py new file mode 100644 index 0000000..1cbceb6 --- /dev/null +++ b/agent/indexing/parser.py @@ -0,0 +1,9 @@ +import os + +def get_code_files(root_dir="."): + code_files = [] + for root, _, files in os.walk(root_dir): + for file in files: + if file.endswith(".py"): + code_files.append(os.path.join(root, file)) + return code_files \ No newline at end of file diff --git a/agent/main.py b/agent/main.py index d939501..779bf01 100644 --- a/agent/main.py +++ b/agent/main.py @@ -1,27 +1,78 @@ +from agent.indexing.parser import get_code_files +from agent.indexing.chunker import chunk_code +from agent.indexing.embedder import get_embeddings +from agent.indexing.vector_store import store_embeddings, query_embeddings + import subprocess from agent.llm.groq_client import generate_review from agent.github.commenter import post_comment def get_pr_diff(): try: diff = subprocess.check_output( - ["git","diff","origin/main...HEAD"], - text = True + ["git", "diff", "HEAD~1", "HEAD"], + text=True ) return diff except Exception as e: - print(f"Error getting PR diff: {e}") + print("Error getting diff:", e) return "" + + +def build_context(): + files = get_code_files() + all_chunks = [] + + for file in files: + try: + with open(file, "r", encoding="utf-8") as f: + code = f.read() + chunks = chunk_code(code) + all_chunks.extend(chunks) + except: + continue + + return all_chunks + + def main(): - print("Agent is started...") + print("🚀 Agent started") + + # 1. Get diff diff = get_pr_diff() + if not diff.strip(): - print("No changes detected in the PR.") + print("No changes found") return - print("Generating review based on the PR diff...") - review = generate_review(diff) - print("Review generated, posting to github...") - # Here you would add code to post the review back to GitHub using their API + + # 2. Build full codebase context + print("📦 Building context...") + chunks = build_context() + + # 3. Convert to embeddings + print("🔢 Generating embeddings...") + embeddings = get_embeddings(chunks) + + # 4. Store embeddings + print("🗄️ Storing embeddings...") + store_embeddings(chunks, embeddings) + + # 5. Convert diff → embedding + print("🔍 Embedding diff...") + query_embedding = get_embeddings([diff])[0] + + # 6. Retrieve relevant chunks + print("📡 Retrieving relevant context...") + relevant_chunks = query_embeddings(query_embedding) + + # 7. Generate review (Member 2 work) + print("🧠 Generating review...") + review = generate_review(diff, context=relevant_chunks) + + # 8. Post comment (Member 3 work) + print("💬 Posting comment...") post_comment(review) - print("Review posted successfully.") + + print("✅ Done") + if __name__ == "__main__": main() diff --git a/requirements.txt b/requirements.txt index 7a46841..1b1230b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,4 @@ rich chromadb tree-sitter sentence-transformers -groq +groq \ No newline at end of file From d65860ca895beaa7cd907bf6b19e476a7e7554f9 Mon Sep 17 00:00:00 2001 From: Priyanshu Kumar Date: Thu, 26 Mar 2026 14:16:03 +0530 Subject: [PATCH 7/8] refactor: remove emojis from print statements for consistency --- agent/main.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/agent/main.py b/agent/main.py index 779bf01..5c4f712 100644 --- a/agent/main.py +++ b/agent/main.py @@ -35,7 +35,7 @@ def build_context(): def main(): - print("🚀 Agent started") + print("Agent started") # 1. Get diff diff = get_pr_diff() @@ -45,34 +45,34 @@ def main(): return # 2. Build full codebase context - print("📦 Building context...") + print("Building context...") chunks = build_context() # 3. Convert to embeddings - print("🔢 Generating embeddings...") + print("Generating embeddings...") embeddings = get_embeddings(chunks) # 4. Store embeddings - print("🗄️ Storing embeddings...") + print("Storing embeddings...") store_embeddings(chunks, embeddings) # 5. Convert diff → embedding - print("🔍 Embedding diff...") + print("Embedding diff...") query_embedding = get_embeddings([diff])[0] # 6. Retrieve relevant chunks - print("📡 Retrieving relevant context...") + print("Retrieving relevant context...") relevant_chunks = query_embeddings(query_embedding) # 7. Generate review (Member 2 work) - print("🧠 Generating review...") + print("Generating review...") review = generate_review(diff, context=relevant_chunks) # 8. Post comment (Member 3 work) - print("💬 Posting comment...") + print("Posting comment...") post_comment(review) - print("✅ Done") + print("Done") if __name__ == "__main__": main() From 89de667a5ff7727aa086910ea3d2be4586f363c1 Mon Sep 17 00:00:00 2001 From: haddybhaiya Date: Thu, 26 Mar 2026 15:12:36 +0530 Subject: [PATCH 8/8] fix : remove extratenous comments --- agent/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/main.py b/agent/main.py index 5c4f712..9e2ea8c 100644 --- a/agent/main.py +++ b/agent/main.py @@ -56,7 +56,7 @@ def main(): print("Storing embeddings...") store_embeddings(chunks, embeddings) - # 5. Convert diff → embedding + # 5. Convert diff to embedding print("Embedding diff...") query_embedding = get_embeddings([diff])[0] @@ -64,11 +64,11 @@ def main(): print("Retrieving relevant context...") relevant_chunks = query_embeddings(query_embedding) - # 7. Generate review (Member 2 work) + # 7. Generate review print("Generating review...") review = generate_review(diff, context=relevant_chunks) - # 8. Post comment (Member 3 work) + # 8. Post comment print("Posting comment...") post_comment(review)