19 Commits

Author SHA1 Message Date
acd38ca54a feat(uv): add uv direct eval script, task data, healthcheck fix
- add run_uv.sh direct eval entry and test_uv.json meta
- add evaluation_examples/examples/uv task data
- switch setup.py healthcheck from /terminal to /screenshot to avoid Win7 hang
2026-04-07 22:27:59 +08:00
355bf655cc feat(flsol-demo): add reflection comments to prompt and update API key
- prompts.py: add mandatory 【观察】【判断】【动作】 comment format for demo clarity
- run_flsol_win7.sh: update OPENAI_API_KEY

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 11:17:44 +08:00
f32e5f9e64 flsol demo: fix top_p/claude/gemini, force coordinates, add reflection comments, screenshot mode 2026-03-22 13:57:33 +08:00
093b779045 data: 新增 flsol taskE auto_optimize_scan 任务 2026-03-19 14:59:45 +08:00
90c427c6dd feat: add flsol direct win7 evaluation support 2026-03-16 15:42:56 +08:00
dc5fd173f1 data: update avogadro building-metal-complexes task1 & task3 2026-03-13 17:19:44 +08:00
19795a674b chore: gitignore 添加 demo_task3 录制产物 2026-03-11 11:13:23 +08:00
349f2142fb fix: vllm_eval 默认使用原始分辨率进行评估 2026-03-11 11:06:01 +08:00
a943c1e961 feat: 更新 Jade/VESTA 任务定义 + 最终评测清单
- Jade: 15个任务JSON更新 (instruction细化 + metadata.steps详细展开)
- VESTA: 10个任务JSON重构 (统一使用NaCl.cif/anatase_TiO2.cif + 步骤重写)
- VESTA: 删除task1, 新增2个CIF数据文件
- 新增 test_final.json (11 jade + 10 vesta = 21 tasks)
- run_proxmox.sh: MODEL→gpt-5.4, MAX_STEPS→35, TEST_META→test_final.json
2026-03-11 11:02:26 +08:00
d71f1f976d feat: vllm_eval 关键帧采样 + Gemini OpenAI 代理支持
- vllm_eval.py: 新增 _sample_key_frames 关键帧采样函数
- vllm_eval.py: 当截图超过 max_eval_images 时均匀采样
- vllm_eval.py: Gemini 模型支持通过 OpenAI 兼容代理调用
- test_single.json: 更新测试任务配置
2026-03-04 16:39:24 +08:00
4bde685bbd feat: 新增 Proxmox provider 支持及 inject_steps 参数
- 新增 desktop_env/providers/proxmox/ (manager + provider)
- desktop_env.py: 添加 proxmox 到 provider 名称列表
- providers/__init__.py: 工厂函数注册 proxmox provider
- run.py: 新增 --inject_steps/--no_inject_steps 参数
- run_proxmox.sh: Proxmox 运行脚本
2026-03-04 16:39:08 +08:00
e70f1335f0 config: 更新测试任务配置文件 2026-03-04 10:44:00 +08:00
9431bd5bfc data: 精炼已有 avogadro/imagej/origin/ovito/pymol/vesta 任务的 metadata steps 2026-03-04 10:43:49 +08:00
b1052c79cf data: 新增 jade/avogadro/ovito/pymol 评测任务数据 2026-03-04 10:43:29 +08:00
ac3f38ed58 feat: 新增 refine_metadata 脚本,更新 extract_instructions_v2 2026-03-04 10:43:14 +08:00
e4b039fc02 refine jade metadata steps: add shortcuts & merge menu operations to avoid timeout 2026-02-27 18:19:04 +08:00
b75f6bf341 feat: 增强任务步骤注入与a11y状态表达,提升树形交互稳定性
- 打通 metadata.steps 传递链路,将任务步骤注入 agent 预测上下文

- 优化 a11y tree 线性化输出:使用中心坐标并新增 states 列(expanded/collapsed/selected 等)

- 放宽可保留节点条件,保留无文本输入类控件(edit/textfield/searchbox 等)

- 强化输出约束:单轮仅允许动作代码或 WAIT/DONE/FAIL,禁止动作与 DONE 同轮返回

- 补充 avogadro 示例步骤:展开 aromatics 并选择 benzene.cjson
2026-02-26 18:56:53 +08:00
07e66490dd feat: 增强科研软件的 a11y tree 支持
- 扩展 heuristic_retrieve.py 白名单以覆盖科研软件 GUI 框架:
  - 新增 prefix 规则: sunawt (Java Swing), qt5q/qt6q (Qt), ovito, pymol,
    contentspanel, wx (wxWidgets), afx (MFC), thunderrt (VB6)
  - 新增 endswith 规则: edit, widget, box, dialog, view, frame, menuitem,
    menubar, toolbar, tabitem, treeitem, window
  - 新增 Qt 控件和 Win32 控件的精确匹配
- 在 agent.py 中添加原始 a11y tree 的调试日志
- 修复 run.py 中 agent 初始化缺少 platform='windows' 的问题
- 添加 NO_PROXY 绕过本地/VM IP (兼容 Clash 全局代理)
- lib_run_single.py 中应用启动等待时间增加到 15 秒
- 新增 test_each_domain_a11y_tree.json (每个域一个任务用于 a11y 验证)
2026-02-26 15:04:28 +08:00
9899d4a0c7 feat: 新增科研软件 benchmark 任务数据
- 新增 avogadro/imagej/jade/origin/ovito/pymol/vesta 等科研软件任务 JSON
- 修改 vllm_eval.py,修改图片文件名称为第x步
- desktop_env.py 添加额外数据参数 config 和 metadata
2026-02-25 15:19:36 +08:00
187 changed files with 13483 additions and 155 deletions

14
.gitignore vendored
View File

@@ -208,7 +208,21 @@ quick_start.py
result_multi_apps_pengxiang_transformers12evaluation_examples/settings/proxy/dataimpulse.json
evaluation_examples/settings/proxy/dataimpulse.json
# Benchmark input data (large binary files - share via cloud storage or Git LFS)
evaluation_examples/inputs/
# Temporary data processing workspace (scraped docs, intermediate scripts)
evaluation_examples/sandbox/
# Image cache
evaluation_examples/inputs/.img_cache/
# Local test configurations (not for public repo)
evaluation_examples/spiderman.json
evaluation_examples/test_50_random_proportional.json
evaluation_examples/test_chrome.json
evaluation_examples/prepare_input_files.py
# Demo task3 录制产物
run_demo_task3.py
demo_task3_output/

View File

@@ -73,7 +73,7 @@ class SetupController:
retry = 0
while retry < MAX_RETRIES:
try:
_ = requests.get(self.http_server + "/terminal")
_ = requests.get(self.http_server + "/screenshot", timeout=10)
break
except:
time.sleep(5)
@@ -518,7 +518,7 @@ class SetupController:
retry = 0
while retry < MAX_RETRIES:
try:
_ = requests.get(self.http_server + "/terminal")
_ = requests.get(self.http_server + "/screenshot", timeout=10)
break
except:
time.sleep(5)

View File

@@ -20,42 +20,42 @@ Metric = Callable[[Any, Any], float]
Getter = Callable[[gym.Env, Dict[str, Any]], Any]
MAX_RETRIES = 5 # Maximum retries for environment setup
def _fix_pyautogui_less_than_bug(command: str) -> str:
"""
Fix PyAutoGUI '<' character bug by converting it to hotkey("shift", ',') calls.
This fixes the known PyAutoGUI issue where typing '<' produces '>' instead.
References:
- https://github.com/asweigart/pyautogui/issues/198
- https://github.com/xlang-ai/OSWorld/issues/257
Args:
command (str): The original pyautogui command
Returns:
str: The fixed command with '<' characters handled properly
"""
# Pattern to match press('<') or press('\u003c') calls
# Pattern to match press('<') or press('\u003c') calls
press_pattern = r'pyautogui\.press\(["\'](?:<|\\u003c)["\']\)'
# Handle press('<') calls
def replace_press_less_than(match):
return 'pyautogui.hotkey("shift", ",")'
# First handle press('<') calls
command = re.sub(press_pattern, replace_press_less_than, command)
# Pattern to match typewrite calls with quoted strings
typewrite_pattern = r'pyautogui\.typewrite\((["\'])(.*?)\1\)'
# Then handle typewrite calls
def process_typewrite_match(match):
quote_char = match.group(1)
content = match.group(2)
# Preprocess: Try to decode Unicode escapes like \u003c to actual '<'
# This handles cases where '<' is represented as escaped Unicode
try:
@@ -65,15 +65,15 @@ def _fix_pyautogui_less_than_bug(command: str) -> str:
except UnicodeDecodeError:
# If decoding fails, proceed with original content to avoid breaking existing logic
pass # English comment: Graceful degradation - fall back to original content if decoding fails
# Check if content contains '<'
if '<' not in content:
return match.group(0)
# Split by '<' and rebuild
parts = content.split('<')
result_parts = []
for i, part in enumerate(parts):
if i == 0:
# First part
@@ -84,11 +84,11 @@ def _fix_pyautogui_less_than_bug(command: str) -> str:
result_parts.append('pyautogui.hotkey("shift", ",")')
if part:
result_parts.append(f"pyautogui.typewrite({quote_char}{part}{quote_char})")
return '; '.join(result_parts)
command = re.sub(typewrite_pattern, process_typewrite_match, command)
return command
@@ -145,12 +145,12 @@ class DesktopEnv(gym.Env):
self.screen_width = screen_size[0]
self.screen_height = screen_size[1]
# Default
# Default
self.server_port = 5000
self.chromium_port = 9222
self.vnc_port = 8006
self.vlc_port = 8080
# Initialize with default (no proxy) provider
self.current_use_proxy = False
self.manager, self.provider = create_vm_manager_and_provider(provider_name, region, use_proxy=False)
@@ -162,8 +162,11 @@ class DesktopEnv(gym.Env):
# vmware, virtualbox are always used as the emulator starts from a dirty state
if self.provider_name in {"docker", "aws", "gcp", "azure", "aliyun", "volcengine"}:
self.is_environment_used = False
elif self.provider_name in {"vmware", "virtualbox"}:
elif self.provider_name in {"vmware", "virtualbox", "proxmox"}:
self.is_environment_used = True
elif self.provider_name == "direct":
# Physical machine: never revert snapshot, never stop emulator
self.is_environment_used = False
else:
raise ValueError(f"Invalid provider name: {self.provider_name}")
@@ -173,7 +176,7 @@ class DesktopEnv(gym.Env):
if provider_name in {"vmware", "virtualbox"} else path_to_vm
else:
self.path_to_vm = self.manager.get_vm_path(os_type=self.os_type, region=region, screen_size=(self.screen_width, self.screen_height))
self.snapshot_name = snapshot_name
self.cache_dir_base: str = cache_dir
# todo: add the logic to get the screen size from the VM
@@ -229,8 +232,8 @@ class DesktopEnv(gym.Env):
# due to the fact it could be changed when implemented by cloud services
path_to_vm = self.provider.revert_to_snapshot(self.path_to_vm, self.snapshot_name)
if path_to_vm and not path_to_vm == self.path_to_vm:
# path_to_vm has to be a new path
# path_to_vm has to be a new path
self.manager.delete_vm(self.path_to_vm, self.region)
self.manager.add_vm(path_to_vm, self.region)
self.manager.occupy_vm(path_to_vm, os.getpid(), self.region)
@@ -245,7 +248,7 @@ class DesktopEnv(gym.Env):
self.provider.stop_emulator(self.path_to_vm)
def reset(self, task_config: Optional[Dict[str, Any]] = None, seed=None, options=None) -> Dict[str, Any]:
# Reset to certain task in OSWorld
logger.info("Resetting environment...")
logger.info("Switching task...")
@@ -258,17 +261,17 @@ class DesktopEnv(gym.Env):
# Only revert to snapshot if environment has been used (step/setup)
# This optimization is especially important for cloud providers like AWS
# where unnecessary snapshot operations are costly and time-consuming
if task_config is not None:
# Only consider task proxy requirement if proxy is enabled at system level
task_use_proxy = task_config.get("proxy", False) and self.enable_proxy
if not self.enable_proxy and task_config.get("proxy", False):
logger.info("Task requires proxy but proxy is disabled at system level, ignoring proxy requirement.")
if task_use_proxy != self.current_use_proxy:
# keep because get_info_from_website depend on this
self.current_use_proxy = task_use_proxy
if self.is_environment_used:
logger.info("Environment has been used, reverting to snapshot: {}...".format(self.snapshot_name))
self._revert_to_snapshot()
@@ -302,7 +305,7 @@ class DesktopEnv(gym.Env):
time.sleep(5)
else:
break
logger.info("Environment setup complete.")
observation = self._get_obs()
@@ -333,7 +336,8 @@ class DesktopEnv(gym.Env):
os.makedirs(self.cache_dir, exist_ok=True)
self.instruction = task_config["instruction"]
self.config = task_config["config"] if "config" in task_config else []
self.metadata = task_config.get("metadata", {})
self._set_evaluator_info(task_config)
def _set_evaluator_info(self, task_config: Dict[str, Any]):
@@ -362,10 +366,17 @@ class DesktopEnv(gym.Env):
else None
if "expected" in self.evaluator and len(self.evaluator["expected"]) > 0:
self.expected_getter: Getter = [getattr(getters, "get_{:}".format(exp["type"])) if exp else None for exp in
self.evaluator["expected"]] \
if isinstance(self.evaluator["expected"], list) \
else getattr(getters, "get_{:}".format(self.evaluator["expected"]["type"]))
expected_val = self.evaluator["expected"]
if isinstance(expected_val, list):
self.expected_getter: Getter = [
getattr(getters, "get_{:}".format(exp["type"])) if (exp and "type" in exp) else None
for exp in expected_val
]
elif isinstance(expected_val, dict) and "type" in expected_val:
self.expected_getter: Getter = getattr(getters, "get_{:}".format(expected_val["type"]))
else:
# No 'type' key (e.g. vllm_eval uses plain description dict) — no getter needed
self.expected_getter = None
else:
self.expected_getter = [None] * len(self.metric) \
if isinstance(self.metric, list) \
@@ -386,7 +397,7 @@ class DesktopEnv(gym.Env):
def step(self, action, pause=2):
self._step_no += 1
self.action_history.append(action)
# Mark environment as used when step is called
self.is_environment_used = True
@@ -461,12 +472,16 @@ class DesktopEnv(gym.Env):
self.metric_options["instruction"] = self.instruction
self.metric_options["eval_model"] = self.eval_model
# Pass pre-configured environment info and expected steps
self.metric_options["config"] = self.config
self.metric_options["metadata"] = self.metadata
if result_dir:
self.metric_options["result_dir"] = result_dir
logger.info(f"Using result_dir for vllm_eval: {result_dir}")
logger.info(f"Evaluation options prepared: {self.metric_options.keys()}")
if type(self.metric) == list:
# Multiple metrics to evaluate whether the task is successfully completed
results = []

View File

