Compare commits

30 Commits

Author SHA1 Message Date
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
cui0711
613f55f0da feat(tools): add instructions extraction script for generating test cases 2026-02-09 17:47:02 +08:00
cui0711
ba03784196 fix(env): handle None result_getter for vllm_eval evaluator 2026-02-09 17:46:05 +08:00
cui0711
3890ee5fc3 fix(vllm_eval): add image compression to prevent 413 error with large max_steps 2026-02-09 14:24:59 +08:00
cui0711
9bc54c0a66 feat(vllm_eval): add structured JSON response format with step analysis 2026-02-09 13:58:14 +08:00
cui0711
1e9281a1ab feat(cli): add eval_model argument 2026-02-05 16:56:39 +08:00
cui0711
63484c7b7b fix(runner): pass result_dir to evaluate and re-enable environment reset 2026-02-05 16:55:49 +08:00
cui0711
ad46acc5f3 refactor(example): replace check_include_exclude with vllm_eval evaluator 2026-02-05 16:55:03 +08:00
cui0711
58d411bf86 feat(evaluator): export vllm_eval module 2026-02-05 16:54:16 +08:00
cui0711
be24e77d93 feat(env): add eval_model parameter and result_dir support for vllm evaluation 2026-02-05 16:53:12 +08:00
cui0711
dd58a1de03 feat(evaluator): add vision-language model evaluator 2026-02-05 16:52:35 +08:00
cui0711
231f7a8fbc feat(eval): add jade test case and update test categories 2026-01-30 16:29:05 +08:00
cui0711
716d82f4d1 feat: add flexible recording control and improve execution logging 2026-01-30 16:28:13 +08:00
cui0711
47bcfc0f0b feat(agent): add screenshot compression and dynamic resolution support 2026-01-30 16:28:02 +08:00
cui0711
7e9090e115 fix(prompts): fix template variable syntax and add dynamic resolution 2026-01-30 16:28:02 +08:00
cui0711
308282e830 feat(server): add cross-platform support and improve screenshot handling 2026-01-30 16:27:49 +08:00
cui0711
788b248dbc fix(logger): add Windows platform support for file locking 2026-01-30 16:27:49 +08:00
alexandruilie7
5463d3bb89 uipath v2 (#413)
* submission v2

* small updates
2026-01-09 08:47:20 +08:00
蘑菇先生
5ef8bdfa35 EvoCUA Update (2025.01.05) (#412)
* evocua init

* setup max_token

* evocua update

---------

Co-authored-by: xuetaofeng <xuetaofeng@meituan.com>
Co-authored-by: Tianbao Xie <47296835+Timothyxxx@users.noreply.github.com>
2026-01-05 16:14:53 +08:00
Bowen Yang
439e178a2e fix(os_symphony_evaluation) (#410)
* fix(os_symphony)

* Update desktop_env_os_symphony.py

* fix(os_symphony_desktop)

* fix(os_symphony_start)

* Add docstring to run_multienv_os_symphony.py

Added documentation header for the evaluation script.
2026-01-04 15:56:51 +08:00
Bowen Yang
951e1928c8 fix(desktop_os_symphony):support aws (#406)
* fix(os_symphony)

* Update desktop_env_os_symphony.py
2026-01-01 11:27:34 +08:00
152 changed files with 10560 additions and 1113 deletions

10
.gitignore vendored
View File

@@ -208,7 +208,17 @@ 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

View File

@@ -101,7 +101,7 @@ class DesktopEnv(gym.Env):
provider_name: str = "vmware",
region: str = None,
path_to_vm: str = None,
snapshot_name: str = "init_state",
snapshot_name: str = "snapshot",
action_space: str = "pyautogui",
cache_dir: str = "cache",
screen_size: Tuple[int] = (int(os.environ.get("SCREEN_WIDTH", 1920)), int(os.environ.get("SCREEN_HEIGHT", 1080))),
@@ -111,13 +111,14 @@ class DesktopEnv(gym.Env):
os_type: str = "Ubuntu",
enable_proxy: bool = False,
client_password: str = "",
eval_model: str = "gpt-5.2-chat-latest"
):
"""
Args:
provider_name (str): virtualization provider name, default to "vmware"
region (str): the region for allocate machines, work for cloud services, default to "us-east-1"
path_to_vm (str): path to .vmx file
snapshot_name (str): snapshot name to revert to, default to "init_state"
snapshot_name (str): snapshot name to revert to, default to "snapshot"
action_space (str): "computer_13" | "pyautogui"
cache_dir (str): cache directory to cache task-related stuffs like
reference file for evaluation
@@ -127,6 +128,7 @@ class DesktopEnv(gym.Env):
require_terminal (bool): whether to require terminal output
os_type (str): operating system type, default to "Ubuntu"
enable_proxy (bool): whether to enable proxy support, default to False
eval_model (str): evaluation model to use, default to "gpt-5.2-chat-latest"
"""
# Initialize VM manager and vitualization provider
self.region = region
@@ -160,7 +162,7 @@ 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
else:
raise ValueError(f"Invalid provider name: {self.provider_name}")
@@ -179,6 +181,9 @@ class DesktopEnv(gym.Env):
self.require_a11y_tree = require_a11y_tree
self.require_terminal = require_terminal
# Evaluation model
self.eval_model = eval_model
# Initialize emulator and controller
logger.info("Initializing...")
self._start_emulator()
@@ -265,7 +270,7 @@ class DesktopEnv(gym.Env):
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))
logger.info("Environment has been used, reverting to snapshot: {}...".format(self.snapshot_name))
self._revert_to_snapshot()
logger.info("Starting emulator...")
self._start_emulator()
@@ -328,6 +333,7 @@ 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)
@@ -402,6 +408,7 @@ class DesktopEnv(gym.Env):
if self.action_space == "computer_13":
# the set of all possible actions defined in the action representation
logger.info(f"======executing here======{self.action_space}========================")
self.controller.execute_action(action)
elif self.action_space == "pyautogui" or self.action_space == "claude_computer_use":
if action in ['WAIT', 'FAIL', 'DONE'] or (type(action) == dict and action.get('action_type') in ['WAIT', 'FAIL', 'DONE']):
@@ -411,6 +418,8 @@ class DesktopEnv(gym.Env):
if type(action) == str:
# Fix PyAutoGUI '<' character bug before execution
fixed_command = _fix_pyautogui_less_than_bug(action)
logger.info(f"======executing here======{self.action_space}========================")
logger.info(f"Fixed command: {fixed_command}")
self.controller.execute_python_command(fixed_command)
elif type(action) == dict:
# Fix PyAutoGUI '<' character bug before execution
@@ -422,7 +431,7 @@ class DesktopEnv(gym.Env):
return observation, reward, done, info
def evaluate(self):
def evaluate(self, result_dir: Optional[str] = None):
"""
Evaluate whether the task is successfully completed.
"""
@@ -445,6 +454,24 @@ class DesktopEnv(gym.Env):
if last_action == "FAIL" or (type(last_action) == dict and last_action.get('action_type') == 'FAIL'):
return 0
if self.evaluator['func'] == "vllm_eval":
logger.info("Preparing vllm_eval metric options...")
screenshot_bytes = self.controller.get_screenshot()
import base64
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 = []
@@ -452,6 +479,8 @@ class DesktopEnv(gym.Env):
if "expected" in self.evaluator:
assert len(self.metric) == len(self.expected_getter), "The number of metrics and expected getters must be the same"
for idx, metric in enumerate(self.metric):
# Skip result state extraction if result_getter is None (e.g., for vllm_eval)
if self.result_getter[idx] is not None:
try:
config = self.evaluator["result"][idx]
result_state = self.result_getter[idx](self, config)
@@ -459,6 +488,9 @@ class DesktopEnv(gym.Env):
logger.error("File not found!")
if self.metric_conj == 'and':
return 0
else:
# For evaluators that don't need result state (e.g., vllm_eval)
result_state = None
if "expected" in self.evaluator and self.expected_getter and self.evaluator["expected"]:
expected_state = self.expected_getter[idx](self, self.evaluator["expected"][idx])
@@ -476,11 +508,16 @@ class DesktopEnv(gym.Env):
return sum(results) / len(results) if self.metric_conj == 'and' else max(results)
else:
# Single metric to evaluate whether the task is successfully completed
# For evaluators like vllm_eval that don't need result_getter, skip result state extraction
if self.result_getter is not None:
try:
result_state = self.result_getter(self, self.evaluator["result"])
except FileNotFoundError:
logger.error("File not found!")
return 0
else:
# For evaluators that don't need result state (e.g., vllm_eval)
result_state = None
if "expected" in self.evaluator and self.expected_getter and self.evaluator["expected"]:
expected_state = self.expected_getter(self, self.evaluator["expected"])

View File

@@ -151,10 +151,9 @@ class DesktopEnv(gym.Env):
# 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)
self.manager, self.provider = None, None
self.os_type = os_type
self.path_to_vm = path_to_vm
# Track whether environment has been used (step/setup) to optimize snapshot revert
# docker, aws, gcp, azure are always unused as the emulator starts from a clean state
# vmware, virtualbox are always used as the emulator starts from a dirty state
@@ -165,24 +164,12 @@ class DesktopEnv(gym.Env):
else:
raise ValueError(f"Invalid provider name: {self.provider_name}")
# Initialize environment variables
if path_to_vm:
self.path_to_vm = os.path.abspath(os.path.expandvars(os.path.expanduser(path_to_vm))) \
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
self.headless = headless
self.require_a11y_tree = require_a11y_tree
self.require_terminal = require_terminal
# Initialize emulator and controller
# logger.info("Initializing...")
# self._start_emulator()
# mode: human or machine
self.instruction = None
assert action_space in ["computer_13", "pyautogui", "claude_computer_use", "autoglm_computer_use"]
@@ -199,11 +186,13 @@ class DesktopEnv(gym.Env):
if not self.manager and not self.provider:
logger.info("Initializing...")
self.manager, self.provider = create_vm_manager_and_provider(self.provider_name, self.region, use_proxy=False)
if self.path_to_vm:
self.path_to_vm = os.path.abspath(os.path.expandvars(os.path.expanduser(self.path_to_vm))) \
if self.provider_name in {"vmware", "virtualbox"} else self.path_to_vm
else:
self.path_to_vm = self.manager.get_vm_path(os_type=self.os_type, region=self.region, screen_size=(self.screen_width, self.screen_height))
self._start_emulator()
def _start_emulator(self):
@@ -344,6 +333,8 @@ class DesktopEnv(gym.Env):
def _set_evaluator_info(self, task_config: Dict[str, Any]):
"""Set evaluator information from task config"""
if "evaluator" not in task_config:
return
# evaluator dict
# func -> metric function string, or list of metric function strings
# conj -> conjunction of multiple metrics if func is a list with length > 1, "and"/"or"

View File

