Compare commits
19 Commits
os_world
...
lzy/flsol-
| Author | SHA1 | Date | |
|---|---|---|---|
| acd38ca54a | |||
| 355bf655cc | |||
| f32e5f9e64 | |||
| 093b779045 | |||
| 90c427c6dd | |||
| dc5fd173f1 | |||
| 19795a674b | |||
| 349f2142fb | |||
| a943c1e961 | |||
| d71f1f976d | |||
| 4bde685bbd | |||
| e70f1335f0 | |||
| 9431bd5bfc | |||
| b1052c79cf | |||
| ac3f38ed58 | |||
| e4b039fc02 | |||
| b75f6bf341 | |||
| 07e66490dd | |||
| 9899d4a0c7 |
14
.gitignore
vendored
14
.gitignore
vendored
@@ -208,7 +208,21 @@ quick_start.py
|
||||
result_multi_apps_pengxiang_transformers12evaluation_examples/settings/proxy/dataimpulse.json
|
||||
evaluation_examples/settings/proxy/dataimpulse.json
|
||||
|
||||
# Benchmark input data (large binary files - share via cloud storage or Git LFS)
|
||||
evaluation_examples/inputs/
|
||||
|
||||
# Temporary data processing workspace (scraped docs, intermediate scripts)
|
||||
evaluation_examples/sandbox/
|
||||
|
||||
# Image cache
|
||||
evaluation_examples/inputs/.img_cache/
|
||||
|
||||
# Local test configurations (not for public repo)
|
||||
evaluation_examples/spiderman.json
|
||||
evaluation_examples/test_50_random_proportional.json
|
||||
evaluation_examples/test_chrome.json
|
||||
evaluation_examples/prepare_input_files.py
|
||||
|
||||
# Demo task3 录制产物
|
||||
run_demo_task3.py
|
||||
demo_task3_output/
|
||||
|
||||
@@ -73,7 +73,7 @@ class SetupController:
|
||||
retry = 0
|
||||
while retry < MAX_RETRIES:
|
||||
try:
|
||||
_ = requests.get(self.http_server + "/terminal")
|
||||
_ = requests.get(self.http_server + "/screenshot", timeout=10)
|
||||
break
|
||||
except:
|
||||
time.sleep(5)
|
||||
@@ -518,7 +518,7 @@ class SetupController:
|
||||
retry = 0
|
||||
while retry < MAX_RETRIES:
|
||||
try:
|
||||
_ = requests.get(self.http_server + "/terminal")
|
||||
_ = requests.get(self.http_server + "/screenshot", timeout=10)
|
||||
break
|
||||
except:
|
||||
time.sleep(5)
|
||||
|
||||
@@ -20,42 +20,42 @@ Metric = Callable[[Any, Any], float]
|
||||
Getter = Callable[[gym.Env, Dict[str, Any]], Any]
|
||||
|
||||
MAX_RETRIES = 5 # Maximum retries for environment setup
|
||||
|
||||
|
||||
|
||||
|
||||
def _fix_pyautogui_less_than_bug(command: str) -> str:
|
||||
"""
|
||||
Fix PyAutoGUI '<' character bug by converting it to hotkey("shift", ',') calls.
|
||||
|
||||
|
||||
This fixes the known PyAutoGUI issue where typing '<' produces '>' instead.
|
||||
References:
|
||||
- https://github.com/asweigart/pyautogui/issues/198
|
||||
- https://github.com/xlang-ai/OSWorld/issues/257
|
||||
|
||||
|
||||
Args:
|
||||
command (str): The original pyautogui command
|
||||
|
||||
|
||||
Returns:
|
||||
str: The fixed command with '<' characters handled properly
|
||||
"""
|
||||
# Pattern to match press('<') or press('\u003c') calls
|
||||
# Pattern to match press('<') or press('\u003c') calls
|
||||
press_pattern = r'pyautogui\.press\(["\'](?:<|\\u003c)["\']\)'
|
||||
|
||||
# Handle press('<') calls
|
||||
def replace_press_less_than(match):
|
||||
return 'pyautogui.hotkey("shift", ",")'
|
||||
|
||||
|
||||
# First handle press('<') calls
|
||||
command = re.sub(press_pattern, replace_press_less_than, command)
|
||||
|
||||
# Pattern to match typewrite calls with quoted strings
|
||||
typewrite_pattern = r'pyautogui\.typewrite\((["\'])(.*?)\1\)'
|
||||
|
||||
|
||||
# Then handle typewrite calls
|
||||
def process_typewrite_match(match):
|
||||
quote_char = match.group(1)
|
||||
content = match.group(2)
|
||||
|
||||
|
||||
# Preprocess: Try to decode Unicode escapes like \u003c to actual '<'
|
||||
# This handles cases where '<' is represented as escaped Unicode
|
||||
try:
|
||||
@@ -65,15 +65,15 @@ def _fix_pyautogui_less_than_bug(command: str) -> str:
|
||||
except UnicodeDecodeError:
|
||||
# If decoding fails, proceed with original content to avoid breaking existing logic
|
||||
pass # English comment: Graceful degradation - fall back to original content if decoding fails
|
||||
|
||||
|
||||
# Check if content contains '<'
|
||||
if '<' not in content:
|
||||
return match.group(0)
|
||||
|
||||
|
||||
# Split by '<' and rebuild
|
||||
parts = content.split('<')
|
||||
result_parts = []
|
||||
|
||||
|
||||
for i, part in enumerate(parts):
|
||||
if i == 0:
|
||||
# First part
|
||||
@@ -84,11 +84,11 @@ def _fix_pyautogui_less_than_bug(command: str) -> str:
|
||||
result_parts.append('pyautogui.hotkey("shift", ",")')
|
||||
if part:
|
||||
result_parts.append(f"pyautogui.typewrite({quote_char}{part}{quote_char})")
|
||||
|
||||
|
||||
return '; '.join(result_parts)
|
||||
|
||||
|
||||
command = re.sub(typewrite_pattern, process_typewrite_match, command)
|
||||
|
||||
|
||||
return command
|
||||
|
||||
|
||||
@@ -145,12 +145,12 @@ class DesktopEnv(gym.Env):
|
||||
self.screen_width = screen_size[0]
|
||||
self.screen_height = screen_size[1]
|
||||
|
||||
# Default
|
||||
# Default
|
||||
self.server_port = 5000
|
||||
self.chromium_port = 9222
|
||||
self.vnc_port = 8006
|
||||
self.vlc_port = 8080
|
||||
|
||||
|
||||
# Initialize with default (no proxy) provider
|
||||
self.current_use_proxy = False
|
||||
self.manager, self.provider = create_vm_manager_and_provider(provider_name, region, use_proxy=False)
|
||||
@@ -162,8 +162,11 @@ class DesktopEnv(gym.Env):
|
||||
# vmware, virtualbox are always used as the emulator starts from a dirty state
|
||||
if self.provider_name in {"docker", "aws", "gcp", "azure", "aliyun", "volcengine"}:
|
||||
self.is_environment_used = False
|
||||
elif self.provider_name in {"vmware", "virtualbox"}:
|
||||
elif self.provider_name in {"vmware", "virtualbox", "proxmox"}:
|
||||
self.is_environment_used = True
|
||||
elif self.provider_name == "direct":
|
||||
# Physical machine: never revert snapshot, never stop emulator
|
||||
self.is_environment_used = False
|
||||
else:
|
||||
raise ValueError(f"Invalid provider name: {self.provider_name}")
|
||||
|
||||
@@ -173,7 +176,7 @@ class DesktopEnv(gym.Env):
|
||||
if provider_name in {"vmware", "virtualbox"} else path_to_vm
|
||||
else:
|
||||
self.path_to_vm = self.manager.get_vm_path(os_type=self.os_type, region=region, screen_size=(self.screen_width, self.screen_height))
|
||||
|
||||
|
||||
self.snapshot_name = snapshot_name
|
||||
self.cache_dir_base: str = cache_dir
|
||||
# todo: add the logic to get the screen size from the VM
|
||||
@@ -229,8 +232,8 @@ class DesktopEnv(gym.Env):
|
||||
# due to the fact it could be changed when implemented by cloud services
|
||||
path_to_vm = self.provider.revert_to_snapshot(self.path_to_vm, self.snapshot_name)
|
||||
if path_to_vm and not path_to_vm == self.path_to_vm:
|
||||
# path_to_vm has to be a new path
|
||||
|
||||
# path_to_vm has to be a new path
|
||||
|
||||
self.manager.delete_vm(self.path_to_vm, self.region)
|
||||
self.manager.add_vm(path_to_vm, self.region)
|
||||
self.manager.occupy_vm(path_to_vm, os.getpid(), self.region)
|
||||
@@ -245,7 +248,7 @@ class DesktopEnv(gym.Env):
|
||||
self.provider.stop_emulator(self.path_to_vm)
|
||||
|
||||
def reset(self, task_config: Optional[Dict[str, Any]] = None, seed=None, options=None) -> Dict[str, Any]:
|
||||
|
||||
|
||||
# Reset to certain task in OSWorld
|
||||
logger.info("Resetting environment...")
|
||||
logger.info("Switching task...")
|
||||
@@ -258,17 +261,17 @@ class DesktopEnv(gym.Env):
|
||||
# Only revert to snapshot if environment has been used (step/setup)
|
||||
# This optimization is especially important for cloud providers like AWS
|
||||
# where unnecessary snapshot operations are costly and time-consuming
|
||||
|
||||
|
||||
if task_config is not None:
|
||||
# Only consider task proxy requirement if proxy is enabled at system level
|
||||
task_use_proxy = task_config.get("proxy", False) and self.enable_proxy
|
||||
if not self.enable_proxy and task_config.get("proxy", False):
|
||||
logger.info("Task requires proxy but proxy is disabled at system level, ignoring proxy requirement.")
|
||||
|
||||
|
||||
if task_use_proxy != self.current_use_proxy:
|
||||
# keep because get_info_from_website depend on this
|
||||
self.current_use_proxy = task_use_proxy
|
||||
|
||||
|
||||
if self.is_environment_used:
|
||||
logger.info("Environment has been used, reverting to snapshot: {}...".format(self.snapshot_name))
|
||||
self._revert_to_snapshot()
|
||||
@@ -302,7 +305,7 @@ class DesktopEnv(gym.Env):
|
||||
time.sleep(5)
|
||||
else:
|
||||
break
|
||||
|
||||
|
||||
logger.info("Environment setup complete.")
|
||||
|
||||
observation = self._get_obs()
|
||||
@@ -333,7 +336,8 @@ class DesktopEnv(gym.Env):
|
||||
os.makedirs(self.cache_dir, exist_ok=True)
|
||||
self.instruction = task_config["instruction"]
|
||||
self.config = task_config["config"] if "config" in task_config else []
|
||||
|
||||
self.metadata = task_config.get("metadata", {})
|
||||
|
||||
self._set_evaluator_info(task_config)
|
||||
|
||||
def _set_evaluator_info(self, task_config: Dict[str, Any]):
|
||||
@@ -362,10 +366,17 @@ class DesktopEnv(gym.Env):
|
||||
else None
|
||||
|
||||
if "expected" in self.evaluator and len(self.evaluator["expected"]) > 0:
|
||||
self.expected_getter: Getter = [getattr(getters, "get_{:}".format(exp["type"])) if exp else None for exp in
|
||||
self.evaluator["expected"]] \
|
||||
if isinstance(self.evaluator["expected"], list) \
|
||||
else getattr(getters, "get_{:}".format(self.evaluator["expected"]["type"]))
|
||||
expected_val = self.evaluator["expected"]
|
||||
if isinstance(expected_val, list):
|
||||
self.expected_getter: Getter = [
|
||||
getattr(getters, "get_{:}".format(exp["type"])) if (exp and "type" in exp) else None
|
||||
for exp in expected_val
|
||||
]
|
||||
elif isinstance(expected_val, dict) and "type" in expected_val:
|
||||
self.expected_getter: Getter = getattr(getters, "get_{:}".format(expected_val["type"]))
|
||||
else:
|
||||
# No 'type' key (e.g. vllm_eval uses plain description dict) — no getter needed
|
||||
self.expected_getter = None
|
||||
else:
|
||||
self.expected_getter = [None] * len(self.metric) \
|
||||
if isinstance(self.metric, list) \
|
||||
@@ -386,7 +397,7 @@ class DesktopEnv(gym.Env):
|
||||
def step(self, action, pause=2):
|
||||
self._step_no += 1
|
||||
self.action_history.append(action)
|
||||
|
||||
|
||||
# Mark environment as used when step is called
|
||||
self.is_environment_used = True
|
||||
|
||||
@@ -461,12 +472,16 @@ class DesktopEnv(gym.Env):
|
||||
self.metric_options["instruction"] = self.instruction
|
||||
self.metric_options["eval_model"] = self.eval_model
|
||||
|
||||
# Pass pre-configured environment info and expected steps
|
||||
self.metric_options["config"] = self.config
|
||||
self.metric_options["metadata"] = self.metadata
|
||||
|
||||
if result_dir:
|
||||
self.metric_options["result_dir"] = result_dir
|
||||
logger.info(f"Using result_dir for vllm_eval: {result_dir}")
|
||||
|
||||
logger.info(f"Evaluation options prepared: {self.metric_options.keys()}")
|
||||
|
||||
|
||||
if type(self.metric) == list:
|
||||
# Multiple metrics to evaluate whether the task is successfully completed
|
||||
results = []
|
||||
|
||||
@@ -73,7 +73,13 @@ class UnifiedLLM:
|
||||
elif model.startswith("claude"):
|
||||
self.provider = "anthropic"
|
||||
elif model.startswith("gemini"):
|
||||
self.provider = "gemini"
|
||||
# If OPENAI_API_KEY is set but GOOGLE_API_KEY is not,
|
||||
# use OpenAI-compatible proxy for Gemini models
|
||||
if os.getenv("OPENAI_API_KEY") and not os.getenv("GOOGLE_API_KEY"):
|
||||
self.provider = "openai"
|
||||
logger.info(f"Using OpenAI-compatible proxy for Gemini model: {model}")
|
||||
else:
|
||||
self.provider = "gemini"
|
||||
else:
|
||||
self.provider = "unknown"
|
||||
|
||||
@@ -287,20 +293,58 @@ class UnifiedLLM:
|
||||
raise ValueError(f"Unsupported provider: {self.provider}")
|
||||
|
||||
|
||||
def _load_screenshots_from_dir(result_dir: str, compress: bool = True, max_size: int = 800, quality: int = 85) -> List[str]:
|
||||
def _sample_key_frames(items: list, max_count: int) -> list:
|
||||
"""
|
||||
Load all step screenshots from result directory and convert to base64
|
||||
Uniformly sample key frames while always keeping the first and last items.
|
||||
|
||||
Args:
|
||||
items: List of items to sample from
|
||||
max_count: Maximum number of items to keep (must be >= 2)
|
||||
|
||||
Returns:
|
||||
List of sampled indices (sorted)
|
||||
"""
|
||||
n = len(items)
|
||||
if n <= max_count:
|
||||
return list(range(n))
|
||||
|
||||
# Always keep first and last
|
||||
if max_count < 2:
|
||||
max_count = 2
|
||||
|
||||
indices = [0] # first frame
|
||||
# Uniformly sample (max_count - 2) frames from the middle
|
||||
middle_count = max_count - 2
|
||||
if middle_count > 0:
|
||||
step = (n - 2) / (middle_count + 1)
|
||||
for i in range(1, middle_count + 1):
|
||||
idx = int(round(i * step))
|
||||
indices.append(idx)
|
||||
indices.append(n - 1) # last frame
|
||||
|
||||
# Deduplicate and sort
|
||||
indices = sorted(set(indices))
|
||||
return indices
|
||||
|
||||
|
||||
def _load_screenshots_from_dir(result_dir: str, compress: bool = False, max_size: int = 800, quality: int = 85, max_images: int = 0) -> tuple:
|
||||
"""
|
||||
Load step screenshots from result directory and convert to base64.
|
||||
When max_images > 0 and there are more screenshots than max_images,
|
||||
uniformly sample key frames (always keeping first and last).
|
||||
|
||||
Args:
|
||||
result_dir: Path to result directory containing step_*.png files
|
||||
compress: Whether to compress images (default: True)
|
||||
max_size: Maximum dimension for compression (default: 800)
|
||||
quality: JPEG quality for compression (default: 85)
|
||||
max_images: Maximum number of screenshots to load (0 = no limit)
|
||||
|
||||
Returns:
|
||||
List of base64 encoded screenshot strings
|
||||
Tuple of (list of base64 encoded screenshot strings, list of short filenames like 'step_1', 'step_2', ...)
|
||||
"""
|
||||
screenshots = []
|
||||
filenames = []
|
||||
|
||||
# Find all step screenshot files (e.g., step_1_20240101@120000.png)
|
||||
pattern = os.path.join(result_dir, "step_*.png")
|
||||
@@ -308,8 +352,19 @@ def _load_screenshots_from_dir(result_dir: str, compress: bool = True, max_size:
|
||||
|
||||
if not screenshot_files:
|
||||
logger.warning(f"No screenshot files found in {result_dir}")
|
||||
return screenshots
|
||||
return screenshots, filenames
|
||||
|
||||
# Key frame sampling: if max_images > 0 and we have more files than allowed,
|
||||
# keep first + last + uniformly sampled middle frames
|
||||
total_files = len(screenshot_files)
|
||||
if max_images > 0 and total_files > max_images:
|
||||
sampled_indices = _sample_key_frames(screenshot_files, max_images)
|
||||
screenshot_files_sampled = [screenshot_files[i] for i in sampled_indices]
|
||||
logger.info(f"Key frame sampling: {total_files} screenshots -> {len(screenshot_files_sampled)} "
|
||||
f"(max_images={max_images}, kept indices: {sampled_indices})")
|
||||
screenshot_files = screenshot_files_sampled
|
||||
|
||||
import re as _re
|
||||
for filepath in screenshot_files:
|
||||
try:
|
||||
with open(filepath, "rb") as f:
|
||||
@@ -321,11 +376,16 @@ def _load_screenshots_from_dir(result_dir: str, compress: bool = True, max_size:
|
||||
img_b64 = _compress_image(img_b64, max_size=max_size, quality=quality)
|
||||
|
||||
screenshots.append(img_b64)
|
||||
# Extract short name like 'step_1' from 'step_1_20240101@120000.png'
|
||||
basename = os.path.basename(filepath)
|
||||
match = _re.match(r'(step_\d+)', basename)
|
||||
short_name = match.group(1) if match else basename
|
||||
filenames.append(short_name)
|
||||
except Exception as e:
|
||||
logger.error(f"Error loading screenshot {filepath}: {e}")
|
||||
|
||||
logger.info(f"Loaded {len(screenshots)} screenshots from {result_dir}")
|
||||
return screenshots
|
||||
logger.info(f"Loaded {len(screenshots)} screenshots from {result_dir}: {filenames}")
|
||||
return screenshots, filenames
|
||||
|
||||
|
||||
def vllm_eval(result_state, **options) -> float:
|
||||
@@ -342,6 +402,8 @@ def vllm_eval(result_state, **options) -> float:
|
||||
- compress_images: Whether to compress images (default: True)
|
||||
- max_image_size: Maximum image dimension for compression (default: 800)
|
||||
- image_quality: JPEG quality for compression (default: 85)
|
||||
- max_eval_images: Max screenshots for evaluation (0 = no limit, default: 10).
|
||||
When exceeded, keeps first + last + uniformly sampled middle frames.
|
||||
- temperature: Temperature parameter
|
||||
- max_tokens: Maximum tokens
|
||||
- top_p: Top-p parameter
|
||||
@@ -354,20 +416,25 @@ def vllm_eval(result_state, **options) -> float:
|
||||
screenshots = options.get("screenshots", [])
|
||||
|
||||
# Image compression options
|
||||
compress_images = options.get("compress_images", True)
|
||||
compress_images = options.get("compress_images", False)
|
||||
max_image_size = options.get("max_image_size", 800)
|
||||
image_quality = options.get("image_quality", 85)
|
||||
max_eval_images = options.get("max_eval_images", 10)
|
||||
|
||||
screenshot_filenames = [] # Short names like 'step_1', 'step_2', ...
|
||||
|
||||
if result_dir and not screenshots:
|
||||
screenshots = _load_screenshots_from_dir(
|
||||
screenshots, screenshot_filenames = _load_screenshots_from_dir(
|
||||
result_dir,
|
||||
compress=compress_images,
|
||||
max_size=max_image_size,
|
||||
quality=image_quality
|
||||
quality=image_quality,
|
||||
max_images=max_eval_images
|
||||
)
|
||||
logger.info(f"Loaded {len(screenshots)} screenshots from result_dir: {result_dir}")
|
||||
elif screenshots:
|
||||
logger.info(f"Using {len(screenshots)} screenshots from options")
|
||||
screenshot_filenames = [f"step_{i+1}" for i in range(len(screenshots))]
|
||||
# Compress screenshots if needed
|
||||
if compress_images:
|
||||
logger.info("Compressing provided screenshots...")
|
||||
@@ -375,6 +442,8 @@ def vllm_eval(result_state, **options) -> float:
|
||||
|
||||
instruction = options.get("instruction", "")
|
||||
eval_model = options.get("eval_model", "gpt-4-vision-preview")
|
||||
config = options.get("config", [])
|
||||
metadata = options.get("metadata", {})
|
||||
|
||||
params = {
|
||||
"temperature": options.get("temperature", 0.7),
|
||||
@@ -384,32 +453,91 @@ def vllm_eval(result_state, **options) -> float:
|
||||
|
||||
llm = UnifiedLLM(eval_model)
|
||||
|
||||
prompt = f"""You are an expert evaluator for desktop environment tasks.
|
||||
# Build pre-configured environment description from config
|
||||
preconfig_items = []
|
||||
for cfg in config:
|
||||
if cfg.get("type") == "launch":
|
||||
cmds = cfg.get("parameters", {}).get("command", [])
|
||||
if cmds:
|
||||
app_name = os.path.basename(cmds[0]) if cmds else "unknown"
|
||||
preconfig_items.append(f"Application '{app_name}' was automatically launched before the agent started.")
|
||||
elif cfg.get("type") == "sleep":
|
||||
pass # not relevant to scoring
|
||||
elif cfg.get("type") == "open":
|
||||
path = cfg.get("parameters", {}).get("path", "")
|
||||
preconfig_items.append(f"File/URL '{path}' was automatically opened before the agent started.")
|
||||
|
||||
preconfig_section = ""
|
||||
if preconfig_items:
|
||||
preconfig_desc = "\n".join(f" - {item}" for item in preconfig_items)
|
||||
preconfig_section = f"""
|
||||
PRE-CONFIGURED ENVIRONMENT (done BEFORE the agent started, NOT the agent's work):
|
||||
{preconfig_desc}
|
||||
IMPORTANT: The above actions were performed automatically as part of environment setup. The agent did NOT perform these actions. Do NOT give ANY credit for them. For example, if the application was pre-launched, the agent merely having the application open is worth 0 points - that was the starting state."""
|
||||
|
||||
# Build expected steps section from metadata
|
||||
expected_steps_section = ""
|
||||
if metadata.get("steps"):
|
||||
expected_steps_section = f"""
|
||||
EXPECTED STEPS for this task (use as reference for what the agent should have done):
|
||||
{metadata['steps']}
|
||||
NOTE: Evaluate the screenshots against these expected steps. Only give credit for steps that show VISIBLE evidence of completion BEYOND the pre-configured starting state."""
|
||||
|
||||
# Build image list description for the prompt
|
||||
if screenshot_filenames:
|
||||
img_list_str = ", ".join(screenshot_filenames)
|
||||
img_info = f"""\nYou are provided with exactly {len(screenshot_filenames)} screenshots in chronological order: {img_list_str}
|
||||
The FIRST screenshot is: {screenshot_filenames[0]}
|
||||
The LAST screenshot (final state): {screenshot_filenames[-1]}
|
||||
IMPORTANT: Only reference screenshots from the list above. Do NOT reference any screenshot that is not listed."""
|
||||
else:
|
||||
img_info = "\nNo screenshots were provided."
|
||||
|
||||
prompt = f"""You are a STRICT and RIGOROUS evaluator for desktop environment tasks. Your job is to score ONLY based on concrete, visible evidence of task completion in the screenshots.
|
||||
|
||||
Task Instruction: {instruction}
|
||||
{preconfig_section}
|
||||
{expected_steps_section}
|
||||
{img_info}
|
||||
|
||||
I will provide you with screenshot(s) showing the current state of the desktop environment. Please analyze the task execution step by step and provide a detailed evaluation.
|
||||
Analyze ONLY the FINAL screenshot ({screenshot_filenames[-1] if screenshot_filenames else 'N/A'}) to determine the end state, while using earlier screenshots for context.
|
||||
|
||||
CRITICAL SCORING RULES:
|
||||
1. Score ONLY based on what the AGENT actually accomplished. The pre-configured environment (application already launched, files already opened, etc.) is the STARTING STATE and worth 0 points.
|
||||
2. Score ONLY based on what is ACTUALLY VISIBLE in the screenshots. Do NOT give credit for assumed or potential progress.
|
||||
3. If the screenshots show NO meaningful action beyond the initial pre-configured state, the score MUST be 0.
|
||||
4. Do NOT give partial credit for "having the system on", "desktop being visible", "the application being open" (if it was pre-launched), or "the application being installed". These are prerequisites or pre-configured state, NOT progress.
|
||||
5. Each point must correspond to a SPECIFIC, VERIFIABLE action that was successfully completed BY THE AGENT toward the task goal.
|
||||
|
||||
SCORING GUIDE (0-10):
|
||||
- 0: No progress beyond the pre-configured starting state. If the app was pre-launched, merely having it open is 0. If the screenshots only show the desktop or the initial app state without any agent action, score is 0.
|
||||
- 1-2: The agent performed one minor action (e.g., clicked on a menu) but did not make meaningful progress toward the task goal.
|
||||
- 3-4: Some initial steps toward the task have been taken but the task is far from complete.
|
||||
- 5-6: Significant progress - about half the required steps are completed with visible evidence.
|
||||
- 7-8: Most steps are completed but the final result is not fully achieved or has minor issues.
|
||||
- 9: The task is essentially complete with very minor cosmetic differences.
|
||||
- 10: The task is perfectly and completely finished with clear evidence in the final screenshot.
|
||||
|
||||
IMPORTANT: You must respond with ONLY a valid JSON object (no additional text before or after). Use the following exact format:
|
||||
|
||||
{{
|
||||
"steps_analysis": [
|
||||
{{"step": "Step description", "status": "Success/Fail", "evidence_img": "step_X.png", "reason": "Brief explanation"}},
|
||||
{{"step": "Another step", "status": "Success/Fail", "evidence_img": "step_Y.png", "reason": "Brief explanation"}}
|
||||
{{"step": "Step description", "status": "Success/Fail", "evidence_img": "step_X.png", "reason": "Brief explanation of VISIBLE evidence"}},
|
||||
{{"step": "Another step", "status": "Success/Fail", "evidence_img": "step_Y.png", "reason": "Brief explanation of VISIBLE evidence"}}
|
||||
],
|
||||
"final_completion": "True/False",
|
||||
"score": 0-10
|
||||
}}
|
||||
|
||||
Where:
|
||||
- "steps_analysis": Array of steps you identified from the screenshots (reference screenshot filenames like step_1.png, step_2.png, etc.)
|
||||
- "steps_analysis": Array of steps you identified from the screenshots. Each step must cite VISIBLE evidence from a specific screenshot. Do NOT include pre-configured actions as agent steps.
|
||||
- "status": Either "Success" or "Fail" for each step
|
||||
- "evidence_img": The screenshot filename that shows evidence for this step (e.g., "step_2.png")
|
||||
- "reason": Brief explanation of why this step succeeded or failed
|
||||
- "final_completion": "True" if the overall task is completed, "False" otherwise
|
||||
- "score": Integer from 0 to 10, where 10 means perfectly completed and 0 means not completed at all
|
||||
- "reason": Explanation of what is VISUALLY observed in the screenshot as evidence
|
||||
- "final_completion": "True" ONLY if the overall task is fully completed with clear visual proof, "False" otherwise
|
||||
- "score": Integer from 0 to 10, following the strict scoring guide above
|
||||
|
||||
Remember: Return ONLY the JSON object, no additional text."""
|
||||
Remember: Return ONLY the JSON object, no additional text. Be STRICT - when in doubt, score LOWER."""
|
||||
|
||||
try:
|
||||
result = llm.generate_with_images(
|
||||
|
||||
@@ -4,7 +4,7 @@ from desktop_env.providers.base import VMManager, Provider
|
||||
def create_vm_manager_and_provider(provider_name: str, region: str, use_proxy: bool = False):
|
||||
"""
|
||||
Factory function to get the Virtual Machine Manager and Provider instances based on the provided provider name.
|
||||
|
||||
|
||||
Args:
|
||||
provider_name (str): The name of the provider (e.g., "aws", "vmware", etc.)
|
||||
region (str): The region for the provider
|
||||
@@ -39,5 +39,13 @@ def create_vm_manager_and_provider(provider_name: str, region: str, use_proxy: b
|
||||
from desktop_env.providers.volcengine.manager import VolcengineVMManager
|
||||
from desktop_env.providers.volcengine.provider import VolcengineProvider
|
||||
return VolcengineVMManager(), VolcengineProvider()
|
||||
elif provider_name == "proxmox":
|
||||
from desktop_env.providers.proxmox.manager import ProxmoxVMManager
|
||||
from desktop_env.providers.proxmox.provider import ProxmoxProvider
|
||||
return ProxmoxVMManager(), ProxmoxProvider(region)
|
||||
elif provider_name == "direct":
|
||||
from desktop_env.providers.direct.manager import DirectVMManager
|
||||
from desktop_env.providers.direct.provider import DirectProvider
|
||||
return DirectVMManager(), DirectProvider(region)
|
||||
else:
|
||||
raise NotImplementedError(f"{provider_name} not implemented!")
|
||||
|
||||
0
desktop_env/providers/direct/__init__.py
Normal file
0
desktop_env/providers/direct/__init__.py
Normal file
32
desktop_env/providers/direct/manager.py
Normal file
32
desktop_env/providers/direct/manager.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import logging
|
||||
from desktop_env.providers.base import VMManager
|
||||
|
||||
logger = logging.getLogger("desktopenv.providers.direct.DirectVMManager")
|
||||
|
||||
|
||||
class DirectVMManager(VMManager):
|
||||
"""No-op manager for direct-IP connections (physical machines / bare-metal)."""
|
||||
|
||||
def __init__(self, registry_path=""):
|
||||
pass
|
||||
|
||||
def initialize_registry(self, **kwargs):
|
||||
pass
|
||||
|
||||
def add_vm(self, vm_path, **kwargs):
|
||||
pass
|
||||
|
||||
def delete_vm(self, vm_path, **kwargs):
|
||||
pass
|
||||
|
||||
def occupy_vm(self, vm_path, pid, **kwargs):
|
||||
pass
|
||||
|
||||
def list_free_vms(self, **kwargs):
|
||||
return []
|
||||
|
||||
def check_and_clean(self, **kwargs):
|
||||
pass
|
||||
|
||||
def get_vm_path(self, os_type="Windows", region=None, screen_size=(1920, 1080), **kwargs):
|
||||
return os.environ.get("DIRECT_VM_IP", "192.168.1.11")
|
||||
63
desktop_env/providers/direct/provider.py
Normal file
63
desktop_env/providers/direct/provider.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
|
||||
import requests
|
||||
|
||||
from desktop_env.providers.base import Provider
|
||||
|
||||
logger = logging.getLogger("desktopenv.providers.direct.DirectProvider")
|
||||
logger.setLevel(logging.INFO)
|
||||
|
||||
RETRY_INTERVAL = 3
|
||||
MAX_WAIT_READY = 60
|
||||
|
||||
|
||||
class DirectProvider(Provider):
|
||||
"""
|
||||
Provider for directly connected machines (physical / bare-metal).
|
||||
No VM lifecycle management — the machine is assumed to be already running.
|
||||
The Flask server IP is read from the environment variable DIRECT_VM_IP.
|
||||
|
||||
Usage:
|
||||
export DIRECT_VM_IP=192.168.1.11
|
||||
python run.py --provider_name direct --path_to_vm ignored ...
|
||||
"""
|
||||
|
||||
def __init__(self, region: str = None):
|
||||
super().__init__(region)
|
||||
self.vm_ip = os.environ.get("DIRECT_VM_IP", "192.168.1.11")
|
||||
|
||||
def start_emulator(self, path_to_vm: str, headless: bool, os_type: str = "Windows"):
|
||||
"""No-op: machine is already on. Just verify Flask server is reachable."""
|
||||
logger.info(f"[direct] Using physical machine at {self.vm_ip}:5000 (no VM lifecycle)")
|
||||
self._wait_for_vm_ready(self.vm_ip)
|
||||
|
||||
def _wait_for_vm_ready(self, ip: str, timeout: int = MAX_WAIT_READY) -> bool:
|
||||
url = f"http://{ip}:5000/screenshot"
|
||||
deadline = time.time() + timeout
|
||||
while time.time() < deadline:
|
||||
try:
|
||||
r = requests.get(url, timeout=5)
|
||||
if r.status_code == 200:
|
||||
logger.info(f"[direct] Flask server ready at {url}")
|
||||
return True
|
||||
except Exception:
|
||||
pass
|
||||
logger.info(f"[direct] Waiting for Flask server at {url}...")
|
||||
time.sleep(RETRY_INTERVAL)
|
||||
logger.warning(f"[direct] Flask server at {url} not ready within {timeout}s — continuing anyway")
|
||||
return False
|
||||
|
||||
def get_ip_address(self, path_to_vm: str) -> str:
|
||||
return self.vm_ip
|
||||
|
||||
def save_state(self, path_to_vm: str, snapshot_name: str):
|
||||
logger.info("[direct] save_state: no-op (physical machine)")
|
||||
|
||||
def revert_to_snapshot(self, path_to_vm: str, snapshot_name: str) -> str:
|
||||
logger.info("[direct] revert_to_snapshot: no-op (physical machine)")
|
||||
return path_to_vm
|
||||
|
||||
def stop_emulator(self, path_to_vm: str):
|
||||
logger.info("[direct] stop_emulator: no-op (physical machine)")
|
||||
0
desktop_env/providers/proxmox/__init__.py
Normal file
0
desktop_env/providers/proxmox/__init__.py
Normal file
49
desktop_env/providers/proxmox/manager.py
Normal file
49
desktop_env/providers/proxmox/manager.py
Normal 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
|
||||
235
desktop_env/providers/proxmox/provider.py
Normal file
235
desktop_env/providers/proxmox/provider.py
Normal 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.")
|
||||
29
desktop_env/server_win7/extract_and_install.bat
Normal file
29
desktop_env/server_win7/extract_and_install.bat
Normal file
@@ -0,0 +1,29 @@
|
||||
@echo off
|
||||
echo ========================================
|
||||
echo Unzip + Install (Win7 32bit Python3.8)
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
set "ZIPFILE=%~dp0win7_server_packages.zip"
|
||||
set "DESTDIR=%~dp0"
|
||||
|
||||
if not exist "%ZIPFILE%" (
|
||||
echo [ERROR] win7_server_packages.zip not found!
|
||||
echo Please put this bat and the zip in the same folder.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [1/3] Unzipping via Shell.Application (Win7 compatible) ...
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -Command "$s=New-Object -ComObject Shell.Application; $d=$s.NameSpace('%DESTDIR%'); $z=$s.NameSpace('%ZIPFILE%'); $d.CopyHere($z.Items(), 20); Start-Sleep -s 5"
|
||||
|
||||
echo.
|
||||
if not exist "%~dp0win7_offline_packages\install_win7.bat" (
|
||||
echo [ERROR] Unzip failed. Folder win7_offline_packages not found.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [2/3] Unzip OK. Starting install ...
|
||||
echo.
|
||||
call "%~dp0win7_offline_packages\install_win7.bat"
|
||||
2008
desktop_env/server_win7/main.py
Normal file
2008
desktop_env/server_win7/main.py
Normal file
File diff suppressed because it is too large
Load Diff
3
desktop_env/server_win7/start_flask.bat
Normal file
3
desktop_env/server_win7/start_flask.bat
Normal file
@@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
cd /d D:\python_server
|
||||
start /B pythonw D:\python_server\main.py
|
||||
58
desktop_env/server_win7/transfer_to_win7.sh
Executable file
58
desktop_env/server_win7/transfer_to_win7.sh
Executable file
@@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
# Mac 端传输脚本 —— 将 Win7 离线包通过 HTTP 共享,Win7 用浏览器或 PowerShell 下载
|
||||
# 用法: bash transfer_to_win7.sh
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PKG_DIR="$SCRIPT_DIR/win7_offline_packages"
|
||||
WIN7_IP="192.168.1.11"
|
||||
MAC_IP="192.168.1.10"
|
||||
PORT=8888
|
||||
|
||||
echo "========================================"
|
||||
echo " Mac → Win7 离线包传输工具"
|
||||
echo " Mac: $MAC_IP Win7: $WIN7_IP"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# 检查连通性
|
||||
echo "[1/3] 检测 Win7 网络连通性..."
|
||||
if ping -c 2 -W 1000 "$WIN7_IP" > /dev/null 2>&1; then
|
||||
echo " [OK] Win7 ($WIN7_IP) 可达"
|
||||
else
|
||||
echo " [警告] ping 超时,请确认网线已连接且 IP 配置正确"
|
||||
fi
|
||||
|
||||
# 打包
|
||||
echo ""
|
||||
echo "[2/3] 打包离线文件..."
|
||||
cd "$SCRIPT_DIR"
|
||||
zip -r win7_server_packages.zip win7_offline_packages/ 2>/dev/null
|
||||
echo " [OK] 已打包 → $(pwd)/win7_server_packages.zip"
|
||||
echo " [OK] 解压脚本 → $(pwd)/extract_and_install.bat"
|
||||
|
||||
# 启动 HTTP 服务器
|
||||
echo ""
|
||||
echo "[3/3] 启动文件共享服务器..."
|
||||
echo ""
|
||||
echo " ┌──────────────────────────────────────────────────────────┐"
|
||||
echo " │ 在 Win7 浏览器(IE)中打开: │"
|
||||
echo " │ http://$MAC_IP:$PORT/ │"
|
||||
echo " │ │"
|
||||
echo " │ ★ 第一步:下载 extract_and_install.bat(小文件,先下) │"
|
||||
echo " │ ★ 第二步:下载 win7_server_packages.zip(大文件) │"
|
||||
echo " │ ★ 第三步:把两个文件放同一目录,双击 bat 文件 │"
|
||||
echo " │ (会自动解压 + 自动安装所有依赖) │"
|
||||
echo " │ │"
|
||||
echo " │ 如果无法双击 bat → 在命令提示符(cmd)中运行: │"
|
||||
echo " │ cd 下载目录路径 │"
|
||||
echo " │ extract_and_install.bat │"
|
||||
echo " └──────────────────────────────────────────────────────────┘"
|
||||
echo ""
|
||||
echo " 按 Ctrl+C 停止服务器"
|
||||
echo ""
|
||||
|
||||
# 在 zip 所在目录启动 HTTP 服务
|
||||
cd "$SCRIPT_DIR"
|
||||
python3 -m http.server $PORT
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,34 @@
|
||||
@echo off
|
||||
echo ========================================
|
||||
echo Offline Install for Win7 32bit Py3.8
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
python --version 2>&1 | findstr /C:"3.8"
|
||||
if errorlevel 1 (
|
||||
echo [ERROR] Python 3.8 not found.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo [OK] Python 3.8 detected.
|
||||
|
||||
echo.
|
||||
echo [Step 1] Installing build tools first...
|
||||
cd /d "%~dp0"
|
||||
python -m pip install --no-index --find-links . setuptools wheel
|
||||
echo [Step 2] Installing all packages...
|
||||
python -m pip install --no-index --find-links . six zipp importlib_metadata certifi idna urllib3 charset_normalizer requests MarkupSafe itsdangerous click blinker werkzeug jinja2 flask pywin32 numpy Pillow lxml pygame pymsgbox pytweening pyscreeze PyGetWindow MouseInfo PyAutoGUI pynput pywinauto
|
||||
|
||||
echo.
|
||||
echo [Step 2] Verifying...
|
||||
python -c "import flask; print('[OK] flask ' + flask.__version__)"
|
||||
python -c "import pyautogui; print('[OK] pyautogui')"
|
||||
python -c "import pywinauto; print('[OK] pywinauto')"
|
||||
python -c "import numpy; print('[OK] numpy ' + numpy.__version__)"
|
||||
python -c "import PIL; print('[OK] Pillow ' + PIL.__version__)"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Done! Run: python ..\main.py
|
||||
echo ========================================
|
||||
pause
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
2008
desktop_env/server_win7/win7_offline_packages/main_win7.py
Normal file
2008
desktop_env/server_win7/win7_offline_packages/main_win7.py
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,44 @@
|
||||
# Win7 32位 Python3.8 离线安装清单
|
||||
# 安装命令: pip install --no-index --find-links . -r requirements_win7.txt
|
||||
|
||||
# 底层依赖先装
|
||||
six
|
||||
zipp
|
||||
importlib_metadata
|
||||
certifi
|
||||
idna
|
||||
urllib3
|
||||
charset_normalizer
|
||||
requests
|
||||
|
||||
# Flask 依赖链
|
||||
MarkupSafe
|
||||
itsdangerous
|
||||
click
|
||||
blinker
|
||||
werkzeug
|
||||
jinja2
|
||||
flask
|
||||
|
||||
# Win32 底层
|
||||
pywin32
|
||||
|
||||
# 数据处理
|
||||
numpy
|
||||
Pillow
|
||||
lxml
|
||||
pygame
|
||||
|
||||
# GUI 控制
|
||||
pymsgbox
|
||||
pytweening
|
||||
pyscreeze
|
||||
PyGetWindow
|
||||
MouseInfo
|
||||
PyAutoGUI
|
||||
|
||||
# 输入控制
|
||||
pynput
|
||||
|
||||
# Win 自动化
|
||||
pywinauto
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
desktop_env/server_win7/win7_server_packages.zip
Normal file
BIN
desktop_env/server_win7/win7_server_packages.zip
Normal file
Binary file not shown.
34
evaluation_examples/data/vesta/NaCl.cif
Normal file
34
evaluation_examples/data/vesta/NaCl.cif
Normal file
@@ -0,0 +1,34 @@
|
||||
# generated using pymatgen
|
||||
data_NaCl
|
||||
_symmetry_space_group_name_H-M 'P 1'
|
||||
_cell_length_a 5.69169400
|
||||
_cell_length_b 5.69169400
|
||||
_cell_length_c 5.69169400
|
||||
_cell_angle_alpha 90.00000000
|
||||
_cell_angle_beta 90.00000000
|
||||
_cell_angle_gamma 90.00000000
|
||||
_symmetry_Int_Tables_number 1
|
||||
_chemical_formula_structural NaCl
|
||||
_chemical_formula_sum 'Na4 Cl4'
|
||||
_cell_volume 184.38459333
|
||||
_cell_formula_units_Z 4
|
||||
loop_
|
||||
_symmetry_equiv_pos_site_id
|
||||
_symmetry_equiv_pos_as_xyz
|
||||
1 'x, y, z'
|
||||
loop_
|
||||
_atom_site_type_symbol
|
||||
_atom_site_label
|
||||
_atom_site_symmetry_multiplicity
|
||||
_atom_site_fract_x
|
||||
_atom_site_fract_y
|
||||
_atom_site_fract_z
|
||||
_atom_site_occupancy
|
||||
Na Na0 1 0.00000000 0.00000000 0.00000000 1
|
||||
Na Na1 1 0.00000000 0.50000000 0.50000000 1
|
||||
Na Na2 1 0.50000000 0.00000000 0.50000000 1
|
||||
Na Na3 1 0.50000000 0.50000000 0.00000000 1
|
||||
Cl Cl4 1 0.50000000 0.00000000 0.00000000 1
|
||||
Cl Cl5 1 0.50000000 0.50000000 0.50000000 1
|
||||
Cl Cl6 1 0.00000000 0.00000000 0.50000000 1
|
||||
Cl Cl7 1 0.00000000 0.50000000 0.00000000 1
|
||||
113
evaluation_examples/data/vesta/anatase_TiO2.cif
Normal file
113
evaluation_examples/data/vesta/anatase_TiO2.cif
Normal file
@@ -0,0 +1,113 @@
|
||||
#------------------------------------------------------------------------------
|
||||
#$Date: 2023-03-26 11:09:57 +0300 (Sun, 26 Mar 2023) $
|
||||
#$Revision: 282068 $
|
||||
#$URL: svn://localhost/cod/cif/5/00/02/5000223.cif $
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# This file is available in the Crystallography Open Database (COD),
|
||||
# http://www.crystallography.net/
|
||||
#
|
||||
# All data on this site have been placed in the public domain by the
|
||||
# contributors.
|
||||
#
|
||||
data_5000223
|
||||
loop_
|
||||
_publ_author_name
|
||||
'Horn, M'
|
||||
'Schwerdtfeger, C F'
|
||||
'Meagher, E P'
|
||||
_publ_section_title
|
||||
;
|
||||
Refinement of the structure of anatase at several temperatures
|
||||
Sample: T = 300 C
|
||||
;
|
||||
_journal_name_full
|
||||
;
|
||||
Zeitschrift fuer Kristallographie, Kristallgeometrie, Kristallphysik,
|
||||
Kristallchemie (-144,1977)
|
||||
;
|
||||
_journal_page_first 273
|
||||
_journal_page_last 281
|
||||
_journal_volume 136
|
||||
_journal_year 1972
|
||||
_chemical_compound_source 'Lengenbach quarry, Binnatal, Switzerland'
|
||||
_chemical_formula_structural TiO2
|
||||
_chemical_formula_sum 'O2 Ti'
|
||||
_chemical_name_mineral Anatase
|
||||
_chemical_name_systematic 'Titanium oxide'
|
||||
_space_group_IT_number 141
|
||||
_symmetry_cell_setting tetragonal
|
||||
_symmetry_space_group_name_Hall 'I 4bw 2bw -1bw'
|
||||
_symmetry_space_group_name_H-M 'I 41/a m d :1'
|
||||
_cell_angle_alpha 90
|
||||
_cell_angle_beta 90
|
||||
_cell_angle_gamma 90
|
||||
_cell_formula_units_Z 4
|
||||
_cell_length_a 3.7892(4)
|
||||
_cell_length_b 3.7892(4)
|
||||
_cell_length_c 9.537(1)
|
||||
_cell_volume 136.9
|
||||
_database_code_amcsd 0010736
|
||||
_diffrn_ambient_temperature 573.15
|
||||
_exptl_crystal_density_diffrn 3.875
|
||||
_refine_ls_R_factor_all 0.023
|
||||
_cod_original_sg_symbol_H-M 'I 41/a m d S'
|
||||
_cod_original_formula_sum 'Ti O2'
|
||||
_cod_database_code 5000223
|
||||
loop_
|
||||
_space_group_symop_operation_xyz
|
||||
x,y,z
|
||||
-x,-y,z
|
||||
x,1/2+y,1/4-z
|
||||
-x,1/2-y,1/4-z
|
||||
-x,y,z
|
||||
x,-y,z
|
||||
-x,1/2+y,1/4-z
|
||||
x,1/2-y,1/4-z
|
||||
y,x,-z
|
||||
-y,-x,-z
|
||||
y,1/2+x,1/4+z
|
||||
-y,1/2-x,1/4+z
|
||||
-y,x,-z
|
||||
y,-x,-z
|
||||
-y,1/2+x,1/4+z
|
||||
y,1/2-x,1/4+z
|
||||
1/2+x,1/2+y,1/2+z
|
||||
1/2-x,1/2-y,1/2+z
|
||||
1/2+x,y,3/4-z
|
||||
1/2-x,-y,3/4-z
|
||||
1/2-x,1/2+y,1/2+z
|
||||
1/2+x,1/2-y,1/2+z
|
||||
1/2-x,y,3/4-z
|
||||
1/2+x,-y,3/4-z
|
||||
1/2+y,1/2+x,1/2-z
|
||||
1/2-y,1/2-x,1/2-z
|
||||
1/2+y,x,3/4+z
|
||||
1/2-y,-x,3/4+z
|
||||
1/2-y,1/2+x,1/2-z
|
||||
1/2+y,1/2-x,1/2-z
|
||||
1/2-y,x,3/4+z
|
||||
1/2+y,-x,3/4+z
|
||||
loop_
|
||||
_atom_site_label
|
||||
_atom_site_type_symbol
|
||||
_atom_site_symmetry_multiplicity
|
||||
_atom_site_Wyckoff_symbol
|
||||
_atom_site_fract_x
|
||||
_atom_site_fract_y
|
||||
_atom_site_fract_z
|
||||
_atom_site_occupancy
|
||||
_atom_site_attached_hydrogens
|
||||
_atom_site_calc_flag
|
||||
Ti1 Ti4+ 4 a 0. 0. 0. 1. 0 d
|
||||
O1 O2- 8 e 0. 0. 0.2079(2) 1. 0 d
|
||||
loop_
|
||||
_atom_type_symbol
|
||||
_atom_type_oxidation_number
|
||||
Ti4+ 4.000
|
||||
O2- -2.000
|
||||
loop_
|
||||
_cod_related_entry_id
|
||||
_cod_related_entry_database
|
||||
_cod_related_entry_code
|
||||
1 AMCSD 0010736
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"id": "building-metal-complexes_task1",
|
||||
"snapshot": "avogadro",
|
||||
"instruction": "在 Avogadro 2 中,使用 Template Tool 创建 [Co(NH3)6]3+ 配位化合物,设置为八面体配位几何。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\Avogadro2\\bin\\avogadro2.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"avogadro"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "1. 按下键盘快捷键 Ctrl+3(或在顶部工具栏中单击 Template Tool 图标),激活模板工具。\n2. 在左侧(或右侧)的模板工具控制面板中,单击选中 Centers 选项卡。\n3. 在键盘上依次输入字母 C 和 o,以选择 Cobalt (钴) 元素作为金属中心。\n4. 在形式电荷输入框旁,连续单击三次向上箭头(∧)按钮,将中心离子的形式电荷设置为 +3。\n5. 单击坐标下拉框,选择 6: Octahedral(八面体)选项,设定配位几何形状为八面体。\n6. 将鼠标移动到主界面的 3D 视图空白区域,单击鼠标左键,放置带有六个配位氢原子的钴中心结构。\n7. 在模板工具控制面板中,单击选中 Ligands 选项卡。\n8. 单击 Ligand 下拉框,从列表中选择 ammine (NH3) 配体。\n9. 在 3D 视图中,将鼠标悬停并单击钴原子上的第 1 个氢原子,将其替换为氨配体。\n10. 若有氢原子被遮挡,按下 Ctrl+1 切换至导航视角,拖动鼠标旋转分子,使目标氢原子可见,再切换回 Ctrl+3 模板工具后单击钴原子上的第 2 个氢原子,将其替换为氨配体。\n11. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3),单击钴原子上的第 3 个氢原子,将其替换为氨配体。\n12. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3),单击钴原子上的第 4 个氢原子,将其替换为氨配体。\n13. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3),单击钴原子上的第 5 个氢原子,将其替换为氨配体。\n14. 重复上述操作(必要时按 Ctrl+1 旋转视角后切回 Ctrl+3),单击钴原子上的第 6 个氢原子,将其替换为氨配体,完成 [Co(NH3)6]3+ 化合物的构建。",
|
||||
"steps_original": "1. 打开 Template Tool(快捷键 Ctrl+3 或点击工具栏图标)。\n2. 切换到 Centers 选项卡。\n3. 输入 'Co' 或从弹出菜单中选择钴元素。\n4. 点击三次 '+' 符号,将正电荷设置为 +3。\n5. 按键 '6' 或选择八面体几何形状。\n6. 点击空白区域,放置钴中心,六个氢原子会显示在配位位置。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"id": "building-metal-complexes_task3",
|
||||
"snapshot": "avogadro",
|
||||
"instruction": "在 Avogadro 2 中,使用 Template Tool 创建 [Ni(en)(NH3)2]2+ 配位化合物,设置为平面四方配位几何。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\Avogadro2\\bin\\avogadro2.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"avogadro"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "1. 在顶部工具栏中,单击 'Template Tool' 图标按钮(或在键盘上按 Ctrl+3 快捷键)以激活模板工具面板。\n2. 在弹出的模板工具面板中,单击顶部名为 'Centers' 的选项卡。\n3. 在键盘上依次输入字母键 'N' 和 'i',或单击元素下拉菜单并选择 'Nickel',以选中镍元素。\n4. 在形式电荷(形式电荷)数值框旁,连续单击向上箭头('^')按钮两次,将中心离子的形式电荷从 0 调整为 '+2'。\n5. 单击坐标(坐标)下拉菜单将其展开,在弹出的选项列表中选择 '4: Square Planar',以设置平面四方配位几何构型。\n6. 将鼠标移动到 3D 模型视图的空白区域,单击鼠标左键以放置带有四个占位氢原子的镍中心。\n7. 在模板工具面板中,单击顶部名为 'Ligands' 的选项卡切换到配体模式。\n8. 在键盘上依次输入字母键 'e' 和 'n',以在配体库中选中 'ethylenediamine' (乙二胺) 配体。\n9. 在 3D 视图中,单击选中中心镍原子周围的任意一个氢原子。\n10. 在 3D 视图中,单击与上一步选中的氢原子相邻(顺式位置)的另一个氢原子,完成双齿配体的桥接结合。\n11. 在模板工具面板中,单击 '类型(Type)' 下拉菜单,将配体类型从 'Bidentate'(双齿)切换为 'Monodentate'(单齿),然后单击 'Ligand' 下拉菜单并选择 'ammine'(氨)配体。\n12. 在 3D 视图中,单击剩余的第三个占位氢原子将其替换为氨配体。\n13. 在 3D 视图中,单击最后一个剩余的氢原子,将其替换为第二个氨配体,完成目标化合物构建。",
|
||||
"steps_original": "1. 打开 Template Tool。\n2. 切换到 Centers 选项卡。\n3. 输入 'Ni' 或从弹出菜单中选择镍元素。\n4. 连续单击形式电荷数值框旁的向上箭头('^')按钮两次,将正电荷设置为 +2。\n5. 单击坐标下拉菜单将其展开,在列表中选择 '4: Square Planar' 平面四方几何形状。\n6. 点击空白区域,放置镍中心,四个氢原子会显示在配位位置。"
|
||||
}
|
||||
}
|
||||
@@ -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. 点击两个剩余氢原子,每次点击替换为氯配体。"
|
||||
}
|
||||
}
|
||||
@@ -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. 确保苯环显示在工作界面中。"
|
||||
}
|
||||
}
|
||||
@@ -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. 确保分子结构正确。"
|
||||
}
|
||||
}
|
||||
@@ -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. 检查分子是否获得合乎逻辑的几何结构。"
|
||||
}
|
||||
}
|
||||
@@ -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. 点击单碳结构上的一个氢原子,将其替换为羧基。"
|
||||
}
|
||||
}
|
||||
@@ -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. 使用优化工具进行几何优化并检查分子是否正确。"
|
||||
}
|
||||
}
|
||||
@@ -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' 窗口中查看分子的名字和相关信息,例如分子质量、化学式、原子数和键数。"
|
||||
}
|
||||
}
|
||||
@@ -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 按钮加载文件并启动分析"
|
||||
}
|
||||
}
|
||||
@@ -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 的复选框以隐藏经典模型"
|
||||
}
|
||||
}
|
||||
@@ -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 视角"
|
||||
}
|
||||
}
|
||||
@@ -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' 关闭对话框。"
|
||||
}
|
||||
}
|
||||
@@ -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' 的行以渲染该轨道"
|
||||
}
|
||||
}
|
||||
@@ -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' 按钮进行高质量渲染"
|
||||
}
|
||||
}
|
||||
@@ -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 按钮开始播放分子的振动动画"
|
||||
}
|
||||
}
|
||||
@@ -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 按钮停止播放"
|
||||
}
|
||||
}
|
||||
40
evaluation_examples/examples/flsol/flsol_task1.json
Normal file
40
evaluation_examples/examples/flsol/flsol_task1.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"id": "flsol_task1",
|
||||
"snapshot": "flsol",
|
||||
"instruction": "启动 FL Solutions for F-4600 软件,并截图确认主界面已成功打开。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 2
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"flsol"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 4
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval",
|
||||
"expected": {
|
||||
"description": "FL Solutions for F-4600 主界面应已打开,可见菜单栏(File, Method, Measure 等)和仪器连接状态面板。"
|
||||
}
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": true,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "1. 双击桌面上的 FL Solutions for F-4600 快捷方式,或通过开始菜单找到并打开 FL Solutions 程序(路径:C:\\Program Files\\FL Solutions\\flsol.exe)。\n2. 等待程序加载完成(约 5-10 秒),观察主界面是否出现,包含顶部菜单栏(File、Method、Measure、View、Tools、Help 等选项)以及仪器状态面板。\n3. 确认主界面已打开后,操作完成。",
|
||||
"steps_original": "1. 打开 FL Solutions for F-4600 软件。\n2. 等待主界面加载完毕。"
|
||||
}
|
||||
}
|
||||
48
evaluation_examples/examples/flsol/flsol_task2.json
Normal file
48
evaluation_examples/examples/flsol/flsol_task2.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"id": "flsol_task2",
|
||||
"snapshot": "flsol",
|
||||
"instruction": "打开 FL Solutions for F-4600,新建一个波长扫描(Wavelength Scan)方法,将激发波长(Excitation Wavelength)设置为 350 nm,扫描范围设为 400–700 nm,扫描速度设为 240 nm/min,然后保存该方法为 test_scan.mth。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\Program Files\\FL Solutions\\flsol.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"flsol"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval",
|
||||
"expected": {
|
||||
"description": "屏幕上应显示 FL Solutions 主界面,并且在 Method 或文件相关区域可以看到名为 test_scan.mth 的方法文件已被保存/创建,或在最近文件列表中可以看到该文件名。激发波长应设为 350 nm,扫描范围为 400-700 nm。"
|
||||
}
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": true,
|
||||
"possibility_of_env_change": "medium",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "1. 等待 FL Solutions 主界面打开。\n2. 在顶部菜单栏中,单击 'Method'(方法)菜单,然后选择 'New'(新建)或 'Wavelength Scan'(波长扫描)选项,创建一个新的波长扫描方法。\n3. 在弹出的方法设置对话框中,找到 'Excitation Wavelength'(激发波长)输入框,将数值清空后输入 '350',单位为 nm。\n4. 找到扫描范围(Scan Range)设置区域,将起始波长(Start)设为 '400' nm,将结束波长(End)设为 '700' nm。\n5. 找到扫描速度(Scan Speed)下拉菜单或输入框,选择或输入 '240' nm/min。\n6. 确认设置无误后,单击菜单 'Method' → 'Save As'(另存为),在弹出的文件保存对话框中,将文件名输入为 'test_scan',确保文件类型为 .mth,然后单击 '保存'(Save)按钮。\n7. 确认文件已成功保存。",
|
||||
"steps_original": "1. 打开 FL Solutions 并新建 Wavelength Scan 方法。\n2. 设置 Ex 波长 350 nm,扫描范围 400-700 nm,速度 240 nm/min。\n3. 另存为 test_scan.mth。"
|
||||
}
|
||||
}
|
||||
48
evaluation_examples/examples/flsol/flsol_task3.json
Normal file
48
evaluation_examples/examples/flsol/flsol_task3.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"id": "flsol_task3",
|
||||
"snapshot": "flsol",
|
||||
"instruction": "打开 FL Solutions for F-4600,进入仪器参数设置(Instrument Parameters),将光电倍增管电压(PMT Voltage)修改为 700 V,狭缝宽度(Slit Width,激发和发射均设置)修改为 5.0 nm,响应时间(Response)设置为 Auto,然后截图确认参数设置完成。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\Program Files\\FL Solutions\\flsol.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"flsol"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval",
|
||||
"expected": {
|
||||
"description": "FL Solutions 的仪器参数设置界面(Instrument Parameters 或 Method 设置窗口)应可见,其中 PMT Voltage 显示为 700 V,激发和发射狭缝宽度(Ex Slit / Em Slit)均显示为 5.0 nm,响应时间(Response)显示为 Auto。"
|
||||
}
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": true,
|
||||
"possibility_of_env_change": "medium",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "1. 等待 FL Solutions 主界面打开。\n2. 在顶部菜单栏中,单击 'Method'(方法)菜单,选择 'New'(新建)创建一个新方法,或在现有方法的参数面板中操作。\n3. 在方法设置界面中,找到仪器参数(Instrument Parameters)区域(通常在方法编辑窗口的下方或单独的选项卡中)。\n4. 找到 'PMT Voltage'(光电倍增管电压)输入框,清空当前值并输入 '700',单位为 V。\n5. 找到激发狭缝宽度(EX Slit Width 或 Excitation Slit)输入框或下拉菜单,将值修改为 '5.0',单位为 nm。\n6. 找到发射狭缝宽度(EM Slit Width 或 Emission Slit)输入框或下拉菜单,将值修改为 '5.0',单位为 nm。\n7. 找到响应时间(Response)下拉菜单,单击展开,选择 'Auto'(自动)选项。\n8. 确认所有参数设置完成后,截图当前界面。",
|
||||
"steps_original": "1. 打开 FL Solutions,进入方法/仪器参数设置。\n2. 设置 PMT 电压 700V,Ex/Em 狭缝宽度各 5.0 nm,Response 设为 Auto。"
|
||||
}
|
||||
}
|
||||
44
evaluation_examples/examples/flsol/flsol_task4_measure.json
Normal file
44
evaluation_examples/examples/flsol/flsol_task4_measure.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "flsol_task4_measure",
|
||||
"snapshot": "flsol",
|
||||
"instruction": "使用 FL Solutions for F-4600 软件执行一次荧光测量。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": ["C:\\Program Files\\FL Solutions\\flsol.exe"],
|
||||
"shell": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 15
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"flsol"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": true,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "1. 软件已自动打开,等待 FL Solutions 主界面完全加载,确认标题栏显示 'FL Solutions - F-4600 FL Spectrophotometer on USB' 且仪器状态正常(无报错弹窗)。\n2. 直接按键盘 F4 键触发 Measure(这是最可靠的方式,F4 是 Measure 的快捷键)。\n3. 如果 F4 无反应,则通过菜单执行:点击菜单栏 'Spectrophotometer'(第四个菜单项,位于 View 和 Tools 之间),在下拉菜单中点击 'Measure'(快捷键 F4)。\n4. 等待测量过程完成,软件会在图表区域实时绘制扫描曲线,测量完成后曲线绘制停止。\n5. 确认图表区域有测量结果曲线后,操作完成。",
|
||||
"steps_original": "1. 等待 FL Solutions 和 F-4600 仪器完全初始化,状态变为 Ready。\n2. 点击 Measure 按钮执行测量。\n3. 等待测量完成,图表区域出现曲线。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,417 @@
|
||||
{
|
||||
"id": "flsol_taskE_auto_optimize_scan",
|
||||
"snapshot": "flsol",
|
||||
"instruction": "假设你的目标就是测量样品的荧光图谱。下面的透露给你的辅助信息,把辅助信息当成你自己的思维和决策并完全遵循,而不是把它当成任务,**绝对不允许在输出的「观察」「判断」中说明是任务要求,而是把辅助信息当成你自己的经验,用根据我的经验使用某某配置而不是根据任务要求使用某某配置**因为下面的步骤是完全正确和精准的,你只需要执行,而且绝对不允许在:是严格按坐标执行,每步执行完等待界面响应再执行下一步,禁止连续操作。修改任何数值输入框时必须:先double_click双击全选pyautogui.click(x,y);pyautogui.click(x,y)),再pyautogui.press(delete),最后用pyautogui.typewrite输入新值。1.等待主界面加载并确认正常;2.点击sample(80,159)打开保存位置选择,双击选中sample name文本框(563,346),并清空和重命名为test 3. 双击选中comment 文本框(583,381)的内容,并清空 4. 点击elect 按钮(796,613)弹出输出的目标文件夹,5. 点击创建新文件夹图标(784,410),命名为test,然后回车,再次回车进入test文件夹 5.然后点击保存(942,718)。然后点击ok(535,650)关闭sample界面 6. 点击Method(36,166)进入Instrument(456,293);7.设置EX_WL(497,472)为350nm;8.设置EM_Start_WL(493,500)为400nm,EM_End_WL(495,524)为700nm;9.设置PMT_Voltage(758,369)为700V;10.设置EX_Slit下拉框(771,321)为2.5nm,点击下拉框EM_Slit(764,344)出现下拉选项选择5nm(748,386);11.点击Report(638,290)确认Data_start(718,455)和Data_end(717,480)与EM_Start_WL和EM_End_WL的值一致;12.点击确定(641,717);13.等待parameters更新完成并ready后,才可点击Measure(182,162)测量并观察谱图;14.点击底部左下角ex3的输出结果最大化按钮(108,948)",
|
||||
"source": "custom",
|
||||
"config": [],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"flsol"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval",
|
||||
"expected": {
|
||||
"description": "FL Solutions 主界面中图表区域应显示一条完整的荧光发射光谱曲线:峰形平滑、顶部无截断(曲线最高点不贴近纵轴上限)、基线平稳、信噪比良好。界面中的仪器参数区域应可见激发波长 350 nm、发射扫描范围 380-700 nm,以及经过迭代调整后的最终 PMT 电压和狭缝宽度参数。"
|
||||
}
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": true,
|
||||
"possibility_of_env_change": "medium",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "",
|
||||
"steps_original": "1. 打开 FL Solutions,新建波长扫描方法。\n2. 设置激发波长 350 nm,发射范围 380-700 nm,初始 PMT 700V,狭缝 2.5 nm。\n3. 执行测量,观察谱图。\n4. 若峰截断则降低 PMT 电压和/或缩小狭缝;若信号过弱则升高 PMT 电压和/或增大狭缝。\n5. 反复迭代测量直到峰形完整显示,截图记录最终结果。",
|
||||
"difficulty": "hard",
|
||||
"highlight": "AI 能够读取谱图质量并进行闭环迭代调参,体现真正的仪器操控智能,而非机械执行固定步骤。",
|
||||
"ui_coordinates": {
|
||||
"application": "FL Solutions - F-4600",
|
||||
"main_window": {
|
||||
"name": "F-4600 FL Spectrophotometer on USB",
|
||||
"toolbar": [
|
||||
{
|
||||
"name": "Method",
|
||||
"type": "Button_Icon",
|
||||
"center": [
|
||||
36,
|
||||
166
|
||||
],
|
||||
"description": "打开分析方法设置窗口"
|
||||
},
|
||||
{
|
||||
"name": "Measure",
|
||||
"type": "Button_Icon",
|
||||
"center": [
|
||||
182,
|
||||
162
|
||||
],
|
||||
"description": "执行测量"
|
||||
}
|
||||
],
|
||||
"monitor_panel": [
|
||||
{
|
||||
"name": "Fluorescence_Value",
|
||||
"type": "Display",
|
||||
"center": [
|
||||
959,
|
||||
240
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "EX_WL_Display",
|
||||
"type": "Text",
|
||||
"center": [
|
||||
912,
|
||||
262
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "EM_WL_Display",
|
||||
"type": "Text",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Status_Ready_Label",
|
||||
"type": "Status_Indicator",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"color_hint": "Green"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_windows": {
|
||||
"Analysis_Method": {
|
||||
"common_controls": {
|
||||
"tabs": [
|
||||
{
|
||||
"name": "General",
|
||||
"center": [
|
||||
398,
|
||||
291
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Instrument",
|
||||
"center": [
|
||||
456,
|
||||
293
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Monitor",
|
||||
"center": [
|
||||
524,
|
||||
295
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Processing",
|
||||
"center": [
|
||||
574,
|
||||
293
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Report",
|
||||
"center": [
|
||||
638,
|
||||
290
|
||||
]
|
||||
}
|
||||
],
|
||||
"footer_buttons": [
|
||||
{
|
||||
"name": "确定",
|
||||
"center": [
|
||||
641,
|
||||
717
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "取消",
|
||||
"center": [
|
||||
719,
|
||||
717
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "应用",
|
||||
"center": [
|
||||
788,
|
||||
717
|
||||
],
|
||||
"status": "disabled"
|
||||
},
|
||||
{
|
||||
"name": "帮助",
|
||||
"center": [
|
||||
882,
|
||||
717
|
||||
]
|
||||
}
|
||||
],
|
||||
"close_button": {
|
||||
"name": "Close_Window",
|
||||
"center": [
|
||||
905,
|
||||
263
|
||||
]
|
||||
}
|
||||
},
|
||||
"tabs_content": {
|
||||
"General": [
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Measurement",
|
||||
"center": [
|
||||
512,
|
||||
321
|
||||
],
|
||||
"value": "Wavelength scan"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Operator",
|
||||
"center": [
|
||||
533,
|
||||
349
|
||||
],
|
||||
"value": "Administrator"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Instrument_Model",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Sampling",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"status": "disabled"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Comments",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "Use_sample_table",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"name": "Load",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"name": "Save",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"name": "Save_As",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
}
|
||||
],
|
||||
"Instrument": [
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Scan_mode",
|
||||
"center": [
|
||||
550,
|
||||
322
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Data_mode",
|
||||
"center": [
|
||||
526,
|
||||
347
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "EX_WL",
|
||||
"center": [
|
||||
497,
|
||||
472
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "EM_Start_WL",
|
||||
"center": [
|
||||
493,
|
||||
500
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "EM_End_WL",
|
||||
"center": [
|
||||
495,
|
||||
524
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Scan_speed",
|
||||
"center": [
|
||||
497,
|
||||
549
|
||||
],
|
||||
"unit": "nm/min"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "EX_Slit",
|
||||
"center": [
|
||||
771,
|
||||
321
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "EM_Slit",
|
||||
"center": [
|
||||
764,
|
||||
344
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit_Spin",
|
||||
"name": "PMT_Voltage",
|
||||
"center": [
|
||||
758,
|
||||
369
|
||||
],
|
||||
"unit": "V"
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "PMT_Voltage_Limit",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"label": "PMT Voltage 0-1000V"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Response",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"unit": "s"
|
||||
},
|
||||
{
|
||||
"type": "Edit_Spin",
|
||||
"name": "Replicates",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
}
|
||||
],
|
||||
"Monitor": [
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Y_Axis_Max",
|
||||
"center": [
|
||||
455,
|
||||
343
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Y_Axis_Min",
|
||||
"center": [
|
||||
455,
|
||||
375
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "Open_processing_after_acquisition",
|
||||
"center": [
|
||||
396,
|
||||
437
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "Overlay",
|
||||
"center": [
|
||||
395,
|
||||
503
|
||||
]
|
||||
}
|
||||
],
|
||||
"Report": [
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Data_start_Value",
|
||||
"center": [
|
||||
718,
|
||||
455
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Data_end_Value",
|
||||
"center": [
|
||||
717,
|
||||
480
|
||||
],
|
||||
"unit": "nm"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,417 @@
|
||||
{
|
||||
"id": "flsol_taskE_auto_optimize_scan",
|
||||
"snapshot": "flsol",
|
||||
"instruction": "一步一步地执行,别他妈的给老子跳步 完全按照老子给的指令执行5.点击'PMT_Voltage'(758,369)设置为700V;6.设置'EX_Slit(下拉框)(771,321)'为2.5nm,'点击下拉框EM_Slit(764,344)'出现下拉选项,选择5nm(748,386);7.点击'Report(638,290)'确认'Data_start(718,455)'和'Data_end(717,480)与instrument的EM_Start_WL和EM_End_WL'的值一致;8.点击'确定(641,717)';9.点击'Measure(182,162)'测量并观察谱图;10.若信号截断则返回'Method(36,166)'降低'PMT_Voltage(774,369)'或缩小狭缝(771,321)后重测;11.若信号过弱则返回'Method(36,166)'升高'PMT_Voltage(774,369)'或增大狭缝(764,344)后重测;12.重复调优至峰值在30%-90%且峰形完整;13.点击'输出结果(108,948)'并最大化。",
|
||||
"source": "custom",
|
||||
"config": [],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"flsol"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval",
|
||||
"expected": {
|
||||
"description": "FL Solutions 主界面中图表区域应显示一条完整的荧光发射光谱曲线:峰形平滑、顶部无截断(曲线最高点不贴近纵轴上限)、基线平稳、信噪比良好。界面中的仪器参数区域应可见激发波长 350 nm、发射扫描范围 380-700 nm,以及经过迭代调整后的最终 PMT 电压和狭缝宽度参数。"
|
||||
}
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": true,
|
||||
"possibility_of_env_change": "medium",
|
||||
"metadata": {
|
||||
"input_files": [],
|
||||
"steps": "{\"application\": \"FL Solutions - F-4600\", \"main_window\": {\"toolbar\": [{\"name\": \"Method\", \"center\": [36, 166]}, {\"name\": \"Measure\", \"center\": [182, 162]}]}, \"sub_windows\": {\"Analysis_Method\": {\"tabs\": [{\"name\": \"Instrument\", \"center\": [456, 293]}], \"footer_buttons\": [{\"name\": \"确定\", \"center\": [641, 717]}, {\"name\": \"取消\", \"center\": [719, 717]}], \"Instrument\": [{\"name\": \"EX_WL\", \"center\": [497, 472]}, {\"name\": \"EM_Start_WL\", \"center\": [493, 500]}, {\"name\": \"EM_End_WL\", \"center\": [495, 524]}, {\"name\": \"EX_Slit\", \"center\": [771, 321]}, {\"name\": \"EM_Slit\", \"center\": [764, 344]}, {\"name\": \"PMT_Voltage\", \"center\": [774, 369]}]}}}",
|
||||
"steps_original": "1. 打开 FL Solutions,新建波长扫描方法。\n2. 设置激发波长 350 nm,发射范围 380-700 nm,初始 PMT 700V,狭缝 2.5 nm。\n3. 执行测量,观察谱图。\n4. 若峰截断则降低 PMT 电压和/或缩小狭缝;若信号过弱则升高 PMT 电压和/或增大狭缝。\n5. 反复迭代测量直到峰形完整显示,截图记录最终结果。",
|
||||
"difficulty": "hard",
|
||||
"highlight": "AI 能够读取谱图质量并进行闭环迭代调参,体现真正的仪器操控智能,而非机械执行固定步骤。",
|
||||
"ui_coordinates": {
|
||||
"application": "FL Solutions - F-4600",
|
||||
"main_window": {
|
||||
"name": "F-4600 FL Spectrophotometer on USB",
|
||||
"toolbar": [
|
||||
{
|
||||
"name": "Method",
|
||||
"type": "Button_Icon",
|
||||
"center": [
|
||||
36,
|
||||
166
|
||||
],
|
||||
"description": "打开分析方法设置窗口"
|
||||
},
|
||||
{
|
||||
"name": "Measure",
|
||||
"type": "Button_Icon",
|
||||
"center": [
|
||||
182,
|
||||
162
|
||||
],
|
||||
"description": "执行测量"
|
||||
}
|
||||
],
|
||||
"monitor_panel": [
|
||||
{
|
||||
"name": "Fluorescence_Value",
|
||||
"type": "Display",
|
||||
"center": [
|
||||
959,
|
||||
240
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "EX_WL_Display",
|
||||
"type": "Text",
|
||||
"center": [
|
||||
912,
|
||||
262
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "EM_WL_Display",
|
||||
"type": "Text",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Status_Ready_Label",
|
||||
"type": "Status_Indicator",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"color_hint": "Green"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_windows": {
|
||||
"Analysis_Method": {
|
||||
"common_controls": {
|
||||
"tabs": [
|
||||
{
|
||||
"name": "General",
|
||||
"center": [
|
||||
398,
|
||||
291
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Instrument",
|
||||
"center": [
|
||||
456,
|
||||
293
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Monitor",
|
||||
"center": [
|
||||
524,
|
||||
295
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Processing",
|
||||
"center": [
|
||||
574,
|
||||
293
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Report",
|
||||
"center": [
|
||||
638,
|
||||
290
|
||||
]
|
||||
}
|
||||
],
|
||||
"footer_buttons": [
|
||||
{
|
||||
"name": "确定",
|
||||
"center": [
|
||||
641,
|
||||
717
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "取消",
|
||||
"center": [
|
||||
719,
|
||||
717
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "应用",
|
||||
"center": [
|
||||
788,
|
||||
717
|
||||
],
|
||||
"status": "disabled"
|
||||
},
|
||||
{
|
||||
"name": "帮助",
|
||||
"center": [
|
||||
882,
|
||||
717
|
||||
]
|
||||
}
|
||||
],
|
||||
"close_button": {
|
||||
"name": "Close_Window",
|
||||
"center": [
|
||||
905,
|
||||
263
|
||||
]
|
||||
}
|
||||
},
|
||||
"tabs_content": {
|
||||
"General": [
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Measurement",
|
||||
"center": [
|
||||
512,
|
||||
321
|
||||
],
|
||||
"value": "Wavelength scan"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Operator",
|
||||
"center": [
|
||||
533,
|
||||
349
|
||||
],
|
||||
"value": "Administrator"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Instrument_Model",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Sampling",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"status": "disabled"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Comments",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "Use_sample_table",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"name": "Load",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"name": "Save",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"name": "Save_As",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
}
|
||||
],
|
||||
"Instrument": [
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Scan_mode",
|
||||
"center": [
|
||||
550,
|
||||
322
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Data_mode",
|
||||
"center": [
|
||||
526,
|
||||
347
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "EX_WL",
|
||||
"center": [
|
||||
497,
|
||||
472
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "EM_Start_WL",
|
||||
"center": [
|
||||
493,
|
||||
500
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "EM_End_WL",
|
||||
"center": [
|
||||
495,
|
||||
524
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Scan_speed",
|
||||
"center": [
|
||||
497,
|
||||
549
|
||||
],
|
||||
"unit": "nm/min"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "EX_Slit",
|
||||
"center": [
|
||||
771,
|
||||
321
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "EM_Slit",
|
||||
"center": [
|
||||
764,
|
||||
344
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit_Spin",
|
||||
"name": "PMT_Voltage",
|
||||
"center": [
|
||||
758,
|
||||
379
|
||||
],
|
||||
"unit": "V"
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "PMT_Voltage_Limit",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"label": "PMT Voltage 0-1000V"
|
||||
},
|
||||
{
|
||||
"type": "ComboBox",
|
||||
"name": "Response",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"unit": "s"
|
||||
},
|
||||
{
|
||||
"type": "Edit_Spin",
|
||||
"name": "Replicates",
|
||||
"center": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
}
|
||||
],
|
||||
"Monitor": [
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Y_Axis_Max",
|
||||
"center": [
|
||||
455,
|
||||
343
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Y_Axis_Min",
|
||||
"center": [
|
||||
455,
|
||||
375
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "Open_processing_after_acquisition",
|
||||
"center": [
|
||||
396,
|
||||
437
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "Overlay",
|
||||
"center": [
|
||||
395,
|
||||
503
|
||||
]
|
||||
}
|
||||
],
|
||||
"Report": [
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Data_start_Value",
|
||||
"center": [
|
||||
718,
|
||||
455
|
||||
],
|
||||
"unit": "nm"
|
||||
},
|
||||
{
|
||||
"type": "Edit",
|
||||
"name": "Data_end_Value",
|
||||
"center": [
|
||||
717,
|
||||
480
|
||||
],
|
||||
"unit": "nm"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task1.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task1.json
Normal 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 按钮完成操作。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task10.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task10.json
Normal 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. 查看并确认选区正确恢复。"
|
||||
}
|
||||
}
|
||||
58
evaluation_examples/examples/imagej/user-guide_task2.json
Normal file
58
evaluation_examples/examples/imagej/user-guide_task2.json
Normal 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 按钮完成操作。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task3.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task3.json
Normal 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' 并双击运行命令。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task4.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task4.json
Normal 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 按钮完成操作。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task5.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task5.json
Normal 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 按钮完成拟合。"
|
||||
}
|
||||
}
|
||||
58
evaluation_examples/examples/imagej/user-guide_task6.json
Normal file
58
evaluation_examples/examples/imagej/user-guide_task6.json
Normal 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. 确保图像正确旋转后保存或查看结果。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task7.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task7.json
Normal 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 按钮保存选项。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task8.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task8.json
Normal 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 按钮完成保存。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/imagej/user-guide_task9.json
Normal file
45
evaluation_examples/examples/imagej/user-guide_task9.json
Normal 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 窗口中查看面积和灰度值等测量结果。"
|
||||
}
|
||||
}
|
||||
30
evaluation_examples/examples/jade/MDIJade6.5使用手册_task1.json
Normal file
30
evaluation_examples/examples/jade/MDIJade6.5使用手册_task1.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"id": "MDIJade6.5使用手册_task1",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 MDI Jade 中通过菜单 File → Patterns 加载衍射数据文件 DEMO01.MDI。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 在 Windows 桌面找到名为 MDI Jade 的快捷方式图标。\n2. 双击该快捷方式图标启动 MDI Jade 软件。\n3. 在软件主界面顶部的菜单栏中,单击 File 菜单。\n4. 在弹出的下拉菜单中,单击 Patterns... 选项,打开读入文件对话框。\n5. 在弹出的 Read Pattern Files 对话框中,在中间的 File Name 文件列表区域,寻找并单击选中名为 DEMO01.MDI 的文件。\n6. 单击该对话框左上方的 Read 按钮,将选定的衍射数据文件加载到软件中。",
|
||||
"steps_original": "1. 在桌面找到 MDI Jade 图标,双击打开软件。\n2. 点击菜单 File → Patterns。\n3. 在弹出的对话框中选择 DEMO01.MDI 并点击 Open。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task10.json
Normal file
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task10.json
Normal 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. 检查精修结果并保存。"
|
||||
}
|
||||
}
|
||||
44
evaluation_examples/examples/jade/MDIJade6.5使用手册_task2.json
Normal file
44
evaluation_examples/examples/jade/MDIJade6.5使用手册_task2.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "MDIJade6.5使用手册_task2",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 JADE 中将选择DEMO01的衍射图谱,并通过 File → Save-Primary Pattern as *.txt 导出为 ASCII 格式,保存为 DEMO01.txt。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 单击顶部菜单栏中的 \"File\" 菜单\n2. 在展开的下拉菜单中,单击选中 \"Save-Primary Pattern as *.txt\" 菜单项\n3. 在弹出的保存文件对话框中,单击将光标定位到 \"文件名\"(或 \"File name\")输入框\n4. 清空该输入框中的已有内容\n5. 在输入框中输入文字 \"DEMO01.txt\"\n6. 单击对话框右下方的 \"保存\"(或 \"Save\")按钮",
|
||||
"steps_original": "1. 点击菜单 File → Save-Primary Pattern as *.txt。\n2. 在弹出的保存对话框中,设置文件名为 DEMO01.txt。\n3. 点击 Save 按钮保存文件。"
|
||||
}
|
||||
}
|
||||
44
evaluation_examples/examples/jade/MDIJade6.5使用手册_task3.json
Normal file
44
evaluation_examples/examples/jade/MDIJade6.5使用手册_task3.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "MDIJade6.5使用手册_task3",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在Jade中打开自带的DEMO01.MDI样品数据,然后使用Search/Match功能进行物相检索,并限制元素范围为Ca, Si, O。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. Jade启动后默认已加载一个DEMO文件。在主窗口左侧的文件列表中,找到并双击DEMO01.MDI,确认主窗口标题栏显示[DEMO01.MDI]。\n2. 按快捷键Shift+F7(等价于菜单PDF → Chemistry...),打开Current Chemistry [Retrieval]元素周期表对话框。等待对话框完全显示。\n3. 先点击对话框顶部的Exclude All按钮,清除所有已选元素,确保从空白状态开始。\n4. 在元素周期表中选择Ca:Ca位于第4行(K那一行),从左边数第2个按钮。它在K的右边、Sc的左边。它在屏幕上大约坐标(528, 360)附近。注意只单击Ca这一个按钮,确认它变为凹陷/高亮状态后再继续。\n5. 在元素周期表中选择Si:Si位于第3行(Na那一行)的右半部分。从右半部分的左边数,Al是第1个,Si是第2个。Si在Al的右边、P的左边。它在屏幕上大约坐标(830, 340)附近。注意只单击Si这一个按钮,确认它变为凹陷/高亮状态后再继续。\n6. 在元素周期表中选择O:O位于第2行(Li那一行)的右半部分。从右半部分的左边数,B是第1个,C是第2个,N是第3个,O是第4个。O在N的右边、F的左边。它在屏幕上大约坐标(880, 320)附近。注意只单击O这一个按钮,确认它变为凹陷/高亮状态后再继续。\n7. 确认只有Ca、Si、O三个元素按钮都已被选中(凹陷/高亮),然后单击对话框中的OK按钮关闭对话框。\n8. 按快捷键Shift+F6(等价于菜单PDF → Retrieval...),启动物相检索。如果弹出任何提示框(如Too Many Profiles),单击OK关闭。\n9. 等待检索完成,确认出现检索结果窗口。",
|
||||
"steps_original": "1. 双击左侧文件列表中的 DEMO01.MDI 打开样品数据。\n2. 点击菜单 PDF → Chemistry...(或按 Shift+F7),打开元素周期表对话框。\n3. 依次单击 Ca、Si、O 三个元素按钮使其高亮选中,点击 OK。\n4. 点击菜单 PDF → Retrieval...(或按 Shift+F6),执行物相检索。\n5. 等待完成后查看检索结果列表。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task4.json
Normal file
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task4.json
Normal 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. 输入文件名并点击保存。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task5.json
Normal file
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task5.json
Normal 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 按钮保存计算结果。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task6.json
Normal file
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task6.json
Normal 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 按钮完成保存。"
|
||||
}
|
||||
}
|
||||
44
evaluation_examples/examples/jade/MDIJade6.5使用手册_task7.json
Normal file
44
evaluation_examples/examples/jade/MDIJade6.5使用手册_task7.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "MDIJade6.5使用手册_task7",
|
||||
"snapshot": "jade",
|
||||
"instruction": "调用 Options → D-Spacing 菜单计算已知结构的衍射谱,加权强度公式为 Z = 12。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 单击顶部菜单栏的 \"Options\" 菜单\n2. 在弹出的下拉菜单中,单击 \"D-Spacing & hkl...\" 菜单项,打开 \"Calculate d-Spacing & Miller Indices\" 对话框\n3. 在弹出的对话框左下区域,找到 Z 值输入框(位于化学公式输入框的下方,\"Density(c)=\" 文本的左侧,截图中显示为 \"6.0\" 的位置)\n4. 单击该 Z 值输入框将光标定位其中\n5. 清空该输入框中的原有数值\n6. 在该输入框中输入数值 \"12\"\n7. 单击对话框顶部按钮栏中的 \"Calc\" 按钮以生成计算结果\n8. 单击对话框顶部按钮栏最左侧的 \"Close\" 按钮以关闭当前窗口",
|
||||
"steps_original": "1. 打开菜单 Options → D-Spacing。\n2. 在计算衍射谱对话框中,设置加权强度公式参数 Z 值为 12。\n3. 点击 Calculate 按钮以生成计算结果。\n4. 检查结果并关闭窗口。"
|
||||
}
|
||||
}
|
||||
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task8.json
Normal file
45
evaluation_examples/examples/jade/MDIJade6.5使用手册_task8.json
Normal 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 按钮以保存拟合结果文件。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "jade-guide-example_task1",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,通过 Edit → Preferences 打开程序设置对话框,并切换到 Instrument 标签查看设置。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 在软件顶部的主菜单栏中,单击鼠标左键选择 \"Edit\" 菜单。\n2. 在展开的下拉菜单中,单击鼠标左键选择 \"Preferences\" 菜单项,等待弹出程序设置对话框。\n3. 在弹出的程序设置对话框顶部,单击鼠标左键选中名为 \"Instrument\" 的选项卡(标签页)以查看相关设置。",
|
||||
"steps_original": "1. 在主菜单中点击 Edit。\n2. 选择 Preferences,打开程序设置对话框。\n3. 点击对话框上方的 Instrument 标签,查看相关设置。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "jade-guide-example_task10",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,加载 DEMO01.MDI 后,右键单击主工具栏打印按钮打开打印预览窗口,点击 Setup → Layout,勾选 Generate Profile on d-I Lines、Show ID Labels on d-I Lines、Place X-Axis Scaling above Ribbons 三个选项,然后使用垂直放大工具对图谱局部进行放大。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 单击顶部菜单栏的 \"File\" 菜单项\n2. 在弹出的下拉菜单中,单击选择 \"Patterns...\" 打开数据文件读入窗口\n3. 在文件读入窗口的文件列表中,单击选中 \"DEMO01.MDI\" 文件\n4. 单击窗口下方的 \"Read\" 按钮,加载数据文件\n5. 在界面上方的主工具栏中,找到 \"打印\" 图标按钮\n6. 右键单击该 \"打印\" 图标按钮,打开打印预览窗口\n7. 在打印预览窗口中,单击左侧的 \"命令\" 按钮\n8. 单击窗口中的 \"Setup\" 按钮,打开预览设置对话框\n9. 在预览设置对话框的顶部,单击选择 \"Layout\" 选项卡标签\n10. 在 Layout 页面中,找到 \"Generate Profile on d-I Lines\" 复选框并单击勾选\n11. 找到 \"Show ID Labels on d-I Lines\" 复选框并单击勾选\n12. 找到 \"Place X-Axis Scaling above Ribbons\" 复选框并单击勾选\n13. 单击对话框的关闭或确认按钮,退出打印预览设置对话框\n14. 在打印预览窗口顶部的图谱编辑按钮栏中,左键单击 \"垂直放大\" 命令按钮\n15. 将鼠标移动到图谱区域中需要垂直放大的局部位置\n16. 按住鼠标左键不放\n17. 向上拖拽鼠标进行区域拉伸\n18. 松开鼠标左键,完成局部垂直放大",
|
||||
"steps_original": "1. 通过 File → Patterns 加载 DEMO01.MDI 文件。\n2. 右键单击主工具栏中的打印按钮,打开打印预览窗口。\n3. 点击窗口左侧的命令按钮。\n4. 点击 Setup 按钮,打开预览设置对话框。\n5. 点击上方的 Layout 标签。\n6. 勾选 Generate Profile on d-I Lines。\n7. 勾选 Show ID Labels on d-I Lines。\n8. 勾选 Place X-Axis Scaling above Ribbons。\n9. 关闭设置对话框。\n10. 选择图谱编辑按钮中的垂直放大命令,左键单击。\n11. 在图谱中选择需要放大的局部区域向上拉伸。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "jade-guide-example_task11",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,加载 DEMO01.MDI 后,使用主工具栏的图谱平滑按钮对衍射图谱执行平滑处理。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. Jade启动后默认已加载DEMO文件。在主窗口左侧的文件列表中,找到并双击DEMO01.MDI(或DEMO01.MDI),确认主窗口标题栏显示该文件名,图谱区域显示衍射图谱。\n2. 在主界面顶部的主工具栏中,找到Smooth(平滑)按钮。该按钮的图标类似一条平滑的曲线,位于工具栏靠右的位置。将鼠标悬停在工具栏按钮上可看到tooltip提示文字来确认。\n3. 左键单击Smooth按钮,对当前衍射图谱执行平滑处理。\n4. 观察图谱窗口中的衍射曲线,确认由于平滑处理曲线变得更加光滑、噪声减少。",
|
||||
"steps_original": "1. 通过 File → Patterns 加载 DEMO01.MDI 文件。\n2. 在主工具栏中找到图谱平滑按钮(Smooth)。\n3. 左键单击平滑按钮,对当前衍射图谱执行平滑处理。\n4. 观察图谱变化,确认平滑效果已应用(图谱曲线变得更光滑)。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "jade-guide-example_task12",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,加载 DEMO01.MDI 后,使用编辑工具栏的背景扣除功能对衍射图谱执行背景扣除操作。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单。\n2. 在弹出的下拉菜单中,单击选择 \"Patterns...\" 选项,打开数据文件读入窗口。\n3. 在数据文件读入窗口中,单击对应的磁盘下拉菜单或图标,选择目标文件所在的磁盘驱动器。\n4. 在目录树列表中,双击展开文件夹以导航至保存有数据的目标文件夹。\n5. 在文件类型(格式)下拉菜单中,单击并选择 \"All\",以确保显示所有格式的数据文件。\n6. 在文件列表显示区中,单击选中名为 \"DEMO01.MDI\" 的文件。\n7. 单击窗口中的 \"Read\" 命令按钮,将该衍射数据文件读入全谱窗口中。\n8. 在主界面下方的编辑工具栏中,定位到 \"扣除背景\"(Background,通常标为BG)按钮。\n9. 鼠标左键单击该 \"扣除背景\" 按钮,直接对当前的衍射图谱执行背景扣除命令。\n10. 观察全谱窗口中的衍射图谱,确认下方的背景基线已被扣除并变为平直线。",
|
||||
"steps_original": "1. 通过 File → Patterns 加载 DEMO01.MDI 文件。\n2. 在编辑工具栏中找到背景扣除按钮(Background)。\n3. 左键单击背景扣除按钮,对当前衍射图谱执行背景扣除操作。\n4. 观察图谱变化,确认背景已被扣除(基线变为平直)。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "jade-guide-example_task2",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,设置 NBS Silicon 为XRD背底曲线并查看峰宽。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 单击顶部菜单栏中的 \"Edit\" 菜单。\n2. 在弹出的下拉菜单中,单击选中 \"preferences\" 菜单项,打开程序设置对话框。\n3. 在程序设置对话框中,单击选中 \"Instrument\" 标签页。\n4. 单击对话框最下方的下拉菜单控件以将其展开。\n5. 在展开的下拉列表选项中,单击选中 \"NBS Silicon1\"。\n6. 单击对话框中的 \"VIEW FWHM Curve\" 按钮以查看峰宽曲线。",
|
||||
"steps_original": "1. 在程序设置对话框中点击 Instrument 标签。\n2. 从下拉菜单中选择 NBS Silicon1 作为 XRD 背底曲线。\n3. 点击 'View FWHM Curve' 查看峰宽曲线。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"id": "jade-guide-example_task3",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,通过 File → Patterns 打开衍射数据文件 DEMO01.MDI。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"input_files": [
|
||||
"DEMO01.MDI"
|
||||
],
|
||||
"steps": "1. 单击主界面顶部菜单栏中的 \"File\" 菜单项\n2. 在展开的下拉菜单中,单击 \"Patterns\" 菜单项,弹出数据文件读入窗口\n3. 在文件读入窗口中,单击磁盘选择下拉菜单将其展开\n4. 在弹出的驱动器列表中,单击选中目标文件所在的磁盘\n5. 在文件夹树形列表中,双击展开并选中包含目标文件的文件夹\n6. 单击文件类型下拉菜单将其展开\n7. 在弹出的文件类型列表中,单击选中 \"All\" 数据类型选项\n8. 在文件展示列表中,单击选中名为 \"DEMO01.MDI\" 的数据文件\n9. 单击窗口中的 \"Read\" 命令按钮,以读入该数据文件",
|
||||
"steps_original": "1. 在主菜单中点击 File。\n2. 选择 Patterns,打开文件选择对话框。\n3. 浏览并选择 DEMO01.MDI 文件,点击 Read。"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "jade-guide-example_task4",
|
||||
"snapshot": "jade",
|
||||
"instruction": "在 Jade 中,先加载 DEMO01.MDI,然后通过 File → Patterns 使用 Add 按钮叠加第二个衍射数据文件DEMO02.MDI到同一窗口。",
|
||||
"source": "custom",
|
||||
"config": [
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"C:\\JADE\\jade 6.5\\MDI Jade 6.5\\jade6.5.exe"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 5
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"jade"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "sleep",
|
||||
"parameters": {
|
||||
"seconds": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "vllm_eval"
|
||||
},
|
||||
"proxy": false,
|
||||
"fixed_ip": false,
|
||||
"possibility_of_env_change": "low",
|
||||
"metadata": {
|
||||
"steps": "1. 单击主菜单栏中的“File”菜单项。\n2. 在弹出的下拉菜单中,单击“Patterns”菜单项,打开数据文件读入窗口。\n3. 在数据文件读入窗口左上角的驱动器下拉菜单中,单击选择存放数据的磁盘。\n4. 在其下方的文件夹列表框中,双击逐层展开并单击选中包含目标 XRD 数据的文件夹。\n5. 单击文件列表下方的文件类型下拉菜单,从中选择“All”选项以显示所有数据类型。\n6. 在右侧的文件列表框中,单击选中名为“DEMO01.MDI”的文件。\n7. 单击窗口右侧区域的“Read”命令按钮,加载该数据文件。\n8. 再次单击主菜单栏中的“File”菜单项。\n9. 在弹出的下拉菜单中,单击“Patterns”菜单项,重新打开数据文件读入窗口。\n10. (如果路径改变)按照前述步骤在驱动器和文件夹列表框中选择目标路径。\n11. 在文件列表框中,单击选中另一个需要叠加的 DEMO02.MDI 数据文件。\n12. 单击窗口右侧区域的“Add”命令按钮,将第二个数据文件叠加显示到当前窗口中。",
|
||||
"steps_original": "1. 在主菜单中点击 File。\n2. 选择 Patterns,打开文件选择对话框。\n3. 选择 DEMO01.MDI 文件,点击 Read 加载。\n4. 再次点击 File → Patterns。\n5. 选择另一个可用的 DEMO 数据文件,点击 Add 按钮将其叠加到当前窗口。"
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user