Files
sci-gui-agent-benchmark/scripts/tools/init_task.py
2026-01-12 18:30:12 +08:00

179 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
任务初始化工具
快速创建新任务的目录结构和配置文件模板
"""
import os
import json
import sys
import argparse
TASK_JSON_TEMPLATE = {
"id": "",
"category": "basic_processing", # basic_processing, peak_analysis, phase_identification, compound_tasks
"difficulty": "easy", # easy, medium, hard
"instruction": "请填写任务指令",
"input": {
"source_file": "../../data/source/DEMO01.MDI",
"inject_to": "C:\\Users\\lzy\\Desktop\\DEMO01.MDI"
},
"output": {
"expected_file": "result.txt",
"collect_from": "C:\\Users\\lzy\\Desktop\\result.txt"
},
"evaluation": {
"method": "xrd_data_compare",
"ground_truth": "ground_truth/result.txt",
"target_output": "agent_output/result.txt",
"tolerance": 1e-4
}
}
def init_task(task_id, project_root=".", force=False, category=None, difficulty=None, instruction=None):
"""
初始化新任务
Args:
task_id: 任务ID
project_root: 项目根目录
force: 是否覆盖已存在的任务
category: 任务类别(可选)
difficulty: 任务难度(可选)
instruction: 任务指令(可选)
"""
task_dir = os.path.join(project_root, "tasks", task_id)
# 检查是否已存在
if os.path.exists(task_dir) and not force:
print(f"❌ 任务目录已存在: {task_dir}")
print(" 使用 --force 参数强制覆盖")
return False
print(f"创建任务: {task_id}")
print("=" * 60)
# 创建目录结构
directories = [
task_dir,
os.path.join(task_dir, "ground_truth"),
os.path.join(task_dir, "human_demo"),
os.path.join(task_dir, "human_demo", "screens"),
os.path.join(task_dir, "agent_output")
]
for directory in directories:
os.makedirs(directory, exist_ok=True)
print(f"✅ 创建目录: {os.path.relpath(directory, project_root)}")
# 创建task.json
task_config = TASK_JSON_TEMPLATE.copy()
task_config["id"] = task_id
# 更新可选参数
if category:
task_config["category"] = category
if difficulty:
task_config["difficulty"] = difficulty
if instruction:
task_config["instruction"] = instruction
task_json_path = os.path.join(task_dir, "task.json")
with open(task_json_path, 'w', encoding='utf-8') as f:
json.dump(task_config, f, indent=2, ensure_ascii=False)
print(f"✅ 创建配置: {os.path.relpath(task_json_path, project_root)}")
# 创建README
readme_content = f"""# 任务: {task_id}
## 任务信息
- **ID**: {task_id}
- **类别**: {task_config['category']}
- **难度**: {task_config['difficulty']}
## 指令
{task_config['instruction']}
## 数据采集状态
- [ ] 环境重置与文件注入
- [ ] 操作轨迹录制
- [ ] 结果文件收集
- [ ] 坐标转换处理
- [ ] 评测验证
## 采集命令
```bash
# 完整流程
python scripts/collect_task.py {task_id} --mode full
# 分步执行
python scripts/collect_task.py {task_id} --mode reset
python scripts/collect_task.py {task_id} --mode record
python scripts/collect_task.py {task_id} --mode collect
python scripts/process_trajectory.py {task_id}
python scripts/run_eval.py {task_id}
```
## 文件结构
```
{task_id}/
├── task.json # 任务配置
├── ground_truth/ # 标准答案输出
├── human_demo/ # 人类操作轨迹
│ ├── actions_raw.json # 原始轨迹(未转换坐标)
│ ├── actions.json # 处理后轨迹(已转换坐标)
│ └── screens/ # 截图序列
└── agent_output/ # Agent输出评测时使用
```
"""
readme_path = os.path.join(task_dir, "README.md")
with open(readme_path, 'w', encoding='utf-8') as f:
f.write(readme_content)
print(f"✅ 创建说明: {os.path.relpath(readme_path, project_root)}")
print("=" * 60)
print("✅ 任务初始化完成!")
print("\n📝 下一步:")
print(f" 1. 编辑任务配置: {task_json_path}")
print(f" 2. 确保输入文件存在:例如 {task_config['input']['source_file']}")
print(f" 3. 开始数据采集: python scripts/tools/collect_task.py {task_id}")
print("=" * 60 + "\n")
return True
def main():
parser = argparse.ArgumentParser(
description="初始化新任务",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
使用示例:
# 创建新任务
python scripts/init_task.py smoothing_001
# 强制覆盖已存在的任务
python scripts/init_task.py smoothing_001 --force
"""
)
parser.add_argument("task_id", help="任务ID建议格式: category_序号")
parser.add_argument("--project-root", default=".", help="项目根目录")
parser.add_argument("--force", action="store_true", help="强制覆盖已存在的任务")
args = parser.parse_args()
success = init_task(args.task_id, args.project_root, args.force)
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()