@@ -73,7 +73,13 @@ class UnifiedLLM:
elif model.startswith("claude"):
self.provider = "anthropic"
elif model.startswith("gemini"):
self.provider = "gemini"
# If OPENAI_API_KEY is set but GOOGLE_API_KEY is not,
# use OpenAI-compatible proxy for Gemini models
if os.getenv("OPENAI_API_KEY") and not os.getenv("GOOGLE_API_KEY"):
self.provider = "openai"
logger.info(f"Using OpenAI-compatible proxy for Gemini model: {model}")
else:
self.provider = "gemini"
else:
self.provider = "unknown"
@@ -287,20 +293,58 @@ class UnifiedLLM:
raise ValueError(f"Unsupported provider: {self.provider}")
def _load_screenshots_from_dir(result_dir: str, compress: bool = True, max_size: int = 800, quality: int = 85) -> List[str]:
def _sample_key_frames(items: list, max_count: int) -> list:
"""
Load all step screenshots from result directory and convert to base64
Uniformly sample key frames while always keeping the first and last items.
Args:
items: List of items to sample from
max_count: Maximum number of items to keep (must be >= 2)
Returns:
List of sampled indices (sorted)
"""
n = len(items)
if n <= max_count:
return list(range(n))
# Always keep first and last
if max_count < 2:
max_count = 2
indices = [0] # first frame
# Uniformly sample (max_count - 2) frames from the middle
middle_count = max_count - 2
if middle_count > 0:
step = (n - 2) / (middle_count + 1)
for i in range(1, middle_count + 1):
idx = int(round(i * step))
indices.append(idx)
indices.append(n - 1) # last frame
# Deduplicate and sort
indices = sorted(set(indices))
return indices
def _load_screenshots_from_dir(result_dir: str, compress: bool = False, max_size: int = 800, quality: int = 85, max_images: int = 0) -> tuple:
"""
Load step screenshots from result directory and convert to base64.
When max_images > 0 and there are more screenshots than max_images,
uniformly sample key frames (always keeping first and last).
Args:
result_dir: Path to result directory containing step_*.png files
compress: Whether to compress images (default: True)
max_size: Maximum dimension for compression (default: 800)
quality: JPEG quality for compression (default: 85)
max_images: Maximum number of screenshots to load (0 = no limit)
Returns:
List of base64 encoded screenshot strings
Tuple of (list of base64 encoded screenshot strings, list of short filenames like 'step_1', 'step_2', ...)
"""
screenshots = []
filenames = []
# Find all step screenshot files (e.g., step_1_20240101@120000.png)
pattern = os.path.join(result_dir, "step_*.png")
@@ -308,8 +352,19 @@ def _load_screenshots_from_dir(result_dir: str, compress: bool = True, max_size:
if not screenshot_files:
logger.warning(f"No screenshot files found in {result_dir}")
return screenshots
return screenshots, filenames
# Key frame sampling: if max_images > 0 and we have more files than allowed,
# keep first + last + uniformly sampled middle frames
total_files = len(screenshot_files)
if max_images > 0 and total_files > max_images:
sampled_indices = _sample_key_frames(screenshot_files, max_images)
screenshot_files_sampled = [screenshot_files[i] for i in sampled_indices]
logger.info(f"Key frame sampling: {total_files} screenshots -> {len(screenshot_files_sampled)} "
f"(max_images={max_images}, kept indices: {sampled_indices})")
screenshot_files = screenshot_files_sampled
import re as _re
for filepath in screenshot_files:
try:
with open(filepath, "rb") as f:
@@ -321,11 +376,16 @@ def _load_screenshots_from_dir(result_dir: str, compress: bool = True, max_size:
img_b64 = _compress_image(img_b64, max_size=max_size, quality=quality)
screenshots.append(img_b64)
# Extract short name like 'step_1' from 'step_1_20240101@120000.png'
basename = os.path.basename(filepath)
match = _re.match(r'(step_\d+)', basename)
short_name = match.group(1) if match else basename
filenames.append(short_name)
except Exception as e:
logger.error(f"Error loading screenshot {filepath}: {e}")
logger.info(f"Loaded {len(screenshots)} screenshots from {result_dir}")
return screenshots
logger.info(f"Loaded {len(screenshots)} screenshots from {result_dir}: {filenames}")
return screenshots, filenames
def vllm_eval(result_state, **options) -> float:
@@ -342,6 +402,8 @@ def vllm_eval(result_state, **options) -> float:
- compress_images: Whether to compress images (default: True)
- max_image_size: Maximum image dimension for compression (default: 800)
- image_quality: JPEG quality for compression (default: 85)
- max_eval_images: Max screenshots for evaluation (0 = no limit, default: 10).
When exceeded, keeps first + last + uniformly sampled middle frames.
- temperature: Temperature parameter
- max_tokens: Maximum tokens
- top_p: Top-p parameter
@@ -354,20 +416,25 @@ def vllm_eval(result_state, **options) -> float:
screenshots = options.get("screenshots", [])
# Image compression options
compress_images = options.get("compress_images", True)
compress_images = options.get("compress_images", False)
max_image_size = options.get("max_image_size", 800)
image_quality = options.get("image_quality", 85)
max_eval_images = options.get("max_eval_images", 10)
screenshot_filenames = [] # Short names like 'step_1', 'step_2', ...
if result_dir and not screenshots:
screenshots = _load_screenshots_from_dir(
screenshots, screenshot_filenames = _load_screenshots_from_dir(
result_dir,
compress=compress_images,
max_size=max_image_size,
quality=image_quality
quality=image_quality,
max_images=max_eval_images
)
logger.info(f"Loaded {len(screenshots)} screenshots from result_dir: {result_dir}")
elif screenshots:
logger.info(f"Using {len(screenshots)} screenshots from options")
screenshot_filenames = [f"step_{i+1}" for i in range(len(screenshots))]
# Compress screenshots if needed
if compress_images:
logger.info("Compressing provided screenshots...")
@@ -375,6 +442,8 @@ def vllm_eval(result_state, **options) -> float:
instruction = options.get("instruction", "")
eval_model = options.get("eval_model", "gpt-4-vision-preview")
config = options.get("config", [])
metadata = options.get("metadata", {})
params = {
"temperature": options.get("temperature", 0.7),
@@ -384,32 +453,91 @@ def vllm_eval(result_state, **options) -> float:
llm = UnifiedLLM(eval_model)
prompt = f"""You are an expert evaluator for desktop environment tasks.
# Build pre-configured environment description from config
preconfig_items = []
for cfg in config:
if cfg.get("type") == "launch":
cmds = cfg.get("parameters", {}).get("command", [])
if cmds:
app_name = os.path.basename(cmds[0]) if cmds else "unknown"
preconfig_items.append(f"Application '{app_name}' was automatically launched before the agent started.")
elif cfg.get("type") == "sleep":
pass # not relevant to scoring
elif cfg.get("type") == "open":
path = cfg.get("parameters", {}).get("path", "")
preconfig_items.append(f"File/URL '{path}' was automatically opened before the agent started.")
preconfig_section = ""
if preconfig_items:
preconfig_desc = "\n".join(f" - {item}" for item in preconfig_items)
preconfig_section = f"""
PRE-CONFIGURED ENVIRONMENT (done BEFORE the agent started, NOT the agent's work):
{preconfig_desc}
IMPORTANT: The above actions were performed automatically as part of environment setup. The agent did NOT perform these actions. Do NOT give ANY credit for them. For example, if the application was pre-launched, the agent merely having the application open is worth 0 points - that was the starting state."""
# Build expected steps section from metadata
expected_steps_section = ""
if metadata.get("steps"):
expected_steps_section = f"""
EXPECTED STEPS for this task (use as reference for what the agent should have done):
{metadata['steps']}
NOTE: Evaluate the screenshots against these expected steps. Only give credit for steps that show VISIBLE evidence of completion BEYOND the pre-configured starting state."""
# Build image list description for the prompt
if screenshot_filenames:
img_list_str = ", ".join(screenshot_filenames)
img_info = f"""\nYou are provided with exactly {len(screenshot_filenames)} screenshots in chronological order: {img_list_str}
The FIRST screenshot is: {screenshot_filenames[0]}
The LAST screenshot (final state): {screenshot_filenames[-1]}
IMPORTANT: Only reference screenshots from the list above. Do NOT reference any screenshot that is not listed."""
else:
img_info = "\nNo screenshots were provided."
prompt = f"""You are a STRICT and RIGOROUS evaluator for desktop environment tasks. Your job is to score ONLY based on concrete, visible evidence of task completion in the screenshots.
Task Instruction: {instruction}
{preconfig_section}
{expected_steps_section}
{img_info}
I will provide you with screenshot(s) showing the current state of the desktop environment. Please analyze the task execution step by step and provide a detailed evaluation.
Analyze ONLY the FINAL screenshot ({screenshot_filenames[-1] if screenshot_filenames else 'N/A'}) to determine the end state, while using earlier screenshots for context.
CRITICAL SCORING RULES:
1. Score ONLY based on what the AGENT actually accomplished. The pre-configured environment (application already launched, files already opened, etc.) is the STARTING STATE and worth 0 points.
2. Score ONLY based on what is ACTUALLY VISIBLE in the screenshots. Do NOT give credit for assumed or potential progress.
3. If the screenshots show NO meaningful action beyond the initial pre-configured state, the score MUST be 0.
4. Do NOT give partial credit for "having the system on", "desktop being visible", "the application being open" (if it was pre-launched), or "the application being installed". These are prerequisites or pre-configured state, NOT progress.
5. Each point must correspond to a SPECIFIC, VERIFIABLE action that was successfully completed BY THE AGENT toward the task goal.
SCORING GUIDE (0-10):
- 0: No progress beyond the pre-configured starting state. If the app was pre-launched, merely having it open is 0. If the screenshots only show the desktop or the initial app state without any agent action, score is 0.
- 1-2: The agent performed one minor action (e.g., clicked on a menu) but did not make meaningful progress toward the task goal.
- 3-4: Some initial steps toward the task have been taken but the task is far from complete.
- 5-6: Significant progress - about half the required steps are completed with visible evidence.
- 7-8: Most steps are completed but the final result is not fully achieved or has minor issues.
- 9: The task is essentially complete with very minor cosmetic differences.
- 10: The task is perfectly and completely finished with clear evidence in the final screenshot.
IMPORTANT: You must respond with ONLY a valid JSON object (no additional text before or after). Use the following exact format:
{{
"steps_analysis": [
{{"step": "Step description", "status": "Success/Fail", "evidence_img": "step_X.png", "reason": "Brief explanation"}},
{{"step": "Another step", "status": "Success/Fail", "evidence_img": "step_Y.png", "reason": "Brief explanation"}}
{{"step": "Step description", "status": "Success/Fail", "evidence_img": "step_X.png", "reason": "Brief explanation of VISIBLE evidence"}},
{{"step": "Another step", "status": "Success/Fail", "evidence_img": "step_Y.png", "reason": "Brief explanation of VISIBLE evidence"}}
],
"final_completion": "True/False",
"score": 0-10
}}
Where:
- "steps_analysis": Array of steps you identified from the screenshots (reference screenshot filenames like step_1.png, step_2.png, etc.)
- "steps_analysis": Array of steps you identified from the screenshots. Each step must cite VISIBLE evidence from a specific screenshot. Do NOT include pre-configured actions as agent steps.
- "status": Either "Success" or "Fail" for each step
- "evidence_img": The screenshot filename that shows evidence for this step (e.g., "step_2.png")
- "reason": Brief explanation of why this step succeeded or failed
- "final_completion": "True" if the overall task is completed, "False" otherwise
- "score": Integer from 0 to 10, where 10 means perfectly completed and 0 means not completed at all
- "reason": Explanation of what is VISUALLY observed in the screenshot as evidence
- "final_completion": "True" ONLY if the overall task is fully completed with clear visual proof, "False" otherwise
- "score": Integer from 0 to 10, following the strict scoring guide above
Remember: Return ONLY the JSON object, no additional text."""
Remember: Return ONLY the JSON object, no additional text. Be STRICT - when in doubt, score LOWER."""
try:
result = llm.generate_with_images(

View File

@@ -4,7 +4,7 @@ from desktop_env.providers.base import VMManager, Provider
def create_vm_manager_and_provider(provider_name: str, region: str, use_proxy: bool = False):
"""
Factory function to get the Virtual Machine Manager and Provider instances based on the provided provider name.
Args:
provider_name (str): The name of the provider (e.g., "aws", "vmware", etc.)
region (str): The region for the provider
@@ -39,5 +39,13 @@ def create_vm_manager_and_provider(provider_name: str, region: str, use_proxy: b
from desktop_env.providers.volcengine.manager import VolcengineVMManager
from desktop_env.providers.volcengine.provider import VolcengineProvider
return VolcengineVMManager(), VolcengineProvider()
elif provider_name == "proxmox":
from desktop_env.providers.proxmox.manager import ProxmoxVMManager
from desktop_env.providers.proxmox.provider import ProxmoxProvider
return ProxmoxVMManager(), ProxmoxProvider(region)
elif provider_name == "direct":
from desktop_env.providers.direct.manager import DirectVMManager
from desktop_env.providers.direct.provider import DirectProvider
return DirectVMManager(), DirectProvider(region)
else:
raise NotImplementedError(f"{provider_name} not implemented!")

View File

View File

@@ -0,0 +1,32 @@
import logging
from desktop_env.providers.base import VMManager
logger = logging.getLogger("desktopenv.providers.direct.DirectVMManager")
class DirectVMManager(VMManager):
"""No-op manager for direct-IP connections (physical machines / bare-metal)."""
def __init__(self, registry_path=""):
pass
def initialize_registry(self, **kwargs):
pass
def add_vm(self, vm_path, **kwargs):
pass
def delete_vm(self, vm_path, **kwargs):
pass
def occupy_vm(self, vm_path, pid, **kwargs):
pass
def list_free_vms(self, **kwargs):
return []
def check_and_clean(self, **kwargs):
pass
def get_vm_path(self, os_type="Windows", region=None, screen_size=(1920, 1080), **kwargs):
return os.environ.get("DIRECT_VM_IP", "192.168.1.11")

View File

@@ -0,0 +1,63 @@
import logging
import os
import time
import requests
from desktop_env.providers.base import Provider
logger = logging.getLogger("desktopenv.providers.direct.DirectProvider")
logger.setLevel(logging.INFO)
RETRY_INTERVAL = 3
MAX_WAIT_READY = 60
class DirectProvider(Provider):
"""
Provider for directly connected machines (physical / bare-metal).
No VM lifecycle management — the machine is assumed to be already running.
The Flask server IP is read from the environment variable DIRECT_VM_IP.
Usage:
export DIRECT_VM_IP=192.168.1.11
python run.py --provider_name direct --path_to_vm ignored ...
"""
def __init__(self, region: str = None):
super().__init__(region)
self.vm_ip = os.environ.get("DIRECT_VM_IP", "192.168.1.11")
def start_emulator(self, path_to_vm: str, headless: bool, os_type: str = "Windows"):
"""No-op: machine is already on. Just verify Flask server is reachable."""
logger.info(f"[direct] Using physical machine at {self.vm_ip}:5000 (no VM lifecycle)")
self._wait_for_vm_ready(self.vm_ip)
def _wait_for_vm_ready(self, ip: str, timeout: int = MAX_WAIT_READY) -> bool:
url = f"http://{ip}:5000/screenshot"
deadline = time.time() + timeout
while time.time() < deadline:
try:
r = requests.get(url, timeout=5)
if r.status_code == 200:
logger.info(f"[direct] Flask server ready at {url}")
return True
except Exception:
pass
logger.info(f"[direct] Waiting for Flask server at {url}...")
time.sleep(RETRY_INTERVAL)
logger.warning(f"[direct] Flask server at {url} not ready within {timeout}s — continuing anyway")
return False
def get_ip_address(self, path_to_vm: str) -> str:
return self.vm_ip
def save_state(self, path_to_vm: str, snapshot_name: str):
logger.info("[direct] save_state: no-op (physical machine)")
def revert_to_snapshot(self, path_to_vm: str, snapshot_name: str) -> str:
logger.info("[direct] revert_to_snapshot: no-op (physical machine)")
return path_to_vm
def stop_emulator(self, path_to_vm: str):
logger.info("[direct] stop_emulator: no-op (physical machine)")

View File

@@ -0,0 +1,49 @@
import logging
import os
from desktop_env.providers.base import VMManager
logger = logging.getLogger("desktopenv.providers.proxmox.ProxmoxVMManager")
logger.setLevel(logging.INFO)
class ProxmoxVMManager(VMManager):
"""
Simplified VM manager for Proxmox.
Unlike VMware/VirtualBox, Proxmox VMs are pre-created on the server.
This manager does not handle VM provisioning, downloading, or local
registry management. The VM ID is passed directly via --path_to_vm.
"""
def __init__(self, registry_path=""):
pass
def initialize_registry(self, **kwargs):
pass
def add_vm(self, vm_path, **kwargs):
pass
def delete_vm(self, vm_path, **kwargs):
pass
def occupy_vm(self, vm_path, pid, **kwargs):
pass
def list_free_vms(self, **kwargs):
return []
def check_and_clean(self, **kwargs):
pass
def get_vm_path(self, os_type="Windows", region=None, screen_size=(1920, 1080), **kwargs):
"""Return the VM ID from environment variable or default.
For Proxmox, the VM is pre-created. The VM ID should be passed
via --path_to_vm argument. This method is only called when
--path_to_vm is not provided.
"""
vmid = os.environ.get("PROXMOX_VM_ID", "102")
logger.info(f"Using Proxmox VM ID: {vmid}")
return vmid

View File

@@ -0,0 +1,235 @@
import logging
import os
import subprocess
import time
import requests
from desktop_env.providers.base import Provider
logger = logging.getLogger("desktopenv.providers.proxmox.ProxmoxProvider")
logger.setLevel(logging.INFO)
WAIT_TIME = 5
RETRY_INTERVAL = 3
MAX_WAIT_READY = 300 # seconds to wait for VM HTTP server to be ready
class ProxmoxProvider(Provider):
"""
Proxmox VE provider that manages VMs via SSH to the Proxmox host,
executing `qm` commands for VM lifecycle management.
Configuration via environment variables:
PROXMOX_SSH_HOST: SSH target (default: root@10.10.17.3)
PROXMOX_VM_IP: Fallback VM IP if guest agent is unavailable (default: 10.10.17.10)
"""
def __init__(self, region: str = None):
super().__init__(region)
self.ssh_host = os.environ.get("PROXMOX_SSH_HOST", "root@10.10.17.3")
self.vm_ip_fallback = os.environ.get("PROXMOX_VM_IP", "10.10.17.10")
self._vm_ip_cache = None
def _ssh_exec(self, command: str, timeout: int = 120, check: bool = True) -> str:
"""Execute a command on the Proxmox host via SSH.
Args:
command: The command to run on the remote host.
timeout: Timeout in seconds.
check: If True, raise on non-zero exit code.
Returns:
stdout output as a stripped string.
"""
ssh_cmd = [
"ssh",
"-o", "StrictHostKeyChecking=no",
"-o", "ConnectTimeout=10",
"-o", "BatchMode=yes",
self.ssh_host,
command,
]
logger.debug(f"SSH exec: {' '.join(ssh_cmd)}")
try:
result = subprocess.run(
ssh_cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding="utf-8",
timeout=timeout,
)
if check and result.returncode != 0:
logger.error(f"SSH command failed (rc={result.returncode}): {result.stderr.strip()}")
return result.stdout.strip()
except subprocess.TimeoutExpired:
logger.error(f"SSH command timed out after {timeout}s: {command}")
return ""
except Exception as e:
logger.error(f"SSH execution error: {e}")
return ""
def _get_vm_status(self, vmid: str) -> str:
"""Get the current status of a VM (e.g. 'running', 'stopped')."""
output = self._ssh_exec(f"qm status {vmid}")
# output format: "status: running"
if ":" in output:
return output.split(":", 1)[1].strip()
return output.strip()
def _wait_for_status(self, vmid: str, target_status: str, timeout: int = 120):
"""Poll VM status until it matches target_status."""
start = time.time()
while time.time() - start < timeout:
status = self._get_vm_status(vmid)
logger.info(f"VM {vmid} status: {status} (waiting for {target_status})")
if status == target_status:
return True
time.sleep(RETRY_INTERVAL)
logger.error(f"VM {vmid} did not reach status '{target_status}' within {timeout}s")
return False
def _wait_for_vm_ready(self, vm_ip: str, server_port: int = 5000, timeout: int = MAX_WAIT_READY):
"""Poll the VM's HTTP server until it responds with a screenshot."""
start = time.time()
url = f"http://{vm_ip}:{server_port}/screenshot"
while time.time() - start < timeout:
try:
response = requests.get(url, timeout=(10, 10))
if response.status_code == 200:
logger.info(f"VM HTTP server is ready at {url}")
return True
except Exception:
pass
logger.info(f"Waiting for VM HTTP server at {url}...")
time.sleep(RETRY_INTERVAL)
logger.error(f"VM HTTP server at {url} not ready within {timeout}s")
return False
def start_emulator(self, path_to_vm: str, headless: bool, os_type: str = "Windows"):
"""Start the Proxmox VM.
Args:
path_to_vm: The VM ID as a string (e.g. "102").
headless: Ignored for Proxmox (VMs are always headless on server).
os_type: OS type of the VM.
"""
vmid = path_to_vm
logger.info(f"Starting Proxmox VM {vmid}...")
print(f"Starting Proxmox VM {vmid}...")
status = self._get_vm_status(vmid)
if status == "running":
logger.info(f"VM {vmid} is already running.")
else:
self._ssh_exec(f"qm start {vmid}")
if not self._wait_for_status(vmid, "running", timeout=120):
raise RuntimeError(f"Failed to start VM {vmid}")
# Wait for Flask HTTP server inside VM to be ready
vm_ip = self._resolve_vm_ip(vmid)
self._wait_for_vm_ready(vm_ip)
def _resolve_vm_ip(self, vmid: str) -> str:
"""Try to get VM IP via QEMU Guest Agent, fall back to env var."""
if self._vm_ip_cache:
return self._vm_ip_cache
# Try QEMU Guest Agent
try:
output = self._ssh_exec(
f"qm guest cmd {vmid} network-get-interfaces",
timeout=15,
check=False,
)
if output and "ip-address" in output:
import json
interfaces = json.loads(output)
for iface in interfaces:
for addr in iface.get("ip-addresses", []):
ip = addr.get("ip-address", "")
# Skip loopback and IPv6 link-local
if ip and not ip.startswith("127.") and not ip.startswith("fe80") and ":" not in ip:
logger.info(f"Got VM {vmid} IP from guest agent: {ip}")
self._vm_ip_cache = ip
return ip
except Exception as e:
logger.debug(f"Guest agent query failed: {e}")
# Fallback to env var / default
logger.info(f"Using fallback VM IP: {self.vm_ip_fallback}")
self._vm_ip_cache = self.vm_ip_fallback
return self.vm_ip_fallback
def get_ip_address(self, path_to_vm: str) -> str:
"""Return the VM's IP address.
Args:
path_to_vm: The VM ID as a string.
Returns:
IP address string (e.g. "10.10.17.10").
"""
vmid = path_to_vm
return self._resolve_vm_ip(vmid)
def save_state(self, path_to_vm: str, snapshot_name: str):
"""Create a snapshot of the VM.
Args:
path_to_vm: The VM ID.
snapshot_name: Name for the snapshot.
"""
vmid = path_to_vm
logger.info(f"Creating snapshot '{snapshot_name}' for VM {vmid}...")
self._ssh_exec(f"qm snapshot {vmid} {snapshot_name}", timeout=120)
time.sleep(WAIT_TIME)
logger.info(f"Snapshot '{snapshot_name}' created for VM {vmid}.")
def revert_to_snapshot(self, path_to_vm: str, snapshot_name: str):
"""Revert the VM to a snapshot and restart it.
Args:
path_to_vm: The VM ID.
snapshot_name: Name of the snapshot to revert to.
Returns:
The VM ID (path_to_vm).
"""
vmid = path_to_vm
logger.info(f"Reverting VM {vmid} to snapshot '{snapshot_name}'...")
# Stop VM first if running
status = self._get_vm_status(vmid)
if status == "running":
self._ssh_exec(f"qm stop {vmid}", timeout=60)
self._wait_for_status(vmid, "stopped", timeout=60)
# Rollback to snapshot
self._ssh_exec(f"qm rollback {vmid} {snapshot_name}", timeout=120)
time.sleep(WAIT_TIME)
# Clear IP cache since IP might change after rollback
self._vm_ip_cache = None
logger.info(f"VM {vmid} reverted to snapshot '{snapshot_name}'.")
return path_to_vm
def stop_emulator(self, path_to_vm: str, region=None, *args, **kwargs):
"""Stop the VM.
Args:
path_to_vm: The VM ID.
"""
vmid = path_to_vm
logger.info(f"Stopping Proxmox VM {vmid}...")
status = self._get_vm_status(vmid)
if status == "stopped":
logger.info(f"VM {vmid} is already stopped.")
return
self._ssh_exec(f"qm stop {vmid}", timeout=60)
self._wait_for_status(vmid, "stopped", timeout=60)
self._vm_ip_cache = None
logger.info(f"VM {vmid} stopped.")

View File

@@ -0,0 +1,29 @@
@echo off
echo ========================================
echo Unzip + Install (Win7 32bit Python3.8)
echo ========================================
echo.
set "ZIPFILE=%~dp0win7_server_packages.zip"
set "DESTDIR=%~dp0"
if not exist "%ZIPFILE%" (
echo [ERROR] win7_server_packages.zip not found!
echo Please put this bat and the zip in the same folder.
pause
exit /b 1
)
echo [1/3] Unzipping via Shell.Application (Win7 compatible) ...
powershell -NoProfile -ExecutionPolicy Bypass -Command "$s=New-Object -ComObject Shell.Application; $d=$s.NameSpace('%DESTDIR%'); $z=$s.NameSpace('%ZIPFILE%'); $d.CopyHere($z.Items(), 20); Start-Sleep -s 5"
echo.
if not exist "%~dp0win7_offline_packages\install_win7.bat" (
echo [ERROR] Unzip failed. Folder win7_offline_packages not found.
pause
exit /b 1
)
echo [2/3] Unzip OK. Starting install ...
echo.
call "%~dp0win7_offline_packages\install_win7.bat"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
@echo off
cd /d D:\python_server
start /B pythonw D:\python_server\main.py

View File

@@ -0,0 +1,58 @@
#!/bin/bash
# Mac 端传输脚本 —— 将 Win7 离线包通过 HTTP 共享Win7 用浏览器或 PowerShell 下载
# 用法: bash transfer_to_win7.sh
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PKG_DIR="$SCRIPT_DIR/win7_offline_packages"
WIN7_IP="192.168.1.11"
MAC_IP="192.168.1.10"
PORT=8888
echo "========================================"
echo " Mac → Win7 离线包传输工具"
echo " Mac: $MAC_IP Win7: $WIN7_IP"
echo "========================================"
echo ""
# 检查连通性
echo "[1/3] 检测 Win7 网络连通性..."
if ping -c 2 -W 1000 "$WIN7_IP" > /dev/null 2>&1; then
echo " [OK] Win7 ($WIN7_IP) 可达"
else
echo " [警告] ping 超时,请确认网线已连接且 IP 配置正确"
fi
# 打包
echo ""
echo "[2/3] 打包离线文件..."
cd "$SCRIPT_DIR"
zip -r win7_server_packages.zip win7_offline_packages/ 2>/dev/null
echo " [OK] 已打包 → $(pwd)/win7_server_packages.zip"
echo " [OK] 解压脚本 → $(pwd)/extract_and_install.bat"
# 启动 HTTP 服务器
echo ""
echo "[3/3] 启动文件共享服务器..."
echo ""
echo " ┌──────────────────────────────────────────────────────────┐"
echo " │ 在 Win7 浏览器IE中打开 │"
echo " │ http://$MAC_IP:$PORT/ │"
echo " │ │"
echo " │ ★ 第一步:下载 extract_and_install.bat小文件先下 │"
echo " │ ★ 第二步:下载 win7_server_packages.zip大文件 │"
echo " │ ★ 第三步:把两个文件放同一目录,双击 bat 文件 │"
echo " │ (会自动解压 + 自动安装所有依赖) │"
echo " │ │"
echo " │ 如果无法双击 bat → 在命令提示符(cmd)中运行: │"
echo " │ cd 下载目录路径 │"
echo " │ extract_and_install.bat │"
echo " └──────────────────────────────────────────────────────────┘"
echo ""
echo " 按 Ctrl+C 停止服务器"
echo ""
# 在 zip 所在目录启动 HTTP 服务
cd "$SCRIPT_DIR"
python3 -m http.server $PORT

View File

@@ -0,0 +1,34 @@
@echo off
echo ========================================
echo Offline Install for Win7 32bit Py3.8
echo ========================================
echo.
python --version 2>&1 | findstr /C:"3.8"
if errorlevel 1 (
echo [ERROR] Python 3.8 not found.
pause
exit /b 1
)
echo [OK] Python 3.8 detected.
echo.
echo [Step 1] Installing build tools first...
cd /d "%~dp0"
python -m pip install --no-index --find-links . setuptools wheel
echo [Step 2] Installing all packages...
python -m pip install --no-index --find-links . six zipp importlib_metadata certifi idna urllib3 charset_normalizer requests MarkupSafe itsdangerous click blinker werkzeug jinja2 flask pywin32 numpy Pillow lxml pygame pymsgbox pytweening pyscreeze PyGetWindow MouseInfo PyAutoGUI pynput pywinauto
echo.
echo [Step 2] Verifying...
python -c "import flask; print('[OK] flask ' + flask.__version__)"
python -c "import pyautogui; print('[OK] pyautogui')"
python -c "import pywinauto; print('[OK] pywinauto')"
python -c "import numpy; print('[OK] numpy ' + numpy.__version__)"
python -c "import PIL; print('[OK] Pillow ' + PIL.__version__)"
echo.
echo ========================================
echo Done! Run: python ..\main.py
echo ========================================
pause

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,44 @@
# Win7 32位 Python3.8 离线安装清单
# 安装命令: pip install --no-index --find-links . -r requirements_win7.txt
# 底层依赖先装
six
zipp
importlib_metadata
certifi
idna
urllib3
charset_normalizer
requests
# Flask 依赖链
MarkupSafe
itsdangerous
click
blinker
werkzeug
jinja2
flask
# Win32 底层
pywin32
# 数据处理
numpy
Pillow
lxml
pygame
# GUI 控制
pymsgbox
pytweening
pyscreeze
PyGetWindow
MouseInfo
PyAutoGUI
# 输入控制
pynput
# Win 自动化
pywinauto

Binary file not shown.

View File

@@ -0,0 +1,34 @@
# generated using pymatgen
data_NaCl
_symmetry_space_group_name_H-M 'P 1'
_cell_length_a 5.69169400
_cell_length_b 5.69169400
_cell_length_c 5.69169400
_cell_angle_alpha 90.00000000
_cell_angle_beta 90.00000000
_cell_angle_gamma 90.00000000
_symmetry_Int_Tables_number 1
_chemical_formula_structural NaCl
_chemical_formula_sum 'Na4 Cl4'
_cell_volume 184.38459333
_cell_formula_units_Z 4
loop_
_symmetry_equiv_pos_site_id
_symmetry_equiv_pos_as_xyz
1 'x, y, z'
loop_
_atom_site_type_symbol
_atom_site_label
_atom_site_symmetry_multiplicity
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
_atom_site_occupancy
Na Na0 1 0.00000000 0.00000000 0.00000000 1
Na Na1 1 0.00000000 0.50000000 0.50000000 1
Na Na2 1 0.50000000 0.00000000 0.50000000 1
Na Na3 1 0.50000000 0.50000000 0.00000000 1
Cl Cl4 1 0.50000000 0.00000000 0.00000000 1
Cl Cl5 1 0.50000000 0.50000000 0.50000000 1
Cl Cl6 1 0.00000000 0.00000000 0.50000000 1
Cl Cl7 1 0.00000000 0.50000000 0.00000000 1

View File

@@ -0,0 +1,113 @@
#------------------------------------------------------------------------------
#$Date: 2023-03-26 11:09:57 +0300 (Sun, 26 Mar 2023) $
#$Revision: 282068 $
#$URL: svn://localhost/cod/cif/5/00/02/5000223.cif $
#------------------------------------------------------------------------------
#
# This file is available in the Crystallography Open Database (COD),
# http://www.crystallography.net/
#
# All data on this site have been placed in the public domain by the
# contributors.
#
data_5000223
loop_
_publ_author_name
'Horn, M'
'Schwerdtfeger, C F'
'Meagher, E P'
_publ_section_title
;
Refinement of the structure of anatase at several temperatures
Sample: T = 300 C
;
_journal_name_full
;
Zeitschrift fuer Kristallographie, Kristallgeometrie, Kristallphysik,
Kristallchemie (-144,1977)
;
_journal_page_first 273
_journal_page_last 281
_journal_volume 136
_journal_year 1972
_chemical_compound_source 'Lengenbach quarry, Binnatal, Switzerland'
_chemical_formula_structural TiO2
_chemical_formula_sum 'O2 Ti'
_chemical_name_mineral Anatase
_chemical_name_systematic 'Titanium oxide'
_space_group_IT_number 141
_symmetry_cell_setting tetragonal
_symmetry_space_group_name_Hall 'I 4bw 2bw -1bw'
_symmetry_space_group_name_H-M 'I 41/a m d :1'
_cell_angle_alpha 90
_cell_angle_beta 90
_cell_angle_gamma 90
_cell_formula_units_Z 4
_cell_length_a 3.7892(4)
_cell_length_b 3.7892(4)
_cell_length_c 9.537(1)
_cell_volume 136.9
_database_code_amcsd 0010736
_diffrn_ambient_temperature 573.15
_exptl_crystal_density_diffrn 3.875
_refine_ls_R_factor_all 0.023
_cod_original_sg_symbol_H-M 'I 41/a m d S'
_cod_original_formula_sum 'Ti O2'
_cod_database_code 5000223
loop_
_space_group_symop_operation_xyz
x,y,z
-x,-y,z
x,1/2+y,1/4-z
-x,1/2-y,1/4-z
-x,y,z
x,-y,z
-x,1/2+y,1/4-z
x,1/2-y,1/4-z
y,x,-z
-y,-x,-z
y,1/2+x,1/4+z
-y,1/2-x,1/4+z
-y,x,-z
y,-x,-z
-y,1/2+x,1/4+z
y,1/2-x,1/4+z
1/2+x,1/2+y,1/2+z
1/2-x,1/2-y,1/2+z
1/2+x,y,3/4-z
1/2-x,-y,3/4-z
1/2-x,1/2+y,1/2+z
1/2+x,1/2-y,1/2+z
1/2-x,y,3/4-z
1/2+x,-y,3/4-z
1/2+y,1/2+x,1/2-z
1/2-y,1/2-x,1/2-z
1/2+y,x,3/4+z
1/2-y,-x,3/4+z
1/2-y,1/2+x,1/2-z
1/2+y,1/2-x,1/2-z
1/2-y,x,3/4+z
1/2+y,-x,3/4+z
loop_
_atom_site_label
_atom_site_type_symbol
_atom_site_symmetry_multiplicity
_atom_site_Wyckoff_symbol
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
_atom_site_occupancy
_atom_site_attached_hydrogens
_atom_site_calc_flag
Ti1 Ti4+ 4 a 0. 0. 0. 1. 0 d
O1 O2- 8 e 0. 0. 0.2079(2) 1. 0 d
loop_
_atom_type_symbol
_atom_type_oxidation_number
Ti4+ 4.000
O2- -2.000
loop_
_cod_related_entry_id
_cod_related_entry_database
_cod_related_entry_code
1 AMCSD 0010736

View File

@@ -0,0 +1,45 @@
{
"id": "building-metal-complexes_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,使用 Template Tool 创建 [Co(NH3)6]3+ 配位化合物,设置为八面体配位几何。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 按下键盘快捷键 Ctrl+3或在顶部工具栏中单击 Template Tool 图标),激活模板工具。\n2. 在左侧(或右侧)的模板工具控制面板中,单击选中 Centers 选项卡。\n3. 在键盘上依次输入字母 C 和 o以选择 Cobalt (钴) 元素作为金属中心。\n4. 在形式电荷输入框旁,连续单击三次向上箭头(∧)按钮,将中心离子的形式电荷设置为 +3。\n5. 单击坐标下拉框,选择 6: Octahedral八面体选项设定配位几何形状为八面体。\n6. 将鼠标移动到主界面的 3D 视图空白区域,单击鼠标左键,放置带有六个配位氢原子的钴中心结构。\n7. 在模板工具控制面板中,单击选中 Ligands 选项卡。\n8. 单击 Ligand 下拉框,从列表中选择 ammine (NH3) 配体。\n9. 在 3D 视图中,将鼠标悬停并单击钴原子上的第 1 个氢原子,将其替换为氨配体。\n10. 若有氢原子被遮挡,按下 Ctrl+1 切换至导航视角,拖动鼠标旋转分子,使目标氢原子可见,再切换回 Ctrl+3 模板工具后单击钴原子上的第 2 个氢原子,将其替换为氨配体。\n11. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3单击钴原子上的第 3 个氢原子,将其替换为氨配体。\n12. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3单击钴原子上的第 4 个氢原子,将其替换为氨配体。\n13. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3单击钴原子上的第 5 个氢原子,将其替换为氨配体。\n14. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3单击钴原子上的第 6 个氢原子,将其替换为氨配体,完成 [Co(NH3)6]3+ 化合物的构建。",
"steps_original": "1. 打开 Template Tool快捷键 Ctrl+3 或点击工具栏图标)。\n2. 切换到 Centers 选项卡。\n3. 输入 'Co' 或从弹出菜单中选择钴元素。\n4. 点击三次 '+' 符号,将正电荷设置为 +3。\n5. 按键 '6' 或选择八面体几何形状。\n6. 点击空白区域,放置钴中心,六个氢原子会显示在配位位置。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-metal-complexes_task3",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,使用 Template Tool 创建 [Ni(en)(NH3)2]2+ 配位化合物,设置为平面四方配位几何。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部工具栏中,单击 'Template Tool' 图标按钮(或在键盘上按 Ctrl+3 快捷键)以激活模板工具面板。\n2. 在弹出的模板工具面板中,单击顶部名为 'Centers' 的选项卡。\n3. 在键盘上依次输入字母键 'N' 和 'i',或单击元素下拉菜单并选择 'Nickel',以选中镍元素。\n4. 在形式电荷(形式电荷)数值框旁,连续单击向上箭头('^')按钮两次,将中心离子的形式电荷从 0 调整为 '+2'。\n5. 单击坐标(坐标)下拉菜单将其展开,在弹出的选项列表中选择 '4: Square Planar',以设置平面四方配位几何构型。\n6. 将鼠标移动到 3D 模型视图的空白区域,单击鼠标左键以放置带有四个占位氢原子的镍中心。\n7. 在模板工具面板中,单击顶部名为 'Ligands' 的选项卡切换到配体模式。\n8. 在键盘上依次输入字母键 'e' 和 'n',以在配体库中选中 'ethylenediamine' (乙二胺) 配体。\n9. 在 3D 视图中,单击选中中心镍原子周围的任意一个氢原子。\n10. 在 3D 视图中,单击与上一步选中的氢原子相邻(顺式位置)的另一个氢原子,完成双齿配体的桥接结合。\n11. 在模板工具面板中,单击 '类型Type' 下拉菜单,将配体类型从 'Bidentate'(双齿)切换为 'Monodentate'(单齿),然后单击 'Ligand' 下拉菜单并选择 'ammine'(氨)配体。\n12. 在 3D 视图中,单击剩余的第三个占位氢原子将其替换为氨配体。\n13. 在 3D 视图中,单击最后一个剩余的氢原子,将其替换为第二个氨配体,完成目标化合物构建。",
"steps_original": "1. 打开 Template Tool。\n2. 切换到 Centers 选项卡。\n3. 输入 'Ni' 或从弹出菜单中选择镍元素。\n4. 连续单击形式电荷数值框旁的向上箭头('^')按钮两次,将正电荷设置为 +2。\n5. 单击坐标下拉菜单将其展开,在列表中选择 '4: Square Planar' 平面四方几何形状。\n6. 点击空白区域,放置镍中心,四个氢原子会显示在配位位置。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-metal-complexes_task7",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,创建具有两个环戊二烯基 (Cp) 和两个氯配体的 ZrCp2Cl2 配合物。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在键盘上按下快捷键 Ctrl+3或在工具栏中单击 \"Template Tool\" 图标按钮以激活模板工具。\n2. 在左侧界面的 Template Tool 设置面板中,单击选中 \"Centers\" 选项卡。\n3. 在键盘上依次按下字母键 'Z' 和 'r',将中心元素选定为锆 (Zirconium)。\n4. 在键盘上连续按下 '+' 键 4 次,将中心原子的形式电荷 (formal charge) 设置为 +4。\n5. 在键盘上按下数字键 '4',选择四面体 (tetrahedral) 作为配位几何构型。\n6. 将鼠标指针移动到中间的主绘图视口的空白区域,单击鼠标左键,放置一个带有四个氢原子的锆中心骨架。\n7. 在左侧界面的 Template Tool 设置面板中,单击选中 \"Ligands\" 选项卡。\n8. 在键盘上依次按下字母键 'c' 和 'p',选定环戊二烯基 (η5-cyclopentadienyl) 作为配体。\n9. 将鼠标指针移动到主绘图视口中锆中心上的任意一个氢原子球体上,单击鼠标左键,将其替换为第一个 Cp 配体环。\n10. 将鼠标指针移动到与刚才位置相邻的另一个氢原子球体上,单击鼠标左键,将其替换为第二个 Cp 配体环。\n11. 在键盘上按下快捷键 Ctrl+2或在工具栏中单击 \"Draw Tool\" 图标按钮以切换到绘制工具。\n12. 在左侧界面的 Draw Tool 设置面板中,单击 \"Element\" 右侧的下拉菜单选框。\n13. 在展开的元素列表中,单击选择 \"Chlorine (17)\"(或直接在键盘输入 'Cl' 选择氯元素)。\n14. 将鼠标指针移动到主绘图视口中剩余的第一个氢原子球体上,单击鼠标左键,将其替换为氯配体。\n15. 将鼠标指针移动到主绘图视口中最后一个氢原子球体上,单击鼠标左键,将其替换为第二个氯配体。",
"steps_original": "1. 打开 Template Tool点击 Centers 选项卡。\n2. 输入 'Zr' 或选择锆元素。\n3. 点击四次 '+',将正电荷设置为 +4。\n4. 按键 '4',选择四面体几何形状。\n5. 在空白区域放置锆中心。\n6. 切换到 Ligands 选项卡,输入 'cp' 或选择环戊二烯基。\n7. 点击一个氢原子,添加第一个 Cp 配体。\n8. 点击相邻氢,添加第二个 Cp 配体。\n9. 切换到 Draw Tool快捷键 Ctrl+2。\n10. 选择 Cl 元素。\n11. 点击两个剩余氢原子,每次点击替换为氯配体。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-organic-molecules_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,使用软件的 Build 工具插入一个苯环。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 点击菜单栏 Build(构建) → Insert(插入) → Molecule(分子…),打开\"插入片段\"对话框。\n2. 在\"筛选\"输入框中输入 benzene。\n3. 筛选结果会显示一个 aromatics 文件夹(树形结构),需要双击或点击展开该文件夹。\n4. 展开后选中列表中的 benzene.cjson 文件。\n5. 点击\"插入\"按钮将苯环插入到工作区。\n6. 点击关闭按钮关闭\"插入片段\"对话框,确认苯环已显示在主工作界面中。",
"steps_original": "1. 点击 Build → Insert → Molecule。\n2. 搜索 'benzene' 并确定插入该分子。\n3. 确保苯环显示在工作界面中。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-organic-molecules_task3",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,在甲苯分子的对位添加一硝基(-NO2生成 4-硝基甲苯。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在键盘上输入大写字母 \"N\"(可使用 Shift + n 组合键在当前的模板工具中选择硝基Nitro group。\n2. 在主界面的 3D 分子视图区中定位到甲苯分子上与甲基基团直接相对的对位para position氢原子。\n3. 单击该对位氢原子,将其替换为硝基(-NO2以生成 4-硝基甲苯分子。\n4. 按下键盘组合键 \"Ctrl+Alt+O\"运行几何优化Geometry Optimization以清理并确保最终分子结构的正确性。",
"steps_original": "1. 按 'N' 键选择硝基。\n2. 点击甲基对位(苯环上的一个氢原子),将其替换为 -NO2。\n3. 确保分子结构正确。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-organic-molecules_task4",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,为甲苯分子执行几何优化。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在当前激活的 Avogadro 2 主窗口中,按下键盘上的 Ctrl+Alt+O 组合键触发几何优化。\n2. 在主界面的 3D 渲染视图中,观察甲苯分子的空间结构变化。\n3. 等待分子的原子位置停止移动,确认其几何构型已优化至合理的化学结构。",
"steps_original": "1. 按 Ctrl+Alt+O 或点击 Auto Optimize 工具执行几何优化。\n2. 检查分子是否获得合乎逻辑的几何结构。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-organic-molecules_task5",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,使用 Draw Tool 创建一个单碳结构,然后添加一个羧基(-COOH。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在软件主工具栏中,单击选中 \"Draw Tool\" 工具图标。\n2. 在主视窗的空白3D显示区域中单击鼠标左键绘制生成一个单碳结构甲烷包含一个碳和四个氢。\n3. 按下键盘快捷键 Ctrl+3或单击主工具栏上的 Template Tool 图标),激活 \"Template Tool\"。\n4. 在 Template Tool 的面板中,单击选中 \"Groups\" 选项卡(或按键盘右方向键两次切换到该选项卡)。\n5. 在键盘上输入大写字母 C或输入 co2以选择羧基carboxylate模板。\n6. 将鼠标光标移动到主视窗中刚绘制的单碳结构上,对准其中任意一个氢原子(白色球体)。\n7. 单击鼠标左键,将该氢原子替换为羧基(-COOH完成结构的添加。",
"steps_original": "1. 使用 Draw Tool 在界面中绘制一个单碳。\n2. 激活 Template Tool通过按 Ctrl+3 或点击工具栏上的图标进入 Groups。\n3. 按 'C' 或 'co' 选择羧基。\n4. 点击单碳结构上的一个氢原子,将其替换为羧基。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "building-organic-molecules_task9",
"snapshot": "avogadro",
"instruction": "在 Avogadro 2 中,创建一个 4-甲氧基-3-硝基苯甲酸分子,包含苯环、羧基、硝基和甲氧基。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 单击顶部菜单栏的 \"Build\"。\n2. 在弹出的下拉菜单中,将鼠标悬停在 \"Insert\" 上以展开子菜单。\n3. 单击子菜单中的 \"Molecule...\",打开分子插入对话框。\n4. 将鼠标光标定位到对话框的搜索输入框中,输入文本 \"benzene\"。\n5. 在下方显示的搜索结果列表中,单击选中 \"benzene\" 项。\n6. 单击对话框上的 \"Insert\" (或对应的确认) 按钮,将苯环插入到主绘图区。\n7. 按下键盘快捷键 `Ctrl+3`,激活 \"Template Tool\"(模板工具)。\n8. 在界面左侧(或右侧)的工具选项面板中,单击选中 \"Groups\" 标签页(或按两次键盘右方向键 `->` 进行切换)。\n9. 在键盘上直接输入大写字母 `C`,以设定当前要添加的官能团为羧基 (Carboxyl)。\n10. 在主绘图区中单击苯环上的任意一个白色氢原子球计为位置1将其替换为羧基。\n11. 在键盘上直接输入大写字母 `N`,以设定当前要添加的官能团为硝基 (Nitro)。\n12. 在主绘图区中单击苯环上与羧基相隔一个碳原子的白色氢原子球间位即位置3将其替换为硝基。\n13. 在键盘上直接输入小写字母 `om`,以设定当前要添加的官能团为甲氧基 (Methoxy)。\n14. 在主绘图区中单击苯环上与羧基处于正对面的白色氢原子球对位即位置4将其替换为甲氧基。\n15. 按下键盘快捷键 `Ctrl+Alt+O`,调用优化功能清理并自动调整分子的几何空间构型。",
"steps_original": "1. 插入苯环。\n2. 按 'C' 键选择羧基,并添加到苯环的第 1 个位置。\n3. 按 'N' 键选择硝基,并添加到苯环的第 3 个位置。\n4. 按 'om' 键选择甲氧基,并添加到苯环的第 4 个位置。\n5. 使用优化工具进行几何优化并检查分子是否正确。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "naming-a-molecule_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中通过 Analysis → Properties → Molecular... 查看当前分子的 IUPAC 名称及相关性质。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 打开 Avogadro 软件。\n2. 在软件顶部菜单栏中,单击 \"Analysis\" 菜单。\n3. 在弹出的下拉菜单中,单击 \"Properties\" 菜单项以展开下一级子菜单。\n4. 在弹出的子菜单中,单击 \"Molecular...\" 菜单项。\n5. 等待名为 \"Molecular Properties\" 的对话框窗口弹出。\n6. 在 \"Molecular Properties\" 窗口中,查看 \"Molecule Name\" 标签右侧显示的文本,获取分子的 IUPAC 名称。\n7. 在同一个窗口中,继续查看 \"Molecular Mass (g/mol)\"、\"Chemical Formula\"、\"Number of Atoms\" 和 \"Number of Bonds\" 标签右侧对应的属性数值。\n8. 查看完毕后,单击窗口右下角的蓝色 \"OK\" 按钮以关闭该对话框。",
"steps_original": "1. 打开 Avogadro 软件。\n2. 点击菜单栏中的 Analysis。\n3. 从下拉菜单选择 Properties。\n4. 点击 Molecular...。\n5. 在弹出的 'Molecular Properties' 窗口中查看分子的名字和相关信息,例如分子质量、化学式、原子数和键数。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "using-qtaim-and-wfn_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,使用 QTAIM 插件的 Molecular Graph with Lone Pairs 功能打开 b2h6.wfn 文件。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"b2h6.wfn"
],
"steps": "1. 单击顶部菜单栏中的 \"Extensions\" 菜单项\n2. 将鼠标悬停在弹出的下拉菜单中的 \"QTAIM\" 菜单项上以展开子菜单\n3. 单击展开的子菜单中的 \"Molecular Graph with Lone Pairs...\" 菜单项\n4. 在弹出的文件选择窗口的文件列表中,单击选中名为 \"b2h6.wfn\" 的文件项\n5. 单击文件选择窗口右下角的 \"Open\" 按钮",
"steps_original": "1. 点击顶部菜单栏的 Extensions\n2. 在下拉菜单中悬停于 QTAIM 以展开子菜单\n3. 点击选择 Molecular Graph with Lone Pairs...\n4. 在弹出的文件选择窗口中,找到并选中 b2h6.wfn 文件\n5. 点击 Open 按钮加载文件并启动分析"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "using-qtaim-and-wfn_task2",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,通过调整 Display Types 面板开启 QTAIM 视图并关闭球棍模型,以便突出显示键临界点。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在软件主界面中,找到标有 \"Display Types\" 的面板区域。\n2. 在 \"Display Types\" 面板的选项列表中,滚动查找并定位到标有 \"QTAIM\" 的选项。\n3. 单击 \"QTAIM\" 选项左侧的复选框,确保其处于被勾选状态。\n4. 在同一个 \"Display Types\" 面板的选项列表中,滚动查找并定位到标有 \"Ball and Stick\" 的选项。\n5. 单击 \"Ball and Stick\" 选项左侧的复选框,将其取消勾选。",
"steps_original": "1. 定位到软件界面中的 Display Types显示类型面板\n2. 在列表中找到 QTAIM 选项,并勾选其左侧的复选框\n3. 在同一列表中找到 Ball and Stick 选项\n4. 取消勾选 Ball and Stick 的复选框以隐藏经典模型"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "using-qtaim-and-wfn_task3",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,完整执行 QTAIM 电子密度分析流程:加载 b2h6.wfn 文件并将界面设置为仅显示 QTAIM 元素的模式。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"b2h6.wfn"
],
"steps": "1. 单击顶部菜单栏的 \"Extensions\" 菜单项。\n2. 在展开的下拉菜单中,单击(或鼠标悬停) \"QTAIM\" 菜单项以展开子菜单。\n3. 在弹出的级联子菜单中,单击选中 \"Molecular Graph with Lone Pairs...\" 选项。\n4. 在弹出的文件选择对话框的文件列表中,单击选中名为 \"b2h6.wfn\" 的文件。\n5. 单击对话框右下角的 \"Open\" 按钮。\n6. 等待界面弹出包含 \"Electron Density Sources Search\" 文本的进度条对话框,并等待该对话框完成处理并自动消失。\n7. 在界面侧边栏的 \"Display Types\" 列表中,向下查找并定位到 \"QTAIM\" 选项。\n8. 单击 \"QTAIM\" 选项左侧的复选框,将其状态设置为勾选。\n9. 在同一个 \"Display Types\" 列表中,向上查找并定位到 \"Ball and Stick\" 选项。\n10. 单击 \"Ball and Stick\" 选项左侧的复选框,将其状态设置为取消勾选。",
"steps_original": "1. 依次点击菜单栏的 Extensions -> QTAIM -> Molecular Graph with Lone Pairs...\n2. 在文件对话框中选中 b2h6.wfn 文件,并点击 Open 按钮\n3. 等待弹出的 Electron Density Sources Search 进度条完成并消失\n4. 在界面的 Display Types 列表中,勾选 QTAIM 选项以显示 AIM 注释\n5. 在同一列表中,取消勾选 Ball and Stick 选项以获得纯净的 QTAIM 视角"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "viewing-electrostatic-potential_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中通过 Analyze → Create Surfaces 菜单创建 Van der Waals 表面并设置电荷分布可视化。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 单击顶部菜单栏的 \"Analyze\" 菜单项。\n2. 在展开的下拉菜单中,单击选中 \"Create Surfaces...\" 选项。\n3. 在弹出的 \"Create Surfaces\" 对话框中,单击 \"Surface:\" 标签右侧的下拉菜单。\n4. 在展开的下拉列表中,单击选中 \"Van der Waals\" 选项。\n5. 单击 \"Color by:\" 标签右侧的第一个下拉菜单。\n6. 在展开的下拉列表中,单击选中 \"Electrostatic Potential\" 选项。\n7. 单击 \"Color by:\" 行右侧的第二个下拉菜单(位于 Electrostatic Potential 右侧)。\n8. 在展开的下拉列表中,单击选中 \"EEM\" 选项。\n9. 单击 \"Colormap:\" 标签右侧的下拉菜单。\n10. 在展开的下拉列表中,单击选中 \"Balance\" 选项。\n11. 单击对话框左下角的 \"Calculate\" 按钮。\n12. 等待计算完成后,单击对话框右下角的 \"Close\" 按钮关闭该对话框。",
"steps_original": "1. 打开 Avogadro 软件并加载目标分子的模型。\n2. 通过菜单栏选择 Analyze → Create Surfaces。\n3. 在弹出的 Create Surfaces 对话框中,将 Surface 设置为 'Van der Waals'。\n4. 将 Color By 设置为 'Electrostatic Potential'。\n5. 选择一个电荷模型(例如 'EEM')。\n6. 选择色阶为 'Balance'。\n7. 点击 'Calculate' 按钮开始计算表面。\n8. 等待软件完成计算,点击 'Close' 关闭对话框。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewing-molecular-orbitals_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,打开桌面上的 benzene.fchk 文件,并在自动弹出的 Molecular Orbitals 窗口中点击渲染 LUMO 轨道",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"benzene.fchk"
],
"steps": "1. 在顶部菜单栏中,单击 \"File\" 菜单\n2. 在展开的下拉菜单中,单击 \"Open...\" 选项\n3. 在弹出的文件选择对话框中,单击左侧导航栏的\"桌面\"Desktop目录\n4. 在右侧的文件列表中,单击选中 \"benzene.fchk\" 文件\n5. 单击对话框右下角的\"打开\"Open按钮以加载文件\n6. 等待并定位到自动弹出的 \"Molecular Orbitals\" 窗口的轨道数据表格\n7. 在表格中,单击选中 \"Orbital\" 列文本为 \"LUMO\" 的数据行以在主视图中渲染该轨道",
"steps_original": "1. 通过 File → Open 打开桌面上的 benzene.fchk 文件(此时会自动弹出 Molecular Orbitals 窗口)\n2. 在 Molecular Orbitals 窗口的表格中,找到并点击 Orbital 列名为 'LUMO' 的行以渲染该轨道"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewing-molecular-orbitals_task2",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,打开桌面上的 benzene.fchk 文件,将 LUMO 轨道的渲染质量设置为 High 并重新渲染",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"benzene.fchk"
],
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单\n2. 在展开的下拉菜单中,单击选择 \"Open...\" 选项\n3. 在弹出的文件选择对话框中,在左侧导航栏或地址栏中单击定位到桌面 (Desktop)\n4. 在文件列表中,单击选中 \"benzene.fchk\" 文件\n5. 单击对话框右下角的 \"Open\" (或\"打开\") 按钮\n6. 在自动弹出的 \"Molecular Orbitals\" 窗口中,定位到包含 Orbital、Energy (eV) 和 Status 列的表格\n7. 在表格中,单击选中 \"Orbital\" 列显示为 \"LUMO\" 的行\n8. 单击窗口底部 \"Quality:\" 标签右侧的下拉菜单 (当前默认显示为 \"Medium\")\n9. 在弹出的下拉列表中,单击选中 \"High\" 选项\n10. 单击下拉菜单右侧的 \"Render\" 按钮",
"steps_original": "1. 通过 File → Open 打开桌面上的 benzene.fchk 文件\n2. 在自动弹出的 Molecular Orbitals 窗口表格中,点击选中 'LUMO' 轨道\n3. 点击窗口底部的 'Quality' 下拉菜单,将选项从默认的 'Medium' 更改为 'High'\n4. 点击右侧的 'Render' 按钮进行高质量渲染"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewing-vibrations_task1",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,打开频率计算文件 freq.out在振动模式窗口中选择频率为 1264.47 cm⁻¹ 的模式并开始播放动画。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"freq.out"
],
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Open...\" 菜单项\n3. 在弹出的文件选择对话框中,单击左侧导航面板中的 \"桌面\"(或 Desktop选项\n4. 在对话框的文件列表区域中,单击选中名为 \"freq.out\" 的文件\n5. 单击文件选择对话框右下角的 \"打开\"(或 Open按钮此时会自动弹出 \"Vibrational Modes\" 窗口)\n6. 定位到新弹出的 \"Vibrational Modes\" 窗口中央的数据表格\n7. 在该数据表格中,单击选中第一列序号为 \"8\" 且 \"Frequency (cm⁻¹)\" 列为 \"1264.47\" 的所在行\n8. 定位到 \"Vibrational Modes\" 窗口的底部区域\n9. 单击标签为 \"Start Animation\" 的按钮",
"steps_original": "1. 在 Avogadro 中,通过 File → Open 菜单打开桌面上的 freq.out 文件(此时会自动弹出 Vibrational Modes 窗口)\n2. 在 Vibrational Modes 窗口的列表中,找到并点击选中序号为 8、Frequency 为 1264.47 cm⁻¹ 的行\n3. 点击窗口右下角的 Start Animation 按钮开始播放分子的振动动画"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewing-vibrations_task2",
"snapshot": "avogadro",
"instruction": "在 Avogadro 中,打开包含拉曼光谱计算结果的文件 raman.out播放 1188.7 cm⁻¹ 频率的振动动画,调大振动幅度后停止播放。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Avogadro2\\bin\\avogadro2.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"avogadro"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"raman.out"
],
"steps": "1. 点击软件顶部菜单栏的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Open...\" 选项\n3. 在弹出的文件选择对话框中,通过侧边栏或路径栏点击进入桌面目录\n4. 在文件列表中,单击选中名为 \"raman.out\" 的文件\n5. 点击对话框右下角的 \"Open\"(或“打开”)按钮\n6. 等待自动弹出 \"Vibrational Modes\" 窗口后,在该窗口的表格列表中,找到第一列为 \"7\"、\"Frequency (cm⁻¹)\" 列为 \"1188.7\" 的数据行\n7. 单击该数据行将其选中\n8. 在窗口底部,单击标签文字为 \"Start Animation\" 的按钮\n9. 将鼠标光标移动到窗口底部 \"Amplitude:\" 标签右侧的滑块控件的手柄上\n10. 按下鼠标左键不放\n11. 向右移动鼠标拖动滑块手柄\n12. 松开鼠标左键\n13. 在窗口底部,单击标签文字为 \"Stop Animation\" 的按钮",
"steps_original": "1. 在 Avogadro 中,通过 File → Open 菜单打开桌面上的 raman.out 文件,等待 Vibrational Modes 窗口自动出现\n2. 在列表中点击选中序号为 7、Frequency 为 1188.7 cm⁻¹ 的行\n3. 点击 Start Animation 按钮启动振动动画\n4. 使用鼠标按住窗口底部的 Amplitude 滑块并向右拖动,以增大振动显示的幅度\n5. 观察动画变化后,点击 Stop Animation 按钮停止播放"
}
}

View File

@@ -0,0 +1,40 @@
{
"id": "flsol_task1",
"snapshot": "flsol",
"instruction": "启动 FL Solutions for F-4600 软件,并截图确认主界面已成功打开。",
"source": "custom",
"config": [
{
"type": "sleep",
"parameters": {
"seconds": 2
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"flsol"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 4
}
}
],
"func": "vllm_eval",
"expected": {
"description": "FL Solutions for F-4600 主界面应已打开可见菜单栏File, Method, Measure 等)和仪器连接状态面板。"
}
},
"proxy": false,
"fixed_ip": true,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 双击桌面上的 FL Solutions for F-4600 快捷方式,或通过开始菜单找到并打开 FL Solutions 程序路径C:\\Program Files\\FL Solutions\\flsol.exe。\n2. 等待程序加载完成(约 5-10 秒观察主界面是否出现包含顶部菜单栏File、Method、Measure、View、Tools、Help 等选项)以及仪器状态面板。\n3. 确认主界面已打开后,操作完成。",
"steps_original": "1. 打开 FL Solutions for F-4600 软件。\n2. 等待主界面加载完毕。"
}
}

