| """ |
| 配置常量模块 |
| """ |
| |
| VIDEO_PLAYBACK_FPS = 35.0 |
| USE_SEGMENTED_VIEW = False |
|
|
| |
| POINT_SELECTION_SCALE = 1 |
| CONTROL_PANEL_SCALE = 2 |
|
|
| |
| RIGHT_TOP_ACTION_SCALE = 2 |
| RIGHT_TOP_LOG_SCALE = 1 |
|
|
| |
| UI_GLOBAL_FONT_SIZE = "24px" |
|
|
| |
| SESSION_TIMEOUT = 90 |
| SESSION_CONCURRENCY_ID = "session_actions" |
| SESSION_CONCURRENCY_LIMIT = 10 |
|
|
|
|
| |
| EXECUTE_LIMIT_OFFSET = 4 |
|
|
| TASK_NAME_LIST = [ |
| "BinFill", |
| "StopCube", |
| "PickXtimes", |
| "SwingXtimes", |
| |
| "ButtonUnmask", |
| "VideoUnmask", |
| "VideoUnmaskSwap", |
| "ButtonUnmaskSwap", |
| |
| "PickHighlight", |
| "VideoRepick", |
| "VideoPlaceButton", |
| "VideoPlaceOrder", |
| |
| "MoveCube", |
| "InsertPeg", |
| "PatternLock", |
| "RouteStick", |
| ] |
|
|
|
|
| |
| DEMO_VIDEO_ENV_IDS = [ |
| "VideoPlaceOrder", |
| "VideoUnmaskSwap", |
| "VideoUnmask", |
| "VideoRepick", |
| "VideoPlaceButton", |
| "InsertPeg", |
| "MoveCube", |
| "PatternLock", |
| "RouteStick" |
| ] |
|
|
| UI_TEXT = { |
| "log": { |
| "action_selection_prompt": "Please select the action.\n \nActions with 🎯 need to select a point on the image as input", |
| "point_selection_prompt": "Current action needs location input, please click on the image to select key pixel", |
| "point_selected_message": "Select: {label} | point <{x}, {y}>", |
| "execute_action_prompt": "Executing: {label}", |
| "execute_action_prompt_with_coords": "Executing: {label} | point <{coords_text}>", |
| "demo_video_prompt": 'Press "Watch Video Input 🎬" to watch a video\nNote: you can only watch the video once', |
| "session_error": "Session expired. Please refresh the page and try again.", |
| "reference_action_error": "Ground Truth Action Error: {error}", |
| "reference_action_message": "Ground Truth Action: {option_label}", |
| "reference_action_message_with_coords": "Ground Truth Action: {option_label} | point <{coords_text}>", |
| "reference_action_status": "Ground Truth Action: {message}", |
| "execute_missing_action": "Error: No action selected", |
| "episode_success_banner": "********************************\n**** episode success ****\n********************************\n ---please press change episode---- ", |
| "episode_failed_banner": "********************************\n**** episode failed ****\n********************************\n ---please press change episode---- ", |
| }, |
| "coords": { |
| "not_needed": "No need for coordinates", |
| "select_point": "Please click the point selection image", |
| "select_point_before_execute": "Please click the point selection image before execute!", |
| }, |
| "actions": { |
| "point_required_suffix": " 🎯", |
| }, |
| "progress": { |
| "episode_loading": "The episode is loading...", |
| "queue_wait": "Lots of people are playing! Please wait...", |
| "entry_rejected": "Too many users are trying the demo right now. Please try again later.", |
| }, |
| "errors": { |
| "load_missing_task": "Error loading task: missing current_task", |
| "load_invalid_task": "Error loading task: invalid task payload", |
| "load_episode_error": "Error: {load_msg}", |
| "next_task_failed": "Failed to load next task", |
| "restart_missing_task": "Failed to restart episode: missing current task", |
| "restart_invalid_task": "Failed to restart episode: invalid task payload", |
| "switch_env_failed": "Failed to switch environment to '{selected_env}'", |
| "init_failed": "Initialization error: {error}", |
| "reference_action_resolve_failed": "Failed to resolve ground truth action.", |
| }, |
| } |
|
|
| UI_ACTION_TEXT_OVERRIDES = { |
| "PatternLock": { |
| "move forward": "move forward↓", |
| "move backward": "move backward↑", |
| "move left": "move left→", |
| "move right": "move right←", |
| "move forward-left": "move forward-left↘︎", |
| "move forward-right": "move forward-right↙︎", |
| "move backward-left": "move backward-left↗︎", |
| "move backward-right": "move backward-right↖︎", |
| }, |
| } |
|
|
| ROUTESTICK_OVERLAY_ACTION_TEXTS = [ |
| "move to the nearest left target by circling around the stick clockwise", |
| "move to the nearest left target by circling around the stick counterclockwise", |
| "move to the nearest right target by circling around the stick clockwise", |
| "move to the nearest right target by circling around the stick counterclockwise", |
| ] |
|
|
| LIVE_OBS_BASE_CLASS = "live-obs-resizable" |
| LIVE_OBS_POINT_WAIT_CLASS = "live-obs-point-waiting" |
|
|
|
|
| def get_live_obs_elem_classes(waiting_for_point=False): |
| classes = [LIVE_OBS_BASE_CLASS] |
| if waiting_for_point: |
| classes.append(LIVE_OBS_POINT_WAIT_CLASS) |
| return classes |
|
|
|
|
| def get_ui_action_text(env_id, action_text): |
| """ |
| Return display-only action text overrides for a specific env/action pair. |
| Falls back to the original action text when no override is configured. |
| """ |
| if not isinstance(action_text, str): |
| return action_text |
| if not isinstance(env_id, str) or not env_id: |
| return action_text |
| env_overrides = UI_ACTION_TEXT_OVERRIDES.get(env_id, {}) |
| return env_overrides.get(action_text, action_text) |
|
|
| def should_show_demo_video(env_id): |
| """ |
| 判断指定的环境ID是否应该显示demonstration video |
| 只有DEMO_VIDEO_ENV_IDS列表中的环境才显示demonstration videos |
| """ |
| return env_id in DEMO_VIDEO_ENV_IDS |
|
|