import pandas as pd from tqdm import tqdm import config import generate_annotated_diffs import statistics from api_wrappers import grazie_wrapper from generation_steps import examples GENERATION_MULTIPLIER = 3 REL_INSERTIONS_THRESHOLD = 0.5 GENERATION_ATTEMPTS = 5 def build_prompt(reference, diff): return f"""A software developer uses a LLM to generate commit messages. They generated a commit message for the following source code changes: START OF THE SOURCE CODE CHANGES {diff} END OF THE SOURCE CODE CHANGES After generating the commit message the developer understands that it is not perfect. After making dome changes, they come up with an edited version of the message. Here is this edited message: START OF THE COMMIT MESSAGE {reference} END OF THE COMMIT MESSAGE Your task is to print the initial, LLM-generated commit message. The message you print must share some fragments with the edited message. Here are some examples of what you should output: START OF THE EXAMPLES LIST {examples.EXAMPLES_END_TO_START} END OF THE EXAMPLES LIST Print only the initial commit message's text after the token "OUTPUT". OUTPUT""" def generate_start_msg(end_msg, diff): prompt = build_prompt(reference=end_msg, diff=diff) results = [] for i in range(GENERATION_ATTEMPTS): start_msg_pred = grazie_wrapper.generate_for_prompt(prompt) stats = statistics.get_statistics(start_msg=start_msg_pred, end_msg=end_msg, annotated_msg=generate_annotated_diffs.get_annotated_diff(start_msg_pred, end_msg)) if stats["insertions"] < REL_INSERTIONS_THRESHOLD: return start_msg_pred else: results.append((stats["insertions"], start_msg_pred)) results.sort() return results[0][1] COLS_TO_KEEP = ["hash", "repo", "commit_msg_end", "mods", "session"] def transform(df): print(f"End -> start synthesis:") print(f"NUMBER OF EXAMPLES PER PROMPT = {examples.N_EXAMPLES}") print(f"GENERATION_MULTIPLIER = {GENERATION_MULTIPLIER}") print(f"REL_INSERTIONS_THRESHOLD = {REL_INSERTIONS_THRESHOLD}") print(f"GENERATION_ATTEMPTS = {GENERATION_ATTEMPTS}") df['end_to_start'] = False generated_data = { "commit_msg_start": [] } for col in COLS_TO_KEEP: generated_data[col] = [] for _, row in tqdm(df.iterrows(), total=len(df)): for i in range(GENERATION_MULTIPLIER): commit_msg_start_pred = generate_start_msg(end_msg=row["commit_msg_end"], diff=row["mods"]) generated_data["commit_msg_start"].append(commit_msg_start_pred) for col in COLS_TO_KEEP: generated_data[col].append(row[col]) generated_df = pd.DataFrame.from_dict(generated_data) generated_df['end_to_start'] = True result = pd.concat([df, generated_df], ignore_index=True) print("Done") return result def main(): df = pd.read_csv(config.SYNTHETIC_DATASET_ARTIFACT, index_col=[0]) df = transform(df) df.to_csv(config.SYNTHETIC_DATASET_ARTIFACT) if __name__ == '__main__': main()