View File

@@ -0,0 +1,48 @@
{
"id": "flsol_task2",
"snapshot": "flsol",
"instruction": "打开 FL Solutions for F-4600新建一个波长扫描Wavelength Scan方法将激发波长Excitation Wavelength设置为 350 nm扫描范围设为 400700 nm扫描速度设为 240 nm/min然后保存该方法为 test_scan.mth。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Program Files\\FL Solutions\\flsol.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 8
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"flsol"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval",
"expected": {
"description": "屏幕上应显示 FL Solutions 主界面,并且在 Method 或文件相关区域可以看到名为 test_scan.mth 的方法文件已被保存/创建,或在最近文件列表中可以看到该文件名。激发波长应设为 350 nm扫描范围为 400-700 nm。"
}
},
"proxy": false,
"fixed_ip": true,
"possibility_of_env_change": "medium",
"metadata": {
"input_files": [],
"steps": "1. 等待 FL Solutions 主界面打开。\n2. 在顶部菜单栏中,单击 'Method'(方法)菜单,然后选择 'New'(新建)或 'Wavelength Scan'(波长扫描)选项,创建一个新的波长扫描方法。\n3. 在弹出的方法设置对话框中,找到 'Excitation Wavelength'(激发波长)输入框,将数值清空后输入 '350',单位为 nm。\n4. 找到扫描范围Scan Range设置区域将起始波长Start设为 '400' nm将结束波长End设为 '700' nm。\n5. 找到扫描速度Scan Speed下拉菜单或输入框选择或输入 '240' nm/min。\n6. 确认设置无误后,单击菜单 'Method' → 'Save As'(另存为),在弹出的文件保存对话框中,将文件名输入为 'test_scan',确保文件类型为 .mth然后单击 '保存'Save按钮。\n7. 确认文件已成功保存。",
"steps_original": "1. 打开 FL Solutions 并新建 Wavelength Scan 方法。\n2. 设置 Ex 波长 350 nm扫描范围 400-700 nm速度 240 nm/min。\n3. 另存为 test_scan.mth。"
}
}