@@ -158,3 +158,5 @@ from .vscode import (
def infeasible():
pass
from .vllm_eval import vllm_eval

View File

@@ -0,0 +1,657 @@
import os
from typing import Optional, List, Dict, Any
from dotenv import load_dotenv
import logging
import base64
import glob
from io import BytesIO
from PIL import Image
logger = logging.getLogger("desktopenv.vllm_eval")
load_dotenv()
def _compress_image(img_b64: str, max_size: int = 800, quality: int = 85) -> str:
"""
Compress base64 encoded image to reduce size
Args:
img_b64: Base64 encoded image string
max_size: Maximum dimension (width or height) in pixels
quality: JPEG quality (1-100), lower means smaller file size
Returns:
Compressed base64 encoded image string
"""
try:
# Decode base64 to image
img_data = base64.b64decode(img_b64)
img = Image.open(BytesIO(img_data))
# Convert to RGB if necessary (for PNG with transparency)
if img.mode in ('RGBA', 'LA', 'P'):
background = Image.new('RGB', img.size, (255, 255, 255))
if img.mode == 'P':
img = img.convert('RGBA')
background.paste(img, mask=img.split()[-1] if img.mode in ('RGBA', 'LA') else None)
img = background
# Resize if image is too large
original_size = img.size
if max(img.size) > max_size:
ratio = max_size / max(img.size)
new_size = tuple(int(dim * ratio) for dim in img.size)
img = img.resize(new_size, Image.Resampling.LANCZOS)
logger.info(f"Resized image from {original_size} to {new_size}")
# Compress to JPEG
buffer = BytesIO()
img.save(buffer, format='JPEG', quality=quality, optimize=True)
compressed_data = buffer.getvalue()
# Encode back to base64
compressed_b64 = base64.b64encode(compressed_data).decode('utf-8')
# Log compression ratio
original_size_kb = len(img_b64) * 3 / 4 / 1024 # base64 to bytes to KB
compressed_size_kb = len(compressed_b64) * 3 / 4 / 1024
compression_ratio = (1 - compressed_size_kb / original_size_kb) * 100
logger.info(f"Compressed image: {original_size_kb:.1f}KB -> {compressed_size_kb:.1f}KB ({compression_ratio:.1f}% reduction)")
return compressed_b64
except Exception as e:
logger.warning(f"Failed to compress image: {e}, using original")
return img_b64
class UnifiedLLM:
def __init__(self, model: str):
if model.startswith("gpt"):
self.provider = "openai"
elif model.startswith("claude"):
self.provider = "anthropic"
elif model.startswith("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"
self.model = model
self.client = self._init_client()
def _init_client(self):
"""Initialize client"""
if self.provider == "openai":
from openai import OpenAI
return OpenAI(
base_url=os.getenv("OPENAI_BASE_URL"),
api_key=os.getenv("OPENAI_API_KEY")
)
elif self.provider == "anthropic":
from anthropic import Anthropic
return Anthropic(
base_url=os.getenv("ANTHROPIC_BASE_URL"),
api_key=os.getenv("ANTHROPIC_API_KEY")
)
elif self.provider == "gemini":
logger.warning("Using Google Gemini model, make sure your internet connection is working.")
import google.generativeai as genai
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
return genai.GenerativeModel(self.model)
else:
logger.error(f"Unsupported LLM provider for model: {self.model}")
raise ValueError(f"Unsupported LLM provider for model: {self.model}")
def _get_supported_params(self, temperature: float, max_tokens: int, top_p: float) -> Dict[str, Any]:
"""Get supported parameters for each provider"""
base_params = {
"temperature": temperature,
"max_tokens": max_tokens
}
# GPT-5.2 and newer models may not support top_p
if self.provider == "openai":
# Only add top_p for older models
if not self.model.startswith("gpt-5"):
base_params["top_p"] = top_p
elif self.provider == "anthropic":
base_params["top_p"] = top_p
elif self.provider == "gemini":
base_params["top_p"] = top_p
return base_params
def generate(
self,
prompt: str,
temperature: float = 0.7,
max_tokens: int = 16384,
top_p: float = 1.0,
**kwargs
) -> str:
"""
Args:
prompt: Input prompt
temperature: Temperature (0.0-2.0)
max_tokens: Maximum number of tokens
top_p: Top-p sampling (0.0-1.0)
Returns:
Generated text
"""
params = self._get_supported_params(temperature, max_tokens, top_p)
if self.provider == "openai":
try:
response = self.client.chat.completions.create(
model=self.model,
messages=[{"role": "user", "content": prompt}],
**params
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"OpenAI API error: {e}")
raise e
elif self.provider == "anthropic":
try:
response = self.client.messages.create(
model=self.model,
messages=[{"role": "user", "content": prompt}],
**params
)
return response.content[0].text
except Exception as e:
logger.error(f"Anthropic API error: {e}")
raise e
elif self.provider == "gemini":
try:
import google.generativeai as genai
config = genai.GenerationConfig(
temperature=params["temperature"],
max_output_tokens=params["max_tokens"],
top_p=params.get("top_p", 1.0)
)
response = self.client.generate_content(prompt, generation_config=config)
return response.text
except Exception as e:
logger.error(f"Gemini API error: {e}")
raise e
def generate_with_images(
self,
prompt: str,
images_b64: List[str],
temperature: float = 0.7,
max_tokens: int = 16384,
top_p: float = 1.0,
**kwargs
) -> str:
"""
Generate with multiple images in a single request
Args:
prompt: Instruction prompt
images_b64: List of base64 encoded images
temperature: Temperature (0.0-2.0)
max_tokens: Maximum number of tokens
top_p: Top-p sampling (0.0-1.0)
Returns:
Generated text
"""
if not images_b64:
logger.warning("No images provided, falling back to text-only generation")
return self.generate(prompt, temperature, max_tokens, top_p, **kwargs)
params = self._get_supported_params(temperature, max_tokens, top_p)
if self.provider == "openai":
# Build content with text and all images
content = [{"type": "text", "text": prompt}]
for img_b64 in images_b64:
content.append({
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{img_b64}"
}
})
try:
response = self.client.chat.completions.create(
model=self.model,
messages=[{"role": "user", "content": content}],
**params
)
return response.choices[0].message.content
except Exception as e:
logger.error(f"OpenAI API error: {e}")
raise e
elif self.provider == "anthropic":
# Build content with text and all images
content = [{"type": "text", "text": prompt}]
for img_b64 in images_b64:
content.append({
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": img_b64
}
})
try:
response = self.client.messages.create(
model=self.model,
messages=[{"role": "user", "content": content}],
**params
)
return response.content[0].text
except Exception as e:
logger.error(f"Anthropic API error: {e}")
raise e
elif self.provider == "gemini":
import google.generativeai as genai
config = genai.GenerationConfig(
temperature=params["temperature"],
max_output_tokens=params["max_tokens"],
top_p=params.get("top_p", 1.0)
)
# Build content parts
content_parts = [prompt]
for img_b64 in images_b64:
img_data = base64.b64decode(img_b64)
img = Image.open(BytesIO(img_data))
content_parts.append(img)
try:
response = self.client.generate_content(content_parts, generation_config=config)
return response.text
except Exception as e:
logger.error(f"Gemini API error: {e}")
raise e
else:
raise ValueError(f"Unsupported provider: {self.provider}")
def _sample_key_frames(items: list, max_count: int) -> list:
"""
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 = True, 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:
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")
screenshot_files = sorted(glob.glob(pattern))
if not screenshot_files:
logger.warning(f"No screenshot files found in {result_dir}")
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:
img_data = f.read()
img_b64 = base64.b64encode(img_data).decode('utf-8')
# Compress if enabled
if compress:
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}: {filenames}")
return screenshots, filenames
def vllm_eval(result_state, **options) -> float:
"""
Evaluate task completion using vision-language model
Args:
result_state: Current state description
**options: Additional options including:
- result_dir: Path to result directory containing step screenshots (recommended)
- screenshots: List of base64 encoded screenshots (deprecated, use result_dir instead)
- instruction: Task instruction
- eval_model: Model name to use
- 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
Returns:
Score between 0.0 and 1.0
"""
# Try to load screenshots from result_dir if provided
result_dir = options.get("result_dir", None)
screenshots = options.get("screenshots", [])
# Image compression options
compress_images = options.get("compress_images", True)
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, screenshot_filenames = _load_screenshots_from_dir(
result_dir,
compress=compress_images,
max_size=max_image_size,
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...")
screenshots = [_compress_image(img, max_size=max_image_size, quality=image_quality) for img in screenshots]
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),
"max_tokens": options.get("max_tokens", 16384),
"top_p": options.get("top_p", 1.0)
}
llm = UnifiedLLM(eval_model)
# 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}
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 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. 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": 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. Be STRICT - when in doubt, score LOWER."""
try:
result = llm.generate_with_images(
prompt=prompt,
images_b64=screenshots,
**params
)
# Parse score from result
score = _parse_score(result)
logger.info(f"Evaluation result: {result}")
logger.info(f"Parsed score: {score}")
# Save raw result to file for reference
if result_dir:
eval_output_path = os.path.join(result_dir, "vllm_evaluation_result.json")
with open(eval_output_path, "w", encoding="utf-8") as f:
f.write(result)
logger.info(f"Saved evaluation result to {eval_output_path}")
return score
except Exception as e:
logger.error(f"Error during evaluation: {e}")
return 0.0
def _parse_evaluation_response(text: str) -> Dict[str, Any]:
"""
Parse the JSON evaluation response from the model
Returns:
Dictionary containing steps_analysis, final_completion, and score
"""
import re
import json
# Try to extract JSON from the response
# Sometimes models wrap JSON in markdown code blocks
text = text.strip()
# Remove markdown code blocks if present
if text.startswith("```"):
# Extract content between ``` markers
match = re.search(r'```(?:json)?\s*(\{.*?\})\s*```', text, re.DOTALL)
if match:
text = match.group(1)
else:
# Try to remove opening and closing ```
text = re.sub(r'^```(?:json)?\s*', '', text)
text = re.sub(r'\s*```$', '', text)
try:
result = json.loads(text)
# Validate required fields
if "steps_analysis" not in result:
logger.warning("Missing 'steps_analysis' field in response")
result["steps_analysis"] = []
if "final_completion" not in result:
logger.warning("Missing 'final_completion' field in response")
result["final_completion"] = "False"
if "score" not in result:
logger.warning("Missing 'score' field in response")
result["score"] = 0
return result
except json.JSONDecodeError as e:
logger.error(f"Failed to parse JSON response: {e}")
logger.error(f"Response text: {text[:500]}")
# Return a default structure
return {
"steps_analysis": [],
"final_completion": "False",
"score": 0
}
def _parse_score(text: str) -> float:
"""
Parse score from model response and convert to 0.0-1.0 range
Args:
text: Raw model response (expected to be JSON format)
Returns:
Score between 0.0 and 1.0
"""
result = _parse_evaluation_response(text)
# Extract score (0-10) and convert to 0.0-1.0
score = result.get("score", 0)
try:
score = float(score)
# Clamp to [0, 10] then normalize to [0.0, 1.0]
score = max(0.0, min(10.0, score))
normalized_score = score / 10.0
logger.info(f"Final completion: {result.get('final_completion')}")
logger.info(f"Raw score (0-10): {score}, Normalized score (0-1): {normalized_score}")
# Log steps analysis if available
steps = result.get("steps_analysis", [])
if steps:
logger.info(f"Steps analysis ({len(steps)} steps):")
for i, step in enumerate(steps):
logger.info(f" Step {i+1}: {step.get('step', 'N/A')} - {step.get('status', 'N/A')}")
return normalized_score
except (ValueError, TypeError) as e:
logger.warning(f"Could not parse score: {e}")
return 0.0

View File

@@ -39,5 +39,9 @@ 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)
else:
raise NotImplementedError(f"{provider_name} not implemented!")

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

