Files
OGAAA/Codes/1_raw_dataset/Should-It-Be-Executed-Or-Processed/SEP_dataset/expand_tasks.py
HenryChou020514 01bb07dba8 Flatten 1_raw_dataset submodules into plain tracked files
FocalLoRA, Should-It-Be-Executed-Or-Processed, and topicattack were
nested git repos (with an inner FocalLoRA/data/FocalLoRA/.git as well).
Drop their .git history and track the contents directly in this repo
instead of as submodules/gitlinks.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 19:06:09 +08:00

97 lines
3.2 KiB
Python

import json
import sys
import os
sys.path.append("..")
from openai_utils import get_messages_generic, call_openai_api, try_processing_json_str
from utils import load_config
import openai
def get_task_outputs(messages: list, max_subtasks: int = 30) -> list:
"""
Generates subtsask for a given task by calling the OpenAI API and processing the response.
The prompt should describe to the model how it is to convert a general task into a JSON list of subtasks.
Parameters:
messages (list): A message in ChatML format
max_subtasks (int): The maximum number of subtasks to generate for the given task.
Returns:
list: A list of generated subtasks for the given task.
"""
outputs = []
while len(outputs) < max_subtasks:
response_content = call_openai_api(messages)
if not response_content:
continue
try:
processed_output = try_processing_json_str(response_content, "list")
outputs.extend(processed_output)
except Exception as e:
# Try again. Error is usually a failure to find correct JSON list in the output string.
print(f"Caught exception while processing the API response: {e}")
return outputs
def process_tasks(input_path: str, output_path: str, prompt_path: str) -> None:
"""
Expands tasks based on the types defined in the input file using prompts,
and saves the expanded tasks with descriptions to the output file.
Note that the list of subtasks has to be reviewed (manually or automatically) to delete the repetitions.
Parameters:
input_path (str): Path to the input JSON file with task types.
output_path (str): Path to save the output JSON file with expanded tasks.
prompt_path (str): Path to the text file containing the expansion prompt.
"""
with open(prompt_path, "r") as f:
expand_prompt = f.read()
with open(input_path, "r") as f:
data = json.load(f)
exp_log = {
"input_message": expand_prompt,
"data": data,
"output": []
}
new_data = {}
for task_type in data.keys():
print(f"Dealing with type: {task_type}\n\n")
if task_type == "descr":
new_data[task_type] = data[task_type]
continue
new_data[task_type] = {}
for task, text in data[task_type].items():
print(f"Dealing with task: {task}")
if task == "descr":
new_data[task_type][task] = text
continue
cur_prompt = f"{expand_prompt} Primary Task: {task}\nDescription: {text}"
messages = get_messages_generic(cur_prompt)
outputs = get_task_outputs(messages)
new_data[task_type][task] = {
"descr": text,
"subtasks": outputs
}
exp_log['output'] = new_data
with open(output_path, "w") as f:
json.dump(exp_log, f)
if __name__ == "__main__":
openai.api_key = os.getenv("OPENAI_API_KEY")
config = load_config(sys.argv)
input_path = config["task_types_path"]
output_path = config["subtasks_path"]
prompt_path = config["task_to_subtasks_prompt_path"]
process_tasks(input_path, output_path, prompt_path)