View File

@@ -0,0 +1,48 @@
{
"id": "flsol_task3",
"snapshot": "flsol",
"instruction": "打开 FL Solutions for F-4600进入仪器参数设置Instrument Parameters将光电倍增管电压PMT Voltage修改为 700 V狭缝宽度Slit Width激发和发射均设置修改为 5.0 nm响应时间Response设置为 Auto然后截图确认参数设置完成。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\Program Files\\FL Solutions\\flsol.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 8
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"flsol"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval",
"expected": {
"description": "FL Solutions 的仪器参数设置界面Instrument Parameters 或 Method 设置窗口)应可见,其中 PMT Voltage 显示为 700 V激发和发射狭缝宽度Ex Slit / Em Slit均显示为 5.0 nm响应时间Response显示为 Auto。"
}
},
"proxy": false,
"fixed_ip": true,
"possibility_of_env_change": "medium",
"metadata": {
"input_files": [],
"steps": "1. 等待 FL Solutions 主界面打开。\n2. 在顶部菜单栏中,单击 'Method'(方法)菜单,选择 'New'(新建)创建一个新方法,或在现有方法的参数面板中操作。\n3. 在方法设置界面中找到仪器参数Instrument Parameters区域通常在方法编辑窗口的下方或单独的选项卡中。\n4. 找到 'PMT Voltage'(光电倍增管电压)输入框,清空当前值并输入 '700',单位为 V。\n5. 找到激发狭缝宽度EX Slit Width 或 Excitation Slit输入框或下拉菜单将值修改为 '5.0',单位为 nm。\n6. 找到发射狭缝宽度EM Slit Width 或 Emission Slit输入框或下拉菜单将值修改为 '5.0',单位为 nm。\n7. 找到响应时间Response下拉菜单单击展开选择 'Auto'(自动)选项。\n8. 确认所有参数设置完成后,截图当前界面。",
"steps_original": "1. 打开 FL Solutions进入方法/仪器参数设置。\n2. 设置 PMT 电压 700VEx/Em 狭缝宽度各 5.0 nmResponse 设为 Auto。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "flsol_task4_measure",
"snapshot": "flsol",
"instruction": "使用 FL Solutions for F-4600 软件执行一次荧光测量。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": ["C:\\Program Files\\FL Solutions\\flsol.exe"],
"shell": false
}
},
{
"type": "sleep",
"parameters": {
"seconds": 15
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"flsol"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": true,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 软件已自动打开,等待 FL Solutions 主界面完全加载,确认标题栏显示 'FL Solutions - F-4600 FL Spectrophotometer on USB' 且仪器状态正常(无报错弹窗)。\n2. 直接按键盘 F4 键触发 Measure这是最可靠的方式F4 是 Measure 的快捷键)。\n3. 如果 F4 无反应,则通过菜单执行:点击菜单栏 'Spectrophotometer'(第四个菜单项,位于 View 和 Tools 之间),在下拉菜单中点击 'Measure'(快捷键 F4。\n4. 等待测量过程完成,软件会在图表区域实时绘制扫描曲线,测量完成后曲线绘制停止。\n5. 确认图表区域有测量结果曲线后,操作完成。",
"steps_original": "1. 等待 FL Solutions 和 F-4600 仪器完全初始化,状态变为 Ready。\n2. 点击 Measure 按钮执行测量。\n3. 等待测量完成,图表区域出现曲线。"
}
}

