Praxis / gensim /code_fixer.py
leofeltrin's picture
Initial commit
f2534b1
import os
from typing import Optional, Tuple
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import TerminalFormatter
from gensim.utils import (
add_to_txt,
extract_code,
generate_feedback,
)
def _load_prompt_template(cfg) -> str:
"""Load the repair prompt from disk or fall back to a default template."""
candidate_paths = [
os.path.join("prompts", cfg.get("prompt_folder", ""), "cliport_prompt_code_repair.txt"),
os.path.join("prompts", "cliport_prompt_code_repair.txt"),
]
for path in candidate_paths:
if path and os.path.exists(path):
with open(path, "r") as handle:
return handle.read()
# Fallback prompt if no file exists.
return (
"You are an expert CLIport task engineer. The task name is TASK_NAME_TEMPLATE.\n"
"Task description: TASK_DESCRIPTION_TEMPLATE\n"
"Attempt AUTO_FIX_ATTEMPT_TEMPLATE failed with the following error:\n"
"ERROR_LOG_TEMPLATE\n\n"
"Fix the implementation below and return ONLY the corrected code wrapped in a python code block:\n"
"CURRENT_CODE_TEMPLATE"
)
def attempt_code_repair(
cfg,
task_metadata: dict,
current_code: str,
error_log: str,
attempt_idx: int,
interaction_log,
) -> Optional[Tuple[str, str]]:
"""Ask the LLM to repair the current code snippet using the provided traceback."""
prompt_template = _load_prompt_template(cfg)
prompt = prompt_template
task_name = task_metadata.get("task-name", "unknown-task")
task_desc = task_metadata.get("task-description", "No description provided.")
prompt = prompt.replace("TASK_NAME_TEMPLATE", task_name)
prompt = prompt.replace("TASK_DESCRIPTION_TEMPLATE", task_desc)
prompt = prompt.replace("CURRENT_CODE_TEMPLATE", current_code.strip())
prompt = prompt.replace("ERROR_LOG_TEMPLATE", error_log.strip())
prompt = prompt.replace("AUTO_FIX_ATTEMPT_TEMPLATE", str(attempt_idx + 1))
temperature = cfg.get("gpt_temperature", 0.0)
response = generate_feedback(
prompt,
temperature=temperature,
interaction_txt=interaction_log,
)
repaired_code, class_name = extract_code(response)
if not repaired_code:
print("Auto-fix failed to return code.")
return None
add_to_txt(
interaction_log,
f"[AUTO-FIX ATTEMPT {attempt_idx + 1}] Updated code for {task_name}",
with_print=True,
)
print(
highlight(
f"[AUTO-FIX ATTEMPT {attempt_idx + 1}] Generated class: {class_name}",
PythonLexer(),
TerminalFormatter(),
)
)
return repaired_code, class_name