Smart_Code_Generator / agent /reflection.py
SaiSankarSwarna's picture
Initial commit
3962d8b
Raw
History Blame Contribute Delete
2.51 kB
import re
from groq import Groq
class ReflectionModule:
def __init__(self, api_key: str, model: str = "llama-3.3-70b-versatile"):
self.client = Groq(api_key=api_key)
self.model = model
def reflect_and_refine(
self,
task: str,
code: str,
execution_result: dict,
error_info: dict,
) -> tuple[str, str]:
stdout = execution_result.get("stdout", "").strip()
stderr = execution_result.get("stderr", "").strip()
prompt = f"""You are an expert Python programmer doing code review and debugging.
ORIGINAL TASK:
{task}
CURRENT CODE:
{code}
EXECUTION RESULTS:
- stdout: {stdout if stdout else "(empty)"}
- stderr: {stderr if stderr else "(empty)"}
ERROR DETAILS:
- Type: {error_info["type"]}
- Message: {error_info["message"]}
- Line: {error_info.get("line_number", "unknown")}
YOUR JOB:
1. Identify exactly what is wrong with the code
2. Write a complete, corrected Python solution
FORMAT:
ANALYSIS:
<2-4 sentences explaining the root cause and what needs to change>
FIXED CODE:
<complete corrected Python code, raw code only, no markdown fences>"""
response = self.client.chat.completions.create(
model=self.model,
messages=[{"role": "user", "content": prompt}],
temperature=0.2,
max_tokens=2048,
)
full_response = response.choices[0].message.content.strip()
analysis, fixed_code = self._parse_response(full_response, code)
return fixed_code, analysis
def _parse_response(self, response: str, fallback_code: str) -> tuple[str, str]:
analysis = ""
fixed_code = ""
if "ANALYSIS:" in response and "FIXED CODE:" in response:
parts = response.split("FIXED CODE:", 1)
analysis = parts[0].replace("ANALYSIS:", "").strip()
fixed_code = parts[1].strip()
else:
analysis = response
for pattern in [
r"```python\s*\n(.*?)\n```",
r"```\s*\n(.*?)\n```",
]:
match = re.search(pattern, response, re.DOTALL)
if match:
fixed_code = match.group(1).strip()
break
if not fixed_code:
fixed_code = fallback_code
fence_match = re.search(r"```(?:python)?\s*\n(.*?)\n```", fixed_code, re.DOTALL)
if fence_match:
fixed_code = fence_match.group(1).strip()
return analysis, fixed_code