View File

@@ -0,0 +1,417 @@
{
"id": "flsol_taskE_auto_optimize_scan",
"snapshot": "flsol",
"instruction": "假设你的目标就是测量样品的荧光图谱。下面的透露给你的辅助信息,把辅助信息当成你自己的思维和决策并完全遵循,而不是把它当成任务,**绝对不允许在输出的「观察」「判断」中说明是任务要求,而是把辅助信息当成你自己的经验,用根据我的经验使用某某配置而不是根据任务要求使用某某配置**因为下面的步骤是完全正确和精准的你只需要执行而且绝对不允许在是严格按坐标执行每步执行完等待界面响应再执行下一步禁止连续操作。修改任何数值输入框时必须先double_click双击全选pyautogui.click(x,y);pyautogui.click(x,y))再pyautogui.press(delete)最后用pyautogui.typewrite输入新值。1.等待主界面加载并确认正常2.点击sample(80,159)打开保存位置选择双击选中sample name文本框(563,346)并清空和重命名为test 3. 双击选中comment 文本框583,381的内容并清空 4. 点击elect 按钮796,613弹出输出的目标文件夹5. 点击创建新文件夹图标784,410命名为test,然后回车再次回车进入test文件夹 5.然后点击保存942718。然后点击ok535,650关闭sample界面 6. 点击Method(36,166)进入Instrument(456,293)7.设置EX_WL(497,472)为350nm8.设置EM_Start_WL(493,500)为400nmEM_End_WL(495,524)为700nm9.设置PMT_Voltage(758,369)为700V10.设置EX_Slit下拉框(771,321)为2.5nm点击下拉框EM_Slit(764,344)出现下拉选项选择5nm(748,386)11.点击Report(638,290)确认Data_start(718,455)和Data_end(717,480)与EM_Start_WL和EM_End_WL的值一致12.点击确定(641,717)13.等待parameters更新完成并ready后才可点击Measure(182,162)测量并观察谱图14.点击底部左下角ex3的输出结果最大化按钮(108,948)",
"source": "custom",
"config": [],
"trajectory": "trajectories/",
"related_apps": [
"flsol"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"func": "vllm_eval",
"expected": {
"description": "FL Solutions 主界面中图表区域应显示一条完整的荧光发射光谱曲线:峰形平滑、顶部无截断(曲线最高点不贴近纵轴上限)、基线平稳、信噪比良好。界面中的仪器参数区域应可见激发波长 350 nm、发射扫描范围 380-700 nm以及经过迭代调整后的最终 PMT 电压和狭缝宽度参数。"
}
},
"proxy": false,
"fixed_ip": true,
"possibility_of_env_change": "medium",
"metadata": {
"input_files": [],
"steps": "",
"steps_original": "1. 打开 FL Solutions新建波长扫描方法。\n2. 设置激发波长 350 nm发射范围 380-700 nm初始 PMT 700V狭缝 2.5 nm。\n3. 执行测量,观察谱图。\n4. 若峰截断则降低 PMT 电压和/或缩小狭缝;若信号过弱则升高 PMT 电压和/或增大狭缝。\n5. 反复迭代测量直到峰形完整显示,截图记录最终结果。",
"difficulty": "hard",
"highlight": "AI 能够读取谱图质量并进行闭环迭代调参,体现真正的仪器操控智能,而非机械执行固定步骤。",
"ui_coordinates": {
"application": "FL Solutions - F-4600",
"main_window": {
"name": "F-4600 FL Spectrophotometer on USB",
"toolbar": [
{
"name": "Method",
"type": "Button_Icon",
"center": [
36,
166
],
"description": "打开分析方法设置窗口"
},
{
"name": "Measure",
"type": "Button_Icon",
"center": [
182,
162
],
"description": "执行测量"
}
],
"monitor_panel": [
{
"name": "Fluorescence_Value",
"type": "Display",
"center": [
959,
240
]
},
{
"name": "EX_WL_Display",
"type": "Text",
"center": [
912,
262
]
},
{
"name": "EM_WL_Display",
"type": "Text",
"center": [
0,
0
]
},
{
"name": "Status_Ready_Label",
"type": "Status_Indicator",
"center": [
0,
0
],
"color_hint": "Green"
}
]
},
"sub_windows": {
"Analysis_Method": {
"common_controls": {
"tabs": [
{
"name": "General",
"center": [
398,
291
]
},
{
"name": "Instrument",
"center": [
456,
293
]
},
{
"name": "Monitor",
"center": [
524,
295
]
},
{
"name": "Processing",
"center": [
574,
293
]
},
{
"name": "Report",
"center": [
638,
290
]
}
],
"footer_buttons": [
{
"name": "确定",
"center": [
641,
717
]
},
{
"name": "取消",
"center": [
719,
717
]
},
{
"name": "应用",
"center": [
788,
717
],
"status": "disabled"
},
{
"name": "帮助",
"center": [
882,
717
]
}
],
"close_button": {
"name": "Close_Window",
"center": [
905,
263
]
}
},
"tabs_content": {
"General": [
{
"type": "ComboBox",
"name": "Measurement",
"center": [
512,
321
],
"value": "Wavelength scan"
},
{
"type": "Edit",
"name": "Operator",
"center": [
533,
349
],
"value": "Administrator"
},
{
"type": "Edit",
"name": "Instrument_Model",
"center": [
0,
0
]
},
{
"type": "ComboBox",
"name": "Sampling",
"center": [
0,
0
],
"status": "disabled"
},
{
"type": "Edit",
"name": "Comments",
"center": [
0,
0
]
},
{
"type": "CheckBox",
"name": "Use_sample_table",
"center": [
0,
0
]
},
{
"type": "Button",
"name": "Load",
"center": [
0,
0
]
},
{
"type": "Button",
"name": "Save",
"center": [
0,
0
]
},
{
"type": "Button",
"name": "Save_As",
"center": [
0,
0
]
}
],
"Instrument": [
{
"type": "ComboBox",
"name": "Scan_mode",
"center": [
550,
322
]
},
{
"type": "ComboBox",
"name": "Data_mode",
"center": [
526,
347
]
},
{
"type": "Edit",
"name": "EX_WL",
"center": [
497,
472
],
"unit": "nm"
},
{
"type": "Edit",
"name": "EM_Start_WL",
"center": [
493,
500
],
"unit": "nm"
},
{
"type": "Edit",
"name": "EM_End_WL",
"center": [
495,
524
],
"unit": "nm"
},
{
"type": "ComboBox",
"name": "Scan_speed",
"center": [
497,
549
],
"unit": "nm/min"
},
{
"type": "ComboBox",
"name": "EX_Slit",
"center": [
771,
321
],
"unit": "nm"
},
{
"type": "ComboBox",
"name": "EM_Slit",
"center": [
764,
344
],
"unit": "nm"
},
{
"type": "Edit_Spin",
"name": "PMT_Voltage",
"center": [
758,
369
],
"unit": "V"
},
{
"type": "CheckBox",
"name": "PMT_Voltage_Limit",
"center": [
0,
0
],
"label": "PMT Voltage 0-1000V"
},
{
"type": "ComboBox",
"name": "Response",
"center": [
0,
0
],
"unit": "s"
},
{
"type": "Edit_Spin",
"name": "Replicates",
"center": [
0,
0
]
}
],
"Monitor": [
{
"type": "Edit",
"name": "Y_Axis_Max",
"center": [
455,
343
]
},
{
"type": "Edit",
"name": "Y_Axis_Min",
"center": [
455,
375
]
},
{
"type": "CheckBox",
"name": "Open_processing_after_acquisition",
"center": [
396,
437
]
},
{
"type": "CheckBox",
"name": "Overlay",
"center": [
395,
503
]
}
],
"Report": [
{
"type": "Edit",
"name": "Data_start_Value",
"center": [
718,
455
],
"unit": "nm"
},
{
"type": "Edit",
"name": "Data_end_Value",
"center": [
717,
480
],
"unit": "nm"
}
]
}
}
}
}
}
}

