HF_RepoSense / analyzer.py
naman1102's picture
hi
1a943f1
raw
history blame
3.24 kB
import openai
import os
import json
def analyze_code(code: str) -> str:
"""
Uses OpenAI's GPT-4.1 mini model to analyze the given code.
Returns the analysis as a string.
"""
from openai import OpenAI
client = OpenAI()
system_prompt = (
"You are a helpful assistant. Analyze the code given to you. "
"Return your response strictly in JSON format with the following keys: "
"'strength', 'weaknesses', 'speciality', 'relevance rating'. "
"Do not include any other text outside the JSON."
)
response = client.chat.completions.create(
model="gpt-4-1106-preview", # GPT-4.1 mini
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": code}
],
max_tokens=512,
temperature=0.7
)
return response.choices[0].message.content
def parse_llm_json_response(response: str):
try:
return json.loads(response)
except Exception as e:
return {"error": f"Failed to parse JSON: {e}", "raw": response}
def combine_repo_files_for_llm(repo_dir="repo_files", output_file="combined_repo.txt"):
"""
Combines all .py and .md files in the given directory (recursively) into a single text file.
Returns the path to the combined file.
"""
combined_content = []
seen_files = set()
# Priority files
priority_files = ["app.py", "README.md"]
for pf in priority_files:
pf_path = os.path.join(repo_dir, pf)
if os.path.isfile(pf_path):
try:
with open(pf_path, "r", encoding="utf-8") as f:
combined_content.append(f"\n# ===== File: {pf} =====\n")
combined_content.append(f.read())
seen_files.add(os.path.abspath(pf_path))
except Exception as e:
combined_content.append(f"\n# Could not read {pf_path}: {e}\n")
# All other .py and .md files
for root, _, files in os.walk(repo_dir):
for file in files:
if file.endswith(".py") or file.endswith(".md"):
file_path = os.path.join(root, file)
abs_path = os.path.abspath(file_path)
if abs_path in seen_files:
continue
try:
with open(file_path, "r", encoding="utf-8") as f:
combined_content.append(f"\n# ===== File: {file} =====\n")
combined_content.append(f.read())
seen_files.add(abs_path)
except Exception as e:
combined_content.append(f"\n# Could not read {file_path}: {e}\n")
with open(output_file, "w", encoding="utf-8") as out_f:
out_f.write("\n".join(combined_content))
return output_file
def analyze_combined_file(output_file="combined_repo.txt"):
"""
Reads the combined file and passes its contents to analyze_code, returning the LLM's output.
"""
try:
with open(output_file, "r", encoding="utf-8") as f:
lines = f.readlines()
code = "".join(lines[:500])
return analyze_code(code)
except Exception as e:
return f"Error analyzing combined file: {e}"