@@ -4,25 +4,27 @@ import platform
import shlex
import json
import subprocess, signal
import sys
import time
from pathlib import Path
from typing import Any, Optional, Sequence
from typing import List, Dict, Tuple, Literal
import concurrent.futures
import Xlib
import lxml.etree
import pyautogui
import requests
import re
from PIL import Image, ImageGrab
from Xlib import display, X
from flask import Flask, request, jsonify, send_file, abort # , send_from_directory
from lxml.etree import _Element
platform_name: str = platform.system()
if platform_name == "Linux":
import Xlib
from Xlib import display, X
from pyxcursor import Xcursor
import pyatspi
from pyatspi import Accessible, StateType, STATE_SHOWING
from pyatspi import Action as ATAction
@@ -39,9 +41,14 @@ elif platform_name == "Windows":
import win32ui, win32gui
Accessible = Any
Xlib = None
display = None
X = None
Xcursor = None
elif platform_name == "Darwin":
import plistlib
from pyxcursor import Xcursor
import AppKit
import ApplicationServices
@@ -51,13 +58,16 @@ elif platform_name == "Darwin":
Accessible = Any
BaseWrapper = Any
Xlib = None
else:
# Platform not supported
Accessible = None
BaseWrapper = Any
from pyxcursor import Xcursor
Xlib = None
display = None
X = None
Xcursor = None
# todo: need to reformat and organize this whole file
@@ -89,6 +99,10 @@ def execute_command():
if arg.startswith("~/"):
command[i] = os.path.expanduser(arg)
# Replace 'python' with sys.executable to use the same Python interpreter as the server
if len(command) > 0 and command[0] in ['python', 'python3', 'python.exe', 'python3.exe']:
command[0] = sys.executable
# Execute the command without any safety checks.
try:
if platform_name == "Windows":
@@ -262,15 +276,12 @@ def launch_app():
@app.route('/screenshot', methods=['GET'])
def capture_screen_with_cursor():
# fixme: when running on virtual machines, the cursor is not captured, don't know why
file_path = os.path.join(os.path.dirname(__file__), "screenshots", "screenshot.png")
user_platform = platform.system()
# Ensure the screenshots directory exists
os.makedirs(os.path.dirname(file_path), exist_ok=True)
# fixme: This is a temporary fix for the cursor not being captured on Windows and Linux
if user_platform == "Windows":
def get_cursor():
hcursor = win32gui.GetCursorInfo()[1]
@@ -303,19 +314,53 @@ def capture_screen_with_cursor():
ratio = ctypes.windll.shcore.GetScaleFactorForDevice(0) / 100
# get logical screen size
user32 = ctypes.windll.user32
logical_width = user32.GetSystemMetrics(0)
logical_height = user32.GetSystemMetrics(1)
# ===== Key fix: get cursor position before taking screenshot =====
# win32gui.GetCursorPos() returns logical coordinates (consistent with pyautogui)
pos_win = win32gui.GetCursorPos()
logger.info(f"Cursor position (logical coordinates): {pos_win}")
# Take screenshot immediately to reduce time difference
img = ImageGrab.grab(bbox=None, include_layered_windows=True)
# =============================================
# ===== DPI scaling fix =====
if ratio != 1.0:
physical_width, physical_height = img.size
logger.info(f"Detected DPI scaling: {ratio}x ({ratio*100}%)")
logger.info(f"Physical screenshot size: {physical_width}x{physical_height}")
logger.info(f"Logical resolution: {logical_width}x{logical_height}")
logger.info(f"Resizing screenshot to match logical resolution...")
img = img.resize((logical_width, logical_height), Image.Resampling.LANCZOS)
logger.info(f"Screenshot resized to: {img.size}")
# ==========================
try:
cursor, (hotspotx, hotspoty) = get_cursor()
pos_win = win32gui.GetCursorPos()
pos = (round(pos_win[0]*ratio - hotspotx), round(pos_win[1]*ratio - hotspoty))
# ===== Cursor position handling =====
# win32gui.GetCursorPos() and pyautogui both use logical coordinates
# The screenshot has been resized to logical resolution, so use directly
logical_cursor_x = pos_win[0]
logical_cursor_y = pos_win[1]
pos = (logical_cursor_x - hotspotx, logical_cursor_y - hotspoty)
logger.info(f"Cursor position (logical coordinates): ({logical_cursor_x}, {logical_cursor_y})")
logger.info(f"Hotspot offset: ({hotspotx}, {hotspoty})")
logger.info(f"Final paste position: {pos}")
# ===================================
img.paste(cursor, pos, cursor)
except Exception as e:
logger.warning(f"Failed to capture cursor on Windows, screenshot will not have a cursor. Error: {e}")
logger.warning(f"Failed to capture cursor on Windows, screenshot will not include cursor. Error: {e}")
img.save(file_path)
elif user_platform == "Linux":
cursor_obj = Xcursor()
imgarray = cursor_obj.getCursorImageArrayFast()
@@ -324,17 +369,19 @@ def capture_screen_with_cursor():
cursor_x, cursor_y = pyautogui.position()
screenshot.paste(cursor_img, (cursor_x, cursor_y), cursor_img)
screenshot.save(file_path)
elif user_platform == "Darwin": # (Mac OS)
# Use the screencapture utility to capture the screen with the cursor
subprocess.run(["screencapture", "-C", file_path])
else:
logger.warning(f"The platform you're using ({user_platform}) is not currently supported")
return send_file(file_path, mimetype='image/png')
def _has_active_terminal(desktop: Accessible) -> bool:
""" A quick check whether the terminal window is open and active.
""" A quick check whether the terminal window is open and active (Linux only).
"""
for app in desktop:
if app.getRoleName() == "application" and app.name == "gnome-terminal-server":
@@ -344,6 +391,87 @@ def _has_active_terminal(desktop: Accessible) -> bool:
return False
def _get_windows_terminal_output() -> Optional[str]:
""" Get terminal output on Windows platform.
Supports Windows Terminal, PowerShell, Command Prompt, and ConHost.
"""
try:
from pywinauto import Desktop
from pywinauto.findwindows import ElementNotFoundError
desktop = Desktop(backend="uia")
# Common terminal applications on Windows
terminal_apps = [
"WindowsTerminal.exe", # Windows Terminal
"powershell.exe", # PowerShell
"pwsh.exe", # PowerShell Core
"cmd.exe", # Command Prompt
"conhost.exe" # Console Host
]
# Try to find active terminal windows
for window in desktop.windows():
try:
# Check if window is visible and not minimized
if not window.is_visible() or window.is_minimized():
continue
# Get window process name
process_name = window.element_info.name.lower()
# Check if this is a terminal window
is_terminal = False
for term_app in terminal_apps:
if term_app.lower() in process_name or \
any(term_name in process_name for term_name in ['terminal', 'powershell', 'command prompt', 'cmd']):
is_terminal = True
break
if not is_terminal:
continue
# Try to get text content from the terminal
# First, try to find console/edit controls that contain the output
try:
# For Windows Terminal and modern consoles
# Look for Edit or Document controls that contain the text
text_controls = window.descendants(control_type="Edit")
if not text_controls:
text_controls = window.descendants(control_type="Document")
if not text_controls:
text_controls = window.descendants(control_type="Text")
for control in text_controls:
try:
text = control.window_text()
if text and len(text.strip()) > 0:
return text.rstrip()
except:
pass
# If no text controls found, try to get the window text directly
window_text = window.window_text()
if window_text and len(window_text.strip()) > 0:
# Filter out just the window title
if window_text not in ['Windows PowerShell', 'Command Prompt', 'PowerShell', 'Administrator: Windows PowerShell']:
return window_text.rstrip()
except Exception as e:
logger.debug(f"Error getting text from window {process_name}: {e}")
continue
except Exception as e:
logger.debug(f"Error processing window: {e}")
continue
return None
except Exception as e:
logger.error(f"Error in _get_windows_terminal_output: {e}")
return None
@app.route('/terminal', methods=['GET'])
def get_terminal_output():
user_platform = platform.system()
@@ -358,8 +486,10 @@ def get_terminal_output():
xpath = '//application[@name="gnome-terminal-server"]/frame[@st:active="true"]//terminal[@st:focused="true"]'
terminals: List[_Element] = desktop_xml.xpath(xpath, namespaces=_accessibility_ns_map_ubuntu)
output = terminals[0].text.rstrip() if len(terminals) == 1 else None
else: # windows and macos platform is not implemented currently
# raise NotImplementedError
elif user_platform == "Windows":
output = _get_windows_terminal_output()
logger.debug(f"Terminal output retrieved: {output}")
else: # macOS platform is not implemented currently
return "Currently not implemented for platform {:}.".format(platform.platform()), 500
return jsonify({"output": output, "status": "success"})
except Exception as e:
@@ -989,6 +1119,9 @@ def get_window_size():
else:
return jsonify({"error": "app_class_name is required"}), 400
if platform_name != "Linux":
return jsonify({"error": "window_size is only supported on Linux"}), 501
d = display.Display()
root = d.screen().root
window_ids = root.get_full_property(d.intern_atom('_NET_CLIENT_LIST'), X.AnyPropertyType).value
@@ -1505,11 +1638,19 @@ def start_recording():
logger.error(f"Error removing old recording file: {e}")
return jsonify({'status': 'error', 'message': f'Failed to remove old recording file: {e}'}), 500
if platform_name == "Linux":
d = display.Display()
screen_width = d.screen().width_in_pixels
screen_height = d.screen().height_in_pixels
start_command = f"ffmpeg -y -f x11grab -draw_mouse 1 -s {screen_width}x{screen_height} -i :0.0 -c:v libx264 -r 30 {recording_path}"
elif platform_name == "Windows":
user32 = ctypes.windll.user32
screen_width = user32.GetSystemMetrics(0)
screen_height = user32.GetSystemMetrics(1)
# Use gdigrab for Windows screen capture
start_command = f"ffmpeg -y -f gdigrab -draw_mouse 1 -framerate 30 -video_size {screen_width}x{screen_height} -i desktop -c:v libx264 -r 30 {recording_path}"
else:
return jsonify({'status': 'error', 'message': f'Recording not supported on {platform_name}'}), 501
# Use stderr=PIPE to capture potential errors from ffmpeg
recording_process = subprocess.Popen(shlex.split(start_command),
@@ -1544,11 +1685,22 @@ def end_recording():
error_output = ""
try:
# Send SIGINT for a graceful shutdown, allowing ffmpeg to finalize the file.
# On Windows, use CTRL_C_EVENT; on Unix, use SIGINT
if platform_name == "Windows":
# On Windows, we need to terminate the process gracefully
# ffmpeg responds to standard input 'q' to quit gracefully
try:
recording_process.stdin.write(b'q')
recording_process.stdin.flush()
except:
# If stdin is not available, use terminate
recording_process.terminate()
else:
recording_process.send_signal(signal.SIGINT)
# Wait for ffmpeg to terminate. communicate() gets output and waits.
_, error_output = recording_process.communicate(timeout=15)
except subprocess.TimeoutExpired:
logger.error("ffmpeg did not respond to SIGINT, killing the process.")
logger.error("ffmpeg did not respond to stop signal, killing the process.")
recording_process.kill()
# After killing, communicate to get any remaining output.
_, error_output = recording_process.communicate()
@@ -1589,8 +1741,9 @@ def run_python():
f.write(code)
# Execute the file using subprocess to capture all output
# Use sys.executable to use the same Python interpreter as the Flask server
result = subprocess.run(
['/usr/bin/python3', temp_filename],
[sys.executable, temp_filename],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,

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. 在键盘上按下字母键 n在配体库中选择 ammine (NH3) 配体。\n9. 在 3D 视图中,将鼠标悬停并单击钴原子上的第 1 个氢原子,将其替换为氨配体。\n10. 在 3D 视图中,单击钴原子上的第 2 个氢原子,将其替换为氨配体。\n11. 在 3D 视图中,单击钴原子上的第 3 个氢原子,将其替换为氨配体。\n12. 在 3D 视图中,单击钴原子上的第 4 个氢原子,将其替换为氨配体。\n13. 在 3D 视图中,单击钴原子上的第 5 个氢原子,将其替换为氨配体。\n14. 在 3D 视图中,单击钴原子上的第 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. 在键盘上连续按两次 '+' 键,将中心离子的形式电荷设置为 '+2'。\n5. 在键盘上连续按两次数字键 '4',或单击几何形状下拉菜单并选择 'Square Planar',以设置平面四方配位几何构型。\n6. 将鼠标移动到 3D 模型视图的空白区域,单击鼠标左键以放置带有四个占位氢原子的镍中心。\n7. 在模板工具面板中,单击顶部名为 'Ligands' 的选项卡切换到配体模式。\n8. 在键盘上依次输入字母键 'e' 和 'n',以在配体库中选中 'ethylenediamine' (乙二胺) 配体。\n9. 在 3D 视图中,单击选中中心镍原子周围的任意一个氢原子。\n10. 在 3D 视图中,单击与上一步选中的氢原子相邻(顺式位置)的另一个氢原子,完成双齿配体的桥接结合。\n11. 在键盘上输入字母键 'n',以在配体库中切换选中 'ammine' (氨) 配体。\n12. 在 3D 视图中,单击剩余的第三个占位氢原子将其替换为氨配体。\n13. 在 3D 视图中,单击最后一个剩余的氢原子,将其替换为第二个氨配体,完成目标化合物构建。",
"steps_original": "1. 打开 Template Tool。\n2. 切换到 Centers 选项卡。\n3. 输入 'Ni' 或从弹出菜单中选择镍元素。\n4. 点击两次 '+' 符号,将正电荷设置为 +2。\n5. 按键 '44' 或选择平面四方几何形状。\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,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,47 @@
{
"id": "MDIJade6.5使用手册_task1",
"snapshot": "jade",
"instruction": "在 MDI Jade 中通过菜单 File → Patterns 加载衍射数据文件 DEMO001.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": [
"DEMO001.MDI"
],
"steps": "1. 在 Windows 桌面找到名为 MDI Jade 的快捷方式图标。\n2. 双击该快捷方式图标启动 MDI Jade 软件。\n3. 在软件主界面顶部的菜单栏中,单击 File 菜单。\n4. 在弹出的下拉菜单中,单击 Patterns... 选项,打开读入文件对话框。\n5. 在弹出的 Read Pattern Files 对话框中,在中间的 File Name 文件列表区域,寻找并单击选中名为 DEMO001.MDI 的文件。\n6. 单击该对话框左上方的 Read 按钮,将选定的衍射数据文件加载到软件中。",
"steps_original": "1. 在桌面找到 MDI Jade 图标,双击打开软件。\n2. 点击菜单 File → Patterns。\n3. 在弹出的对话框中选择 DEMO001.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,45 @@
{
"id": "MDIJade6.5使用手册_task2",
"snapshot": "jade",
"instruction": "在 JADE 中将选择DEMO001的衍射图谱,并通过 File → Save-Primary Pattern as *.txt 导出为 ASCII 格式,保存为 DEMO001.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": {
"input_files": [],
"steps": "1. 单击顶部菜单栏中的 \"File\" 菜单\n2. 在展开的下拉菜单中,单击选中 \"Save-Primary Pattern as *.txt\" 菜单项\n3. 在弹出的保存文件对话框中,单击将光标定位到 \"文件名\"(或 \"File name\")输入框\n4. 清空该输入框中的已有内容\n5. 在输入框中输入文字 \"DEMO001.txt\"\n6. 单击对话框右下方的 \"保存\"(或 \"Save\")按钮",
"steps_original": "1. 点击菜单 File → Save-Primary Pattern as *.txt。\n2. 在弹出的保存对话框中,设置文件名为 DEMO001.txt。\n3. 点击 Save 按钮保存文件。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MDIJade6.5使用手册_task3",
"snapshot": "jade",
"instruction": "使用 Search/Match 功能进行物相检索,并限制元素范围为 Al, Sn, 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": {
"input_files": [],
"steps": "1. 在主窗口工具栏中使用鼠标右键单击“S/M”按钮打开“Search/Match”条件设置对话框。\n2. 在“Search/Match”对话框右侧的“Search/Match Filters:”区域中单击勾选“Use Chemistry Filter”复选框打开化学元素过滤界面。\n3. 在弹出的“Current Chemistry [Filter]”对话框的元素周期表面板中单击“Al”按钮将其选中为限定元素。\n4. 在元素周期表面板中单击“Sn”按钮将其选中为限定元素。\n5. 在元素周期表面板中单击“O”按钮将其选中为限定元素。\n6. 单击“Current Chemistry [Filter]”对话框右上角的“OK”按钮保存元素设置并返回“Search/Match”对话框。\n7. 单击“Search/Match”对话框底部的“OK”按钮开始执行物相检索。\n8. 等待进度条结束在弹出的“Search/Match Display”窗口的列表中查看检索到的物相结果。",
"steps_original": "1. 点击菜单 S/M 按钮。\n2. 在 Search/Match 对话框中勾选 Use Chemistry Filter。\n3. 输入限定元素 Al, Sn, O点击 OK。\n4. 等待物相检索完成,检查结果列表。"
}
}

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,45 @@
{
"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": {
"input_files": [],
"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,45 @@
{
"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": {
"input_files": [],
"steps": "1. 在软件顶部的主菜单栏中,单击鼠标左键选择 \"Edit\" 菜单。\n2. 在展开的下拉菜单中,单击鼠标左键选择 \"Preferences\" 菜单项,等待弹出程序设置对话框。\n3. 在弹出的程序设置对话框顶部,单击鼠标左键选中名为 \"Instrument\" 的选项卡(标签页)以查看相关设置。",
"steps_original": "1. 在主菜单中点击 Edit。\n2. 选择 Preferences打开程序设置对话框。\n3. 点击对话框上方的 Instrument 标签,查看相关设置。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task10",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.MDI 后,右键单击主工具栏打印按钮打开打印预览窗口,点击 Setup → Layout勾选 Generate Profile on d-I Lines 等选项,然后使用垂直放大工具对图谱局部进行放大。",
"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": [
"DEMO001.MDI"
],
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项\n2. 在弹出的下拉菜单中,单击选择 \"Patterns...\" 打开数据文件读入窗口\n3. 在文件读入窗口的文件列表中,单击选中 \"DEMO001.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 加载 DEMO001.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,47 @@
{
"id": "jade-guide-example_task11",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.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": [
"DEMO001.MDI"
],
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项。\n2. 在弹出的下拉菜单中,单击选中 \"Patterns\" 选项,打开数据文件读入窗口。\n3. 在数据文件读入窗口中,单击选择包含目标文件的磁盘驱动器。\n4. 在文件夹列表中,依次双击展开并选中存储有目标数据的文件夹。\n5. 单击文件类型下拉菜单,在展开的列表中单击选中 \"All\"。\n6. 在文件列表中,单击选中名为 \"DEMO001.MDI\" 的文件。\n7. 单击窗口中的 \"Read\" 按钮,加载该数据文件。\n8. 在主界面的主工具栏中,找到并单击 \"平滑\"Smooth按钮。\n9. 观察全谱窗口或工作窗口中的衍射图谱,确认图谱曲线由于平滑处理变得更加光滑。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO001.MDI 文件。\n2. 在主工具栏中找到图谱平滑按钮Smooth。\n3. 左键单击平滑按钮,对当前衍射图谱执行平滑处理。\n4. 观察图谱变化,确认平滑效果已应用(图谱曲线变得更光滑)。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task12",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.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": [
"DEMO001.MDI"
],
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单。\n2. 在弹出的下拉菜单中,单击选择 \"Patterns...\" 选项,打开数据文件读入窗口。\n3. 在数据文件读入窗口中,单击对应的磁盘下拉菜单或图标,选择目标文件所在的磁盘驱动器。\n4. 在目录树列表中,双击展开文件夹以导航至保存有数据的目标文件夹。\n5. 在文件类型(格式)下拉菜单中,单击并选择 \"All\",以确保显示所有格式的数据文件。\n6. 在文件列表显示区中,单击选中名为 \"DEMO001.MDI\" 的文件。\n7. 单击窗口中的 \"Read\" 命令按钮,将该衍射数据文件读入全谱窗口中。\n8. 在主界面下方的编辑工具栏中,定位到 \"扣除背景\"Background通常标为BG按钮。\n9. 鼠标左键单击该 \"扣除背景\" 按钮,直接对当前的衍射图谱执行背景扣除命令。\n10. 观察全谱窗口中的衍射图谱,确认下方的背景基线已被扣除并变为平直线。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO001.MDI 文件。\n2. 在编辑工具栏中找到背景扣除按钮Background。\n3. 左键单击背景扣除按钮,对当前衍射图谱执行背景扣除操作。\n4. 观察图谱变化,确认背景已被扣除(基线变为平直)。"
}
}

View File

@@ -0,0 +1,45 @@
{
"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": {
"input_files": [],
"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 打开衍射数据文件 DEMO001.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": [
"DEMO001.MDI"
],
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Patterns\" 菜单项,弹出数据文件读入窗口\n3. 在文件读入窗口中,单击磁盘选择下拉菜单将其展开\n4. 在弹出的驱动器列表中,单击选中目标文件所在的磁盘\n5. 在文件夹树形列表中,双击展开并选中包含目标文件的文件夹\n6. 单击文件类型下拉菜单将其展开\n7. 在弹出的文件类型列表中,单击选中 \"All\" 数据类型选项\n8. 在文件展示列表中,单击选中名为 \"DEMO001.MDI\" 的数据文件\n9. 单击窗口中的 \"Read\" 命令按钮,以读入该数据文件",
"steps_original": "1. 在主菜单中点击 File。\n2. 选择 Patterns打开文件选择对话框。\n3. 浏览并选择 DEMO001.MDI 文件,点击 Read。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task4",
"snapshot": "jade",
"instruction": "在 Jade 中,先加载 DEMO001.MDI然后通过 File → Patterns 使用 Add 按钮叠加第二个衍射数据文件到同一窗口。",
"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": [
"DEMO001.MDI"
],
"steps": "1. 单击主菜单栏中的“File”菜单项。\n2. 在弹出的下拉菜单中单击“Patterns”菜单项打开数据文件读入窗口。\n3. 在数据文件读入窗口左上角的驱动器下拉菜单中,单击选择存放数据的磁盘。\n4. 在其下方的文件夹列表框中,双击逐层展开并单击选中包含目标 XRD 数据的文件夹。\n5. 单击文件列表下方的文件类型下拉菜单从中选择“All”选项以显示所有数据类型。\n6. 在右侧的文件列表框中单击选中名为“DEMO001.MDI”的文件。\n7. 单击窗口右侧区域的“Read”命令按钮加载该数据文件。\n8. 再次单击主菜单栏中的“File”菜单项。\n9. 在弹出的下拉菜单中单击“Patterns”菜单项重新打开数据文件读入窗口。\n10. (如果路径改变)按照前述步骤在驱动器和文件夹列表框中选择目标路径。\n11. 在文件列表框中,单击选中另一个需要叠加的 DEMO 数据文件。\n12. 单击窗口右侧区域的“Add”命令按钮将第二个数据文件叠加显示到当前窗口中。",
"steps_original": "1. 在主菜单中点击 File。\n2. 选择 Patterns打开文件选择对话框。\n3. 选择 DEMO001.MDI 文件,点击 Read 加载。\n4. 再次点击 File → Patterns。\n5. 选择另一个可用的 DEMO 数据文件,点击 Add 按钮将其叠加到当前窗口。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "jade-guide-example_task5",
"snapshot": "jade",
"instruction": "在 Jade 中,创建 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. 单击软件顶部主菜单栏中的 \"Tools\" 菜单。\n2. 在展开的下拉菜单中,单击对应创建索引的菜单项,打开 PDF 索引建立窗口。\n3. 在打开的 PDF 索引建立窗口中,单击选中 \"PDF2.DAT 文件\" 选项(或单击对应按钮选择该文件)作为数据来源。\n4. 观察窗口中“保存索引的位置”路径输入框,确认其保持为系统自动设置的默认路径,无需进行修改。\n5. 单击 PDF 索引建立窗口中的 \"Select All\" 按钮,以全选所需内容。\n6. 单击 PDF 索引建立窗口中的 \"Create\" 按钮开始建立索引。\n7. 等待程序运行(约需 10 分钟),直到索引生成过程完全结束。",
"steps_original": "1. 在主菜单中点击 Tools。\n2. 选择 'PDF2DAT 文件',打开 PDF 索引创建窗口。\n3. 点击 Select All 命令。\n4. 点击 Create 按钮,等待索引生成完成。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task6",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.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": [
"DEMO001.MDI"
],
"steps": "1. 单击软件顶部菜单栏中的 \"File\" 菜单项。\n2. 在弹出的下拉菜单中,单击选择 \"Patterns\" 菜单项,打开数据文件读入窗口。\n3. 在数据文件读入窗口中,单击磁盘选择控件选中目标磁盘。\n4. 在文件夹列表区域中,双击对应的文件夹节点导航至包含目标数据的文件夹。\n5. 在数据类型筛选区域中,单击选中 \"All\" 选项以显示所有支持的数据类型。\n6. 在文件列表区域中,单击选中名为 \"DEMO001.MDI\" 的数据文件。\n7. 单击窗口中的 \"Read\" 命令按钮以读入该数据文件。\n8. 在主界面的主工具栏中,左键单击 \"自动寻峰\" 按钮。\n9. 观察主工作窗口中的衍射曲线,确认各个衍射峰处已自动添加峰标记符号。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO001.MDI 文件。\n2. 在主工具栏中左键单击自动寻峰按钮。\n3. 查看图谱中标记的衍射峰,确认自动寻峰结果已显示。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task7",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.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": [
"DEMO001.MDI"
],
"steps": "1. 点击顶部菜单栏的 \"File\" 菜单\n2. 在弹出的下拉菜单中,单击选择 \"Patterns\" 选项,打开数据文件读入窗口\n3. 在数据文件读入窗口的文件列表区域,单击选中 \"DEMO001.MDI\" 文件\n4. 单击窗口中的 \"Read\" 按钮,加载读入该数据文件\n5. 在主界面下方的编辑工具栏中,左键单击\"手动寻峰\"命令按钮\n6. 在主界面的图谱显示窗口中,将鼠标光标移动到某一个未标记的衍射峰下方位置\n7. 在该位置左键单击,添加一个新的峰标记\n8. 在图谱显示窗口中,将鼠标光标移动到另一个已有峰标记的垂直中心线位置\n9. 在该中心线处右键单击,删除该处的峰标记",
"steps_original": "1. 通过 File → Patterns 加载 DEMO001.MDI 文件。\n2. 左键点击编辑工具栏中的手动寻峰命令按钮。\n3. 在图谱中某一个衍射峰下方左键单击,添加一个峰标记。\n4. 在另一个已有峰标记的中心线处右键单击,删除该峰标记。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task8",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.MDI 并执行自动寻峰后,通过 >> → Report → Peak Search Report 查看寻峰报告。",
"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": [
"DEMO001.MDI"
],
"steps": "1. 单击主菜单栏中的 'File' 菜单。\n2. 在下拉菜单中选择并单击 'Patterns...' 选项,打开数据读入对话框。\n3. 在数据读入对话框中,单击选择磁盘。\n4. 单击选择 XRD 数据文件夹。\n5. 在数据类型下拉菜单中,选择 'All'。\n6. 在文件列表中单击选中 'DEMO001.MDI' 数据文件。\n7. 单击对话框中的 'Read' 按钮,读入文件。\n8. 在主工具栏中,左键单击 '自动寻峰' 按钮执行自动寻峰。\n9. 单击工具栏中的 '>>' 按钮展开更多选项菜单。\n10. 在展开的选项中单击 'Report' 菜单项。\n11. 在子菜单中选择并单击 'Peak Search Report',打开寻峰报告对话框进行查看。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO001.MDI 文件。\n2. 左键单击主工具栏自动寻峰按钮执行寻峰。\n3. 点击 >> 按钮展开更多选项。\n4. 点击 Report 按钮。\n5. 选择 Peak Search Report打开并查看寻峰报告。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "jade-guide-example_task9",
"snapshot": "jade",
"instruction": "在 Jade 中,加载 DEMO001.MDI 后,对一个衍射峰区域进行单峰拟合:在全谱窗口中框选峰区域,右键点击自动拟合按钮打开参数对话框,勾选 Individual Profiles执行 Initialize 和 Refine 操作。",
"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": [
"DEMO001.MDI"
],
"steps": "1. 单击界面顶部菜单栏中的“File”菜单项。\n2. 在弹出的下拉菜单中单击选择“Patterns”选项打开数据文件读入窗口。\n3. 在数据文件读入窗口的磁盘驱动器下拉菜单中,单击选择存放数据的目标磁盘。\n4. 在左侧文件夹列表树中,单击展开并选中包含文件的目标文件夹。\n5. 在数据类型下拉菜单中单击选择“All”选项以显示所有数据类型。\n6. 在右侧的文件列表中单击选中名为“DEMO001.MDI”的特定文件。\n7. 单击读入窗口中的“Read”命令按钮加载该数据文件。\n8. 将鼠标光标移动到主工具栏,左键单击“自动寻峰”按钮执行自动寻峰操作。\n9. 将鼠标光标移动到主界面的全谱窗口区域内。\n10. 在目标衍射峰的一侧按下鼠标左键,拖拽光标画出一个矩形框将该待拟合峰区域完全圈住。\n11. 松开鼠标左键,完成峰区域的选择并将其放大显示在工作窗口中。\n12. 将鼠标光标移动到主工具栏中的“自动拟合”命令按钮上。\n13. 单击鼠标右键,打开拟合参数设置对话框。\n14. 在拟合参数设置对话框中找到并单击勾选“Individual Profiles”复选框。\n15. 将鼠标光标移动到界面的编辑工具栏中,左键单击“手动拟合”命令按钮。\n16. 将鼠标光标移动到放大的工作窗口中目标衍射峰下方的中心位置,单击鼠标左键,标记对该峰进行拟合。\n17. 返回拟合参数设置对话框左键单击“Initialize”命令按钮以初始化拟合参数。\n18. 在拟合参数设置对话框中左键单击“Refine”命令按钮执行一次拟合修正。\n19. 观察主界面右上角显示的拟合误差 R 值,若 R 值大于或等于 5%则再次左键单击“Refine”按钮重复此操作直至 R 值小于 5% 为止。",
"steps_original": "1. 通过 File → Patterns 加载 DEMO001.MDI 文件。\n2. 左键单击主工具栏自动寻峰按钮执行寻峰。\n3. 在全谱窗口中拖拽鼠标画一个矩形框,圈住要拟合的峰区域。\n4. 右键点击主工具栏中的自动拟合按钮,打开拟合参数设置对话框。\n5. 在对话框中勾选 Individual Profiles。\n6. 左键点击编辑工具栏中的手动拟合命令按钮。\n7. 在目标峰下方单击执行拟合。\n8. 点击 Initialize 按钮初始化拟合。\n9. 多次点击 Refine 按钮直到右上角拟合误差 R 小于 5%。"
}
}

View File

@@ -0,0 +1,58 @@
{
"id": "Origin_User_Guide_2025b_E_task1",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Data → Connect to File 导入一个本地 Excel 文件 example.xlsx",
"source": "custom",
"config": [
{
"type": "upload_file",
"parameters": {
"files": [
{
"local_path": "evaluation_examples/data/origin/example.xlsx",
"path": "C:\\Users\\user\\Desktop\\example.xlsx"
}
]
}
},
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"example.xlsx"
],
"steps": "1. 单击顶部主菜单栏中的 \"Data\" 菜单。\n2. 在展开的下拉菜单中,将鼠标悬停或单击 \"Connect to File\" 菜单项以展开子菜单。\n3. 在展开的子菜单中,单击选中 \"Excel...\" 选项。\n4. 在弹出的文件选择对话框中,单击选中文件名输入框将光标定位至此。\n5. 在文件名输入框中,输入文字 \"example.xlsx\"。\n6. 单击对话框右下角的 \"Open\"(或\"打开\")按钮。",
"steps_original": "1. 在 Origin 的主菜单中选择 Data → Connect to File。\n2. 点击 Connect to File 菜单中的按钮。\n3. 选择文件 example.xlsx 并点击 Open。\n4. 数据将被加载到当前的工作表中。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task11",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Graph → Adding Error Bars 添加误差条到现有图表",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 在工作区中,单击目标图表窗口的任意位置以将其激活。\n2. 将鼠标指针移动到图表内需要添加误差条的数据曲线或数据点上。\n3. 在该数据曲线上单击鼠标右键,打开右键上下文菜单。\n4. 在弹出的右键菜单中将鼠标悬停或单击“Graph”选项展开级联子菜单。\n5. 在展开的子菜单中单击选中“Adding Error Bars”菜单项打开误差条设置对话框。\n6. 在弹出的对话框中,单击误差数据来源对应的下拉菜单控件以展开列表。\n7. 在展开的下拉列表中,单击选中包含误差值的目标数据列。\n8. 单击对话框底部的“OK”按钮应用设置并关闭对话框。\n9. 观察图表窗口,确认选中的数据曲线上已正确渲染出误差条标记。",
"steps_original": "1. 打开一个现有图表并右键点击图表元素。\n2. 选择 Graph → Adding Error Bars。\n3. 选择误差数据列并点击 OK 应用。\n4. 查看图表是否正确添加了误差条。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task12",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Tools → Pick Data Points 工具拾取数据点并保存到新的工作表中",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 单击包含数据点的图表窗口的任意位置或标题栏,将其激活为当前操作窗口。\n2. 在软件顶部的主菜单栏中,单击 \"Data\"(或根据版本对应 \"Tools\")菜单以展开下拉列表。\n3. 在展开的下拉菜单中,单击选择 \"Pick Data Points\" 菜单项,系统将弹出 \"Pick Points\" 对话框,且鼠标光标自动变为方形交叉准星。\n4. 在图表区域内移动鼠标,将方形交叉准星悬停定位在需要拾取的第一个目标数据点上。\n5. 在该数据点上双击鼠标左键,观察并确认准星光标变为圆形,此时该点的坐标已记录在对话框中。\n6. 若需拾取多个点,重复执行将光标移动到目标点并双击鼠标左键的操作,逐个完成数据点选择。\n7. 所有目标数据点拾取完毕后,将鼠标移至悬浮的 \"Pick Points\" 对话框,单击其底部的 \"Done\" 按钮,结束拾取并将结果输出至新建的工作表中。",
"steps_original": "1. 打开一个包含数据点的图表。\n2. 在主菜单中选择 Tools → Pick Data Points。\n3. 使用交叉标记在图中选择数据点。\n4. 点击 Done 按钮以保存选择的数据点到新的工作表。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task2",
"snapshot": "origin",
"instruction": "在 Origin 中通过 View → Formula Bar 打开公式栏,并在公式栏输入 =stdev(B1:B10)",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 单击顶部主菜单栏中的 \"View\" 菜单。\n2. 在展开的下拉菜单中,单击选中 \"Formula Bar\" 菜单项以在界面中显示公式栏。\n3. 在界面上方出现的公式栏中,单击 \"fx\" 图标右侧的文本输入框Expression/Text 框)使其获得光标焦点。\n4. 在该文本输入框中输入文字 =stdev(B1:B10) 。\n5. 按下键盘上的 Enter 键,或者单击文本输入框左侧带有绿色对勾图标的 \"OK\" 按钮以提交并应用该公式。\n6. 观察当前工作表中被选中的单元格,确认其是否正确显示出该公式的计算结果。",
"steps_original": "1. 在主菜单中选择 View → Formula Bar。\n2. 在出现的公式栏中,点击当前单元格内并输入 =stdev(B1:B10)。\n3. 按 Enter 键以应用公式并计算结果。\n4. 检查公式栏输出的结果是否正确。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task3",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Axis Dialog 修改 X 轴的范围为 20 到 180",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 在图表窗口的 X 轴(横坐标轴)区域上,右键单击鼠标。\n2. 在弹出的右键快捷菜单中单击选择“Axis Dialog”菜单项。\n3. 在弹出的“X Axis”对话框中单击左侧面板中的“Horizontal”图标。\n4. 单击对话框顶部的“Scale”选项卡。\n5. 在“Scale”面板中单击选中“From”右侧的文本输入框。\n6. 清空该输入框中的现有内容,输入数值 20。\n7. 单击选中“To”右侧的文本输入框。\n8. 清空该输入框中的现有内容,输入数值 180。\n9. 单击对话框底部的“Apply To...”按钮。\n10. 单击对话框底部的“OK”按钮以完成设置并关闭对话框。",
"steps_original": "1. 在图层的 X 轴区域右键点击并选择 Axis Dialog。\n2. 在左侧选择 Scale 标签。\n3. 将 From 值修改为 20将 To 值修改为 180。\n4. 点击 Apply To 按钮以应用更改,然后点击 OK 完成。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task4",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Graph → Rescale to Show All 重设比例以显示所有数据",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 确保当前工作区中有一个已打开且包含数据的图表窗口处于激活(选中)状态。\n2. 将鼠标光标移动到软件顶部的主菜单栏。\n3. 单击主菜单栏中的 \"Graph\" 菜单项,展开下拉菜单。\n4. 在展开的 \"Graph\" 下拉菜单中,将鼠标移动并单击选中 \"Rescale to Show All\" 菜单项。\n5. 观察图表窗口,确认图表的坐标轴比例已自动重设,并完整显示出所有的数据点。",
"steps_original": "1. 打开一个包含数据的图表。\n2. 在主菜单选择 Graph → Rescale to Show All。\n3. 图表比例重设以显示所有数据点。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task5",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Tools → Data Slicer 激活数据切片器并设置切片条件为 X=50",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 单击主菜单栏中的 'Tools' 菜单以展开工具菜单项。\n2. 在 'Tools' 下拉菜单中,单击 'Data Slicer' 选项。\n3. 在弹出的 'Data Slicer' 窗口中,将鼠标移动到切片器条件的下拉或输入控件区域。\n4. 在切片器条件的控制项中,输入或选择 'X=50' 作为切片过滤条件。\n5. 在条件设置区域或窗口底部,单击 'Apply' 按钮或相关的应用控件以使切片条件生效。\n6. 观察图表,确认显示的已是根据条件 'X=50' 切片后的数据点。",
"steps_original": "1. 在主菜单中选择 Tools → Data Slicer。\n2. 数据切片器面板将被激活。\n3. 在切片器的条件中选择 X=50 并应用切片。\n4. 图表中将显示切片后的数据点。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task8",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Worksheet → Convert to Matrix 将活动表格转换成矩阵",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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. 单击选中包含目标数据的 Worksheet 工作簿窗口的标题栏,使其成为当前活动窗口。\n2. 在软件顶部的系统主菜单栏中单击“Worksheet”菜单以展开下拉列表。\n3. 在展开的下拉菜单中单击选中“Convert to Matrix”菜单项如弹出级联子菜单则单击选择“Direct...”或其他对应选项),打开转换配置对话框。\n4. 在弹出的对话框中找到用于指定转换方法的下拉菜单控件通常标记为“Method”或“Data Format”单击该下拉菜单将其展开。\n5. 在展开的选项列表中单击选中所需的矩阵转换选项例如“X across columns”。\n6. 单击对话框底部的“OK”按钮确认配置并执行转换操作等待系统生成包含矩阵数据的新窗口。",
"steps_original": "1. 打开一个包含数据的活动表格。\n2. 在主菜单中选择 Worksheet → Convert to Matrix。\n3. 根据对话框选择矩阵转换选项(例如 X Across Columns。\n4. 点击 OK 完成转换,生成矩阵数据。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "Origin_User_Guide_2025b_E_task9",
"snapshot": "origin",
"instruction": "在 Origin 中通过 Object Edit Toolbar 对齐选中的图表对象",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OriginLab\\Origin2025b\\Origin64.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"origin"
],
"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\" 键。\n2. 在图表窗口中,单击选中第一个图表对象(该对象将作为后续对齐操作的位置基准)。\n3. 保持 \"Shift\" 键按下状态,单击选中其他需要对齐的图表对象。\n4. 松开键盘上的 \"Shift\" 键,完成多个图表对象的选择。\n5. 在界面上找到并定位到 \"Object Edit\" 工具栏。\n6. 单击 \"Object Edit\" 工具栏上所需的对齐图标按钮(例如单击 \"Left\" 左对齐按钮或 \"Center\" 居中对齐按钮),执行对齐操作。",
"steps_original": "1. 使用鼠标选择需要对齐的对象。\n2. 打开 Object Edit Toolbar。\n3. 点击对齐按钮,例如 Align Left 或 Align Center。\n4. 所选对象将以统一对齐样式排列。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "animation_task3",
"snapshot": "ovito",
"instruction": "在 OVITO 中将动画帧数从默认设置改为 10 帧每秒。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在 OVITO 的顶部菜单栏中,单击包含动画选项的菜单以将其展开。\n2. 在展开的下拉菜单中,单击选择 'Animation settings' 选项,打开 'Animation Settings' 对话框。\n3. 在弹出的 'Animation Settings' 对话框中,定位到顶部的 'Animation' 分组区域。\n4. 单击 'Frames per second:' 标签右侧的数值输入框,将光标定位在输入框内(若为下拉菜单则单击展开)。\n5. 删除并清空该输入框中原有的数值内容。\n6. 使用键盘在输入框中输入数字 '10'(或在下拉选项中单击选中 '10')。\n7. 定位到对话框右下角,单击 'OK' 按钮以保存设置并关闭对话框。",
"steps_original": "1. 在 OVITO 的顶部菜单栏中选择 'Animation settings'。\n2. 在弹出的 'Animation settings' 窗口中,找到 'Frames per second' 输入框。\n3. 将帧速率设置为 10。\n4. 点击 'OK' 以保存更改。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "aspherical_particles_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,为粒子指定球形形状。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在弹出的下拉菜单中,单击 \"Load File\"(加载文件)选项。\n3. 在弹出的文件浏览对话框中,单击选中目标粒子数据文件。\n4. 单击对话框右下角的 \"Open\"(打开)按钮将文件加载入场景。\n5. 将光标移动到界面右侧的 \"Pipeline\"(管线)面板。\n6. 在管线界面的树形列表中,单击选中名为 \"Particles\" 的可视化元素节点。\n7. 将光标向下移动到 \"Pipeline\" 面板下方的属性参数区域,滚动鼠标滚轮找到 \"Particle types\" 面板。\n8. 单击 \"Particle types\" 面板左侧的展开图标(如箭头或加号)将其展开。\n9. 在展开的粒子类型列表中,找到目标粒子类型所在行,单击该行对应的 \"Shape\"(形状)下拉菜单框。\n10. 在弹出的形状选项下拉列表中,单击选中 \"Sphere\"(球形)选项。\n11. 将光标移至中间的主三维视口区域,单击鼠标左键以确认操作,并观察粒子形状是否已更新为球形。",
"steps_original": "1. 打开 OVITO 软件。\n2. 选择 File → New 或打开一个现有的粒子数据文件。\n3. 在 'Pipeline' 界面选择 'Particles' 可视化元素。\n4. 转到 'Particle types' 面板,将粒子形状调整为 Sphere球形。\n5. 确认并应用更改,确保形状为球形并更新可视化。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "clone_pipeline_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过主工具栏中的 Pipeline 下拉菜单,选择 'Clone current pipeline...' 选项来克隆当前数据通道。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在 OVITO 主界面顶部工具栏中,单击 \"Pipelines:\" 标签右侧的下拉菜单控件以展开列表。\n2. 在展开的下拉菜单中,单击底部的 \"Clone current pipeline...\" 菜单项。\n3. 在弹出的 \"Clone pipeline\" 对话框中,定位到右上方的 \"Cloning mode:\" 区域。\n4. 在 \"Cloning mode:\" 区域内,根据克隆需求,单击相应数据源或修改器所在行右侧的 \"Copy\" 或 \"Share\" 按钮。\n5. 在 \"Clone pipeline\" 对话框的右下角,单击 \"OK\" 按钮以确认操作并关闭对话框。\n6. 观察主界面的 3D 可视化视口,确认场景中并排显示了原始流水线和克隆流水线的输出对象。",
"steps_original": "1. 在 OVITO 的主工具栏中找到 'Pipelines' 下拉菜单。\n2. 点击下拉菜单并选择 'Clone current pipeline...'。\n3. 在打开的 'Clone pipeline' 对话框中,选择克隆模式(如 Copy 或 Share。\n4. 点击 'OK' 按钮完成克隆操作。\n5. 确认在可视化场景中同时显示原始通道和克隆通道的输出。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "code_generation_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过 File → Generate Python Script 打开代码生成器窗口。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在操作系统桌面或任务栏上,双击 OVITO 应用程序的快捷方式图标以启动软件。\n2. 等待 OVITO 软件主界面完全加载并显示。\n3. 将鼠标光标定位到软件主窗口最顶部区域的水平菜单栏。\n4. 单击菜单栏中的“File”文本标签展开文件操作的下拉菜单。\n5. 在弹出的“File”下拉菜单列表中向下移动鼠标光标并悬停在“Generate Python Script”选项上。\n6. 单击选中“Generate Python Script”菜单项。\n7. 等待界面响应,观察并确认屏幕上成功弹出一个包含 Python 代码文本框的独立代码生成器窗口窗口顶部可能包含如“Visualization code”等复选框控件。",
"steps_original": "1. 启动 OVITO 软件。\n2. 点击顶部菜单栏中的 File。\n3. 在下拉菜单中选择 Generate Python Script。\n4. 确保代码生成器窗口正常打开(可见 Python 代码编辑界面)。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "customize_init_state_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中创建一个名为 defaults.ovito 的文件,以保存空的初始会话状态。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 启动 OVITO 桌面应用程序,并等待主界面完全加载。\n2. 单击顶部主菜单栏中的 \"File\" 菜单项,展开下拉菜单。\n3. 在展开的下拉菜单中,单击 \"New Session\"(或 \"Clear Session\")选项,以确保当前会话被完全清空(不包含任何数据集和管道)。\n4. 再次单击顶部主菜单栏中的 \"File\" 菜单项,展开下拉菜单。\n5. 在下拉菜单中,单击选中 \"Save Session State As...\" 选项,等待系统弹出文件保存对话框。\n6. 在弹出的文件保存对话框中,将鼠标光标单击定位到“文件名”(File name) 文本输入框。\n7. 选中并清空“文件名”输入框中原有的默认内容。\n8. 在“文件名”输入框中,使用键盘输入文本 \"defaults.ovito\"。\n9. 单击对话框右下角的“保存”(Save) 按钮,关闭对话框并保存该空会话状态文件。",
"steps_original": "1. 打开 OVITO。\n2. 点击菜单栏中的 File → Save Session State As。\n3. 在弹出的文件保存对话框中,将文件命名为 defaults.ovito。\n4. 确保会话为空(即不包含数据集和管道)。\n5. 点击保存按钮。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "data_model_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过 Data Inspector 检查导入的粒子属性表,包括 Position 和 Potential Energy 列。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 双击桌面上的 OVITO 快捷方式图标启动软件。\n2. 单击主界面顶部菜单栏中的 \"File\" 菜单。\n3. 在弹出的下拉菜单中,单击 \"Load File\" 选项。\n4. 在打开的文件选择对话框中,浏览并单击选中包含粒子属性的目标模拟文件(例如 .xyz 格式)。\n5. 单击文件选择对话框右下角的 \"Open\" 按钮以加载文件。\n6. 在主界面顶部工具栏中,找到并单击 \"Data Inspector\" 按钮(通常为表格或放大镜图标)以打开数据检查器面板。\n7. 在 Data Inspector 面板的顶部,单击选中 \"Particles\" 选项卡。\n8. 在面板下方显示的数据表格中,水平滚动或直接查看,找到表头名为 \"Position\" 的列并查看其数值。\n9. 在同一个数据表格中,找到表头名为 \"Potential Energy\" 的列并查看其数值。",
"steps_original": "1. 打开 OVITO 软件。\n2. 导入一个包含粒子属性的模拟文件(如 .xyz 格式)。\n3. 点击顶部工具栏中的 Data Inspector 按钮。\n4. 在 Data Inspector 面板查看粒子属性表,包括 Position 和 Potential Energy 列。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "export_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,将当前数据管道导出为粒子及其属性的数据表,保存为文件 particle_data.csv。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在展开的下拉菜单中,单击 \"Export File\" 选项。\n3. 在弹出的导出文件对话框中,单击 \"保存类型\" (或 Format) 下拉菜单。\n4. 在展开的下拉列表中,单击选中 \"Table of Particles\" 选项。\n5. 单击 \"文件名\" (或 File name) 输入框,将光标定位到该输入框中。\n6. 清空输入框中的原有内容,输入文本 \"particle_data.csv\"。\n7. 单击对话框右下角的 \"Save\" (或 保存) 按钮以确认导出。",
"steps_original": "1. 在菜单栏中,点击 File → Export File。\n2. 在弹出的对话框中,选择导出格式为 'Table of Particles'.\n3. 指定文件名为 particle_data.csv并选择保存位置。\n4. 点击 'Save' 按钮以完成导出。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "marker_particles_task2",
"snapshot": "ovito",
"instruction": "在 OVITO 中,调整动画播放速度为每秒 15 帧。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在软件主界面的动画工具栏中,单击带有小钟图标的 'Animation settings' 按钮\n2. 在弹出的 'Animation Settings' 窗口中,定位到 'Animation' 分组下的 'Frames per second' 组合输入框,并单击将其选中\n3. 清空该输入框中的已有内容\n4. 在该输入框中输入数字 '15'\n5. 单击对话框底部的 'OK' 按钮保存设置并关闭窗口",
"steps_original": "1. 在 OVITO 界面上,点击 Animation Settings 按钮(小钟图标)。\n2. 在 Animation Settings 窗口中,找到 'Frames per second'(帧率)选项。\n3. 将 Frames per second 的值设置为 15。\n4. 点击 'OK' 确认设置。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "miscellaneous_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过 File → Save Session State 保存当前会话为 'session.ovitostate'。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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 Session State\" 选项。\n3. 在弹出的文件保存对话框中,将光标定位到文件名输入框,清空已有内容,输入文本 \"session.ovitostate\"。\n4. 单击对话框底部的 \"Save\"(或保存)按钮。",
"steps_original": "1. 点击菜单栏中的 File。\n2. 选择 Save Session State。\n3. 在弹出的保存对话框中选择目标路径并输入文件名 'session.ovitostate'。\n4. 点击 Save 保存文件。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "python_extensions_task1",
"snapshot": "ovito",
"instruction": "在 OVITO Pro 中,通过 Edit → Python Extensions 打开扩展目录。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在操作系统桌面或任务栏中,双击 OVITO Pro 程序的快捷方式图标以启动软件。\n2. 等待 OVITO Pro 软件主界面完全加载显示。\n3. 在软件主界面顶部的菜单栏中,单击 \"Edit\" 菜单项,展开其下拉菜单列表。\n4. 在展开的下拉菜单列表中,单击选中 \"Python Extensions\" 菜单项。\n5. 等待屏幕上弹出一个标题为 \"Python Extensions\" 的对话框窗口,确认扩展目录已成功打开。",
"steps_original": "1. 打开 OVITO Pro 软件。\n2. 点击顶部菜单栏中的 Edit 菜单。\n3. 从下拉菜单中选择 Python Extensions。\n4. 查看扩展目录窗口,确认已打开。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "remote_file_access_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过 File → Load Remote File 打开远程 SSH 文件 sftp://user@hostname/path/file",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 启动 OVITO 软件并等待进入主界面。\n2. 单击主界面顶部菜单栏中的 \"File\" 菜单将其展开。\n3. 在展开的下拉菜单中,单击选择 \"Load Remote File\" 菜单项,此时会弹出 \"Load Remote File\" 对话框。\n4. 在 \"Load Remote File\" 对话框中,单击 \"Remote URL:\" 标签下方的组合输入框将光标定位至此。\n5. 在该输入框中清空原有内容并输入远程文件地址sftp://user@hostname/path/file。\n6. 单击 \"File type:\" 标签下方的下拉菜单控件将其展开。\n7. 在展开的下拉列表中,单击选择 \"<Auto-detect file format>\" 选项。\n8. 在 \"SSH connection method:\" 区域,单击 \"Integrated client (default)\" 左侧的单选按钮以选中该选项。\n9. 单击对话框右下角蓝色的 \"Open\" 按钮以建立连接并加载文件。",
"steps_original": "1. 打开 OVITO 软件。\n2. 点击菜单 File → Load Remote File。\n3. 在弹出的对话框中填写 Remote URL 字段例如sftp://user@hostname/path/file。\n4. 在 File type 下选择 Auto-detect file format。\n5. 在 SSH connection method 下选择 Integrated client (default)。\n6. 点击 Open 完成连接并加载文件。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "remote_rendering_task1",
"snapshot": "ovito",
"instruction": "在 OVITO Pro 中设置远程渲染任务的导出目录并配置 CPU 核心数。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在操作系统中双击打开 OVITO Pro 软件。\n2. 在软件界面右侧的命令面板顶部单击带有“扳手和螺丝刀”图标的“Utilities”标签页。\n3. 在 Utilities 面板顶部的下拉菜单控件上,单击以展开工具列表。\n4. 在展开的下拉列表中单击选中“Render On Remote Computer”选项。\n5. 在下方出现的设置面板中找到“Bundle export directory:”标签单击其右侧的“Choose...”按钮。\n6. 在弹出的文件浏览对话框中,浏览并单击选中一个用作导出的本地目标文件夹。\n7. 单击文件浏览对话框底部的“选择文件夹”(或“确认”)按钮,完成路径的设置并关闭对话框。\n8. 找到面板下方的“CPU cores per task:”输入框,单击将光标定位到该输入框内。\n9. 选中并清空输入框内的已有内容,通过键盘输入所需的 CPU 核心数量数字(如果需要默认使用所有可用核心,则清空后不输入任何内容)。",
"steps_original": "1. 打开 OVITO Pro 软件。\n2. 点击顶部菜单中的 Utilities 标签。\n3. 选择 Render On Remote Computer 工具。\n4. 在弹出的对话框中,点击 'Choose' 按钮为 Bundle Export Directory 设置一个本地导出目录。\n5. 在 CPU cores per task 选项框中输入渲染任务所需的 CPU 核心数量(可为空,默认使用所有核心)。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "rendering_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过 Render Settings 面板渲染主动观察窗口为分辨率 1024x768 的图像,背景为透明色。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 双击桌面或系统菜单中的 OVITO 软件快捷方式打开软件。\n2. 在软件主界面的观察窗口区域,单击鼠标左键以激活目标视口(确保视口边缘出现黄色边框)。\n3. 在界面右侧命令面板顶部的工具栏中,单击带有照相机形状的 \"Render\" 图标选项卡,打开 \"Render settings\" 面板。\n4. 在 \"Render settings\" 面板的 \"Rendering range\" 区域,单击选中 \"Single frame\" 单选按钮。\n5. 在 \"Output image size\" 区域,将光标定位到 \"Width:\" 对应的数值输入框中,清空原有内容,输入 \"1024\"。\n6. 在 \"Output image size\" 区域,将光标定位到 \"Height:\" 对应的数值输入框中,清空原有内容,输入 \"768\"。\n7. 在 \"Background\" 区域,单击选中 \"Transparent\" 单选按钮。\n8. 在 \"Render settings\" 面板的底部,单击带有照相机图标的 \"Render active viewport\" 按钮开始渲染。",
"steps_original": "1. 打开 OVITO 软件。\n2. 确保观察窗口激活(黄色边框)。\n3. 点击右侧命令面板上的 Render 图标。\n4. 在弹出的 Render Settings 面板中,选择 'Single frame'。\n5. 设置输出图像大小为 Width: 1024 和 Height: 768。\n6. 选择背景为 'Transparent'。\n7. 点击 'Render active viewport' 按钮完成渲染。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "transparent_particles_task1",
"snapshot": "ovito",
"instruction": "在软件中,将所有粒子的 Transparency 属性设置为 0.5,使粒子半透明。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 双击桌面快捷方式打开软件。\n2. 单击主界面顶部菜单栏的 \"File\" 菜单。\n3. 在弹出的下拉菜单中,单击 \"Load File\" 选项。\n4. 在弹出的文件选择对话框中,双击所需的粒子数据文件进行加载。\n5. 在界面右侧的修改器控制面板中,单击 \"Add modification...\" 下拉按钮以展开修改器列表。\n6. 在下拉列表中,单击选中 \"Compute property\" 选项,将其插入到数据管道中。\n7. 在界面下方的 Compute property 修改器参数面板中,单击 \"Output property\" 属性下拉列表。\n8. 在展开的属性选项中,单击选中 \"Transparency\"。\n9. 在参数面板中,单击将鼠标光标定位到 \"Expression\" 文本输入框中。\n10. 删除或清空该输入框内的所有已有字符。\n11. 在输入框内输入数值 \"0.5\"。\n12. 检查下方的 \"Compute only for selected particles\" 复选框,若已勾选,则单击该复选框取消勾选,以确保应用到全部粒子。\n13. 按下键盘上的回车键Enter或单击界面空白区域确认输入并应用修改。",
"steps_original": "1. 打开软件并加载需要的粒子数据。\n2. 插入 Compute 属性修正器到数据管道。\n3. 在 Compute 属性修正器中找到 Transparency 属性。\n4. 在表达式字段中输入透明度值 0.5。\n5. 应用设置,确保 Transparency 属性被分配给所有粒子。"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task1",
"snapshot": "ovito",
"instruction": "在 OVITO 中,加载 sample.dump 文件后,使用工具栏的 Maximize viewport 按钮将当前视口最大化。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Load File...\" 选项\n3. 在弹出的文件选择对话框中,单击左侧导航栏的 \"桌面\" 选项\n4. 在右侧的文件列表中,单击选中 \"sample.dump\" 文件\n5. 单击对话框底部的 \"打开\" 按钮\n6. 单击左上角带有 \"Perspective\" 标签的视口内部任意位置,使其成为活动视口\n7. 单击视口工作区下方工具栏中,图标为向外指的四个箭头的 \"Maximize viewport\" 按钮",
"steps_original": "1. 在 OVITO 中,通过 File -> Load File... 加载桌面上的 \"sample.dump\" 文件\n2. 点击当前活动视口(例如左上角的 Perspective 视口)使其处于选中状态\n3. 点击视口工作区下方工具栏中的 \"Maximize viewport\" 按钮(图标为向外指的四个箭头)\n4. 确认该视口已扩展并填满整个主工作区"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task10",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过双击模型设置新的相机轨道中心,然后再双击空白处重置它。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 在主界面的顶部菜单栏中,单击 \"File\" 菜单\n2. 在弹出的下拉菜单中,单击 \"Load File...\" 菜单项\n3. 在弹出的文件选择对话框中,单击将光标定位到文件名输入框,并输入 \"sample.dump\"\n4. 单击文件选择对话框右下角的 \"Open\" 按钮加载模型文件\n5. 将鼠标光标移动到主界面的 3D 视口区域中,对准模型边缘的某一个原子球体对象\n6. 在对准的原子球体对象上,双击鼠标左键\n7. 观察 3D 视口,确认双击位置出现了一个由红绿蓝线段组成的 3D 十字标记\n8. 在 3D 视口区域内任意位置,按住鼠标左键不放\n9. 移动鼠标拖动画面,观察并确认 3D 模型正围绕着该 3D 十字标记进行旋转\n10. 松开鼠标左键,停止拖动\n11. 将鼠标光标移动到 3D 视口区域中没有模型对象的纯黑色空白背景处\n12. 在该纯黑色空白背景处,双击鼠标左键\n13. 观察 3D 视口,确认之前出现的 3D 十字标记已经消失\n14. 在 3D 视口区域内任意位置,再次按住鼠标左键不放\n15. 移动鼠标拖动画面,观察并确认此时场景的旋转中心已经恢复为整个模型的默认几何中心\n16. 松开鼠标左键,结束验证操作",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 将鼠标光标对准视口中模型边缘的某一个原子(或对象),然后双击鼠标左键\n3. 确认双击的位置出现了一个 3D 十字标记,代表相机当前的轨道中心\n4. 按住鼠标左键拖动,验证此时场景是围绕着该十字标记旋转的\n5. 将鼠标光标移至视口中没有对象的纯黑背景空白区域,双击鼠标左键\n6. 确认 3D 十字标记消失,相机的轨道中心重置回整个模型的几何中心"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "viewports_task11",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单打开 Viewport Graphics Configuration 对话框调整渲染设置。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 启动 OVITO 软件\n2. 在软件界面的三维视图区域,左键单击任意一个视口左上角的文本标签(例如 'Perspective'、'Top' 等)以打开视口菜单\n3. 在弹出的下拉菜单中,移动鼠标到列表底部\n4. 左键单击选中下拉菜单最底部的 'Configure Graphics...' 菜单项\n5. 确认屏幕上成功弹出标题为 'Viewport Graphics Configuration' 的对话框",
"steps_original": "1. 打开 OVITO 软件\n2. 点击任意一个视口左上角的文本标题打开视口菜单\n3. 点击菜单最底部的 \"Configure Graphics...\" 选项\n4. 确认屏幕上弹出了 \"Viewport Graphics Configuration\" 对话框,显示有关 OpenGL 实时渲染方法的配置选项"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task2",
"snapshot": "ovito",
"instruction": "在 OVITO 中,加载 sample.dump 文件后,使用 Zoom scene extents 按钮使模型自适应缩放并居中显示。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 在软件主界面的顶部菜单栏中,单击 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Load File...\" 选项\n3. 在弹出的文件选择对话框中,单击选中 \"sample.dump\" 文件\n4. 在文件选择对话框的底部,单击 \"Open\" 按钮加载文件\n5. 将鼠标光标定位到主界面的 \"Perspective\" 3D 视口区域内\n6. 在 \"Perspective\" 视口区域内向下滚动鼠标滚轮,将显示的模型缩小\n7. 在视口下方的工具栏Viewport toolbar找到带有放大镜和虚线方框图标的 \"Zoom scene extents\" 按钮\n8. 单击该 \"Zoom scene extents\" 按钮\n9. 观察 \"Perspective\" 视口,确认模型已自动缩放并居中适应当前视口大小",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 使用鼠标滚轮向下滚动,将模型缩小,或按住右键拖动将模型移到视口边缘\n3. 点击视口工作区下方工具栏中的 \"Zoom scene extents\" 按钮(带放大镜和方框的图标)\n4. 确认模型自动缩放并居中适应当前视口的大小"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task3",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单将 Perspective 视图切换为 Top顶视图方向。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 单击软件顶部菜单栏的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击选择 \"Load File\" 选项以打开文件浏览对话框\n3. 在文件浏览对话框中,选中 \"sample.dump\" 文件并单击 \"Open\" 或 \"打开\" 按钮完成 3D 模型数据加载\n4. 将鼠标光标定位到显示 3D 模型的视口区域,找到位于视口左上角的文本标签控件(当前显示文字为 \"Perspective\"\n5. 单击该 \"Perspective\" 文本标签,打开视口配置下拉菜单\n6. 在弹出的下拉菜单中,将鼠标光标移动并悬停在 \"View Type\" 菜单项上,以触发并展开右侧的二级子菜单\n7. 在展开的二级子菜单列表中,单击选择 \"Top\" 菜单项\n8. 观察视口左上角,确认文本标签控件的文字已由 \"Perspective\" 变为 \"Top\"\n9. 观察视口主区域,确认相机视角已成功切换为从正上方俯视 3D 模型",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件以显示 3D 模型\n2. 点击视口左上角的文本标题(默认显示为 \"Perspective\")以打开视口菜单\n3. 在下拉菜单中,将鼠标悬停在 \"View Type\" 选项上以展开子菜单\n4. 在子菜单中点击选择 \"Top\"\n5. 确认视口标题变为 \"Top\",且相机切换到从正上方俯视模型的视角"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task4",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单将当前视口的投影方式切换为 Ortho正交投影。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 点击主界面顶部菜单栏的 \"File\" 菜单\n2. 在展开的下拉菜单中,单击选中 \"Load File\" 选项\n3. 在弹出的文件浏览对话框中,定位并单击选中 \"sample.dump\" 文件\n4. 单击文件浏览对话框底部的 \"Open\"(或打开)按钮加载文件\n5. 在主界面的 3D 视口区域,将鼠标移动到视口左上角的文本标题标签处(当前显示为 \"Perspective\" 或其他视图名称)\n6. 单击该文本标题标签,弹出视口设置下拉菜单\n7. 在弹出的下拉菜单中,将鼠标光标悬停在 \"View Type\" 菜单项上,以展开其右侧的二级子菜单\n8. 在展开的 \"View Type\" 二级子菜单中,向下移动鼠标并单击选中 \"Ortho\" 选项",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 点击视口左上角的文本标题打开视口菜单\n3. 在下拉菜单中,将鼠标悬停在 \"View Type\" 上展开子菜单\n4. 在子菜单中点击选择 \"Ortho\"\n5. 确认视口中模型的透视近大远小变形消失,呈现正交投影效果"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task5",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单开启 Preview Mode预览模式显示最终渲染的可见区域。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 在软件主界面的顶部菜单栏中,单击 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Load File...\" 选项\n3. 在弹出的文件选择对话框中,在文件列表区域单击选中 \"sample.dump\" 文件\n4. 单击文件选择对话框底部的 \"Open\" 按钮以加载文件\n5. 在 3D 视口区域的左上角,找到当前的视口文本标题控件(例如显示为 \"Perspective\"\n6. 单击该文本标题控件,展开视口下拉菜单\n7. 在弹出的视口下拉菜单中,单击 \"Preview Mode\" 菜单项,将其切换为勾选状态\n8. 观察视口左上角的文本标题控件,确认文字已更新为包含 \"(preview)\" 字样(例如 \"Perspective (preview)\"\n9. 观察视口内部显示区域,确认出现指示最终输出图像比例的可视区域边框,且四周呈现半透明遮罩效果",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 点击视口左上角的文本标题打开视口菜单\n3. 在下拉菜单中,点击 \"Preview Mode\" 选项使其处于打勾选中状态\n4. 确认视口标题旁出现 \"(preview)\" 字样,并且视口内出现指示最终输出图像比例的可视区域边框(四周可能有半透明遮罩)"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task6",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单取消 Constrain Rotation约束旋转以允许相机自由翻转。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 在主界面顶部菜单栏中,单击 \"File\" 菜单。\n2. 在弹出的下拉菜单中,单击 \"Load File...\" 选项。\n3. 在弹出的文件选择对话框中,找到并单击选中 \"sample.dump\" 文件。\n4. 单击对话框右下角的 \"Open\"(或打开)按钮完成加载。\n5. 将鼠标光标移动到 3D 视口左上角,单击当前的视口标题文本标签(例如 \"Perspective\")。\n6. 在弹出的视口下拉菜单中,查看 \"Constrain Rotation\" 选项的状态。\n7. 如果 \"Constrain Rotation\" 选项左侧带有勾号 (✓),单击该选项以取消勾选。\n8. 将鼠标光标移动到视口中间的 3D 模型显示区域。\n9. 按住鼠标左键不放。\n10. 向任意方向拖动鼠标进行旋转,观察左下角的坐标轴,确认 Z 轴不再强制保持竖直,相机可以自由翻转。\n11. 确认效果后,松开鼠标左键。",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 点击视口左上角的文本标题打开视口菜单\n3. 检查 \"Constrain Rotation\" 选项,如果前面有勾号,则点击它以取消勾选\n4. 在视口中按住鼠标左键并随意拖动,确认 Z 轴坐标不再强制保持竖直向上,相机可以自由绕各个轴旋转"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task7",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单使用 Create Camera 为当前视口创建一个固定的相机对象。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单。\n2. 在弹出的下拉菜单中,单击 \"Load File...\" 选项。\n3. 在打开的文件选择对话框中,单击选中 \"sample.dump\" 文件。\n4. 单击对话框中的 \"打开\"(或 \"Open\")按钮加载该文件。\n5. 将光标定位到主界面的 3D 视口Viewport区域内。\n6. 按住鼠标左键并拖动鼠标,旋转模型至目标观察视角。\n7. 松开鼠标左键,完成旋转操作。\n8. 滚动鼠标滚轮,放大或缩小模型以调整合适的视野范围。\n9. 将光标移动到当前视口左上角的文本标签控件(例如显示为 \"Perspective\" 的文字处)。\n10. 单击该文本标签控件打开视口上下文菜单Viewport menu。\n11. 在弹出的主菜单列表中,将光标移动并悬停在 \"View Type\" 菜单项上,以展开其侧边子菜单。\n12. 在展开的侧边子菜单中,单击最底部的 \"Create Camera\" 选项。\n13. 查看界面右侧的数据管道Data Pipeline或控制面板确认对象列表中已成功新增一个 \"Camera\" 节点。",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 使用鼠标左键拖动和滚轮缩放,将模型调整到一个特定的观察视角\n3. 点击当前视口左上角的文本标题打开视口菜单\n4. 在下拉菜单中点击 \"Create Camera\" 选项\n5. 确认在右侧的控制面板或数据管道中生成了一个新的 Camera 对象"
}
}

View File

@@ -0,0 +1,47 @@
{
"id": "viewports_task8",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口菜单打开 Adjust View 对话框,用于精确配置相机参数。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"evaluator": {
"postconfig": [
{
"type": "sleep",
"parameters": {
"seconds": 3
}
}
],
"func": "vllm_eval"
},
"proxy": false,
"fixed_ip": false,
"possibility_of_env_change": "low",
"metadata": {
"input_files": [
"sample.dump"
],
"steps": "1. 单击主界面顶部菜单栏的 \"File\" 菜单项\n2. 在弹出的 File 下拉菜单中,单击 \"Load File...\" 选项\n3. 在弹出的文件浏览对话框的文件列表中,单击选中 \"sample.dump\" 文件\n4. 单击文件浏览对话框右下角的 \"Open\" 按钮加载模型文件\n5. 在主界面的 3D 视口Viewport区域将光标移动到视口左上角的文本标题控件例如显示为 \"Perspective\" 的文字标签)\n6. 单击该文本标题控件,展开视口上下文下拉菜单\n7. 在弹出的下拉菜单中,向下移动鼠标并单击选中 \"Adjust View...\" 菜单项\n8. 确认屏幕上成功弹出了标题为 \"Adjust View\" 的对话框,并且对话框中显示了用于精确配置相机位置和方向的数值输入框",
"steps_original": "1. 在 OVITO 中,加载 \"sample.dump\" 文件\n2. 点击视口左上角的文本标题打开视口菜单\n3. 在下拉菜单中点击 \"Adjust View...\" 选项\n4. 确认屏幕上弹出了名为 \"Adjust View\" 的对话框,其中包含相机位置和方向的精确数值输入框"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "viewports_task9",
"snapshot": "ovito",
"instruction": "在 OVITO 中,通过视口的 Window Layout 菜单更改多视口的窗口布局排列方式。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\OVITO Basic\\ovito.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"ovito"
],
"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. 在操作系统中,双击 OVITO 软件快捷方式启动程序,并等待主界面加载完成(默认显示 2x2 的四个视口网格)\n2. 在主工作区中,将鼠标指针移动到任意一个视口的左上角区域\n3. 定位到该视口左上角的文本标签控件(例如显示为 \"Perspective\"、\"Top\" 或 \"Front\" 的文字)\n4. 左键单击该文本标签控件,以向下弹出视口上下文菜单\n5. 在弹出的下拉菜单列表中,向下移动鼠标指针,定位到名为 \"Window Layout\" 的菜单项\n6. 将鼠标指针悬停在 \"Window Layout\" 菜单项上,等待其右侧弹出包含不同布局方式的子菜单\n7. 在展开的布局子菜单中,将鼠标指针移动到一个非默认的布局选项上(例如表示单视口或上下左右双分视口的图标/文本)\n8. 左键单击选中的布局选项,以应用该布局设置\n9. 观察软件主工作区,确认视口网格的数量和排列方式已从默认的 2x2 变为刚才选定的布局方式",
"steps_original": "1. 打开 OVITO 软件,默认主工作区显示 2x2 的四个视口网格\n2. 点击任意一个视口左上角的文本标题打开视口菜单\n3. 将鼠标悬停在 \"Window Layout\" 选项上以展开布局子菜单\n4. 从子菜单中选择一个非默认的布局方式(例如选择上下对分的双视口图标或单视口图标)\n5. 确认主工作区的视口数量和排列布局已根据选择发生改变"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_1_task1",
"snapshot": "pymol",
"instruction": "在 PyMOL 中,通过命令行制作一个简单动画,播放 NMR ensemble。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 单击界面上的 PyMOL 命令行输入框,将光标定位到该输入框。\n2. 在命令行输入框中输入文本 fetch 1nmr。\n3. 按下键盘上的回车键 (Enter) 执行命令,加载 NMR ensemble。\n4. 再次单击界面上的 PyMOL 命令行输入框。\n5. 在命令行输入框中输入文本 mplay。\n6. 按下键盘上的回车键 (Enter) 执行命令,开始播放动画。\n7. 再次单击界面上的 PyMOL 命令行输入框。\n8. 在命令行输入框中输入文本 mstop。\n9. 按下键盘上的回车键 (Enter) 执行命令,停止播放动画。",
"steps_original": "1. 在 PyMOL 命令行中输入 `fetch 1nmr` 来加载 NMR ensemble。\n2. 输入 `mplay` 命令开始播放动画。\n3. 如果需要停止播放动画,输入 `mstop` 。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_1_task2",
"snapshot": "pymol",
"instruction": "在 PyMOL 中制作一个场景绕 Y 轴 360 度旋转的动画。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 在顶部菜单栏中单击“Movie”菜单以展开下拉列表。\n2. 在展开的下拉菜单中将鼠标悬停在“Program”选项上以展开子菜单。\n3. 在展开的子菜单中将鼠标悬停在“Camera Loop”选项上以展开下一级菜单。\n4. 在下一级菜单中将鼠标悬停在“Y-Roll”选项上对应教程中的 Y-axis roll以展开动画时长选项菜单。\n5. 在展开的时长列表中单击所需的动画时长选项例如“8 seconds”以生成绕 Y 轴 360 度旋转的场景动画。\n6. 在 PyMOL 主界面底部或右下角的动画控制面板中单击“Play”按钮对应教程中的 Press play以开始播放动画。",
"steps_original": "1. 从菜单中选择适当选项,用于创建场景绕 Y 轴旋转的动画。\n2. 按下“Pressplay”开始播放动画。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_1_task3",
"snapshot": "pymol",
"instruction": "在 PyMOL 中制作场景摇摆动画,可选择 30, 60, 90, 120 或 180 度摇摆角度。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 单击顶部菜单栏的 \"Movie\" 菜单项。\n2. 在展开的下拉菜单中,将鼠标悬停并单击 \"Program\" 选项以展开子菜单。\n3. 在弹出的级联菜单中,将鼠标悬停并单击 \"Camera Loop\" 选项以展开下一级菜单。\n4. 在弹出的级联菜单中,将鼠标悬停并单击 \"X-Rock\" 或 \"Y-Rock\"(摇摆轴向)子菜单。\n5. 在弹出的角度选项列表中,单击选中所需的摇摆角度(例如包含 \"30 deg.\", \"60 deg.\", \"90 deg.\", \"120 deg.\" 或 \"180 deg.\" 的选项)。\n6. 单击主界面右下方控制面板中的 \"Play\"(播放)按钮启动动画。",
"steps_original": "1. 从菜单中选择用于设置场景摇摆动画的选项。\n2. 选择摇摆角度(例如 30、60、90、120 或 180 度)。\n3. 按下“Pressplay”启动动画。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_1_task4",
"snapshot": "pymol",
"instruction": "在 PyMOL 中制作一个简单的场景“摇摆Nutate”动画。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 单击顶部菜单栏中的 \"Movie\" 菜单项。\n2. 在弹出的下拉菜单中,将鼠标光标悬停在 \"Program\" 菜单项上以展开子菜单。\n3. 在展开的子菜单中,将鼠标光标悬停在 \"Camera Loop\" 菜单项上以展开下一级菜单。\n4. 在下一级菜单中,将鼠标光标悬停在 \"Nutate\" 菜单项上以展开参数预设列表。\n5. 在展开的参数预设列表中,单击选中需要的摇摆角度和时长选项(例如默认的预设时长选项)以应用摇摆效果。\n6. 在软件界面底部或右下角的动画控制面板中,单击带有向右三角形图标的 \"Play\" 按钮启动动画。",
"steps_original": "1. 从菜单中选择制作摇摆动画的选项。\n2. 设置摇摆效果参数。\n3. 按下“Pressplay”启动摇摆动画。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_1_task5",
"snapshot": "pymol",
"instruction": "在 PyMOL 中使用 Scene Loop 制作一个从原子缩放并返回的动画。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 单击 PyMOL 界面上方的命令行输入框,将光标定位到该输入框。\n2. 通过键盘在输入框中输入命令load $TUT/1hpv.pdb。\n3. 按下键盘上的 Enter 键执行加载模型操作。\n4. 单击界面顶部菜单栏中的 \"Scene\" 菜单项。\n5. 在弹出的下拉菜单中,将鼠标光标悬停在 \"Store\" 选项上以展开侧边子菜单。\n6. 在展开的侧边子菜单中,单击 \"F1\" 选项,将初始全局视图保存为场景一。\n7. 将鼠标移动到 3D 渲染视图区域,左键单击分子模型上的某一个具体原子,使其高亮选中。\n8. 在界面右侧的对象列表控制面板中,找到自动生成的 \"(sele)\" 对象所在行,单击该行右侧的 \"A\"Action按钮。\n9. 在弹出的下拉动作菜单中,单击 \"zoom\" 选项,使摄像机视角缩放并聚焦到刚选中的原子上。\n10. 再次单击界面顶部菜单栏中的 \"Scene\" 菜单项。\n11. 在弹出的下拉菜单中,将鼠标光标悬停在 \"Store\" 选项上以展开侧边子菜单。\n12. 在展开的侧边子菜单中,单击 \"F2\" 选项,将当前的局部缩放视图保存为场景二。\n13. 在界面右侧的对象列表控制面板中,找到 \"1hpv\" 对象所在行,单击该行右侧的 \"A\"Action按钮。\n14. 在弹出的下拉动作菜单中,单击 \"zoom\" 选项,使摄像机视角缩小并退回到展示整个分子的全局视图。\n15. 第三次单击界面顶部菜单栏中的 \"Scene\" 菜单项。\n16. 在弹出的下拉菜单中,将鼠标光标悬停在 \"Store\" 选项上以展开侧边子菜单。\n17. 在展开的侧边子菜单中,单击 \"F3\" 选项,将恢复后的全局视图保存为场景三。\n18. 单击界面顶部菜单栏中的 \"Movie\" 菜单项。\n19. 在弹出的下拉菜单中,将鼠标光标悬停在 \"Program\" 选项上以展开侧边子菜单。\n20. 在展开的侧边子菜单中,将鼠标光标悬停在 \"Scene Loop\" 选项上展开下一级选项列表。\n21. 在下一级选项列表中,单击 \"Steady\" 选项,命令程序自动为已保存的场景序列生成平滑补间动画帧。\n22. 单击主界面底部播放控制区域右下角的 \"Play\"(向右三角形图标)按钮,播放生成的动画以观察镜头的缩放与返回效果。",
"steps_original": "1. 创建一个场景并设置为缩放到特定原子。\n2. 保存该场景。\n3. 使用 PyMOL 中的 Scene Loop 功能连接多个保存的场景。\n4. 播放动画以观察缩放效果。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_3_task1",
"snapshot": "pymol",
"instruction": "在 PyMOL 中,通过 Movie 菜单添加 2 秒到当前视频的尾部。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 在主界面的顶部菜单栏中,单击 \"Movie\" 菜单项。\n2. 在展开的下拉菜单中,将鼠标悬停在 \"Append\" 选项上以展开其子菜单。\n3. 在弹出的 \"Append\" 子菜单中,单击 \"2 seconds\" 选项。",
"steps_original": "1. 点击菜单栏中的 Movie。\n2. 从下拉菜单中选择 Append。\n3. 在 Append 子菜单中选择 2 seconds。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_3_task10",
"snapshot": "pymol",
"instruction": "在 PyMOL 中,通过 ALA Motions 菜单查看 ALA fragment 的运动选项。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 在 PyMOL 界面右上方的对象控制面板中,定位到名为 \"ala\" 的对象所在行。\n2. 在 \"ala\" 对象所在行,单击最右侧的字母 \"M\" 按钮(代表 Motions。\n3. 观察并浏览弹出的 \"Object 'ala' Motion:\" 下拉菜单,查看其中的 \"store\"、\"clear\"、\"smooth\" 等运动和位置选项。",
"steps_original": "1. 在 PyMOL 的底部工具栏上点击 All。\n2. 从下拉菜单中选择 ALA。\n3. 在 ALA 菜单中选择 Motions。\n4. 浏览显示的运动/位置选项。"
}
}

View File

@@ -0,0 +1,45 @@
{
"id": "MovieSchool_3_task2",
"snapshot": "pymol",
"instruction": "在 PyMOL 中,通过 Movie 菜单设置视频帧率为 15 FPS。",
"source": "custom",
"config": [
{
"type": "launch",
"parameters": {
"command": [
"C:\\PYMOL\\PyMOLWin.exe"
]
}
},
{
"type": "sleep",
"parameters": {
"seconds": 5
}
}
],
"trajectory": "trajectories/",
"related_apps": [
"pymol"
],
"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. 点击界面顶部菜单栏中的 \"Movie\" 菜单。\n2. 在展开的下拉菜单中,将鼠标悬停在 \"Frame Rate\" 菜单项上以展开子菜单。\n3. 在 \"Frame Rate\" 的子菜单中,点击选择 \"15 FPS\"。",
"steps_original": "1. 点击菜单栏中的 Movie。\n2. 从下拉菜单中选择 Frame Rate。\n3. 在 Frame Rate 子菜单中选择 15 FPS。"
}
}

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