View File

@@ -0,0 +1,417 @@
{
"id": "flsol_taskE_auto_optimize_scan",
"snapshot": "flsol",
"instruction": "一步一步地执行,别他妈的给老子跳步 完全按照老子给的指令执行5.点击'PMT_Voltage'(758,369)设置为700V6.设置'EX_Slit下拉框(771,321)'为2.5nm'点击下拉框EM_Slit(764,344)'出现下拉选项选择5nm748,3867.点击'Report(638,290)'确认'Data_start(718,455)'和'Data_end(717,480)与instrument的EM_Start_WL和EM_End_WL'的值一致8.点击'确定(641,717)'9.点击'Measure(182,162)'测量并观察谱图10.若信号截断则返回'Method(36,166)'降低'PMT_Voltage(774,369)'或缩小狭缝(771,321)后重测11.若信号过弱则返回'Method(36,166)'升高'PMT_Voltage(774,369)'或增大狭缝(764,344)后重测12.重复调优至峰值在30%-90%且峰形完整13.点击'输出结果(108,948)'并最大化。",
"source": "custom",
"config": [],
"trajectory": "trajectories/",
"related_apps": [
"flsol"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"func": "vllm_eval",
"expected": {
"description": "FL Solutions 主界面中图表区域应显示一条完整的荧光发射光谱曲线:峰形平滑、顶部无截断(曲线最高点不贴近纵轴上限)、基线平稳、信噪比良好。界面中的仪器参数区域应可见激发波长 350 nm、发射扫描范围 380-700 nm以及经过迭代调整后的最终 PMT 电压和狭缝宽度参数。"
}
},
"proxy": false,
"fixed_ip": true,
"possibility_of_env_change": "medium",
"metadata": {
"input_files": [],
"steps": "{\"application\": \"FL Solutions - F-4600\", \"main_window\": {\"toolbar\": [{\"name\": \"Method\", \"center\": [36, 166]}, {\"name\": \"Measure\", \"center\": [182, 162]}]}, \"sub_windows\": {\"Analysis_Method\": {\"tabs\": [{\"name\": \"Instrument\", \"center\": [456, 293]}], \"footer_buttons\": [{\"name\": \"确定\", \"center\": [641, 717]}, {\"name\": \"取消\", \"center\": [719, 717]}], \"Instrument\": [{\"name\": \"EX_WL\", \"center\": [497, 472]}, {\"name\": \"EM_Start_WL\", \"center\": [493, 500]}, {\"name\": \"EM_End_WL\", \"center\": [495, 524]}, {\"name\": \"EX_Slit\", \"center\": [771, 321]}, {\"name\": \"EM_Slit\", \"center\": [764, 344]}, {\"name\": \"PMT_Voltage\", \"center\": [774, 369]}]}}}",
"steps_original": "1. 打开 FL Solutions新建波长扫描方法。\n2. 设置激发波长 350 nm发射范围 380-700 nm初始 PMT 700V狭缝 2.5 nm。\n3. 执行测量,观察谱图。\n4. 若峰截断则降低 PMT 电压和/或缩小狭缝;若信号过弱则升高 PMT 电压和/或增大狭缝。\n5. 反复迭代测量直到峰形完整显示,截图记录最终结果。",
"difficulty": "hard",
"highlight": "AI 能够读取谱图质量并进行闭环迭代调参,体现真正的仪器操控智能,而非机械执行固定步骤。",
"ui_coordinates": {
"application": "FL Solutions - F-4600",
"main_window": {
"name": "F-4600 FL Spectrophotometer on USB",
"toolbar": [
{
"name": "Method",
"type": "Button_Icon",
"center": [
36,
166
],
"description": "打开分析方法设置窗口"
},
{
"name": "Measure",
"type": "Button_Icon",
"center": [
182,
162
],
"description": "执行测量"
}
],
"monitor_panel": [
{
"name": "Fluorescence_Value",
"type": "Display",
"center": [
959,
240
]
},
{
"name": "EX_WL_Display",
"type": "Text",
"center": [
912,
262
]
},
{
"name": "EM_WL_Display",
"type": "Text",
"center": [
0,
0
]
},
{
"name": "Status_Ready_Label",
"type": "Status_Indicator",
"center": [
0,
0
],
"color_hint": "Green"
}
]
},
"sub_windows": {
"Analysis_Method": {
"common_controls": {
"tabs": [
{
"name": "General",
"center": [
398,
291
]
},
{
"name": "Instrument",
"center": [
456,
293
]
},
{
"name": "Monitor",
"center": [
524,
295
]
},
{
"name": "Processing",
"center": [
574,
293
]
},
{
"name": "Report",
"center": [
638,
290
]
}
],
"footer_buttons": [
{
"name": "确定",
"center": [
641,
717
]
},
{
"name": "取消",
"center": [
719,
717
]
},
{
"name": "应用",
"center": [
788,
717
],
"status": "disabled"
},
{
"name": "帮助",
"center": [
882,
717
]
}
],
"close_button": {
"name": "Close_Window",
"center": [
905,
263
]
}
},
"tabs_content": {
"General": [
{
"type": "ComboBox",
"name": "Measurement",
"center": [
512,
321
],
"value": "Wavelength scan"
},
{
"type": "Edit",
"name": "Operator",
"center": [
533,
349
],
"value": "Administrator"
},
{
"type": "Edit",
"name": "Instrument_Model",
"center": [
0,
0
]
},
{
"type": "ComboBox",
"name": "Sampling",
"center": [
0,
0
],
"status": "disabled"
},
{
"type": "Edit",
"name": "Comments",
"center": [
0,
0
]
},
{
"type": "CheckBox",
"name": "Use_sample_table",
"center": [
0,
0
]
},
{
"type": "Button",
"name": "Load",
"center": [
0,
0
]
},
{
"type": "Button",
"name": "Save",
"center": [
0,
0
]
},
{
"type": "Button",
"name": "Save_As",
"center": [
0,
0
]
}
],
"Instrument": [
{
"type": "ComboBox",
"name": "Scan_mode",
"center": [
550,
322
]
},
{
"type": "ComboBox",
"name": "Data_mode",
"center": [
526,
347
]
},
{
"type": "Edit",
"name": "EX_WL",
"center": [
497,
472
],
"unit": "nm"
},
{
"type": "Edit",
"name": "EM_Start_WL",
"center": [
493,
500
],
"unit": "nm"
},
{
"type": "Edit",
"name": "EM_End_WL",
"center": [
495,
524
],
"unit": "nm"
},
{
"type": "ComboBox",
"name": "Scan_speed",
"center": [
497,
549
],
"unit": "nm/min"
},
{
"type": "ComboBox",
"name": "EX_Slit",
"center": [
771,
321
],
"unit": "nm"
},
{
"type": "ComboBox",
"name": "EM_Slit",
"center": [
764,
344
],
"unit": "nm"
},
{
"type": "Edit_Spin",
"name": "PMT_Voltage",
"center": [
758,
379
],
"unit": "V"
},
{
"type": "CheckBox",
"name": "PMT_Voltage_Limit",
"center": [
0,
0
],
"label": "PMT Voltage 0-1000V"
},
{
"type": "ComboBox",
"name": "Response",
"center": [
0,
0
],
"unit": "s"
},
{
"type": "Edit_Spin",
"name": "Replicates",
"center": [
0,
0
]
}
],
"Monitor": [
{
"type": "Edit",
"name": "Y_Axis_Max",
"center": [
455,
343
]
},
{
"type": "Edit",
"name": "Y_Axis_Min",
"center": [
455,
375
]
},
{
"type": "CheckBox",
"name": "Open_processing_after_acquisition",
"center": [
396,
437
]
},
{
"type": "CheckBox",
"name": "Overlay",
"center": [
395,
503
]
}
],
"Report": [
{
"type": "Edit",
"name": "Data_start_Value",
"center": [
718,
455
],
"unit": "nm"
},
{
"type": "Edit",
"name": "Data_end_Value",
"center": [
717,
480
],
"unit": "nm"
}
]
}
}
}
}
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task1",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 File → New → Image 创建一个名为 'Text Image' 的新图像,设置图像类型为 8-bit背景填充为 White并设置宽度为 40 像素,高度为 40 像素。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击展开 \"File\" 菜单。\n2. 在展开的菜单中,单击展开 \"New\" 子菜单。\n3. 在 \"New\" 子菜单中,单击选择 \"Image...\" 选项,打开 \"New Image...\" 对话框。\n4. 在 \"New Image...\" 对话框中,单击 \"Name:\" 右侧的文本输入框以定位光标。\n5. 清空该输入框的已有内容,输入文本 \"Text Image\"。\n6. 单击 \"Type:\" 右侧的下拉菜单以展开选项列表。\n7. 在展开的选项列表中,单击选择 \"8-bit\"。\n8. 单击 \"Fill With:\" 右侧的下拉菜单以展开选项列表。\n9. 在展开的选项列表中,单击选择 \"White\"。\n10. 单击 \"Width:\" 右侧的文本输入框以定位光标。\n11. 清空该输入框的已有内容,输入数字 \"40\"。\n12. 单击 \"Height:\" 右侧的文本输入框以定位光标。\n13. 清空该输入框的已有内容,输入数字 \"40\"。\n14. 单击对话框底部的 \"OK\" 按钮完成创建。",
"steps_original": "1. 在菜单栏点击 File → New → Image。\n2. 在弹出的对话框中输入名称 'Text Image'。\n3. 从 Type 下拉菜单中选择 '8-bit'。\n4. 从 Fill With 下拉菜单中选择 'White'。\n5. 在宽度Width框中输入 40。\n6. 在高度Height框中输入 40。\n7. 点击 OK 按钮完成操作。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task10",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Edit → Selection → Restore Selection 恢复之前存储的选区。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 单击软件顶部菜单栏的 \"Edit\" 菜单。\n2. 在弹出的下拉菜单中,单击(或将鼠标悬停在) \"Selection\" 选项以展开子菜单。\n3. 在弹出的子菜单中,单击 \"Restore Selection\" 选项(或直接按下快捷键 \"E\")来恢复图像上的选区。",
"steps_original": "1. 在菜单栏点击 Edit → Selection → Restore Selection。\n2. 在图像上确保选区可见。\n3. 查看并确认选区正确恢复。"
}
}

View File

@@ -0,0 +1,58 @@
{
"id": "user-guide_task2",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Process → Find Maxima 对 blobs.gif 图像执行 Maxima 寻找,设置噪声容忍值为 50并选择 Output Type 为 'Single Points'。",
"source": "custom",
"config": [
{
"type": "upload_file",
"parameters": {
"files": [
{
"local_path": "evaluation_examples/data/imagej/blobs.gif",
"path": "C:\\Users\\user\\Desktop\\blobs.gif"
}
]
}
},
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"blobs.gif"
],
"steps": "1. 点击主界面菜单栏的 \"File\" 菜单。\n2. 在展开的下拉菜单中,单击选择 \"Open...\" 选项。\n3. 在弹出的文件选择对话框中,浏览并单击选中 \"blobs.gif\" 文件。\n4. 单击对话框底部的 \"打开\"(或 \"Open\")按钮以加载该图像。\n5. 点击主界面菜单栏的 \"Process\" 菜单。\n6. 在展开的下拉菜单中,单击选择 \"Find Maxima...\" 选项。\n7. 在弹出的 \"Find Maxima...\" 对话框中,单击将光标定位到 \"Noise Tolerance:\" 右侧的文本输入框。\n8. 清空该输入框中的现有内容。\n9. 在该输入框中输入数值 \"50\"。\n10. 单击 \"Output type:\" 右侧的下拉菜单控件以展开选项列表。\n11. 在展开的下拉列表中,单击选中 \"Single Points\" 选项。\n12. 单击对话框底部的 \"OK\" 按钮以执行操作并关闭对话框。",
"steps_original": "1. 打开 blobs.gif 文件。\n2. 在菜单栏点击 Process → Find Maxima。\n3. 在弹出的对话框中,将 Noise Tolerance 设置为 50。\n4. 从 Output Type 下拉菜单中选择 'Single Points'。\n5. 点击 OK 按钮完成操作。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task3",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Plugins → Utilities → Find Commands 查找关键字 'threshold' 的相关命令,显示完整信息并运行 'Adaptive3DThreshold'。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击 \"Plugins\" 菜单。\n2. 在展开的下拉菜单中,单击 \"Utilities\" 子菜单以展开次级菜单。\n3. 在次级菜单中,单击 \"Find Commands...\" 选项以打开 Command Finder 窗口。\n4. 在弹出的 \"Command Finder\" 窗口中,单击 \"Type part of a command:\" 标签右侧的文本输入框以定位光标。\n5. 在该文本输入框中,输入文字 \"threshold\"。\n6. 在窗口的选项区域中,单击勾选 \"Show full information\" 复选框。\n7. 在中间的搜索结果列表中,双击名为 \"Adaptive3DThreshold\" 的列表项以运行该命令。",
"steps_original": "1. 在菜单栏点击 Plugins → Utilities → Find Commands。\n2. 在弹出的 Command Finder 窗口中输入 'threshold'。\n3. 勾选 'Show full information'。\n4. 在列表中选择 'Adaptive3DThreshold' 并双击运行命令。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task4",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Image → Adjust → Threshold 使用 'Default' 自动阈值法对当前图像进行阈值分割,并设置显示模式为 Over/Under。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在主界面顶部菜单栏中,单击 \"Image\" 菜单项\n2. 在弹出的下拉菜单中,将鼠标移动并单击 \"Adjust\" 子菜单项\n3. 在弹出的级联菜单中,单击 \"Threshold...\" 选项,打开 \"Threshold\" 对话框\n4. 在弹出的 \"Threshold\" 对话框中,单击左侧中间的自动阈值方法下拉菜单(位于 \"Dark background\" 复选框上方)\n5. 在展开的下拉列表中,单击选中 \"Default\" 选项\n6. 在 \"Threshold\" 对话框中,单击右侧中间的显示模式下拉菜单(位于自动阈值方法下拉菜单的右侧)\n7. 在展开的下拉列表中,单击选中 \"Over/Under\" 选项\n8. 在 \"Threshold\" 对话框底部的按钮区,单击 \"Apply\" 按钮完成阈值分割操作",
"steps_original": "1. 在菜单栏点击 Image → Adjust → Threshold。\n2. 在弹出的对话框中,从 Method 下拉菜单选择 'Default'。\n3. 确保 Display 模式设置为 'Over/Under'。\n4. 点击 Apply 按钮完成操作。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task5",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Analyze → Tools → Curve Fitting 对数据拟合二次多项式,并将最大迭代次数设为 100。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击 \"Analyze\" 菜单。\n2. 在展开的下拉菜单中,鼠标悬停或单击 \"Tools\" 子菜单以将其展开。\n3. 在 \"Tools\" 子菜单列表中,单击选择 \"Curve Fitting...\" 选项。\n4. 在弹出的 \"Curve Fitter\" 对话框中,单击左上角的函数类型下拉菜单(默认可能显示为 \"Straight Line\" 或其他选项)。\n5. 在展开的下拉列表中,单击选择 \"2nd Degree Polynomial\" 选项。\n6. 在 \"Curve Fitter\" 对话框的上方,单击勾选 \"Show settings\" 复选框(此为弹出高级设置的前提条件)。\n7. 单击对话框上方的 \"Fit\" 按钮。\n8. 在随之弹出的 \"Simplex Fitting Options\" 对话框中,找到 \"Maximum iterations:\" 标签右侧的数值输入框。\n9. 单击该输入框,将光标定位到输入框内部。\n10. 清空输入框中已有的默认数值(例如 4500。\n11. 在输入框中通过键盘输入数值 \"100\"。\n12. 单击 \"Simplex Fitting Options\" 对话框底部的 \"OK\" 按钮以应用设置并完成拟合。",
"steps_original": "1. 在菜单栏点击 Analyze → Tools → Curve Fitting。\n2. 在弹出的对话框中,从 Function 下拉菜单选择 '2nd Degree Polynomial'。\n3. 点击 Fit 按钮。\n4. 在 Simplex Fitting Options 中,将 Maximum number of iterations 设置为 100。\n5. 点击 OK 按钮完成拟合。"
}
}

View File

@@ -0,0 +1,58 @@
{
"id": "user-guide_task6",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Image → Transform → Rotate 90 Degrees Right 旋转 mri-stack.tif 图像 90°。",
"source": "custom",
"config": [
{
"type": "upload_file",
"parameters": {
"files": [
{
"local_path": "evaluation_examples/data/imagej/mri-stack.tif",
"path": "C:\\Users\\user\\Desktop\\mri-stack.tif"
}
]
}
},
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"mri-stack.tif"
],
"steps": "1. 在顶部菜单栏中,单击 \"File\" 菜单项。\n2. 在展开的下拉菜单中,单击 \"Open...\" 选项。\n3. 在弹出的文件选择对话框中,找到并单击选中名为 \"mri-stack.tif\" 的文件。\n4. 单击文件选择对话框右下角的 \"打开\" 按钮加载图像。\n5. 确保新打开的 \"mri-stack.tif\" 图像窗口处于前台激活状态。\n6. 在顶部菜单栏中,单击 \"Image\" 菜单项。\n7. 在展开的下拉菜单中,将鼠标指针移动并悬停在 \"Transform\" 选项上,以展开级联子菜单。\n8. 在弹出的级联子菜单中,单击 \"Rotate 90 Degrees Right\" 选项。\n9. 观察处于激活状态的图像窗口,确认图像内容已顺时针旋转 90 度。\n10. 在顶部菜单栏中,单击 \"File\" 菜单项。\n11. 在展开的下拉菜单中,单击 \"Save\" 选项将旋转结果保存到原文件。",
"steps_original": "1. 打开 mri-stack.tif 文件。\n2. 在菜单栏点击 Image → Transform → Rotate 90 Degrees Right。\n3. 确保图像正确旋转后保存或查看结果。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task7",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Process → Binary → Options 设置黑色背景选项为开启状态并进行预览。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击 \"Process\" 菜单项。\n2. 在弹出的下拉菜单中,将鼠标悬停或单击 \"Binary\" 子菜单项以将其展开。\n3. 在展开的 \"Binary\" 子菜单中,单击 \"Options...\" 菜单项,打开选项对话框。\n4. 在弹出的选项对话框中,单击勾选 \"Black background\" 复选框。\n5. 在同一个对话框中,单击勾选 \"Preview\" 复选框以预览效果。\n6. 单击对话框底部的 \"OK\" 按钮以保存设置并关闭对话框。",
"steps_original": "1. 在菜单栏点击 Process → Binary → Options。\n2. 在弹出的对话框中勾选 'Black Background'。\n3. 点击 Preview 查看效果。\n4. 点击 OK 按钮保存选项。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task8",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 File → Save As → PNG 保存当前图像为 PNG 格式,设置透明索引为 255。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击 \"Edit\" 菜单项。\n2. 在弹出的下拉菜单中,将鼠标悬停或单击 \"Options\" 选项以展开子菜单。\n3. 在子菜单中,单击 \"Input/Output...\" 选项,打开 Input/Output Options 设置对话框。\n4. 在弹出的对话框中单击定位到用于设置透明索引Transparent index的文本输入框。\n5. 清空该输入框中的原有数值。\n6. 在输入框中输入数字 \"255\"。\n7. 单击对话框底部的 \"OK\" 按钮以保存设置并关闭对话框。\n8. 在顶部菜单栏中,单击 \"File\" 菜单项。\n9. 在弹出的下拉菜单中,将鼠标悬停或单击 \"Save As\" 选项以展开子菜单。\n10. 在子菜单中,单击 \"PNG...\" 选项,打开系统的文件保存对话框。\n11. 在弹出的文件保存对话框中,单击定位到用于输入文件名的文本输入框。\n12. 在输入框中输入目标文件名。\n13. 在对话框的目录树或路径地址栏中,浏览并单击选中指定的保存路径。\n14. 单击对话框右下角的 \"Save\"(或 \"保存\")按钮以确认并完成文件保存。",
"steps_original": "1. 在菜单栏点击 File → Save As → PNG。\n2. 在弹出的对话框中,将透明索引设置为 255。\n3. 输入文件名并指定保存路径。\n4. 点击 OK 按钮完成保存。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "user-guide_task9",
"snapshot": "imagej",
"instruction": "在 ImageJ 中,通过 Analyze → Measure 测量当前选区的面积和灰度值。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\ImageJ\\ImageJ.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"imagej"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在 ImageJ 主界面的工具栏中,单击选中一种区域选区工具图标(例如左侧第一个的“矩形选区工具” Rectangular Selection Tool\n2. 在当前活跃的图像窗口中,将鼠标光标定位到待测量区域的起始点\n3. 按下并按住鼠标左键,拖动鼠标以在图像上绘制出一个覆盖目标区域的选区框\n4. 松开鼠标左键,完成选区的创建\n5. 在 ImageJ 顶部的主菜单栏中单击“Analyze”菜单以展开下拉列表\n6. 在展开的“Analyze”下拉菜单中单击选择“Measure”选项或按下快捷键 'm'\n7. 在系统自动弹出的名为“Results”的表格窗口中定位到表格最后新增的一行测量数据\n8. 在该行数据中分别读取“Area”列对应的数值面积以及“Mean”列对应的数值平均灰度值",
"steps_original": "1. 创建或选择一个区域选区。\n2. 在菜单栏点击 Analyze → Measure。\n3. 在弹出的 Results 窗口中查看面积和灰度值等测量结果。"
}
}

View File

@@ -0,0 +1,30 @@
{
"id": "MDIJade6.5使用手册_task1",
"snapshot": "jade",
"instruction": "在 MDI Jade 中通过菜单 File → Patterns 加载衍射数据文件 DEMO01.MDI。",
"source": "custom",
"config": [
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 在 Windows 桌面找到名为 MDI Jade 的快捷方式图标。\n2. 双击该快捷方式图标启动 MDI Jade 软件。\n3. 在软件主界面顶部的菜单栏中,单击 File 菜单。\n4. 在弹出的下拉菜单中,单击 Patterns... 选项,打开读入文件对话框。\n5. 在弹出的 Read Pattern Files 对话框中,在中间的 File Name 文件列表区域,寻找并单击选中名为 DEMO01.MDI 的文件。\n6. 单击该对话框左上方的 Read 按钮,将选定的衍射数据文件加载到软件中。",
"steps_original": "1. 在桌面找到 MDI Jade 图标,双击打开软件。\n2. 点击菜单 File → Patterns。\n3. 在弹出的对话框中选择 DEMO01.MDI 并点击 Open。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MDIJade6.5使用手册_task10",
"snapshot": "jade",
"instruction": "从菜单 Options → Cell Refinement 打开晶胞点阵参数对话框并精修点阵常数。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 使用键盘快捷键 Shift+Ctrl+F4 直接打开 Cell Refinement晶胞精细化对话框等价于菜单 Options → Cell Refinement但快捷键更可靠也可以在同一个代码块中先点击 Options 菜单再立即点击 Cell Refinement 菜单项,中间仅 sleep 0.5 秒,注意必须在同一步完成以防菜单自动关闭)。\n2. 等待晶胞点阵参数对话框弹出,查看当前显示的点阵参数列表。\n3. 单击该对话框中的 \"Refine\" 按钮,开始执行点阵参数精修计算。\n4. 等待精修计算完成,并查看对话框中更新后的精修结果数值。\n5. 单击对话框中的 \"Save\" 按钮,保存当前的精修结果。\n6. 单击对话框底部或右上角的 \"Close\"(或关闭)按钮,关闭晶胞点阵参数对话框。",
"steps_original": "1. 点击菜单 Options → Cell Refinement。\n2. 在弹出的对话框中检查点阵参数。\n3. 点击 Refine 按钮进行精修。\n4. 检查精修结果并保存。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "MDIJade6.5使用手册_task2",
"snapshot": "jade",
"instruction": "在 JADE 中将选择DEMO01的衍射图谱,并通过 File → Save-Primary Pattern as *.txt 导出为 ASCII 格式,保存为 DEMO01.txt。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 单击顶部菜单栏中的 \"File\" 菜单\n2. 在展开的下拉菜单中,单击选中 \"Save-Primary Pattern as *.txt\" 菜单项\n3. 在弹出的保存文件对话框中,单击将光标定位到 \"文件名\"(或 \"File name\")输入框\n4. 清空该输入框中的已有内容\n5. 在输入框中输入文字 \"DEMO01.txt\"\n6. 单击对话框右下方的 \"保存\"(或 \"Save\")按钮",
"steps_original": "1. 点击菜单 File → Save-Primary Pattern as *.txt。\n2. 在弹出的保存对话框中,设置文件名为 DEMO01.txt。\n3. 点击 Save 按钮保存文件。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "MDIJade6.5使用手册_task3",
"snapshot": "jade",
"instruction": "在Jade中打开自带的DEMO01.MDI样品数据然后使用Search/Match功能进行物相检索并限制元素范围为Ca, Si, O。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. Jade启动后默认已加载一个DEMO文件。在主窗口左侧的文件列表中找到并双击DEMO01.MDI确认主窗口标题栏显示[DEMO01.MDI]。\n2. 按快捷键Shift+F7等价于菜单PDF → Chemistry...打开Current Chemistry [Retrieval]元素周期表对话框。等待对话框完全显示。\n3. 先点击对话框顶部的Exclude All按钮清除所有已选元素确保从空白状态开始。\n4. 在元素周期表中选择CaCa位于第4行K那一行从左边数第2个按钮。它在K的右边、Sc的左边。它在屏幕上大约坐标(528, 360)附近。注意只单击Ca这一个按钮确认它变为凹陷/高亮状态后再继续。\n5. 在元素周期表中选择SiSi位于第3行Na那一行的右半部分。从右半部分的左边数Al是第1个Si是第2个。Si在Al的右边、P的左边。它在屏幕上大约坐标(830, 340)附近。注意只单击Si这一个按钮确认它变为凹陷/高亮状态后再继续。\n6. 在元素周期表中选择OO位于第2行Li那一行的右半部分。从右半部分的左边数B是第1个C是第2个N是第3个O是第4个。O在N的右边、F的左边。它在屏幕上大约坐标(880, 320)附近。注意只单击O这一个按钮确认它变为凹陷/高亮状态后再继续。\n7. 确认只有Ca、Si、O三个元素按钮都已被选中凹陷/高亮然后单击对话框中的OK按钮关闭对话框。\n8. 按快捷键Shift+F6等价于菜单PDF → Retrieval...启动物相检索。如果弹出任何提示框如Too Many Profiles单击OK关闭。\n9. 等待检索完成,确认出现检索结果窗口。",
"steps_original": "1. 双击左侧文件列表中的 DEMO01.MDI 打开样品数据。\n2. 点击菜单 PDF → Chemistry...(或按 Shift+F7打开元素周期表对话框。\n3. 依次单击 Ca、Si、O 三个元素按钮使其高亮选中,点击 OK。\n4. 点击菜单 PDF → Retrieval...(或按 Shift+F6执行物相检索。\n5. 等待完成后查看检索结果列表。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MDIJade6.5使用手册_task4",
"snapshot": "jade",
"instruction": "在 JADE 中通过 Options → Report-Peak ID Extended 计算 RIR 方法的物相质量分数,并保存结果为 PDF 格式。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击选中 \"Options\" 菜单。\n2. 在展开的下拉菜单中,单击选中 \"Report-Peak ID Extended\"。\n3. 在弹出的 \"Peak ID Extended Report\" 对话框中,查看列表区域确认结果数据完整。\n4. 点击该对话框顶部工具栏中的 \"Save\" 按钮。\n5. 在弹出的 \"Enter File Name to Save\" 对话框中,找到底部的 \"保存类型(T)\" 下拉菜单。\n6. 点击 \"保存类型(T)\" 下拉菜单,选择 \"PDF Overlay List File (*.pdf)\"(或相应的 PDF 格式)。\n7. 在 \"文件名(N)\" 输入框中,单击定位光标并输入需要的文件名。\n8. 单击对话框右下角的 \"保存(S)\" 按钮完成保存。",
"steps_original": "1. 打开菜单 Options → Report-Peak ID Extended。\n2. 确认结果数据,确保内容显示完整。\n3. 点击 Save选择文件类型为 PDF。\n4. 输入文件名并点击保存。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MDIJade6.5使用手册_task5",
"snapshot": "jade",
"instruction": "通过 Report → Peak Search Report 菜单计算晶粒大小及微观应变,设置 D 值为 1。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 单击顶部主菜单栏中的 \"Report\" 菜单。\n2. 在展开的下拉菜单中,单击选中 \"Size & Strain Plot\" 菜单项。\n3. 在弹出的 \"Estimate Crystallite Size & Strain from Peak Broadening\" 对话框中,单击选中顶部的 \"Size/Strain\" 单选框。\n4. 将鼠标光标定位到该单选框右侧的 D 值输入框(位于 \"Origin(0,0)\" 选项的右侧)。\n5. 选中或清空输入框内的当前数值(如 2.0),通过键盘输入数字 \"1\"。\n6. 单击对话框左上方的 \"Save\" 按钮以保存计算结果图片。",
"steps_original": "1. 点击菜单 Report → Peak Search Report。\n2. 在弹出的对话框中选择 Size/strain 选项。\n3. 设置反卷积参数 D 值为 1。\n4. 点击 Save 按钮保存计算结果。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MDIJade6.5使用手册_task6",
"snapshot": "jade",
"instruction": "通过 File → Save 菜单保存当前仪器半高宽校正曲线到 Si_hw_curve.fwhm。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Save\" 菜单项以展开级联子菜单\n3. 在展开的子菜单中,单击选择 \"FWHM Curve of Peaks\" 菜单项,打开保存文件对话框\n4. 在弹出的保存对话框中,单击定位到 \"文件名\" (或 File name) 输入框\n5. 清空 \"文件名\" 输入框中的已有内容\n6. 在 \"文件名\" 输入框中输入文字 \"Si_hw_curve.fwhm\"\n7. 单击对话框底部的 \"保存\" (或 Save) 按钮完成保存操作",
"steps_original": "1. 点击菜单 File。\n2. 选择 Save → FWHM Curve of Peaks。\n3. 在保存对话框中输入文件名 Si_hw_curve.fwhm。\n4. 点击 Save 按钮完成保存。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "MDIJade6.5使用手册_task7",
"snapshot": "jade",
"instruction": "调用 Options → D-Spacing 菜单计算已知结构的衍射谱,加权强度公式为 Z = 12。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 单击顶部菜单栏的 \"Options\" 菜单\n2. 在弹出的下拉菜单中,单击 \"D-Spacing & hkl...\" 菜单项,打开 \"Calculate d-Spacing & Miller Indices\" 对话框\n3. 在弹出的对话框左下区域,找到 Z 值输入框(位于化学公式输入框的下方,\"Density(c)=\" 文本的左侧,截图中显示为 \"6.0\" 的位置)\n4. 单击该 Z 值输入框将光标定位其中\n5. 清空该输入框中的原有数值\n6. 在该输入框中输入数值 \"12\"\n7. 单击对话框顶部按钮栏中的 \"Calc\" 按钮以生成计算结果\n8. 单击对话框顶部按钮栏最左侧的 \"Close\" 按钮以关闭当前窗口",
"steps_original": "1. 打开菜单 Options → D-Spacing。\n2. 在计算衍射谱对话框中,设置加权强度公式参数 Z 值为 12。\n3. 点击 Calculate 按钮以生成计算结果。\n4. 检查结果并关闭窗口。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MDIJade6.5使用手册_task8",
"snapshot": "jade",
"instruction": "通过 Options → Calculate Stress 菜单计算残余应力,使用 Fit All 功能拟合曲线。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [],
"steps": "1. 在顶部菜单栏中,单击 \"Options\" 菜单。\n2. 在展开的下拉菜单中,单击 \"Calculate Stress\" 菜单项。\n3. 在弹出的计算残余应力相关对话框中,单击名为 \"Fit All\" 的按钮。\n4. 观察主窗口中显示的拟合曲线图,确认拟合已完成。\n5. 单击名为 \"Save\" 的按钮,以保存拟合结果文件。",
"steps_original": "1. 点击菜单 Options → Calculate Stress。\n2. 在弹出的对话框中,选择以 Fit All 功能拟合所有数据。\n3. 检查拟合结果图。\n4. 点击 Save 按钮以保存拟合结果文件。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "jade-guide-example_task1",
"snapshot": "jade",
"instruction": "在 Jade 中,通过 Edit → Preferences 打开程序设置对话框,并切换到 Instrument 标签查看设置。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 在软件顶部的主菜单栏中,单击鼠标左键选择 \"Edit\" 菜单。\n2. 在展开的下拉菜单中,单击鼠标左键选择 \"Preferences\" 菜单项,等待弹出程序设置对话框。\n3. 在弹出的程序设置对话框顶部,单击鼠标左键选中名为 \"Instrument\" 的选项卡(标签页)以查看相关设置。",
"steps_original": "1. 在主菜单中点击 Edit。\n2. 选择 Preferences打开程序设置对话框。\n3. 点击对话框上方的 Instrument 标签,查看相关设置。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "jade-guide-example_task10",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO01.MDI 后,右键单击主工具栏打印按钮打开打印预览窗口,点击 Setup → Layout勾选 Generate Profile on d-I Lines、Show ID Labels on d-I Lines、Place X-Axis Scaling above Ribbons 三个选项,然后使用垂直放大工具对图谱局部进行放大。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项\n2. 在弹出的下拉菜单中,单击选择 \"Patterns...\" 打开数据文件读入窗口\n3. 在文件读入窗口的文件列表中,单击选中 \"DEMO01.MDI\" 文件\n4. 单击窗口下方的 \"Read\" 按钮,加载数据文件\n5. 在界面上方的主工具栏中,找到 \"打印\" 图标按钮\n6. 右键单击该 \"打印\" 图标按钮,打开打印预览窗口\n7. 在打印预览窗口中,单击左侧的 \"命令\" 按钮\n8. 单击窗口中的 \"Setup\" 按钮,打开预览设置对话框\n9. 在预览设置对话框的顶部,单击选择 \"Layout\" 选项卡标签\n10. 在 Layout 页面中,找到 \"Generate Profile on d-I Lines\" 复选框并单击勾选\n11. 找到 \"Show ID Labels on d-I Lines\" 复选框并单击勾选\n12. 找到 \"Place X-Axis Scaling above Ribbons\" 复选框并单击勾选\n13. 单击对话框的关闭或确认按钮,退出打印预览设置对话框\n14. 在打印预览窗口顶部的图谱编辑按钮栏中,左键单击 \"垂直放大\" 命令按钮\n15. 将鼠标移动到图谱区域中需要垂直放大的局部位置\n16. 按住鼠标左键不放\n17. 向上拖拽鼠标进行区域拉伸\n18. 松开鼠标左键,完成局部垂直放大",
"steps_original": "1. 通过 File → Patterns 加载 DEMO01.MDI 文件。\n2. 右键单击主工具栏中的打印按钮,打开打印预览窗口。\n3. 点击窗口左侧的命令按钮。\n4. 点击 Setup 按钮,打开预览设置对话框。\n5. 点击上方的 Layout 标签。\n6. 勾选 Generate Profile on d-I Lines。\n7. 勾选 Show ID Labels on d-I Lines。\n8. 勾选 Place X-Axis Scaling above Ribbons。\n9. 关闭设置对话框。\n10. 选择图谱编辑按钮中的垂直放大命令,左键单击。\n11. 在图谱中选择需要放大的局部区域向上拉伸。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "jade-guide-example_task11",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO01.MDI 后,使用主工具栏的图谱平滑按钮对衍射图谱执行平滑处理。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. Jade启动后默认已加载DEMO文件。在主窗口左侧的文件列表中找到并双击DEMO01.MDI或DEMO01.MDI确认主窗口标题栏显示该文件名图谱区域显示衍射图谱。\n2. 在主界面顶部的主工具栏中找到Smooth平滑按钮。该按钮的图标类似一条平滑的曲线位于工具栏靠右的位置。将鼠标悬停在工具栏按钮上可看到tooltip提示文字来确认。\n3. 左键单击Smooth按钮对当前衍射图谱执行平滑处理。\n4. 观察图谱窗口中的衍射曲线,确认由于平滑处理曲线变得更加光滑、噪声减少。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO01.MDI 文件。\n2. 在主工具栏中找到图谱平滑按钮Smooth。\n3. 左键单击平滑按钮,对当前衍射图谱执行平滑处理。\n4. 观察图谱变化,确认平滑效果已应用(图谱曲线变得更光滑)。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "jade-guide-example_task12",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO01.MDI 后,使用编辑工具栏的背景扣除功能对衍射图谱执行背景扣除操作。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单。\n2. 在弹出的下拉菜单中,单击选择 \"Patterns...\" 选项,打开数据文件读入窗口。\n3. 在数据文件读入窗口中,单击对应的磁盘下拉菜单或图标,选择目标文件所在的磁盘驱动器。\n4. 在目录树列表中,双击展开文件夹以导航至保存有数据的目标文件夹。\n5. 在文件类型(格式)下拉菜单中,单击并选择 \"All\",以确保显示所有格式的数据文件。\n6. 在文件列表显示区中,单击选中名为 \"DEMO01.MDI\" 的文件。\n7. 单击窗口中的 \"Read\" 命令按钮,将该衍射数据文件读入全谱窗口中。\n8. 在主界面下方的编辑工具栏中,定位到 \"扣除背景\"Background通常标为BG按钮。\n9. 鼠标左键单击该 \"扣除背景\" 按钮,直接对当前的衍射图谱执行背景扣除命令。\n10. 观察全谱窗口中的衍射图谱,确认下方的背景基线已被扣除并变为平直线。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO01.MDI 文件。\n2. 在编辑工具栏中找到背景扣除按钮Background。\n3. 左键单击背景扣除按钮,对当前衍射图谱执行背景扣除操作。\n4. 观察图谱变化,确认背景已被扣除(基线变为平直)。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "jade-guide-example_task2",
"snapshot": "jade",
"instruction": "在 Jade 中,设置 NBS Silicon 为XRD背底曲线并查看峰宽。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 单击顶部菜单栏中的 \"Edit\" 菜单。\n2. 在弹出的下拉菜单中,单击选中 \"preferences\" 菜单项,打开程序设置对话框。\n3. 在程序设置对话框中,单击选中 \"Instrument\" 标签页。\n4. 单击对话框最下方的下拉菜单控件以将其展开。\n5. 在展开的下拉列表选项中,单击选中 \"NBS Silicon1\"。\n6. 单击对话框中的 \"VIEW FWHM Curve\" 按钮以查看峰宽曲线。",
"steps_original": "1. 在程序设置对话框中点击 Instrument 标签。\n2. 从下拉菜单中选择 NBS Silicon1 作为 XRD 背底曲线。\n3. 点击 'View FWHM Curve' 查看峰宽曲线。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task3",
"snapshot": "jade",
"instruction": "在 Jade 中,通过 File → Patterns 打开衍射数据文件 DEMO01.MDI。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"DEMO01.MDI"
],
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Patterns\" 菜单项,弹出数据文件读入窗口\n3. 在文件读入窗口中,单击磁盘选择下拉菜单将其展开\n4. 在弹出的驱动器列表中,单击选中目标文件所在的磁盘\n5. 在文件夹树形列表中,双击展开并选中包含目标文件的文件夹\n6. 单击文件类型下拉菜单将其展开\n7. 在弹出的文件类型列表中,单击选中 \"All\" 数据类型选项\n8. 在文件展示列表中,单击选中名为 \"DEMO01.MDI\" 的数据文件\n9. 单击窗口中的 \"Read\" 命令按钮,以读入该数据文件",
"steps_original": "1. 在主菜单中点击 File。\n2. 选择 Patterns打开文件选择对话框。\n3. 浏览并选择 DEMO01.MDI 文件,点击 Read。"
}
}

View File

@@ -0,0 +1,44 @@
{
"id": "jade-guide-example_task4",
"snapshot": "jade",
"instruction": "在 Jade 中,先加载 DEMO01.MDI然后通过 File → Patterns 使用 Add 按钮叠加第二个衍射数据文件DEMO02.MDI到同一窗口。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"jade"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"steps": "1. 单击主菜单栏中的“File”菜单项。\n2. 在弹出的下拉菜单中单击“Patterns”菜单项打开数据文件读入窗口。\n3. 在数据文件读入窗口左上角的驱动器下拉菜单中,单击选择存放数据的磁盘。\n4. 在其下方的文件夹列表框中,双击逐层展开并单击选中包含目标 XRD 数据的文件夹。\n5. 单击文件列表下方的文件类型下拉菜单从中选择“All”选项以显示所有数据类型。\n6. 在右侧的文件列表框中单击选中名为“DEMO01.MDI”的文件。\n7. 单击窗口右侧区域的“Read”命令按钮加载该数据文件。\n8. 再次单击主菜单栏中的“File”菜单项。\n9. 在弹出的下拉菜单中单击“Patterns”菜单项重新打开数据文件读入窗口。\n10. (如果路径改变)按照前述步骤在驱动器和文件夹列表框中选择目标路径。\n11. 在文件列表框中,单击选中另一个需要叠加的 DEMO02.MDI 数据文件。\n12. 单击窗口右侧区域的“Add”命令按钮将第二个数据文件叠加显示到当前窗口中。",
"steps_original": "1. 在主菜单中点击 File。\n2. 选择 Patterns打开文件选择对话框。\n3. 选择 DEMO01.MDI 文件,点击 Read 加载。\n4. 再次点击 File → Patterns。\n5. 选择另一个可用的 DEMO 数据文件,点击 Add 按钮将其叠加到当前窗口。"
}
}

Some files were not shown because too many files have changed in this diff Show More